反恶意软件扫描接口 (AMSI) 的开发旨在为在 Windows 环境中执行恶意脚本提供额外的安全层。AMSI 可以被不同的防病毒供应商使用,以便对基于脚本的攻击进行扫描操作。默认情况下,Windows Defender
依靠 AMSI
来阻止 PowerShell
脚本、JavaScript
和 VBA
宏。因为对脚本内容的扫描是基于特征的, 黑客可以轻松绕过此控制并执行他们的任意脚本,。
一旦获得初始访问权限,黑客的第一步就是绕过 AMSI
,这样脚本就可以成功执行,并且不会向 EDR
发出警报。从威胁搜寻的角度来看,因为将创建某些指标, 有助于在网络攻击早期阶段就检测出攻击行为。
一种最流行的规避技术依赖于修补内存以返回标志AMSI_RESULT_CLEAN
,这表明在 AMS
I 扫描期间未发现任何检测。检查该技术在引擎盖下的工作原理,是使用以下十六进制操作码来修补 AmsiScanBuffer
函数的内存指令。
public class Amsi
{
static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 };
static byte[] x86 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC2, 0x18, 0x00 };
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
并查找AmsiScanBuffe
r将确认该函数已被挂钩,因为主体包含跳转到外部模块。
检测挂钩的另一种方法是扫描进程内存,寻找与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
编码来击败有关 AMSI
的微软特征。微软有一个内置实用程序 ( logman
),可用于数据收集。从提权的命令提示符执行以下命令将开始跟踪 AMSI
相关数据。
Enable Logman
logman start trace AMSITrace -p Microsoft-Antimalware-Scan-Interface (Event1) -o amsi.etl -etsDisable Logman
logman stop AMSITrace -ets
通过编码 AmsiUtils
和amsiInitFailed
运行 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
日志可以提供更好的直观。