APT-C-60(伪猎者)是一伙以持续监控受影响用户、窃取相关信息为目的朝鲜半岛APT组织。我们于2018年发现该组织的活动,溯源分析最早的攻击活动可疑追溯到2014年。受影响用户大部分为涉韩的政府、经贸、文化有关的企事业单位,以及劳务咨询公司。
Observer Installer这类载荷的主要功能是下载文件,并通过CLSID来实现文件的持久化运行。这类载荷是攻击完成初始接入后第一个执行的载荷。JS downloader是这类载荷的javascript代码的实现,也是这类载荷使用量最多,使用时间最长的载荷。BMP downloader的载荷都导出模块名“Observer_Installer_pack.dll”,“Observer_Installer”指示它用于安装Observer,“pack”代表这类载荷由一个BMP文件释放而来,这也是这类载荷名称的由来。后两类文件则是Observer Installer在2023和2024主要使用的文件名(或模块导出名)。
“Observer”是从样本的pdb中提取出来的,从这个词的意思“观察者”也能反映出这类载荷的功能:作为攻击者的前锋马初步收集目标信息,并下载加载后续载荷。Observer收集的信息为攻击者是否投递后续载荷提供参考依据。Observer在我们的跟踪分析期间主要有以下五类文件名,一些基本的特征见下表。Observer内硬编码的一个浮点数。在回传信息时,程序会以一定格式带上这个浮点数。这个浮点数和pdb中暴露的版本信息对应,所以我们认为这个浮点数就是程序的版本号。Observer从2.0版本开始不再提供32位的文件。
文件名 | 编译时间区间 | 版本 |
scrobi.db | 2018.7.24 | |
comctlc.db+propsys.db | 2020.3.11 | 1.5 |
2020.9.28 | 1.7 | |
propsysctl.db | 2021.2.18-2021.5.25 | 1.8 |
2021.6.28-2022.3.10 | 1.9 | |
2022.4.12-2022.7.6 | 1.91 | |
2022.8.11 | 1.92 | |
crypt86.dat+profapii.dat | 2022.11.20-2023.2.3 | 2.0 |
2023.4.21-2023.11.28 | 2.1 | |
securebootuefi.dat | 2024.1.22-2024.9.26 |
收集信息作为当前载荷的核心功能,我们整理了不同版本载荷回传信息的格式。通过这些格式的变化来了解Observer版本的变迁。
文件名1:scrobi.db
Flag | konny |
收集信息格式 | ["Username"]["Hostname"]["SystemVersion"_"Arch"]["12位随机字母""Arch".bmp] |
信息加密方式 | AES |
回传数据格式 | User-Agent: myagent\r\nReferer: <"Flag"_"Count">"EncryptData"\r\n\r\n\r\n |
文件名2:comctlc.db+propsys.db
Stage:
S0:文件未下载或下载失败
S1:文件下载成功
S2:文件加载成功
版本 | 1.5,dwight |
收集信息格式 | ["Username"]["Hostname"]["SystemVersion"_"Arch"]["12位随机字母""Arch".bmp] |
信息加密方式 | AES |
回传数据格式 | User-Agent: myagent\r\nReferer: <O"Version"_"Stage"_"Flag"_"Count">"EncryptData"\r\n\r\n\r\n |
1.7,Ux-x | |
收集信息格式 | "Hostname">"Username">["SystemVersion"_"Arch"]["12位随机字母"] |
信息加密方式 | AES |
回传数据格式 | User-Agent: myagent\r\nReferer: O"Version">"Flag">"Stage">"EncryptData"\r\n\r\n\r\n |
文件名3:propsysctl.db
1.8, Ux-x; 1.9, Ux-x; 1.91, Ux-x; 1.92, 无 | |
收集信息格式 | "Hostname">"Username">["SystemVersion"_"Arch"]["12位随机字母"] |
信息加密方式 | AES |
回传数据格式 | User-Agent: myagent\r\nReferer:"Version">"Flag">"Stage">"EncrypteData"\r\n\r\n\r\n |
文件名4:crypt86.dat+profapii.dat
2.0,2.1 | |
收集信息格式 | hebei,"Username";"Hostname";"UserProfile" |
信息加密方式 | 自定义base64 |
回传数据格式 | UserAgent: EncryptData |
文件名5:securebootuefi.dat
信息加密方式 | 明文 |
回传数据格式 | Referer: LIVE>"收集文件信息次数","下载文件的次数"> "Hostname" / "Userprofile" / "校验和" |
Hostname和Username为当前机器的主机名和用户名,SystemVerion为系统版本,Arch为系统平台(32位还是64位),Version为当前载荷的版本,EncryptData为收集信息加密后的数据。
Backdoor Installer功能相对简单:下载文件;通过clsid设置下阶段载荷Backdoor的持久化,其功能与Observer Installer类似。我们统计了载荷在解密文件时使用的解密算法和key。
时间 | 解密算法 | 文件名 | Key | IV |
2018年 | CryptpoPP+AES128+CBC | install.bat | ed4196b8b25e126956e6d8abb4c73560 | c7ac7388709ae5fcc2f62a5c9dabc47c |
2021年 | WinCrypt+AES128+ECB | combases.db | C1648E81F23368E0221B41B324796937 | |
B0747C82C23359D1342B47A669796989 | ||||
759D8DA5D930D9A223F39EEFB417E758 | ||||
2022-2024年 | 自定义base64+xor | service.dat | AadDDRTaSPtyAG57er#$ad!lDKTOPLTEL78pE |
Backdoor类的载荷功能结构稳定,随着时间变化不大。Backdoor加载配置信息中插件路径中的文件,执行各种自定义功能。
并且回传更加详细的目标信息。
Boackdoor载荷支持的指令代码见下表。
命令字符串 | 功能 |
cd [path] | 设置新的工作目录 |
ddir | 遍历目录 |
ddel [path] | 删除文件或目录 |
ld [path] | 加载库文件,调用extension导出函数 |
attach [path] | 加载库文件 |
detach [path] | 卸载库文件 |
procspawn [path] | 创建子进程 |
proclist | 获取进程列表 |
prockill [pid]/[process name] | 关闭进程 |
diskinfo | 获取磁盘信息 |
download [path] | 从远程下载文件,保存为参数指定的路径 |
upload [path] | 上传指定文件或目录 |
screenupload | 上传屏幕截图 |
screenauto [interval] | 定期屏幕截图上传 |
turn on | 增加指令循环频率,2.5秒一次 |
turn off | 降低指令循环频率,5分钟一次 |
其它 | cmd /c [command] |
Backdoor载荷内部硬编码版本字符串,版本变化可能指示程序配置的改变。
编译时间 | 版本字符串 |
2017年 | none |
2020.2 | v0.2 |
2020.10 | v0.4 |
2021.6-8 | v1.0 |
2018.4-2022.1 | v1.1 |
2021.11-2022.2 | v3.0 |
2022.1 | v3.0.1 |
2023.5 | v3.1.3 |
2023.7-9 | v3.1.4 |
2023.9-2024.7 | v3.1.6 |
2024.7-9 | v3.1.7 |
Plugin载荷捕获的数量较少,从文件类型来看主要有两类:powershell和pe文件,从功能来看主要有键盘记录,文件收集和屏幕截图。
整个载荷框架中使用了多种多样的异或解密算法,其中包括解密字符串使用的异或位、异或3、异或3减1、异或索引长度、异或2减1和解密文件使用的异或key。
异或位是一种早期(2017年)使用的字符串解密算法。解密算法的Python实现如下图。
异或3、异或索引长度、异或2减1、异或3减1,这些解密算法相继出现,分布在载荷的各个阶段。解密算法的Python实现如下图。
这种解密算法是base64的一种变种,解密时先进行一层异或3的解密再使用Base64解码。这种算法多用于载荷解密和回传信息加密,随着Observer中的crypt86.dat载荷在2022年底出现的。解密算法的Python实现如下图。
框架中的多个载荷在下载文件时使用了BMP文件。这种方式能够规避一些杀软的检测逻辑,降低被拦截的风险,提高下载成功率。我们分析了这种载荷的格式,如下图所示。
从这种文件中提取载荷可以利用下面的Python代码实现。
这类标准解密算法包括RC4和AES,多用于回传信息加密和下载载荷解密。这类载荷在中前期(2024年前)的使用比较多。
前文提到的五类载荷囊括了攻击者在整个攻击流程中部署的载荷。这些载荷实现了信息探测,持久化驻留,远程控制等功能,帮助攻击者完成数据渗出,权限拓展等任务。伴随着攻击活动的持续进行,我们可以看到载荷的“版本”和功能也在更新。