反恶意软件扫描接口(AMSI)是Microsoft首次在Windows 10中引入的安全机制,目的是保护用户免受恶意软件侵害。AMSI能够实时拦截PowerShell、JavaScript、VBScript、VBA或.NET脚本和命令,并将其发送到防病毒软件进行安全扫描。 传统杀毒软件主要检测磁盘上的文件或试图创建进程的文件,而对于完全依赖内存执行且不落地磁盘的无文件攻击却无能为力。而AMSI填补了这一安全缺口,提供了一个统一的接口,使安全产品能够检测内存中的威胁,能够检测命令或无文件脚本中的恶意内容。 当用户启动脚本或初始化PowerShell进程时,AMSI.DLL库会自动加载到该进程中。此库提供与防病毒软件交互所需的API。在执行前,脚本或命令通过远程过程调用(RPC)发送至Microsoft Defender或其他支持AMSI的防病毒软件进行分析。若检测到已知恶意签名,执行会被中断,并显示脚本已被防病毒程序阻止的提示。 目前与AMSI集成的Windows组件包括: AMSI的功能主要通过以下关键函数实现: 其中, 首先,我们需要打开一个PowerShell窗口,这将作为我们的测试环境。在Windows操作系统中,可以通过开始菜单或者按下Win+X然后选择PowerShell来启动。PowerShell启动后,我们需要确定其进程ID,这是后续操作的基础。 在PowerShell控制台中,输入以下命令: 执行后,系统会返回当前运行的所有PowerShell实例的详细信息,包括进程ID(PID)、内存使用情况、CPU时间等。我们需要关注的是PID列,因为这个数字标识符将在后续步骤中用于定位目标进程。 接下来,我们需要打开一个单独的命令行窗口(可以是CMD或另一个终端)。这个窗口将用于运行Frida工具,它能够动态分析和修改正在运行的程序。 在命令行中,输入以下命令(注意将 这条命令的执行效果是: 当命令执行成功后,Frida会显示它已经成功附加到目标进程,并且正在监听相关函数调用。 Frida工具执行后,它会在当前工作目录中自动创建必要的JavaScript处理脚本,这些脚本通常位于 使用文本编辑器(如记事本、VS Code或Notepad++)打开生成的
现在,我们需要修改脚本文件的内容,实现对AMSI扫描结果的拦截。将 该代码使用Frida框架监控AmsiScanBuffer函数调用,记录所有关键参数(扫描内容、长度等)并显示最终扫描结果,用于分析AMSI的工作过程。与前一个代码不同,此版本只记录数据而不修改扫描结果。 快捷键 在powershell的命令行键入 在powershell的命令行键入 通过本次的操作,可以浅浅窥探到AMSI的一些内部原理,虽然AMSI为用户提供了安全防护能力,但也可能被攻击者围绕这些机制进行滥用:
由于本实验是从检测防御的角度来开展,就不展开叙述其它围绕AMSI的攻击性操作和绕过手段
为加强AMSI防护能力,系统管理员可考虑采取以下措施: 对于AMSI绕过这类技术,需要采取多层次的防御策略,结合技术手段和管理措施,才能有效降低被攻击的风险。网络安全不是一次性工作,而是需要持续改进的过程,只有保持警惕并不断更新防御措施,才能在攻防对抗中占据主动。 希望本文对您的网络安全防护工作有所帮助。但在实施任何安全测试前,请务必在测试环境中进行验证,并根据实际情况进行适当调整。 参考
用Frida看看AmsiScanBuffer呢
AMSI简介
AMSI的工作原理
AMSI核心函数与检测机制
AmsiInitialize
: 初始化AMSI APIAmsiOpenSession
: 打开会话,用于关联多个扫描请求AmsiScanBuffer
和AmsiScanString
: 核心扫描函数,用于检测缓冲区或字符串中的恶意内容AmsiCloseSession
: 关闭由AmsiOpenSession打开的会话AmsiUninitialize
: 移除由AmsiInitialize打开的AMSI API实例AmsiScanString
和AmsiScanBuffer
是AMSI检测过程中最关键的函数。当这些函数被调用后,会返回扫描结果,可能的值包括:
typedef enum AMSI_RESULT {
AMSI_RESULT_CLEAN,
AMSI_RESULT_NOT_DETECTED,
AMSI_RESULT_BLOCKED_BY_ADMIN_START,
AMSI_RESULT_BLOCKED_BY_ADMIN_END,
AMSI_RESULT_DETECTED
} ;
动手实践
1. 准备PowerShell环境并获取进程标识符
Get-Process -Name powershell
2. 配置Frida工具进行函数挂钩
<PID>
替换为上一步获取的PowerShell进程ID):frida-trace -p <PID> -x amsi.dll -i Amsi*
amsi.dll
动态链接库Amsi
开头的函数调用,如AmsiScanBuffer
、AmsiOpenSession
等AMSI关键函数3. 定位并访问自动生成的脚本文件
__handlers__
子目录下。(或者直接在当前目录中创建amsiscanbuffer.js
文件也可以)AmsiScanBuffer.js
文件。初始状态下,这个文件包含一个基本的函数框架,允许我们拦截和分析函数调用,但还没有其它实际的干预操作。4. 拦截AmsiScanBuffer
AmsiScanBuffer.js
的全部内容替换为以下JavaScript代码:defineHandler({
// 当AmsiScanBuffer函数被调用时执行
onEnter(log, args, state) {
log('[*] AmsiScanBuffer()');
log('[+] AMSI CONTEXT : ' + args[0]); // 记录AMSI上下文
log('[+] BUFFER : ' + Memory.readUtf16String(args[1])); // 记录被扫描的内容
log('[+] LENGTH : ' + args[2]); // 记录缓冲区长度
log('[+] CONTENT NAME : ' + args[3]); // 记录内容名称
log('[+] AMSI SESSION : ' + args[4]); // 记录AMSI会话
log('[+] RESULT : ' + args[5]); // 记录结果指针
this.result = args[5]; // 保存结果指针以便稍后使用
},
// 当AmsiScanBuffer函数返回时执行
onLeave(log, retval, state) {
log('[+] RESULT VALUE: ' + Memory.readUShort(this.result)); // 打印最终返回的扫描结果值
}
});
onEnter
函数在AMSI扫描函数被调用时触发,记录下所有关键参数,包括待扫描的内容和结果位置args[5]
,这是指向扫描结果的内存指针onLeave
函数在AMSI扫描完成准备返回结果时触发5. 测试
Win + R
之后输入 eventvwr.msc
打开Windows的事件查看器,接着事件查看器 -> 应用程序和服务日志 -> Microsoft -> Windows -> Windows Defender -> Operational
:"test"
,Frida打印出[+] RESULT VALUE: 1
,Windows的事件中没有对应日志:.Invoke-Mimikatz.ps1
,Frida打印出[+] RESULT VALUE: 32768
,Windows的事件中出现日志事件1116
:安全挑战与防御建议
AMSI.DLL
,使其关键函数如AmsiScanBuffer返回"安全"结果,从而绕过检测。
结语
免责声明:
文章中涉及的内容可能带有攻击性、损害性,请注意识别。文章内容仅能用于安全检测、安全防御、安全研究等合法合规的用途,请勿用作其它方面。若有违反,违反者将自行承担相应法律责任及连带责任,违反者的行为与本文章内容的创作者无关。请遵守相关法律法规,共同维护网络环境的清朗!如有问题可私信联系,望知悉。
原文始发于微信公众号(哆啦安全):用Frida看看AmsiScanBuffer
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论