Kimsuky 是谁?
Kimsuky APT 是一个驻扎在朝鲜的网络间谍组织,至少从 2012 年开始运作。最初,该组织的目标是韩国政府实体、智库以及各个领域的专家个人。
追踪对象:APT43、Black Banshee、Velvet Chollima、THALLIUM、ARCHIPELAGO 和 Emerald Sleet
目标和目的:该组织主要针对韩国、日本和美国,重点关注国防、教育、能源、政府、医疗保健和智库等领域。其主要目标是收集情报。
策略和工具:Kimsuky 采用多种策略,包括社会工程、鱼叉式网络钓鱼电子邮件和水坑攻击。他们为各种操作开发了独特的恶意软件。
什么是TrollAgent Stealer?
Kimsuky 于 2024 年 1 月开始针对韩国的重要目标发起攻击。到 1 月 24 日,我们发现许多样本的编译时间可以追溯到 2023 年 12 月。基于这些和其他工件,我们在 Dark Atlas 的团队开始努力追踪这些攻击并调查所使用的工具。
除了我们的分析之外,我们还发现 TA 已使用“SGA Solutions CO., Ltd.”和“D2innovation CO., LTD.”的数字签名注册了他们的安装程序。这是攻击的初始阶段,安装程序用于交付和部署恶意软件的另一个阶段。
它会投放一个名为 TrollAgent 的窃取程序,这是一个用 GoLang 编写并使用 VMProtect3 保护的 DLL 文件。此外,它还会投放一个批处理文件,以便在投放 DLL 时删除初始安装程序。还会投放一个名为“NXTPKIENTS.exe”的可执行文件,它是 SGA 包安装程序的主文件。
然后,它将一个名为 TrollAgent DLL 中导出函数的文件写入 ProgramData 路径。DLL 稍后会使用此文件来检查执行方法。
攻击链概述
图 1-TrollAgent 攻击链
技术分析
我们调查了 Kimsuky 使用的一个活动样本,其哈希值为“2e0ffaab995f22b7684052e53b8c64b9283b5e81503b88664785fe6d6569a55e”,并且具有来自“D2innovation CO., LTD.”的数字签名。
图 2-数字签名
\[4\].tmp.bat这个 exe 文件会释放TEMP 目录中的一个名为
图 3-创建的 TEMP 文件
图 4-删除主安装程序的 Bat 文件
此批处理脚本旨在反复尝试删除主安装程序,直到成功删除为止。删除目标文件后,脚本将继续从系统中删除自身,以确保不留下任何残留文件。此过程可确保完全删除指定的文件并清理执行期间创建的任何临时文件。
然后,它会在C:\Users\\\AppData\Roaming\Media下释放另一个 名为 win-[6].db的 PE 文件
图5-释放的db文件
然后,它将主安装程序(NXTPKIE.exe)放在此过程的同一目录中。
图5-释放的db文件
在 ProgramData 路径中,它会释放另一个文件,其名称与 DLL 导出函数相同。DLL 稍后会使用此文件检查执行方法。如果该文件存在,则表明 DLL 是由主安装程序执行的,而不是由沙箱或分析师执行的。
图6-被释放的配置文件
然后,它创建一个进程来启动 DLL 文件,并调用 DLL 内要执行的特定导出函数。
图 7-创建流程
TrollAgent 窃取程序(DLL 分析)
DLL 文件使用 VMprotect 进行保护。由于其反调试技术和代码虚拟化,这种保护的解包非常困难,因此很难解包。但是,我们的团队通过将调试器附加到先前创建的进程,编辑创建标志以将其设置为挂起模式,然后再次附加调试器,成功解包了样本。由于控制流平坦化和混淆,很难找到代码的入口点。尽管如此,我们还是设法从这个 DLL 文件中获取了一个解包样本。这个 DLL 是使用 Golang 编写的,名为 TrollAgent。
图 8-TrollAgent DLL
反分析技术
该恶意软件的主函数调用了一个名为main_anti的函数。首先,它使用schtasks删除了一个名为“ChromeUpdateTaskMachineUAC”的计划任务。
图 9-删除计划任务
它会检查配置文件,如果基于 DLL 本身的“hai.a”或“oni.a”不存在,它就会停止进程并删除自身。
图 10-反分析检查
然后它创建一个名为“ chrome development kit 1.0 ”的互斥锁
图 11-互斥创建
构建窃取者配置
接下来,它深入研究root_go_s_troll_agent_config_Init 负责配置初始化的函数;它将版本设置为“ gt@2.0 ”,它还获取 Mac 地址,然后对其进行哈希处理或为 Mac 地址生成 UID
图 12-将版本设置为 gt@2.0
图 13-获取 Mac 地址
然后,它设置用于与 TA 通信的 C&C 服务器;它为此使用了两个 URL
图 14-命令和控制服务器
然后它启动与 C2 的连接,并将请求标记为“ init ”,这与初始化配置有关;然后它检查响应是否为“ ok ”
图 15 – 向 C2 发送初始化数据
然后它调用两个函数,这表明了该窃取程序的核心功能:
根目录下有一个 .go_s_troll_agent_cmd___CmdGt2__doInfo 目录,根目录下有一个 .go_s_troll_agent_cmd___CmdGt2__doWork 目录
图16-主要功能
C2 连接
然后,它创建一个 org 文件,该文件包含有关受害者的收集数据,如 MAC 地址、版本、使用的 URL 以及一些额外信息,这些数据经过 RSA 加密,然后发送到 C2,然后删除此文件。
图 17-在 .tmp 路径下创建 org 文件
图 18-使用 RSA 加密文件
然后使用root_go_s_troll_agent_npww___Client__FileUP 函数将此文件发送到 C2
图 19-向 C2 发送加密数据
窃取功能
接下来,恶意软件将开始收集受害者的数据。它可以收集 SSH 会话和 FileZilla,还可以从机器中窃取便签。
图 20- SSH 和 FileZilla 会话收集
构建完整的文件路径后,它使用名为io_ioutil_ReadDir的函数来读取此文件,该函数与root_go_s_troll_agent_cmd___CmdGt2__getYes 函数 包装在一起。
图 21-读取文件
然后它执行一个收集一些信息的命令。
图22-执行的命令
命令解析
| 命令 | 描述 | 输出 |
| -------------------------------------------------------------- | -------------------------------------------------- | ----------------------------------------------------------- |
| systeminfo | 收集详细的系统信息 | 操作系统版本,硬件规格,主机名,域信息 |
| query user | 提供特定用户账户的详细信息 | 用户名,权限,账户状态 |
| net user | 列出本地用户账户 | 用户名,组,账户状态 |
| powershell Get-CimInstance -Namespace root/SecurityCenter2 -Classname AntivirusProduct | 查询杀毒软件状态(需要 PowerShell) | 杀毒软件名称,状态,配置 |
| wmic qfe | 列出已安装的修补程序(更新) | 修补程序ID,安装日期 |
| wmic startup get | 显示配置为启动时运行的程序 | 程序名称,位置 |
| wmic process get Caption, CommandLine | 列出正在运行的进程及其详细信息 | 进程名称,命令行参数 |
| tasklist | 提供正在运行的进程的简化视图 | 进程名称,PID(进程标识符) |
| ipconfig /all | 显示详细的网络适配器信息 | IP地址,子网掩码,网关,DNS服务器 |
| arp -a | 显示ARP缓存(IP到MAC地址映射) | IP地址,相应的MAC地址 |
| route print | 列出网络流量的路由表 | 目标网络,网关,度量 |
| dir “%programfiles%” | 列出“Program Files”目录的内容 | 已安装的程序文件和文件夹 |
| dir “%programfiles% (x86)” | 列出“Program Files (x86)”(32位程序)目录的内容 | 已安装的程序文件和文件夹 |
| dir “%programdata%\Microsoft\Windows\Start Menu\Programs” | 列出开始菜单“程序”文件夹的内容 | 已安装的应用程序快捷方式 |
| dir “%appdata%\Microsoft\Windows\Recent” | 显示最近访问的文件和应用程序 | 最近使用的文件列表 |
| dir /s “%userprofile%\desktop” | 列出用户桌面上的所有文件和子文件夹 | 桌面的完整目录列表 |
| dir /s “%userprofile%\downloads” | 列出用户下载文件夹中的所有文件和子文件夹 | 下载文件夹的完整目录列表 |
| dir /s “%userprofile%\documents” | 列出用户文档中的所有文件和子文件夹 | 文档文件夹的完整目录列表
现在,收集完上述数据后,对每种数据类型进行压缩,然后使用 RSA 密钥进行加密,然后将其发送到 C2。它使用名为 root_go_i_gapi_ZipTo 的函数来压缩文件。
图 23-数据压缩
加密文件名及其用途表
| 加密文件名 | 目的 |
| ----------------------- | ---------------------------------------------- |
| gcfg@[timestamp].gte1 | 捕获软件配置数据 |
| tcd@[timestamp].gte1 | 记录C盘内未知目录或文件的日志数据 |
| tfd@[timestamp].gte1 | 存储FileZilla目录信息 |
| tsd@[timestamp].gte1 | 记录SSH目录详情 |
| tnd@[timestamp].gte1 | 收集Sticky Notes目录中的数据 |
| tbd@[timestamp].gte1 | 保存与浏览器相关的信息 |
| ccmd@[timestamp].gte1 | 通过cmd收集数据 |
图24-加密文件名
收集浏览器数据
TrollAgent 可以像其他窃取者一样收集广泛的浏览器数据,其功能被定义为收集信用卡信息、cookie、浏览历史记录和自动登录凭据,它为每种浏览器类型提供专用功能,例如处理所有浏览器的功能chrome 浏览器和另一款 Firefox 浏览器。
在 root_go_s_troll_agent_cmd___CmdGt2__procBrowser 内部有一个对 root_go_s_troll_agent_internal_browser_PickBrowser 的调用,该函数包装了对负责抓取和收集数据的函数的调用,处理 chromium 内容的函数称为 root_go_s_troll_agent_internal_browser_pickChromium。负责Firefox的函数称为root_go_s_troll_agent_internal_browser_pickFirefox
图25-收集浏览器数据的函数
初始化文件路径和收集的数据类型的函数称为 root_go_s_troll_agent_internal_browser_init,它包含 Chrome、Edge、Firefox、Brave、Yandex、OperaX 和许多其他浏览器的所有浏览器配置。
图 26-浏览器文件配置
TrollAgent 为每个浏览器都有多个代码块来处理集合部分。每种数据类型都有专用的功能,例如一种用于检索密码,另一种用于解析信用卡。这种区分是必要的,因为每个浏览器的数据库结构都不同,导致跨浏览器执行的 SQLite 查询存在差异。让我们对此进行概述。
浏览器
对于Yandex来说,它有一个解析密码的函数和另一个解析信用卡的函数。
数据库类型为Sqlite3:
图 27- Yandex 密码数据库
为了解析数据库,它会执行 SQLite 查询
图 28-密码解析 SQL 查询
卸载和配置删除
将所有数据发送到 C2 后,TrollAgent 会清除其配置并自行卸载。
图 29 – 清除配置
在 main-uninstall 函数中,它执行与 main_anti 函数中相同的操作,删除名为“ChromeUpdateTaskMachineUAC”的计划任务
图 30 – 任务删除
MITRE ATT&CK
战术 | 技术 | MITRE ATT&CK ID | 描述(针对TrollAgent)
-------------------|------------------------------------------------|-----------------|----------------------------------------------
执行 | Windows命令行解释器: Windows命令行解释器 | T1059.003 | Kimsuky投放PowerShell(PS)和批处理(BAT)文件,可能在受感染的计算机上执行任务
防御逃避 | 模糊文件或信息: 软件打包 | T1027.002 | TrollAgent DLL使用VMProtect3保护,这是一种混淆代码以阻碍分析的打包工具
系统二进制代理执行 | Rundll32 | T1218.011 | Kimsuky滥用rundll32.exe,一个合法的Windows程序,来执行恶意的TrollAgent DLL
伪装 | T1036 | - | Kimsuky在用户目录内创建文件
指示器清除: 文件删除 | T1070.004 | - | Kimsuky检查初始感染阶段投放的文件。如果文件不存在,它将终止自身并删除自己的文件以避免被检测到。
凭证访问: 凭据库 | 凭证来自Web浏览器 | T1555.003 | Kimsuky目标是浏览器数据库,收集用户存储的用户名和密码
窃取Web会话Cookie | T1539 | - | Kimsuky从Web浏览器中窃取Cookie,以维护或劫持活跃会话
发现系统信息 | T1082 | - | Kimsuky使用命令如:systeminfo、hotfixes来收集受感染机器的信息
进程发现 | T1057 | - | Kimsuky使用tasklist和wmic process get Capture, CommandLine命令来收集系统上运行的进程
账户发现: 本地账户 | T1087.001 | - | Kimsuky使用net user命令查找系统上的账户
网络信息收集 | T1016 | - | Kimsuky使用ipconfig/all、arp -a和route print来收集网络配置信息
文件和目录发现 | T1083 | - | Kimsuky使用命令如:dir "%programdata%\Microsoft\Windows\Start Menu\Programs"和dir /s "%userprofile%\desktop"来枚举受感染系统上的所有文件和目录
软件发现: 安全软件发现 | T1518.001 | - | Kimsuky检查杀毒软件的存在与否,使用powershell Get-CimInstance -Namespace root/securityCenter2 – classname antivirusproduct
收集 | 来自本地系统的数据 | T1005 | Kimsuky可能会收集存储在受感染系统上的SSH密钥和FileZilla FTP会话
屏幕截图 | T1113 | - | Kimsuky使用kbinani/screenshotGo库对受害者机器进行屏幕截图
命令与控制: 应用层协议 | Web协议 | T1071.001 | Kimsuky使用HTTP GET和POST请求进行C2(命令与控制)
外传 | C2通道上的外传 | T1041 | Kimsuky通过其C2通道外传数据
威胁指标
指标 | 类型 | 描述
--------------------------|------|---------------------------------------
9e75705b4930f50502bcbd740fc3ece1 | MD5 | 初始安装程序
27ef6917fe32685fdf9b755eb8e97565 | MD5 | 初始安装程序
7b6d02a459fdaa4caa1a5bf741c4bd42 | MD5 | 初始安装程序
7457dc037c4a5f3713d9243a0dfb1a2c | MD5 | TrollAgent DLL
c8e7b0d3b6afa22e801cacaf16b37355 | MD5 | TrollAgent DLL
2e5f2a154e1b67cd0d6a2f6b5feb6de7 | MD5 | TrollAgent DLL
045f28a479ba19a95c0407a663e2f188 | MD5 | TrollAgent DLL
a67cf9add2905c11f5c466bc01d554b0 | MD5 | TrollAgent DLL
3b596ca429cf1b733f1ff3676189e44a | MD5 | TrollAgent DLL
88f183304b99c897aacfa321d58e1840 | MD5 | TrollAgent DLL
hxxp://ar.kostin.p-e[.]kr/index.php | URL | C2服务器
hxxp://dl.netup.p-e[.]kr/index.php | URL | C2服务器
hxxp://qi.limsjo.p-e[.]kr/index.php | URL | C2服务器
hxxp://ol.negapa.p-e[.]kr/index.php | URL | C2服务器
hxxp://ai.negapa.p-e[.]kr/index.php | URL | C2服务器
hxxp://sa.netup.p-e[.]kr/index.php | URL | C2服务器
YARA
rule TrollAgent_Kimsuky_Stealer
{
meta:
description = "Detect TrollAgent Stealer"
author = "Dark Atlas Squad"
date = "2024-07-14"
strings:
$ex1 = "rollbackHookTrampoline" wide ascii
$ex2 = "preUpdateHookTrampoline" wide ascii
$ex3 = "compareTrampoline" wide ascii
$ex4 = "doneTrampoline" wide ascii
$ex5 = "authorizerTrampoline" wide ascii
condition:
uint16(0) == 0x5a4d and
pe.characteristics & pe.DLL and
all of them and
pe.number_of_exports > 11 and
for any i in (0 .. pe.number_of_sections) : (
pe.sections[i].name == ".vmp0" or
pe.sections[i].name == ".vmp1"
)
}
Kimsuky APT: The TrollAgent Stealer Analysis
https://darkatlas.io/blog/kimsuky-apt-the-trollagent-stealer-analysis
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里