
linux Rootkit 排查不能只靠一个工具或一步操作,得从用户态到内核态分层推进,兼顾自动扫描和人工验证。核心思路是:找异常、验一致性、溯加载路径、查持久化痕迹。
用户态隐藏行为排查
多数Rootkit先在用户空间下手,手法直接但易留痕:
- 系统命令被替换:用
ls -la /bin/ps /usr/bin/top /bin/ls查看文件大小、时间戳、inode 是否异常;对比sha256sum与可信镜像或 AIDE 数据库中的哈希值 - 环境变量劫持:检查
/etc/profile、/etc/profile.d/*.sh、/etc/bashrc中是否追加了别名(alias)或覆盖了命令路径(如alias ps='/tmp/.x/ps') - LD_PRELOAD 或 /etc/ld.so.preload:运行
echo $LD_PRELOAD;查看cat /etc/ld.so.preload是否非空;再用ldd $(which ps)确认实际加载的共享库链 - /proc 下的挂载隐藏:执行
cat /proc/$$/mountinfo | grep '/proc/[0-9]+',重点看是否有bind类型挂载指向/tmp、/dev/shm或隐藏目录;再用ls -lai /proc/[0-9]*找大小为 0 或明显偏小的 PID 目录
内核态隐蔽痕迹检测
内核级Rootkit更难发现,需借助内存分析或系统底层比对:
- 模块隐藏:运行
lsmod后,再对比ls /sys/module/ | wc -l,若后者显著更多,说明有模块被从链表中摘除;同时检查dmesg | grep -i 'module|insmod'是否有可疑加载记录 - 系统调用表劫持:使用
cat /proc/kallsyms | grep sys_call_table获取地址,再通过自定义模块或volatility的linux_check_syscall插件,验证关键函数(如sys_getdents64、sys_openat)指针是否指向异常地址 - VFS 层隐藏:若
ps aux和ls /proc显示不一致,或find /proc -maxdepth 1 -name '[0-9]*' | wc -l远少于ps -eo pid= | wc -l,很可能存在 VFS 层脱链或目录项过滤
自动化工具交叉验证
单一工具可能漏报或误报,建议组合使用并关注输出细节:
- rkhunter:首次运行后必须执行
sudo rkhunter --propupd初始化文件属性库;后续用sudo rkhunter -c --enable all --disable none全面扫描,重点看/var/log/rkhunter.log中 “Warning” 和 “Suspicious” 条目 - chkrootkit:轻量快速,适合初筛;注意它不依赖特征库更新,但对新型劫持(如 LD_PRELOAD + 自定义 so)检出率有限;若输出含 “INFECTED” 或 “TESTING”,需人工跟进对应进程或文件
- AIDE:部署越早越好;在系统干净时运行
sudo aide --init,生成基线;之后定期sudo aide --check,重点关注/bin、/usr/bin、/sbin、/usr/sbin下命令是否被修改
辅助线索与上下文印证
很多Rootkit会伴随其他入侵迹象,结合排查能提高命中率:
- 异常高CPU或内存占用:用
top -b -n1 | head -20快速抓取,再用ps -eo pid,ppid,comm,%cpu,%mem --sort=-%cpu | head -10定位可疑进程;注意名称伪装成kthreadd、crypto、sshd(但非 root 用户启动)等 - SSH 后门痕迹:检查
/root/.ssh/authorized_keys和各用户家目录下的同名文件;用grep -r "ssh-rsa|ssh-ed25519" /home/*/.ssh/ 2>/dev/NULL批量扫描;比对/var/log/secure中成功登录 IP 与业务白名单是否一致 - 定时任务与启动项:检查
crontab -l、sudo crontab -l、/etc/crontab、/etc/cron.d/*;查看systemctl list-unit-files --state=enabled中非系统服务项;检查/etc/init.d/下可疑脚本