Cobalt Strike - обход Windows Defender с обфускацией полезной нагрузки

ROOTROOTSECTORSECTOR Для всех красных команд, которые доставляют полезную нагрузку, не отталкиваясь от всех колоколов и свистков организации, всегда является проблемой. Как и во всех других решениях безопасности, Windows Defender стал лучше обнаруживать общие полезные нагрузки, созданные с помощью таких инструментов, как Cobalt Strike.
В этом примере мы рассмотрим создание полезной нагрузки PowerShell с помощью Cobalt Strike и посмотрим, как мы можем манипулировать ею таким образом, чтобы она выполнялась в обход Защитника Windows на ПК с Windows 10. Это не самое элегантное или простое решение для скрытия ваших "полезных данных" от Защитника Windows, но это один из методов, которые мы используем, и он работает.
Процесс создания полезной нагрузки следующий:
Снимок экрана в 14 Марта 16 50 50
Это приведет к созданию файла payload.txt, который включает команду PowerShell.
Снимок экрана в 14 марта 16 53 00
Если мы попытаемся запустить команду на ПК-жертве, мы приветствуем Защитника Windows, который воспринимает его как угрозу.
Снимок экрана на 12 марта 21 30 46
Чтобы обойти Защитника Windows, нам нужно сначала понять, как Cobalt Strike создает свои полезные нагрузки, а затем меняет некоторые его подписи, надеясь, что Защитник Windows будет считать это безопасным.
Прежде всего, очевидно, что команда полезной нагрузки, которую она base64 закодировала, либо глядя на формат, либо на флаг -encodedcommand PowerShell.
Чтобы декодировать команду, нам нужно вырезать
powershell.exe -nop -w hidden -encodedcommand
часть и сохранить все остальное.
Затем декодируйте остальную часть строки с помощью следующей команды.
echo 'base64 payload' | base64 -d
Снимок экрана на 14 марта 17 02 40
Полученная декодированная строка включает в себя строку с кодировкой base64, но пытается декодировать, что не будет работать и выплескивать тарабарщину, потому что строка также является сжатой Gzip из IEX (New-Object IO.StreamReader (New-Object IO.Compression.GzipStream ( $ s [IO.Compression.CompressionMode] :: Decompress))). ReadToEnd ()часть команды PowerShell.
Теперь нам нужно понять, что находится внутри этой команды, поскольку это та часть, которая фактически запускает Защитник Windows, то есть полезную нагрузку. Через какой-то поиск в Google я нашел этот скрипт PowerShell, который делает именно этоhttp://chernodv.blogspot.com/2014/12/powershell-compression-decompression.html
$data = [System.Convert]::FromBase64String('gzip base64')
$ms = New-Object System.IO.MemoryStream
$ms.Write($data, 0, $data.Length)
$ms.Seek(0,0) | Out-Null
$sr = New-Object System.IO.StreamReader(New-Object System.IO.Compression.GZipStream($ms, [System.IO.Compression.CompressionMode]::Decompress))
$sr.ReadToEnd() | set-clipboard
Скрипт сначала base64 расшифровывает строку и распаковывает ее, предоставляя нам весь код. Он также скопирует содержимое вывода в буфер обмена, чтобы вставить его в текстовый файл, который будет использоваться позже.
Снимок экрана в 14 Марта 17 42 10
$ Var_code переменная содержит полезную нагрузку , которая будучи обнаруженным Защитником Windows и нам нужно будет поменять , чтобы обойти защитника.
Декодирование $ var_code далее представляет собой серию символов ASCII, но декодирование полностью не требуется на данном этапе.
$enc=[System.Convert]::FromBase64String('encoded string')
Мы можем прочитать часть содержимого с помощью:
$readString=[System.Text.Encoding]::ASCII.GetString($enc)
Windows 10 1
Вышеизложенное теперь показывает некоторую информацию об пользовательском агенте и нашем злоумышленнике IP.
Теперь цель состоит в том, чтобы взять текущую полезную нагрузку и запутать ее так, чтобы она обманула Защитника Windows. Лучшим инструментом и инструментом выбора для этого типа работы является Invoke-Obfuscation Daniel Bohannon . Страница Github для проекта можно найти здесь .
Команды для запуска с Invoke-Obfuscation:
Import-Module .\Invoke-Obfuscation.psd1
Invoke-Obfuscation
Снимок экрана на 14 марта 18 09 29
Теперь нам нужно определить часть полезной нагрузки, которую нам нужно запутать. Это можно сделать с помощью следующей команды
Set scriptblock 'final_base64payload'
Снимок экрана в 14 марта 18 11 56
Инструмент возьмет наш блок сценария, а затем спросит нас, как мы хотим двигаться дальше. В этом случае я выбрал COMPRESS, а затем 1. Это не означает, что другие параметры не будут работать, но я нашел, что этот файл работает на момент написания. Invoke-Obfuscation сделает это волшебство и распечатает команду PowerShell, которая настолько искажена, что может потенциально обойти Защитник Windows.
2
Затем просто введите Out и путь, который вы хотите сохранить в качестве сценария PowerShell.
Out c:\payload.ps1
3
Текущая декомпрессированная полезная нагрузка с предыдущих шагов выглядит так.
Снимок экрана в 14 марта 18 37 47
Таким образом, все сводится к тому, что нам нужно заменить содержимое [Byte []] $ var_code = [System.Convert] :: FromBase64String нашей новой полезной нагрузкой из Invoke-Obfuscation. Для этого я определяю новую переменную, которую я называю $ злом, и просто помещаю содержимое вывода из Invoke-Obfuscation.
Важно - вам нужно вырезать деталь после последнего | из вывода Invoke-Obfuscation, потому что это команда, выполняющая команду. Нам это не понадобится, потому что шаблон Cobalt Strike сделает это для нас.
4
Сохраните отредактированный скрипт в файл PowerShell и выполните его. Результат должен быть маяком в Cobalt Strike и уведомлением Slack, если вы используете скрипт Aggressor @sec_groundzero
5
6
Если мы рассмотрим как полезную нагрузку на ваниль CS, так и модифицированную полезную нагрузку CS с помощью Process Hacker, мы видим, что мы не меняем базового поведения маяка.


Process2
CobaltCobaltStrikeStrike

Комментарии