En esta guía
El método que recorre toda la guía: mide antes de tocar. Cuando algo falle, no cambies cinco cosas a la vez esperando que una funcione. Haz una prueba, lee el resultado, y deja que el resultado te diga qué cambiar.
Resumen del recorrido (contiene spoilers)
nmap · 3 puertos
/data/1 → /data/0
FTP en texto plano
password reuse → SSH
cap_setuid → root
Entorno y versiones documentadas
- Kali Linux y VirtualBox: versiones no especificadas en la guía original.
- Binario del objetivo: Python 3.8.
Las versiones indicadas provienen del texto original. La fecha de edición identifica la revisión de esta página; no implica que se haya repetido el laboratorio.
00 · CONECTARSE AL LAB (VPN)
Ver solución paso a paso
Ordena tu espacio de trabajo
Regla de oro desde el día uno: cada máquina, su carpeta. Todo guardado, nada suelto.
mkdir -p ~/htb/cap/nmap
cd ~/htb/capDescarga tu .ovpn y conéctate
En el panel de la máquina en HTB hay un botón Connect to ... with OpenVPN. Ahí eliges servidor y protocolo y descargas tu archivo .ovpn, tu llave para entrar a la red del laboratorio.
sudo openvpn ~/htb/cap/tu_archivo.ovpnEsta terminal se queda colgada mostrando logs. Es correcto: mientras esté abierta, tu VPN está activa. No la cierres. Abre una terminal nueva para trabajar.
Busca la bandera verde
En los logs, la línea que confirma que estás dentro:
Initialization Sequence CompletedLos avisos WARNING y DEPRECATED OPTION no son errores: son de una config algo antigua de HTB y no te afectan. Distinguir un aviso de un error real es media batalla del troubleshooting.
Verifica la interfaz tun0
ip a show tun0Busca una interfaz tun0 con IP tipo 10.10.x.x. Si aparece, tienes identidad dentro del lab.
Problemas típicos de VPN (y cómo se leen)
Estos tres errores frenan a casi todo principiante. La clave: cada uno dice una cosa distinta.
Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.
| Lo que ves | Qué significa realmente | Qué hacer |
|---|---|---|
TLS handshake / key negotiation timed out | Tus paquetes salen pero nadie responde. Típico de UDP tras una VM/red restrictiva. | Cambia el protocolo a TCP 443 y baja un .ovpn nuevo. |
Connection refused (TCP) | Tu paquete sí llegó y el destino dijo "no". Ese servidor no acepta conexiones ahora. | Cambia de servidor VPN. |
Destination Host Unreachable | El gateway de HTB no encuentra el host. Casi siempre: la IP de la máquina cambió. | Verifica la IP actual en la web. |
Diagnóstico de abajo hacia arriba. Antes de culpar a la VPN, confirma que tu Kali tiene internet:
ping -c 3 8.8.8.8 # ¿hay salida a internet?
ping -c 3 google.com # ¿funciona el DNS?Si ambas responden → tu internet está sano y el problema es de la VPN (servidor/protocolo). Si ninguna responde → es la red de tu VM (revisa el adaptador en VirtualBox). Para probar si un puerto del servidor VPN es alcanzable sin la VPN:
nc -zv <IP_DEL_SERVIDOR_VPN> 44301 · RECONOCIMIENTO
Ver solución paso a paso
Barrido de todos los puertos
cd ~/htb/cap
nmap -p- --min-rate 1000 -oA nmap/allports 10.129.103.82-p- escanea los 65535 puertos, no solo los comunes. --min-rate 1000 acelera. -oA guarda el resultado en tres formatos: guardar siempre, nunca escanees sin dejar registro.
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open httpEscaneo detallado de los abiertos
nmap -sCV -p 21,22,80 -oA nmap/detail 10.129.103.82-sCV = -sV (versión de cada servicio) + -sC (scripts básicos de reconocimiento). Tu radar inicial.
Interpretar: elegir por dónde entrar
Piensa en cada puerto como una puerta y pregúntate cuánta superficie ofrece:
Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.
| Puerto | Servicio | Lectura del pentester |
|---|---|---|
22 | SSH | Control remoto por terminal cifrada, pero pide credenciales que aún no tienes. Puerta cerrada con llave. Más "salida" que "entrada": el sitio a donde llegas después. |
21 | FTP | Transferencia de archivos. A veces permite anonymous sin credenciales. Buen segundo lugar. |
80 | HTTP | La superficie más grande y rica: páginas, formularios, funciones, código, rutas, parámetros. Cada una es una posible vía. |
Decisión: empezamos por HTTP. No por corazonada, sino por criterio: la web casi siempre ofrece más por dónde tirar.
02 · EXPLORAR LA WEB · IDOR
Ver solución paso a paso
Reconocimiento web tranquilo
Abre Firefox en Kali y navega a http://10.129.103.82. Explora como un usuario curioso, sin buscar todavía "la vulnerabilidad". Primero entiende qué es la aplicación:
→ Es un "Security Dashboard".
→ Ya estás logueado como un usuario llamado Nathan (arriba a la derecha), sin haber puesto contraseña. Eso significa algo: hay usuarios, y la app te trata como uno.
→ En el menú hay una función que llama la atención: "Security Snapshot (5 Second PCAP + Analysis)".
Vigila la URL
Haz click en Security Snapshot. La página trabaja y te redirige. Mira la barra de direcciones:
http://10.129.103.82/data/1Esa forma, una ruta que termina en /algo/<número>, es una de las cosas más jugosas que un pentester puede encontrar en una web. El data es la sección; el 1 es el ID de tu scan.
La hipótesis y la prueba
La app te asignó a ti el ID 1. Pregunta del pentester: ese 1 es mío. ¿Y si lo cambio por otro número? Nada te impide editarlo a mano en la barra de direcciones.
Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.
| URL | Resultado | Interpretación |
|---|---|---|
/data/1 | 0 paquetes | Tu scan. Vacío porque en tus 5 s no hubo tráfico. |
/data/2 | "No existe" | Nadie generó ese scan todavía. |
/data/0 | 72 paquetes, 69 TCP | Un scan que NO generaste tú. Datos de otra persona. |
▚ IDOR: Insecure Direct Object Reference
Accediste a datos que no son tuyos, simplemente pidiéndolos por su ID. La aplicación no verificó si ese scan te pertenecía.
Ocurre cuando una app usa un identificador predecible (un número secuencial: 0, 1, 2…) para referirse a objetos y no comprueba si el usuario tiene permiso para acceder a ese objeto concreto. Cambias el número y ves cosas ajenas. Está en el OWASP Top 10 bajo Broken Access Control, y es de las vulnerabilidades más comunes en aplicaciones reales.
/data/0 sigues siendo Nathan (tu sesión no cambia). Eso no contradice la vulnerabilidad: es la vulnerabilidad. No necesitas convertirte en otro usuario para robar su información: basta con pedir su objeto por el ID. Confundir "ver lo de otro" con "ser otro" es un error clásico de principiante.03 · ANÁLISIS DEL PCAP
Ver solución paso a paso
▚ ¿Qué es un PCAP?
PCAP = Packet Capture (captura de paquetes). Es una grabación de todo el tráfico de red que pasó por una máquina durante un período: quién habló con quién, por qué puerto y, lo crucial, el contenido de esas comunicaciones.
¿Por qué es oro para un pentester? Porque muchos protocolos viejos envían la información sin cifrar, en texto plano. Si un usuario se autenticó con uno de ellos mientras la captura corría, su usuario y contraseña quedaron grabados dentro del PCAP, legibles.
Cuál PCAP importa
Solo un PCAP con tráfico real puede esconder credenciales. /data/1 tenía 0 paquetes → nada dentro. /data/0 tiene 72 paquetes → el único con comunicaciones reales. El PCAP con datos sensibles es el 0.
Descargar y filtrar
En la página de /data/0, busca el botón de descarga del archivo de captura (el .pcap crudo, no el resumen de números). En Kali suele abrirse directo en Wireshark, que muestra una fila por paquete.
No leas las 72 filas una por una. Piensa qué protocolo, de los abiertos, envía credenciales en texto plano. SSH va cifrado (ahí no lees nada), pero FTP no cifra nada. En la barra de filtros de Wireshark, escribe:
ftpy Enter. La lista se reduce solo al tráfico FTP.
Leer las credenciales
Mira la columna Info. En FTP cada acción aparece casi como lenguaje humano. Busca Request: USER (el nombre de usuario) y Request: PASS (la contraseña):
Request: USER nathan
Request: PASS Buck3tH4TF0RM3!Credenciales obtenidas: nathan / Buck3tH4TF0RM3!
04 · ACCESO INICIAL
Ver solución paso a paso
La pregunta clave
Tienes credenciales de FTP. La pregunta del pentester: cuando encuentro un usuario/contraseña en un servicio, ¿los pruebo en los OTROS servicios de la misma máquina? Muchísima gente reutiliza la misma contraseña en todos lados. SSH estaba abierto (puerto 22) y solo necesitaba credenciales. Ahora las tenemos.
Conectarse por SSH
ssh nathan@10.129.103.82La primera vez pregunta por la autenticidad del host → escribe yes. Luego pide la contraseña: Buck3tH4TF0RM3!. No verás nada al escribir (ni asteriscos ni puntos): es normal en Linux. Escríbela completa y Enter a ciegas.
Si funciona, el prompt cambia de iphobiuss@kali a nathan@cap:~$. Eso significa que estás dentro de la máquina víctima. A eso se le llama conseguir un shell.
La user flag
ls
cat user.txt # -> 64c77ba6f9da29d6e022e470a40f2a67Esa es la user flag. Pero nathan es un usuario normal, sin privilegios de administrador. El objetivo final es llegar a root.
05 · ESCALADA DE PRIVILEGIOS
Ver solución paso a paso
▚ ¿Qué son las capabilities?
En Linux, en vez de ejecutar un programa con todo el poder de root (peligroso), se le puede dar un permiso especial y acotado: una capability. El problema es que algunas, en el binario equivocado, se pueden abusar para escalar a root. La más peligrosa es cap_setuid, que permite a un programa cambiar su identidad de usuario, incluso a root.
Buscar binarios con capabilities
getcap -r / 2>/dev/nullgetcap lista capabilities; -r / busca recursivo desde la raíz (toda la máquina); 2>/dev/null manda a la basura los miles de errores "Permission denied" para que solo veas lo útil. Lo vas a usar muchísimo.
/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/.../gst-ptp-helper = cap_net_bind_service,cap_net_admin+epLas de cap_net_raw / cap_net_bind_service son de red, no sirven para root. La única con cap_setuid es Python: /usr/bin/python3.8. Un binario que puede convertirse en root y que además ejecuta cualquier código que le escribas: una llave maestra que te deja escribir tus propias órdenes.
GTFOBins: la referencia obligatoria
No hace falta memorizar la sintaxis. GTFOBins cataloga binarios de Linux y exactamente cómo abusar de cada uno según el permiso que tenga (SUID, Sudo, Capabilities…).
La sección Capabilities de python muestra:
python -c 'import os; os.setuid(0); os.execl("/bin/sh", "sh")'Léelo: hace justo las dos cosas que predijimos. os.setuid(0) → "conviértete en el usuario 0" (el UID 0 es root; solo funciona porque Python tiene cap_setuid). os.execl("/bin/sh","sh") → "ábreme una shell".
Ejecutar (con la ruta real)
El binario con la capability es python3.8, así que usa la ruta exacta. En la terminal de nathan:
/usr/bin/python3.8 -c 'import os; os.setuid(0); os.execl("/bin/sh", "sh")'El prompt cambia de $ (usuario normal) a # (superusuario). El # es, en el mundo Linux, el símbolo de root. Confírmalo:
whoami # -> root
id # -> uid=0(root) ...La root flag
cat /root/root.txt # -> 268ae2e96af7256c928d718f8717f1b9Máquina comprometida por completo. User flag + root flag.
TASKS · GUIDED MODE
Mostrar respuestas del laboratorio
Desplaza la tabla horizontalmente. Con teclado, enfócala y usa las flechas ← →.
| Task | Respuesta |
|---|---|
| ¿Cuántos puertos TCP abiertos? | 3 |
El [something] de la redirección /[something]/[id] | data |
| ¿Puedes acceder a scans de otros usuarios? | Yes |
| ID del PCAP con datos sensibles | 0 |
| Protocolo de capa de aplicación con los datos | FTP |
| ¿En qué otro servicio funciona la contraseña? | SSH |
| Ruta completa del binario con capabilities para escalar | /usr/bin/python3.8 |
| User flag | 64c77ba6f9da29d6e022e470a40f2a67 |
| Root flag | 268ae2e96af7256c928d718f8717f1b9 |
CONCEPTOS TRANSFERIBLES
GENERAL principio transferible a otras máquinas. LAB heurística o convención de laboratorio (HTB), no una regla universal.
- GENERALMétodo: mide, lee el resultado, cambia una sola cosa. Un error que cambia es progreso. Diagnostica de abajo hacia arriba (¿internet? → ¿DNS? → ¿VPN?).
- LABLa IP objetivo no es fija. Confírmala en la web antes de cada sesión.
- GENERALRecon primero, siempre.
nmap -p-para no perder puertos;-sCVpara versiones; guarda con-oA. - GENERALElegir por dónde entrar es criterio, no azar. La web suele ofrecer más superficie.
- GENERALIDOR: ID secuencial en la URL + sin control de acceso = enumerar objetos ajenos. Acceso ≠ suplantación.
- GENERALProtocolos sin cifrar (FTP, HTTP, Telnet) filtran credenciales en un PCAP. Fíltralos en Wireshark; usa Follow TCP Stream.
- GENERALPassword reuse: unas credenciales de un servicio se prueban en todos los demás. Casi siempre pagan.
- GENERALEscalada por capabilities:
getcap -r / 2>/dev/nullpara encontrarlas;cap_setuides la joya; GTFOBins para la técnica, usando la sección del permiso correcto. - GENERAL
$vs#: el prompt te dice quién eres.#= root.