
Rogue Assembly Hunter — это утилита для обнаружения 'интересных' модулей .NET CLR в запущенных процессах.
__________ _____ . .
_____ \ ____ ____ __ __ ____ / _ \ ______ ______ ____ _ | | | ..
| // _ \ / __| | _/ __ \ / /\ \ / // __// __ \ / | __ | |< | |
| | ( <> ) // > | /\ / / | \ \ _ \ /| Y Y \ _\ \ |_ |
|| /_/_ /|/ _ > _| /____ >____ >___ >|| / /____/ |
/ // / / / / / / / /
___ ___ __
/ | \ __ __ / | ___________
/ ~ \ | / \ __/ __ _ __
\ Y / | / | \ | \ /| | /
_| /|/|| /| _ >|
/ / /
Rogue Assembly Hunter — это утилита для обнаружения «интересных» модулей .NET CLR в запущенных процессах.
.NET — это очень мощная и функциональная платформа разработки и среда выполнения для создания и запуска управляемых приложений .NET. За последние несколько лет .NET был принят на вооружение Red Teams (и подобными им) для инструментирования тактик в поддержку наступательных операций. В частности, переход от оборонительного PowerShell к .NET был логичным шагом (для многих) из-за повышенной видимости и оппортунистической наблюдаемости, присутствующих в PowerShell v5+. В связи с этим, наступательные средства и тактики .NET успешно использовались для обхода средств защиты на основе хоста, обхода контроля приложений, а также для создания/подготовки/доставки/выполнения вредоносного кода (аналогично PowerShell).
С точки зрения предотвращения, Microsoft делает больше для борьбы с угрозами, инструментированными через .NET, и для минимизации общей поверхности атаки .NET. Например, Microsoft добавила возможности проверки AMSI в .NET Framework 4.8, а механизмы WDAC/WLDP весьма эффективны. С точки зрения обнаружения/реагирования, дополнительная видимость и исследование экосистемы .NET всегда полезны для поиска новых способов борьбы с угрозами, ориентированными на .NET.
В 2017 году Джо Дезимоне (@dez_) написал замечательную статью под названием Hunting For In-Memory .NET Attacks. Актуальная и сегодня, статья описывает современные векторы атак на .NET, а также методы обнаружения по требованию и на основе событий. В дополнение к статье Джо выпустил инструмент (Get-ClrReflection) для активного обнаружения (и извлечения) модулей .NET CLR в памяти, у которых отсутствует корректная ссылка на диск. Вдохновленный работой Джо и используя возможности исследования библиотеки диагностики времени выполнения CLRMD (+ последующие возможности доступа к данным mscordacwks.dll), был создан Rogue Assembly Hunter для:
watch). В некоторых случаях может быть сложно «поймать» загрузку конкретной сборки из-за скорости выполнения (например, execute-assembly и жертвенные процессы).[*] Параметры:
--mode=<.> : Обязательно | Выберите режим анализа. Варианты: sweep, process и watch.
--hunt=<.> : Необязательно | Выберите тип сканирования для поиска интересных модулей CLR. Укажите all (по умолчанию), memory-only, unusual-dir,
sig-status, imposter-file или list.
--export=<.> : Необязательно, экспериментально | Укажите путь к файлу для экспорта загруженных модулей CLR для сканирования в памяти и сканирования модулей-самозванцев
(например, --hunt=memory-only/imposter-file/all).
--pid=<.> : Необязательно | Укажите целевой процесс по PID. Должен использоваться с параметром/значением --mode=process.
--checks=<.> : Необязательно | Укажите количество циклов сканирования. Это может помочь уменьшить пропуски из-за состояний гонки, но может также повторять вывод результатов.
Значение по умолчанию: 1.
--sleep=<.> : Необязательно | Укажите количество секунд задержки. Это может помочь уменьшить пропуски из-за состояний гонки, задерживая цикл проверки.
Значение по умолчанию: 0 секунд.
--debug : Необязательно | Отображать информацию об исключениях (например, ошибки подключения к процессу).
--nobanner : Необязательно | Подавить отображение баннера. Полезно для выполнения через скрипт PowerShell или для сценариев, использующих автоматизацию.
--suppress : Необязательно | Не сканировать процесс RogueAssemblyHunter при --mode=sweep или --mode=watch.
--help : Необязательно | Показать эту справку. Это переопределит любые другие параметры командной строки и завершит приложение. *Это значение по умолчанию без параметров.
[*] Режимы (--mode=)
- sweep : Сканировать/просматривать все процессы (Примечание: Успешно сканируются только процессы с одинаковой архитектурой/«разрядностью». Компилируйте для запуска на x86/x64 и т.д.).
- process : Сканировать один процесс. Используйте с --pid=<PID>.
- watch : Сканировать новые процессы при их создании. Настройте атрибуты сканирования с помощью --checks и --sleep. (Примечание: Это экспериментально. Вероятны состояния гонки.)
[*] Охоты (--hunt=)
- all : Значение по умолчанию. Анализировать со всеми опциями охоты (кроме 'list').
- memory-only : Охота в памяти. Анализировать модули CLR, не обеспеченные диском.
- unusual-dir : Охота на необычные каталоги. Анализировать модули CLR, загруженные вне «нормальных» каталогов.
Отредактируйте '_huntUnusualDirectoryFilter' для настройки.
- sig-status : Охота на подписи файлов. Анализировать модули CLR с аномальным статусом подписи (например, неподписанные). Примечание: Это экспериментально. Возможны ложные срабатывания.
Отредактируйте '_huntSigExclusionsFilter' для настройки.
- imposter-file : Охота на неожиданные модули CLR. Анализировать модули CLR с подозрительным дисковым файлом. Экспериментально.
- list : Пройти по всем модулям CLR и вывести их список.
[*] Примеры использования
- Пример 1 : Сканировать процессы и выполнить все охоты для доступных 64-битных процессов (кроме 'list') —
RogueAssemblyHunter_x64.exe --mode=sweep
- Пример 2 : Сканировать процессы, вывести список всех модулей CLR в доступных 32-битных управляемых процессах и показать информацию об ошибках —
RogueAssemblyHunter_x86.exe --mode=sweep --hunt=list --debug
- Пример 3 : Наблюдать за новыми процессами, сканировать все модули CLR (если управляемые и 64-битные), не сканировать процесс RogueAssemblyHunter и выполнить 2 проверки с задержкой 3 секунды между ними —
RogueAssemblyHunter_x64.exe --mode=watch --suppress --checks=2 --sleep=3
- Пример 4 : Сканировать один процесс по PID, вывести только модули CLR в памяти и экспортировать модули CLR в указанный путь —
RogueAssemblyHunter_x86.exe --mode=process --pid=4650 --hunt=memory-only --export=c:\evilassemblies\
- Пример 5 : Сканировать процессы, вывести только модули CLR в памяти для доступных 64-битных процессов, не сканировать процесс RogueAssemblyHunter и не показывать заголовочный баннер —
RogueAssemblyHunter_x64.exe --mode=sweep --hunt=memory-only --suppress --nobanner
Для удобства в папку \Release включены скрипт PowerShell и два скомпилированных бинарных файла (RogueAssemblyHunter_x64.exe и RogueAssemblyHunter_x86.exe). Вы можете изменить их для своих сценариев использования (например, развертывание, внедрение, проверки, задержка и т.д.).
Пример использования:
Запустить Invoke-RogueAssemblyHunter в режиме sweep и проверить все опции охоты
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter
Запустить Invoke-RogueAssemblyHunter в режиме watch и проверить все опции охоты
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter -ScanMode watch
SHA256 хеши:
e804711a8b6469f1b13b388de47dfa6dde1c85279d365db7b6e19e1644990fa6 Invoke-RogueAssemblyHunter.ps1
cc985d918e566671aa209142abc55bd798ca6c1a18730b785ac8c18d489736c3 RogueAssemblyHunter_x64.exe
ae3aead43871e263cd8465d5356c4daaae0635714321f872c931ec825008287a RogueAssemblyHunter_x86.exe