import sys
import os
import time
import subprocess
import concurrent.futures
import requests
import math
import threading
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# --- CONFIG OPTIMASI SERVER 2012 (16GB RAM, 8 CPU) ---
DEFAULT_THREADS = 300 # Dikurangi biar ga overload
TOTAL_WINDOWS = 5 # 5 PART untuk 1GB domain
CHUNK_SIZE_MB = 500 # 200MB per part (total 1GB)
# Disable SSL & Error Warnings
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
if os.name == "nt":
os.system("cls")
if len(sys.argv) > 1 and sys.argv[1] == "--worker":
os.system(f"title WP+JOOMLA WORKER PART {sys.argv[4]}/5 - {sys.argv[5]}")
else:
os.system("title MASTER LAUNCHER (5 PART MODE)")
else:
os.system("clear")
class bcolors:
OKGREEN = '\033[92m'
OKCYAN = '\033[96m'
WARNING = '\033[93m'
FAIL = '\033[91m'
MAGENTA = '\033[95m' # Joomla
ENDC = '\033[0m'
# ==========================================
# JOOMLA DETECTION FUNCTION
# ==========================================
JOOMLA_KEYWORDS = [
'content="joomla', 'joomla! administration', 'option=com_login',
'/administrator/templates/', 'name="task" value="login"',
'id="form-login"', 'joomla-version', 'mod-login-username'
]
ADMIN_PATHS = ['/administrator/', '/administrator/index.php']
def check_joomla(url, joomla_file):
"""Fast Joomla Detection"""
try:
url = url.strip()
if not url: return
target = url if url.startswith("http") else "http://" + url
clean_domain = target.replace('http://', '').replace('https://', '').split('/')[0]
# Test Admin Paths
for path in ADMIN_PATHS:
test_url = f"http://{clean_domain}{path}"
try:
with requests.Session() as s:
s.verify = False
resp = s.get(test_url, timeout=(3, 7), allow_redirects=True)
if resp.status_code == 200:
content = resp.text[:15000].lower()
for keyword in JOOMLA_KEYWORDS:
if keyword in content:
print(f"{bcolors.MAGENTA}[JOOMLA HIT] {test_url}{bcolors.ENDC}")
with open(joomla_file, "a", encoding='utf-8') as f:
f.write(test_url + "\n")
return
except:
continue
except:
pass
# ==========================================
# WORKER LOGIC (WP + JOOMLA)
# ==========================================
def worker_mode():
try:
filename = sys.argv[2]
total_parts = int(sys.argv[3])
current_part = int(sys.argv[4])
threads = int(sys.argv[5])
except:
print("Usage error!")
sys.exit()
wp_file = f"wordpress_part{current_part}.txt"
joomla_file = f"joomla_part{current_part}.txt"
print(bcolors.OKCYAN + f"""
[⚡] HYBRID SCANNER PART {current_part}/{total_parts}
[⚡] Target: {filename}
[⚡] Threads: {threads}
[⚡] WP Results: {wp_file}
[⚡] Joomla Results: {joomla_file}
""" + bcolors.ENDC)
# Smart Byte Splitting (1GB = 5x200MB)
file_size = os.path.getsize(filename)
chunk_size = file_size // total_parts
start_byte = (current_part - 1) * chunk_size
end_byte = start_byte + chunk_size
if current_part == total_parts:
end_byte = file_size
def check_wordpress(url):
try:
url = url.strip()
if not url: return
target = url if url.startswith("http") else "http://" + url
with requests.Session() as s:
s.verify = False
resp = s.get(target + "/license.txt", timeout=(3, 7), allow_redirects=True)
if 'WordPress' in resp.text:
print(f"{bcolors.OKGREEN}[WP HIT] {target}{bcolors.ENDC}")
with open(wp_file, "a", encoding='utf-8') as f:
f.write(target + "\n")
except:
pass
def process_line(line):
"""Process single line: Check WP first, then Joomla"""
url = line.strip()
if not url: return
check_wordpress(url)
check_joomla(url, joomla_file)
# Memory Efficient Processing
pool = concurrent.futures.ThreadPoolExecutor(max_workers=threads)
futures = []
processed = 0
with open(filename, 'r', encoding='utf-8', errors='ignore') as f:
f.seek(start_byte)
if current_part > 1:
f.readline() # Skip partial line
while f.tell() < end_byte:
line = f.readline()
if not line:
break
futures.append(pool.submit(process_line, line))
processed += 1
# Batch processing (anti-memory leak)
if len(futures) >= threads * 2:
concurrent.futures.wait(futures[:threads], timeout=10)
futures = futures[threads:]
# Cleanup
concurrent.futures.wait(futures)
print(bcolors.OKGREEN + f"\n[✓] PART {current_part} FINISHED | Processed: {processed:,}" + bcolors.ENDC)
print(f"[✓] WP Results: {wp_file}")
print(f"[✓] Joomla Results: {joomla_file}")
input("Press Enter to exit...")
# ==========================================
# MASTER LAUNCHER (5 PART AUTOMATIC)
# ==========================================
def master_mode():
print(bcolors.WARNING + f"""
==================================================
HYBRID WP+JOOMLA SCANNER (5 PART - SERVER 2012)
5 CMD Windows x {DEFAULT_THREADS} Threads each
Total: 1000 Threads | Separate WP/Joomla Results
==================================================
""" + bcolors.ENDC)
filename = input("Enter domain list filename: ").strip()
if not os.path.exists(filename):
print(bcolors.FAIL + "File not found!" + bcolors.ENDC)
sys.exit()
file_size_mb = os.path.getsize(filename) / (1024*1024)
print(f"\n[+] File: {filename} ({file_size_mb:.1f} MB)")
print(f"[+] Launching {TOTAL_WINDOWS} CMD windows...")
time.sleep(2)
# Launch 5 Workers
script_path = os.path.abspath(sys.argv[0])
for i in range(1, TOTAL_WINDOWS + 1):
cmd = f'start "Hybrid-Part{i}" /min cmd /k python "{script_path}" --worker "{filename}" {TOTAL_WINDOWS} {i} {DEFAULT_THREADS}'
os.system(cmd)
print(f"[+] Launched Part {i}/5")
time.sleep(1)
print(bcolors.OKGREEN + "\n[✓] All 5 windows launched! Check taskbar." + bcolors.ENDC)
print("Results will be saved as:")
print("- wordpress_part1.txt ... wordpress_part5.txt")
print("- joomla_part1.txt ... joomla_part5.txt")
input("Master will stay open. Press Enter to close...")
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "--worker":
worker_mode()
else:
master_mode()
PYTHON
7,264 characters