Windows 开发了反恶意软件扫描接口 (AMSI) 标准,允许开发人员在其应用程序中集成恶意软件防御。AMSI 允许应用程序与系统上安装的任何防病毒软件进行交互,并防止基于脚本的动态恶意软件执行。我们将在本文中了解更多关于 AMSI、代码实现和一些众所周知的绕过方法。
背景
简而言之,它是微软提供的基于脚本的恶意软件扫描 API,可以集成到任何应用程序中,以扫描和检测用户输入的完整性,从而保护应用程序,从而保护消费者免受恶意软件的攻击。例如,一个消息应用程序可能会在将消息转发给接收者之前扫描带有 AMSI 的消息以查找恶意软件。
AMSI是独立于供应商的,并提供开放的 Win32 API 和 COM 接口供开发人员使用。由于 Microsoft 自己管理 AMSI,因此会自动更新最新的恶意软件签名。因此,开发人员可以很容易地集成 AMSI,以保护其消费者免受基于脚本的动态恶意软件的攻击。
AMSI 适用于基于签名的检测。这意味着对于每个特定的恶意关键字、URL、函数或过程,AMSI 在其数据库中都有一个相关的签名。因此,如果攻击者再次在他的代码中使用相同的关键字,AMSI 就会立即阻止执行。
恶意软件命名规则
在阅读有关 AMSI 工作原理的更多信息之前,让我们先了解一下恶意软件是如何命名的。在分析中,Windows 通常会检测到恶意软件,但分析人员无法确定恶意软件的确切细节和行为。计算机防病毒研究组织 (CARO) 给出了恶意软件的标准命名约定。例如,基于快捷方式的 caphaw 后门命名如下:
AMSI 工作原理
作为一名开发人员,你可以使用 AMSI 提供使用 AMSI 的恶意软件防御。假设你创建了一个应用程序,该应用程序输入一个脚本并使用像 Powershell 这样的脚本引擎执行。在进行输入时,可以调用 AMSI 以首先检查恶意软件。 Windows 提供 COM 和 Win32 API 来调用 AMSI。 AMSI 的执行流程如下:
AMSI API 是开放的,因此任何杀毒软件都可以从其函数中读取数据。此时,一个 Windows 脚本就会运行。当它通过 AMSI 时,amsi.dll 被注入到与我们程序相同的虚拟内存中。这个 amsi.dll 有各种可以评估代码的函数。但是,实际的扫描任务是由这两个函数执行的:
AmsiScanString() AmsiScanBuffer()
这些函数的作用是评估代码。如果代码是干净的,则结果最终会传递给杀毒软件提供程序类,然后使用 RPC 调用从那里传递给杀毒软件服务。如果代码可疑,则会被 AMSI 阻止。
AMSI 绕过方法
既然我们已经讨论了 AMSI 的基础知识,我们将讨论一些非常著名的绕过 AMSI 的技术。为了执行横向移动/特权升级的任意代码,渗透测试人员通常需要绕过 AMSI。
如要讨论所有绕过方法则超出了本文的范围,因为每天都有新方法出现。。本文将讨论其中最突出的几个,并在Windows 10 1809版本上进行了测试。值得注意的是,随着签名的不断更新,Windows的最新版本(超过1903年)几乎阻止了互联网上所有可用的方法。
注意:AMSI 会阻止某些关键字,如“invoke-mimikatz”或“amsiutils”,因为它们被广泛用于利用,因此,作为概念证明,我们将仅在绕过后运行这些命令。此处不会绕过实际的有效载荷。
Microsoft 已将 AMSI 集成在 powershell 终端(powershell.exe 应用程序)中,该终端接收输入并通过 Powershell 引擎对其进行解析。如果我们打开进程黑客并搜索 amsi.dll,我们会看到 amsi 正在 powershell 终端中运行,任何输入都会首先被扫描。
方法1:Powershell降级
如果你正在运行基于 powershell 的有效负载并且 AMSI 阻止了它,你可以将你的 powershell 版本降级到 2.0,因为 AMSI 仅在 2.0 之后的版本中受支持。首先,你可以看到我们的关键字被amsi屏蔽了。
让我们检查一下 PS 的当前版本,然后降级到版本 2 并再次运行这些被阻止的命令。
但正如你想象的那样,这里最大的缺点是许多现代函数或脚本无法在 Powershell 2.0 上运行。
方法2:混淆
混淆是指使代码变得复杂和不可读的技巧。AMSI 根据某些关键字检测签名,因此对这些关键字进行模糊处理是有效的。例如,让我们混淆 invoke-mimikatz 命令
如你所见,只需断开一个字符串并使用+运算符将它们连接起来,这样就可以绕过 AMSI。
然而,这种技术也有它自己的缺点。有效载荷可能会触发AMSI多次。在每次运行有效负载后,一直对关键字进行模糊处理实际上非常耗时,而且会产生噪音。因此,手动混淆一直对关键字进行模糊处理实际上非常耗时,而且会产生噪音最好。
RhytmStick 开发了这个工具“AmsiTrigger”,它可以针对 AMSI 扫描脚本/有效负载,并告诉我们哪些行会触发 AMSI,然后我们可以混淆它们!你可以在此处下载该工具。
现在,我们使用以下命令创建了一个名为 demo.ps1 的脚本
我想使用 AmsiTrigger 对照 AMSI 进行检查。具体过程如下:
现在,就可以知道AMSI 阻止执行的行。我们可以继续使用字符串连接方法对它们进行混淆,例如:
现在,它们可以运行并成功绕过 AMSI!
你也可以尝试 https://amsi.fail 来混淆你的代码。
方法 3:强制执行错误
Matt Graeber 在他的推文中谈到了绕过 AMSI 的方法。如果在上述场景中启动 AMSI 扫描,则存在一个名为 amsiInitFailed() 的函数,该函数将抛出 0。这种绕过基本上是为 amsiInitFailed 分配一个布尔 True 值,以便 AMSI 初始化失败,不会对当前进程进行任何扫描!代码如下:
这之后,许多人发布了相同方法的不同版本。在某些方法中使用字节码,在其他方法中,替换函数或替换字符串,但逻辑都相同。
方法4:内存劫持
Daniel Duggan 在他的博客中发布了关于可以绕过 AMSI 的内存劫持技术。其逻辑是挂钩函数 AmsiScanBuffer() 以便它始终返回句柄 AMSI_RESULT_CLEAN 指示 AMSI 是否发现恶意软件。可以使用 Rohitab 的 API 监控工具监控 API 响应。
首先,通过我们下载 Invoke-Mimikatz 脚本,查看 AMSI 是否正常工作。
为了减少将代码编译为 DLL 的麻烦,你可以查看我的 fork。下载后,确保将主包的名称从“AmsiScanBufferBypass”更改为“Project”或任何你喜欢的名称,因为 AMSI 也会阻止字符串“AmsiScanBufferBypass”!
下载之后,进入发布文件夹,看到一个名为ASBBypass.dll的DLL。请注意,由于我们现在有一个 DLL,它也可以与我们的 EXE 有效负载集成,并且会绕过 AMSI!
这样内联 C# 代码仅使用 powershell 终端激活补丁!
如你所见,amsi 现在已经被绕过了!
方法 5:内存劫持(混淆操作码)
在 Rasta Mouse (Daniel Duggan) 技术开始被检测到后,人们对代码进行了各种更改以使其再次 FUD。 Fatrodzianko 在他的博客中发布了一种这样的技术。他使用操作码混淆了相同的代码,可以查看脚本。
要运行脚本,只需下载它,重命名它(以避免 AMSI 检测关键字),然后像这样运行:
如你所见,我们现在已经成功绕过了 AMSI。
方法6:使用反射技术绕过AMSI
根据微软的说法,Reflection 提供了描述程序集、模块和类型的对象(Type 类型)。你可以使用反射来动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果你在代码中使用属性,反射可以让你访问它们。
Paul Laine 在contextis.com 上发布了原始的内存劫持方法。 Shantanu Khandelwal 使用Matt Graeber 的反射技术将相同的代码转换为完整的内存补丁。 Shantanu 使代码更加隐秘,因为现在没有留下任何磁盘上的绕过制品。
我们不会在本文中演示原始补丁,但反射更新可以下载。确保下载并重命名脚本并避免使用“amsibypass”等关键字,因为它们会被阻止。我已将其重命名为“am-bp-reflection.ps1”
方法7:Nishang All in One 脚本
Nikhil Mittal 在他著名的工具“Nishang”中添加了一个 AMSI 绕过脚本。该脚本结合了 6 种不同的方法来一次运行绕过 AMSI。具体如下:
unload——Matt Graeber 的方法。从当前 PowerShell 会话中卸载 AMSI。
unload2——Matt Graeber 的另一种方法。从当前 PowerShell 会话中卸载 AMSI。
unloadsilent——Matt Graeber 的另一种方法。卸载 AMSI 并避免 WMF5 自动记录。
unloadobfuscated——上面的“卸载”方法使用 Daneil Bohannon 的 Invoke-Obfuscation 进行了混淆,这就避免了 WMF5 自动记录。
dllhijack——Cornelis de Plaa 的方法。代码中使用的amsi.dll来自p0wnedshell。
psv2——如果 .net 2.0.50727 在 Windows 10 上可用。PowerShell v2 已启动,它不支持 AMSI。
我们只需下载脚本并运行,该工具将使用有效方法自动绕过 AMSI。例如,这里 WMF5 自动记录绕过已经奏效。此方法可以从当前终端卸载 AMSI 并绕过它。
从这里下载脚本并将其重命名为“nishang.ps1”并像这样运行它:
总结
在本文中,我们讨论了 AMSI的工作流程以及绕过它们的 7 种方法。需要注意的是,还有比本文介绍的更多的方法,但本文的目的只是讨论最广为人知的 7 种绕过 AMSI 的方法。
本文翻译自:https://www.hackingarticles.in/a-detailed-guide-on-amsi-bypass/如若转载,请注明原文地址