# 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/](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](http://httpd.apache.org/) 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'](https://www.chaitin.cn/en/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](https://www.exploit-db.com/exploits/48143) 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 ```bash nmap -sV --script ajp-auth,ajp-headers,ajp-methods,ajp-request -n -p 8009 ``` ### [**Brute force**](../generic-hacking/brute-force.md#ajp) ## Proxy AJP ### Nginx Reverse Proxy + AJP ([Consultez la version Dockerisée](8009-pentesting-apache-jserv-protocol-ajp.md#Dockerized-version)) 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](https://nginx.org/en/download.html) puis compilez-le avec le module ajp : ```bash # 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 `server` et ajoutez ce qui suit dans le bloc `http` dans `/etc/nginx/conf/nginx.conf`. ```json upstream tomcats { 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 ```bash 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. ```bash 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 - [https://github.com/yaoweibin/nginx_ajp_module](https://github.com/yaoweibin/nginx_ajp_module) {{#include ../banners/hacktricks-training.md}}