Shell脚本如何检测Rootkit后门

wen 实用脚本 2

本文目录导读:

Shell脚本如何检测Rootkit后门

  1. 核心检测脚本
  2. 脚本关键点解析
  3. 增强建议(无法在纯Shell实现的)
  4. 实际应用流程

检测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/moduleslsmod 内核模块隐藏(如Diamorphine)
SUID文件 find配合MD5白名单 提权后门
SSH公钥 计数+指纹匹配 持久化后门
二进制校验 调用rpm/dpkg verify 被替换的常用命令

增强建议(无法在纯Shell实现的)

  1. 检测内核Hook
    Shell脚本无法读取/dev/mem/proc/kallsyms,需用chkrootkitpython-volatility

  2. 检测LKM级隐藏进程
    需要对比/proc/$pid/statusps输出,但Rootkit可能Hook了getdents系统调用。

  3. 检测文件系统隐藏
    Rootkit可以通过VFS层隐藏文件,Shell脚本无法发现,需要用strace或直接读取磁盘块设备。

  4. 检测内存后门
    纯脚本无法扫描内存中的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脚本只是辅助,不要依赖它做最终判定。

抱歉,评论功能暂时关闭!