chkrootkit是轻量级rootkit初筛工具,仅检测已知签名和典型行为,对ld_preload劫持、内核模块脱链等高级手法无效,必须以root权限运行并配合rkhunter、内存分析等交叉验证。

chkrootkit 不是“一跑就出结论”的工具,它只对已知签名和典型行为敏感;没报 INFECTED 不代表安全,大量 TESTING 或 WARNING 同样要人工深挖。
必须用 root 权限运行,否则关键检测全失效
chkrootkit 要读 /proc/kcore、/dev/mem、/sbin/ifconfig 等路径,非 root 会跳过或返回 TESTING——这不是“测试中”,而是“无法测”。
- 永远用
sudo chkrootkit,别试普通用户执行 - 若提示
command not found,先确认是否真装了:which chkrootkit - Alpine、部分容器镜像、最小化 CentOS 安装默认不带,得手动编译或换
rkhunter - 别在挂了
noexec的分区(如/tmp)里执行,它会释放临时二进制并尝试执行,Permission denied直接导致关键模块(如chkproc)跳过
看懂三类输出:INFECTED、WARNING、TESTING 各代表什么
INFECTED 最危险,但不是唯一线索;WARNING 和 TESTING 出现在同一模块(比如反复在 bindshell 或 sniffer)时,必须人工跟进。
-
INFECTED (PORTS:12345):立刻查监听进程:ss -tulpn | grep :12345和lsof -i :12345,再定位/proc/PID/exe -
WARNING: promiscuous mode detected:说明网卡开了混杂模式,运行ip link show | grep PROMISC,比对是否应有此模式(如抓包服务器除外) -
TESTING大量出现在chkwtmp、chklastlog:大概率是/var/log/wtmp或/var/log/lastlog被清空、权限异常或被硬链接替换,手动检查:ls -l /var/log/wtmp /var/log/lastlog和stat /var/log/wtmp
chkrootkit 完全检测不到的几类后门
它不校验哈希、不扫内存、不解析内核模块符号表,以下情况它默认静默:
- 攻击者设了
LD_PRELOAD=/tmp/.x/libc.so劫持ps输出,chkrootkit 自身也会被劫持——此时它的全部输出都不可信 - 内核模块已从
module_list脱链(lsmod看不见),chkproc模块完全感知不到 - 后门藏在
/dev/shm/.a、/proc/self/fd/123这类非常规路径,chkrootkit 默认不递归扫描 - 它不检查
/etc/ld.so.preload内容,也不验证echo $LD_PRELOAD,而这正是用户态 rootkit 最常用入口
发现可疑输出后必须做的三件事
别只盯着 chkrootkit 输出做判断,它只是初筛。真正有效的响应必须交叉验证:
- 立刻用
rkhunter --check补扫:它校验二进制哈希、检查/etc/ld.so.preload、验证内核模块 LKM,和 chkrootkit 形成互补 - 手动查可疑端口和进程:
ss -tulpn、ps auxf --forest、lsmod、dmesg | tail -50 - 快照当前状态:用
btrfs subvolume snapshot或虚拟机冷快照保存证据,后续所有分析都在副本上进行,避免污染原始痕迹
真正难处理的从来不是 INFECTED 那一行,而是 TESTING 反复出现却找不到日志异常、WARNING 提示混杂模式但物理网卡又确实该开——这种模糊地带,才是 rootkit 隐蔽性最顽固的体现。











