使用AMSI监控powershell
一、AMSI原理
amsi(Windows Antimalware Scan Interface )是win10上微软引入的针对脚本检测的能力,可以检测阻断恶意powershell、js、vbs、vba等脚本
https://learn.microsoft.com/en-us/windows/win32/amsi/antimalware-scan-interface-portal
https://learn.microsoft.com/en-us/windows/win32/amsi/how-amsi-helps
安全开发者可以注册amsi来对脚本内容进行监控
https://github.com/microsoft/Windows-classic-samples/tree/main/Samples/AmsiProvider
比如我们可以看一个office宏上的amsi回调例子,VBE7.dll通过amsi!AmsiScanString进行宏脚本扫描,最后可以调用到我们的AmsiProvider脚本中
二、AMSI绕过
AMSI绕过的代码网上非常多,这里简单列举一下:
2.1 常见的就是powershell降级,powershell在低版本上不支持amsi,所以常见的使用powershell 2.0版本来执行脚本,amsi就无法获取到脚本内容
powershell -version 2
2.2 AMSI patch,对于AMSI的扫描函数AmsiScanBuffer进行patch,绕过AMSI的扫描
2.3 删除 HKLM\Software\Microsoft\AMSI 中的 AMSI Provider 注册表项禁用AMSI
2.4 禁用amsi 将HKCU\Software\Microsoft\Windows Script\Settings\AmsiEnable的表项值置为0
2.5 amsi.dll劫持,C:\Windows\System32\WindowsPowerShell\v1.0目录下放一个amsi.dll文件
三、powershell中AMSI反绕过
对于amsi比较常见的绕过方式,我们可以手动hook powershell中的函数来获取脚本内容
对于powershell 2.0,我们可以hook System.Management.Automationh.CommandProcessorBase:DoCoplete()方法
通过ScriptBlock.Token.Script和ScriptBlock.Token.File可以拿到脚本内容(命令)和脚本路径
对于高版本powershell,可以hook System.Management.Automation.AmsiUtils::ScanContent,该API可以直接拿到等同于amsi::AmsiScanBuffer回调的结果
hook System.Management.Automation.CompiledScriptBlockData::Compile(),拿到编译的脚本
hook Microsoft.PowerShell.Commands.InvokeExpressionCommand::ProcessRecord() 来记录混淆的脚本
通过我们自己的注入模块,可以直接挂钩系统.NET模块拿到powershell数据,不需要依赖系统的amsi.dll进行回调,避免了大众低成本的绕过方式,提高对抗成本。
C:\Windows\System32\WindowsPowerShell\v1.0