文章总结: APT36利用AI生成名为vibeware的恶意软件,采用Nim等小众语言规避检测,并利用Slack等可信服务进行C2通信。研究指出这是恶意软件工业化而非技术突破,虽代码平庸但通过规模化挑战防御。报告详细分析了Warcode、SupaServ等样本技术细节及IOC,揭示了AI降低攻击门槛并改变威胁格局的现状。 综合评分: 92 文章分类: 威胁情报,恶意软件,AI安全
MailCreep 和 SheetCreep
CreepDropper 感染的最后一阶段涉及执行两个功能载荷:MailCreep 和 SheetCreep。这两个组件为威胁行为者提供了实际的数据窃取和命令执行能力。这两个家族之前已被 Zscaler 研究 文档化。
我们对 MailCreep 的分析与之前的研究所一致。这种基于 Go 的信息窃取工具使用 Microsoft Graph API 来外发数据。其实现和 C2 机制与已知版本保持一致。在此次活动中,我们没有发现任何显著的差异或更新。有关其工作流程的详细分解,请参阅原始 Zscaler 分析。
尽管 SheetCreep 的基本架构仍然是一个基于 C# 的后门工具,并利用 Google Sheets 获取命令,但我们的调查揭示了几点新的见解。在受害者处检测到的样本(编译于 2025-10-28 09:58:46)使用了一种简单的文件检测规避技术——整个二进制文件被反向写入文件中。通过从末尾到开头镜像字节后,该文件生成了一个有效的 MZ PE .NET 组件。
,它确保只有新创建或修改的文件才会被编目并外泄。</p>
<p>实际的数据外泄时,LuminousStealer 使用分割策略将文件的元数据和内容分开上传。SQLite数据库中的所有文件元数据和目录记录都上传到 Firebase,而实际文件内容则排队并上传至 Google Drive。两者均通过 Google OAuth 进行身份验证。</p>
<hr />
<p><img decoding=)
img
为了增加网络检测的复杂性,LuminousStealer 使用与 SupaServ 相同的浏览器模拟技术。唯一的区别在于它使用了更具体的 Sec-Ch-Ua 字符串:’Sec-Ch-Ua’: “Not_A Brand”;v=”8″, “Chromium”;v=”120″, “Google Chrome”;v=”120″
有趣的是,对该二进制文件的分析揭示了嵌入的构建路径 C:\Users\kumar\.cargo\(.cargo 是 Rust 包管理器的全局目录)。”Kumar” 是一个常见的印度教名字,这很可能是一种故意混淆的手法。类似地,CrystalShell C2 基础设施使用名为 “Jinwoo’s Server” 的 Discord 服务器作为战术手段。这些是APT常用的误导调查人员、复杂化国际政治归属的常见手法——或许开发者只是喜欢《英雄联盟:双城之战》中的主角。
CrystalShell
CrystallShell 是一种用 Crystal 语言开发的后门程序,旨在支持跨平台部署(Windows/Linux/macOS)。在2025年12月下旬至2026年1月底期间识别出的样本显示,在C2凭证管理方面有所改进,但也存在几个明显的实现问题。
我们分析的大多数样本主要使用 Discord 作为C2通道的主要通信工具,尽管发现了一个使用 Slack 的变种。该行为体在获取 Discord 机器人令牌方面的安全措施在样本中有所不同:
- 初始阶段(2025年12月):令牌直接硬编码在二进制文件中。
- 中间阶段:恶意软件开始从未认证的 Firebase 实时数据库端点获取令牌。
- 当前阶段(2026年1月):最新样本使用了带有身份验证功能的 Supabase 来检索C2凭证。
该恶意软件为命令和控制通信硬编码了 Discord 频道 ID,并实现了一个简单的授权检查。它会验证发送者的 Discord 用户ID。如果命令来自未经授权用户,机器人将回复 “You are not authorized.“(你没有权限)
所有在C2通道内的通讯都进行了Base64编码以避免简单字符串过滤器的检测。初始化后,代理通过发布格式为 Users: 的消息来宣布其存在。
所有机器人与操作员之间的交互遵循相同的命令和响应格式:
-
Targeting: 协议支持使用特定语法进行目标执行。代码接受三种格式的靶标字符串 //, / 和 ,但过滤程序特别提取并评估 。未带靶标前缀的命令将由所有连接代理执行。
-
Command Format: 直接命令必须以特定标签前缀和Base64编码:! en
-
users: 返回代理标识符,格式为 Users:/(例如,Users:administrator /7456)。
-
lists: 返回详细元数据:/ PID: LastSeen:. 例如:win10-vm/administrator PID:7456 LastSeen:2026-01-26 09:56:25 -08:00。
-
host / hosts / hostname: 返回主机和用户信息:/. 例如:win10-vm/administrator。
-
ls|dir: 两种形式均可列出目录内容。 -
pwd|cd: 改变或显示当前工作目录,该目录由恶意软件内部跟踪记录。 -
status: 返回连接状态:// – online|offline。 -
其他任何命令在Linux/macOS上通过 /bin/sh -c 执行,在Windows上使用 cmd.exe /c > %TEMP%<8-random-chars>cr_shell_output 2>&1。值得注意的是,当前实现未能删除此文件。
-
Results Output: 内置命令如
ls、pwd或status的结果以标准Base64字符串返回:base64()。通过cmd.exe或/bin/sh执行的命令的结果带有前导标记 !: ! base64()。
CrystalShell 包含一个翻译层,能够检测宿主操作系统并将Linux风格的命令重写为其Windows等效命令:
ls->dircat->typerm->delpwd->cdmv->movecp->copy
通过 Slack 和 Discord 管理界面发出的命令显示操作员执行了广泛的任务,从初始发现到最终数据泄露,遵循了一套标准流程。与 CrystallShell(Discord 和 Slack 变体)和 ZigShell 相关的消息始于 2025-12-08,并且在撰写此报告时仍在持续。
- 经常使用
curl、ipinfo、ipconfig、net view和arp来映射网络。 - 定期列出计划任务/进程/目录。
- 依赖于 PowerShell 进行高级任务,主要通过
iex(Invoke-Expression)直接从远程服务器运行代码,并将恶意 .NET 组装加载到内存中。PowerShell 还用于捕获屏幕截图和录制音频。 - 部署其他工具和恶意软件,大多托管在文件共享服务 tmpfiles.org 上。
- 系统地收集敏感数据并最终将其泄露至攻击者控制的云存储。
值得注意的是,在 CrystallShell 代码中可见一些明显的 Vibe-Coding 限制,例如状态和列表命令的实现。开发人员似乎打算创建一个集中式的状态管理系统,其中主代理会维护所有活跃机器人的哈希表。该哈希表应存储每个受感染主机的状态条目,从而使操作员能够查询单一点来了解整个网络的健康状况。然而,并没有协议供机器人共享其状态或选举主节点处理报告。这一疏忽会导致广播风暴,其中每个机器人尝试向其他所有人回复,但哈希表甚至未包含关于其他机器人的数据。
img
在 CrystallShell 的代码中可以明显看出 Vibe-Coding 的一些限制,例如状态和列表命令的实现。开发人员似乎希望创建一个集中式的状态管理系统,在该系统中主代理将维护所有活跃机器人的哈希表。哈希表本应存储每个受感染主机的状态条目,从而允许操作员查询单一节点以了解整个网络的健康状况。然而,并没有协议供机器人共享其状态或选举主节点处理报告。这一疏忽会导致广播风暴,其中每个机器人尝试向所有其他机器人回复消息,但哈希表甚至未包含关于其他机器人的数据。
另一个例子是状态命令。恶意软件在报告过程中不仅查询 last_seen 属性来计算时间差,还会在此过程中刷新这个时间戳为当前时间。这种逻辑错误确保了在检查时主机始终会显示“在线”,因为查询状态重置了用于评估的度量标准。
ZigShell
ZigShell 是 CrystalShell 的功能对应版本,但主要使用 Slack 作为其 C2 基础设施,并用 Zig 语言编写。已发现的两个样本编译时间为 2026-02-09,在时间线中晚于大多数 CrystalShell 变体(CrystalShell 的 Slack 版本编译于 2026-01-01 08:54:53)。
尽管平台从 Discord 更改为 Slack,但通信协议几乎与 CrystalShell 实现相同。唯一的区别是 CrystalShell 使用 !en 命令前缀,而 ZigShell 简化为标准的 ! 前缀。
img
为了自动化 Base64 编码和解码过程,攻击者使用了一个自定义的 GUI 包装器。虽然我们仅发现了这个 UI 用于 ZigShell,但可以安全假设也为 CrystalShell 开发了类似的工具。
从功能角度来看,ZigShell 增加了内置支持文件传输的功能:
- send: File上传用于将受害机器上的文件传输到Slack频道。它包含一个使用说明:Usage: send 。
- drop: 文件下载用于从Slack拉取文件到受害机器上。它支持文件名和Slack文件ID:Usage: drop 或 drop (从Slack下载到当前目录)。或者上传一个文件并说 ‘! drop’。
- get: 该命令支持上传和下载功能。Usage: get (从当前目录 -> Slack) 或 get (从Slack -> 当前目录)。
- 其他任何命令将通过powershell.exe启动cmd.exe执行。
ZigShell似乎是从CrystalShell逻辑直接移植到Zig语言中的。几乎相同的命令结构和公告格式表明使用了共同的设计模板。
CrystalFile
CrystalFile是一个用Crystal语言编写的简单命令解释器。与本套件中其他通过直接通信云API的工具不同,CrystalFile作为一个被动监听器运行,依赖于本地文件状态。
操作工作流:
-
轮询:恶意软件不断监控C:\Users\Public\AccountPictures\input.txt文件。
-
解析:当该文件非空时,恶意软件逐行读取它,并忽略以#开头的注释行。
-
执行:通过内置逻辑处理程序对每行进行处理。
-
cd: 更改当前工作目录。
-
ls: 列出当前目录的内容。
-
copy-item: 使用PowerShell风格参数(如-path, -destination, 和-recurse)传输文件。
-
其他情况:通过调用cmd.exe执行命令。
-
输出:结果被连接后写入同一目录的output.txt中。
-
清理:完成循环后,恶意软件清除input.txt并返回到其轮询状态。
LuminousCookies
LuminousCookies 是一种专门用于从基于 Chromium 的浏览器中提取 cookie、密码和支付信息的注入器,特别针对 App-Bound Encryption (ABE) 的绕过。在开始对 LuminousCookies 进行分析之前,了解 ABE 及其解密方式非常有用。
什么是 App-Bound Encryption (ABE)?
App-Bound Encryption 是从 Chromium 版本 127 引入的一种多层次防御机制,用于保护敏感资产如会话 cookie 和存储凭证。历史 上,这些秘密信息是由 Windows Data Protection API (DPAPI) 保护的,仅验证用户身份,这意味着任何以用户权限运行的恶意进程都可以解密浏览器主密钥。ABE 通过将加密密钥绑定到浏览器应用程序自身的密码学标识来缓解这一问题。只有经过验证的系统服务才能处理解密请求,并确认该请求源自合法、签名过的浏览器二进制文件。这种转变迫使攻击者不仅要进行简单的文件收割,还要采用更具侵入性的技术,如进程注入等,以访问解密后的数据。
ABE 解密器基础
通常情况下,只有经过签名的浏览器二进制文件被授权解密 app_bound_encrypted_key 值。为了绕过这一限制,注入器必须迫使浏览器加载一个恶意 DLL 到其自身的内存空间中。一旦进入该进程内部,DLL 可以通过伪装成浏览器过程的一部分来获取敏感数据。有了这个密钥,所有存储的浏览器秘密信息,包括会话 cookie 和密码,都可以使用标准的 AES 算法进行解密。
The 公开的概念验证 xaitax/Chrome-App-Bound-Encryption-Decryption 在 GitHub 上展示了一种方法,通过操控合法的浏览器组件绕过应用程序绑定加密功能,而无需管理员权限。对设备的分析揭示了多种恶意 DLL 和注入器变体,但所有已识别样本均基于这项原始研究(或其分支)。LuminousCookies 的前身是一个直接从修改后的 GitHub 仓库编译生成的独立 C++ 工具。这种版本通常以 DLL 形式分发用于侧加载,并具有明显的取证足迹,包括在 %TEMP%/chrome_decrypt.log 中的明文日志和输出文件夹如 output_dll_default。我们发现了注入器和注入库的不同版本。
img
LuminousCookies 注入器
LuminousCookies(由威胁行为者命名)是一种用 Rust 编写的现代注入工具。分析的两个样本的编译时间戳分别为 2026.01.07 08:06:04 和 2026.01.27 11:46:05。这些样本中包含硬编码的构建路径 C:\Users\kumar\,直接指向用于 SupaServ 的开发环境。
该工具利用标准注入方法将其负载部署到 chrome.exe、brave.exe 或 edge.exe 中:
- 创建一个挂起的浏览器进程。
- 使用 VirtualAllocEx 和 WriteProcessMemory 将 payload.dll 的路径写入目标进程内存。
- 在 kernel32.dll 中解析 LoadLibrary 的地址。
- 使用 CreateRemoteThread 调用 LoadLibrary,迫使浏览器进程加载恶意负载。
该恶意软件包含一个帮助菜单:
img
执行后,LuminousCookies注入器首先尝试在其当前工作目录中定位并加载名为payload.dll的文件。然后,该工具会扫描系统以识别活跃的目标进程,目标可能是Google Chrome、Microsoft Edge或Brave。一旦找到目标进程,注入器将启动LoadLibrary注入序列,迫使浏览器加载payload。为了数据传输,注入器创建了一个命名通信管道,并进入等待状态,直到从注入的解密模块接收到完成信号。
img
img
已知的ABE解密DLL与LuminousCookies注入器之间存在技术冲突。标准的ABE解密DLL期望在DllMain中传递通信管道名称作为参数,通常通过进程空壳实现。然而,LuminousCookies使用的LoadLibrary注入方法不支持向入口点传递参数。这表明payload.dll可能存在一个修改过的变体,其中可能包含硬编码的管道名称,我们无法获取。
BackupSpy
BackupSpy是一个基于Rust的实用工具(编译于2026-01-12),设计用于监控本地文件系统和外部媒体以识别高价值数据。内部标识字符串为”BACKGROUND WATCHER STARTED – VERSION 2″,该工具作为专门的数据收集器运行,将数据准备供套件中的其他组件进行传输,并将其存储在单个位置C:\Users\Public\systemTemp。
BackupSpy 使用一个硬编码的自定义配置,存储在 C:\Users\Public\systemTemp\config.toml 中。如果未找到配置文件,它会放置一个默认版本。默认配置包括一个扩展名白名单(16种文件类型)和50MB的最大文件大小阈值。
Toml
# 默认情况下启用复制功能:如不需复制,请手动设置为 false
enable_copy = true
# 复制目标位置:当 enable_copy 为 true 时,文件将被复制到此处
copy_destination = "C:\Users\Public\systemTemp\copied"
# 扩展名白名单:仅包含这些扩展名的文件会被考虑进行复制/记录
allowed_extensions = ["txt","md","pdf","doc","docx","xls","xlsx","csv","json","xml","html","htm","jpg","jpeg","png","ppt","pptx"]
# max_copy_size_bytes:任何超过此大小的文件在复制时将被跳过(安全)
max_copy_size_bytes = 52428800
BackupSpy 生成包含泄露文件详细信息的 JSON 格式清单文件 (manifest.json 和 drive_manifest_ _%Y%m%dT%H%M%S .json)。该工具还会在 C:\Users\Public\systemTemp\log.txt 中维护操作日志,记录扫描开始、文件匹配和错误情况。
img
清单文件包括以下属性:
-
manifest.json
-
路径
-
大小
-
文件名
-
最后修改时间
-
跟踪的文件
-
drive_manifest.json
-
路径
-
大小
-
驱动器
-
检测时间
-
文件
ZigLoader
ZigLoader 是用 Zig 编程语言编写的专用加载器。其主要功能是对任意 shellcode 进行解密并在内存中执行。经过分析的样本(c0218ece73d9046e25293fbef71bc70c)显示出活跃开发和反取证技术的迹象,包括将 PE 头部的时间戳 timestomping 为 1981-07-24 18:17:51。在分析的样本中,shellcode 仅执行 calc.exe,表明 ZigLoader 很可能是概念验证项目。
ZigLoader 使用滚动 XOR 方案来解密其内部 368 字节的 payload。该过程从一个基础密钥(0xAA)开始,在处理每个字节后都会对其进行修改。
img
解密后的输出为 Base64 字符串,解码后包含 x64 shellcode。该 shellcode 不直接通过名称调用 Windows API – 相反,它使用自定义散列算法在运行时解析函数地址。
识别出的 API 散列值:
- 0x876F8B31: kernel32.dll!WinExec
- 0x9DBD95A6: kernel32.dll!GetVersion
- 0x56A2B5F0: kernel32.dll!ExitProcess
- 0x6F721347: ntdll.dll!RtlExitUserThread
加载器利用低级别的系统调用(如 NtAllocateVirtualMemory 和 NtFreeVirtualMemory)进行内存操作,通过 CreateThread 在执行前部署 shellcode。
网关哨兵信标
网关哨兵信标是开源 GateSentinel 项目 的自定义版本。这是一个现代的 C2 框架,结合了基于 Go 的服务器和基于 C 的客户端。
The most显著的偏离原始来源的是实现了一个额外的持久化机制。攻击者不仅依赖服务或注册表项,还修改了合法应用程序快捷方式(.lnk文件)。除了打开目标应用外,修改后的快捷方式还会在后台执行恶意软件。
调查发现五种被修改的快捷方式:
- Google Chrome: C:\Users%USERNAME%\Desktop\Google Chrome.lnk
- Microsoft Edge (公共): C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Edge.lnk
- Microsoft Edge (用户): C:\Users%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Microsoft Edge.lnk
- Microsoft Edge(用户固定任务栏): C:\Users%USERNAME%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\Microsoft Edge.lnk
- Microsoft Edge(系统固定任务栏): C:\Users%USERNAME%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts*\Microsoft Edge.lnk
结论与建议
APT36向vibeware的过渡代表了一种技术倒退。尽管AI辅助开发增加了样本量,但生成的工具往往不稳定且充斥着逻辑错误。攻击者的策略错误地针对基于签名的检测方法,而现代端点安全已远远超越了这种检测方式。
高级防御堆栈包括行为分析、内存扫描和进程监控以识别恶意活动,这意味着任何试图注入进程或与云API通信的恶意二进制文件都会立即被检测到。
威胁仍然是一种混合模型。AI生成了一线可抛弃的恶意软件,但后续的黑客操作仍需手动完成。
1. 优先行为检测
基于过程行为进行检测而非文件运行时,监控用户可写目录(如%APPDATA%)中执行未签名二进制文件的行为。EDR平台应提示异常API调用或进程注入,这些在vibeware系列中无论使用何种语言均保持一致。
2. 审核和控制可信云服务 (LOTS)
对Discord、Slack和Google Sheets等用于命令与控制的依赖是此次行动的核心支柱。组织必须实施细粒度监控这些服务。任何来自未验证二进制文件的持续外部连接都应被视为潜在妥协指标。
3. 敌对网络环境
为了保护免受手动黑客攻击,通过实现动态攻击面缩减,结合可操作的EDR/XDR平台如Bitdefender GravityZone和成熟的SOC/MDR运营,将网络转化为对手难以预料的环境。这些措施为人类操作者增加了摩擦与不确定性,在横向移动和发现阶段迫使他们暴露自身。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:TIPFactory情报工厂 Ti Ti《APT36:Vibeware 使用》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论