#!/bin/bash
#
# 脚本名称: FnOS 系统安全分析与清理工具
# 针对目标: "trim_https_cgi" / "snd_pcap" Rootkit 变种及自定义威胁
# 维护联系: aminsire@foxmail.com
# 版本: 1.0.2
#
# 自用脚本，代码全公开 还给你带了注释  怀疑这怀疑那 爱用不用 ~
#
# --- 脚本手动更新的地址 ---
UPDATE_URL="https://api.337.plus/fn/fnos.sh"

# --- 界面颜色配置 ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # 重置颜色

# --- 恶意特征库定义 (默认 IOC) ---
DEFAULT_MAL_IPS=("45.95.212.102" "151.240.13.91")
DEFAULT_TARGET_PORTS=("57132")

# --- 用户自定义特征库 (运行时添加) ---
CUSTOM_IPS=()
CUSTOM_PORTS=()

MAL_FILES=(
    "/usr/bin/nginx"              # 伪装的nginx进程
    "/usr/sbin/gots"              # 替换cat命令的恶意程序
    "/usr/trim/bin/trim_https_cgi" # 核心恶意载荷
    "/lib/modules/$(uname -r)/snd_pcap.ko" # 恶意内核模块
)
MAL_SERVICES=(
    "/etc/systemd/system/nginx.service"
    "/etc/systemd/system/trim_https_cgi.service"
)
INFECTED_CONFIGS=(
    "/etc/rc.local"
    "/usr/trim/bin/system_startup.sh"
)
MODULE_NAME="snd_pcap"

# --- 辅助函数 ---

banner() {
    clear
    echo -e "${CYAN}============================================================${NC}"
    echo -e "${CYAN}            FnOS 系统安全分析与清理工具                     ${NC}"
    echo -e "${CYAN}                 aminsire@foxmail.com                       ${NC}"
    echo -e "${CYAN}============================================================${NC}"
    echo -e " 当前系统 : $(uname -n) / $(uname -r)"
    echo -e "${CYAN}============================================================${NC}"
    echo ""
}

log_info() { echo -e "${BLUE}[信息]${NC} $1"; }
log_ok()   { echo -e "${GREEN}[正常]${NC}   $1"; }
log_warn() { echo -e "${YELLOW}[警告]${NC} $1"; }
log_bad()  { echo -e "${RED}[危险]${NC} $1"; }

pause() {
    read -p "按 [回车键] 继续..."
}

# --- 功能：手动在线升级脚本 ---
update_script() {
    echo -e "\n${YELLOW}--- 正在检查脚本更新 ---${NC}"
    
    # 构造带时间戳的 URL 以绕过缓存 (例如: script.sh?t=1715000000)
    local CACHE_BUST_URL="${UPDATE_URL}?t=$(date +%s)"
    
    #echo "更新源: $UPDATE_URL"
    
    if [[ "$UPDATE_URL" == *"example.com"* ]]; then
        log_warn "未配置有效的更新地址，请编辑脚本修改 UPDATE_URL 变量。"
        pause
        return
    fi

    # 获取当前脚本路径
    CURRENT_SCRIPT="$0"
    TMP_SCRIPT="/tmp/fnos_xxck1_new.sh"

    log_info "正在下载最新版本..."
    
    # 下载时使用 $CACHE_BUST_URL
    if command -v wget >/dev/null 2>&1; then
        wget --no-check-certificate -qO "$TMP_SCRIPT" "$CACHE_BUST_URL"
    elif command -v curl >/dev/null 2>&1; then
        curl -fsSL -k -o "$TMP_SCRIPT" "$CACHE_BUST_URL"
    else
        log_bad "未找到 wget 或 curl 工具，无法自动升级。"
        pause
        return
    fi

    # 检查下载是否成功
    if [ -s "$TMP_SCRIPT" ]; then
        # 简单校验文件头
        if grep -q "#!/bin/bash" "$TMP_SCRIPT"; then
            mv "$TMP_SCRIPT" "$CURRENT_SCRIPT"
            chmod +x "$CURRENT_SCRIPT"
            log_ok "脚本升级成功！即将重启脚本..."
            sleep 2
            exec "$CURRENT_SCRIPT"
        else
            log_bad "下载的文件似乎不是有效的脚本文件，取消升级。"
            rm -f "$TMP_SCRIPT"
        fi
    else
        log_bad "下载失败或文件为空，请检查网络连接或更新地址。"
    fi
    pause
}

# --- 功能：添加自定义目标 ---
add_custom_targets() {
    while true; do
        echo -e "\n${YELLOW}--- 添加自定义威胁情报 ---${NC}"
        echo "当前自定义 IP  列表: ${CUSTOM_IPS[*]:-无}"
        echo "当前自定义端口 列表: ${CUSTOM_PORTS[*]:-无}"
        echo ""
        echo " [1] 添加可疑 IP 地址"
        echo " [2] 添加可疑 端口号 (TCP)"
        echo " [0] 返回主菜单"
        echo ""
        read -p "请选择: " sub_choice

        case $sub_choice in
            1)
                read -p "请输入 IP 地址 (例如 1.1.1.1): " new_ip
                if [[ -n "$new_ip" ]]; then
                    CUSTOM_IPS+=("$new_ip")
                    log_info "已添加 IP: $new_ip"
                fi
                ;;
            2)
                read -p "请输入端口号 (例如 8888): " new_port
                if [[ "$new_port" =~ ^[0-9]+$ ]]; then
                    CUSTOM_PORTS+=("$new_port")
                    log_info "已添加端口: $new_port"
                else
                    log_warn "无效端口号"
                fi
                ;;
            0)
                return
                ;;
            *)
                echo "无效选项"
                ;;
        esac
    done
}

# --- 功能：查看源码 ---
view_source() {
    echo -e "\n${YELLOW}--- 正在读取源码 ---${NC}"
    # 优先使用 less 分页查看，如果没有则使用 cat
    if command -v less >/dev/null 2>&1; then
        echo -e "${GREEN}提示: 查看完毕后，请按键盘上的 'q' 键退出并返回菜单。${NC}"
        read -p "按 [回车键] 开始查看..." 
        less "$0"
    else
        cat "$0"
        pause
    fi
}

# --- 功能：自毁脚本 ---
self_destruct() {
    echo -e "\n${RED}!!! 危险操作：删除本脚本 !!!${NC}"
    echo -e "当前文件路径: $0"
    read -p "你确定要删除本脚本文件吗？(y/n): " confirm_del
    if [[ "$confirm_del" =~ ^[Yy]$ ]]; then
        rm -- "$0"
        echo -e "${GREEN}脚本已自毁。再见。${NC}"
        exit 0
    else
        echo "操作已取消。"
        pause
    fi
}

# --- 检测模块 ---

check_network() {
    echo -e "\n${YELLOW}--- [1/5] 网络连接与端口扫描 ---${NC}"
    local found=0
    
    local ALL_IPS=("${DEFAULT_MAL_IPS[@]}" "${CUSTOM_IPS[@]}")
    local ALL_PORTS=("${DEFAULT_TARGET_PORTS[@]}" "${CUSTOM_PORTS[@]}")

    local net_cmd=""
    local port_cmd=""
    
    if command -v ss >/dev/null 2>&1; then
        net_cmd="ss -n"
        port_cmd="ss -tuln"
    elif command -v netstat >/dev/null 2>&1; then
        net_cmd="netstat -an"
        port_cmd="netstat -tuln"
    else
        log_warn "未找到 ss 或 netstat 命令，跳过网络检测！"
        return 0
    fi

    if [ ${#ALL_IPS[@]} -eq 0 ]; then
        log_info "没有配置需要检测的 IP。"
    else
        for ip in "${ALL_IPS[@]}"; do
            if $net_cmd 2>/dev/null | grep -q "$ip"; then
                log_bad "发现连接到恶意/可疑服务器: $ip"
                found=1
            else
                log_ok "未发现连接到 IP: $ip"
            fi
        done
    fi

    if [ ${#ALL_PORTS[@]} -eq 0 ]; then
        log_info "没有配置需要检测的端口。"
    else
        for port in "${ALL_PORTS[@]}"; do
            if $port_cmd 2>/dev/null | grep -q ":$port "; then
                log_bad "端口 $port 处于监听状态 (可能是木马/后门)"
                found=1
            else
                log_ok "端口 $port 正常 (未被占用)"
            fi
        done
    fi

    return $found
}

check_files() {
    echo -e "\n${YELLOW}--- [2/5] 关键文件完整性扫描 ---${NC}"
    local found=0
    
    for f in "${MAL_FILES[@]}"; do
        if [ -f "$f" ]; then
            if lsattr "$f" 2>/dev/null | grep -q "\-i-"; then
                log_bad "发现被锁定(+i)的恶意文件: $f"
            else
                log_bad "发现恶意文件: $f"
            fi
            found=1
        else
            log_ok "文件未感染: $f"
        fi
    done
    return $found
}

check_module() {
    echo -e "\n${YELLOW}--- [3/5] 内核模块扫描 ---${NC}"
    if lsmod | grep -q "$MODULE_NAME"; then
        log_bad "警告：检测到恶意内核模块已加载 ($MODULE_NAME)"
        return 1
    else
        log_ok "内核模块检查正常"
        return 0
    fi
}

check_persistence() {
    echo -e "\n${YELLOW}--- [4/5] 持久化与自启动项扫描 ---${NC}"
    local found=0

    for svc in "${MAL_SERVICES[@]}"; do
        if [ -f "$svc" ]; then
            log_bad "发现恶意服务文件: $svc"
            found=1
        fi
    done

    if grep -q "/sbin/gots" /etc/rc.local 2>/dev/null; then
        log_bad "已感染: /etc/rc.local (包含 gots 启动项)"
        found=1
    fi

    if grep -q "151.240.13.91" /usr/trim/bin/system_startup.sh 2>/dev/null; then
        log_bad "已感染: /usr/trim/bin/system_startup.sh (含恶意下载指令)"
        found=1
    fi
    
    if [ $found -eq 0 ]; then
        log_ok "持久化项目检查通过"
    fi
    return $found
}

# --- 修复模块 ---

apply_fix() {
    local ALL_IPS=("${DEFAULT_MAL_IPS[@]}" "${CUSTOM_IPS[@]}")
    local ALL_PORTS=("${DEFAULT_TARGET_PORTS[@]}" "${CUSTOM_PORTS[@]}")

    echo -e "\n${RED}!!! 正在启动修复程序 !!!${NC}"
    echo "警告：此过程将修改系统配置、阻断相关IP并清理进程。"
    read -p "请输入 'YES' (大写) 确认开始自动修复: " confirm
    if [ "$confirm" != "YES" ]; then
        echo "用户取消操作。"
        return
    fi

    # 1. 备份
    echo -e "\n${CYAN}>>> 阶段 1: 配置文件备份${NC}"
    read -p "是否在修改前备份受感染的配置文件？ (y/n): " bk_opt
    if [[ "$bk_opt" =~ ^[Yy]$ ]]; then
        for file in "${INFECTED_CONFIGS[@]}"; do
            if [ -f "$file" ]; then
                cp "$file" "${file}.bak_$(date +%s)"
                log_info "已备份文件: $file -> ${file}.bak_..."
            fi
        done
    fi

    # 2. 网络
    echo -e "\n${CYAN}>>> 阶段 2: 防火墙隔离 (含自定义IP)${NC}"
    log_info "正在阻断以下 IP: ${ALL_IPS[*]}"

    if command -v nft >/dev/null 2>&1; then
        log_info "使用 nftables 添加规则..."
        for ip in "${ALL_IPS[@]}"; do
            nft add rule inet filter input ip saddr "$ip" drop 2>/dev/null
            nft add rule inet filter output ip daddr "$ip" drop 2>/dev/null
        done
        log_ok "nftables 规则已更新"
    elif command -v iptables >/dev/null 2>&1; then
        log_info "使用 iptables 添加规则..."
        for ip in "${ALL_IPS[@]}"; do
            iptables -A OUTPUT -d "$ip" -j DROP
            iptables -A INPUT -s "$ip" -j DROP
        done
        log_ok "iptables 规则已更新"
    else
        log_warn "未找到防火墙！请手动在路由器拦截: ${ALL_IPS[*]}"
        pause
    fi

    # 3. 进程
    echo -e "\n${CYAN}>>> 阶段 3: 终止恶意进程${NC}"
    for port in "${ALL_PORTS[@]}"; do
        if lsof -i :$port >/dev/null 2>&1 || ss -nlp | grep -q ":$port "; then
             fuser -k -9 $port/tcp >/dev/null 2>&1
             log_ok "已清理占用端口 $port 的进程"
        fi
    done

    pkill -9 -f "nginx x86"
    pkill -9 -f "trim_https_cgi"
    pkill -9 -f "gots"
    log_ok "已知恶意进程名清理完毕"

    # 4. 内核
    echo -e "\n${CYAN}>>> 阶段 4: 卸载恶意内核模块${NC}"
    if lsmod | grep -q "$MODULE_NAME"; then
        rmmod "$MODULE_NAME" || log_warn "模块卸载失败 (可能正被占用)，稍后将强制删除文件"
    fi
    if [ -f "/lib/modules/$(uname -r)/snd_pcap.ko" ]; then
        rm -f "/lib/modules/$(uname -r)/snd_pcap.ko"
        depmod -a
        log_ok "恶意驱动文件已删除，内核依赖已刷新"
    fi

    # 5. 文件
    echo -e "\n${CYAN}>>> 阶段 5: 清理恶意文件${NC}"
    for file in "${MAL_FILES[@]}" "${MAL_SERVICES[@]}"; do
        if [ -f "$file" ]; then
            chattr -i "$file" 2>/dev/null
            rm -f "$file"
            log_ok "已删除文件: $file"
        fi
    done

    # 6. 配置
    echo -e "\n${CYAN}>>> 阶段 6: 净化系统配置${NC}"
    if [ -f "/etc/rc.local" ]; then
        if grep -q "/sbin/gots" /etc/rc.local; then
             sed -i '/\/sbin\/gots/d' /etc/rc.local
             log_ok "已清理 /etc/rc.local"
        fi
    fi

    startup_script="/usr/trim/bin/system_startup.sh"
    if [ -f "$startup_script" ]; then
        if grep -q "151.240.13.91" "$startup_script"; then
            sed -i '/151.240.13.91/d' "$startup_script"
            log_ok "已清理 $startup_script"
        fi
    fi
    
    systemctl daemon-reload
    log_info "Systemd 守护进程配置已重载"

    # 7. 日志
    echo -e "\n${CYAN}>>> 阶段 7: 服务恢复${NC}"
    read -p "是否尝试重启日志相关服务？ (y/n): " log_opt
    if [[ "$log_opt" =~ ^[Yy]$ ]]; then
        systemctl restart rsyslog 2>/dev/null
        systemctl restart systemd-journald 2>/dev/null
        systemctl restart auditd 2>/dev/null
        log_ok "已发送日志服务重启指令"
    fi

    echo -e "\n${GREEN}=== 修复流程执行完毕 ===${NC}"
    echo "提示：自定义添加的 IP 已加入防火墙拦截规则。"
    echo "强烈建议您立即【重启系统】。"
    pause
}

manual_fix_guide() {
    echo -e "\n${CYAN}=== 手动修复操作指南 ===${NC}"
    echo "1. 网络: 封禁IP 45.95.212.102, 151.240.13.91 及你自己发现的可疑IP。"
    echo "2. 解锁: chattr -i /usr/bin/nginx /usr/sbin/gots /usr/trim/bin/trim_https_cgi"
    echo "3. 删除: rm -rf 上述文件。"
    echo "4. 内核: rm /lib/modules/$(uname -r)/snd_pcap.ko && depmod -a"
    echo "5. 配置: 清理 /etc/rc.local 和 /usr/trim/bin/system_startup.sh"
    pause
}

# --- 主逻辑循环 ---

while true; do
    banner
    # 针对目标
    echo -e "${GREEN}针对目标:${NC} "trim_https_cgi" / "snd_pcap" Rootkit 变种及自定义威胁"
    # 检测逻辑说明
    echo -e "${GREEN}检测逻辑:${NC} 网络连接(C2) -> 文件完整性(+i锁) -> 内核模块 -> 持久化配置"
    # 流程提示
    echo -e "${YELLOW}流程提示:${NC} 如有新发现的可疑IP，建议先执行 [2] 添加，再执行 [1] 扫描与修复"
    # 操作流程
    echo -e "${YELLOW}操作提示:${NC} 执行 [1] 扫描检测，如发现风险提示是否修复, 或者根据 [3] 手动修复指南"
    echo ""
    echo "请选择操作模式:"
    echo " [1] 执行全盘快速扫描检测 (含自定义检测项)"
    echo " [2] 添加自定义威胁情报 (IP/端口)"
    echo " [3] 查看手动修复指南"
    echo " [7] 查看本脚本源代码 (有的人就是逼事多，还怀疑我脚本本身就有毒，代码看的懂自己看)"
    echo " [8] 删除本脚本"
    echo " [9] 手动更新脚本"
    echo " [0] 退出脚本"
    echo ""
    read -p "请输入选项 [0-3,7-9]: " choice

    case $choice in
        1)
            DETECTED=0
            check_network || DETECTED=1
            check_files || DETECTED=1
            check_module || DETECTED=1
            check_persistence || DETECTED=1
            
            echo -e "\n------------------------------------------------------------"
            if [ $DETECTED -eq 1 ]; then
                echo -e "${RED}警告：系统检测到活跃威胁！${NC}"
                echo -e "是否立即进入自动修复/清理菜单？"
                read -p "输入 y 进入修复，输入 n 返回主菜单 (y/n): " fix_now
                if [[ "$fix_now" =~ ^[Yy]$ ]]; then
                    apply_fix
                fi
            else
                echo -e "${GREEN}恭喜：系统状态正常。${NC}"
                if [ ${#CUSTOM_IPS[@]} -gt 0 ] || [ ${#CUSTOM_PORTS[@]} -gt 0 ]; then
                     echo " (已扫描您手动添加的自定义威胁)"
                fi
                pause
            fi
            ;;
        2)
            add_custom_targets
            ;;
        3)
            manual_fix_guide
            ;;
        7)
            view_source
            ;;
        8)
            self_destruct
            ;;
        9)
            update_script
            ;;
        0)
            echo "正在退出..."
            exit 0
            ;;
        *)
            echo "输入无效，请重试。"
            sleep 1
            ;;
    esac
done
#代码看完了吧 ~ 脚本有病毒吗？ 真是搞笑 自用脚本分享出来用 还有人怀疑我的脚本有病毒
#end