
Réécriture CLI du PoC Drupalgeddon2 (CVE-2018-7600) — pour tests/éducation autorisés
Une réécriture en ligne de commande du proof-of-concept Drupalgeddon2 (CVE-2018-7600), construite comme exercice d'étude dans le cadre du module Attacking Common Applications de la Hack The Box Academy.
[!WARNING] Pour les tests de sécurité autorisés et à des fins éducatives uniquement. Exécuter cet outil contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite est illégal dans la plupart des juridictions. Voir Utilisation légale et responsable.
[!NOTE] Implémentation écrite avec l'aide de l'IA. Voir Note sur la paternité.
Drupal est l'une des « applications courantes » couvertes par le module Attacking Common Applications de HTB Academy, et CVE-2018-7600 (« Drupalgeddon2 ») en est l'exemple canonique de RCE non authentifiée. Plutôt que de copier-coller un script à usage unique et de passer à autre chose, je voulais vraiment comprendre l'injection Form API qui rend cette vulnérabilité exploitable — j'ai donc reconstruit le PoC public de zéro comme exercice d'apprentissage.
L'original largement référencé, a2u/CVE-2018-7600 de Vitalii Rudnykh, est parfait pour démontrer la vulnérabilité, mais il vous oblige à modifier le payload sur place à chaque exécution. Dans un flux de travail en laboratoire/CTF — relancer l'exploit contre différentes cibles, vouloir un point d'accès réutilisable — cela devient fastidieux. Cette version en fait un véritable outil CLI à la place :
cmd= prévisible ouverte derrière vousIl est délibérément limité à une vulnérabilité connue et corrigée depuis longtemps (divulguée en 2018). L'objectif était de comprendre la technique et de produire une implémentation de référence propre et documentée — pas une capacité offensive inédite.
Le code de ce dépôt a été écrit avec l'assistance de l'IA (Claude d'Anthropic) pendant que je travaillais sur le module HTB. J'ai défini les objectifs et les exigences de conception — ergonomie CLI, déploiement automatique de la coquille web, mode interactif, nom de coquille et paramètre randomisés — et j'ai relu et testé le résultat. Je le mentionne parce que c'est la chose honnête à faire, et parce que la valeur ici réside dans la compréhension et les décisions d'ingénierie plutôt que dans la paternité de chaque ligne.
--cmd, ou d'ouvrir un pseudo-shell interactif avec --shell.CVE-2018-7600 affecte :
Cette implémentation cible le vecteur Form API de Drupal 8 (le point de terminaison AJAX user/register). Drupal 7 est exploitable via un point de terminaison/payload différent et n'est pas traité ici.
Les versions corrigées (7.58 / 8.5.1 et ultérieures) ne sont pas affectées.
requestspip install requests
# commande unique
python3 drupalgeddon2.py -u http://target/ -c id
# pseudo-shell interactif
python3 drupalgeddon2.py -u http://target/ --shell
# déployer uniquement la coquille, n'exécuter rien
python3 drupalgeddon2.py -u http://target/ --deploy-only
# passer par Burp, ignorer le certificat auto-signé du proxy
python3 drupalgeddon2.py -u http://target/ -c id --proxy http://127.0.0.1:8080 -k
| Flag | Description |
|---|---|
-u, --url | (obligatoire) URL de base de la cible, p. ex. http://target/ |
-c, --cmd | Commande unique à exécuter sur la cible |
--shell | Ouvre un pseudo-shell interactif |
--deploy-only | Déploie uniquement la coquille web, n'exécute rien |
--shell-name | Nom de fichier de la coquille déployée (défaut : .php aléatoire) |
--param | Nom du paramètre GET pour la coquille (défaut : md5 aléatoire) |
--proxy | URL du proxy, p. ex. http://127.0.0.1:8080 |
-k, --insecure | Désactive la vérification TLS (pour les certificats proxy auto-signés) |
--timeout | Délai d'expiration par requête en secondes (défaut : 15) |
CVE-2018-7600 est une défaillance de l'assainissement des entrées dans la Form API de Drupal. Drupal représente les formulaires sous forme de tableaux de rendu imbriqués, et les clés de tableau commençant par # sont traitées comme des propriétés de rendu spéciales plutôt que comme des données utilisateur. Le correctif (SA-CORE-2018-002) a ajouté un assainissement pour supprimer ces clés préfixées par # des entrées fournies par l'utilisateur.
Avant ce correctif, un attaquant non authentifié pouvait injecter des propriétés de rendu dans un élément de formulaire traité par le gestionnaire AJAX de Drupal. La soumission de propriétés telles que :
#post_render — une liste de callables que Drupal invoque après le rendu, et#markup — l'argument qui leur est passécontre l'élément mail du formulaire d'enregistrement utilisateur amène Drupal à appeler une fonction PHP arbitraire (ici, exec) avec une entrée contrôlée par l'attaquant pendant l'étape de rendu — c'est-à-dire une exécution de code à distance, sans authentification requise.
Ce PoC utilise cette primitive pour encoder localement en base64 une coquille PHP d'une ligne, faire décoder ces données par le serveur dans un fichier à la racine web, puis interagir avec ce fichier via des requêtes GET normales.
Si vous êtes du côté de la défense :
Remédiation
Idées de détection
#post_render, #markup, #type, #lazy_builder, etc. Les soumissions de formulaires légitimes n'en contiennent pas.…/user/register?element_parents=…&_wrapper_format=drupal_ajax transportant des paramètres suspects..php nouvellement créé dans la racine web.system($_GET[...])).Cet outil est publié à des fins éducatives et pour des tests de sécurité autorisés — vos propres environnements de laboratoire, cibles HTB/CTF, ou systèmes pour lesquels vous disposez d'une autorisation écrite explicite. L'accès non autorisé à des systèmes informatiques est un crime en vertu de lois telles que le Computer Misuse Act 1990 du Royaume-Uni, le Computer Fraud and Abuse Act des États-Unis, et leurs équivalents ailleurs. Vous êtes seul responsable de l'usage que vous en faites. L'auteur décline toute responsabilité en cas d'utilisation abusive ou de dommages causés.
MIT