Linux rootkit 排查思路总结

1次阅读

Linux rootkit 排查思路总结

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 获取地址,再通过自定义模块或 volatilitylinux_check_syscall 插件,验证关键函数(如 sys_getdents64sys_openat指针是否指向异常地址
  • VFS 层隐藏:若 ps auxls /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 定位可疑进程;注意名称伪装成 kthreaddcryptosshd(但非 root 用户启动)等
  • SSH 后门痕迹:检查 /root/.ssh/authorized_keys 和各用户家目录下的同名文件;用 grep -r "ssh-rsa|ssh-ed25519" /home/*/.ssh/ 2>/dev/NULL 批量扫描;比对 /var/log/secure 中成功登录 IP 与业务白名单是否一致
  • 定时任务与启动项:检查 crontab -lsudo crontab -l/etc/crontab/etc/cron.d/*;查看 systemctl list-unit-files --state=enabled 中非系统服务项;检查 /etc/init.d/ 下可疑脚本
text=ZqhQzanResources