-
-
[分享]不动内存不使用VirtualProtect的AMSI绕过原理(暂未修复)
-
发表于:
2024-5-15 18:02
8792
-
[分享]不动内存不使用VirtualProtect的AMSI绕过原理(暂未修复)
Microsoft 的反恶意软件扫描接口 (AMSI) 在 Windows 10 和更高版本的 Windows 中提供,用于帮助检测和预防恶意软件。 AMSI 是一个接口,它将各种安全应用程序(例如防病毒或反恶意软件软件)集成到应用程序和软件中,并在执行之前检查它们的行为。 OffSec 工作人员 Victor “Vixx” Khoury 在 System.Management.Automation.dll
中发现了一个可写条目,其中包含 AmsiScanBuffer
的地址,AmsiScanBuffer
是 AMSI 的关键组件,应该被标记为只读,类似于导入地址表 (IAT)条目。在这篇文章中,我们将介绍并利用此漏洞进行 0day AMSI 绕过。
大多数 AMSI 绕过都会破坏 AMSI 库 Amsi.dll 中的函数或字段,从而导致 AMSI 崩溃来绕过它。除了崩溃或patch Amsi.dll 之外,攻击者还可以使用 CLR Hooking 绕过 AMSI,通过调用 VirtualProtect 并使用返回 TRUE 的HOOK覆盖它来更改 ScanContent 函数的保护功能。虽然 VirtualProtect 本身并不是恶意的,但恶意软件可能会滥用它来修改内存,从而逃避EDR和防病毒 (AV) 软件的检测。
首先检查 Amsi.dll 的 AmsiScanBuffer 函数,该函数扫描内存缓冲区中是否存在恶意软件,许多应用程序和服务都利用此功能。在 .NET 框架内,Common Language Runtime (CLR) 利用 System.Management.Automation.dll
内 AmsiUtils 类中的 ScanContent 函数,该函数是 PowerShell 核心库的一部分,来调用 AmsiScanBuffer
。可以通过[PSObject].Assembly.Location
查看该DLL位置,
然后用dnspy找到ScanContent位置,找到调用AmsiScanBuffer调用位置:
使用windbg附加powershell.exe,查看amis模块,以Amsi关键词的符号(symbol):
在AmsiScanBuffer 上设置一个断点:
随机读取一个文件或者键入字符串,触发断点,查看调用堆栈如下:
本次攻击的目标是System Management Automation ni 模块,它调用的函数,而不是直接去操作AmsiScanBuffer函数。
从System_Management_Automation_ni+0x1099e37处往后反汇编查看代码,每个人地址可能不一样:
00007ffa 109c9e35 ffd0 call rax
就是对AmsiScanBuffer的调用位置,绕过 AMSI 的一种方法是patch call rax,这需要 VirtualProtect. 但是在调用函数之前,研究人员发现AmsiScanbuffer函数已经是可写状态了,注意看:
dqs @rbp-0x50 L1
查看基址指针寄存器 rbp(当前堆栈帧的基址)之前 80 字节 (0x50)地址。一步步找到AmsiScanBuffer地址0x7ffa10b5d9b0,相对System_Management_Automation_ni模块偏移0x78d9b0。
现在我们深入研究一下这块是怎么填充和保护的,现在用windbg launch powershell.exe。在System.Management.Automation.ni.dll设置触发断点,执行g,然后再在System Management Automation ni + 0x78d9b0 处中断读/写ba r1 System_Management_Automation_ni + 0x78d9b0
,执行g
clr!NDirectMethodDesc::SetNDirectTarget+0x3b处被断下,反汇编查看附件汇编代码:
我们发现rdi已经是AmsiScanBuffer函数地址,rsi正在被写入目标地址。
继续g执行,就会发现前文提到的调用位置:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!