3.7 KiB
8009 - Pentesting Apache JServ Protocol (AJP)
{{#include ../banners/hacktricks-training.md}}
Informations de base
From https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/
AJP est un protocole de communication. C'est une version optimisée du protocole HTTP pour permettre à un serveur web autonome tel qu'Apache de communiquer avec Tomcat. Historiquement, Apache a été beaucoup plus rapide que Tomcat pour servir du contenu statique. L'idée est de laisser Apache servir le contenu statique lorsque c'est possible, mais de faire passer la requête à Tomcat pour le contenu lié à Tomcat.
Aussi intéressant :
Le protocole ajp13 est orienté paquet. Un format binaire a probablement été choisi plutôt que le texte brut plus lisible pour des raisons de performance. Le serveur web communique avec le conteneur de servlets via des connexions TCP. Pour réduire le processus coûteux de création de sockets, le serveur web tentera de maintenir des connexions TCP persistantes avec le conteneur de servlets et de réutiliser une connexion pour plusieurs cycles de requête/réponse.
Port par défaut : 8009
PORT STATE SERVICE
8009/tcp open ajp13
CVE-2020-1938 'Ghostcat'
C'est une vulnérabilité LFI qui permet d'accéder à certains fichiers comme WEB-INF/web.xml qui contient des identifiants. C'est un exploit pour abuser de la vulnérabilité et les ports exposés AJP pourraient y être vulnérables.
Les versions corrigées sont à partir de 9.0.31, 8.5.51 et 7.0.100.
Enumeration
Automatic
nmap -sV --script ajp-auth,ajp-headers,ajp-methods,ajp-request -n -p 8009 <IP>
Brute force
Proxy AJP
Nginx Reverse Proxy + AJP
(Consultez la version Dockerisée)
Il est possible de communiquer avec un port proxy AJP ouvert (8009 TCP) en utilisant le module apache ajp_module de Nginx et d'accéder au Tomcat Manager depuis ce port, ce qui pourrait finalement conduire à une RCE sur le serveur vulnérable.
- Commencez par télécharger Nginx depuis https://nginx.org/en/download.html puis compilez-le avec le module ajp :
# Compile Nginx with the ajp module
git clone https://github.com/dvershinin/nginx_ajp_module.git
cd nginx-version
sudo apt install libpcre3-dev
./configure --add-module=`pwd`/../nginx_ajp_module --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules
make
sudo make install
nginx -V
- Ensuite, commentez le bloc
serveret ajoutez ce qui suit dans le blochttpdans/etc/nginx/conf/nginx.conf.
upstream tomcats {
server <TARGET_SERVER>:8009;
keepalive 10;
}
server {
listen 80;
location / {
ajp_keep_conn on;
ajp_pass tomcats;
}
}
- Enfin, démarrez nginx (
sudo nginx) et vérifiez qu'il fonctionne en accédant àhttp://127.0.0.1
Version Dockerisée de Nginx
git clone https://github.com/ScribblerCoder/nginx-ajp-docker
cd nginx-ajp-docker
Remplacez TARGET-IP dans nginx.conf par l'IP AJP, puis construisez et exécutez.
docker build . -t nginx-ajp-proxy
docker run -it --rm -p 80:80 nginx-ajp-proxy
Proxy AJP Apache
Il est également possible d'utiliser un proxy AJP Apache pour accéder à ce port au lieu de Nginx.
Références
{{#include ../banners/hacktricks-training.md}}