4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / detect_compromise.sh SH
#!/bin/bash
"""
CVE-2026-1281/1340 Detection Script for Ivanti EPMM
Author: Mehdi - Red Team Consultant
Purpose: Rechercher des IOCs de compromission sur les systèmes EPMM
"""

# Couleurs pour output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Variables
LOG_DIR="/var/log/httpd"
EPMM_DIR="/mi"
TOMCAT_DIR="/mi/tomcat"
OUTPUT_FILE="epmm_ioc_scan_$(date +%Y%m%d_%H%M%S).txt"

echo "╔═══════════════════════════════════════════════════════════════╗"
echo "║   CVE-2026-1281/1340 IOC Detection Script                    ║"
echo "║   Ivanti EPMM Compromise Analysis                            ║"
echo "╚═══════════════════════════════════════════════════════════════╝"
echo ""

# Fonction de logging
log_finding() {
    local severity=$1
    local message=$2
    
    case $severity in
        "CRITICAL")
            echo -e "${RED}[!] CRITICAL: ${message}${NC}" | tee -a "$OUTPUT_FILE"
            ;;
        "WARNING")
            echo -e "${YELLOW}[*] WARNING: ${message}${NC}" | tee -a "$OUTPUT_FILE"
            ;;
        "INFO")
            echo -e "${GREEN}[+] INFO: ${message}${NC}" | tee -a "$OUTPUT_FILE"
            ;;
    esac
}

# Vérifier les privilèges root
if [ "$EUID" -ne 0 ]; then 
    log_finding "CRITICAL" "Ce script doit être exécuté en tant que root"
    exit 1
fi

log_finding "INFO" "Début de l'analyse - $(date)"

# =====================================
# 1. ANALYSE DES LOGS APACHE
# =====================================
echo ""
echo "=== Analyse des logs Apache HTTPd ==="

if [ -f "$LOG_DIR/https-access_log" ]; then
    log_finding "INFO" "Analyse de $LOG_DIR/https-access_log"
    
    # Rechercher les tentatives d'exploitation
    echo "" | tee -a "$OUTPUT_FILE"
    echo "--- Requêtes suspectes vers endpoints vulnérables ---" | tee -a "$OUTPUT_FILE"
    
    EXPLOIT_ATTEMPTS=$(grep -E '/mifs/c/(aft|app)store/fob/' "$LOG_DIR/https-access_log" | grep " 404 ")
    
    if [ ! -z "$EXPLOIT_ATTEMPTS" ]; then
        log_finding "CRITICAL" "Tentatives d'exploitation détectées dans les logs Apache!"
        echo "$EXPLOIT_ATTEMPTS" | tee -a "$OUTPUT_FILE"
        
        # Compter les tentatives
        COUNT=$(echo "$EXPLOIT_ATTEMPTS" | wc -l)
        log_finding "CRITICAL" "Nombre de requêtes suspectes: $COUNT"
        
        # Extraire les IPs sources
        echo "" | tee -a "$OUTPUT_FILE"
        echo "--- IPs sources des attaquants ---" | tee -a "$OUTPUT_FILE"
        echo "$EXPLOIT_ATTEMPTS" | awk '{print $1}' | sort -u | tee -a "$OUTPUT_FILE"
    else
        log_finding "INFO" "Aucune tentative d'exploitation évidente détectée"
    fi
    
    # Rechercher des commandes bash dans les logs
    echo "" | tee -a "$OUTPUT_FILE"
    echo "--- Requêtes contenant des commandes bash ---" | tee -a "$OUTPUT_FILE"
    
    BASH_COMMANDS=$(grep -E '/mifs/c/(aft|app)store/fob/' "$LOG_DIR/https-access_log" | grep -E '(\`|sleep|wget|curl|bash|sh|nc|ncat|id|whoami|uname)')
    
    if [ ! -z "$BASH_COMMANDS" ]; then
        log_finding "CRITICAL" "Commandes bash détectées dans les requêtes HTTP!"
        echo "$BASH_COMMANDS" | tee -a "$OUTPUT_FILE"
    fi
    
    # Rechercher gPath et theValue (marqueurs d'exploitation)
    ARITHMETIC_EXPANSION=$(grep -E "gPath\[|theValue" "$LOG_DIR/https-access_log")
    
    if [ ! -z "$ARITHMETIC_EXPANSION" ]; then
        log_finding "CRITICAL" "Marqueurs d'exploitation par arithmetic expansion détectés!"
        echo "$ARITHMETIC_EXPANSION" | tee -a "$OUTPUT_FILE"
    fi
    
else
    log_finding "WARNING" "Fichier de log Apache introuvable: $LOG_DIR/https-access_log"
fi

# =====================================
# 2. RECHERCHE DE WEBSHELLS
# =====================================
echo ""
echo "=== Recherche de webshells ==="

# Pages d'erreur JSP modifiées
ERROR_PAGES=("401.jsp" "404.jsp" "500.jsp" "403.jsp")

for page in "${ERROR_PAGES[@]}"; do
    FOUND=$(find "$TOMCAT_DIR" -name "$page" -type f)
    
    if [ ! -z "$FOUND" ]; then
        while IFS= read -r file; do
            # Vérifier la date de modification récente (30 derniers jours)
            if [ $(find "$file" -mtime -30 2>/dev/null | wc -l) -gt 0 ]; then
                log_finding "CRITICAL" "Page d'erreur modifiée récemment: $file"
                
                # Rechercher des patterns de webshell
                if grep -q -E "(Runtime\.getRuntime\(\)\.exec|ProcessBuilder|cmd|request\.getParameter)" "$file" 2>/dev/null; then
                    log_finding "CRITICAL" "Webshell détecté dans: $file"
                    echo "Contenu suspect:" | tee -a "$OUTPUT_FILE"
                    grep -n -E "(Runtime\.getRuntime\(\)\.exec|ProcessBuilder|cmd|request\.getParameter)" "$file" | tee -a "$OUTPUT_FILE"
                fi
            fi
        done <<< "$FOUND"
    fi
done

# Rechercher tous les JSP récents
echo "" | tee -a "$OUTPUT_FILE"
echo "--- Fichiers JSP créés dans les 30 derniers jours ---" | tee -a "$OUTPUT_FILE"

RECENT_JSP=$(find "$EPMM_DIR" -name "*.jsp" -type f -mtime -30 2>/dev/null)

if [ ! -z "$RECENT_JSP" ]; then
    log_finding "WARNING" "Fichiers JSP récents trouvés:"
    echo "$RECENT_JSP" | tee -a "$OUTPUT_FILE"
fi

# Rechercher fichiers WAR/JAR suspects
echo "" | tee -a "$OUTPUT_FILE"
echo "--- Fichiers WAR/JAR créés dans les 30 derniers jours ---" | tee -a "$OUTPUT_FILE"

RECENT_WAR_JAR=$(find "$TOMCAT_DIR/webapps" -type f \( -name "*.war" -o -name "*.jar" \) -mtime -30 2>/dev/null)

if [ ! -z "$RECENT_WAR_JAR" ]; then
    log_finding "WARNING" "Fichiers WAR/JAR récents trouvés:"
    echo "$RECENT_WAR_JAR" | tee -a "$OUTPUT_FILE"
fi

# =====================================
# 3. RECHERCHE DE BACKDOORS ET PERSISTENCE
# =====================================
echo ""
echo "=== Recherche de backdoors et persistence ==="

# Scripts shell suspects
echo "" | tee -a "$OUTPUT_FILE"
echo "--- Scripts shell récents dans /tmp et /var/tmp ---" | tee -a "$OUTPUT_FILE"

SUSPICIOUS_SCRIPTS=$(find /tmp /var/tmp -type f \( -name "*.sh" -o -name "*.bash" \) -mtime -30 2>/dev/null)

if [ ! -z "$SUSPICIOUS_SCRIPTS" ]; then
    log_finding "WARNING" "Scripts shell suspects trouvés:"
    echo "$SUSPICIOUS_SCRIPTS" | tee -a "$OUTPUT_FILE"
fi

# Cron jobs modifiés
echo "" | tee -a "$OUTPUT_FILE"
echo "--- Cron jobs modifiés récemment ---" | tee -a "$OUTPUT_FILE"

RECENT_CRON=$(find /etc/cron* /var/spool/cron -type f -mtime -30 2>/dev/null)

if [ ! -z "$RECENT_CRON" ]; then
    log_finding "WARNING" "Cron jobs modifiés:"
    echo "$RECENT_CRON" | tee -a "$OUTPUT_FILE"
fi

# Comptes utilisateurs créés récemment
echo "" | tee -a "$OUTPUT_FILE"
echo "--- Comptes utilisateurs créés dans les 30 derniers jours ---" | tee -a "$OUTPUT_FILE"

# Date il y a 30 jours
THIRTY_DAYS_AGO=$(date -d "30 days ago" +%Y-%m-%d 2>/dev/null || date -v-30d +%Y-%m-%d)

awk -F: -v date="$THIRTY_DAYS_AGO" '$3 >= 1000 {print $1}' /etc/passwd | while read user; do
    # Vérifier la date de création via chage (si disponible)
    if command -v chage &> /dev/null; then
        CREATED=$(chage -l "$user" 2>/dev/null | grep "Last password change" | cut -d: -f2)
        if [ ! -z "$CREATED" ]; then
            log_finding "WARNING" "Utilisateur récent détecté: $user (créé: $CREATED)"
        fi
    fi
done | tee -a "$OUTPUT_FILE"

# Clés SSH ajoutées
echo "" | tee -a "$OUTPUT_FILE"
echo "--- Clés SSH modifiées récemment ---" | tee -a "$OUTPUT_FILE"

RECENT_SSH_KEYS=$(find /root/.ssh /home/*/.ssh -name "authorized_keys" -mtime -30 2>/dev/null)

if [ ! -z "$RECENT_SSH_KEYS" ]; then
    log_finding "WARNING" "Fichiers authorized_keys modifiés:"
    echo "$RECENT_SSH_KEYS" | tee -a "$OUTPUT_FILE"
fi

# =====================================
# 4. ANALYSE DES CONNEXIONS RÉSEAU
# =====================================
echo ""
echo "=== Analyse des connexions réseau ==="

# Connexions établies suspectes
echo "" | tee -a "$OUTPUT_FILE"
echo "--- Connexions réseau sortantes actives ---" | tee -a "$OUTPUT_FILE"

ESTABLISHED_CONNECTIONS=$(netstat -antp 2>/dev/null | grep ESTABLISHED | grep -v "127.0.0.1" | grep -v "::1")

if [ ! -z "$ESTABLISHED_CONNECTIONS" ]; then
    log_finding "INFO" "Connexions établies:"
    echo "$ESTABLISHED_CONNECTIONS" | tee -a "$OUTPUT_FILE"
fi

# Processus suspects avec connexions réseau
echo "" | tee -a "$OUTPUT_FILE"
echo "--- Processus bash avec connexions réseau ---" | tee -a "$OUTPUT_FILE"

BASH_NETWORK=$(lsof -i -n | grep bash)

if [ ! -z "$BASH_NETWORK" ]; then
    log_finding "CRITICAL" "Processus bash avec connexions réseau détectés (possible reverse shell)!"
    echo "$BASH_NETWORK" | tee -a "$OUTPUT_FILE"
fi

# =====================================
# 5. ANALYSE DES PROCESSUS
# =====================================
echo ""
echo "=== Analyse des processus suspects ==="

# Processus avec commandes bash suspectes
SUSPICIOUS_PROCS=$(ps aux | grep -E "(nc|ncat|bash -i|/dev/tcp|bash -c)" | grep -v grep)

if [ ! -z "$SUSPICIOUS_PROCS" ]; then
    log_finding "CRITICAL" "Processus suspects détectés:"
    echo "$SUSPICIOUS_PROCS" | tee -a "$OUTPUT_FILE"
fi

# =====================================
# 6. VÉRIFICATION DES CORRECTIFS
# =====================================
echo ""
echo "=== Vérification des correctifs appliqués ==="

# Vérifier si les RPM de sécurité sont installés
RPM_PATCH=$(rpm -qa | grep "ivanti-security-update-1761642")

if [ ! -z "$RPM_PATCH" ]; then
    log_finding "INFO" "Correctif de sécurité détecté: $RPM_PATCH"
else
    log_finding "CRITICAL" "Aucun correctif de sécurité détecté! Système potentiellement vulnérable!"
fi

# Vérifier les classes Java patchées
if [ -f "/mi/bin/AppStoreUrlMapper.class" ] && [ -f "/mi/bin/AFTUrlMapper.class" ]; then
    log_finding "INFO" "Classes Java patchées présentes"
else
    log_finding "WARNING" "Classes Java patchées absentes"
fi

# =====================================
# 7. RÉSUMÉ
# =====================================
echo ""
echo "╔═══════════════════════════════════════════════════════════════╗"
echo "║                    RÉSUMÉ DE L'ANALYSE                        ║"
echo "╚═══════════════════════════════════════════════════════════════╝"
echo ""

log_finding "INFO" "Analyse terminée - $(date)"
log_finding "INFO" "Rapport complet enregistré dans: $OUTPUT_FILE"

echo ""
echo "Actions recommandées si compromission détectée:"
echo "1. Isoler immédiatement le système EPMM du réseau"
echo "2. Créer un snapshot/backup du disque pour analyse forensique"
echo "3. Contacter votre CSIRT/SOC"
echo "4. Consulter: https://www.cert.ssi.gouv.fr/alerte/CERTFR-2026-ALE-001/"
echo ""

# Créer un tarball avec les preuves
EVIDENCE_DIR="epmm_evidence_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$EVIDENCE_DIR"

# Copier les logs pertinents
if [ -f "$LOG_DIR/https-access_log" ]; then
    cp "$LOG_DIR/https-access_log" "$EVIDENCE_DIR/" 2>/dev/null
fi

# Copier la liste des fichiers récents
find "$EPMM_DIR" -mtime -30 -ls > "$EVIDENCE_DIR/recent_files.txt" 2>/dev/null

# Créer l'archive
tar -czf "${EVIDENCE_DIR}.tar.gz" "$EVIDENCE_DIR" "$OUTPUT_FILE" 2>/dev/null
rm -rf "$EVIDENCE_DIR"

log_finding "INFO" "Archive de preuves créée: ${EVIDENCE_DIR}.tar.gz"

echo ""
echo "Analyse terminée."