Created
April 30, 2026 07:46
-
-
Save mdpuma/aa6cc54ac7e367708222d0f1a4fc0ae0 to your computer and use it in GitHub Desktop.
ioc_checksessions_files.sh
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment