使用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

posted on 2023-03-09 23:33  ciyze0101  阅读(1)  评论(0编辑  收藏  举报

导航