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

chkrootkit 是轻量、无依赖的 rootkit 初筛工具,但它不等于“查完就安心”——它只检测已知签名和典型行为模式,对 LD_PRELOAD 劫持、内核模块动态注入、或自定义 syscall 表 patch 几乎无感。必须搭配其他手段交叉验证。
运行 chkrootkit 前必须确认权限和路径
chkrootkit 必须以 root 权限运行,否则 /proc/kcore、/dev/mem、/sbin/ 等关键路径无法读取,导致大量 TESTING 而非 INFECTED 或 not infected 结论,误判率陡增。
- 始终用
sudo chkrootkit,不要省略sudo;若提示command not found,先确认是否真已安装:which chkrootkit - 某些最小化系统(如 Alpine、部分容器镜像)默认不含 chkrootkit,需手动编译或换用
rkhunter - 避免在挂载了 noexec 的文件系统(如
/tmp)中执行,chkrootkit 会尝试释放临时二进制并执行,Permission denied错误会导致跳过关键测试项
读懂输出里真正危险的三类标记
INFECTED 是最高优先级信号,但不是唯一依据;WARNING 和 TESTING 同样需要人工跟进,尤其当它们反复出现在同一模块(如 bindshell、sniffer、ifconfig)时。
-
INFECTED (PORTS:12345):说明检测到监听端口的隐藏后门进程,立刻用ss -tulpn | grep :12345和lsof -i :12345双向确认 PID,再查/proc/PID/exe -
WARNING: promiscuous mode detected:网卡混杂模式开启,可能为嗅探器,检查ip link show | grep PROMISC,比对物理网卡是否应有此模式 -
TESTING大量出现(尤其在chkwtmp、chklastlog模块):往往因日志文件被清空、wtmp/lastlog权限异常或被硬链接替换,需手动运行ls -l /var/log/wtmp /var/log/lastlog和stat /var/log/wtmp
chkrootkit 不报错 ≠ 系统干净
它不校验二进制哈希、不扫描内存、不解析内核模块符号表,因此以下情况完全逃逸:
- 攻击者用
LD_PRELOAD=/tmp/.x/libc.so替换ps输出,chkrootkit 自身也会被劫持——此时它的输出本身已不可信 - 内核模块未列在
lsmod中(已被从module_list脱链),chkrootkit 的chkproc模块无法感知 - 后门程序不在
/bin、/usr/bin下,而藏在/dev/shm/.a或/proc/self/fd/123这类非常规路径,chkrootkit 默认不递归扫描 - 它不检查
/etc/ld.so.preload内容,也不验证echo $LD_PRELOAD,而这正是用户态 rootkit 最常用入口
发现可疑输出后必须做的三件事
别急着删文件或 kill 进程——先固化证据,再隔离验证。
- 立即保存完整输出:
sudo chkrootkit 2>&1 | tee /tmp/chkrootkit-$(date +%s).log - 同步运行
sudo rkhunter --check --sk(跳过键入交互),比对两者的Warning条目是否重叠;若仅 chkrootkit 报INFECTED而 rkhunter 完全静默,大概率是误报(如自定义监控 agent) - 对报出的可疑路径(如
/usr/bin/.sshd),不要直接rm,先做:ls -lai /usr/bin/.sshd、file /usr/bin/.sshd、strings /usr/bin/.sshd | head -20,再决定是否保留副本取证
真正棘手的后门往往让 chkrootkit 安静得反常——它擅长发现“显性钩子”,但对“静默脱链”或“内存马”无能为力。一旦怀疑深度入侵,优先抓内存快照(volatility 或 LiME),再回溯 /proc/[0-9]*/ 底层数据,而不是反复跑 chkrootkit。










