
Cobalt Strike BOF для выполнения внутрипроцессных сборок .NET с обходом AMSI/ETW, пользовательским AppDomain и перенаправлением вывода через именованные каналы/почтовые слоты.
InlineExecute-Assembly — это доказательство концепции Beacon Object File (BOF), которое позволяет специалистам по безопасности выполнять .NET сборки в рамках процесса, как альтернатива традиционному модулю execute-assembly Cobalt Strike, работающему через fork and run. InlineExecute-Assembly выполнит любую сборку с точкой входа Main(string[] args) или Main(). Это позволяет запускать большинство опубликованных инструментов без предварительных изменений.
BOF автоматически определит, какую версию Common Language Runtime (CLR) необходимо загрузить в процесс для вашей сборки (v2.0.50727 или v4.0.30319) перед выполнением и в большинстве случаев корректно завершится при возникновении проблем. BOF также поддерживает несколько флагов, которые позволяют оператору управлять различными аспектами перед выполнением .NET, включая отключение AMSI через патчинг памяти, отключение и восстановление ETW через патчинг памяти, настройку имени создаваемого домена приложения CLR, возможность перенаправлять вывод консоли сборки в именованный канал (named pipe) или почтовый слот (mailslot), а также переключение точки входа с Main(string[] args) на Main(). Более подробная информация об использовании, сценариях и возможных способах обнаружения приведена ниже и по адресу https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/.
Наконец, преимущество выполнения наших .NET сборок в том же процессе, что и наш beacon implant, заключается в том, что мы избегаем стандартного поведения модуля execute-assembly Cobalt Strike, который создаёт новый процесс для загрузки/внедрения CLR/.NET сборки. Однако существуют и другие соображения по opsec, например: загружает ли процесс, в котором мы выполняемся, обычно CLR? Есть ли у выполняемой .NET сборки известные сигнатуры? Поэтому недостатком является то, что если что-то будет обнаружено и заблокировано (например, AMSI), ваш beacon также будет убит.
Этот инструмент не появился бы без возможности опереться на действительно отличные исследования, инструменты и код, уже опубликованные членами сообщества безопасности. Спасибо им. Если кто-то остался не упомянутым ниже, дайте мне знать, и я обязательно добавлю их.
Выполните следующую команду в каталоге src через x64 Native Tools Command Prompt для VS 2019.
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx64.o
Выполните следующую команду в каталоге src через x86 Native Tools Command Prompt для VS 2019.
cl.exe /c inlineExecute-Assembly.c /GS- /FoinlineExecute-Assemblyx86.o
--dotnetassembly Путь к сборке **обязательно**
--assemblyargs Аргументы для сборки
--appdomain Изменить имя по умолчанию AppDomain (значение по умолчанию: totesLegit, задаётся во включённом aggressor-скрипте) *Домен всегда выгружается*
--amsi Попытка отключить AMSI через патчинг памяти (в случае успеха AMSI будет отключён на всё время жизни процесса)
--etw Попытка отключить ETW через патчинг памяти (в случае успеха ETW будет отключён на всё время жизни процесса, если не отменить)
--revertetw Попытка отключить ETW через патчинг памяти, а затем восстановить исходное состояние
--pipe Изменить имя по умолчанию именованного канала (значение по умолчанию: totesLegit, задаётся во включённом aggressor-скрипте)
--mailslot Переключиться на использование почтовых слотов для перенаправления вывода консоли. Изменяет имя по умолчанию почтового слота (если оставить пустым, значение по умолчанию: totesLegit, задаётся во включённом aggressor-скрипте)
--main Изменить точку входа на Main() (значение по умолчанию: Main(string[] args))
Выполнение .NET сборки
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe
Выполнение .NET сборки с аргументами
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker
Выполнение .NET сборки с аргументами и отключением AMSI
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi
Выполнение .NET сборки с аргументами и отключением ETW
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --etw
Выполнение .NET сборки с аргументами и перенаправлением вывода через почтовый слот вместо именованного канала по умолчанию
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --mailslot
Выполнение .NET сборки с аргументами и изменение имени именованного канала, заданного в aggressor-скрипте
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --pipe forRealLegit
Выполнение .NET сборки и изменение домена приложения по умолчанию, заданного в aggressor-скрипте
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --appdomain forRealLegit
Выполнение .NET сборки с точкой входа Main() вместо Main(string[] args)
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/simpleMain.exe --main
Полный набор
beacon> inlineExecute-Assembly --dotnetassembly /root/Desktop/Seatbelt.exe --assemblyargs AntiVirus AppLocker --amsi --etw --appdomain forRealLegit --mailslot forRealLegit
Некоторые стратегии обнаружения и смягчения, которые могут быть использованы: