记一次真实的LKMrootkit与挖矿病毒的结合应急案例

admin 2026-05-27 04:51:11 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录了一次真实应急响应案例,攻击者结合LKMrootkit(Diamorphine)与挖矿病毒入侵服务器。rootkit通过kill信号实现进程隐藏/显示(-63)和提权(-64)功能,挖矿程序使用Golang编写,配置文件中包含Zephyr钱包地址和nanopool矿池信息。分析揭示了恶意软件通过rootkit隐藏进程、清除日志、使用SSL加密通信等技术细节,并提供了应急排查命令(如kill-630解除隐藏)。 综合评分: 80 文章分类: 应急响应,恶意软件,红队,内网渗透,漏洞分析


cover_image

记一次真实的LKM rootkit 与挖矿病毒的结合应急案例

vlan911 vlan911

只会看监控的实习生

2026年1月3日 00:00 广东

在小说阅读器读本章

去阅读

故事背景来源于群友的一次应急响应,客户数十台服务器均中招挖矿木马,服务器占用异常但是排查的时候却没有办法直接查到是什么原因,最后发现是rootkit,当然了有人可能会说这不算,仁者见仁吧

简单复盘:

首先当然是上图,在服务器执行top指令,未发现系统资源占用异常

细心的基友应该已经看见cup最上面是99了,但是看不见是哪个进程,在执行下述指令之后,重新执行top指令,就又看到了占用异常的进程

kill -630lsmod rmmod x11

此时可以看到,python3进程存在异常,此进程很明显是被挂东西了,放到vt里一查,挖矿的无疑了

好胸弟对此有个疑问,就是为什么是kill -63 0,这个东西是从什么地方来的?于是好胸弟把样本拷贝后进行分析

主要关注x11.ko这个文件

从第一张图就发现了,挖矿的大哥直接用的github上开源的东西

https://github.com/m0nad/Diamorphine

从第二张图就看到了实现功能,可以看到,多个分支语句用来实现不同功能,kill -63 实现自身隐藏与显现;kill -31 pid 用来隐藏或显示用户启动的进程;kill -64 是用来提权的

本地试验了一下,根据github的说明,Linux Kernels 2.6.x/3.x/4.x/5.x/6.x (x86/x86_64 and ARM64) 版本均可以使用,根据实验发现,该rootkit小工具需要根据目标设备内核去生成(实验部分使用的是github上面的)

可以看见,安装成功后,rootkit是自动隐藏的,接下来尝试一下隐藏用户进程

执行kill -31 1919后,再次执行ps -aux,已经看不到进程了

再次执行kill -31 1919后,又看到了进程

而后执行kill -63 0发现,恶意的文件可以看见了

由于恶意进程python3本身是没有隐藏能力的,是基于rootkit工具实现隐藏,所以一般直接将他去除掉,隐藏也就直接失效了,这样即使不知道被隐藏的进程pid是什么,也能去掉隐藏效果

并且在本地还发现了攻击者用来日志清除的工具

功能非常多

github项目如下,大家感兴趣自己看看就行

https://github.com/infinite-horizon219/mig-logcleaner-resurrecte

后续python3挖矿木马分析:

为了保证客户环境的稳定性,在将python3 挖矿样本迁移后,在本地进行测试,尝试执行后结果如下:

翻译过来就是:

2025年8月14日 07:31:10:配置文件中不包含任何钱包或它们无效!

2025年8月14日07:31:10:以太坊挖矿的最小配置文件是“wallet=<你的以太坊钱包>

2025年8月14日 07:31:10:以太坊挖矿的最小命令行选项是“-wallet<你的以太坊钱包>”

2025年8月14日 07:31:10:请参阅ReadMe文档以获取详细信息。

而后在客户服务器发现config.ini文件

配置文件解析

  • **wallet**

  • 作用

    :矿工的钱包地址

  • ZEPHYR2smB5JfBY2WKW8GF3eMvCHE5QeLQBKj77jmJtPhSfJWg9L4PPAiv7kpqQXu29NXKD7iK76CZBXDtpf95rWcAxeE1L81GG44

  • 说明

    :该地址疑似属于 Zephyr/XMR 区块链

  • **rigName**

  • 作用

    :矿机的标识名称,用于在矿池中区分不同设备

  • node17

  • 说明

    :矿池后台可据此监控每台设备的算力、在线状态等

  • **email**

  • 作用

    :可选字段,通常用于接收矿池通知

  • 示例值

    :空值

  • **pool1**

  • 作用

    :主矿池地址及端口

  • 功能开关参数

| | | | | — | — | — | | 参数 | 值 | 作用 | | noLog | true | 禁用日志输出(减少磁盘占用,但不利排查问题)。 | | autoUpdate | false | 禁用软件自动更新(保持版本稳定)。 | | sortPools | false | 不自动切换矿池(仅使用 pool1)。 | | useSSL | true | 启用 SSL/TLS 加密通信(防止算力提交被窃听) | | protocol | JSON-RPC | 使用 JSON-RPC 协议(主流挖矿通信协议,如以太坊、Zephyr) |

配置文件用途总结

  • 所属软件

    :基于 RandomX 算法的挖矿软件(如 XMRig、Zephyr 官方矿工),用于挖掘 Monero(XMR)或 Zephyr(ZEPH)等虚拟币

  • 核心目标

  1. 将矿机算力定向提交至指定矿池(pool1)。
  2. 挖矿收益自动发放至配置的钱包地址(wallet)。
  3. 通过加密通信(useSSL=true)保障数据传输安全。

而后在用户机器上收集到下述文件

样本局部特征

继续分析python3样本,发现矿池地址 xmr-eu1.nanopool.orgxmr-eu2.nanopool.orgxmr-jp1.nanopool.org

该地址具备以太坊门罗币标准特征xmr-euxxx,也从侧面应征,该样本目标为以太坊门罗币

继续分析python3样本,发现该样本存在MinerClient ,并且实际上该工具采用Golang编写

而后在后续发现程序利用golang语言的高并发优势,初始化挖矿配置 → 绑定矿工参数 → 通过Goroutine启动挖矿任务,实现了挖矿的全部流程

而后发现了疑似解析动态矿池地址的域名解析函数

使用github.com/miekg/dns.IsFqdn检查域名是否为完全限定域名

下述模块为矿池连接器(Pool Connector)模块中的连接建立函数,该模块主要作用疑似为: 调用 net_ParseIP直接解析输入地址 、 通过 main_poolconnector_ResolveIP解析域名 、 循环遍历所有解析到的IP地址 、 对每个地址调用 main_poolconnector_doConnect尝试连接

而后在测试python3样本的时候,也能证明此处的应用

暂时就到这吧,样本134mb,分析起来实在是成本高

原文:https://forum.butian.net/share/4491


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:只会看监控的实习生 vlan911 vlan911《记一次真实的LKM rootkit 与挖矿病毒的结合应急案例》

评论:0   参与:  0