
Генератор обфускации команд Cmd.exe и тестовый стенд обнаружения

Invoke-DOSfuscation — это совместимая с PowerShell v2.0+ среда обфускации команд cmd.exe. (Белая книга: https://www.fireeye.com/blog/threat-research/2018/03/dosfuscation-exploring-obfuscation-and-detection-techniques.html)
За последние несколько лет работы консультантом по реагированию на инциденты я стал свидетелем множества методов обфускации и уклонения, используемых несколькими угрожающими субъектами. Некоторые из этих методов невероятно сложны, другие — искусно просты, но обе категории применяются для обхода обнаружения. По моему опыту, APT32 и FIN7 применяют наиболее привлекательные методы обфускации, и их креативность заслуживает внимания.
В июне 2017 года, после серии инкрементных методов обфускации командной строки, FIN7 использовал возможность подстановки строк переменных окружения, встроенную в cmd.exe, о существовании которой я тогда даже не знал. Побуждаемый этим открытием, я стал соавтором поста в блоге вместе с Ником Карром (@ItsReallyNick) под названием Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques, где мы осветили методы обфускации нескольких групп, обнаруженные нами в реальных атаках.
В следующие выходные я исследовал эту встроенную функцию подстановки cmd.exe и создал и выпустил простой инструмент Proof-of-Concept под названием Out-FINcodedCommand. Как только я выпустил этот POC, я отступил и подумал: «Возможно, в cmd.exe есть ещё больше возможностей обфускации, которые мне стоит исследовать и для которых нужно создать механизмы обнаружения, прежде чем мы увидим их использование в реальных атаках».
Это было началом моего исследования, которое в конечном итоге привело к разработке этого фреймворка Invoke-DOSfuscation.
Злоумышленники всё чаще используют методы обфускации для обхода детектов, основанных преимущественно на значениях аргументов командной строки. Чтобы противостоять этому, я потратил пять месяцев на исследование и разработку методов обфускации и кодирования, встроенных в cmd.exe, чтобы создать надёжные механизмы обнаружения для этих основных методов, которые я ещё не видел в реальных атаках.
Единственная цель этого фреймворка — дать защитникам возможность случайным образом генерировать тысячи уникально обфусцированных примеров команд для тестирования и настройки своих возможностей обнаружения против этих методов. Я включил в этот релиз полный тестовый стенд для автоматизации этого процесса проверки обнаружения.
Во многом этот фреймворк позволяет защитникам «фаззить» методы обфускации cmd.exe, и при создании этого инструмента я обнаружил множество дополнительных возможностей обфускации, которые не выявил в ходе первоначального исследования.
Я также поделился этой информацией с Microsoft в ноябре 2017 года и запросил возможности обеспечить дополнительную видимость внутренних механизмов использования cmd.exe основных техник, которые являются строительными блоками всех функций обфускации, встроенных в этот фреймворк.
Для защитника конечная цель этого исследования и разработки — повышение осведомлённости и стимулирование изменений, которые помогут конечным пользователям лучше защищать себя от постоянно меняющихся TTP (инструментов, тактик и процедур) злоумышленников.
Хотя все компоненты обфускации реализованы в виде отдельных формальных функций, большинству пользователей будет проще всего использовать функцию Invoke-DOSfuscation для изучения и визуализации методов обфускации, поддерживаемых этим фреймворком. Однако для фаззинга и глубокого изучения многочисленных опций настройки для каждой категории обфускации рекомендуется использовать отдельные функции напрямую, вне обёртки Invoke-DOSfuscation.
Чтобы защитникам было легко начать фаззить и тестировать идеи обнаружения, этот фреймворк также включает дополнительный модуль Invoke-DOSfuscationTestHarness.psm1, который автоматически импортируется вместе с остальной частью проекта. Две ключевые функции в этом модуле для защитников:
Invoke-DosTestHarness — генерирует (с настройками аргументов по умолчанию) более 1000 случайно обфусцированных команд из списка тестовых команд как для проверки целостности полезной нагрузки, так и для обнаружения. Каждая итерация тестового стенда рандомизирует все доступные аргументы функций и вызывает четыре функции обфускации напрямую, а не использует более стандартизированные значения -ObfuscationLevel (1–3), которые использует меню-ориентированная функция Invoke-DOSfuscation. Это даёт значительно более широкий диапазон обфусцированных выходных данных, на основе которых можно строить более тщательные детекты. Каждая обфусцированная команда затем проверяется второй функцией:Get-DosDetectionMatch — проверяет входную команду (строку) на соответствие всем значениям regex-детектов, введённым в массив $regexDetectionTerms в функции. Она автоматически вызывается Invoke-DosTestHarness, но может быть вызвана и отдельно.В конце каждого запуска тестового стенда отображается статистика правильного выполнения команд и обнаружения, чтобы защитники могли быстро определить, какие команды имеют 0 или только 1–2 совпадения с детектами, и, возможно, требуют лучшего покрытия.
Наконец, чтобы защитникам не приходилось запускать тестовый стенд для начала работы, я предоставил 1000 примеров команд в каталоге Samples, разбитых по четырём функциям обфускации. Форматы включают файлы .txt, а также файлы Security и Sysmon .evtx. Я включил пару примеров правил обнаружения в массив $regexDetectionTerms в Invoke-DOSfuscationTestHarness.psm1, но вам нужно будет добавить и протестировать гораздо больше правил, когда будете тестировать примеры обфусцированных команд). Помимо .txt-файлов с сырыми командами, есть .evtx-файлы, содержащие журналы выполнения процессов (события Sysmon EID 1) для каждой из 1000 примеров команд. Эти журналы событий чрезвычайно полезны для построения индикаторов на основе нюансированных выполнений дочерних процессов, которые являются побочными продуктами нескольких строительных техник, на которых основан Invoke-DOSfuscation.
Чтобы начать, отобразите примеры обфусцированных команд, которые не соответствуют ни одному из ваших текущих правил обнаружения, просто выполнив:
(Get-Content .\Samples\STATIC_1-of-4_Out-DosConcatenatedCommand.txt) | where-object { -not (Get-DosDetectionMatch -Command $_).Detected }
Чтобы протестировать как обфусцированные команды, так и дочерние процессы из журналов выполнения событий, записанных в Security EID 4688, просто выполните:
(Get-WinEvent -Path .\Samples\DYNAMIC_SECURITY_EID4688_1-of-4_Out-DosConcatenatedCommand.evtx) | where-object { $_.Message } | foreach-object { ($_.Message.Split("`n") | select-string '^\tProcess Command Line:\t') -replace '^\tProcess Command Line:\t','' } | where-object { -not (Get-DosDetectionMatch -Command $_).Detected }
Исходный код Invoke-DOSfuscation размещён на Github; вы можете загрузить, форкнуть и изучить его из этого репозитория (https://github.com/danielbohannon/Invoke-DOSfuscation). Сообщайте о проблемах или запросах функций через трекер ошибок Github, связанный с этим проектом.
Для установки:
Import-Module .\Invoke-DOSfuscation.psd1
Invoke-DOSfuscation
Invoke-DOSfuscation распространяется под лицензией Apache 2.0.
v1.0 — 23 марта 2018 г., Black Hat Asia (Сингапур): Публичный выпуск Invoke-DOSfuscation.