Featured image of post CentOS 7 磁盘清理与木马排查实战

CentOS 7 磁盘清理与木马排查实战

一次 CentOS 7 服务器从 91% 到 66% 的磁盘清理实战,顺带揪出潜伏近 3 个月的 root 权限木马,并建立每日自动巡检。

字数: 2665

CentOS 7 磁盘清理与木马排查实战

一次从 91% 到 66% 的救盘经历,顺带揪出一个潜伏近 3 个月的 root 权限木马,并建立每日自动巡检。

背景

一台京东云的 CentOS 7 服务器,40G 系统盘,某天发现磁盘使用率飙到 91%,只剩 3.7G。登录排查后,不仅清出了 9G 空间,还发现了一个潜伏两个多月的恶意程序。

本文完整记录整个过程:定位空间 → 清日志 → 发现木马 → 清除 → 全面排查后门 → 二次清理 → 建立自动巡检。


一、定位空间占用

1.1 看分区使用率

df -h

输出:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   34G  3.7G  91% /
overlay          40G   34G  3.7G  91% /var/lib/docker/overlay2/.../merged

有 overlay 挂载,说明装了 Docker,可能是个隐藏大头。

1.2 逐层钻取

du -h --max-depth=1 / 2>/dev/null | sort -rh | head -20

结果:

目录占用
/usr16G
/tmp5.1G
/var4.4G
/root4.1G
/www1.4G
/opt1.2G
/home1.2G
/.Recycle_bin635M

/tmp 5.1G 很反常,继续查:

du -h --max-depth=1 /tmp 2>/dev/null | sort -rh | head -10

发现 /tmp/logs 独占 5.1G,里面只有一个文件:

-rw-r--r-- 1 root root 5.1G Sep 12 20:09 remote-client.log

二、清空日志(第一波回收 5.1G)

因为文件正在被写入,不能直接 rm,要用 truncate 保留文件句柄:

truncate -s 0 /tmp/logs/remote-client.log

执行后:

/dev/vda1        40G   29G  8.8G  77% /

回收 5.1G,从 91% 降到 77%。


三、意外发现:一个 root 权限木马

清空日志后,顺手查了一下是谁在写这个文件:

lsof /tmp/logs/remote-client.log

输出:

COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
lcsys   924 root    3w   REG  253,1        0 1580792 /tmp/logs/remote-client.log

一个叫 lcsys 的进程,可执行文件在 /tmp/lcsys,以 root 权限运行。继续查:

ps -fp 924
# root 924 1 0 Jun15 ? 00:12:05 /tmp/lcsys
  • PPID = 1:由 systemd 拉起
  • STIME = Jun15:已经跑了将近 3 个月
  • 路径 = /tmp:正常系统服务不可能放临时目录

查 systemd 服务:

systemctl status remote-client.service
● remote-client.service - Remote Client Service
   Loaded: loaded (/etc/systemd/system/remote-client.service; enabled)
   Active: active (running) since Mon 2026-06-15 12:48:27 CST; 2 months 28 days ago
 Main PID: 924 (lcsys)
   CGroup: /system.slice/remote-client.service
           └─924 /tmp/lcsys

结论:/tmp/lcsys 是恶意程序,已通过 systemd 服务 remote-client.service 实现持久化。

lcsys 这个名字与安全圈记录的 Linuxsys 挖矿木马高度相关,通常通过非官方渠道的宝塔面板安装包捆绑传播,会定时对外攻击并上传服务器信息。


四、清除木马

4.1 先断外连(防止数据外泄)

iptables -A OUTPUT -m state --state NEW -j DROP

4.2 停用并删除恶意服务

systemctl stop remote-client.service
systemctl disable remote-client.service
rm -f /etc/systemd/system/remote-client.service
systemctl daemon-reload
systemctl reset-failed

输出确认:

Removed symlink /etc/systemd/system/multi-user.target.wants/remote-client.service.

4.3 删除恶意文件

rm -f /tmp/lcsys
ls -lh /tmp/lcsys
# ls: cannot access /tmp/lcsys: No such file or directory

4.4 恢复网络

之前加的 DROP 规则会拦截所有出站新连接,排查完要删掉:

# 先看行号
iptables -L OUTPUT -n --line-numbers

# 按行号删除 DROP 规则(注意行号会变,以实际为准)
iptables -D OUTPUT 4

# 确认网络恢复
ping -c 2 download.bt.cn

五、全面排查后门

木马清掉了,但它以 root 权限跑了近 3 个月,必须排查有没有其他持久化后门。

5.1 检查动态链接库预加载

cat /etc/ld.so.preload
# No such file or directory ✅

5.2 检查 shell 启动脚本

cat /root/.rc /root/._profile /root/.profile
cat /etc/profile /etc/rc /etc/rc.local

均为标准内容,只有自己加的 PATH 和别名 ✅

5.3 检查计划任务

crontab -l
cat /etc/crontab
ls -la /etc/cron.* /var/spool/cron/

均为自己的任务和系统自带任务 ✅

5.4 检查 systemd 服务

systemctl list-units --type=service --all | grep -vE "systemd|dbus|network|ssh|chrony|crond|firewalld|auditd|tuned|postfix|rsyslog"
ls -la /etc/systemd/system/

确认了所有自定义服务都是自己装的(music、filebrowser、frps、nps、giftbook 等),京东云 agent(ifritd、jdog_service)也正常 ✅

5.5 检查临时目录

ls -la /tmp/ /dev/shm/ /var/tmp/

只有 systemd 私有目录,无陌生文件 ✅

5.6 检查陌生外连

ss -antp | grep ESTABLISHED
# 无输出 ✅

木马已彻底断掉。

5.7 检查系统命令完整性

rpm -Va --nomtime --nosize --nolinkto 2>/dev/null | grep -E "^..5|missing" | head -30

输出全是 .conf 配置文件(正常,改过配置就会有标记)和自装软件,ls、ps、ss、netstat 等核心命令未被替换 ✅

5.8 检查 SSH 公钥

cat /root/.ssh/authorized_keys
ssh-keygen -lf /root/.ssh/authorized_keys

发现两条公钥,需确认是否都是自己的:

SHA256:mVFPq49gJxn3yJWeNsFrgciHoETdIKGmoCs root@lavm-yrho5n20fc (ED25519)
SHA256:lAu+ZvIKU+0yi2BHnKzdLVnrwwTBSVJ4 root@lavm-yrho5n20fc (ED25519)

5.9 检查可疑用户

cat /etc/passwd | grep -v nologin

确认所有用户都是自己的(root、tkyu、redis)✅


六、第二波清理:继续挖空间

木马清完,继续挖磁盘。逐层分析后找到这些可清项:

# 1. 日志(/var/log 1.7G)
journalctl --vacuum-size=200M
find /var/log -type f -name "*.gz" -delete
find /var/log -type f -name "*.1" -delete

# 2. yum 缓存(/var/cache 1004M)
yum clean all
rm -rf /var/cache/yum/*

# 3. pip/npm 缓存(/root/.cache 875M)
rm -rf /root/.cache/pip/* /root/.cache/npm/*

# 4. 回收站
rm -rf /.Recycle_bin/*

# 5. 源码包(装完就没用,约 1.2G)
rm -rf /root/Python-3.12.9 /root/Python-3.10.8
rm -rf /root/git-2.34.0 /root/redis-7.2.4
rm -rf /root/sqlite-autoconf-3450200 /root/nginx-1.21.4

# 6. 宝塔残留备份(已不用宝塔)
rm -rf /www/backup/panel /www/backup/oldData

# 7. 反复重启的 Docker 容器
docker stop flare && docker rm flare && docker rmi soulteary/flare

大文件分布(清理前)

路径大小判断
/usr/local/music_player/music9.2G音乐库,核心数据,保留
/root/data_analyst_rag1.1G自己的项目
/opt/files/图书馆701M自己的资料
/home/git/blog.git688MGit 仓库
/www/backup375M含宝塔残留,可清

最终结果:

/dev/vda1        40G   25G   14G  66% /

从 91% 到 66%,总共回收约 9G。


七、防止再次涨满:整理 crontab

清理完后,配置定时任务防止日志再次涨满,并加入每日安全巡检。

7.1 最终版 crontab

# filebrowser 数据库备份
0 3 * * * cp /etc/filebrowser/filebrowser.db /backup/filebrowser_$(date +\%Y\%m\%d).db

# 音乐同步
0 2 * * * /usr/local/music_player/music_sync.sh >> /var/log/music_sync_cron.log 2>&1

# 清空 /tmp/logs 日志(防止涨满)
30 3 * * * [ -d /tmp/logs ] && find /tmp/logs -name "*.log" -exec truncate -s 0 {} \; 2>/dev/null

# 每日安全巡检
0 8 * * * /root/check.sh >> /var/log/daily_check.log 2>&1

7.2 巡检脚本 /root/check.sh

#!/bin/
echo "===== $(date) ====="
echo -n "lcsys: "; ls /tmp/lcsys 2>/dev/null || echo "OK: not found"
echo -n "外连: "; /usr/sbin/ss -antp | grep ESTABLISHED || echo "OK: none"
echo -n "磁盘: "; df -h / | tail -1
echo "高CPU:"
ps aux --sort=-%cpu | head -5

7.3 关键坑:crontab 的 PATH 问题

第一次自动执行时报错:

/root/check.sh: line 6: ss: command not found

原因:crontab 执行时 PATH 与登录 shell 不同,默认只有 /usr/bin:/bin,而 ss 在 /usr/sbin/。

解决:脚本里用绝对路径 /usr/sbin/ss。

7.4 首次巡检结果

===== Sat Sep 12 20:43:42 CST 2026 =====
lcsys: OK: not found
外连: OK: none
磁盘: /dev/vda1        40G   25G   14G  66% /
高CPU:
root 1313 ... /usr/local/share/jcloud/jdog-monitor/.../jdog-kunlunmirror
mysql 1491 ... /usr/sbin/mysqld
root 19168 ... sshd: root [priv]

7.5 查看巡检记录

grep -E "lcsys|外连|磁盘" /var/log/daily_check.log

八、经验总结

磁盘清理要点

操作风险建议
rm 正在写入的日志进程不释放空间用 truncate -s 0 或 >
rm -rf /tmp/*可能影响运行中的程序先 ls 确认
删旧内核可能删掉当前内核至少保留 1 个
docker system prune -a会删未使用的镜像先 docker images 确认
删源码包可能误删运行版本确认运行版本在 /usr/local/ 下

排查木马要点

  1. 看进程路径:正常服务不会放 /tmp、/dev/shm
  2. 看启动时间:异常长时间运行的陌生进程要警惕
  3. 看持久化:systemctl、crontab、rc.local、authorized_keys 都要查
  4. 看命令完整性:rpm -Va 校验系统命令有没有被替换
  5. 看外连:ss -antp | grep ESTABLISHED 找陌生 IP
  6. 看预加载:/etc/ld.so.preload 是隐藏进程的常用手段

crontab 踩坑

  • PATH 不同:crontab 默认 PATH 只有 /usr/bin:/bin,用到 /usr/sbin 下的命令要写绝对路径
  • grep 抓不到结果:脚本输出用 echo -n "标题: "; 命令 格式,让结果跟标题同一行

安全建议

  • 软件从官方渠道下载,非官方安装包可能捆绑木马
  • 一旦确认 root 级别入侵,最安全的做法是备份数据后重装系统
  • 日常用巡检脚本监控关键指标,早发现早处理

九、最终状态

项目状态
磁盘空间91% → 66%,回收约 9G
木马 lcsys / remote-client已彻底清除
后门排查预加载、cron、systemd、rc.local、SSH、命令完整性 全部干净
自动清理每天 3:30 清 /tmp/logs
自动巡检每天 8:00 记录到 /var/log/daily_check.log
巡检脚本已修复 PATH 问题

结语

这次排查从磁盘告警开始,最终清出 9G 空间,并清除一个潜伏近 3 个月的 root 权限木马,还顺手建立了每日自动巡检。

磁盘清理和入侵排查往往是连在一起的——异常的大日志、陌生的进程、莫名的外连,都可能是同一个问题的不同表现。

保持警惕,定期巡检,才能让服务器稳定运行。

发布了 13 篇文章 | 共 43.6K 字 | 总访客数: Loading | 总访问量: Loading
Hugo theme Stack designed by Jimmy | 黔ICP备2025049100号-1