Cap
IDOR que filtra una captura con credenciales FTP/SSH y escalada con la capability cap_setuid en Python.
Cap
| Máquina | SO | Dificultad | IP |
|---|---|---|---|
| Cap | Linux | Easy | 10.10.10.245 |
A tener en cuenta...
Resumen
Cap es una cadena corta y de las más didácticas que hay: un IDOR en el panel web te deja descargar la captura de red de otro usuario, dentro viajan unas credenciales en claro de FTP que valen también para SSH, y la escalada es una capability mal puesta sobre Python que te da root en una sola línea. Lo bonito es el paso de la captura: no es bajar el pcap y que te regalen la contraseña, hay que abrirlo y bucear el tráfico con tshark (o Wireshark) para sacarla.
Vulnerabilidad
IDOR / Broken Access Control
El panel descarga las capturas por un identificador numérico en la URL (/data/<id>) y no comprueba de quién es cada captura. La nuestra es la /data/1, pero si bajamos el número a 0 accedemos a la captura de otra sesión, que contiene tráfico sensible. Es el típico control de acceso roto: el servidor se fía del id que manda el cliente.
Capability cap_setuid sobre Python
El binario de Python tiene asignada la capability cap_setuid+ep. Las capabilities parten los privilegios de root en trozos; cap_setuid permite a un proceso cambiar su UID a 0 sin ser root. Puesta sobre un intérprete de propósito general es un desastre: cualquiera que pueda ejecutar ese Python puede lanzarse una shell como root.
Reconocimiento
Empezamos lanzando un escaneo completo de puertos contra la máquina víctima
| Puerto | Servicio | Versión |
| 21 | ftp | vsftpd 3.0.3 |
| 22 | ssh | OpenSSH 8.2p1 |
| 80 | http | gunicorn |
Un 21 (FTP), un 22 (SSH) y un 80 sirviendo un panel web (Security Dashboard) montado sobre gunicorn. El FTP sin cifrar ya es una pista: todo lo que pase por ahí viaja en claro.
Enumeración
El panel tiene una sección de capturas de red en /data/<id>. Si entramos a la nuestra nos sale /data/1, pero probamos a jugar con el identificador y bajamos a 0
Tenemos la captura de otra sesión. Ahora viene lo importante: no basta con abrirla, hay que analizar el tráfico. La abrimos con tshark y filtramos directamente el protocolo FTP, que manda usuario y contraseña en texto plano
Si prefieres Wireshark, es abrir el 0.pcap, clic derecho en cualquier paquete del puerto 21 → Follow > TCP Stream y ahí se leen los comandos USER y PASS igual de claritos. En cualquier caso, salen las credenciales
nathan / Buck3tH4TF0RM3!
Explotación
Las credenciales de FTP valen tal cual para SSH (reutilización de contraseña), así que entramos directamente sin complicarnos
Ya somos un usuario del sistema. Leemos la flag de usuario y pasamos a la escalada.
Escalada de privilegios
Lo primero al conseguir un usuario en Linux: mirar capabilities, que son una vía de escalada silenciosa y muy habitual en las máquinas fáciles
Ahí está: Python tiene cap_setuid, o sea que puede cambiar su UID a 0. Lo aprovechamos para forzar el UID a root y saltar a una shell
Y ya somos root.
Flags
Cómo se arregla
La cadena nace de un control de acceso ausente y de una capability peligrosa. Por capas:
- Corregir el IDOR: cada usuario solo debe poder ver sus propias capturas; validar en el servidor que el recurso pertenece a quien lo pide, nunca fiarse del identificador de la URL.
- No mandar credenciales en claro: el FTP sin cifrar deja las contraseñas a la vista en cualquier captura. Migrar a FTPS/SFTP.
- Quitar la capability de Python: cap_setuid sobre un intérprete equivale a regalar root. Eliminarla con setcap -r /usr/bin/python3.8 y no asignar capabilities a binarios genéricos.
- No reutilizar credenciales: la misma contraseña abría FTP y SSH; separar credenciales por servicio.
Conclusiones
Un IDOR tan tonto como cambiar un número en la URL puede exponer datos de otros usuarios; el control de acceso jamás se delega en el identificador que manda el cliente.
Las capturas de red son una mina: si recogen tráfico de protocolos en claro como FTP, regalan credenciales. Y la gracia está en saber leerlas con tshark o Wireshark, no en que te las den masticadas.
Por último, un getcap -r / nada más entrar es oro: las capabilities mal asignadas convierten un usuario normal en root en segundos.