Cap, maquina dificulad easy, vulnerabilidades IDOR y capabilitis para escalar privilegios

1- 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 &#x27;Invalid HTTP Version: &#x27;RTSP/1.0&#x27;&#x27; 

|     </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&#x27;Invalid\x20HTTP\x20Version:\x20&#x27;R 

SF:TSP/1\.0&#x27;&#x27;\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 😉 

Scroll al inicio