#!/bin/bash # Scan for compromised session files SESSIONS_DIR="/var/cpanel/sessions" COMPROMISED=0 echo "[*] Scanning session files for injection indicators..." for session_file in "$SESSIONS_DIR"/raw/*; do [ -f "$session_file" ] || continue session_name=$(basename "$session_file") # Check if this session is/was pre-auth preauth_file="$SESSIONS_DIR/preauth/$session_name" # IOC 0: Session has both token_denied AND cp_security_token and method=badpass origin (strong indicator of exploitation) # # token_denied is set by do_token_denied() in cpsrvd when a request # supplies an incorrect security token. cp_security_token is the # attacker-injected token value. This combination indicates: # # 1. Attacker injected a cp_security_token via newline payload # 2. Attacker attempted to use the injected token # 3. cpsrvd recorded the token mismatch (token_denied counter) # during the exploitation window before the session was # fully promoted # # In a legitimate session: # - token_denied is only present after a user-initiated # security token failure (rare, typically from expired bookmarks) # - It would never co-exist with a badpass origin AND an # attacker-controlled cp_security_token # # This IOC catches BOTH successful and failed exploitation attempts. if grep -q '^token_denied=' "$session_file" && \ grep -q '^cp_security_token=' "$session_file"; then # Extract values for triage context token_val=$(grep '^cp_security_token=' "$session_file" | head -1 | cut -d= -f2) denied_val=$(grep '^token_denied=' "$session_file" | head -1 | cut -d= -f2) origin=$(grep '^origin_as_string=' "$session_file" | head -1 | cut -d= -f2-) used=$(grep -a "$token_val" /usr/local/cpanel/logs/access_log | grep -m1 " 200 ") external_auth=$(grep '^successful_external_auth_with_timestamp=' "$session_file") # High confidence if origin is badpass (session was pre-auth) if grep -q '^origin_as_string=.*method=badpass' "$session_file"; then if [ -z "$external_auth" ] && [ -z "$used" ]; then echo "Found possible injected session file: $session_file" echo " - No sign of usage" else echo "[!] CRITICAL: Exploitation artifact - token_denied with injected cp_security_token: $session_file" echo " - cp_security_token=$token_val" echo " - token_denied=$denied_val" echo " - origin=$origin" echo " - Verdict: Session was pre-auth (badpass origin) with attacker-injected token" echo " - USED: $used" COMPROMISED=1 fi # Medium confidence but still suspicious for any session else echo "[!] WARNING: Suspicious session with token_denied + cp_security_token: $session_file" echo " - cp_security_token=$token_val" echo " - token_denied=$denied_val" echo " - origin=$origin" echo " - Review manually: may be legitimate token expiration or exploitation attempt" fi fi # IOC 1: Pre-auth session with authenticated attributes if [ -f "$preauth_file" ]; then if grep -qE '^successful_external_auth_with_timestamp=' "$session_file"; then echo "[!] CRITICAL: Injected session detected: $session_file" echo " - Contains 'successful_external_auth_with_timestamp' in pre-auth session" COMPROMISED=1 fi fi # IOC 2: Any session with tfa_verified but no valid origin if grep -q '^tfa_verified=1' "$session_file" && \ ! grep -q '^origin_as_string=.*method=handle_form_login' "$session_file" && \ ! grep -q '^origin_as_string=.*method=create_user_session' "$session_file" && \ ! grep -q '^origin_as_string=.*method=handle_auth_transfer' "$session_file"; then echo "[!] WARNING: Session with tfa_verified but suspicious origin: $session_file" COMPROMISED=1 fi # IOC 3: Password field containing newlines (corrupted session file) if grep -qP '^pass=.*\n.' "$session_file" 2>/dev/null; then echo "[!] CRITICAL: Multi-line pass value detected: $session_file" COMPROMISED=1 fi done if [ "$COMPROMISED" -eq 0 ]; then echo "" echo "[+] No indicators of compromise found." else echo "" echo "[!] INDICATORS OF COMPROMISE DETECTED - IMMEDIATE ACTION REQUIRED" echo " 1. Purge all affected sessions" echo " 2. Force password reset for root and all WHM users" echo " 3. Audit /var/log/wtmp and WHM access logs for unauthorized access" echo " 4. Check for persistence mechanisms (cron, SSH keys, backdoors)" fi