#!/bin/bash
# =============================================================================
# SCRIPT QUÉT MÃ ĐỘC VÀ BACKDOOR
# Tạo bởi: Security Audit 2025-12-08
# Sử dụng: sudo bash scan_malware.sh [project_path]
# =============================================================================

set -e

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

PROJECT_PATH="${1:-$(pwd)}"
REPORT_FILE="/tmp/malware_scan_$(date +%Y%m%d_%H%M%S).txt"

echo -e "${GREEN}=== QUÉT MÃ ĐỘC VÀ BACKDOOR ===${NC}"
echo "Đường dẫn: $PROJECT_PATH"
echo "Thời gian: $(date)"
echo "Báo cáo: $REPORT_FILE"
echo ""

# Khởi tạo báo cáo
echo "===========================================" > "$REPORT_FILE"
echo "BÁO CÁO QUÉT MÃ ĐỘC" >> "$REPORT_FILE"
echo "Thời gian: $(date)" >> "$REPORT_FILE"
echo "Đường dẫn: $PROJECT_PATH" >> "$REPORT_FILE"
echo "===========================================" >> "$REPORT_FILE"

TOTAL_FOUND=0

# 1. Quét webshell phổ biến
echo -e "${YELLOW}[1/7] Quét webshell phổ biến (FilesMan, WSO, c99...)${NC}"
echo "" >> "$REPORT_FILE"
echo "[1] WEBSHELL PHỔ BIẾN:" >> "$REPORT_FILE"
WEBSHELL_PATTERNS='FilesMan\|WSO\|c99\|r57\|c100\|b374k\|weevely\|antsword\|behinder\|godzilla\|webacoo'
COUNT=$(find "$PROJECT_PATH" -type f -name "*.php" -exec grep -l "$WEBSHELL_PATTERNS" {} \; 2>/dev/null | grep -v vendor | grep -v node_modules | tee -a "$REPORT_FILE" | wc -l)
echo -e "  Tìm thấy: ${RED}$COUNT${NC} file"
TOTAL_FOUND=$((TOTAL_FOUND + COUNT))

# 2. Quét backdoor đã biết (plugin_binalar_eski)
echo -e "${YELLOW}[2/7] Quét backdoor đã biết...${NC}"
echo "" >> "$REPORT_FILE"
echo "[2] BACKDOOR ĐÃ BIẾT (plugin_binalar_eski, ppdd):" >> "$REPORT_FILE"
BACKDOOR_PATTERNS='plugin_binalar_eski\|ppdd'
COUNT=$(grep -r "$BACKDOOR_PATTERNS" "$PROJECT_PATH" --include="*.php" -l 2>/dev/null | grep -v vendor | grep -v node_modules | tee -a "$REPORT_FILE" | wc -l)
echo -e "  Tìm thấy: ${RED}$COUNT${NC} file"
TOTAL_FOUND=$((TOTAL_FOUND + COUNT))

# 3. Quét code nguy hiểm (eval, base64_decode)
echo -e "${YELLOW}[3/7] Quét code nguy hiểm (eval, base64_decode)...${NC}"
echo "" >> "$REPORT_FILE"
echo "[3] CODE NGUY HIỂM (eval + base64_decode kết hợp):" >> "$REPORT_FILE"
COUNT=$(grep -r 'eval.*base64_decode\|base64_decode.*eval' "$PROJECT_PATH" --include="*.php" -l 2>/dev/null | grep -v vendor | grep -v node_modules | tee -a "$REPORT_FILE" | wc -l)
echo -e "  Tìm thấy: ${RED}$COUNT${NC} file"
TOTAL_FOUND=$((TOTAL_FOUND + COUNT))

# 4. Quét hàm shell nguy hiểm
echo -e "${YELLOW}[4/7] Quét hàm shell nguy hiểm...${NC}"
echo "" >> "$REPORT_FILE"
echo "[4] HÀM SHELL NGUY HIỂM (system, shell_exec, passthru):" >> "$REPORT_FILE"
SHELL_PATTERNS='system\s*(\|shell_exec\s*(\|passthru\s*(\|exec\s*(\|popen\s*(\|proc_open\s*('
COUNT=$(grep -rE "$SHELL_PATTERNS" "$PROJECT_PATH" --include="*.php" -l 2>/dev/null | grep -v vendor | grep -v node_modules | tee -a "$REPORT_FILE" | wc -l)
echo -e "  Tìm thấy: ${YELLOW}$COUNT${NC} file (cần kiểm tra thủ công)"

# 5. Quét file PHP ẩn
echo -e "${YELLOW}[5/7] Quét file PHP ẩn...${NC}"
echo "" >> "$REPORT_FILE"
echo "[5] FILE PHP ẨN (bắt đầu bằng dấu chấm):" >> "$REPORT_FILE"
COUNT=$(find "$PROJECT_PATH" -type f -name ".*.php" 2>/dev/null | tee -a "$REPORT_FILE" | wc -l)
echo -e "  Tìm thấy: ${RED}$COUNT${NC} file"
TOTAL_FOUND=$((TOTAL_FOUND + COUNT))

# 6. Quét file PHP trong thư mục upload
echo -e "${YELLOW}[6/7] Quét PHP trong thư mục upload...${NC}"
echo "" >> "$REPORT_FILE"
echo "[6] PHP TRONG THƯ MỤC UPLOAD:" >> "$REPORT_FILE"
COUNT=$(find "$PROJECT_PATH" -type f -name "*.php" \( -path "*/uploads/*" -o -path "*/images/*" -o -path "*/img/*" -o -path "*/files/*" -o -path "*/media/*" \) 2>/dev/null | tee -a "$REPORT_FILE" | wc -l)
echo -e "  Tìm thấy: ${RED}$COUNT${NC} file"
TOTAL_FOUND=$((TOTAL_FOUND + COUNT))

# 7. Quét obfuscated code
echo -e "${YELLOW}[7/7] Quét code bị mã hóa (obfuscated)...${NC}"
echo "" >> "$REPORT_FILE"
echo "[7] CODE BỊ MÃ HÓA (gzinflate, str_rot13, chr kết hợp):" >> "$REPORT_FILE"
OBFUS_PATTERNS='gzinflate\|str_rot13\|chr\([0-9]\+\)\.chr\|\\x[0-9a-fA-F]\{2\}\\x'
COUNT=$(grep -rE "$OBFUS_PATTERNS" "$PROJECT_PATH" --include="*.php" -l 2>/dev/null | grep -v vendor | grep -v node_modules | tee -a "$REPORT_FILE" | wc -l)
echo -e "  Tìm thấy: ${YELLOW}$COUNT${NC} file (cần kiểm tra thủ công)"

echo ""
echo "===========================================" >> "$REPORT_FILE"

# Kết quả tổng hợp
if [ "$TOTAL_FOUND" -gt 0 ]; then
    echo -e "${RED}=== PHÁT HIỆN $TOTAL_FOUND FILE NGHI NGỜ ===${NC}"
    echo "TỔNG KẾT: $TOTAL_FOUND file nghi ngờ" >> "$REPORT_FILE"
    echo ""
    echo "Xem chi tiết tại: $REPORT_FILE"
    echo ""
    echo -e "${YELLOW}Gợi ý:${NC}"
    echo "  1. Kiểm tra từng file trong báo cáo"
    echo "  2. So sánh với bản backup sạch"
    echo "  3. Xóa các file độc hại"
    echo "  4. Chạy lại scan để xác nhận"
    exit 1
else
    echo -e "${GREEN}=== KHÔNG PHÁT HIỆN MÃ ĐỘC ===${NC}"
    echo "TỔNG KẾT: Không phát hiện mã độc" >> "$REPORT_FILE"
    exit 0
fi
