本页为译文。英文版本为权威文本。 阅读英文版
malware · cryptojacking · crypto-stealer · rust · docker · worm · honeypot · monero
godhive:一款新型 Rust 加密货币窃取与挖矿框架
Kinryū Labs 分析了 godhive,这是一个新型且此前未被公开记录的 Rust 攻击框架,在我们的蜜罐网络上被捕获,其利用的是一个暴露在外的 Docker API。它挖掘 Monero,从各大交易所以及八条以上区块链上盗取加密货币钱包资金,以蠕虫方式传播,并藏身于一条为抵御下架而设计的命令信道之后。我们以高置信度评估,它是为犯罪目的专门打造的恶意软件,且由一名开发者从消费级移动网络连接中对自己的工具进行实地测试时部署。
作者 Davis Zheng·
TLP:CLEAR。已批准公开发布。由 Kinryū Labs 蜜罐传感器网络捕获。下文指标已做去毒化处理。
执行摘要
- 6,946单次自动化爆发中的 Docker API 请求
- 946二进制文件中的 Rust 源码模块
- 8+其钱包清空模块针对的区块链
- 9命令信道类型
godhive 是一个由 Rust 编译而成的蠕虫、加密货币窃取器与挖矿框架,它通过一个暴露在外的 Docker Remote API 进入了我们的蜜罐网络。单个操作者针对该暴露的 Docker API 发起了一轮高频、自动化的行动,将完整攻击链重复执行了 21 次。Kinryū Labs 以高置信度评估,godhive 是为犯罪目的专门打造的恶意软件,而非普通的商品化挖矿程序:它自带品牌标识,其名称未出现在任何公开威胁情报中,且还原出的二进制文件包含 946 个不同的 Rust 源码模块以及数月的开发量。
操作者从未通过 URL 下载该框架。他们将这个 ELF 文件以 base64 编码、用 printf 分块内联写入容器。该二进制文件已完全依据操作者自己的内联分块重建:215 个分块重组为一个 6.2 MB 的 x86-64 ELF 文件(SHA-256 4194f2337c2b261ed6e1fd0b6d18f0ba75388bdc91a2658eb827a154ed784f36),该文件在 VirusTotal 上不存在。
最具区分度的发现是:godhive 的主要用途并不是挖矿。挖矿是它的后备手段。它的主业是盗窃:在六家主流交易所上自动发起提现,并在八条以上区块链上清扫资金,只有在找不到任何钱包时才进行 Monero 挖矿。
- godhive 是新型的、为犯罪目的专门打造的 Rust 恶意软件。它带有自定义品牌标识,未见于公开报告,由 946 个 Rust 模块以及 18 个以上的 crate 依赖构建而成。还原出的二进制文件是一套覆盖面很广的攻击工具包,而非一个简单的投放器。
- 其目标是变现,且盗窃优先。该二进制文件可自动完成交易所提现(Binance、Coinbase、Kraken、Bybit、OKX、KuCoin),并在 Ethereum、BSC、Polygon、Arbitrum、Optimism、Base、Avalanche、Cronos 和 Solana 上执行 DeFi 资金清扫,优先选择稳定币。使用 XMRig 挖掘 Monero 只是针对没有钱包的主机的后备手段。
- 我们端到端观察到的过程。观察到的攻击链为:暴露的 Docker API、以读写方式挂载宿主机文件系统的特权容器、逃逸至宿主机、窃取
/etc/shadow与 SSH 密钥、部署 XMRig、建立用于带外访问的 ngrok 隧道、向一个 Telegram 机器人外传数据,随后是针对云元数据服务的 SSRF 以及对 Kubernetes 和 Elasticsearch 的扫描。 - 其命令信道是为抵御下架而构建的。godhive 层叠使用了点对点 Kademlia 网格、托管于区块链的 C2(EtherHiding)、一个在线的 Cloudflare Workers 中继、算法生成的备用域名以及 Telegram,并在某条信道沉默时自动迁移。
- 操作者的行动技艺与其工具水平截然相反。生产级别的恶意软件却是从消费级移动网络连接部署的,带有硬编码的明文 Telegram 令牌和一个公开文件托管服务,并且尽管自带反蜜罐模块,却以单一来源、一轮高调的爆发完成投放。我们评估,这最有可能是一名开发者在对自己的框架进行实地测试。
投递:一个暴露在外的 Docker API
入口是容器世界中最古老的那一个:TCP/2375 上未经认证的 Docker Remote API。从这里开始,攻击链就是教科书式的宿主机接管,可从操作者的 Docker API 请求中还原出来。
操作者基于 alpine:latest 创建了一个容器,设置 privileged: true,使用 network_mode: host,并以读写方式绑定挂载整个宿主机文件系统(/:/host:rw)。仅这一项容器配置就构成了逃逸:把宿主机根目录挂载进特权容器,等同于取得该机器的 root 级控制权。随后它清除竞争对手的挖矿程序(pkill -9 xmrig; pkill -9 lolMiner; pkill -9 minerd; pkill -9 godhive_c2),在宿主机的 /etc/godhive 写入自己的持久化目录,并直接通过挂载点读取宿主机机密,转储 /etc/shadow 和 /root/.ssh/authorized_keys。
直到此时,可识别的挖矿劫持行为才出现。godhive 从一个匿名文件托管服务获取一份 XMRig 构建版本并部署,打开一条用于带外访问的 ngrok 隧道,并把结果发送到一个 Telegram 机器人。最后它查询云元数据服务(169.254.169.254)以获取凭据,并探测 Kubernetes、Elasticsearch 和 Kibana 以扩大触达范围。操作者在这轮爆发中把该攻击链重复了 21 次。
挖矿只是其中最不起眼的部分
还原出的二进制文件远大于我们观察到实际执行的那条攻击链。它的 946 个 Rust 模块及其构建字符串勾勒出一套覆盖面很广的攻击工具包。其中一部分有已编译代码支撑(Rust 单态化产生的重复字面量、错误处理路径以及 crate 构建目录);另一些部分则只有模块名称和配置桩代码,因此下面这份清单在多大程度上代表意图,就在多大程度上代表已证实的功能。
变现流水线是其核心。一个 harvester 遍历文件系统寻找 wallet.dat、.env、SSH 密钥和 wp-config.php;一个 scorer 依据 CoinGecko 为 BTC、XMR、ETH 和 Ravencoin 定价,并按价值对受害者排序;一个凭据环节对窃取到的登录信息进行撞库,并集成 2CAPTCHA 以绕过登录挑战;一个 drainer 则通过 CCXT 交易所库和链上 DeFi 清扫来转移资金,从窃取的助记词派生密钥,并为每次提现选择成本最低的链。二进制文件中留下的一条开发者注释对稳定币提现做了优化以规避 Ethereum 的 gas 费,这种细致程度正是一个可用的 drainer 与概念验证之间的分界。
围绕这一核心的是工具包的其余部分:一个使用 Masscan 和 Nuclei 扫描并利用 Docker、Redis、Kubernetes、Elasticsearch、WordPress 以及一组 Windows 和 Java 漏洞(包括 Log4Shell)的蠕虫;一个按进程名针对九家终端安全厂商的 EDR 终结器;最高可达带 TPM 操纵的 UEFI bootkit 的五层持久化;一个可在不触及 C2 的情况下向整个僵尸网络推送新能力的 WASM 插件系统;一个仅在价值超过 1,000 美元阈值时才触发的勒索软件;一个剪贴板劫持器;一个 DDoS 模块;以及删除 wtmp、btmp 和 journal 日志并植入伪造 syslog 噪声以浪费分析人员时间的反取证功能。它把每个模块都伪装成名为 sysd 的假进程,并通过借用真实的 googlevideo.com SNI 主机名,把自身流量伪装成 YouTube 流媒体。
有两个细节让这幅图景不至于被高估。该框架内置了对十五种蜜罐平台以及一批沙箱和虚拟化管理程序的检测。而它的若干配置尚未完成:默认挖矿池已于 2022 年关停,剪贴板模块中的一个 ENS 名称从未注册,还有一个加密密钥仍是 CHANGE_ME 占位符。相关能力已被编译进去且真实存在;但其中一部分尚未接通。
ngrok,以及它为何被判定为黑客工具
最初让这轮行动引起注意的样本,是合法且带签名的 ngrok 二进制文件,从 ngrok 自家 CDN 拉取。它不是恶意软件。它是一款商业反向隧道工具,杀毒引擎把它标记为 hacktool,恰恰是因为它在入侵之后太好用。一旦 godhive 在特权容器内取得代码执行权,ngrok 就会向外拨号连接 ngrok 云,并通过一个公开 URL 暴露选定的本地服务,全程不开放任何入站端口,边界防火墙或仅允许出站的 NAT 也无从拦截。操作者通过轮询 ngrok 本地代理 API(127.0.0.1:4040/api/tunnels)确认隧道建立,并把得到的公开 URL 发送给自己的 Telegram 机器人,从而把每一台刚被拿下的主机变成一个点击即连的入口。
一条为抵御下架而构建的命令信道
godhive 并不依赖单一 C2。它按各条信道被清除的难度高低层层堆叠。最底层是一个带工作量证明加入挑战和 NAT 穿透的点对点 Kademlia 网格,没有可供查封的中心节点。其上是 EtherHiding,当前后端地址存放在一个无法被撤销的区块链智能合约中,并在运行时通过一个在线的 Cloudflare Workers 中继(c2-proxy.operator.workers[.]dev)解析,从而对防守方隐藏后端。再往上是通过带伪造 SNI 的 DNS-over-HTTPS 获取的算法生成备用域名、一个 Tor 隐藏服务、GitHub gists 中的死信箱、八条软件即服务信道,以及作为操作者主信道的 Telegram。烧毁检测会监视连续多次空的命令轮询,并自动把操作者迁移到全新基础设施,同时附带一份加密的配置备份;此外还有一项联邦功能支持跨多个机器人的协同。
我们从外部对该 Cloudflare Workers 中继做了指纹识别,确认它处于在线状态并在处理请求:注册、任务下发和仪表盘端点均路由到某个后端,同时未经认证的输入会被拒绝,这与该二进制文件用于 C2 认证的 AEAD 加密令牌相吻合。操作者还在其后运行着一个加固过的管理仪表盘,采用 Argon2 密码哈希、多因素认证、基于角色的访问控制,其 TLS 配置中甚至包含后量子选项。这是有人把僵尸网络当作生产基础设施来对待,连为其导出 Prometheus 指标都做了。
另一半:业余的行动水平
尽管工程实现如此,部署环节却在关键之处显得粗疏。这轮行动来自美国一个 Verizon Wireless 消费级移动网络连接(174.230.35[.]232,反向 DNS 为 232.sub-174-230-35.myvzw.com,佛罗里达州 Gainesville),既不是防弹主机也不是 VPS,且以一轮紧凑的自动化爆发完成,没有任何基础设施复用。Telegram 机器人令牌以明文硬编码,构成单点可下架目标。XMRig 载荷托管在一个公开的匿名文件托管服务上。而且尽管带有全部那些蜜罐检测代码,它却是从一个可追溯的地址以一轮高调爆发部署的。
该二进制文件在 macOS 上构建,用户名为 dev,目录名为 research/godhive。结合操作者对其 Telegram 身份刻意做的匿名化处理、未完成的配置,以及这种自我标识式的部署来看,最经济的解读是:一名有技术水平的独立开发者在测试并运行自己的框架,而不是某个恶意软件即服务平台的客户。品牌部分打磨得相当精致,有自定义的金色蜂巢标志和标语“one mind, one purpose, one hive”;行动部分则不然。
归因
这轮行动通过其 Telegram 基础设施指向单个操作者。godhive 把窃取到的凭据、隧道 URL 和感染确认信息发送到一个硬编码的机器人 @godhive_bot(bot id 8836117161)。捕获到的 chat_id 解析为一个个人账号 @godhive77(user id 7659611777),显示名称由下划线组成且没有头像,这是一次匿名化尝试,却又被 godhive77 这个用户名本身抵消。同一操作者还持有一个对应的占位频道 @godhive(一名订阅者、无公开帖文、已禁用转发),而递增的 Telegram user id 把该账号的创建时间定位在 2024 年末。godhive77 这个用户名是进一步归因的最强枢轴点。
失陷指标
攻击者基础设施已做去毒化处理。恶意软件所滥用的合法第三方服务保持原样,以便用于检测。
网络与主机
| 指标 | 说明 |
|---|---|
c2-proxy.operator.workers[.]dev | 在线的 Cloudflare Workers C2 中继(建议向 Cloudflare 举报) |
hxxps://files.catbox.moe/p46h39.gz | 托管在匿名文件托管服务上的 XMRig 载荷(SHA-256 cb49ae0793b2…) |
bin.equinox.io/c/.../ngrok-v3-stable-linux-amd64.tgz | ngrok 下载地址(合法 CDN);从服务器向 bin.equinox.io 的出站流量才是信号 |
127.0.0.1:4040/api/tunnels | ngrok 本地代理轮询(读取分配到的公开隧道 URL) |
169.254.169.254/latest/meta-data/ | 用于窃取凭据的云元数据 SSRF |
api.telegram.org | Telegram 机器人 C2 与数据外传;来自服务器工作负载的出站流量是狩猎信号 |
gitlab.com/nzyme/ | 静态工具暂存(sshpass、redis-cli、wget、tor、proxychains) |
2captcha.com、hashes.org、nitrxgen.net | 凭据流水线中被滥用的验证码识别与哈希破解服务 |
r[1-20]---sn-*.googlevideo.com、manifest.googlevideo.com | 用于 TLS SNI 伪造的真实 YouTube CDN 主机名;当它们解析到非 Google IP 时应告警 |
攻击者、C2 身份与收款
| 指标 | 说明 |
|---|---|
174.230.35[.]232 | 行动来源(Verizon Wireless 移动网络,232.sub-174-230-35.myvzw.com,佛罗里达州 Gainesville);动态运营商地址,封禁价值低 |
@godhive_bot(Telegram bot id 8836117161) | 恶意软件 C2 与外传机器人;令牌硬编码在二进制文件中(此处已删去密钥;已向 Telegram 报告以请求下架) |
@godhive77(Telegram user id 7659611777) | 操作者的外传账号,也是最强的归因枢轴点 |
@godhive(Telegram 频道 id -1002105830453) | 操作者的占位频道 |
49aXwwgXBKRKTUVgYuLy3fZkTeLP3PWgMhwiyK55Ur7WhgYXJ33N8JZG87vzUV1UyVdZzPGLvx1w9YQHk7faWPn1UzJte2R | 已确认的 Monero 收款钱包(与在用的 XMRig 配置配对) |
pool.minexmr.com:4444 | XMRig 配置中的矿池;注意 minexmr 已于 2022 年关停,因此该默认值会失败 |
文件与制品
- godhive 二进制文件(重建): SHA-256
4194f2337c2b261ed6e1fd0b6d18f0ba75388bdc91a2658eb827a154ed784f36(6.2 MB x86-64 ELF,不在 VirusTotal 上)。其 ELF 头被刻意破坏,谎称文件约 106 MB 并把代码指向文件末尾之外,以使标准工具失效。 - 主机持久化:
/etc/godhive、/host/usr/local/bin/sysd(伪造的 systemd 二进制文件)、/host/tmp/godhive_deployed.txt、进程godhive_c2、容器内自建镜像godhive:latest。 - 容器逃逸特征: 创建时带有
Privileged:true、network_mode:host以及/:/host:rw绑定挂载的容器。 - 构建制品:
/Users/dev/.cargo/registry/src/下的 cargo 路径,以及一个research/godhive构建目录(macOS 开发者)。 - 主机加固痕迹: Redis 密码被设为
CHANGED_BY_GODHIVE;在 WordPress 暴力破解活动的同时出现b374k.phpwebshell。
行为特征
pkill -9 xmrig|lolMiner|minerd|godhive_c2之后紧跟mkdir /host/etc/godhive。- 从容器挂载点读取
/host/etc/shadow和/host/root/.ssh/authorized_keys。 - 出现并非真正 systemd 的
sysd进程;efibootmgr写入并创建标签为 “System Core” 的 EFI 引导项。 - Nuclei 工作目录
/tmp/.nuclei_assault-t*。
检测
- 对服务器发往
bin.equinox.io以及任何*.ngrok*主机的出站流量告警,并对 ngrok 代理 API 轮询127.0.0.1:4040/api/tunnels告警。 - 对任何创建时同时带有
Privileged:true且/:/host绑定挂载的容器告警;这一组合几乎可以确定是逃逸尝试。 - 对服务器工作负载发往
api.telegram.org、c2-proxy.operator.workers[.]dev、gitlab.com/nzyme/、2captcha.com以及哈希破解服务的出站流量告警。 - 对
sysd进程、对 EDR 代理被终止或停止(falcon-sensor、SentinelOne、cbdefense、sophos-edr、cylancesvc),以及对CONFIG SET requirepass CHANGED_BY_GODHIVE告警。 - 把 SNI 为
googlevideo.com却解析到非 Google IP 的 TLS 流量,以及来自非浏览器进程的manifest.googlevideo.com,视为流量伪装。
缓解
- 绝不要在 2375 端口上以无认证方式暴露 Docker API。 将其绑定到 localhost 并启用 TLS 客户端认证。这是根本原因。
- 强制
no-new-privileges,去掉--privileged,限制宿主机绑定挂载,或改用 rootless Docker 或 gVisor。 - 阻止容器访问云元数据服务(
169.254.169.254),并强制要求 IMDSv2。 - 过滤出站流量:服务器工作负载不应能访问匿名文件托管服务、ngrok、Telegram、验证码识别服务,或上文提到的静态工具暂存路径。
- 启用 Secure Boot 以削弱 UEFI 持久化,并在终端代理上启用防篡改保护,godhive 会试图将其终结。
- 如果有任何主机可能已被入侵,立即轮换交易所 API 密钥;godhive 会自动发起提现。
MITRE ATT&CK 映射
| 战术 | 技术 |
|---|---|
| Initial Access | T1190 Exploit Public-Facing Application(Docker API;武器库中还有 Redis、Kubernetes、WordPress、Log4Shell) |
| Execution | T1610 Deploy Container;T1059.004 Unix Shell |
| Privilege Escalation | T1611 Escape to Host(特权容器、宿主机挂载) |
| Persistence | T1543 Create or Modify System Process(sysd);T1542.003 Bootkit(UEFI);T1014 Rootkit |
| Defense Evasion | T1562.001 Impair Defenses(EDR 终结器);T1070 Indicator Removal(删除日志);T1497 Virtualization/Sandbox Evasion(蜜罐/虚拟机检测);T1036 Masquerading(sysd、YouTube SNI);T1027 Obfuscated Files(损坏的 ELF) |
| Credential Access | T1003.008 /etc/passwd and /etc/shadow;T1552.004 Private Keys;T1552.005 Cloud Instance Metadata API |
| Discovery | T1046 Network Service Scanning(Masscan、Nuclei) |
| Command and Control | T1572 Protocol Tunneling(ngrok);T1090 Proxy;T1071.001 Web Protocols(Telegram、Cloudflare Workers);T1102 Web Service(GitHub gists、SaaS 信道) |
| Impact | T1496 Resource Hijacking(XMRig);T1486 Data Encrypted for Impact(勒索软件);T1657 Financial Theft(交易所与 DeFi 资金清空);T1498 Network Denial of Service |
方法与说明
- 分析方法为对该 ELF 的静态二进制分析,该文件完全依据蜜罐捕获的操作者自身内联 base64 分块重建,并结合对捕获到的 Docker API 流量的审查,以及对操作者在线 Cloudflare Workers 中继的授权外部侦察。未执行任何恶意软件,也未尝试进行 C2 认证。
- 指标已做去毒化处理,恶意软件所滥用的合法第三方服务保持原样,以便用于检测。
- 样本可应请求提供给其他研究人员与防守方。请发送邮件至 contact@kinryu.sh,并简要说明你的身份以及索取用途。