AMSI免杀绕过:追魂夺命
2023-5-9 08:12:35 Author: 奶牛安全(查看原文) 阅读量:21 收藏

反恶意软件扫描接口 (AMSI) 的开发旨在为在 Windows 环境中执行恶意脚本提供额外的安全层。AMSI 可以被不同的防病毒供应商使用,以便对基于脚本的攻击进行扫描操作。默认情况下,Windows Defender 依靠 AMSI 来阻止 PowerShell 脚本、JavaScriptVBA 宏。因为对脚本内容的扫描是基于特征的, 黑客可以轻松绕过此控制并执行他们的任意脚本,。

一旦获得初始访问权限,黑客的第一步就是绕过 AMSI,这样脚本就可以成功执行,并且不会向 EDR 发出警报。从威胁搜寻的角度来看,因为将创建某些指标, 有助于在网络攻击早期阶段就检测出攻击行为。

内存补丁

一种最流行的规避技术依赖于修补内存以返回标志AMSI_RESULT_CLEAN,这表明在 AMSI 扫描期间未发现任何检测。检查该技术在引擎盖下的工作原理,是使用以下十六进制操作码来修补 AmsiScanBuffer 函数的内存指令。

public class Amsi
{
    static byte[] x64 = new byte[] { 0xB80x570x000x070x800xC3 };
    static byte[] x86 = new byte[] { 0xB80x570x000x070x800xC20x180x00 };
 
    public static void Bypass()
    {
        if (is64Bit())
            PatchAmsi(x64);
        else
            PatchAmsi(x86);
    }

Add-Type $Win32

$LoadLibrary = [Win32]::LoadLibrary("am" + "si.dll")
$Address = [Win32]::GetProcAddress($LoadLibrary, "Amsi" + "Scan" + "Buffer")
$p = 0
[Win32]::VirtualProtect($Address, [uint32]5, 0x40, [ref]$p)
$Patch = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3)
[System.Runtime.InteropServices.Marshal]::Copy($Patch, 0, $Address, 6)

代码可以被严重混淆以绕过特征,但是十六进制操作码是静态的。使用YARA规则扫描PowerShell进程的内存,可以判断是否使用了这种AMSI绕过方法。以下规则是用来检测已应用补丁的 PowerShell 进程的内存区域。

rule MemoryPatchingAMSI : MemoryPatching
{
meta:
Author = "netbiosX"
Company = "pentestlaboratories.com"
threat_level = 3
in_the_wild = true

strings:
$a = "0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3"

condition:
$a
}

yara64.exe -s -r memory-patching.yara "PID"

F-Secure Countercept 公开发布了AMSIDetection,这是一个用 C# 开发的工具,试图检测 AMSI 绕过。该工具最初充当信标并等待 PowerShell 进程在系统上启动。定期对 amsi.dll 模块的只读代码部分执行比较散列。尝试通过内存修补绕过 AMSI 的结果将是该工具可以检测到的不同哈希值。

挂钩

AMSI 扫描依赖于两个函数 AmsiScanBuffer() 和 AmsiScanString() ,它们都是从 amsi.dll 文件导出的。黑客可能会尝试实施一种称为挂钩到 AmsiScanBuffer () 函数的方法,并使用假参数执行此函数。此技术需要将任意 DLL 注入到 PowerShell 进程中。Sysmon事件ID 7 可以检测加载到进程中的 DLL

使用PE-Sieve扫描 PowerShell 进程将识别 amsi.dll 上的钩子,并将包含挂钩的内存区域转储到磁盘上。

pe-sieve64.exe /pid 4172

使用 IDA 打开 DLL 并查找AmsiScanBuffer将确认该函数已被挂钩,因为主体包含跳转到外部模块。

检测挂钩的另一种方法是扫描进程内存,寻找与Moneta妥协的常见指标。未特征的 DLL 文件很可能是任意的,而且 Moneta 可以标志出代码已被修改的内存区域。

Moneta64.exe -m ioc -p 4764

注册表项修改

AMSI 提供者会在注册表中创建表项。每个 AMSI 提供者都有自己的表项,删除此表项将删除端点执行 AMSI 扫描操作的能力。与 Windows Defender 相关的表项如下:

HKLM:\SOFTWARE\Microsoft\AMSI\Providers\{2781761E-28E0-4109-99FE-B9D127C57AFE}

由于此绕过需要删除注册表项,因此 Sysmon 事件 ID 12 可以记录注册表项修改。可以将以下 Sysmon 规则合并到现有的 Sysmon 配置中,以检测此特定的 AMSI 绕过。

<Sysmon schemaversion="4.2">
 <EventFiltering>
  <RuleGroup name="AMSI Tampering" groupRelation="and">
  <RegistryEvent onmatch="include">
  <TargetObject name="T1562.001,Tamper-AMSI" condition="begin with">HKLM\SOFTWARE\Microsoft\AMSI\Providers\{2781761E-28E0-4109-99FE-B9D127C57AFE}</TargetObject>
  <Image name="Suspicious,ImageBeginWithBackslash" condition="end with">regedit.exe</Image>
  <Image name="Suspicious,ImageBeginWithBackslash" condition="end with">powershell.exe</Image>
  <Image name="Suspicious,ImageBeginWithBackslash" condition="end with">cmd.exe</Image>
  </RegistryEvent>  
  </RuleGroup>
 </EventFiltering>
</Sysmon>

Base64编码

攻击者可以通过执行混淆或 Base64 编码来击败有关 AMSI 的微软特征。微软有一个内置实用程序 ( logman ),可用于数据收集。从提权的命令提示符执行以下命令将开始跟踪 AMSI 相关数据。

Enable Logman
logman start trace AMSITrace -p Microsoft-Antimalware-Scan-Interface (Event1) -o amsi.etl -ets

Disable Logman
logman stop AMSITrace -ets

通过编码 AmsiUtilsamsiInitFailed运行 AMSI绕过 将逃避 AMSI 内容扫描。这可以通过运行已知的 Windows Defender 特征 amsiutils 来验证。

PowerShell命令“ Get-WinEvent ”可用于检索和显示捕获的事件跟踪日志。

Get-WinEvent -Path .\amsi.etl -Oldest | ? { $_.Id -eq 1101 } | % { [Text.Encoding]::Unicode.GetString($_.Properties[-3].Value) }

另外,Matt Graeber发布了一个 PowerShell 脚本 ( AMSIScriptContentRetrieval ),可用于使用 AMSI ETW 提供程序提取脚本内容。

.\AMSIScriptContentRetrieval.ps1

解码 Base64 字符串将显示与已知绕过方法相关的实际 AMSI 标志。

微软在 PowerShell 版本 5 中引入了一项功能,允许defender审核在 PowerShell 控制台中执行的任何命令或脚本。可以通过组策略启用此设置。

Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell\PowerShell Script Block Logging

当事件 ID 4104 捕获脚本块内容时,通过 PowerShell 执行的命令将被记录为可读格式,以帮助识别与 AMSI 绕过相关的活动。

强制错误

PowerShell 脚本块日志记录还可以将 AMSI 绕过的组件或完整的单行命令捕获到不同的日志中。

或者,Eric Conrad发布了一个 PowerShell 模块 ( DeepBlueCLI ),可用于通过 Windows 事件日志进行威胁搜寻。该脚本可用于直接查询 PowerShell 日志并发现任何任意命令,即使这些命令已被混淆或 base64 编码。通过解析输出来解码命令可以指示是否已执行 AMSI 绕过。

.\DeepBlue.ps1 C:\Windows\System32\winevt\Logs\Microsoft-Windows-PowerShell%4Operational.evtx

如果 DeepBlueCli 将包含一定百分比的符号和字母数字字符的命令分类为可疑命令,并且如果以字节为单位的大小很长,那么也可以检测到严重混淆的脚本。

由于此 AMSI 旁路中的混淆比例很大,因此通过使用 YARA 规则对这种技术的检测不能被认为是可靠的。然而,启用 PowerShell 脚本块日志并将这些事件转发到 SIEM 或通过 DeepBlueCLI 脚本扫描 PowerShell 日志可以提供更好的直观。


文章来源: http://mp.weixin.qq.com/s?__biz=MzU4NjY0NTExNA==&mid=2247489411&idx=1&sn=0847ec34ce2c277e8b20072f21ee2432&chksm=fdf97c96ca8ef580b09dcbd1bd22fa439e264ba934663073dfaa4bcab564f189b64f52e53f46#rd
如有侵权请联系:admin#unsafe.sh