
Фреймворк обнаружения обфускации PowerShell


Revoke-Obfuscation — это совместимая с PowerShell v3.0+ платформа для обнаружения обфускации PowerShell.
Daniel Bohannon (@danielhbohannon) Lee Holmes (@Lee_Homes)
Запись в блоге: https://www.fireeye.com/blog/threat-research/2017/07/revoke-obfuscation-powershell.html
Белая книга: https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/revoke-obfuscation-report.pdf
Осенью 2016 года и весной 2017 года Daniel Bohannon (@danielhbohannon) выпустил Invoke-Obfuscation и Invoke-CradleCrafter — две открытые платформы для обфускации PowerShell. Целью этого исследования и этих фреймворков было показать ограничения чисто сигнатурного подхода к обнаружению использования PowerShell атакующими. Основная мысль для защитников заключается в необходимости выявлять Индикаторы обфускации в дополнение к известному подозрительному синтаксису.
Однако крайние уровни рандомизации в Invoke-Obfuscation и Invoke-CradleCrafter в сочетании с опциями обфускации на уровне токенов, которые не деобфусцируются в журналировании блоков скриптов PowerShell, побудили защитников искать новый, масштабируемый способ общего обнаружения как известных, так и неизвестных методов обфускации.
Через несколько недель после выпуска Invoke-Obfuscation Lee Holmes (@Lee_Homes) опубликовал запись в блоге под названием More Detecting Obfuscated PowerShell, в которой он описал методы статистического анализа для обнаружения аномальных признаков в сильно обфусцированных скриптах, особенно тех, что созданы с помощью Invoke-Obfuscation.
После этого обмена Daniel и Lee стали хорошими друзьями и разделили множество общих интересов/увлечений — а именно любовь к хорошему кофе и стремление создавать новые способы тщательного обнаружения обфусцированного PowerShell.
Время, которое оба Blue Teamers потратили на изучение исследований и PoC-кода, можно приравнять к нескольким тысячам чашек кофе, сваренного в Chemex, при условии правильного четырёхминутного времени заваривания (если хотя бы ещё один энтузиаст кофе уловил этот каламбур про «пролив»).
Revoke-Obfuscation — это конечный продукт ручной работы этих усилий.
Revoke-Obfuscation — это открытая платформа PowerShell v3.0+ для обнаружения обфусцированных команд и скриптов PowerShell в масштабе. Она использует AST (абстрактное синтаксическое дерево) PowerShell для быстрого извлечения тысяч признаков из любого входного скрипта PowerShell и сравнивает этот вектор признаков с одним из нескольких предварительно определённых взвешенных векторов признаков, вычисленных с помощью автоматизированного процесса обучения на корпусе из 408K+ скриптов PowerShell. Полный корпус можно загрузить с https://aka.ms/PowerShellCorpus. Подробности науки о данных, лежащей в основе этой работы, можно найти в подкаталоге «DataScience» репозитория.
Поскольку Revoke-Obfuscation полагается на извлечение и сравнение признаков, а не на чистые IOCs или сопоставление RegEx, он более устойчив в способности выявлять неизвестные методы обфускации, даже когда атакующие пытаются ослабить свою обфускацию, добавляя в скрипт необфусцированное содержимое, чтобы обмануть простые проверки, такие как анализ частоты символов.
Revoke-Obfuscation может легко анализировать большинство входных скриптов PowerShell за 100–300 миллисекунд. Такой уровень производительности позволяет организации измерять обфускацию (как минимум) 12K+ скриптов PowerShell в час без необходимости индексировать подробные журналы блоков скриптов PowerShell в SIEM.
Наконец, Revoke-Obfuscation поддерживает простую функцию белого списка, а также возможность загружать записи журнала событий PowerShell Operational и восстанавливать блоки скриптов, которые записываются в многочисленных записях EID 4104 блоков скриптов. Он легко может стать универсальным средством для загрузки журналов событий PowerShell Operational в среде, восстановления и уникализации всех скриптов в этих журналах, а затем выявления обфусцированных скриптов PowerShell, требующих ручной проверки.
Исходный код Revoke-Obfuscation размещён на Github; вы можете загрузить, форкнуть и просмотреть его из этого репозитория (https://github.com/danielbohannon/Revoke-Obfuscation). Пожалуйста, сообщайте об ошибках или запросах функций через баг-трекер Github, связанный с этим проектом.
Для установки (из Github):
Import-Module .\Revoke-Obfuscation.psd1
Исходный код также можно установить напрямую из PowerShell Gallery с помощью следующих команд:
Для установки (из PowerShell Gallery):
Install-Module Revoke-Obfuscation
Import-Module Revoke-Obfuscation
Revoke-Obfuscation предоставит подробное руководство, а также несколько других забавных сюрпризов. Но если вас не интересуют приколы, вы можете просто запустить Get-Help Measure-RvoObfuscation, чтобы увидеть синтаксис использования, или просто продолжить чтение.
В этом фреймворке есть две основные функции:
Если вам нужно восстановить и извлечь журналы блоков скриптов из журналов PowerShell Operational, то Get-RvoScriptBlock — ваша функция выбора. Она автоматически возвращает только уникальные блоки скриптов и исключает определённые значения блоков скриптов по умолчанию, которые не считаются вредоносными. Это можно переопределить с помощью ключа -Deep.
Get-RvoScriptBlock -Path 'C:\Windows\System32\Winevt\Logs\Microsoft-Windows-PowerShell%4Operational.evtx' -VerboseGet-ChildItem .\Demo\demo.evtx | Get-RvoScriptBlock -VerboseGet-WinEvent -LogName Microsoft-Windows-PowerShell/Operational | Get-RvoScriptBlock -VerboseGet-RvoScriptBlock также поддерживает результаты аудита MIR/HX, а также журналы PowerShell
Operational, полученные с помощью проекта CimSweep Мэтта Гребера (@mattifestation)
(https://github.com/PowerShellMafia/CimSweep). Для CimSweep требуется небольшая
настройка реестра, чтобы обмануть WMI и заставить его запрашивать неклассический журнал событий.
Подробности можно найти в разделе NOTES функции Get-RvoScriptBlock.
Get-ChildItem C:\MirOrHxAuditFiles\*_w32eventlogs.xml | Get-RvoScriptBlock -VerboseGet-CSEventLogEntry -LogName Microsoft-Windows-PowerShell/Operational | Get-RvoScriptBlockПолный пример с тестовыми данными, записанными в demo.evtx, можно найти ниже:
$obfResults = Get-WinEvent -Path .\Demo\demo.evtx | Get-RvoScriptBlock | Measure-RvoObfuscation -OutputToDisk -Verbose
Полный пример с локальными и удалёнными тестовыми скриптами можно найти ниже:
Measure-RvoObfuscation -Url 'http://bit.ly/DBOdemo1' -Verbose -OutputToDiskGet-Content .\Demo\DBOdemo*.ps1 | Measure-RvoObfuscation -Verbose -OutputToDiskGet-ChildItem .\Demo\DBOdemo*.ps1 | Measure-RvoObfuscation -Verbose -OutputToDiskКлюч -OutputToDisk автоматически выведет все обфусцированные скрипты в папку .\Results\Obfuscated. В любом случае все результаты будут возвращены в виде PSCustomObject, содержащих содержимое скрипта вместе с метаданными, такими как оценка обфускации, время измерения, результат белого списка, все извлечённые признаки скрипта и т.д.
В Revoke-Obfuscation есть три варианта белого списка в двух местах:
-WhitelistFile .\files\*.ps1,.\more_files\*.ps1,.\one_more_file.ps1-WhitelistContent 'string 1 to whitelist','string 2 to whitelist'-WhitelistRegex 'regex 1 to whitelist','regex 2 to whitelist'Если вы заинтересованы в создании собственного набора обучающих данных и генерации взвешенного вектора для функции Measure-Vector, то ModelTrainer.cs/ModelTrainer.exe можно запустить на размеченном наборе данных. Следующая команда извлечёт векторы признаков из всех входных скриптов и объединит их в один CSV-файл, используемый на этом этапе обучения:
Get-ChildItem .\*.ps1 | ForEach-Object { [PSCustomObject](Get-RvoFeatureVector -Path $_.FullName) | Export-Csv .\all_features.csv -Append }
Наконец, если вам нужна платформа для создания индикаторов (IOCs), использующая возможности AST PowerShell (что мы настоятельно рекомендуем для выявления вредоносной активности PowerShell, которая НЕ обфусцирована), то PS Script Analyzer — отличный фреймворк, предназначенный для таких задач.
Revoke-Obfuscation распространяется по лицензии Apache 2.0.
v1.0 — 2017-07-27 Black Hat USA и 2017-07-30 DEF CON: Публичный выпуск Revoke-Obfuscation.