hacktricks/src/network-services-pentesting/8009-pentesting-apache-jserv-protocol-ajp.md

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.

# 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.
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}}