Предисловие
Идея статьи родилась в ходе исследования способов автоматизации рутинных действий при проведении тестирования на проникновение. Данная мысль возникает, когда исследователь понимает, что в лучшем случае копирует одни и те же команды, в худшем – печатает их на клавиатуре вручную. Моя личная цель автоматизации – экономия самого ценного ресурса, который у нас есть. Времени. Надеюсь, что данная статья позволит и вам сделать это, а также потратить его на более творческие вещи, чем поиск, к примеру, способа реализации туннелирования в 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.
После запуска нас встречает напоминание о неправомерности использования средства без соглашения с владельцем и интерактивная оболочка.
Взаимодействие организуется путем запуска listener с определенным способом передачи, который зачастую реализуется путем использования конкретного протокола. Я протестирую два вида организации соединения: SSL+RSA и Websocket с RSA+AES. Стоит также отметить, что чрезмерное использование шифрование значительно замедляет скорость взаимодействия. Данный факт стоит учитывать особенно в условиях работы через всевозможные туннели.
Для получения контроля над удаленным узлом нам необходимо сгенерировать агент. Pupy поддерживает следующие виды, которые классифицируются по формату нагрузки, целевой операционной системе и варианту первичных исполняемых действий.
Наиболее интересными мне показались агенты, позволяющие выполнять вредоносный код из памяти. На Windows-системе было принято решение протестировать два типа: ps1_onliner и .NET_oneliner.
Перед генерацией агента .NET_oneliner возникла проблема отсутствия пакета для компиляции. Проблема была решена путем обращения к issues на github.
Процесс генерации агента заключается в создании нового фрагмента кода на языке C# и последующей его компиляции при помощи mcs. Pupy выводит на экран готовую команду для запуска на целевой системе. Процесс организации канала представлен на рисунках ниже.
В данной конфигурации Kaspersky Security Cloud блокирует запуск. Обход данного механизма защиты решился довольно банальным способом – отказом от использования опции enc. Успешный запуск и организация канала представлены ниже.
Статистика по детектированию исполняемого файла на ресурсе virustotal представлена ниже.
Далее протестируем вариант агента ps1_oneliner. Данный вектор с точки зрения доставки состоит из двух этапов: скачивание лоадера, а затем скачивание нагрузки. По аналогии с описанными выше действиями был сгенерирован агент, использующий в качестве канала взаимодействия связку криптографического протокола SSL со слоем RSA. Стоит обратить внимание, что данная конфигурация заметно уменьшает скорость взаимодействия.
Данный вариант доставки нагрузки был заблокирован при помощи 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)
Аналогичным образом протестируем агента для Linux-систем. В качестве нагрузки будем использовать исполняемый файл в формате elf. Взаимодействие агента с сервером организуется путем канала websocket, созданного ранее. В качестве лабораторного стенда использовался endgame Hades с платформы www.hackthebox.eu. Выполнение созданного агента осуществляется посредством уязвимости внедрения команд операционной системы. Более детальный разбор уязвимости можно посмотреть здесь.
Хоть антивирус и не частый гость на Unix-системах, результаты проверки на ресурсе virustotal представлены ниже.
Обобщая изложенный материал по генерации агентов и организации клиент-серверного взаимодействия, можно сделать вывод, что в решении Pupy используются основные средства обхода средств защиты. Исполнение из памяти и нераспространенность данного решения позволяют скрыть от антивирусных средств вредоносную активность. Тесты производились на Kaspersky Security Cloud и Microsoft Defender с актуальными базами обновлений. Также средство имеет широкий спектр способов организации клиент-серверного взаимодействия с разными типами шифрования.
Способы закрепления
В Pupy cуществует отдельный модуль, отвечающий за закрепление на узле жертвы под названием persistence. Его функционал в основном нацелен на Windows-системы, поэтому рассмотрим только этот случай. Также стоит отметить, что в зависимости от привилегий доступны разные методы закрепления. В данной статье будут рассмотрены стандартный пользователь, пользователь с правами локального администратора, пользователь с привилегиями NT AUTHORITY\SYSTEM.
Модуль persistence имеет довольно краткую справку, но ее вполне достаточно для ознакомления.
Также стоит отметить, что при генерации агентов по умолчанию встроен механизм установления соединения в случае его потери. Данный вариант возможен только, если нагрузка все еще находится в запущенном состоянии.
Рассмотрим варианты закрепления, которые могут «пережить перезагрузку». Для пользователя со стандартными привилегиями мы имеем следующие способы:
Все доступные способы в моем случае не дали результатов. Обращение к реестру и использование приложения «Cortana» приводит к блокированию действий посредством антивируса и разрыву соединения. Приложение «People» в моем случае недоступно. Вариант автозапуска является единственно рабочим. Для тестирования был выбран «Калькулятор». Создание недетектируемого при помощи антивируса исполняемого файла, хранящегося в файловой системе, является трудозатратной задачей. При этом раскрывается алгоритм обхода средств защиты. Обычно это приводит к блокированию всех нагрузок, созданных при помощи данной последовательности действий в ближайшем будущем.
Встроенные функции закрепления в Windows-системах являются оберткой проекта WinPwnage.
Создание пакетного файла формата bat в данном случае невозможно из-за ограничений, в рамках которых создается файл. Код представлен здесь.
Путем ручной доставки и нагрузки, которая используется при генерации агента формата .NET_oneliner, было произведено закрепление двумя способами. Первый – связка пакетного файла формата bat, в котором происходит запуск PowerShell-скрипта, второй – одиночный пакетный файл.
Оба способа при этом через некоторое время блокируются антивирусным средством.
В случае наличия сессии с высокими привилегиями нам доступны практически все имеющиеся методы.
К сожалению, ситуация с блокированием посредством антивируса повторяется практически на всех доступных способах. Pupy содержит в себе большинство методов закрепления в Windows-системах. Проект WinPwnage, посредством которого реализован функционал данного модуля, поддерживается (на момент написания статьи последние правки в проект вносились 16 октября 2021 года). Для обхода средств антивирусной защиты необходимо использовать либо полностью ручные методы, либо связку автоматизированных методов с недетектируемой нагрузкой.
Способы постэксплуатации
Разберем основные возможности постэксплуатации, которые есть в данном средстве для Windows-систем. В первую очередь отметим, что повышение привилегий от локального администратора до NT AUTHORITY\SYSTEM в нашем случае может быть выполнено при помощи модуля getsystem.
Список и краткую информацию обо всех доступных модулях можно получить при помощи команды help -M.
Начнем с тех, которые используются для поиска аутентификационных данных. Далее будет рассмотрены модули, которая доступны в основном для Windows-систем (хотя ряд из них поддерживают и Unix-системы). Отдельная трудность в рассмотрении – отсутствие и документации, и подробной справки. Данный фактор очень сильно тормозил рассмотрение и понимание происходящих процессов.
Модуль lazagne
https://github.com/AlessandroZ/LaZagne
Как выяснилось, данный модуль по умолчанию использует все категории учетных данных, которые доступны (lazagne и lazagne all аналогичны).
Также в исходниках были найдены и другие категории: hashdump, cachedump, credfiles. Полный список размещен в репозитории LaZagne. Я не погружался в реализацию данного решения, но есть определенные проблемы с кодировками (возможно при использовании в Pupy). Тестируемая система не содержала специфичных мест хранения паролей, кроме браузера, в котором учетные данные не были обнаружены (хотя таковые были).
Модуль loot_memory
В моем случае не дал результатов. Производится поиск в памяти процессов на предмет наличия паролей в открытом виде.
Модуль creddump
Данный способ позволяет получить кусты реестра и извлекать учетные данные, не вызывая срабатываний антивирусных средств.
Модуль mimishell/mimikatz
Запуск mimishell (интерактивный режим mimikatz) в стандартной конфигурации не срабатывал из-за ошибок, поэтому был протестирован модуль mimikatz в двух режимах: с работающим и с отключенным антивирусом. Также стоит отметить, что исполняемые файлы формата exe по умолчанию не были найдены в моем контейнере. Вместо этого в системе находился zip-архив, из которого необходимо было извлечь содержимое. Для корректной работы необходимо проверить, что в конфигурационном файле проекта правильно указаны пути до исполняемых файлов mimikatz.
Работающий антивирус
Отключенный антивирус
Также в исходниках была найдена стандартная команда запуска модуля.
Модуль search
Модуль search позволяет искать разного рода файла по именам, содержимому и другим признакам, поддерживая при этом регулярные выражения.
Модуль forward
Для динамического перенаправления портов в Pupy существует отдельным модуль под названием forward. Он реализует локальное и удаленное перенаправление портов с поддержкой SOCKS-proxy.
Я продемонстрирую локальное динамическое перенаправление портов с использование SOCKS-proxy, а также сканирование узла из другой подсети на наличие открытых портов при помощи nmap.
Данный функционал очень полезен при внутреннем тестировании на проникновение, особенно если реализован так просто.
Модуль port_scan
Далее рассмотрим встроенную функцию сканирования портов, реализованную посредством модуля port_scan.
Данное средство подходит для сканирования некоторого диапазона IP-адресов по небольшому количеству портов для принятия стратегических решений по захвату сети.
Модули повышения привилегий
Рассмотрим модули, которые созданы для тестирование возможности повышения привилегий: beroot, privesc_checker, exploit_suggester. Ни один их них не дал хоть каких-то результатов.
Модуль tcpdump
Последним функционалом, который бы хотелось рассмотреть, является прослушивание траффика. Для этого создан модуль tcpdump, который на Windows-системе не был выполнен из-за ошибок.
Модули на Unix-системах
Похожим образом по порядку рассмотрим применение модулей на Unix-системе. Группа поиска учетных данных отработала везде без ошибок, но не дала никаких результатов, кроме флага endgame Hades.
Модуль forward справился со своей задачей на отлично.
Модуль сканирование портов port_scan.
Группа модулей повышения привилегий частично отработала. Beroot также не был исполнен из-за ошибок.
Модуль tcpdump также не был исполнен из-за ошибок.
Выводы
Подводя итог, хочется обобщить все вышеописанное. Для того, чтобы как-то оценить данное средство, я выделил плюсы, которые позволили мне сэкономить время, и минусы, которые отняли у меня (очень много) времени, отчасти на основании пунктов, которые приведены в начале статьи.
Плюсы:
- Кроссплатформенность агентов;
- Запуск исполняемых файлов из памяти;
- Использование компилятора mcs для генерации нагрузки;
- Шифрование траффика при взаимодействии агентов и сервера;
- Удобный механизм управления сессиями;
- Встроенное динамическое перенаправление портов;
- Встроенное сканирование портов.
Минусы:
- Сложность развертывания (много-много времени);
- Отсутствие поддержки;
- Отсутствие подробной документации;
- Большое количество зависимостей от сторонних проектов.
В целом, я остался доволен работой данного средства, хоть и не стал бы его советовать. Для простых задач может подойти, но придется постоянно бороться с неработающим функционалом и в итоге большинство модулей запускать вручную. Выбирая между широко используемым Metasploit Framework и Pupy, я бы остановился на первом, так как не нашел каких-то преимуществ у второго.
Надеюсь, что данная статья позволила узнать что-то новое для себя, принять решение пользоваться Pupy или нет и хотя бы чуть-чуть сподвигла читателей к тому, чтобы автоматизировать свой труд и экономить время.
22.03.2022
Блог