Жизнь за пределами Metasploit Framework, сравниваем альтернативы

9703b13c40733dd81e9fdd1094d55de7.jpg

ДИСКЛЕЙМЕР: Внимание! Вся представленная ниже информация предназначена только для ознакомительного изучения. Автор не несет никакой ответственности за любой причиненный вред с использованием изложенной информации.

Предисловие

Идея статьи родилась в ходе исследования способов автоматизации рутинных действий при проведении тестирования на проникновение. Данная мысль возникает, когда исследователь понимает, что в лучшем случае копирует одни и те же команды, в худшем — печатает их на клавиатуре вручную. Моя личная цель автоматизации — экономия самого ценного ресурса, который у нас есть. Времени. Надеюсь, что данная статья позволит и вам сделать это, а также потратить его на более творческие вещи, чем поиск, к примеру, способа реализации туннелирования в Windows-сетях.

Я понимаю и поддерживаю исследователей, которые используют ручное тестирование в целях обучения и при решении нестандартных ситуаций. А для всего остального есть MasterCard… автоматизация).

Что хотелось бы автоматизировать и почему не Metasploit Framework?

Чаще всего целью внутреннего тестирования на проникновение является получения наивысших привилегий в исследуемой инфраструктуре. В зависимости от желаний заказчика это может быть и компрометация наибольшего количества узлов c описанием эксплуатации всех существующих популярных уязвимостей, и получение полного доступа к рабочей станции главного системного администратора, и реализация бизнес-рисков, выделенных руководством. В любом случае перед пентестером зачастую стоит задача собрать воедино множество крупиц информации в тестируемой сети, которые добываются на протяжении всего процесса работ. Если мы рассматриваем тестирование на проникновение как моделирование атаки злоумышленника, то средства и уровень автоматизации должны соответствовать. От этого напрямую зависит скорость получения доступа к критичным данным, а также их полнота. Одним из популярных средств автоматизации являются решения типа RAT/C&C, позволяющие агрегировать все получаемые доступы, произвести ряд некоторых повторяющихся действий на большом количестве узлов, обеспечить закрепление в тестируемой сети. В данной статье будет рассмотрено одно из таких средств, а также выделен функционал, который является наиболее используемым. Изложенная информация посвящена менее распространенному решению, поскольку хочется понять, насколько данные средства являются менее детектируемыми по сравнению с популярными, к примеру, Metasploit Framework, и имеют ли они достаточный функционал.

Давайте начнем с того, что выделим те самые действия, которые повторяются из проекта в проект при проведении внутреннего тестирования на проникновение. Для себя я выделил следующие признаки, используемые далее для сравнения и представленные в порядке рассмотрения:

  • Простота развертывания;

  • Наличие поддержки проекта;

  • Кроссплатформенность агентов, использующихся для связи с командным сервером;

  • Наличие механизмов обхода средств защиты на узле в процессе генерации нагрузки;

  • Наличие механизмов обхода средств защиты при взаимодействии с командным сервером;

  • Автоматизация методов закрепления в системе;

  • Автоматизация поиска/получения чувствительной информации (в основном учетные данные);

  • Возможность организации динамического перенаправления портов;

  • Наличие встроенной функции сканирования портов;

  • Наличие встроенных модулей проверки возможности повышения привилегий;

  • Наличие встроенной функции прослушивания/записи сетевого траффика.

Pupy

Установка и поддержка проекта

https://github.com/n1nj4sec/pupy

Для рассмотрения был выбран проект Pupy — кроссплатформенный RAT, имеющий в своем арсенале множество методов постэксплуатации. Проект преимущественно написан на Python 2. Его отличительной чертой является стремление к максимальному охвату эксплуатируемых операционных систем, а также исполнение вредоносного Python-кода, модулей и расширений, написанных на C.

Средство поддерживается для операционных систем Debian 9 и Kali Rolling. Также предоставляется поддержка любой операционной системы, если используется официальный Docker-образ. Но не все так просто…. Данный пункт я сначала я хотел выделить как отдельный комментарий, так как он является довольно объемным и не особо интересным для прочтения. В итоге для всех, кто планирует протестировать данное средство, ссылки на решения и решения некоторых проблем, с которыми столкнулся я, представлены ниже:

Генерация агентов и организация взаимодействия

Тестирование функционала средства производилось в собственной лаборатории и на основании инфраструктуры endgame Hades портала HackTheBox.

После запуска нас встречает напоминание о неправомерности использования средства без соглашения с владельцем и интерактивная оболочка.

54edeae21fa2ee12082cc5cea18b0424.png

Взаимодействие организуется путем запуска listener с определенным способом передачи, который зачастую реализуется путем использования конкретного протокола. Я протестирую два вида организации соединения: SSL+RSA и Websocket с RSA+AES. Стоит также отметить, что чрезмерное использование шифрование значительно замедляет скорость взаимодействия. Данный факт стоит учитывать особенно в условиях работы через всевозможные туннели.

b188f8eb8a1377cceba20fd3fec1efff.jpg

Для получения контроля над удаленным узлом нам необходимо сгенерировать агент. Pupy поддерживает следующие виды, которые классифицируются по формату нагрузки, целевой операционной системе и варианту первичных исполняемых действий.

547c7207e359335037157b96643f8043.jpg89901b311447f223ec7da1434fc351d1.jpgb06d6bafc1483c8d313b7cba0b40ae88.jpg

Наиболее интересными мне показались агенты, позволяющие выполнять вредоносный код из памяти. На Windows-системе было принято решение протестировать два типа: ps1_onliner и .NET_oneliner.

Перед генерацией агента .NET_oneliner возникла проблема отсутствия пакета для компиляции. Проблема была решена путем обращения к issues на github.

Процесс генерации агента заключается в создании нового фрагмента кода на языке C# и последующей его компиляции при помощи mcs. Pupy выводит на экран готовую команду для запуска на целевой системе. Процесс организации канала представлен на рисунках ниже.

cba1168bee4494443a77854f5314b2de.jpg5d0344ef986ba74629d6ecc219421051.jpgd064998a2e0cee43b38291e6f0d283bd.jpg

В данной конфигурации Kaspersky Security Cloud блокирует запуск. Обход данного механизма защиты решился довольно банальным способом — отказом от использования опции enc. Успешный запуск и организация канала представлены ниже.

401b371890be43e9c6294861353d146b.jpg02aaf5f193206d7e1155f91b525cbd65.jpg

Статистика по детектированию исполняемого файла на ресурсе virustotal представлена ниже.

3cf3a70aa5503aac9dcd80687d13e24d.jpg

Далее протестируем вариант агента ps1_oneliner. Данный вектор с точки зрения доставки состоит из двух этапов: скачивание лоадера, а затем скачивание нагрузки. По аналогии с описанными выше действиями был сгенерирован агент, использующий в качестве канала взаимодействия связку криптографического протокола SSL со слоем RSA. Стоит обратить внимание, что данная конфигурация заметно уменьшает скорость взаимодействия.

fff5c801bdbf0a25e5de3daacb9eefdd.jpg

Данный вариант доставки нагрузки был заблокирован при помощи AMSI. Текущие способы обхода данного компонента защиты Microsoft Windows хорошо описаны в статье моего товарища, с которой я очень советую ознакомиться. Мы на данном вопросе не будем останавливаться. Используем лишь один из вариантов обхода:

$a = 'System.Management.Automation.A';$b = 'ms';$u = 'Utils'
$assembly = [Ref].Assembly.GetType(('{0}{1}i{2}' -f $a,$b,$u))
$field = $assembly.GetField(('a{0}iInitFailed' -f $b),'NonPublic,Static')
$field.SetValue($null,$true)

30f13de1b520deee11e30e4717250004.jpga8f3fdf1f6b35936bbf0c71b72455e3d.jpg

Аналогичным образом протестируем агента для Linux-систем. В качестве нагрузки будем использовать исполняемый файл в формате elf. Взаимодействие агента с сервером организуется путем канала websocket, созданного ранее. В качестве лабораторного стенда использовался endgame Hades с платформы www.hackthebox.eu. Выполнение созданного агента осуществляется посредством уязвимости внедрения команд операционной системы. Более детальный разбор уязвимости можно посмотреть здесь.

43aab694bf20acdd9ff759d982fb01bf.jpge515242e2f8f9f0908cbcc361298f798.jpg06957de8d087615fbff391a8bb1e0d20.jpg

Хоть антивирус и не частый гость на Unix-системах, результаты проверки на ресурсе virustotal представлены ниже.

f2d95ca9e17609830f632ddbb76c33e8.jpg

Обобщая изложенный материал по генерации агентов и организации клиент-серверного взаимодействия, можно сделать вывод, что в решении Pupy используются основные средства обхода средств защиты. Исполнение из памяти и нераспространенность данного решения позволяют скрыть от антивирусных средств вредоносную активность. Тесты производились на Kaspersky Security Cloud и Microsoft Defender с актуальными базами обновлений. Также средство имеет широкий спектр способов организации клиент-серверного взаимодействия с разными типами шифрования.

Способы закрепления

В Pupy cуществует отдельный модуль, отвечающий за закрепление на узле жертвы под названием persistence. Его функционал в основном нацелен на Windows-системы, поэтому рассмотрим только этот случай. Также стоит отметить, что в зависимости от привилегий доступны разные методы закрепления. В данной статье будут рассмотрены стандартный пользователь, пользователь с правами локального администратора, пользователь с привилегиями NT AUTHORITY\SYSTEM.

Модуль persistence имеет довольно краткую справку, но ее вполне достаточно для ознакомления.

cffca85c2dd0f9efbdbbfedb02ce5fdc.jpg

Также стоит отметить, что при генерации агентов по умолчанию встроен механизм установления соединения в случае его потери. Данный вариант возможен только, если нагрузка все еще находится в запущенном состоянии.

b05b808f375e2cea90126a4656350a5d.jpg

Рассмотрим варианты закрепления, которые могут «пережить перезагрузку». Для пользователя со стандартными привилегиями мы имеем следующие способы:

383569c78b673cd824e244585dd0c54d.jpg

Все доступные способы в моем случае не дали результатов. Обращение к реестру и использование приложения «Cortana» приводит к блокированию действий посредством антивируса и разрыву соединения. Приложение «People» в моем случае недоступно. Вариант автозапуска является единственно рабочим. Для тестирования был выбран «Калькулятор». Создание недетектируемого при помощи антивируса исполняемого файла, хранящегося в файловой системе, является трудозатратной задачей. При этом раскрывается алгоритм обхода средств защиты. Обычно это приводит к блокированию всех нагрузок, созданных при помощи данной последовательности действий в ближайшем будущем.

8c2cf4f7cfd952e550d907035361bf9d.jpg37e76884ca4cbe01068e1ce95e5f57cb.jpg

Встроенные функции закрепления в Windows-системах являются оберткой проекта WinPwnage.

10d4c2f266e5b6621bf1fce4380d2355.jpg

Создание пакетного файла формата bat в данном случае невозможно из-за ограничений, в рамках которых создается файл. Код представлен здесь.

d25b01bca4ee3fe45d23cf61653e7186.jpg

Путем ручной доставки и нагрузки, которая используется при генерации агента формата .NET_oneliner, было произведено закрепление двумя способами. Первый — связка пакетного файла формата bat, в котором происходит запуск PowerShell-скрипта, второй — одиночный пакетный файл.

eb25da30576dc5d5aea6300e9db37b6d.jpgf2cac4d72ebd7a837079bfe8e32568c1.jpg71fd28f78c7d36bce7a405c3d2e88eec.jpgea443822c216cf361a98aec98e379855.jpg

Оба способа при этом через некоторое время блокируются антивирусным средством.
В случае наличия сессии с высокими привилегиями нам доступны практически все имеющиеся методы.

4dff9d1ed5e5ceafb343b6dccc363424.jpg

К сожалению, ситуация с блокированием посредством антивируса повторяется практически на всех доступных способах. Pupy содержит в себе большинство методов закрепления в Windows-системах. Проект WinPwnage, посредством которого реализован функционал данного модуля, поддерживается (на момент написания статьи последние правки в проект вносились 16 октября 2021 года). Для обхода средств антивирусной защиты необходимо использовать либо полностью ручные методы, либо связку автоматизированных методов с недетектируемой нагрузкой.

Способы постэксплуатации

Разберем основные возможности постэксплуатации, которые есть в данном средстве для Windows-систем. В первую очередь отметим, что повышение привилегий от локального администратора до NT AUTHORITY\SYSTEM в нашем случае может быть выполнено при помощи модуля getsystem.

4e6b3ba777ccdd12d09bb66ba1290f08.jpg

Список и краткую информацию обо всех доступных модулях можно получить при помощи команды help -M.

06694c7f96473414341e0646505e8891.jpg

Начнем с тех, которые используются для поиска аутентификационных данных. Далее будет рассмотрены модули, которая доступны в основном для Windows-систем (хотя ряд из них поддерживают и Unix-системы). Отдельная трудность в рассмотрении — отсутствие и документации, и подробной справки. Данный фактор очень сильно тормозил рассмотрение и понимание происходящих процессов.

Модуль lazagne

https://github.com/AlessandroZ/LaZagne

Как выяснилось, данный модуль по умолчанию использует все категории учетных данных, которые доступны (lazagne и lazagne all аналогичны).

0a56cfcebcd857822dc0c746c6a583ff.jpgcfda090a6df51a07cee75b2f388db005.jpg

Также в исходниках были найдены и другие категории: hashdump, cachedump, credfiles. Полный список размещен в репозитории LaZagne. Я не погружался в реализацию данного решения, но есть определенные проблемы с кодировками (возможно при использовании в Pupy). Тестируемая система не содержала специфичных мест хранения паролей, кроме браузера, в котором учетные данные не были обнаружены (хотя таковые были).

Модуль loot_memory

В моем случае не дал результатов. Производится поиск в памяти процессов на предмет наличия паролей в открытом виде.

Модуль creddump

Данный способ позволяет получить кусты реестра и извлекать учетные данные, не вызывая срабатываний антивирусных средств.

5331f1914d2cd66cb6e86e1c9ce48466.jpg53bd6424306f66fa5da5cbc6868ba9b5.jpg

Модуль mimishell/mimikatz

Запуск mimishell (интерактивный режим mimikatz) в стандартной конфигурации не срабатывал из-за ошибок, поэтому был протестирован модуль mimikatz в двух режимах: с работающим и с отключенным антивирусом. Также стоит отметить, что исполняемые файлы формата exe по умолчанию не были найдены в моем контейнере. Вместо этого в системе находился zip-архив, из которого необходимо было извлечь содержимое. Для корректной работы необходимо проверить, что в конфигурационном файле проекта правильно указаны пути до исполняемых файлов mimikatz.

e3ee86e6c9e15c141c3609a93a1f5f2a.jpg

Работающий антивирус

9c14e45dcce215c045b73229ba96d61c.jpg7af0b1d06bdc49ba8b2721691f953196.jpg

Отключенный антивирус

626735ec493496b30687d0e54baf9737.jpg2d676deae0a16915275a33264200a386.jpg

Также в исходниках была найдена стандартная команда запуска модуля.

f045bdacb1507d8a9b6e6f8ebe47e9fd.jpg3c650ff57d093ecaaba1b72e138353ab.jpg

Модуль search

Модуль search позволяет искать разного рода файла по именам, содержимому и другим признакам, поддерживая при этом регулярные выражения.

111c508bcdbfed96ee93a4c5cb629826.jpg

Модуль forward

Для динамического перенаправления портов в Pupy существует отдельным модуль под названием forward. Он реализует локальное и удаленное перенаправление портов с поддержкой SOCKS-proxy.

b36979ed81090cabb68600f1535b330f.jpg

Я продемонстрирую локальное динамическое перенаправление портов с использование SOCKS-proxy, а также сканирование узла из другой подсети на наличие открытых портов при помощи nmap.

0633ffb6c5ffcad4407366d20da123d8.jpgaf835023c71669b63498fb487bf646fb.jpg4a2a687e175ce15557c49e04d7c4a3d1.jpg1e141bce32caeb4a70fbb19123193ae5.jpg86e6de6d6c6f97d10a95a7d911e65c59.jpg

Данный функционал очень полезен при внутреннем тестировании на проникновение, особенно если реализован так просто.

Модуль port_scan

Далее рассмотрим встроенную функцию сканирования портов, реализованную посредством модуля port_scan.

5b258d4b9338e656eb9d6350bf933c0f.jpg

Данное средство подходит для сканирования некоторого диапазона IP-адресов по небольшому количеству портов для принятия стратегических решений по захвату сети.

01f2f0d7adbaad3d8a43ce330eeed11d.jpg

Модули повышения привилегий

Рассмотрим модули, которые созданы для тестирование возможности повышения привилегий: beroot, privesc_checker, exploit_suggester. Ни один их них не дал хоть
каких-то результатов.

Модуль tcpdump

Последним функционалом, который бы хотелось рассмотреть, является прослушивание траффика. Для этого создан модуль tcpdump, который на Windows-системе не был выполнен из-за ошибок.

Модули на Unix-системах

Похожим образом по порядку рассмотрим применение модулей на Unix-системе. Группа поиска учетных данных отработала везде без ошибок, но не дала никаких результатов, кроме флага endgame Hades.

00cd1fa66db7245ba81e6a98114e13f2.jpg

Модуль forward справился со своей задачей на отлично.

f1ed1b2506612cfa4e7e4f944697fe89.jpg5a3a745334c15b4b167d8323d9890508.jpg7ea8d082522d6a08439972e1cfdb5976.jpg2c0c07ca03812d07d64e02c6e5ec5e5d.jpg229d6dd9c7e299b57e77b1820270a8a9.jpg05344db611530d0301af8877658d238d.jpg

Модуль сканирование портов port_scan.

24ea9a0b16ba74d90307166bd19ff565.jpg

Группа модулей повышения привилегий частично отработала. Beroot также не был исполнен из-за ошибок.

183777295cf40a986b091db54a0a720f.jpgf439c65aaabce0f303041c20ccc96b8a.jpge77c7d84baca007286d23cc8b591743c.jpg

Модуль tcpdump также не был исполнен из-за ошибок.

Выводы

Подводя итог, хочется обобщить все вышеописанное. Для того, чтобы как-то оценить данное средство, я выделил плюсы, которые позволили мне сэкономить время, и минусы, которые отняли у меня (очень много) времени, отчасти на основании пунктов, которые приведены в начале статьи.

Плюсы:

  • Кроссплатформенность агентов;

  • Запуск исполняемых файлов из памяти;

  • Использование компилятора mcs для генерации нагрузки;

  • Шифрование траффика при взаимодействии агентов и сервера;

  • Удобный механизм управления сессиями;

  • Встроенное динамическое перенаправление портов;

  • Встроенное сканирование портов.

Минусы:

  • Сложность развертывания (много-много времени);

  • Отсутствие поддержки;

  • Отсутствие подробной документации;

  • Большое количество зависимостей от сторонних проектов.

В целом, я остался доволен работой данного средства, хоть и не стал бы его советовать. Для простых задач может подойти, но придется постоянно бороться с неработающим функционалом и в итоге большинство модулей запускать вручную. Выбирая между широко используемым Metasploit Framework и Pupy, я бы остановился на первом, так как не нашел каких-то преимуществ у второго.

Надеюсь, что данная статья позволила узнать что-то новое для себя, принять решение пользоваться Pupy или нет и хотя бы чуть-чуть сподвигла читателей к тому, чтобы автоматизировать свой труд и экономить время.

© Habrahabr.ru