yankywilson/etherhiding-etherrat-kit

GitHub: yankywilson/etherhiding-etherrat-kit

针对利用以太坊智能合约进行 C2 解析的 EtherRAT 恶意软件家族的综合威胁情报评估报告,提供完整的 IOC 集和多格式检测规则。

Stars: 1 | Forks: 0

# 分布式 EtherHiding 解析器套件 — EtherRAT 家族 **威胁情报评估与防御者资源包** | | | |---|---| | **报告 ID** | CTI-2026-0614-ETHERHIDING-KIT | | **评估日期** | 2026-06-14 | | **分类** | TLP:CLEAR — 公开,无限制分发 | | **作者** | 独立 CTI 研究(被动 OSINT) | | **评估标准** | 全文应用 ICD-203 分析置信度规范 | | **状态** | 调查完成;一项分析依赖项作为推论处理(见下文) | ## 如何阅读本文档 这是一份完成的情报产品,而不是威胁指标(IOC)的堆砌。每一项主要结论都使用 [ICD-203](https://www.dni.gov/files/documents/ICD/ICD%20203%20Analytic%20Standards.pdf) 的概率和置信度词汇给出了明确的置信度判断。链条中被**观察到**的环节会以此标注。对于**推断出**的环节,推断过程及其依据会被直接陈述,而非掩盖过去。IOC 表格包含单项置信度列,以便防御者在导入时能够对自身的响应进行分级。 本次调查中有两项分析操作超越了纯被动收集标准。**两者均已在方法论部分披露。** 本报告中的任何内容都不依赖于特权访问、供应商订阅源或付费来源;每一个指标都可以从指定的公开来源中独立复现。 ## 1. 核心结论(BLUF) 一套**分布式 EtherHiding 命令与控制(C2)解析套件**,与公开报告的 **EtherRAT** 恶意软件家族相对应,截至 2026 年 6 月正处于活跃运行状态。我们**以高置信度**评估: - 该套件使用**部署在 Ethereum 主网上的字节码相同及高度相似的智能合约家族**作为抗审查的 C2 解析层。我们识别出了 **24 个字节码完全相同和 9 个变体的解析器合约**,在数量上远远超过了先前公开报告中描述的单个合约。 - 每个操作者都会部署或写入**由其自己钱包控制的独立合约实例**(一种基于操作者的扇出设计),并通过 `setString(string)` 调用以**明文**形式在链上发布其当前的 C2 endpoint。我们映射了**约 30 个操作者钱包**,并直接从链上事件数据中提取了 **19 个以上不同的 C2 endpoint**。 - 具有稳定、可指纹识别的 HTTP 签名的**服务端操作者面板**构成了 C2 层的前端。我们在 NEKO (AS206134)、Microsoft Azure 和家庭宽带托管环境中枚举出了 **52 个存活面板**。 - 操作者通过**一次性域名和被劫持的老域名**进行分发。我们记录了一个拥有 16 年历史的合法 WordPress 博客 (`aravisblog.com`),该域名于 2026-06-08 被重定向至套件面板,利用了该域名的干净信誉(分析时厂商检测率为 1/91)。 - 我们在沙箱中**观察到**所分发的 **MSI 加载器**(`56058b92…`,0/61 AV)释放了 Node.js 阶段,在 `conhost --headless` 下执行它,查询了多个公共 Ethereum RPC 提供商,并向一个套件面板发起 beaconing —— 从而在活跃样本上证实了 EtherHiding 解析机制。 我们**以中等置信度**评估,该家族由**多个不同的行为者**操作,而非单一团伙,这符合*生成器套件/恶意软件即服务*模型,而不是单一的入侵集合。本报告**未进行**操作者级别的归属判定(见第 7 节)。 ## 2. 最新发现 追踪 EtherHiding/EtherRAT 的防御者和研究人员将发现以下相对于先前公开报告的全新内容: | 发现 | 先前的公开报告 | 本次评估 | |---|---|---| | 解析器合约 | 通常为单个合约 | **24 个字节码相同 + 9 个变体**合约(家族) | | 架构 | 通常被描述为单一解析器 | **基于操作者的扇出**,`mapping(address => string)`,在字节码级别得到确认 | | 操作者钱包 | 未被枚举 | **约 30 个**聚集的钱包 | | C2 endpoint | 数量有限 | 直接从链上恢复了 **19 个以上**,其中几个此前未被公开发布 | | 面板指纹 | 未公开 | 稳定的 **`X-Bot-Server` CORS + ETag** 签名;枚举出 **52** 个存活面板 | | 分发技能 | 一次性域名 | 记录了具有 DNS 历史证据的**被劫持老域名** | ## 3. 技术分析 ### 3.1 链上解析器(EtherHiding 层) C2 位置并未硬编码在恶意软件中。相反,恶意软件从 Ethereum 主网上的智能合约中读取该位置 —— 即 EtherHiding 技术。由于读取操作是作为 `eth_call` 针对公共 RPC 提供商执行的,因此这些查询不会生成链上交易,并且能够抵御针对域名/IP的封堵:操作者只需通过一次 `setString` 调用即可写入新的 endpoint。 **合约家族指纹(观察到):** | 元素 | 值 | |---|---| | 事件签名 | `StringChanged(address account, string newString)` | | 事件 topic0 | `0x3ca6280dac32fee85e9d3d81188d59eed7e4966e5b3df13a910924cf6ade2d47` | | Setter 选择器 | `0x7fcaf666` → `setString(string)` | | Getter 选择器 | `0x7d434425` → `getString(address)` | | 存储模型 | `mapping(address => string)` — 以 `msg.sender` 为键 | | 编译器 | Solidity 0.8.30 | 字节码已被提取并反编译(见 [`analysis/contract_bytecode.md`](analysis/contract_bytecode.md))。Setter 函数将调用者提供的字符串写入 `mapping[msg.sender]` 并触发 `StringChanged(msg.sender, newString)`。Getter 函数返回 `mapping[queriedAddress]`。这种设计是基于操作者的扇出评估的技术基础:**每个操作者的 C2 都以其自己的钱包地址进行命名空间隔离**,因此单个合约实例可以服务于多个操作者,并且存在许多字节码相同的实例,因为该套件将合约提供给操作者让他们自己部署。 **观察到的活跃解析器实例:** `0x45729d7424d7310a0c041a2906ba95a4bd5ebfca` 对该实例解码的 `StringChanged` 事件以明文形式恢复了当前的 C2,包括 `https://isocell.swedencentral.cloudapp.azure.com`、`https://dmors.com` 和 `https://leopriego.com`,由操作者钱包 `0xA001D3863b138eD523f255f62725AB1ddc82af87` 写入。这些值与被独立印证为 EtherRAT 的 endpoint 相匹配(第 5 节)。 ### 3.2 加载器和执行链(观察到) 一个 30 KB 的 MSI 加载器(`v9.msi`,SHA-256 `56058b92ce87a8e6a46b1b9a71e2cd0b32325e6a54e26d6e500f3b0b0f05cc0b`,0/61 厂商检测)通过公共沙箱行为报告进行了分析。执行链被**观察到**: ``` v9.msi (msiexec /qb) └─ drops node.exe (masqueraded under \Program Files (x86)\Common Files\Oracle\Java\javapath\ and \Program Files\nodejs\) └─ drops JS stage cDQMlQAru0.xml (Node script, .xml-disguised) └─ conhost --headless "node.exe" "...\2PhU26hCp7GZ\cDQMlQAru0.xml" └─ JS stage queries public Ethereum RPC providers (eth_call to resolver contract) └─ resolves C2 → beacons to panel 31.76.16.211 └─ persistence: Run-key autostart (reg.exe) └─ anti-analysis: PowerShell VM/sandbox checks, USB-bus check, AV enumeration ``` **查询的 RPC 提供商(在沙箱网络流量中观察到):** `eth-mainnet.public.blastapi.io`, `eth.drpc.org`, `eth.merkle.io`, `ethereum-rpc.publicnode.com`, `mainnet.gateway.tenderly.co`, `rpc.mevblocker.io`, `rpc.flashbots.net`。 并行查询多个 RPC 提供商并采取多数/首个应答的策略,与公开记录的 EtherRAT 解析行为一致。**因此,在该特定样本上证实了 EtherHiding 机制** —— 加载器确实通过 Ethereum RPC 解析了 C2,并且确实连接到了套件面板。 ### 3.3 操作者面板(观察到) C2 层呈现出一致的 HTTP 签名。可靠的区分标志是通告自定义 `X-Bot-Server` header 的 CORS header;ETag 是次要标志。 ``` HTTP/1.1 404 Not Found Server: nginx Access-Control-Allow-Methods: GET, POST, PUT, DELETE, PATCH, OPTIONS Access-Control-Allow-Headers: Content-Type, Authorization, X-Bot-Server ETag: W/"9-0gXL1ngzMqISxa6S1zx3F4wtLyg" ``` 针对 `X-Bot-Server` 值的 Censys header 搜索枚举出了 **52 个存活面板**,集中在 NEKO / NEKOBYTE INTERNATIONAL LTD (AS206134, 法兰克福),在 Microsoft Azure 和英国家庭宽带 IP 段(疑为中继)上有额外的托管主机。 ### 3.4 分发:被劫持的老域名(观察到) 观察到操作者使用具有 16 年历史的合法 WordPress/Automattic 博客 `aravisblog.com` 作为分发/面板前端。被动 DNS 历史记录显示,该域名从 2010 年到 2026 年初一直托管在 Automattic/Rackspace/AWS 基础设施上,随后于 **2026-06-08** 被重新指向套件面板 `31.76.16.211` (OOO Razvitie Optimizatsiya, RU)。在分析时,该域名的厂商检测率为 **1/91** —— 其老化的信誉积极地为基础设施提供了掩护。 此次接管还发布了非标准的 DNS 服务定位记录 —— `_3389._https.aravisblog.com` 和 `_3300._https.aravisblog.com` —— 表明除了简单的 Web 托管之外,还存在远程访问/面板服务的配置。这些记录已作为 IOC 包含在内。 ## 4. MITRE ATT&CK 映射 | 战术 | 技术 | ID | 证据 | |---|---|---|---| | 资源开发 | 获取基础设施:域名(被劫持的老域名) | T1583.001 | `aravisblog.com` 接管 | | 初始访问 | 通过可移动介质复制(USB 检查) | T1091 | 沙箱行为标签 | | 执行 | 命令和脚本解释器:JavaScript (Node) | T1059.007 | `node.exe cDQMlQAru0.xml` | | 执行 | 命令和脚本解释器:PowerShell | T1059.001 | 隐藏的 PS 侦察命令 | | 防御规避 | 间接命令执行 (`conhost --headless`) | T1202 | 进程树 | | 防御规避 | 伪装(位于 Oracle\Java 路径下的 node.exe) | T1036.005 | 释放的文件路径 | | 防御规避 | 虚拟化/沙箱规避 | T1497 | PS 虚拟机检查 | | 持久化 | 引导或登录自动启动:Run Keys | T1547.001 | `reg.exe` Run-key 写入 | | 命令与控制 | 应用层协议:Web(解析器) | T1071.001 | RPC `eth_call` + HTTPS beacon | | 命令与控制 | **通过区块链进行加密/混淆的 C2 解析(EtherHiding)** | T1102 / T1568 | 链上解析器 | ## 5. 独立印证 本评估是通过三种独立应用随后发现结果一致的方法得出的: 1. **链上分析** —— 直接从 `StringChanged` 事件中恢复了 C2 集合。 2. **主机指纹识别** —— 通过 `X-Bot-Server` HTTP 签名枚举面板。 3. **社区归属判定** —— 公开的 abuse.ch ThreatFox 数据集独立地将链上恢复的多个 endpoint(例如 `rubysen.com`, `ager-stp.org`, `issueall.com`, `webiqonline.com`, `dakindsoups.com` 以及 Azure/Cloudflare-tunnel endpoint)标记为 **EtherRAT**,由一名不相关的研究人员报告。 三种独立方法在**同一个家族**和**同一基础设施**上达成的一致,是得出该家族高置信度评估的基础。 ## 6. 置信度评分表 | 分析主张 | 状态 | 置信度 | |---|---|---| | 24+9 解析器合约家族 + ~30 个钱包 | 观察到(链上) | **高** | | 合约是 EtherHiding 解析器套件(基于操作者的扇出) | 观察到(字节码已反编译) | **高** | | C2 以明文形式在链上发布;恢复了 19+ 个 endpoint | 观察到(解码事件) | **高** | | 面板 HTTP 指纹;52 个存活面板 | 观察到(Censys + 数据包) | **高** | | 被劫持的老域名 → 面板 | 观察到(DNS 历史 + 数据包) | **高** | |族 = EtherRAT;链上 C2 ∈ EtherRAT 集合 | 印证(ThreatFox,独立) | **高** | | 加载器通过 Ethereum RPC 解析 C2 → 面板 | 观察到(沙箱行为) | **高** | | **特定加载器运行时读取的特定合约实例** | **推断出** | **中高** | | 多个不同的操作者(套件/MaaS 模型) | 评估得出(由架构所暗示) | **中等** | | 操作者级别的归属判定 | **未作出** | — | ### 明确陈述的一项推论 加载器通过**TLS 加密**的 `eth_call` 向公共 RPC 提供商解析 C2。因此,沙箱流量证明了加载器*使用了* EtherHiding 机制并且*连接到了一个套件面板*,但**没有**直接揭示加载器查询了*哪个*合约地址。我们**以中高置信度**评估,所读取的合约属于已记录的 24+9 家族中的一员,基于以下理由: 该解析出的 C2 与链上恢复的集合相匹配, 目标面板带有该套件的指纹,且 该家族是已知唯一会产生该 C2/面板组合的基础设施。希望消除此推论的防御者或研究人员可以通过静态分析,从释放的 JS 阶段(`cDQMlQAru0.xml`,SHA-256 `bbc4150d…`)中提取该地址。 ## 7. 归属判定 — 有意限制范围 **EtherRAT 家族**在公开报告中公开与朝鲜相关的活动(例如 Contagious Interview 技术手段)相关联,并且已被链接到 React2Shell 漏洞类别。该关联在此作为**家族的背景**进行报告,而不是本次调查的一项发现。 我们**没有**将此活动归属到特定的命名团伙,防御者也不应从本报告中推断出任何归属。原因在于方法论: - 其架构是一个**分布式的、基于操作者的套件**。被许多操作者使用的共享解析器家族是归属判定的*反面*信号 —— 它将不相关的行为者汇集在一个指纹下。 - 俄罗斯托管(OOO Razvitie, NEKO/AS206134)属于**基础设施采购**,而非国籍。 - 根据我们的标准,单一来源或单一供应商的归属判定上限为 MODERATE(中等),而就*特定操作者*而言,这里的任何证据甚至连该水平都未达到。 将家族标签视为**高置信度**,将任何操作者/国家标签视为**未确定**。 ## 8. 方法论与来源披露 **收集姿态:** 全程采取被动 OSINT,遵循气隙分析标准。来源:Etherscan、Dune Analytics (`ethereum.logs`)、Censys、Shodan、VirusTotal(公共关系/行为选项卡)、abuse.ch ThreatFox 和 MalwareBazaar、SecurityTrails(被动 DNS/IP 历史)、公共沙箱行为报告。 **披露的主动接触 (2):** 本次调查包含两项接触了活跃基础设施的操作,为了分析的诚实性特此披露: 1. 2026-06-14 对 `aravisblog.com` 进行的一次**云沙箱引爆**,产生了面板 HTTP 捕获数据。 2. 通过第三方 HTTP 请求服务对 `31.76.16.211` 进行的一次**手动存活检查**。 这两项行动均未使用分析人员控制的基础设施去直接接触可疑的 C2,除了标准的公共 RPC 读取外,没有对 Ethereum 合约进行任何主动接触。**本报告中的任何主张都不依赖于特权订阅源;每一个指标都可以从上述指定的公开来源中复现。** **复现查询**在 [`analysis/contract_bytecode.md`](analysis/contract_bytecode.md) 和检测文件的内联中提供。 ## 9. 仓库内容 | 路径 | 内容 | |---|---| | `README.md` | 本情报简报 | | [`IOCs/indicators.csv`](IOCs/indicators.csv) | 主 IOC 表,单项置信度 + 上下文 | | [`IOCs/contracts.csv`](IOCs/contracts.csv) | 链上合约和操作者钱包 | | [`detections/etherrat_loader.yar`](detections/etherrat_loader.yar) | YARA — 加载器/JS 阶段 | | [`detections/etherrat_behavior.yml`](detections/etherrat_behavior.yml) | Sigma — 执行链行为 | | [`detections/etherrat_network.rules`](detections/etherrat_network.rules) | Suricata — 面板 + RPC 模式 | | [`detections/etherrat_hunt.kql`](detections/etherrat_hunt.kql) | KQL — Defender/Sentinel 搜寻包 | | [`analysis/contract_bytecode.md`](analysis/contract_bytecode.md) | 反编译的解析器 + 复现查询 | ## 10. 防御建议 **检测(网络):** - 针对在**已知的开发者/钱包活动之外**,向多个公共 Ethereum RPC 提供商(`blastapi.io`, `drpc.org`, `merkle.io`, `publicnode.com`, `tenderly.co`, `mevblocker.io`, `flashbots.net`)执行 `eth_call` 模式 HTTPS 请求的内部主机发出告警。对于大多数企业而言,endpoint 与 Ethereum RPC 通信属于异常和高信号行为。 - 搜寻出口流量上的面板指纹(`X-Bot-Server` CORS header)。 **检测(endpoint):** - 从用户可写路径中生成 `node.exe` 或 `cmd.exe` 的 `conhost.exe --headless` 是高信号(见 Sigma)。 - 运行 `.xml` 参数文件的 `node.exe`,或位于 `Oracle\Java\javapath\` 下的 `node.exe`,属于异常情况。 - 指向 `%APPDATA%\Local\\` 中随机命名的二进制文件的新 Run-key 自动启动项。 **加固:** - 阻止/限制非开发人员 endpoint 对公共 Ethereum RPC 提供商的出站访问。 - 将老域名的信誉视为**必要但非充分**的信号;一个拥有 10 年以上干净信誉的域名在几天内被重新指向,这本身就是可疑的。在可用的情况下,针对域名托管 ASN/年限配置文件的巨大变化发出告警。 **响应:** - 链上解析器无法被关闭。遏制措施应集中在 **endpoint**(加载器、持久化机制、Node 阶段)和**面板/RPC 出口流量**上,而不是合约。 *本产品应用了 ICD-203 分析标准。置信度判断反映了截至评估日期的来源质量和印证程度。指标可能会随时间失效;链上解析器的设计意味着 C2 endpoint 会按设计轮换 —— 请优先考虑行为和指纹检测,而不是静态的 C2 字符串。*
标签:DAST, ESC4, IP 地址批量处理, Metaprompt, OSINT, 区块链安全, 命令控制检测, 域名收集, 威胁情报, 开发者工具, 恶意软件分析, 网络信息收集, 防御资源包