| Linux webm007.cluster106.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64 Path : /home/eglisebaa/ |
| Current File : /home/eglisebaa/scan-complet.sh |
#!/bin/bash
#
# Script de scan complet de tous les fichiers WordPress
# Détecte les backdoors, code malveillant, et fichiers suspects
# Avec barre de progression
#
set -e
# Couleurs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
MAGENTA='\033[0;35m'
NC='\033[0m'
WP_ROOT="/home/eglisebaa/www"
SCAN_DIR="$WP_ROOT"
REPORT_DIR="$WP_ROOT/wp-scan-complet-$(date +%Y%m%d-%H%M%S)"
REPORT_FILE="$REPORT_DIR/scan-report.txt"
SUSPICIOUS_FILES="$REPORT_DIR/fichiers-suspects.txt"
MALWARE_PATTERNS="$REPORT_DIR/patterns-malware.txt"
RECENT_FILES="$REPORT_DIR/fichiers-recents.txt"
PHP_IN_UPLOADS="$REPORT_DIR/php-dans-uploads.txt"
PERMISSIONS_REPORT="$REPORT_DIR/permissions.txt"
# Variables de progression
TOTAL_STEPS=8
CURRENT_STEP=0
SPINNER_CHARS="|/-\\"
SPINNER_POS=0
mkdir -p "$REPORT_DIR"
# Fonction pour afficher la barre de progression
show_progress() {
CURRENT_STEP=$1
STEP_NAME=$2
PERCENT=$((CURRENT_STEP * 100 / TOTAL_STEPS))
# Barre de progression
BAR_LENGTH=50
FILLED=$((PERCENT * BAR_LENGTH / 100))
EMPTY=$((BAR_LENGTH - FILLED))
BAR=""
for ((i=0; i<FILLED; i++)); do
BAR="${BAR}█"
done
for ((i=0; i<EMPTY; i++)); do
BAR="${BAR}░"
done
# Afficher la progression
printf "\r${CYAN}[${BAR}]${NC} ${MAGENTA}%3d%%${NC} - ${BLUE}Étape $CURRENT_STEP/$TOTAL_STEPS:${NC} ${YELLOW}$STEP_NAME${NC}"
echo ""
}
# Fonction spinner pour les opérations longues
spinner() {
local PID=$1
local MSG=$2
while kill -0 $PID 2>/dev/null; do
SPINNER_POS=$(( (SPINNER_POS + 1) % 4 ))
printf "\r${CYAN}${SPINNER_CHARS:$SPINNER_POS:1}${NC} ${BLUE}$MSG${NC}... "
sleep 0.1
done
printf "\r${GREEN}✓${NC} ${BLUE}$MSG${NC} - Terminé\n"
}
# Fonction pour afficher un message avec timestamp
log_with_time() {
TIMESTAMP=$(date '+%H:%M:%S')
echo -e "[$TIMESTAMP] $1" | tee -a "$REPORT_FILE"
}
log() {
echo -e "$1" | tee -a "$REPORT_FILE"
}
log_section() {
echo "" | tee -a "$REPORT_FILE"
log "=========================================="
log "$1"
log "=========================================="
log ""
}
log_info() {
log_with_time "${BLUE}ℹ️ $1${NC}"
}
log_warning() {
log_with_time "${YELLOW}⚠️ $1${NC}"
}
log_critical() {
log_with_time "${RED}🔴 $1${NC}"
}
log_success() {
log_with_time "${GREEN}✅ $1${NC}"
}
echo ""
echo "=========================================="
echo "🔍 SCAN COMPLET WORDPRESS"
echo "Date: $(date)"
echo "Répertoire: $SCAN_DIR"
echo "=========================================="
echo ""
cd "$SCAN_DIR"
# 1. Scan des patterns malveillants dans tous les fichiers PHP
CURRENT_STEP=1
show_progress $CURRENT_STEP "Scan des Patterns Malveillants"
log_section "1. Scan des Patterns Malveillants"
log_info "Recherche de patterns de backdoor dans tous les fichiers PHP..."
# Patterns à rechercher
PATTERNS=(
"eval("
"base64_decode("
"file_get_contents.*http"
"curl_exec"
"shell_exec"
"exec("
"system("
"passthru("
"assert("
"preg_replace.*\/.*\/e"
"create_function"
"\\x[0-9a-f]"
)
touch "$SUSPICIOUS_FILES"
touch "$MALWARE_PATTERNS"
PATTERN_COUNT=${#PATTERNS[@]}
PATTERN_CURRENT=0
for pattern in "${PATTERNS[@]}"; do
PATTERN_CURRENT=$((PATTERN_CURRENT + 1))
printf "\r${CYAN}⏳${NC} Pattern $PATTERN_CURRENT/$PATTERN_COUNT: ${YELLOW}$pattern${NC}... "
find . -type f -name "*.php" ! -path "*/wp-content/cache/*" ! -path "*/node_modules/*" \
-exec grep -l "$pattern" {} \; 2>/dev/null | while read file; do
echo "$file (pattern: $pattern)" >> "$MALWARE_PATTERNS"
# Vérifier si c'est un faux positif (fichiers légitimes)
if [[ "$file" == *"vendor/"* ]] || [[ "$file" == *"node_modules/"* ]]; then
continue
fi
# Extraire le contexte (3 lignes avant/après)
echo "=== $file ===" >> "$SUSPICIOUS_FILES"
grep -n -A 3 -B 3 "$pattern" "$file" 2>/dev/null | head -20 >> "$SUSPICIOUS_FILES" || true
echo "" >> "$SUSPICIOUS_FILES"
done
done
echo "" # Nouvelle ligne après les patterns
SUSPICIOUS_COUNT=$(grep -c "^===" "$SUSPICIOUS_FILES" 2>/dev/null || echo "0")
log_warning "$SUSPICIOUS_COUNT fichier(s) avec patterns suspects détectés"
# 2. Fichiers récemment modifiés
CURRENT_STEP=2
show_progress $CURRENT_STEP "Fichiers Récemment Modifiés"
log_section "2. Fichiers Récemment Modifiés (30 derniers jours)"
log_info "Recherche des fichiers modifiés récemment..."
printf "${CYAN}⏳${NC} Analyse en cours... "
find . -type f -mtime -30 ! -path "*/wp-content/cache/*" ! -path "*/node_modules/*" \
-exec ls -lh {} \; 2>/dev/null | head -100 > "$RECENT_FILES" || true
echo "${GREEN}✓${NC}"
RECENT_COUNT=$(wc -l < "$RECENT_FILES" 2>/dev/null || echo "0")
log_info "$RECENT_COUNT fichier(s) modifié(s) récemment"
# 3. Fichiers PHP dans wp-content/uploads (suspect)
CURRENT_STEP=3
show_progress $CURRENT_STEP "Fichiers PHP dans uploads"
log_section "3. Fichiers PHP dans wp-content/uploads"
log_info "Recherche de fichiers PHP dans uploads (très suspect)..."
printf "${CYAN}⏳${NC} Scan en cours... "
find wp-content/uploads -type f -name "*.php" 2>/dev/null > "$PHP_IN_UPLOADS" || touch "$PHP_IN_UPLOADS"
echo "${GREEN}✓${NC}"
UPLOADS_PHP_COUNT=$(wc -l < "$PHP_IN_UPLOADS" 2>/dev/null || echo "0")
if [ "$UPLOADS_PHP_COUNT" -gt 0 ]; then
log_critical "$UPLOADS_PHP_COUNT fichier(s) PHP trouvé(s) dans uploads!"
cat "$PHP_IN_UPLOADS" | tee -a "$REPORT_FILE"
else
log_success "Aucun fichier PHP dans uploads"
fi
# 4. Vérification des fichiers core WordPress
CURRENT_STEP=4
show_progress $CURRENT_STEP "Vérification Fichiers Core"
log_section "4. Vérification des Fichiers Core WordPress"
CORE_FILES=(
"index.php"
"wp-config.php"
"wp-blog-header.php"
"wp-load.php"
"wp-settings.php"
".htaccess"
)
CORE_COUNT=${#CORE_FILES[@]}
CORE_CURRENT=0
for file in "${CORE_FILES[@]}"; do
CORE_CURRENT=$((CORE_CURRENT + 1))
printf "\r${CYAN}⏳${NC} Fichier core $CORE_CURRENT/$CORE_COUNT: ${YELLOW}$file${NC}... "
if [ -f "$file" ]; then
# Vérifier les patterns suspects
if grep -q "eval\|base64_decode\|file_get_contents.*http\|curl_exec" "$file" 2>/dev/null; then
echo "${RED}✗${NC} Pattern suspect détecté!"
log_critical "Pattern suspect dans $file"
grep -n "eval\|base64_decode\|file_get_contents.*http\|curl_exec" "$file" 2>/dev/null | head -5 >> "$SUSPICIOUS_FILES" || true
else
echo "${GREEN}✓${NC}"
log_success "$file semble propre"
fi
# Vérifier les permissions
PERMS=$(stat -c "%a" "$file" 2>/dev/null || stat -f "%OLp" "$file" 2>/dev/null || echo "???")
echo "$file: $PERMS" >> "$PERMISSIONS_REPORT"
else
echo "${YELLOW}⚠${NC} Non trouvé"
fi
done
echo ""
# 5. Scan des thèmes
CURRENT_STEP=5
show_progress $CURRENT_STEP "Scan des Thèmes"
log_section "5. Scan des Thèmes"
THEMES_DIR="wp-content/themes"
if [ -d "$THEMES_DIR" ]; then
log_info "Scan des fichiers de thème..."
printf "${CYAN}⏳${NC} Analyse en cours... "
THEME_SUSPICIOUS=$(find "$THEMES_DIR" -type f -name "*.php" -exec grep -l "eval\|base64_decode\|file_get_contents.*http" {} \; 2>/dev/null | wc -l)
echo "${GREEN}✓${NC}"
if [ "$THEME_SUSPICIOUS" -gt 0 ]; then
find "$THEMES_DIR" -type f -name "*.php" -exec grep -l "eval\|base64_decode\|file_get_contents.*http" {} \; 2>/dev/null | \
while read file; do
log_warning "Thème suspect: $file"
echo "$file" >> "$SUSPICIOUS_FILES"
done
else
log_success "Aucun thème suspect détecté"
fi
fi
# 6. Scan des plugins
CURRENT_STEP=6
show_progress $CURRENT_STEP "Scan des Plugins"
log_section "6. Scan des Plugins"
PLUGINS_DIR="wp-content/plugins"
if [ -d "$PLUGINS_DIR" ]; then
log_info "Scan des fichiers de plugins..."
printf "${CYAN}⏳${NC} Analyse en cours... "
PLUGIN_SUSPICIOUS=$(find "$PLUGINS_DIR" -type f -name "*.php" ! -path "*/vendor/*" -exec grep -l "eval\|base64_decode\|file_get_contents.*http" {} \; 2>/dev/null | wc -l)
echo "${GREEN}✓${NC}"
if [ "$PLUGIN_SUSPICIOUS" -gt 0 ]; then
find "$PLUGINS_DIR" -type f -name "*.php" ! -path "*/vendor/*" -exec grep -l "eval\|base64_decode\|file_get_contents.*http" {} \; 2>/dev/null | \
while read file; do
# Ignorer les faux positifs connus
if [[ "$file" != *"wordpress-seo"* ]] && [[ "$file" != *"vendor"* ]]; then
log_warning "Plugin suspect: $file"
echo "$file" >> "$SUSPICIOUS_FILES"
fi
done
else
log_success "Aucun plugin suspect détecté"
fi
fi
# 7. Vérification des permissions
CURRENT_STEP=7
show_progress $CURRENT_STEP "Vérification des Permissions"
log_section "7. Vérification des Permissions"
log_info "Analyse des permissions des fichiers critiques..."
printf "${CYAN}⏳${NC} Analyse en cours... "
find . -type f \( -name "wp-config.php" -o -name ".htaccess" -o -name "index.php" \) \
-exec ls -la {} \; 2>/dev/null | tee -a "$PERMISSIONS_REPORT" > /dev/null
echo "${GREEN}✓${NC}"
# 8. Recherche de fichiers avec noms suspects
CURRENT_STEP=8
show_progress $CURRENT_STEP "Fichiers avec Noms Suspects"
log_section "8. Fichiers avec Noms Suspects"
log_info "Recherche de fichiers avec noms suspects..."
printf "${CYAN}⏳${NC} Recherche en cours... "
find . -type f \( -iname "*shell*" -o -iname "*hack*" -o -iname "*backdoor*" -o -iname "*c99*" -o -iname "*r57*" -o -iname "*wso*" \) \
! -path "*/wp-content/cache/*" 2>/dev/null | tee -a "$SUSPICIOUS_FILES" > /dev/null || true
echo "${GREEN}✓${NC}"
# 9. Résumé
echo ""
echo "=========================================="
echo "✅ SCAN TERMINÉ - $(date)"
echo "=========================================="
echo ""
log_section "RÉSUMÉ DU SCAN"
FINAL_SUSPICIOUS=$(grep -c '^===' "$SUSPICIOUS_FILES" 2>/dev/null || echo "0")
log "${GREEN}✓${NC} Fichiers suspects détectés: ${YELLOW}$FINAL_SUSPICIOUS${NC}"
log "${GREEN}✓${NC} Fichiers PHP dans uploads: ${YELLOW}$UPLOADS_PHP_COUNT${NC}"
log "${GREEN}✓${NC} Fichiers récemment modifiés: ${YELLOW}$RECENT_COUNT${NC}"
echo ""
log "${CYAN}📁 Rapports générés dans:${NC} $REPORT_DIR"
log " ${BLUE}•${NC} $REPORT_FILE (rapport principal)"
log " ${BLUE}•${NC} $SUSPICIOUS_FILES (fichiers suspects)"
log " ${BLUE}•${NC} $MALWARE_PATTERNS (patterns détectés)"
log " ${BLUE}•${NC} $RECENT_FILES (fichiers récents)"
log " ${BLUE}•${NC} $PHP_IN_UPLOADS (PHP dans uploads)"
log " ${BLUE}•${NC} $PERMISSIONS_REPORT (permissions)"
echo ""
log_section "SCAN TERMINÉ"
# Afficher la barre de progression finale
show_progress $TOTAL_STEPS "Scan Complet Terminé"
echo ""