CMS Checker .py

Created Apr 1, 2026 29 views Python
Raw
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
Quick Actions
Create New Paste Open Raw