Panchan 的矿机:全新 Go 语言编写的对等僵尸网络来袭
作者:Stiv Kupchik
执行摘要
Akamai 安全研究人员发现新型对等连接僵尸网络和 SSH 蠕虫 Panchan,该恶意软件于 2022 年 3 月出现,此后一直在入侵 Linux 服务器。
Panchan 使用 Go 语言编写,利用内置并发功能最大限度地提高传播能力,并执行恶意软件模块。
除大多数蠕虫中常见的“基本”SSH 字典式攻击外,这种恶意软件还通过收集 SSH 密钥实现横向移动。
Akamai 安全研究人员设法访问了该恶意软件的通信协议及其管理面板,并利用这些信息分析其感染范围。
教育业受 Panchan 侵害较为严重,仅次于电信/VPS。我们认为,学术机构之间的协作可能造成 SSH 密钥在不同网络间共享,或许这就是教育业在受害名单上排名较高的原因。Akamai 安全研究人员追踪了与每个受害者 IP 地址关联的滥用电子邮件。
为逃避检测、降低可追溯性,该恶意软件会以内存映射文件形式在受害系统中植入加密挖矿软件,在磁盘上不留踪迹。如果它检测到任何进程监控机制,还会强制终止加密挖矿软件进程。
根据该恶意软件的活动、受害者的地理位置、管理面板所用语种以及攻击者的 Discord 用户活动,我们认为攻击者是日本人。
Akamai MFA 能抵御 SSH 密钥收集造成的风险。此外,该恶意软件使用非常基础的默认密码列表实现传播,因此配置高强度 SSH 密码应能阻止该恶意软件。我们还发布了可用于测试感染情况的威胁指标 (IOC)、查询、签名和脚本。
前言
Panchan 的矿机是一种功能强大的、用 Go 语言编写的僵尸网络和加密劫持程序。它采用非常直接的对等连接协议,基于 TCP 协议进行明文传输,但足以达到有效分散僵尸网络的效果。它还具有持久性,锲而不舍地发起攻击,并且能够规避监控机制。
该恶意软件内置一个“godmode”管理面板,它能编辑挖矿配置,然后将配置分散到其他对等连接设备。为防止不必要的篡改,该恶意软件要求提供私钥才能访问 godmode,随后还会使用该私钥为挖矿配置签名。此恶意软件中还包含一个公钥,用于验证用户提供的私钥。 管理面板采用日语文字,这或许提示了恶意软件制作者的地理位置。
该僵尸网络采用一种独特(或许也是创新的)方法,通过收集 SSH 密钥实现横向移动。大多数僵尸网络对随机化 IP 地址采用暴力破解或词典攻击,该恶意软件有所不同,它还会读取 id_rsa 和 known_hosts 文件以收集现有凭据,并利用这些凭据实现网络内的横向移动。
该恶意软件使用 Go 语言编写,其大多数主要逻辑均利用 Go 语言的并发功能,并以并发 Go 例程的形式运行。攻击者使用的是较新的 Go 版本,最初(2022 年 3 月)检测到的恶意软件版本使用 Go 1.17.7(发布于 2022 年 2 月)编译,目前的最新恶意软件样本则使用 Go 1.18(发布于 2022 年 3 月)编译。此外,Go 1.18 的内部数据结构有所调整,因此在线工具和 IDA 反汇编程序均无法正确解析该恶意软件,无法将其函数名称与函数指针匹配。在本系列的 附录 A:Go 逆向工程方法浅析中,我们介绍了我们解决这个问题的方法。
本报告将详细介绍该恶意软件的功能,我们检测到它的方式,以及尝试认定其归属的过程。
如需查看 IoC 列表,请访问 此处的 Github 存储库。
恶意软件活动
Akamai 安全研究团队基于我们的全球传感器网络,主动监控僵尸网络和恶意软件活动。2022 年 3 月 19 日,我们首次注意到 Panchan 的活动。该恶意软件的对等连接点通信与蠕虫式传播能力引起了我们的注意,我们由此认定有必要进一步开展调查。
在对恶意软件进行逆向工程时,我们开发了“潜入”其僵尸网络的脚本程序,团队借此收集了受感染机器(僵尸网络对等连接点)的完整列表。我们发现了 209 个对等连接点,其中 40 个目前处于活跃状态。
虽然受害目标分布在全球各地,但似乎有较多受害者集中在亚洲。
我们认定攻击者来自日本(详细说明见后文),或许这是亚洲受害目标较多的原因。这款恶意软件背后似乎并没有恶意组织的支持,攻击者更容易在自己附近、熟悉的地点发起攻击,这是合情合理的推断。
观察受害者所属行业时,大多数受害者的 IP 地址注册在其托管/VPS 平台下,所以能获得的信息不多。根据我们的监控情况,受害者最多的行业是教育业。可能原因在于密码使用习惯不佳,另一个可能的原因是该恶意软件盗用的 SSH 密钥具有独特的横向移动能力。相较于商业领域的员工,不同学术机构的研究人员相互协作的频率可能更高,并且需要身份验证凭据,以访问其机构/网络之外的机器。我们观察到,其中涉及到的一些大学处于同一个国家(如西班牙),还有一些处于同一个地区(如中国台湾和中国香港),这进一步印证了我们的假设。
恶意软件特征探索
感染媒介——SSH 蠕虫
该恶意软件能通过 SSH 进行自我传播。它通过两种方法生成目标和身份验证详情:
现有 SSH 密钥
该恶意软件会在当前用户的 HOME 目录下寻找 SSH 配置和密钥。它读取 ~HOME/.ssh/id_rsa 下的私钥,并使用它尝试验证在 ~HOME/.ssh/known_hosts下找到的任何 IP 地址。这是一种新颖的凭据收集方法,目前尚未看到其他恶意软件采用这种方法。
凭据暴力破解
该恶意软件可随机化 IP 地址,并使用预先确定的用户和密码列表尝试发起字典攻击。它会在一个进程中多次生成暴力破解 Spreader,仅受操作系统设置的打开文件数量限制。用户名和密码相当简单,采用“ubuntu”“root”“user”“debian”“pi”等默认字符串的组合。
在成功通过攻击目标的身份验证后,该恶意软件将在根目录“/”下创建一个名称随机的隐藏文件夹,并使用 sftp 将自身复制到该隐藏文件夹中,将自身命名为 xinetd 。
该恶意软件随后使用 nohup,远程执行复制到目标机器上的二进制文件,并通过命令行将其传递给对等连接点列表中的各机器。 成功实施感染后,该恶意软件发起到 Discord Webhook 的 HTTPS POST 操作,其目的可能是监控受害者。
对等连接通信
该僵尸网络的对等连接通信协议相当简单。所有内容均通过 TCP 端口 1919以明文形式传输。它会在该端口上监听所有对等连接点, 并在 iptables 中创建一条允许此操作的规则。每条消息都以“pan-chan's mining rig hi!”开头,以“finish”结束。这开头和结尾之间,该恶意软件发出用换行符分隔的配置命令。我们目前只看到了两种配置选项: sharepeer 和 sharerigconfig。
sharepeer 比较直接——该选项后接一个 IP 地址,该 IP 地址随后会添加到恶意软件的内部对等连接点列表中。
sharerigconfig 后接一个 base64 编码字符串,该字符串其实是一个 JSON 结构,其中编码了挖矿配置,以及该配置的一个签名:
该签名会使用软件内部保存的公钥进行验证,确保其真实性。通信逻辑也非常简单——在与对等连接点建立连接之后,恶意软件会解析其保存在内存中的配置(恶意软件在开始执行时获取该配置),然后生成并发送消息字符串。它还会接收并解析来自连接另一方的类似消息。新对等连接点会添加到该软件的对等连接点列表中,如果配置采用较新版本,则会被覆盖。
为检查更新,该恶意软件定期连接到其保存的对等连接点列表。
Godmode 管理面板
这或许是该恶意软件中最独特的功能:其二进制文件内置一个管理面板。要启动这个管理面板,我们需要将 godmode 这个字符串作为第一个命令行参数(后接对等连接点列表),传递给恶意软件。
访问权限检查
尽管该恶意软件内置管理面板,但并不能随意访问。为了防止非预期用户访问管理面板,该恶意软件首先会要求用户提供私钥,通过验证后才允许用户访问管理面板界面。
我们没有获得必要的私钥,所以对程序进行了修补,使其可接受所提供的任何密钥,跳过密钥验证步骤(只要将一个 JZ 修改为 JMP)。
管理面板:统计信息
在提供私钥并“登录”之后,我们看到了一个有关当前配置的状态屏幕。
第一部分是对等连接点统计信息,在 godmode 启动之前,恶意软件会基于通过命令行传递的对等连接点列表(我们在分析时未提供此列表,因此这里显示“0”),与这个对等连接点通信。
第二部分是加密挖矿配置。其格式与对等连接点之间发送的挖矿配置相同,但使用的是日语文本,而非英语。这种语言变化很可能是为了方便编程——输出日文文本很容易,但解析要困难得多,正因如此,恶意软件创建者为对等连接点之间发送的配置使用的是英语。
最后,我们获得了一个菜单,其中包含如下选项:
刷新状态屏幕
输出活跃对等连接点列表
更新挖矿程序设置
退出
无文件挖矿程序
该恶意软件部署了两个挖矿程序—— xmrig 和 nbhash。这两个挖矿程序二进制文件均在恶意软件二进制文件中采用 base64 编码,将在运行时提取和执行。但其执行方法也有一定的创新性, 挖矿程序完全不会提取到磁盘上。该恶意软件使用 UNIX 函数 memfd_create 创建一个内存映射文件,其中包含挖矿程序的二进制文件内容,从而达到直接在内存中执行、不留可追踪文件系统路径的目的。我们从该僵尸网络中多个不同的对等连接点提取了配置,根据观察,该恶意软件似乎为其矿池和加密货币钱包使用了 NiceHash 。 NiceHash 钱包并非区块链加密货币钱包,因此 我们无法查看其交易和挖矿详情,也无法衡量其实际收入。
反强制终止
该恶意软件会捕获系统发送给它的 Linux 终止信号(特别是 SIGTERM - 0xF 和 SIGINT - 0x2),并忽略这些信号。这加大了终止恶意软件的难度(虽然并非全无可能),原因在于 SIGKILL 未得到处理(因为不可能处理,请参见 POSIX 标准第 313 页)。
反监控
该模块在内部的名称是 antitaskmanager(意为反任务管理器),但它并不会干扰任务管理器的操作,这与其名字不符。该恶意软件会不断寻找 top 和 htop进程。一旦发现这些进程,它就会终止正在运行的挖矿程序进程。
持久性
该恶意软件将自身复制到 /bin/systemd-worker 并创建一个同名 systemd 服务。其目的可能是模仿合法的 systemd 服务,以减少怀疑,避免因此受到调查。
归属研究
在验证私钥时,godmode 面板会显示一个额外的屏幕。
其版权声明相当值得关注,其中既提到了 Panchan,还提供了实际 Discord 服务器!检查这个链接时,我们发现似乎真的可以加入那个服务器,也获得了 Panchan 使用的实际 Discord 用户名。我们认为,恶意软件在成功建立 SSH 连接后,会向这个服务器进行报告。
我们加入了该服务器,希望借此找到攻击者的相关信息,我们看到了恶意软件在感染流中发送的 Discord 通知。但我们没有任何发现,其中没有任何主要聊天内容,只有另一名成员在三月发出的一条问候。我们没能看到聊天内容的原因或许在于,仅有服务器中拥有较高特权的成员才能看到其他聊天内容。我们找到的唯一有用的信息是,该服务器创建于 2022 年 3 月初,与我们首次观察到该恶意软件的时间非常接近。
在研究该用户的其他活动时,我们还发现此攻击者在 Privex(一个 VPS 服务提供商)的 Discord 服务器上活跃度较高。
除了普通 VPS,Privex 还提供预装区块链节点软件的虚拟机。这可能表示攻击者利用这些虚拟机来托管自己的服务器,也有可能将其虚拟机作为加密劫持的目标。
检测和抵御
为协助检测,我们创建了一个 存储库 ,其中包含 IOC、Yara 和 Snort 签名,可用于执行感染测试。我们还开发了一个可在虚拟机上运行的 bash 脚本。它会寻找以下 Panchan 迹象:
systemd-worker 进程
xinetd 进程(如果其运行路径不是 /bin 或 /sbin)
监听 TCP 1919 端口的进程
此外,通过 TCP 3380 和 3387 端口传出的通信流量可能会发往加密矿池。
针对希望采取主动措施,保护自身网络安全的读者,我们有如下建议:
使用高复杂度的安全密码。该恶意软件使用极其有限的默认用户名和密码组合,任何生产用途的机器都不应该使用这些组合。创建高强度密码可以显著降低恶意软件的影响。
尽可能配置 MFA。使用 MFA 可防止任何未经授权的登录尝试。Akamai 的 MFA 产品也有助于抵御 SSH 密钥收集。
尽可能为网络分段。尽管通过 SSH 向互联网开放机器是合情合理的做法,但明智的举措是控制允许哪些用户/设备从互联网连接到这些机器,以及允许外部用户连接到网络内的哪些用户/设备。配置这些访问控制措施可以减少遭入侵机器对网络的负面影响,也可以缩小整体攻击面。
监控虚拟机的资源活动。这种僵尸网络的最终目标是加密劫持,它会将机器的资源使用率推高到不正常的水平。持续监控能帮您及时注意到可疑活动。对于 Panchan 恶意软件,资源使用情况监控也能彻底终止加密挖矿。
附录 A:Go 逆向工程方法浅析
Go 可执行文件采用静态编译方式,也就是说,该可执行文件的所有依赖项都直接编译到二进制文件中。因此该恶意软件存在许多具有大量函数的二进制文件(仅供参考,我们的恶意软件大小为 30MB,约有 3700 个函数)。
Go 提供了一个 pclntab 结构来协助堆栈追踪,可以匹配二进制文件内的函数名和指针。即便剥离的二进制文件中也有这个结构,所以我们可以用它来寻找函数名称。
在 Go 1.18 中,这种结构发生了变化。以前它保存指向二进制文件中的位置的指针,现在保存的则是相较于特定位置的偏移量——函数指针现在代表的是相较于第一个 Go 函数的偏移量(在上图中,带有 text_start 注释的 pcln 结构指出了这一点),名称指针则代表相较于函数名称数组开头处的偏移量,另外有一个保存函数数据的数组,基于偏移量引用这两类指针。