作者:K&XWS@知道创宇404高级威胁情报团队
原文链接:https://paper.seebug.org/3225/
1 情况概述
今年6月,知道创宇404高级威胁情报团队在分析过程中发现了几个APT组织的攻击样本,通过同源关联到其他的攻击木马,并对此展开了分析。根据近期国内外安全厂商发布的“伪猎者APT”组织的文章,对比确认为同一批通过WPS漏洞进行网络攻击的最终载荷木马[1][2]。
2023年8月至2024年7月,我们观察到Darkhotel的持续攻击活动,并使用了两套不同的攻击武器及技战术。攻击行业也早已脱离了Darkhotel名字代表的酒店行业。Darkhotel是有着东亚背景,针对企业高管、政府机构、国防工业、电子工业等重要机构实施网络间谍攻击活动的APT组织,其足迹遍布中国、朝鲜、日本、缅甸、俄罗斯等国家。2019年之后有关 Darkhotel 组织的行动在开源情报中的占比连年降低,同时国内厂商曝光了数个具有东北亚背景且技战术不同的攻击集合,我们认同这些攻击集合都是 Darkhotel 的子集,Darkhotel只是一个代表了该背景的攻击集合名字。
2 木马分析
2.1 样本攻击/释放链
2.2 样本功能综述
本次捕获的类型1向服务端请求下载一个文件,该文件解密后释放的载荷与类型2几乎一致。与类型2不同的是,类型1在下载阶段还额外下载了一个lnk文件,该lnk文件的主要功能是通过COM劫持以运行释放的载荷(实际类型1下载的文件是将类型2中的文件进行了合并)。相较于类型2,类型3样本在文件解密后释放了两个载荷。根据类型3中PDB路径信息,将其记为Observer
,接下来将就各类型样本进行描述。
2.2.1 类型1 分析描述
类型1样本为dll文件,该dll存在一个名为mydllmain
的导出函数。
该DLL文件中的大部分字符使用了攻击者自定义的加密算法处理,该算法自2023年起一直被使用至今,解密算法逻辑为异或3再解base64:
滥用合法的windows的照片库查看器组件shimgvw.dll,通过其中的函数ImageView_Fullscreen
,从远程服务器上下载文件zetaq.txt:
从%userprofile%\AppData\Local\Microsoft\Windows\INetCache\IE
中遍历查找文件名为zetaq的文件,并从其中解密出后续文件:
文件的解密及释放流程如下:
从偏移2开始读取24个字节数据并解密,该数据表示包含的文件数。
继续读取24个字节数据并解密,该数据表示文件总大小。
继续读取24个字节数据并解密,该数据表示文件加密后大小。
继续读取24个字节数据并解密,该数据表示文件解密后大小。
如果包含的文件数大于1时,则循环解密并释放对应文件。
最终zetaq解密出2个文件,分别为SecureBootUEFI.da
和regit.lnk
,将regit.lnk
设置名为PCATaskServices
的计划任务,滥用合法系统程序pcalua.exe执行该文件。
LNK参数解析后如下:
regit.lnk的主要功能是将之前释放的文件SecureBootUEFI.da重命名为SecureBootUEFI.dat,并劫持系统COM组件F82B4EF1-93A9-4DDE-8015-F7950A1A6E31
,利用该COM组件执行SecureBootUEFI.dat。
2.2.1.1 SecureBootUEFI.dat分析描述
SecureBootUEFI.dat的主要功能有两个:
文件夹遍历:从服务端获取需要需要检索的文件夹路径,并将获取的文件信息拼接后作为UA回传到服务端。
组件下载并加载执行:从服务端下载后续载荷并加载运行。
在SecureBootUEFI.dat中字符串的加解密算法变为异或3。
获取主机名和用户名,后续将获取的数据拼接后异或加密作为首次通信url的一部分:
解密出两个通信C2,其中一个C2用于从服务端获取数据并执行,一个用于数据的上传(用户信息及文件夹遍历结果),为方便后续描述,分别命名为server1和server2:
server1:hxxps://bitbucket.org/whekacjj/whekacjj/downloads/
server2:hxxps://c.statcounter.com/12959673/0/7901c79c/1/
文件夹遍历时通信的url格式如下:
Server1 + xor3([pc_name][username])_[finddir_count].A
向服务端1发送请求后,服务端1返回的数据为需要遍历的文件夹,获取到的文件夹信息使用[ ]
进行包裹后用,
进行拼接,最终所有的数据拼接搭配到Referer:
后,并上传到服务端。
无论是否获取到服务端下发的文件夹数据,每通信一次则全局变量finddir_count加1:
组件下载功能的通信url格式如下:
server1 + xor3([pc_name][username])_[download_count].B
文件下载后被存储到%Userprofile%\AppData\Local\Microsoft\Windows\Shell\Sample.tmp
,将Sample.tmp复制到%Userprofile%\AppData\Local\Microsoft\Windows\Shell\Service.dat
并加载运行:
服务端返回的数据使用g73qrc4dwx8jt9qmhi4s
作为key进行异或解密,而非样本中的异或3算法:
当上述两个功能相关的通信完成后,样本还会向服务端发送当前受控主机的状态,包含当前文件夹遍历count、组件下载count、主机名、%userprofile%和加密后的主机名和用户名。
当上述流程完成后进入1小时的sleep,攻击者利用这种长休眠机制不仅能够在一定程度上躲避流量设备的检测,而且可以让攻击者有足够的时间针对指定用户下发组件:
后续则循环上述通信步骤。
2.2.2 类型2 分析描述
类型2与类型1在功能上几乎是一致的,以下仅有区别的部分进行描述:
区别1:lnk文件通过下载而非文件解密后释放。
区别2:计划任务名为
GoogleRegisterTask
和CLSUpdateService
。
2.2.3 类型3 分析描述
类型3中初始dll中字符串为明文状态:
滥用合法的windows的照片库查看器组件shimgvw.dll,通过其中的函数ImageView_Fullscreen
,从远程服务器上下载文件eqlist.txt和mylink.tmp:
其中eqlist.txt使用类型1中相同的解密步骤解密并释放出%appdata%\\Microsoft\\Crypto\\crypt86.da
和%localappdata%\\Microsoft\\Proofs\\profapii.da
:
mylink.tmp下载后存储为%temp%\\mylink.lnk
,lnk文件的功能是将之前释放的文件crypt86.da和profapii.da分别重命名为crypt86.dat和profapii.dat,并劫持系统COM组件0b91a74b-ad7c-4a9d-b563-29eef9167172
,利用该COM组件执行crypt86.dat:
2.2.3.1 crypt86.dat分析描述
crypt86.dat的主要功能是下载数据并使用profapii.dat解密执行后续功能。
攻击者将多个下载地址解密后进行配置,可根据需要选择对应的地址使用。
获取受害者主机名称和用户名等信息,并与字符串hebei进行拼接,格式如下:hebei,%username%;%pc_name%;%userprofile%
。
拼接的字符串使用异或3+base64编码后将其作为UA发送到下载地址(hxxp://82.xxx/cache):
接收从下载地址返回的7个字节数据,并且返回的数据以ref
作为起始字符,从中提取出后续请求的文件名,该文件名与下载地址进行拼接后组成完整的请求链接,例如:hxxp://82.xx/list/2.cab, 请求的UA依然是前面拼接加密的数据:
如果获取数据成功,解密后其中的数据使用,
进行分割,分割后的第一个数据为后续需要加载的组件名,第二个数据为组件中的导出函数,最后的数据为传入组件的参数。
若上面的数据请求失败且次数达到10次后则直接向另外一个地址发起请求,同样这个请求地址有多个(均使用公共服务平台bitbucket.org
),该请求返回的数据使用相同的解密及分割方式进行解析:
由于分析时已无数据返回,暂时无法明确后续数据内容,但从以往该组织的攻击活动来看,后续返回的组件名为同文件释放的profapii.dat,导出函数为profapii.dat的导出函数mscuicrypt,关于profapii.dat的功能见下一章节分析。
2.2.3.2 profapii.dat分析描述
profapii.dat中包含名为mscuicrypt
的导出函数,该函数的主要功能是解密传入的参数并根据参数中的数据完成后续功能:
传入的参数以H
进行分割,解密后完成指定功能,包括:
从参数中,解密出一个远程地址和一个本地路径,从远程地址下载文件,并进行解密后,保存在本地路径下。
从参数中,解密出一个本地路径,并加载执行。
从参数中,解密出一个远程路径和一个本地路径。对本地路径下的文件进行遍历,获取所有文件名,拼接上特殊的字符后,进行加密,并设置为UA字符串,连接远程路径。
其中目录遍历时,将获取的数据利用[ ]
进行拼接:
数据加密后拼接上固定字符并将其作为UA回传至指定服务端。
2.2.4 关联分析
本次捕获的3种类型的样本与以往曝光的伪猎者组织攻击样本几乎一致,具体如下:
下载释放的组件名相同,例如类型3种的crypt86.dat和profapii.dat;
利用lnk进行COM劫持;
利用公共服务平台
bitbucket.org
分发指令。
此外,类型1和类型2中的主要功能组件SecureBootUEFI.dat,其功能与类型3中crypt86.dat和profapii.dat的逻辑上是一致的。
从初始编译时间来看,类型1是最新的,大胆推测攻击者可能根据实际攻击情况正在进行载荷方面的调整。
类型 | 编译时间 |
---|---|
3 | 2023-11-16 06:51:36 |
2 | 2024-02-05 20:48:49 |
2 | 2024-02-01 17:50:24 |
1 | 2024-05-31 05:44:14 |
同时我们还注意到本次捕获的类型3中的样本包含PDB路径C:\Users\WINUSER\Desktop\SCV\1. Observer\230206_observer_v2.1\observer_v2.0_dll1\observer_v2.0_dll1\x64\Release\observer_v2.0_dll1.pdb
在2023年捕获的该组织的样本中发现类似结构的PDB路径,我们猜测相关工具在其内部代号或为Observer
:
截止分析时,我们发现类型1样本通信使用的C2依然存活,并存在3个文件,这些文件中的内容既是攻击者需要遍历的文件夹信息:
可见攻击者可能依然对部分受害主机保持着通信。
3 IOC
HASH
8620a8a3f75b8b63766bd0f489f33d6a
dd2f326bac70baca94eb655bdfae175d
445a84e3216da14b73dbe52aeb63e710
030a68e321dec0e77b4698fccc5d54db
dd2f326bac70baca94eb655bdfae175d
18fdde4bf8d3a369514b0bc8ddcf35dc
ccf49ea51585ae38fb510b0fa52aec08
7e20f52d4e7074663d9f9a252b59a2d6