#!/bin/bash ################################################################################ # Attack Pattern Detection Library ################################################################################ # Purpose: Shared attack vector detection for bot-analyzer and live-monitor # Features: SQL injection, XSS, Path traversal, RCE, Info disclosure, Bruteforce ################################################################################ # SQL Injection Detection # Returns: 0 (true) if SQL injection detected, 1 (false) if not detect_sql_injection() { local url="$1" local url_lower=$(echo "$url" | tr '[:upper:]' '[:lower:]') # Enhanced SQL injection patterns if [[ "$url_lower" =~ (union.*select|concat\(|benchmark\(|sleep\(|waitfor|cast\(|exec\() ]] || [[ "$url_lower" =~ (information_schema|drop table|insert into|update.*set|delete from) ]] || [[ "$url_lower" =~ (%27|0x[0-9a-f]+|hex\(|unhex\(|load_file\() ]]; then return 0 fi return 1 } # XSS (Cross-Site Scripting) Detection detect_xss() { local url="$1" local url_lower=$(echo "$url" | tr '[:upper:]' '[:lower:]') if [[ "$url_lower" =~ () ]] || [[ "$url_lower" =~ (%7b%7b|%7b%25|%24%7b) ]] || [[ "$url_lower" =~ (7\*7|config\.|self\.|request\.|env\.) ]]; then return 0 fi return 1 } # Encoding Bypass Detection (Multiple layers of encoding) detect_encoding_bypass() { local url="$1" # Double/triple URL encoding (bypass WAF) if [[ "$url" =~ %25[0-9a-fA-F]{2} ]] || [[ "$url" =~ (%252[0-9a-fA-F]|%25%32|%2525) ]]; then return 0 fi # Unicode/UTF-8 bypass attempts if [[ "$url" =~ (%u[0-9a-fA-F]{4}|\\u[0-9a-fA-F]{4}) ]] || [[ "$url" =~ (%c0%af|%e0%80%af) ]]; then return 0 fi return 1 } # Suspicious User-Agent Detection detect_suspicious_ua() { local user_agent="$1" local ua_lower=$(echo "$user_agent" | tr '[:upper:]' '[:lower:]') # Empty or missing UA (common in automated attacks) if [ -z "$user_agent" ] || [ "$user_agent" = "-" ]; then return 0 fi # Common attack tools and scanners if [[ "$ua_lower" =~ (nikto|nmap|masscan|nessus|acunetix|burp|sqlmap|metasploit) ]] || [[ "$ua_lower" =~ (havij|pangolin|w3af|skipfish|dirbuster|gobuster|wpscan|joomla) ]] || [[ "$ua_lower" =~ (nuclei|jaeles|ffuf|hydra|medusa|zgrab|shodan|censys) ]] || [[ "$ua_lower" =~ (python-requests|curl/|wget/|libwww-perl|go-http-client) ]] || [[ "$ua_lower" =~ (scrapy|mechanize|httpclient|okhttp|urllib|axios) ]]; then return 0 fi # Suspicious patterns if [[ "$ua_lower" =~ (bot|crawler|spider|scraper) ]] && [[ ! "$ua_lower" =~ (googlebot|bingbot|slurp|duckduckbot|baiduspider|yandexbot|facebookexternalhit) ]]; then return 0 fi # Very short UA (< 10 chars, likely fake) if [ ${#user_agent} -lt 10 ]; then return 0 fi # Generic/suspicious patterns if [[ "$ua_lower" =~ ^(mozilla/[45]\.0|test|scanner|exploit|attack|shell) ]]; then return 0 fi return 1 } # Tor/VPN/Proxy Detection (IP-based patterns) detect_anonymizer() { local ip="$1" # Known Tor exit node patterns (common ranges - not exhaustive) # Note: For production, should use actual Tor exit node lists # This is a simplified detection based on common patterns # VPN/Proxy indicators in IP behavior require historical analysis # This function is a placeholder for IP reputation integration # Real implementation would check against: # - Tor exit node lists (https://check.torproject.org/exit-addresses) # - VPN provider IP ranges # - Known proxy/datacenter ranges # For now, we'll flag datacenter/hosting IPs which are common for VPNs # This requires external IP reputation data return 1 # Placeholder - requires external data integration } # Advanced Bot Fingerprinting (behavior-based) detect_bot_fingerprint() { local user_agent="$1" local ua_lower=$(echo "$user_agent" | tr '[:upper:]' '[:lower:]') # Headless browser detection if [[ "$ua_lower" =~ (headless|phantom|selenium|puppeteer|playwright|chromium.*headless) ]] || [[ "$ua_lower" =~ (chrome/.*headless|firefox.*headless) ]]; then return 0 fi # Automated browser frameworks if [[ "$ua_lower" =~ (webdriver|automation|bot\.html|slimer|casper) ]]; then return 0 fi # Missing common browser components (suspicious) # Real browsers include: Mozilla, AppleWebKit, Chrome/Firefox/Safari if [[ "$ua_lower" =~ mozilla ]] && [[ ! "$ua_lower" =~ (applewebkit|gecko|chrome|firefox|safari|edge) ]]; then return 0 fi return 1 } # Credential Stuffing / Password Spraying Detection detect_credential_stuffing() { local url="$1" local method="${2:-GET}" local url_lower=$(echo "$url" | tr '[:upper:]' '[:lower:]') # Must be POST to login endpoints if [ "$method" != "POST" ]; then return 1 fi # Common credential stuffing targets if [[ "$url_lower" =~ (wp-login\.php|xmlrpc\.php) ]] || [[ "$url_lower" =~ (/login|/signin|/auth|/authenticate|/session) ]] || [[ "$url_lower" =~ (/api/login|/api/auth|/api/token|/oauth/token) ]] || [[ "$url_lower" =~ (/user/login|/account/login|/customer/login) ]]; then return 0 fi return 1 } # API Abuse Detection detect_api_abuse() { local url="$1" local method="${2:-GET}" local url_lower=$(echo "$url" | tr '[:upper:]' '[:lower:]') # API endpoint patterns if [[ "$url_lower" =~ (/api/|/v[0-9]+/|/rest/|/graphql|/webhook) ]] || [[ "$url_lower" =~ \.json(\?|$)|\.xml(\?|$) ]]; then # Suspicious API patterns if [[ "$url_lower" =~ (/api/.*admin|/api/.*debug|/api/.*test|/api/.*internal) ]] || [[ "$url_lower" =~ (/api/users/all|/api/.*dump|/api/.*export|/api/backup) ]] || [[ "$url_lower" =~ (/api/.*delete|/api/.*drop|/api/.*truncate) ]]; then return 0 fi # Mass data extraction attempts if [[ "$url_lower" =~ (limit=[0-9]{4,}|limit=999|per_page=[0-9]{3,}) ]] || [[ "$url_lower" =~ (offset=[0-9]{5,}|page=[0-9]{3,}) ]]; then return 0 fi fi return 1 } # Content Management System (CMS) Vulnerability Probing detect_cms_exploit() { local url="$1" local url_lower=$(echo "$url" | tr '[:upper:]' '[:lower:]') # WordPress vulnerabilities if [[ "$url_lower" =~ (wp-content/plugins/.*\.\.|wp-content/themes/.*\.\.) ]] || [[ "$url_lower" =~ (wp-json/wp/v2/users|wp-json/.*users) ]] || [[ "$url_lower" =~ (wp-config\.php|wp-admin/install\.php|wp-admin/setup-config\.php) ]]; then return 0 fi # Drupal vulnerabilities if [[ "$url_lower" =~ (/user/register|/user/password|/?q=node/add) ]] || [[ "$url_lower" =~ (drupalgeddon|sites/default/files/\.\./) ]]; then return 0 fi # Joomla vulnerabilities if [[ "$url_lower" =~ (index\.php\?option=com_|/configuration\.php) ]] || [[ "$url_lower" =~ (com_foxcontact|com_fabrik|com_user) ]]; then return 0 fi # Generic CMS probing if [[ "$url_lower" =~ (readme\.html|license\.txt|changelog\.txt) ]] || [[ "$url_lower" =~ (/install/|/setup/|/upgrade/|/migration/) ]]; then return 0 fi return 1 } # E-commerce Platform Exploitation detect_ecommerce_exploit() { local url="$1" local url_lower=$(echo "$url" | tr '[:upper:]' '[:lower:]') # Shopping cart manipulation if [[ "$url_lower" =~ (price=0|price=-|quantity=-|discount=100) ]] || [[ "$url_lower" =~ (total=0|amount=0\.0|cost=0) ]]; then return 0 fi # Payment bypass attempts if [[ "$url_lower" =~ (payment.*bypass|order.*complete|checkout.*skip) ]] || [[ "$url_lower" =~ (invoice.*paid|transaction.*success) ]]; then return 0 fi # Common e-commerce platforms if [[ "$url_lower" =~ (magento.*admin|shopify.*admin|woocommerce.*admin) ]] || [[ "$url_lower" =~ (/admin/sales/|/admin/order/|/admin/customer/) ]]; then return 0 fi return 1 } # Detect all attack vectors for a URL # Returns: attack_type1,attack_type2,... or empty if none # Parameters: url method user_agent ip detect_all_attacks() { local url="$1" local method="${2:-GET}" local user_agent="${3:-}" local ip="${4:-}" local attacks=() # URL-based detection (OWASP Top 10 + Modern Vectors) detect_sql_injection "$url" && attacks+=("SQL_INJECTION") detect_xss "$url" && attacks+=("XSS") detect_path_traversal "$url" && attacks+=("PATH_TRAVERSAL") detect_rce "$url" "$method" && attacks+=("RCE") detect_info_disclosure "$url" && attacks+=("INFO_DISCLOSURE") detect_login_bruteforce_url "$url" && attacks+=("BRUTEFORCE") detect_admin_probe "$url" && attacks+=("ADMIN_PROBE") detect_xxe "$url" && attacks+=("XXE") detect_ssrf "$url" && attacks+=("SSRF") detect_nosql_injection "$url" && attacks+=("NOSQL_INJECTION") detect_template_injection "$url" && attacks+=("TEMPLATE_INJECTION") detect_encoding_bypass "$url" && attacks+=("ENCODING_BYPASS") # Application-specific detection detect_credential_stuffing "$url" "$method" && attacks+=("CREDENTIAL_STUFFING") detect_api_abuse "$url" "$method" && attacks+=("API_ABUSE") detect_cms_exploit "$url" && attacks+=("CMS_EXPLOIT") detect_ecommerce_exploit "$url" && attacks+=("ECOMMERCE_EXPLOIT") # User-Agent based detection if [ -n "$user_agent" ]; then detect_suspicious_ua "$user_agent" && attacks+=("SUSPICIOUS_UA") detect_bot_fingerprint "$user_agent" && attacks+=("BOT_FINGERPRINT") fi # IP-based detection if [ -n "$ip" ]; then detect_anonymizer "$ip" && attacks+=("ANONYMIZER") fi if [ ${#attacks[@]} -gt 0 ]; then IFS=','; echo "${attacks[*]}" else echo "" fi } # Calculate threat score based on attack types # Returns: score (0-100) calculate_attack_score() { local attacks="$1" local score=0 # Use word boundaries to avoid false matches (e.g., RCE in BRUTEFORCE) [[ "$attacks" =~ (^|,)SQL_INJECTION(,|$) ]] && score=$((score + 15)) [[ "$attacks" =~ (^|,)XSS(,|$) ]] && score=$((score + 12)) [[ "$attacks" =~ (^|,)PATH_TRAVERSAL(,|$) ]] && score=$((score + 15)) [[ "$attacks" =~ (^|,)RCE(,|$) ]] && score=$((score + 20)) [[ "$attacks" =~ (^|,)INFO_DISCLOSURE(,|$) ]] && score=$((score + 8)) [[ "$attacks" =~ (^|,)BRUTEFORCE(,|$) ]] && score=$((score + 10)) [[ "$attacks" =~ (^|,)ADMIN_PROBE(,|$) ]] && score=$((score + 5)) [[ "$attacks" =~ (^|,)DDOS(,|$) ]] && score=$((score + 25)) [[ "$attacks" =~ (^|,)XXE(,|$) ]] && score=$((score + 18)) [[ "$attacks" =~ (^|,)SSRF(,|$) ]] && score=$((score + 18)) [[ "$attacks" =~ (^|,)NOSQL_INJECTION(,|$) ]] && score=$((score + 15)) [[ "$attacks" =~ (^|,)TEMPLATE_INJECTION(,|$) ]] && score=$((score + 20)) [[ "$attacks" =~ (^|,)ENCODING_BYPASS(,|$) ]] && score=$((score + 12)) [[ "$attacks" =~ (^|,)SUSPICIOUS_UA(,|$) ]] && score=$((score + 10)) [[ "$attacks" =~ (^|,)BOT_FINGERPRINT(,|$) ]] && score=$((score + 8)) [[ "$attacks" =~ (^|,)ANONYMIZER(,|$) ]] && score=$((score + 15)) [[ "$attacks" =~ (^|,)CREDENTIAL_STUFFING(,|$) ]] && score=$((score + 18)) [[ "$attacks" =~ (^|,)API_ABUSE(,|$) ]] && score=$((score + 12)) [[ "$attacks" =~ (^|,)CMS_EXPLOIT(,|$) ]] && score=$((score + 16)) [[ "$attacks" =~ (^|,)ECOMMERCE_EXPLOIT(,|$) ]] && score=$((score + 20)) echo "$score" } # Get attack icon for display get_attack_icon() { local attack_type="$1" case "$attack_type" in SQL_INJECTION) echo "💉" ;; XSS) echo "⚠️ " ;; PATH_TRAVERSAL) echo "📁" ;; RCE) echo "☠️ " ;; INFO_DISCLOSURE) echo "🔓" ;; BRUTEFORCE) echo "🔐" ;; ADMIN_PROBE) echo "🔍" ;; DDOS) echo "💥" ;; XXE) echo "📄" ;; SSRF) echo "🌐" ;; NOSQL_INJECTION) echo "🗄️ " ;; TEMPLATE_INJECTION) echo "📝" ;; ENCODING_BYPASS) echo "🔀" ;; SUSPICIOUS_UA) echo "🎭" ;; BOT_FINGERPRINT) echo "🤖" ;; ANONYMIZER) echo "🕶️ " ;; CREDENTIAL_STUFFING) echo "🔑" ;; API_ABUSE) echo "⚡" ;; CMS_EXPLOIT) echo "🎯" ;; ECOMMERCE_EXPLOIT) echo "💳" ;; BOT) echo "🤖" ;; SCANNER) echo "🔎" ;; *) echo "❓" ;; esac } # Get attack color for display get_attack_color() { local attack_type="$1" case "$attack_type" in SQL_INJECTION|RCE|TEMPLATE_INJECTION|ECOMMERCE_EXPLOIT) echo '\033[1;41;97m' ;; # White on Red (CRITICAL) XSS|PATH_TRAVERSAL|BRUTEFORCE|XXE|SSRF|NOSQL_INJECTION|ANONYMIZER|CREDENTIAL_STUFFING|CMS_EXPLOIT) echo '\033[1;31m' ;; # Bold Red (HIGH) INFO_DISCLOSURE|ADMIN_PROBE|ENCODING_BYPASS|SUSPICIOUS_UA|BOT_FINGERPRINT|API_ABUSE) echo '\033[1;33m' ;; # Bold Yellow (MEDIUM) *) echo '\033[0;36m' ;; # Cyan (LOW) esac } export -f detect_sql_injection export -f detect_xss export -f detect_path_traversal export -f detect_rce export -f detect_info_disclosure export -f detect_login_bruteforce_url export -f detect_admin_probe export -f detect_xxe export -f detect_ssrf export -f detect_nosql_injection export -f detect_template_injection export -f detect_encoding_bypass export -f detect_suspicious_ua export -f detect_anonymizer export -f detect_bot_fingerprint export -f detect_credential_stuffing export -f detect_api_abuse export -f detect_cms_exploit export -f detect_ecommerce_exploit export -f detect_all_attacks export -f calculate_attack_score export -f get_attack_icon export -f get_attack_color