Obfuscating API Patches to Bypass New Windows Defender Behavior Signatures
-
介绍 -
实验 -
实验 1:测试补丁修改 -
实验 2:监控新补丁
-
-
结论 -
前进方向 -
未来实验
介绍
今天我准备了一篇简短的文章,基于 Windows Defender 的一些最新更改。周末的时候,我注意到我的一些单元测试在一些近期未更改的代码上开始失败。经过进一步调查,我发现这是与通过 API 调用补丁绕过 AMSI 相关。这引起了我的一些警觉,因为这些绕过在过去几年中对我的许多红队计划至关重要。
我进行了些许谷歌搜索,发现微软确实发布了一些新的行为签名,旨在防止在1.419.240.0 版本 中对 amsi.dll::AmsiScanBuffer 方法的补丁。导致问题的代码是我用来补丁这个函数的代码。我们将深入探讨我用于补丁的汇编,因此理解函数签名可能会有所帮助:
HRESULT AmsiScanBuffer(
[in] HAMSICONTEXT amsiContext,
[in] PVOID buffer,
[in] ULONG length,
[in] LPCWSTR contentName,
[in, optional] HAMSISESSION amsiSession,
[out] AMSI_RESULT *result
);
在大多数情况下,我要么将补丁修改为返回 AMSI_RESULT_NOT_DETECTED(0x0),要么跳转到其他地方的一个返回 0x0 的函数。最终目标是防止这个函数向已安装的防病毒软件传输攻击者的命令、二进制文件或其他工件。
实验
我想深入探讨微软是如何实现这些行为签名的。他们是否终于开始拒绝对 AMSI.dll 的写访问?(老实说,我不确定他们为什么还没有这样做……)。我怀疑缓解措施可能基于补丁的内容,而不是对 AMSI.dll 的通用“阻止所有”修改。所以,我从这里开始了我的实验。
实验 1:测试补丁修改
我的假设是,只有特定的值或补丁会被 Windows Defender 检测到,可能是在使用 Kernel32.WriteProcessMemory 写入内存时被检测到。我的假设是:更改补丁的汇编指令将绕过行为签名并使我的补丁生效。如果修改后的补丁生效,那么我会得出结论,Windows Defender 只检测特定的汇编指令。我一开始通过添加一些无害的指令来调整我的补丁。在左侧是我原始的补丁代码,它将执行跳转到我在可执行内存中控制的 AmsiScanBuffer 的一个虚拟副本,该副本只返回 AMSI_RESULT_NOT_DETECTED。在右侧,或在移动设备上则在下方,是我修改后的补丁模板。
我通过添加一些无用的指令(例如 mov 和 NOP)来修改该方法,以更改补丁的内容。
0: 6800000000push0x0
5: c3 ret
0: ba 382c 30 a2 mov edx,0xa2302c38
5: 6a 00push0x0
7: 90 nop
8: c3 ret
结果: 重新编译并运行单元测试后,Windows Defender 未能检测到并阻止新的补丁。大获成功!在确保单元测试通过后,我将这些更改提交到我的仓库并推送到主分支。
实验 2:监控新补丁
在最初成功的实验之后,我感觉非常良好。我的最坏的担忧没有成真。这不会成为绊脚石。这个签名很容易被绕过。我觉得自己可以单独应对整个帝国!
当然,我们都知道 Dak 的结果……
但为了确保万无一失……我继续运行我的单元测试,以查看我的修复操作是否稳定。
几个小时后,我的 AMSI 绕过单元测试再次失败。新的补丁触发了 Windows Defender 的 AMSI 绕过签名。该死。
我对 Windows Defender 对我的缓解措施的迅速响应印象深刻。猫捉老鼠的游戏还在继续……
结论
这就是我上个周末所做的全部工作。以下是我从这两个实验中得出的结论:
-
Windows Defender 实现了用于补丁 AMSI.AmsiScanBuffer 的签名。 -
这些签名基于补丁的内容。有点像修改的黑名单。 -
Windows Defender 正在收集补丁事件的数据并生成新的签名。
前进方向
基于这两个实验,我认为我需要开发一个新的解决方案来修补 AMSI。鉴于微软实现的 AMSI.AmsiScanBuffer 中有相当数量的空间,我们有很多不同方式来混淆我的补丁代码的选项……但我们需要动态地进行,以便每次执行时使用不同的补丁,从而能够领先于 Windows Defender。这些补丁可能需要由有效载荷在运行时生成。如果我们将静态补丁嵌入到我们的有效载荷中,我认为我们将在第一次运行时获得执行,但几个小时后该有效载荷将被签名化。
这里没有概念验证,但任何 AMSI 绕过补丁的 shellcode 混淆应该是足够的,只要它适合分配给 AMSI.AmsiScanBuffer 函数的空间。
未来实验
我计划尝试的一些未来实验包括:
-
分阶段编写补丁,以便整个补丁不会一次性生效。 -
自动化补丁混淆。
原文始发于微信公众号(securitainment):混淆 API 补丁以绕过新的 Windows Defender 行为签名
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论