Cap, maquina dificulad easy, vulnerabilidades IDOR y capabilitis para escalar privilegios
Table of Contents
Toggle1- Escaneo Nmap y enumeración de puertos
Empezamos haciendo ping y confirmamos que tenemos conexión con la maquina víctima, en este caso por la aproximación del TLL, sabemos que es una maquina linux.
TTL -> 64 = Linux
TTL -> 128 = Windows
┌──(root㉿rincon)-[/home/…/HTB/maquinas/easy/cap]
└─# ping -c 1 10.129.72.77
PING 10.129.72.77 (10.129.72.77) 56(84) bytes of data.
64 bytes from 10.129.72.77: icmp_seq=1 ttl=63 time=32.4 ms
--- 10.129.72.77 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 32.395/32.395/32.395/0.000 ms
Usaremos nmap para hacer una búsqueda de puertos abiertos:
Primero realizaremos un escaneo rápido de puertos y posteriormente uno exhaustivo para cada puerto localizado.
┌──(root㉿rincon)-[/home/…/maquinas/easy/cap/nmap]
└─# nmap -p- -sS --min-rate 5000 --open -vvv -n 10.129.72.77 -oG allports
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-01-13 19:27 CET
Initiating Ping Scan at 19:27
Scanning 10.129.72.77 [4 ports]
Completed Ping Scan at 19:27, 0.05s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 19:27
Scanning 10.129.72.77 [65535 ports]
Discovered open port 21/tcp on 10.129.72.77
Discovered open port 80/tcp on 10.129.72.77
Discovered open port 22/tcp on 10.129.72.77
Completed SYN Stealth Scan at 19:28, 10.65s elapsed (65535 total ports)
Nmap scan report for 10.129.72.77
Host is up, received echo-reply ttl 63 (0.11s latency).
Scanned at 2026-01-13 19:27:57 CET for 10s
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack ttl 63
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 10.85 seconds
Raw packets sent: 65545 (2.884MB) | Rcvd: 65545 (2.622MB)
┌──(root㉿rincon)-[/home/…/maquinas/easy/cap/nmap]
└─# sudo nmap -p21,22,80 -sC -sV 10.129.72.77 -oN ports
Starting Nmap 7.94SVN ( https://nmap.org ) at 2026-01-13 19:28 CET
Nmap scan report for 10.129.72.77 (10.129.72.77)
Host is up (0.056s 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-title: Security Dashboard
|_http-server-header: gunicorn
| fingerprint-strings:
| FourOhFourRequest:
| HTTP/1.0 404 NOT FOUND
| Server: gunicorn
| Date: Tue, 13 Jan 2026 18:28:55 GMT
| Connection: close
| Content-Type: text/html; charset=utf-8
| Content-Length: 232
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
| <title>404 Not Found</title>
| <h1>Not Found</h1>
| <p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>
| GetRequest:
| HTTP/1.0 200 OK
| Server: gunicorn
| Date: Tue, 13 Jan 2026 18:28:49 GMT
| Connection: close
| Content-Type: text/html; charset=utf-8
| Content-Length: 19386
| <!DOCTYPE html>
| <html class="no-js" lang="en">
| <head>
| <meta charset="utf-8">
| <meta http-equiv="x-ua-compatible" content="ie=edge">
| <title>Security Dashboard</title>
| <meta name="viewport" content="width=device-width, initial-scale=1">
| <link rel="shortcut icon" type="image/png" href="/static/images/icon/favicon.ico">
| <link rel="stylesheet" href="/static/css/bootstrap.min.css">
| <link rel="stylesheet" href="/static/css/font-awesome.min.css">
| <link rel="stylesheet" href="/static/css/themify-icons.css">
| <link rel="stylesheet" href="/static/css/metisMenu.css">
| <link rel="stylesheet" href="/static/css/owl.carousel.min.css">
| <link rel="stylesheet" href="/static/css/slicknav.min.css">
| <!-- amchar
| HTTPOptions:
| HTTP/1.0 200 OK
| Server: gunicorn
| Date: Tue, 13 Jan 2026 18:28:49 GMT
| Connection: close
| Content-Type: text/html; charset=utf-8
| Allow: GET, HEAD, OPTIONS
| Content-Length: 0
| RTSPRequest:
| HTTP/1.1 400 Bad Request
| Connection: close
| Content-Type: text/html
| Content-Length: 196
| <html>
| <head>
| <title>Bad Request</title>
| </head>
| <body>
| <h1><p>Bad Request</p></h1>
| Invalid HTTP Version 'Invalid HTTP Version: 'RTSP/1.0''
| </body>
|_ </html>
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port80-TCP:V=7.94SVN%I=7%D=1/13%Time=69668EDF%P=x86_64-pc-linux-gnu%r(G
SF:etRequest,1574,"HTTP/1\.0\x20200\x20OK\r\nServer:\x20gunicorn\r\nDate:\
SF:x20Tue,\x2013\x20Jan\x202026\x2018:28:49\x20GMT\r\nConnection:\x20close
SF:\r\nContent-Type:\x20text/html;\x20charset=utf-8\r\nContent-Length:\x20
SF:19386\r\n\r\n<!DOCTYPE\x20html>\n<html\x20class=\"no-js\"\x20lang=\"en\
SF:">\n\n<head>\n\x20\x20\x20\x20<meta\x20charset=\"utf-8\">\n\x20\x20\x20
SF:\x20<meta\x20http-equiv=\"x-ua-compatible\"\x20content=\"ie=edge\">\n\x
SF:20\x20\x20\x20<title>Security\x20Dashboard</title>\n\x20\x20\x20\x20<me
SF:ta\x20name=\"viewport\"\x20content=\"width=device-width,\x20initial-sca
SF:le=1\">\n\x20\x20\x20\x20<link\x20rel=\"shortcut\x20icon\"\x20type=\"im
SF:age/png\"\x20href=\"/static/images/icon/favicon\.ico\">\n\x20\x20\x20\x
SF:20<link\x20rel=\"stylesheet\"\x20href=\"/static/css/bootstrap\.min\.css
SF:\">\n\x20\x20\x20\x20<link\x20rel=\"stylesheet\"\x20href=\"/static/css/
SF:font-awesome\.min\.css\">\n\x20\x20\x20\x20<link\x20rel=\"stylesheet\"\
SF:x20href=\"/static/css/themify-icons\.css\">\n\x20\x20\x20\x20<link\x20r
SF:el=\"stylesheet\"\x20href=\"/static/css/metisMenu\.css\">\n\x20\x20\x20
SF:\x20<link\x20rel=\"stylesheet\"\x20href=\"/static/css/owl\.carousel\.mi
SF:n\.css\">\n\x20\x20\x20\x20<link\x20rel=\"stylesheet\"\x20href=\"/stati
SF:c/css/slicknav\.min\.css\">\n\x20\x20\x20\x20<!--\x20amchar")%r(HTTPOpt
SF:ions,B3,"HTTP/1\.0\x20200\x20OK\r\nServer:\x20gunicorn\r\nDate:\x20Tue,
SF:\x2013\x20Jan\x202026\x2018:28:49\x20GMT\r\nConnection:\x20close\r\nCon
SF:tent-Type:\x20text/html;\x20charset=utf-8\r\nAllow:\x20GET,\x20HEAD,\x2
SF:0OPTIONS\r\nContent-Length:\x200\r\n\r\n")%r(RTSPRequest,121,"HTTP/1\.1
SF:\x20400\x20Bad\x20Request\r\nConnection:\x20close\r\nContent-Type:\x20t
SF:ext/html\r\nContent-Length:\x20196\r\n\r\n<html>\n\x20\x20<head>\n\x20\
SF:x20\x20\x20<title>Bad\x20Request</title>\n\x20\x20</head>\n\x20\x20<bod
SF:y>\n\x20\x20\x20\x20<h1><p>Bad\x20Request</p></h1>\n\x20\x20\x20\x20Inv
SF:alid\x20HTTP\x20Version\x20'Invalid\x20HTTP\x20Version:\x20'R
SF:TSP/1\.0''\n\x20\x20</body>\n</html>\n")%r(FourOhFourRequest,
SF:189,"HTTP/1\.0\x20404\x20NOT\x20FOUND\r\nServer:\x20gunicorn\r\nDate:\x
SF:20Tue,\x2013\x20Jan\x202026\x2018:28:55\x20GMT\r\nConnection:\x20close\
SF:r\nContent-Type:\x20text/html;\x20charset=utf-8\r\nContent-Length:\x202
SF:32\r\n\r\n<!DOCTYPE\x20HTML\x20PUBLIC\x20\"-//W3C//DTD\x20HTML\x203\.2\
SF:x20Final//EN\">\n<title>404\x20Not\x20Found</title>\n<h1>Not\x20Found</
SF:h1>\n<p>The\x20requested\x20URL\x20was\x20not\x20found\x20on\x20the\x20
SF:server\.\x20If\x20you\x20entered\x20the\x20URL\x20manually\x20please\x2
SF:0check\x20your\x20spelling\x20and\x20try\x20again\.</p>\n");
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 134.21 seconds
Vemos una salida bastante grande de NMAP, destacar los puertos abiertos:
21/tcp open ftp syn-ack ttl 63
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
1.1 Enumeración de servicios:
80/tcp open http syn-ack ttl 63
Entramos a la página web y observamos lo siguiente:
Aparentemente luce como un panel de control , en el que vemos que hay una sesión iniciada con el usuario Nathan
Si seguimos investigando las diferentes zonas de la página web en la pestaña «Security…» Encontramos un resumen de datos compilados donde podemos descargarlos.
Si vemos como está construida la URL http://10.129.74.151/data/1 , vemos que 1 está relacionado con una página perteneciente al usuario que tiene iniciada la sesión, entendemos que será con la de Nathan, pero ¿podremos encontrar información de otro usuario cambiando esta URL?
Bingo, tenemos un archivo de otro usuario como bastantes más datos que el que originalmente teníamos. A esta vulnerabilidad se le conoce como IDOR, nos permite listar información de una página/archivo… perteneciente a otro usuario que originalmente no es el nuestro tan solo con cambiar la URL.
Si descargamos el archivo, vemos que es un .pcap , utilizaremos wireshark para abrir este paquete.
Vemos que hay una captura de paquetes en el que hay una conexión a FTP con el usuario y contraseña en texto claro, perfecto vamos a tratar de conectarnos.
Vemos como si podemos conectarnos y podemos conseguir la flag de user.txt
2- Escalación de privilegios
Dado que FTP no contiene una consola para poder ejecutar un listado más amplio de comandos, vamos a probar a reutilizar credenciales para poder conectarnos con SSH.
Como me imaginaba, podemos iniciar sesión y ahora toca escalar privilegios a root.
Después de probar un listado de técnicas de escalada de privilegios, he dado con una posible vía de escalación utilizando capabilitis.
Las capabilitis son una forma de indicar a un usuario que puede realizar una acción como root, sin estar logeado como root.
Recalcar la diferencia entre SUID y capabilitis. Su principal diferencia es que cuando un programa se hace SUID, le estamos dando todos los privilegios de root a este, sin embargo al utilizar capabilitis estamos indicando específicamente por capas, que queremos que pueda ejecutar como root (cap_setuid, cap_net_blind_service+eip) .
En este caso observamos como tenemos un breve listado de capabilitis con permisos «+eip» y «+ep»
Estos significan (p) permitidas (e) efectivas e (i) Heredable.
Tras una búsqueda en google buscando un comando que pueda abusar de estas capabilitis he encontrado el siguiente para python.
Este comando ejecuta una línea de python (-c) en el que con import os -> Ejecutamos bajo una shell , os_setuid(0) nos aprovechamos de la capabiliti (cap_setuid) para establecernos el 0 (root) y por último en la línea ejecutamos una /bin/bash, que ya estará con privilegios de root.
En el directorio /root encontrarás la flag final.
Mi primera máquina resuelta después de dos años y prácticamente reutilizando apuntes de hace años… Hay que seguir cogiendo experiencia, soltarse cada vez más e ir aprendiendo lo máximo posible.
Gracias por leer el artículo 😉
