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

13 KiB

8009 - Pentesting Apache JServ Protocol (AJP)

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Rejoignez le serveur HackenProof Discord pour communiquer avec des hackers expérimentés et des chasseurs de primes !

Perspectives de piratage
Engagez-vous avec du contenu qui explore les sensations et les défis du piratage

Actualités de piratage en temps réel
Restez à jour avec le monde du piratage rapide grâce aux actualités et aux informations en temps réel

Dernières annonces
Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme

Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !

Informations de base

À partir de : https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/

AJP est un protocole de transmission. Il s'agit d'une version optimisée du protocole HTTP permettant à un serveur web autonome tel que 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 transmettre la requête à Tomcat pour le contenu lié à Tomcat.

Aussi intéressant :

Le protocole ajp13 est orienté paquets. Un format binaire a é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 coût élevé de la 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 demande/réponse.

Port par défaut : 8009

PORT     STATE SERVICE
8009/tcp open  ajp13

CVE-2020-1938 'Ghostcat'

Si le port AJP est exposé, Tomcat pourrait être vulnérable à la vulnérabilité Ghostcat. Voici une exploit qui fonctionne avec ce problème.

Ghostcat est une vulnérabilité LFI, mais quelque peu restreinte : seuls les fichiers d'un certain chemin peuvent être extraits. Cela peut néanmoins inclure des fichiers tels que WEB-INF/web.xml, qui peuvent divulguer des informations importantes telles que les identifiants de l'interface Tomcat, en fonction de la configuration du serveur.

Les versions corrigées à partir de 9.0.31, 8.5.51 et 7.0.100 ont résolu ce problème.

Énumération

Automatique

nmap -sV --script ajp-auth,ajp-headers,ajp-methods,ajp-request -n -p 8009 <IP>

Brute force

AJP Proxy

Proxy AJP

Il est rare de trouver le port 8009 ouvert et aucun autre port web ouvert. Dans ce cas, il serait intéressant d'utiliser des outils existants comme Metasploit pour le pirater, n'est-ce pas ? Comme indiqué dans l'une des citations, vous pouvez (ab)user d'Apache pour faire proxy des requêtes vers le port 8009 de Tomcat. Dans les références, vous trouverez un guide détaillé sur la façon de le faire (lisez-le d'abord), ce qui suit est simplement un aperçu des commandes que j'ai utilisées sur ma propre machine. J'ai omis certaines des instructions originales car elles ne semblaient pas nécessaires.

sudo apt-get install libapache2-mod-jk
sudo vim /etc/apache2/apache2.conf # append the following line to the config
Include ajp.conf
sudo vim /etc/apache2/ajp.conf     # create the following file, change HOST to the target address
ProxyRequests Off
<Proxy *>
Order deny,allow
Deny from all
Allow from localhost
</Proxy>
ProxyPass       / ajp://HOST:8009/
ProxyPassReverse    / ajp://HOST:8009/
sudo a2enmod proxy_http
sudo a2enmod proxy_ajp
sudo systemctl restart apache2

Un effet secondaire intéressant de l'utilisation de cette configuration est que vous pourriez contrecarrer les systèmes IDS/IPS en place, car le protocole AJP est quelque peu binaire, mais je n'ai pas vérifié cela. Maintenant, vous pouvez simplement pointer votre exploit tomcat habituel de Metasploit vers 127.0.0.1:80 et prendre le contrôle de ce système. Voici également la sortie de Metasploit :

msf  exploit(tomcat_mgr_deploy) > show options

Module options (exploit/multi/http/tomcat_mgr_deploy):

Name      Current Setting  Required  Description
----      ---------------  --------  -----------
PASSWORD  tomcat           no        The password for the specified username
PATH      /manager         yes       The URI path of the manager app (/deploy and /undeploy will be used)
Proxies                    no        Use a proxy chain
RHOST     localhost        yes       The target address
RPORT     80               yes       The target port
USERNAME  tomcat           no        The username to authenticate as
VHOST                      no        HTTP server virtual host

Proxy inverse Nginx & AJP

Vérifiez la version Dockerisée

Lorsque nous rencontrons un port proxy AJP ouvert (8009 TCP), nous pouvons utiliser Nginx avec le module ajp_module pour accéder au gestionnaire Tomcat "caché". Cela peut être fait en compilant le code source de Nginx et en ajoutant le module requis, comme suit:

  • Téléchargez le code source de Nginx
  • Téléchargez le module requis
  • Compilez le code source de Nginx avec le ajp_module.
  • Créez un fichier de configuration pointant vers le port AJP.
# Download Nginx code
wget https://nginx.org/download/nginx-1.21.3.tar.gz
tar -xzvf nginx-1.21.3.tar.gz

# Compile Nginx source code with the ajp module
git clone https://github.com/dvershinin/nginx_ajp_module.git
cd nginx-1.21.3
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

Commentez l'intégralité du bloc server et ajoutez les lignes suivantes à l'intérieur du 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;
}
}

Démarrez Nginx et vérifiez si tout fonctionne correctement en effectuant une requête cURL vers votre hôte local.

sudo nginx
curl http://127.0.0.1:80

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/X.X.XX</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</headas
<body>
<div id="wrapper">
<div id="navigation" class="curved container">
<span id="nav-home"><a href="https://tomcat.apache.org/">Home</a></span>
<span id="nav-hosts"><a href="/docs/">Documentation</a></span>
<span id="nav-config"><a href="/docs/config/">Configuration</a></span>
<span id="nav-examples"><a href="/examples/">Examples</a></span>
<span id="nav-wiki"><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
<span id="nav-lists"><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></span>
<span id="nav-help"><a href="https://tomcat.apache.org/findhelp.html">Find Help</a></span>
<br class="separator" />
</div>
<div id="asf-box">
<h1>Apache Tomcat/X.X.XX</h1>
</div>
<div id="upper" class="curved container">
<div id="congrats" class="curved container">
<h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2>
<SNIP>

Version Dockerisée

The Dockerized version of Apache JServ Protocol (AJP) is a convenient way to deploy and test AJP-based applications. By containerizing the AJP server, you can easily set up and tear down the environment for penetration testing.

To create a Dockerized version of AJP, follow these steps:

  1. Install Docker on your machine if you haven't already.
  2. Create a Dockerfile with the following content:
FROM tomcat:latest
COPY server.xml /usr/local/tomcat/conf/
  1. Create a server.xml file with the AJP configuration. Make sure to enable the AJP connector and set the desired port.
<Connector protocol="AJP/1.3" port="8009" redirectPort="8443" />
  1. Build the Docker image using the following command:
docker build -t ajp-server .
  1. Run the Docker container with the following command:
docker run -d -p 8009:8009 ajp-server

Now you have a Dockerized version of AJP running on port 8009. You can test it by sending AJP requests to the server.

Note: Make sure to secure your Dockerized AJP server by applying appropriate security measures, such as using strong passwords and restricting access to trusted IP addresses.

git clone https://github.com/ScribblerCoder/nginx-ajp-docker
cd nginx-ajp-docker

Remplacez TARGET-IP dans nginx.conf par l'adresse IP AJP, puis compilez et exécutez.

docker build . -t nginx-ajp-proxy
docker run -it --rm -p 80:80 nginx-ajp-proxy

Références

Rejoignez le serveur HackenProof Discord pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !

Perspectives de piratage
Engagez-vous avec du contenu qui explore les sensations et les défis du piratage.

Actualités de piratage en temps réel
Restez à jour avec le monde du piratage en constante évolution grâce à des actualités et des informations en temps réel.

Dernières annonces
Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme.

Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥