LoopDNS: 一起恶意钓鱼邮件调查
LoopDNS安全团队2026 年 7 月 23 日,Loopdns 官方邮箱收到一封采购询价邮件。

发件人自称 Samantha Clarke,要求我们查看附件中的物料并报价。正文附有采购单号、南非地址、VAT 号和联系电话,附件名则像一张经过压缩的 WhatsApp 图片:
IMG-20260723-WA0007.JPG.BZ2
邮件通过了 SPF、DKIM 和 DMARC 验证,传输过程使用 TLS 1.3。单看认证结果,它与正常企业邮件并无明显区别。
附件实际既不是图片,也不是 BZip2 文件。
对邮件头、发件基础设施和附件逐层还原后,我们确认这是一条完整的多阶段 Remcos RAT 投递链:
RAR5 伪装附件 → JScript → 用户环境变量 → WMI 隐藏 PowerShell → 伪装图片中的 .NET Loader → 反射式内存加载 → 第二张伪装图片 → calc.exe 进程空洞 → Remcos RAT → kesmn[.]com:2404
邮件并非通过任意服务器伪造 From 地址,而是由发件域授权的邮件服务器签名并投递。结合域名注册记录、历史公开资料及投递当天的基础设施变更,我们判断该域名很可能在过期后被重新注册,并被用于恶意邮件投递。
一、调查邮件伪装
邮件正文采用了典型的 RFQ(Request for Quote,询价)模板:
Good day loopdns-official, Please see the attached items and provide quotation as listed. Include the following details: Order Number: PO79611 for this enquiry. Kind regards / Vriendelike groete, Samantha Clarke
正文没有列出具体商品,物料信息全部留在附件中,意在诱导收件人打开文件。
邮件还叠加了多种常见的商业邮件伪装:
- 主题以
Re:开头,试图伪装成已有往来; - 称呼直接使用 Loopdns 邮箱的本地部分;
- 使用英语与 Afrikaans 双语落款;
- 提供南非地址、
+27电话和 VAT 号; - 附件名模拟 WhatsApp 图片命名方式;
- 使用采购单号
PO79611增加业务真实感。
但是邮件头中没有 In-Reply-To 或 References。
邮件所给 VAT 号共有 11 位,而南非税务局 SARS 公布的 VAT 注册号格式为 10 位。
邮件头记录如下:
spf=pass dkim=pass dmarc=pass
具体关系如下:
RFC5321 Mail From / Return-Path 对应 trivantaholdings[.]com
RFC5322 From 对应 trivantaholdings[.]com
SPF Pass trivantaholdings[.]com
DKIM Pass ,2048 位 RSA d=trivantaholdings[.]com
DMARC Pass header.from=trivantaholdings[.]com
DMARC策略 p=quarantine _dmarc.trivantaholdings[.]com
发件域的 SPF 配置为:
v=spf1 mx -all
邮件来自该域自己的 MX:
box.trivantaholdings[.]com 23.254.142.153
DKIM 使用 mail selector。接收方验证了 2048 位 RSA 签名,且 d= 与 From 域一致。
我们通过查询历史变动以及注册记录发现邮件投递时,该域名当前注册记录仅存在约 21 天,且攻击当天的部署时间线如下:
05:58:31 UTC 域名 RDAP 状态发生变更 06:55:15 UTC 根域 Let's Encrypt 证书生效 06:55:31 UTC box 邮件主机证书生效 07:36:45 UTC Mail-in-a-Box 默认网页更新 09:45:28 UTC 恶意邮件生成并提交 09:45:30 UTC DKIM 签名 11:17:21 UTC 收信人接收
DNS、MX、网站和权威名称服务器都集中在同一台 VPS:
23.254.142.153 AS54290 Hostwinds
Loopdns 在公开资料中发现,2019 年 7 月 26 日的《Zimbabwean Government Gazette Extraordinary》注册供应商名录曾列出:
Trivanta Holdings (Private) Limited 地点:Harare 电话:+263... 邮箱:...@trivantaholdings.com
该记录表明,trivantaholdings.com 在 2019 年曾作为一家津巴布韦企业的联系域名使用
综合现有证据,我们判断:
历史企业域名在过期或删除后,被新的控制者重新注册,并利用原有企业名称及可能残留的域名信誉进行恶意投递。
二、调查邮件附件
附件名称:
IMG-20260723-WA0007.JPG.BZ2
文件大小为 2,702 字节,文件头为:
52 61 72 21 1A 07 01 R a r ! ...
这是 RAR5 的文件特征,真正的 BZip2 文件应以 BZh 开头,JPEG 则通常以 FF D8 FF 开头。
RAR 中只有一个文件:
IMG-20260723-WA0007.JPG.js
这形成了两层视觉欺骗:
外层:.JPG.BZ2 内层:.JPG.js
如果 Windows 隐藏已知文件扩展名,用户可能只看到:
IMG-20260723-WA0007.JPG
双击后实际运行的是 Windows Script Host。
我们对于解压出的 JScript 进行了分析
SHA-256 7e090830c8c84153d099f02048e0591366d8a3c1c027acae9db2fe38a30150d9样本拼接一个特殊 Unicode 分隔符,且反复重复,但是这些重复代码不参与主要执行流程,作用包括:
- 膨胀文件;
- 改变哈希;
- 干扰文本扫描;
- 破坏简单字符串特征;
- 增加人工审查成本;
- 利用 Unicode 兼容性差异干扰工具。
我们在剔除重复文本后,执行逻辑集中在约 30 行内。
三、邮件附件逆向分析
JScript 的实际执行流程为:
1. 移除 Unicode 分隔符; 2. 恢复 PowerShell 脚本; 3. 将脚本写入用户环境变量 leafroll; 4. 通过 WMI 创建隐藏 PowerShell; 5. PowerShell 从环境变量读取并执行代码。
对应命令:
powershell.exe -NoProfile -Command "Invoke-Expression $env:leafroll"
JScript 使用:
WScript.Shell.Environment("User")
将代码写入用户级环境变量,通常会在注册表留下:
HKCU\Environment Value name: leafroll
随后它连接:
winmgmts:\\.\root\cimv2
创建:
Win32_ProcessStartup ShowWindow = 0 Win32_Process.Create
对应的进程关系通常表现为:
wscript.exe / cscript.exe → WMI → powershell.exe
PowerShell 解码出第一阶段地址:
hxxps://deliverymailreport[.]co[.]za/MSI_214135.png
调查时,该对象返回 HTTP 200:
Content-Type: image/png Content-Length: 2147246 Last-Modified: 2026-07-23 04:41:00 UTC
文件实际是 JPEG,结构如下:
结构 偏移
JPEG EOI FF D9 1,385,381
起始标记 IN- 1,385,383
结束标记 -in1 2,147,242
在正常 JPEG 结束后,文件还附加了约 761 KB 数据。
PowerShell 的恢复算法为:
取出 IN- 与 -in1 之间的字符串 → 将 # 替换为 A → 反转整个字符串 → Base64 解码
最终得到 571,392 字节的 .NET DLL:
SHA-256: e906fac133e0fb937737d8f1b1567e8930b1250b88991e0ab2e6a1ffb30510e8
PowerShell 随后调用:
AppDomain.CurrentDomain.Load(byte[])
将 DLL 直接载入当前 AppDomain。
解码出的 .NET 程序集宣称自己是:
Microsoft.Win32.TaskScheduler Version 2.8.20.0
程序集保留了大量 TaskScheduler 库代码和相关元数据,同时存在以下异常:
- 没有 Authenticode 签名;
- 没有强名称公钥;
- 包含混淆恶意命名空间;
- 内置下载和进程空洞代码;
- 包含 AES 加密的下一阶段配置。
恶意入口位于混淆命名空间:
OtnmpxnddVnptbN.mpxnddVn
样本还使用了类似 Babel/BabelVM 的保护方式,包括动态字符串表、代理委托和运行时解析器。
反分析字符串包括:
AssemblyServer SimpleAssemblyExplorer babelvm smoketest
.NET Loader 中存在字段:
ChaveSecretaGlobal
ChaveSecretaGlobal 在葡萄牙语中意为“全局秘密密钥”。
其值为:
tQaCQYKIo1FdSsme
Loader 将该 16 字节字符串与 00 到 0F 的 16 个连续字节拼接,形成 32 字节 AES-256 密钥。
配置加密格式:
Base64Decode → 前 16 字节作为 IV → AES-256-CBC → PKCS#7 → UTF-8 明文
19 个参数全部恢复后,最关键的部分为:
hxxps://deliverymailreport[.]co[.]za/img_214229.png C:\Users\Public\Downloads\ calc t5udkgosPX 7YR666ojms
calc 是后续进程空洞的宿主进程配置。
第二阶段地址:
hxxps://deliverymailreport[.]co[.]za/img_214229.png
调查时,该地址同样返回 HTTP 200,响应头标注:
Content-Type: image/png Content-Length: 2984538
文件实际仍是 JPEG。
JPEG 的 EXIF 中带有:
Adobe Photoshop CC 2019 2022:05:05 11:01:46
关键偏移如下:
结构 偏移
最终 JPEG EOI 2,069,307
INICIO 2,069,309
最终 FIM 2,984,535
Loader 使用 LastIndexOf("FIM"),避免 Base64 中间自然出现相同字母组合时提前截断。
恢复算法:
取出 INICIO 与最后一个 FIM 之间的字符串 → 将 ### 替换为 A → 反转字符串 → Base64 解码
最终得到一个 525,312 字节、未签名的 32 位原生 Windows PE:
SHA-256: 4ccd1c3bf61ba55502624f95924672ca448b829e17e4ac7ad2a46d442bb716dd
.NET Loader 同时包含 x86 和 x64 PE 加载路径。
它读取 Optional Header Magic:
0x10B → PE32 / x86 0x20B → PE32+ / x64
最终载荷是 0x10B,因此进入 x86 路径。
静态还原出的空洞注入过程包括:
CreateProcess 创建 suspended 宿主进程 → 读取目标 PEB 和原映像信息 → 在远程进程中分配内存 → WriteProcessMemory 写入 PE 头 → 写入各节区 → GetThreadContext → 修改入口点 → SetThreadContext → ResumeThread
宿主参数是:
calc
最终木马被写入并运行在空洞化的 calc.exe 中。
四、最终载荷确定为 Remcos
最终 PE 的导入表包含完整的远控和监控能力。
键盘与窗口:
SetWindowsHookExA GetKeyboardState ToUnicodeEx GetForegroundWindow GetWindowTextW
剪贴板:
OpenClipboard GetClipboardData SetClipboardData
屏幕:
BitBlt CreateCompatibleBitmap GetDIBits GdipSaveImageToStream
音频:
waveInOpen waveInStart waveInAddBuffer mciSendString
进程注入:
OpenProcess ReadProcessMemory WriteProcessMemory GetThreadContext SetThreadContext ResumeThread
网络:
socket connect send recv getaddrinfo InternetOpenUrlW URLDownloadToFileW
最终载荷包含名为 SETTINGS 的 RT_RCDATA 资源。其结构为:
第 1 字节:RC4 密钥长度,49 接下来 49 字节:RC4 密钥 剩余内容:RC4 加密的 Remcos 配置
解密后的关键配置如下:
- C2:
kesmn[.]com:2404 - C2 配置口令:
1 - 客户端名称:
RemoteHost - 互斥体:
Rmc-JX5IHY - 复制文件名:
remcos.exe - 键盘日志文件:
logs.dat - 截图目录:
Screenshots - 录音目录:
MicRecords
配置中:
- 全局 Install flag 为关闭;
- HKCU Run 配置位为开启;
- HKLM Run 配置位为开启;
- 默认自动键盘记录为关闭;
- 默认自动截图为关闭。
该样本配置了 HKCU、HKLM Run 相关参数,但全局 Install flag 关闭。
五、公开安全信息验证
Triage 在 2026 年 7 月 10 日已经收录完全相同的 SHA-256,并给出 10/10 评分以及:
Remcos RAT Spyware Stealer Collection Discovery
等标签。
同一载荷至少在 Loopdns 收到邮件前约两周已经出现。
此外,Joe Sandbox 对另一条恶意脚本链的动态分析也确认使用:
kesmn[.]com:2404 RemoteHost remcos.exe logs.dat Screenshots MicRecords
并识别出 Remcos 特征通信。
六、攻击基础设施
载荷托管
deliverymailreport[.]co[.]za 调查时 IP:169.239.181.174
路径:
hxxps://deliverymailreport[.]co[.]za/MSI_214135.png hxxps://deliverymailreport[.]co[.]za/img_214229.png
调查时,两个文件仍可访问。
urlscan 的历史记录也将该域映射到 169.239.181.174,并显示该域在 2026 年 5 月扫描时仍非常新。
Remcos C2
kesmn[.]com TCP/2404 调查时 IP:46.151.182.181
邮件投递
trivantaholdings[.]com box.trivantaholdings[.]com 23.254.142.153 AS54290 / Hostwinds
IOC如下:
文件哈希
- 原始附件:
cf211b8f7ce335b7e33ffc50feb40e6bc01516215d0688e2dd7afca09c8c3ca9 - JScript:
7e090830c8c84153d099f02048e0591366d8a3c1c027acae9db2fe38a30150d9 - 第一伪装图片:
b9af942a465894f6cc114e6bb9c6c6b6bd460322f8e05b4d19a7bf304bfaceb7 - .NET Loader:
e906fac133e0fb937737d8f1b1567e8930b1250b88991e0ab2e6a1ffb30510e8 - 第二伪装图片:
eb7ca505308302d124c619092349b64ee1f85f78ee9e9c16c7a0b18ff6830d64 - 最终 Remcos:
4ccd1c3bf61ba55502624f95924672ca448b829e17e4ac7ad2a46d442bb716dd
域名、IP 与端口
- 载荷托管域名:
deliverymailreport[.]co[.]za - 载荷托管 IP:
169.239.181.174 - C2 域名:
kesmn[.]com - C2 IP:
46.151.182.181 - C2 端口:
TCP/2404 - 发件域名:
trivantaholdings[.]com - 邮件主机:
box.trivantaholdings[.]com - 邮件服务器 IP:
23.254.142.153
URL
hxxps://deliverymailreport[.]co[.]za/MSI_214135.pnghxxps://deliverymailreport[.]co[.]za/img_214229.png
主机痕迹
- 用户环境变量:
HKCU\Environment\leafroll - 互斥体:
Rmc-JX5IHY - 复制文件名:
remcos.exe - 键盘日志文件:
logs.dat - 截图目录:
Screenshots - 录音目录:
MicRecords - 配置标识:
0FB37E842E838B6DF10173B588109A29