Writeup CTF BankRobber de HTB

Introducción

BankRobber es un CTF de dificultad insane que podemos encontrar en la plataforma de  HTB. Encontraré una vulnerabilidad XSS que puedo usar para filtrar la cookie del usuario administrador, dándome acceso a la sección de administración del sitio. A partir de ahí, usaré una inyección SQL para extraer el código fuente de una de las páginas de PHP que muestra que puede proporcionar ejecución de código, pero que solo se puede ejecutar desde localhost. Volveremos a utilizar la misma vulnerabilidad XSS para que el administrador envíe esa solicitud de BankRobber, devolviendo un Shell. Para acceder a SYSTEM, encontraré un binario ejecutándose como SYSTEM y escuchando solo en localhost. Haremos fuerza bruta a un pin de 4 dígitos y luego descubriré un desbordamiento de búfer simple que me permite sobrescribir una cadena que es la ruta al binario que se ejecuta posteriormente.

Enumeración

NMAP

Comenzamos realizando un escaneo rápido de los puertos que tiene abiertos la máquina víctima.

Tenemos 4 puertos TCP abiertos (80, 443, 445, 3306). Vamos a realizar un escaneo en profundidad de estos servicios.

Servicios abiertos:

  • Puerto 80 -> Apache httpd 2.4.39
  • Puerto 443 -> Apache httpd 2.4.39
  • Puerto 445 -> Windows  7 – 10
  • Puerto 3306 -> María DB ¿?

Existen 2 servicios Web, 80 y 443. Vamos a comenzar haciendo una enumeración del contenido.

Enumeración del sitio Web

PUERTO 80

PUERTO 443

Es una plataforma de transacciones con criptomonedas. Vamos a crear un usuario en la plataforma.

Iniciamos sesión y realizamos una transacción de criptomonedas.

Cuando transfiero fondos, aparece un mensaje emergente que dice que el administrador revisará la transacción.

Enumeración de directorios

Para a realizar la enumeración de directorios para ver si existe alguno que pueda ser interesante. Para ello, utilizaremos la herramienta Dirsearch.

Existen dos directorios que pueden ser interesantes, /admin y /user. El directorio /user es donde el usuario inicia sesión en el sitio Web. Al visitar el directorio /admin, nos devuelve el siguiente mensaje.

Petición de inicio de sesión

Capturamos la petición de inicio de sesión.

Tenemos 3 cookies, la id de usuario y el nombre y password cifrado en base64 y URL.

XSS – Inicio de sesión de administrador

Recordamos el mensaje que decía que el administrador revisaría la transacción. Esto puede ser una posible inyección XSS porque hay un campo de comentarios que verá el administrador y, que si este no se ha desinfectado correctamente, se podría inyectar código javascript en su sesión de navegador.

Primero configure un servidor web Python simple en nuestro Kali.

A continuación, escriba la siguiente línea de código en el campo de comentarios y haga clic en “TRANSFERIR E-COIN”.

Volvemos a consultar nuestro servidor web, tenemos respuesta del objetivo.

Sabiendo esto, vamos a generar una carga útil adecuada que robe cookies cada vez que el administrador inicie sesión y luego las envíe a nuestro servidor web.

Después de unos minutos, recibimos una respuesta en nuestro servidor web con cookies.

Como vimos anteriormente, las cookies contenían el username y password cifrados en base64 y la id de usuario. Vamos a descifrar username y password.

Obtenemos las credenciales admin:Hopelessromantic.

Ahora cerraremos sesión como usuario y la abriremos como administrador con las credenciales encontradas.

Hemos iniciado sesión como administrador. Vamos a inspeccionar el panel de administración para buscar posibles formas de elevar privilegios.

SQLi – Panel de administración

Una vez que inicie sesión como administrador, veo que hay una lista de transacciones, una función de búsqueda de usuarios y un backdoorchecker.

Vamos a probar posibles inyecciones SQLi en el campo ID. Iniciamos Burp para capturar la petición POST.

A continuación guardamos esta petición en un archivo txt para poder utilizarlo con la herramienta SQLMap.

El siguiente paso será ejecutar sqlmap –r petición.txt para probar los posibles puntos de inyección:

Vamos a seguir haciendo pruebas. Verificamos el usuario que está ejecutando la aplicación Web en el servidor MySQL.

Somos usuario root, no deberíamos tener problemas para obtener el hash de la contraseña de este usuario.

Utilizamos la herramienta en línea, crackstation, para descifrar el hash.

Obtenemos la contraseña Welkom1!. Pero no será de gran ayuda.

La máquina objetivo está ejecutando Windows, Apache y PHP, por lo que es probable que este ejecutando XAMPP. El directorio base de XAMPP es C:/xampp/htdocs.

Con sqlmap podemos leer los archivos contenidos en un directorio de la siguiente manera:

Buscaremos los siguientes archivos:

  • index.php (sqlmap -r peticion.txt –file-read ‘/xampp/htdocs/index.php’)
  • /admin/search.php (sqlmap -r peticion.txt –file-read ‘/xampp/htdocs/admin/search.php’)
  • /admin/backdoorchecker.php (sqlmap -r petición.txt –file-read ‘/xampp/htdocs/admin/backdoorchecker.php’)

El archivo nackdoorchecker.php es interesante porque contiene una vulnerabilidad de inyección en la función system (). Se ha realizado la desinfección de algunos parámetros como cmd, ‘$(‘ ni & además se debe comenzar con dir. Estas restricciones no son suficientes para evitar la inyección.

Vamos a probar la función backdoorchecker desde el panel de adminsitrador del sitio Web.

Vemos dos cosas. La primera como explicábamos anteriormente. Solo está permitido el comando “dir” y que solo se puede ejecutar de manear local.

Shell a través de SSRF vía XSS (usuario “cortin”)

Como vimos anteriormente, el archivo backdoorchecker.php solo se puede ejecutar de manera local, así que vamos a intentar engañar al servidor para que se envíe una petición a sí mismo para ejecutar comandos a través de la inyección de comandos que hemos identificado en el código fuente. Vamos a escribir un archivo reverse.js con el siguiente código.

También debemos descargar el ejecutable nc64.exe y colocarlo en el mismo directorio que el archivo reverse.js.

Con esta línea ejecutamos netcat sobre SMB y podemos obtener la Shell.

Recordamos la vulnerabilidad XSS que nos sirvió al principio para iniciar sesión como administrador, pues ahora vuelve a ser necesaria. Salimos del perfil de administrador y volvemos a nuestro usuario. Entonces generamos otra transacción de la siguiente manera:

Y ejecutamos la carga útil que se indica.

En nuestra máquina de ataque ejecutamos un servidor http con Python, ponemos un oyente en el puerto configurado en reverse.js y ejecutamos impacket-smbserver.

Y el oyente donde ya tenemos conexión reversa con la máquina atacada.

El siguiente paso será buscar la flag user.txt

Elevación de privilegios

Encontramos en el sistema de archivos un binario en la raíz de la unidad llamado bankv2.exe

Pero no podemos leerlo.

Vamos a realizar un escaneo de puertos internos de la máquina víctima.

Para poder jugar con este servicio interno, vamos a reenviar el puerto con chisel. Primero configuramos chisel en nuestra máquina atacante.

A continuación, enviamos la versión de chisel para Windows al destino y reenviamos al puerto 910 de nuestra máquina.

*Recordamos que debemos tener habilitado un servidor Python e impacket-smbserver.

Una vez se reenvía el puerto, nos conectamos a él con la herramienta ncat para ver su funcionamiento.

El programa pide un código PIN. Probamos varios números aleatorios pero sin suerte.

Vamos a crear un script que realice una fuerza bruta que nos determine el valor del PIN correcto.

Ejecutamos, y determina que el valor del PIN es 0021.

Introducimos el valor del PIN donde se solicita y la cantidad de monedas que vamos a enviar. Vemos que la transacción se ejecuta en el archivo transfer.exe.

Si enviamos más de 32 caracteres yo no podemos ver el archivo transfer.exe y este es reemplazado por los caracteres enviados, por lo que podemos determinar que hay una vulnerabilidad de buffer overflow en la aplicación bankv2.exe.

Vamos a intentar obtener una Shell de administrador ejecutando un comando nc para obtener un Shell reverso del sistema.

Para ello, creamos la siguiente reverse Shell, Shell.ps1

Entonces volvemos a ejecutar nc 127.0.0.1 910, volvemos a introducir el PIN 0021 y cuando nos piden introducir el monto de la transferencia volvemos a provocar el buffer overflow pero en esta ocasión enviando la reverse Shell que hemos creado anteriormente, de la siguiente manera.

Y por otro lado, recordad que debemos iniciar un oyente, en este caso en el puerto 5000.

Ejecutamos y ya tendríamos acceso como usuario de máximos privilegios a la máquina objetivo. Solo quedaría buscar la flag root.txt para acabar de resolver el CTF.

Tags:

No responses yet

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *