提醒:本文最后更新于 137 天前,其中某些信息可能已经过时,请谨慎使用!
你似乎正在查看一篇很久远的文章。
为了你这样的访客,我特地保留了我的历史博文。不要笑话过去的我,用温柔的目光看下去吧。

AMSI的介绍,原理,应用,绕过及利用

AMSI全称Antimalware Scan Interface,翻译过来大概是反恶意软件扫描接口,在Windows 10和Windows Server 2016起默认安装并启用。

其工作原理是在相关进程加载时将Amsi.dll注入进程,并在出现敏感api或com接口调用时扫描文件,内存及数据等,与其提供程序中的签名进行比对,如有匹配就返回对应检测结果。(github.com/synacktiv/AMSI-BYPASS中存在一些相关调用的可疑函数列表,年代久远仅供参考)

Amsi主要针对js,vbs,vba,Powershell等脚本及同样使用clr环境的.net程序。Amsi属于系统接口,默认会被Windows Defender调用,并用于保护系统。同时,其面向所有应用程序开放,所以有很多杀软会存在相关选项,可以设置开启AMSI保护。不过,国内目前还没有杀软使用该接口进行保护(有部分文章中提到360可以选择开启,这里存在一个误区,360在设置中可以与Windows Defender并存,并不是采用了Amsi接口,而是选择不将自身注册到安全中心,使Windows Defender保持默认开启)。

Amsi.dll中,通常存在如下api

AmsiInitialize – 初始化AMSI API
AmsiOpenSession – 用于关联多个扫描请求
AmsiScanBuffer – 扫描用户输入
AmsiCloseSession – 关闭会话
AmsiUninitialize – 删除AMSI API 实例

其中AmsiScanBuffer返回扫描结果

由于Amsi.dll存在且运行于用户层,所以其很容易被绕过,常见的绕过思路如下:

1.内存中替换AmsiScanBuffer函数,使其返回AMSI_RESAULT_CLEAN,即扫描结果安全

2.在内存中修改AmsiScanBuffer函数的amsiSession及amsiContext参数使其出错,停止扫描

3.修改内存中的amsiInitFailed值为true,使其返回加载失败

4.劫持dll,利用dll搜索顺序,通过在执行文件的目录防放置自制的amsi.dll来阻止系统amsi.dll的加载

5.使用不被amsi支持的方法调用,如Powershell 2.0,DDE,EXCEL4.0等

6.修改注册表关闭AmsiEnable,或关闭Windows Defender等杀软使其无效

7.混淆脚本,使扫描不到恶意内容(对于被混淆的脚本,Windows Defender自带了反混淆,可以一定程度上加强混淆绕过的难度),注意避免使用base64及xor来混淆加密

除此之外,Amsi还可以被用来实现权限维持,通过向系统注册AmsiProvider.dll,可以实现在amsi扫描时执行自定义的dll中的内容。当然,用上面提到过的dll劫持也可以实现,但是这就与Amsi本身关系不大了。

发表评论

共有 0 条看法