前言
此类型样本并非首次曝光,但是它涉及技术手法较为丰富且体系化,涉及”jsp、net、C++“三种类型的shellcode。如果你没有木马样本分析经验,也可以简单了解一下钓鱼邮件附件执行后有哪些恶意操作。如果正在学习木马样本分析,可以照着文章调试一遍,我会在一些关键步骤做解释说明,相信会有收获。
背景
在2023年初至今,东南亚区域的中文黑灰产圈通过微信QQ等即时通信工具、邮件以及伪造工具网站的方式大肆对境内金融、教育、电商、货运、设计等各行各业进行钓鱼攻击,其主要目的为攻击相关公司的财务或信息人员,进行诈骗活动窃取目标资金或获取其他信息数据。
此篇文章记录了目标组织主要的钓鱼手法之一。
样本基本信息
在相关人员邮箱中发现一份带诱导性描述的邮件,其附件信息如下。
HASH
SHA256:
2edc73c7d2f05fe9ccc078b3456cb1fdfb25e1d7d042b027a038d2a67c1d5a46
MD5:
d0d11b0cef237ca7db83d2de86d6ca7d
SHA1:
2297c9b2004d3ce994bfdaa201f0b678b02925b1
文件类型:
MS Windows HtmlHelp Data(.chm)
执行流程
样本分析
1 初始恶意附件“.CHM”文件
“.chm”文件常常被各个黑客组织或个人作为邮件附件,广泛利用于钓鱼攻击中。用解压缩软件打开即可,解压如下。
“test.html”文件包含可疑代码(大段的密文,一般是待解密的shellcode,正常工作邮件不会发这样的附件)。
“.chm”文件是什么?—-“.chm”文件是“Compiled HTML Help”的缩写,是一种Windows平台帮助文档的文件格式。具体来说是一组编译打包好的 HTML 页面、图像或其他资源,可以用解压软件打开。
“.chm”文件是如何被黑客利用的?—-“.chm”文件支持脚本语言JavaScript和VBScript,攻击者可以在脚本中构造外恶意资源下载和执行、计划任务、开机启动项、痕迹清理等恶意功能。
1.1 “test.html”静态分析
函数”Base64ToStream”功能为将Base64编码的数据转换为字节流。
定义了三段密文字符串和其长度,即待解密的shellcode。
随后初始化一个WScript.Shell对象,用于操作Windows Shell。通过shell读取注册表中的.NET Framework版本号(可以联想到密文可能会解密出“.net”的shellcode),如果读取失败则将stage_3赋给stage_1,并将版本号设置为v2.0.50727。
随后将进程环境变量COMPLUS_Version设置为.NET Framework版本号。随后调用函数“Base64ToStream”尝试将stage_1(经过Base64编码的二进制数据)反序列化为对象,若出现异常则对stage_2做相同操作。
我刚开始没有找到执行的位置,看了些资料才知道BinaryFormatter的Deserialize函数进行反序列化时,其中包含的代码将在系统中执行,反序列化为对象的过程中,恶意代码已经执行了。
接下来就需要动态调试查看明文的shellcode有什么功能了。
1.2 “test.html”动态调试
1.2.1 stage_1解密
复写其转码和反序列化程序(代码在后面),将恶意代码输出为hex流,用winhex打开查看。
将ascll码部分取出格式化,这一部分就是“stage_1”的明文信息了。功能大致是关闭“DisableActivitySurrogateSelectorTypeCheck”类型检查以绕过高版本框架对ActivitySurrogateSelector类的滥用。
(function task() {
function base64ToArrayBuffer(base64) {
const binaryString = window.atob(base64);
const len = binaryString.length;
const bytes = new Uint8Array(len);
for (let i = 0; i < len; ++i) {
bytes[i] = binaryString.charCodeAt(i);
}
return bytes.buffer;
}
//过长没有完全展示
var stage_1 = "AAEAAAD/////AQAAAAAAAAAMAgAAAF5NaWNyb3NvZnQuUG93ZXJTaGVsbC5FZGl0b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHpc3U";
var stage_1_size = 2341;
// 解码 Base64 字符串为 ArrayBuffer
var stage1ArrayBuffer = base64ToArrayBuffer(stage_1);
// 将 ArrayBuffer 转换为十六进制字符串
var hexString = Array.from(new Uint8Array(stage1ArrayBuffer))
.map(byte => byte.toString(16).padStart(2, '0'))
.join(' ');
// 输出十六进制字符串
console.log(hexString);
})();
这段调试有点折磨到我,按一般经验用IE浏览器控制台就可以,但它调用的一些控件貌似浏览器不支持,最后实在不行,就复写了它的调试代码如上,把调试结果按hex流输出
1.2.1 stage_2解密
用相同方法调试出stage_2(stage_2与stage_3貌似没什么区别)。
看着没什么头绪,但发现在stage_2中包含有一个PE文件,以“4D5A”为起始重新保存一个文件。
保存后查看其文件信息,一个“.NET(v4.0.30319)”的dll模块,但我在反序列化出的二进制流中,没有看明白dll是怎么调用的。接下来就分析这个模块。
在stage2中,可以看到其存在PDB路径“2023-TianMa~\\TMAir_Ghost10.0_dev_vs2022标记v4.2.0\\CHM\\KH\\TestAssembly\\obj\\Release\\TestAssembly.pdb”,表明其该攻击者使用的后续载荷为Ghost10.0版本修改的变种,且名称为TianMa。
2 “.NET”恶意模块分析
2.1 “.NET”模块静态分析
“.net”的程序用工具“dnSpy”分析,相比”CC++“恶意程序的逆向分析,”.net“程序几乎是源码,看起来比较简单。使用“dnSpy”打开在明文stage_2中还原的二进制文件做静态分析。
包括两个功能模块”shellcode“和”TestAssembly“。
在”TestAssembly“中,首先定义了一个字典keyValuePairs,在”cuserssearches“下生成一个随机字符的文件。随后拼接”https://muchengoss.oss-cn-hongkong.aliyuncs.com/“和目标文件“svchost.exe”,“libcef.dll”,“libcef.png”,“decod.exe”,“cache.dat”放入字典中。
随后调用Shellcode类中的Load2方法加载shellcode。
load2方法判断操作系统版本,然后根据版本加载不同的shellcode。
x86架构shellcode长度62464字节。
x64架构shellcode长度99840字节。
2.2 “.NET”模块中的shellcode定位
我分析64位的shellcode。在dnspy中貌似不好定位,可以在winhex中全局搜索字符流。下图是x64架构shellcode定义部分,字符”77906982“,对应着hex流”4D 5A 45 52“,x64和x86的shellcode在第10个字节处开始不一样(见前两张图)。下图则是在winhex中定位shellcode。
去除前边的的hex流重新保存位文件,这样就获取了x64的shellcode,基本信息如下,是一个c++程序。
2.3 x64″C++”模块shellcode分析
搞了好一会儿发现这个东西还不能分开调试,它要完整的执行最初的”.chm“文件,然后再执行至c++的shellcode模块。因为有一部分参数比如文件路径,是在内存中生成和传递的。
这一块”c++“的shellocde程序实际上是下载器。
shellcode请求之前在”.net“模块中拼接的路径,下载后续恶意资源。
在本地%temp%路径创建的当前进程PID号多次重复,作为文件夹名称,在此写入要下载的url路径与文件名。
获取当前进程PID。
拼接路径,创建文件夹。
%temp%/397239723972397239723972397239723972_b
%temp%/397239723972397239723972397239723972
在此路径接收下载的另外5个样本文件。
名称 |
功能 |
cache.dat |
加密的的7z压缩包 |
decod.exe |
7zip压缩工具 |
libcef.dll |
aplib压缩数据,stage2或stage3会进行解压缩 |
libcef.png |
加密载荷,需要解压缩后的libcef.dll解密并调用,加密的Tianma远控(基于Ghost改造) |
libcef.exe/svchost.exe |
公开可信libcef工具,会加载lbcef.dll加载文件 |
最终通过分析解密的libcef.png文件为上述提到的TianMa远控,该远控拥有Ghost远控所拥有的的功能,包括但不限于键盘记录、文件浏览、命令执行、浏览器信息窃取等功能。
IOC
MD5
a0a49aa714d01c8e4249a58b70edf3c0
5a0e22748b83e10fbb1bc79725b01428
7e8fd3d8bc887455b76cbdfc338eed4e
3327b42f2c9aa4a98200ccdc4f781837
0792a18e287f2658d7f08dbf1a3b46bc
URL
https://muchengoss.oss-cn-hongkong.aliyuncs.com/TG.exe
https://muchengoss.oss-cn-hongkong.aliyuncs.com/cache.dat
https://muchengoss.oss-cn-hongkong.aliyuncs.com/decod.exe
https://muchengoss.oss-cn-hongkong.aliyuncs.com/libcef.dll
https://muchengoss.oss-cn-hongkong.aliyuncs.com/libcef.png
文章有点太长了,其实钓鱼邮件部分的功能就结束了,具体远控木马功能后续再写。
原文始发于微信公众号(帅仔回忆录):11月黑产组织银狐向财务关联人员投递.chm诱饵文件