加密货币挖矿程序深度解析:分析加密货币挖矿程序
执行摘要
本文是我们的《加密货币挖矿程序深度解析》系列博文三部曲中的第二部分。在 第一部分中,我们讨论了加密货币的总体情况、它们的各种属性以及其中一些加密货币对攻击者更有吸引力的原因。
在本部分中,我们将深入分析各种加密货币挖矿程序样本,着重了解它们的内部运作机制和关键细节。我们将重点介绍挖掘门罗币和 Zephyr 的加密货币挖矿程序。据我们观察,这两种加密货币尤其适合进行恶意活动。在本博文中,我们将讨论:
如何使用区块链网络识别来自潜在加密货币挖矿程序恶意软件的可疑挖矿通信
四个使用不同拓扑结构来保持长期活跃和持久的样本案例研究
一起令人关注、旷日持久的案件,有数千名受害者卷入其中,收益却只有 每小时 5.50 美元
在一次攻击活动中使用多种加密货币的攻击者
通过网络活动以及对区块链网络进行交叉对比来进行检测
通过对进程进行内存分析以及共识算法指纹识别来进行检测
为帮助安全团队更好地保护资产,我们还在本博文中提供了根据这些案例研究总结出的入侵指标 (IOC) 列表。
在本博文最后的总结部分,我们探讨了依赖于抗 ASIC 算法概念的检测技术,以及用于加密货币挖矿操作检测的技术。该检测侧重于挖矿的基本原理,并且可应用于网络层面或操作系统层面。
门罗币网络分析
网络发现
由于门罗币网络是一个由个人贡献者组成的去中心化 P2P 网络,因此我们自己可以很容易地连接到该网络。通过映射门罗币网络,我们可以获得可靠的 IOC(例如节点 IP 地址),并发现比其他节点连接更紧密的节点中心的潜在活动。
此信息可用于检测和调查挖矿操作,还可以让我们评估网络是否存在漏洞以及遭受区块链攻击的风险。图 1 是门罗币挖矿网络的直观示意图,其中的热图显示了按地理区域划分的节点密度。我们用红点标出了对公众开放的节点。
由于该网络是由分布式对等节点组成的, 因此,任何加密货币挖矿程序都必须直接或间接与我们地图上显示的全球大约 30,000 台服务器之一进行交互。正如我们将了解到的那样,该地图对于搜寻加密货币挖矿程序样本以及检测与区块链的直接网络连接非常有用。(您可以在我们的 GitHub 存储库中找到更多信息,包括区块链爬取和地图生成的源代码。)
将加密货币挖矿程序与网络进行交叉对比
利用通过映射门罗币网络获取的不同指标,可以确定与区块链网络进行交互的样本。 例如,使用 VirusTotal Livehunt,我们可以识别包含已知节点地址的文件,这将有助于我们检测活跃的加密货币挖矿程序活动 (图 2)。
就像安全领域的其他方面一样,这不是一种放之四海而皆准的搜寻技术。当服务器不是唯一的区块链节点时,仅使用此方法可能会导致误报。它还可能导致缺乏可见性,因为该地图并未发现所有节点。但是,将此技术与其他指标相结合会提高真正例检测率。
该地图包含可以公开访问的节点以及最近可以访问的节点。部分节点不仅仅用作门罗币网络节点;例如,作为 Python 的 PyPi 存储库或任何其他服务的镜像。图 3 是一个提供多项服务的服务器的示例,这可能会在搜寻过程中造成很多干扰。我们从分析中剔除了这些服务器,以减少潜在的误报。
在威胁搜寻中,排除无关样本与筛选相关样本同样重要。利用网络分析结合交叉对比方法,可以发现加密货币挖矿程序和通过僵尸网络编排的所有挖矿活动。通过结合额外的静态分析技术(例如,匹配硬编码的钱包地址),我们可以高效地专注于相关性最高的恶意样本。
分析加密货币挖矿程序样本
由于加密货币挖矿本身具有显而易见的性质,因此即使用“肉眼”也很容易发现它们处于运行状态。只要足够警觉,IT 专业人员即使不使用复杂的反恶意软件工具,也能检测到加密货币挖矿程序所产生的异常。即使是不懂技术的用户,也知道自己电脑的正常运行状态。一旦电脑变得卡顿,他们很可能会寻求专业人士的帮助,后者通常能迅速找到问题的根源。出于此原因,很多加密货币挖矿程序都不会费心去保护恶意软件以防止其遭到分析和检测,而是采取无针对性的大规模感染策略。
在以下案例研究中,我们将介绍在现实环境中发现的一些加密货币挖矿程序样本,并研究有关其操作和行为的一些有趣细节。我们利用两个主要因素来寻找这些案例研究:(1) 相关的加密货币(如 本系列中第一篇博文所述),(2) 它们所利用的挖矿拓扑结构。
案例研究 1:持续的大规模活动
在此研究中,我们分析了各种加密货币挖矿程序样本, 其中一个活动持续了 6 年。与常见的长期活动类似,这一活动很可能是有组织的犯罪活动,或者是为第三方部署加密货币挖矿程序的恶意软件分发服务。
对该样本的分析 显示,它有多个代理,累计哈希率达到 5.6 Mh/s,这 相当于有数千台遭到入侵的机器 (图 4)。这是一次大规模的持续攻击,由于哈希率保持稳定,因此该恶意软件很可能仍未被大多数受害者发现,并继续畅通无阻地运行。对攻击者来说,此类攻击是利润极其丰厚的活动。
该活动至少从 2018 年 6 月以来就一直处于活跃状态,其中包含的若干指标(例如样本中使用的语言)可能暗示俄罗斯与中国的攻击者之间存在某种协作关系。对命令和控制 (C2) 服务器的分析也在一定程度上佐证了这一推测,但截至本文发布之时,尚未获得充分确认。
在撰写本博文时,攻击者已积累了至少 1,702 XMR,以今天的汇率计算,其价值大约为 280,000 美元。六年下来,平均每年从一个活动中获得将近 47,000 美元。
与此活动关联的大多数样本都使用与受害者所用操作系统相对应的脚本编制语言来作为初始的加载器和下载器。它严重依赖于路由和误导性网络连接,可能是尝试将恶意文件与 C2 服务器分离。
在分析活动样本后,我们发现它通过 PowerShell 以隐蔽的方式部署了一个名为 loader 的可执行文件(使用 r77 rootkit)。即使不对复杂的植入程序进行分析,我们也可以看出此加密货币挖矿程序有多个版本。
在某些版本中,该加密货币挖矿程序自身包含 config.json 文件,该文件用于保存挖矿配置。在其他样本中, OracleLoader 脚本用于植入加密货币挖矿程序,并设置配置。 该恶意软件还有更新机制,可以在遭受攻击时恢复僵尸网络 (表 1)。
特征 |
值 |
备注 |
---|---|---|
恶意软件名称 |
Oracle Loader |
|
当前版本 |
1.1.72.0 |
<5.133.65.53>/Oracle/ver$77_loader.exe.txt |
相关组件 |
|
表 1:Oracle Loader 的特征
该恶意软件还会侦听端口 999,暴露了 XMRig 的 HTTP API 功能。 这让攻击者可以访问受害者的挖矿程序,并帮助监控挖矿过程。如果受害者的机器直接连接到互联网,并且其前方未部署网络地址转换 (NAT) 路由器或外部防火墙,那么我们理论上就可以通过 Shodan 等网络监控服务来找到受害者。图 5 显示了用于检测潜在受害者的 Shodan 查询的结果。
通过使用 XMRig 工作程序监控 Web 应用程序来监控受害者的挖矿程序,我们可以揭示它们的 CPU 型号和哈希率等相关信息。我们只能通过此界面查询信息,因此虽然我们可以看到活动,但无法通过它控制挖矿程序,也无法将其关闭(图 6)。
正如我们在矿池仪表板中看到的那样,稳定的哈希率表明受害者遍布世界各地,否则我们应该会看到根据时区活跃时段而变化的哈希率。另一种解释可能是,攻击者的目标是服务器,而不是像其他加密货币挖矿程序活动一样针对消费者。
案例研究 2:Zephyr 加密货币挖矿程序使用的公共矿池拓扑结构
尽管有少数攻击者像案例研究 1 中那样,积极主动且技术高超,通过长期活动赚取巨额利润,但他们并不是威胁的主要来源。使用公共矿池的加密货币挖矿程序最为常见。这些加密货币挖矿程序不包含复杂的功能,例如混淆或反分析技术。典型的作案手法是使用纯文本钱包地址直接联系矿池。它们的影响和利润通常也较小。
加密货币市场为攻击者提供了多种选择,这些选择的挖矿利润和币值各不相同。尽管加密货币挖矿本身具有一定的经济价值, 但对于众多攻击者而言,挖掘特定加密货币所能带来的盈利能力显然并非其首要考虑因素。相较于门罗币,Zephyr 币的挖矿收益较低,但这种加密货币在攻击者中却十分常见。加密货币市场的波动性是攻击者和合法加密货币买家都要考虑的问题。对攻击者而言,他们往往会从 潜在的 长期价值角度来选择加密货币。
我们所见过的 最大规模 Zephyr 活动 涉及超过 1,400 名活跃受害者,总哈希率为 800 Kh/s,总利润为 906.3 ZEPH,目前相当于 2,528 美元。
通过监测一段时间内僵尸网络的哈希率变化,我们可以判断攻击者在何时将目标锁定在特定地理区域。另一个例子是,我们观察到一项使用代理和直接连接恶意软件的活动,该活动 似乎 专门针对俄语用户(图 7)。
周期性变化表明,大多数受害者是人类用户而不是服务器,因为个人机器更有可能定期关闭。 如果我们分析哈希率的频率,便会发现其周期为 24 小时,并且在假设低点为夜间的情况下,可以定位大多数受害者所在的时区(图 8)。
仅依靠时间间隔无法充分证明受害者的位置,但 Hashvault 矿池所提供的 IP 地理位置查找功能为我们的理论提供了支持。通过将此功能与恶意软件分析以及和游戏相关的恶意软件交付名称(如 Fortnite、Solara executor for Roblox 等)相结合,我们可以得出一个更可靠的假设,即该恶意软件 伪装成作弊器来引诱玩家找到它。我们还怀疑它通过社交媒体和消息传递应用程序(例如 Telegram 和 Discord)进行传播。
案例研究 3:使用挖矿代理拓扑结构的加密货币挖矿程序
我们使用了门罗币网络图来收集超过 25,000 个节点的相关信息,但其中只有 10% 的节点可以直接访问。反过来,我们也使用此地图来过滤掉任何未连接到网络的已知加密货币挖矿程序,我们就是这样发现了一个自 2022 年 4 月以来一直处于活跃状态的 活动 。
图 9 显示了该恶意软件的攻击媒介:它使用 XMRig-proxy 等挖矿代理,并通过破解版的 Internet Download Manager (IDM) 等盗版软件分发其加密货币挖矿程序。
在该活动中发现的恶意软件样本具有相似的攻击流程。通常,攻击始于 crackingcity.com上的强制下载,进而触发一系列有效负载链。然后,在最后一个阶段,它会部署加密货币挖矿程序 dlIhost.exe ,该程序会连接到托管在 custompool.xyz中的代理。 攻击者采用环境变量将字符串作为参数传递至其子进程,此类子进程通常为批处理文件,以此作为一种规避检测的技术手段。其工作原理是,解密嵌入的存档文件,并在操作防御者排除列表后执行脚本或文件。
攻击者于 2022 年 4 月 29 日以“ custompool.xyz ”的名称注册了代理域,这距离 VirusTotal 首次检测到该域 仅仅过去了三天 。第一个样本名为“ VScan.exe”,这是一个自解压存档文件,使用两个批处理文件。第一个文件为 main.bat,它使用环境变量中的隐藏密码来提取第二阶段的批处理文件 VS.bat。我们可使用调试程序通过以下两种方式提取隐藏信息:在访问名为“l3”的环境变量时中断(图 10),或者在每次修改环境变量时中断。
通过使用密码 un#912345678@rar,我们可以提取连接到另一个 C2 域“ crackingcity.com”的第二阶段加载器。在最终阶段,该恶意软件会执行 dlIhost.exe (本质上是一个经过修改的 XMRig 客户端,其中嵌入了对 custompool.xyz 矿池的配置),此时它是直接 IP(图 11)。
现在,有一个关于服务器类型的问题。它是专用矿池?挖矿代理?还是我们认为与专用矿池相同的某种自定义节点?为了回答这些问题,我们需要一种方法来从服务器中提取一些标识符。通过专用节点进行单独挖矿要求挖矿程序以 守护程序 模式运行(其中 RPC 请求通过 HTTP 传输),而此配置中不存在这种模式,因此情况显然并非如此。
JSON 结构在序列化过程中得到保留,这使我们能够尝试通过发送 XMRig-proxy 支持的各种 Stratum 方法从服务器获取响应。如果来自服务器的响应与键值顺序匹配,这可能强烈表明服务器使用 XMRig-proxy 或基于它。
XMRig 支持以下三种 Stratum 协议方法:
- Login ——由挖矿工作程序发起的第一个请求,通常包含钱包地址作为登录信息
- Keepalived ——使连接保持活跃状态
- Submit ——在发现有效份额时,提交结果
当请求了无效的方法时,XMRig-proxy 会以错误进行回复(图 12)。 这可以表明服务器类型,因为其他服务(如矿池)只是忽略错误请求,而不会出错。通过结合所有这些方法,我们得出结论,我们正在应对的是 XMRig-proxy。
我们将 submit 方法分为应从 XMRig 代理返回明确错误的三种情况(表 2)。
低难度份额是指挖矿程序所提交哈希的值低于预期目标。
根据 nicehash 的设计,无效 nonce 是由于 nonce 超出范围导致的。
最大难度哈希是经过特殊制作的哈希,它可能满足任何任务的目标。在这种情况下,我们绕过 XMRig 代理难度验证并直接传输到矿池,这会返回矿池错误。
请求 |
XMRig-proxy |
MoneroOcean |
HashVault |
Nanopool |
SupportXMR |
C3Pool |
Login |
(基准) |
✕ |
✕ |
✕ |
✕ |
✕ |
Keepalived |
(基准) |
≈ |
✅ |
≈ |
✕ |
≈ |
未知 |
(基准) |
✕ |
✕ |
✕ |
✕ |
✕ |
Submit — 低难度 |
(基准) |
✕ |
✕ |
✕ |
✕ |
✕ |
Submit — nonce 无效 |
(基准) |
NA — 阻止的 IP |
✕ |
✕ |
✕ |
✕ |
Submit — 最大难度 |
重复矿池响应消息 |
NA — 阻止的 IP |
✅ |
✕ |
✅ |
✅ |
表 2:XMRig-proxy 与各种公共矿池之间的 Stratum 协议请求比较;✅ 表示与基准相同,✕ 表示数据不同,而 ≈ 表示数据相同,顺序不同
我们不仅可以将 XMRig-proxy 与常用矿池区分开来,还可以矿池本身区分开来。当我们通过其他网络组件(例如反向代理)路由到矿池时,这些信息会非常有用。在这种情况下, 当我们以最大难度提交挖矿结果时,我们会从后端矿池而不是代理收到错误。通过使用这些信息,我们可以确定攻击者使用了 Nanopool,但由于我们没有钱包地址,因此无法评估此活动的受害者人数或利润。
案例研究 4:使用 Stratum 代理拓扑结构进行隐蔽的区块链通信
Stratum 协议代理在网络层运行,通过将 Stratum 协议请求直接转发到另一台服务器,而不修改钱包地址。这种方式可确保每个挖矿程序的工作都计入它们各自的钱包。要实现 Stratum 代理,可以使用基本的传输层协议网络代理,也可以使用能够理解和处理该协议的专门应用程序代理。
我们发现了一个使用此拓扑结构的 活跃活动 ,该活动通过 Stratum 代理连接到公共矿池。我们无法确定它是网络层的反向代理,还是拦截 Stratum 协议本身并作为应用程序代理运行。无论采用哪种方式,它都会重定向 Stratum 消息,以隐藏后端矿池或节点。通过扫描所提供的钱包的公共矿池,我们发现它与 MoneroOcean 公共矿池有联系。
该活动已至少持续了四个月,其总利润为 1.158 XMR(大约 180 美元)。仅就目前来看,它并不是一个非常成功的活动。但攻击者投入的精力表明,他们可能在筹划更大规模的活动,包括独立开发整个活动所需的全部组件——基础架构、加密货币挖矿程序以及用于植入该程序的不同恶意文件。这些攻击者还在不依赖第三方的情况下自行分发活动,同时实施反逆向工程机制,包括采用加密、混淆技术以及防止使用监控工具(图 13)。
尽管这项攻击活动可能显得不够周密,但我们仍能观察到恶意软件在执行层面的精巧设计,尤其是在代码混淆方面。 该恶意软件试图通过在运行时下载压缩包,并以合法的系统文件名来运行进程,以此隐藏其有效负载。
检测
一般来说,您可以通过几种不同的途径来进行检测。每种方法可能无法单独使用,但如果与其他检测机制结合使用,就能发挥其作用。加密货币挖矿程序也不例外;事实上,由于其具备良性特征,因此它们可能是难以检测的恶意软件。它们会使用大多数操作系统中唯一不需要特殊权限的东西,即计算(CPU 时间)。
与网络的连接
为了检测这些挖矿程序,我们可以将区块链网络(如我们先前抓取的门罗币网络)与通过网络监测工具(如防火墙或分段解决方案)获取的数据进行交叉对比。由于每个节点或矿池都必须和门罗币区块链进行交互,因此这可以为网络管理员提供有关流出其网络的流量的宝贵见解。与网络端口相结合时,检测会变得更加容易,因为大多数加密货币挖矿程序使用不同的端口号,例如 999、3333 或 7777。 虽然本案例研究中使用的是门罗币,但区块链网络映射可以用在所有基于工作量证明 (PoW) 的网络中。
但是,需要注意的是,并非所有流向门罗币网络节点的流量都是在进行加密货币挖矿,因为这些节点有时会提供多种服务。例如, IP 157[.]90[.]212[.]53 是在我们的门罗币网络图中找到的,但它也是 出口节点 (用于 Tor 网络)。对于为何门罗币网络节点会提供其他服务的解释可能有很多;该节点可能遭到了入侵,或者只是有意被设计为多用途。无论是哪种情况,如果只有与网络的连接而没有其他信息,可能无法充分表明连接的是区块链,从而产生误报。这是 端口号信息对于实现准确检测至关重要的另一个原因。
产生误报的另一个原因可能是该地图的更新率低。分配给合法服务器的 IP 地址可能是门罗币网络节点先前使用的 IP 地址,因此如果此地图不是最新的,则会导致误报。
此检测方法无法单独使用,但可用于触发更全面的检测逻辑或调查。加密货币挖矿程序的任何操作都必须包含与 Stratum 服务器的通信,以便进行挖矿任务分配。通常,它会使用知名的矿池进行操作,但在某些情况下,它可以使用代理隐藏起来,这样便不会出现在网络图上。
算法执行检测
加密货币挖矿程序会大量使用受害者的计算资源,因此对系统的使用高峰进行监控可以提供是否受到感染的信息。但是,与网络图交叉对比一样,它无法单独用作一种准确的检测方法。
通过将多种可检测的 IOC 相结合可以提高检测置信率;换而言之,这可以减少误报。挖矿操作要想取得成功,必须满足必要的对应条件。加密货币挖矿程序必须使用其共识算法作为工作量证明以挖掘所选加密货币。在运行时,每种此类算法在系统中都有一个唯一的指纹,并且提取这些特征可以创建一种检测恶意加密货币挖矿程序的可靠方法。
抗 ASIC 算法(例如 RandomX)通常会实施一组可被唯一识别的复杂操作。例如,RandomX 的开发人员正是基于这一假设开发了一款 检测工具 。通过遍历系统中正在运行的线程,我们可以探查线程状态,包括 CPU 寄存器的值。由于 RandomX 是使用 CPU 的很多现代功能实现的,因此使用 RandomX 开发人员的检查工具中的 舍入控制 配置是一种方法。
事实上,通过将它与其他指标(例如,硬件 AES 操作和 大页面 配置)相结合可以提高检测率。总之,可以分别通过在 SSE 寄存器中查找唯一的 AES 密钥或通过查询线程 访问令牌权限来实现检测。
我们也可以将这些方法扩展到其他操作系统,因为 大多数加密货币挖矿程序都致力于摆脱平台的限制 ,并在不同操作系统上保持相同的行为模式。不依赖于单一的操作系统,会使目标数量显著增加,从而极大地提高攻击活动的成功率。
在进程内存中定位钱包
当加密货币挖矿程序直接与矿池进行通信而不是通过代理进行通信时,挖矿程序的钱包应该驻留在进程的内存中。这是因为 Stratum 协议需要挖矿程序对服务器进行身份验证并告知它哪个帐户应该在提交有效份额时获得奖励。通常,它会使用钱包地址。具体来说,对于门罗币挖矿,挖矿程序可能基于 XMRig 软件。利用这些假设,我们可以通过挂接各种套接字 API 来在钱包被发送到矿池时找到并拦截它,或者(理论上)我们可以使用中间机器 (MITM)“攻击”来拦截挖矿程序发送的身份验证消息。
我们还可以使用简单的正则表达式搜索,在进程的整个已分配内存中查找 95 个字符的钱包地址,因为它遵循严格的格式。它以 4 或 8 开头,并由 BASE58 有效字符组成。因此,模式“ /[48][1-9A-HJ-NP-Za-km-z]{94}/ ”足以完成此任务,并且还可以嵌入 YARA 规则中。 在加密货币挖矿程序首次连接到矿池之后,可以随时进行扫描,因为挖矿程序必须保持钱包地址可用,以备重新连接时使用。
最后,我们可以使用所提到的任何技术来查找与 Stratum 协议相关的其他字符串并从中解析钱包。此类指标可以减少误报,因为该协议的 JSON 结构更加独特。相关示例请参阅图 14 中的登录请求;我们可以创建一个包含多个密钥的更强签名,以提高检测的准确性。
{
"id": 1,
"jsonrpc": "2.0",
"method": "login",
"params": {
"login": "<wallet address>",
"pass": "<Usually the worker name>",
"agent": "<Usually xmrig agent>",
"algo": [
"rx/0"
]
}
}
图 14:登录请求示例;匹配模式可以提高检测的准确性
结论
为更好地保护我们的客户和大众,Akamai 研究人员将继续致力于揭露恶意活动及其背后的攻击者,并且识别入侵指标。
在加密货币挖矿程序博文系列三部曲的第二部分中,我们展示了多种技术来揭示有关各种活动的更多信息,包括识别挖矿代理背后的矿池或通过分析加密货币挖矿程序僵尸网络随时间变化的哈希率来定位活动的地理位置运作等。
我们发现了利用 Zephyr 以及知名的门罗币的恶意加密货币挖矿程序。通过使用不同的挖矿拓扑结构,加密货币挖矿程序能够隐藏信息并最大限度地减少识别和入侵指标的数量。
在了解了不同加密货币挖矿程序的构成以及一般的挖矿过程之后,一个问题随之而来:我们能否停止加密货币挖矿程序僵尸网络的挖矿操作?有效地停止挖矿操作将关闭感染受害者机器并消耗其资源的加密货币挖矿程序。我们将在本系列的最后一部分中探讨此问题。