本文目录导读:

检测Rootkit后门是一个深度安全议题,Shell脚本虽然无法检测所有高级Rootkit(如内核级Hook),但可以作为一个低成本、快速扫描的初始防线。
以下是一个分层的Shell脚本检测框架,包含常见后门文件、隐藏进程、可疑网络连接、LD_PRELOAD劫持等维度的检测逻辑。
核心检测脚本
#!/bin/bash
# rootkit_detector.sh - 简易Rootkit/后门检测脚本
# 用法: sudo bash rootkit_detector.sh
echo "========================================"
echo " Rootkit & Backdoor Scanner "
echo "========================================"
# ------------------------------
# 1. 检测隐藏进程(对比 /proc 与 ps)
# ------------------------------
echo "[*] 检查隐藏进程..."
declare -A proc_dirs
for pid in /proc/[0-9]*; do
pid_num=$(basename "$pid")
proc_dirs[$pid_num]=1
done
for pid in $(ps aux | awk '{print $2}' | tail -n +2); do
if [[ -z "${proc_dirs[$pid]}" ]]; then
echo " [!] 可能的隐藏进程: PID=$pid (存在于ps但不在/proc)"
fi
done
# ------------------------------
# 2. 检查LD_PRELOAD劫持
# ------------------------------
echo "[*] 检查 LD_PRELOAD 劫持..."
ld_preload_val=$(cat /etc/ld.so.preload 2>/dev/null)
if [[ -n "$ld_preload_val" ]]; then
echo " [!!!] LD_PRELOAD 被设置: $ld_preload_val"
echo " 这是高危信号,常见于Zeus、Jynx等Rootkit"
fi
# ------------------------------
# 3. 检测异常网络连接(端口绑定与反向连接)
# ------------------------------
echo "[*] 检测可疑网络连接..."
# 列出所有监听端口
ss -tlnp 2>/dev/null | while read line; do
port=$(echo "$line" | awk '{print $4}' | awk -F: '{print $NF}')
process=$(echo "$line" | awk '{print $NF}')
# 检查非常见端口(非80/443/22/3306等白名单端口)
if [[ "$port" =~ ^[0-9]+$ ]] && [[ "$port" -gt 1024 ]] && [[ "$port" != 3306 ]]; then
if [[ -n "$process" ]]; then
echo " [!] 非标准端口监听: $line"
echo " (可能的后门进程: $process)"
fi
fi
done
# 检查反向连接(ESTABLISHED状态且目标端口为非标准)
echo "[*] 检查异常外部连接..."
ss -tpn state established 2>/dev/null | while read line; do
dst=$(echo "$line" | awk '{print $4}')
dst_port=$(echo "$line" | awk -F: '{print $NF}')
# 如果连接端口是31337、1337、4444等常见后门端口
if [[ "$dst_port" =~ ^(31337|1337|4444|5555|6666|12345|54321)$ ]]; then
echo " [!!!] 检测到常见后门端口连接: $line"
fi
done
# ------------------------------
# 4. 检查异常内核模块
# ------------------------------
echo "[*] 列出加载的内核模块(检查隐藏模块)..."
lsmod | grep -v "^Module" | while read line; do
modname=$(echo "$line" | awk '{print $1}')
# 常见Rootkit模块名关键词
if echo "$modname" | grep -qiE "(hide|rootkit|backdoor|suterusu|adore|knark|phide|reptile|diamorphine)"; then
echo " [!!!] 可能的内核Rootkit模块: $modname"
fi
done
# 检查是否有隐藏模块(通过/proc/modules与lsmod对比)
echo "[*] 检查隐藏模块..."
declare -A lsmod_mods
for mod in $(lsmod | awk '{print $1}'); do
lsmod_mods[$mod]=1
done
for mod in $(cat /proc/modules 2>/dev/null | awk '{print $1}'); do
if [[ -z "${lsmod_mods[$mod]}" ]]; then
echo " [!!!] 隐藏内核模块: $mod (出现在/proc/modules但lsmod不可见)"
fi
done
# ------------------------------
# 5. 检查常见后门文件
# ------------------------------
echo "[*] 检测已知后门文件路径..."
backdoor_paths=(
"/tmp/.X11-unix"
"/usr/bin/slirp"
"/lib/libssl.so.0.9.8e"
"/usr/lib/libkeyutils.so.1.9"
"/lib/tls"
"/etc/rc.d/init.d/netd"
"/var/run/sshd.pid"
"/usr/bin/.sshd"
"/usr/local/bin/netstat"
"/usr/bin/sush"
"/etc/ssh/sshd_config.backdoor"
)
for path in "${backdoor_paths[@]}"; do
if [[ -f "$path" ]] || [[ -d "$path" ]]; then
echo " [!!!] 发现已知后门路径: $path"
fi
done
# ------------------------------
# 6. 检查cron后门
# ------------------------------
echo "[*] 检查crontab中可疑条目..."
for user in "root" "$(whoami)"; do
crontab -u "$user" -l 2>/dev/null | while read line; do
if echo "$line" | grep -qiE "(wget|curl|bash|perl|python|nc|ncat|netcat|chmod \+x|/dev/tcp)"; then
echo " [!!!] 可疑cron任务 (用户: $user): $line"
fi
done
done
# ------------------------------
# 7. 检查suid/sgid异常文件
# ------------------------------
echo "[*] 检查SUID/SGID异常文件..."
find /usr /bin /sbin /tmp /var/tmp -type f -perm -4000 -o -type f -perm -2000 2>/dev/null | while read file; do
md5=$(md5sum "$file" 2>/dev/null | awk '{print $1}')
# 已知安全SUID工具的MD5(示例)
safe_md5=("b5bb9d8014a0f9b1d61e21e796d78dcc" "d41d8cd98f00b204e9800998ecf8427e")
if [[ ! " ${safe_md5[@]} " =~ " ${md5} " ]]; then
echo " [!] 非标准SUID文件: $file"
fi
done
# ------------------------------
# 8. 检查SSH后门(authorized_keys & SSH配置)
# ------------------------------
echo "[*] 检查SSH后门..."
for user_home in /root /home/*; do
auth_key_file="$user_home/.ssh/authorized_keys"
if [[ -f "$auth_key_file" ]]; then
key_count=$(cat "$auth_key_file" | wc -l)
if [[ "$key_count" -gt 1 ]]; then
echo " [!] 用户目录 $user_home 有多个SSH公钥(可能被植入后门)"
fi
# 检查是否有已知后门公钥指纹(示例)
while IFS= read -r key; do
fingerprint=$(echo "$key" | ssh-keygen -lf /dev/stdin 2>/dev/null | awk '{print $2}')
if [[ "$fingerprint" == "SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ]]; then
echo " [!!!] 检测到已知后门公钥: $user_home/.ssh/authorized_keys"
fi
done < "$auth_key_file"
fi
done
# ------------------------------
# 9. 检查系统关键二进制是否被替换
# ------------------------------
echo "[*] 检查关键系统二进制..."
critical_bins=(
"/bin/ls"
"/bin/ps"
"/bin/netstat"
"/usr/bin/ss"
"/usr/bin/lsof"
"/usr/bin/find"
"/usr/bin/top"
"/sbin/ifconfig"
"/usr/sbin/sshd"
)
for bin in "${critical_bins[@]}"; do
if [[ -f "$bin" ]]; then
# 通过rpm/deb检查包完整性(如果系统支持)
if command -v rpm &>/dev/null; then
pkg=$(rpm -qf "$bin" 2>/dev/null)
rpm -V "$pkg" 2>/dev/null | grep "$bin" && echo " [!!!] 二进制被篡改: $bin"
elif command -v dpkg &>/dev/null; then
dpkg --verify 2>/dev/null | grep "$bin" && echo " [!!!] 二进制被篡改: $bin"
fi
fi
done
# ------------------------------
# 10. 最终提醒
# ------------------------------
echo ""
echo "========================================"
echo " 扫描完成 - 请人工确认结果 "
echo "========================================"
echo "注意:此脚本无法检测所有Rootkit(特别是内核级隐藏)"
echo "建议配合使用:chkrootkit, rkhunter, 或重装系统"
脚本关键点解析
| 检测维度 | Shell实现原理 | 检测范围 |
|---|---|---|
| 隐藏进程 | 对比/proc目录与ps输出 |
用户态Rootkit伪造 |
| LD_PRELOAD | 检查/etc/ld.so.preload |
动态链接库劫持(如Jynx) |
| 异常端口 | ss -tlnp扫描>1024端口 |
反向连接后门、持久化监听 |
| 隐藏模块 | 对比/proc/modules与lsmod |
内核模块隐藏(如Diamorphine) |
| SUID文件 | find配合MD5白名单 |
提权后门 |
| SSH公钥 | 计数+指纹匹配 | 持久化后门 |
| 二进制校验 | 调用rpm/dpkg verify | 被替换的常用命令 |
增强建议(无法在纯Shell实现的)
-
检测内核Hook
Shell脚本无法读取/dev/mem或/proc/kallsyms,需用chkrootkit或python-volatility。 -
检测LKM级隐藏进程
需要对比/proc/$pid/status与ps输出,但Rootkit可能Hook了getdents系统调用。 -
检测文件系统隐藏
Rootkit可以通过VFS层隐藏文件,Shell脚本无法发现,需要用strace或直接读取磁盘块设备。 -
检测内存后门
纯脚本无法扫描内存中的Shellcode(如/dev/shm的共享内存后门)。
实际应用流程
# 1. 首先用此脚本快速扫描 $ sudo bash rootkit_detector.sh # 2. 如果发现可疑点,使用专业工具 $ sudo apt install chkrootkit rkhunter $ sudo chkrootkit -x | grep "INFECTED" $ sudo rkhunter --check --skip-keypress # 3. 如果仍不放心 # - 使用Live CD启动检查硬盘 # - 检查系统日志: /var/log/auth.log /var/log/syslog # - 考虑重装系统(最彻底方案)
警告:如果检测到Rootkit,建议立即拔掉网线、备份关键数据、重装系统,Shell脚本只是辅助,不要依赖它做最终判定。