TwoMillion

TwoMillion es una máquina Linux de dificultad fácil que se lanzó para celebrar los 2 millones de usuarios de HackTheBox. La máquina presenta una versión antigua de la plataforma HackTheBox que incluye un código de invitación vulnerable. Tras piratear el código de invitación, se puede crear una cuenta en la plataforma. Esta cuenta permite enumerar varios puntos finales de API, uno de los cuales se puede usar para escalar privilegios a Administrador. Con acceso administrativo, se puede realizar una inyección de comando en el punto final de generación de VPN de administrador, obteniendo así un shell del sistema. Más adelante, se descubre que un archivo .env contiene credenciales de base de datos, y debido a la reutilización de contraseñas, los atacantes pueden iniciar sesión como usuario administrador en la máquina. Además, el núcleo del sistema está desactualizado, lo que permite utilizar la vulnerabilidad CVE-2023-0386 para obtener un shell de root.


Reconnaissance

Realizaremos un reconocimiento con nmap para ver los puertos que están expuestos en la máquina TwoMillion. Este resultado lo almacenaremos en un archivo llamado allPorts.

A través de la herramienta de extractPorts, la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap. Esta herramienta nos copiará en la clipboard los puertos encontrados.

Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. En el resultado, comprobamos que se encuentran abierta una página web de Nginx y el servicio de SSH.

Transformaremos el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.

Accederemos a http://localhost y verificaremos el resultado en un formato más cómodo para su análisis.

Añadiremos la siguiente entrada en nuestro archivo /etc/hosts.

Web Enumeration

Realizaremos una comprobación de las tecnologías que utiliza el sitio web.

Al acceder a http://2million.htb, verificamos que es la siguiente página web que simula la antigua interfaz de HackTheBox.

Realizaremos una enumeración de directorios y páginas web de la aplicación web. Verificamos en el resultado ha logrado enumerar diferentes directorios y páginas entre las cuales destacan api, login, invite y register. Esto lo enumeraremos más adelante.

Al acceder a http://2million.htb/login, nos encontramos con la siguiente interfaz de inicio de sesión de HTB.

Accedemos a http://2million.htb/register y comprobamos la siguiente interfaz que nos permite registrar nuestro usuario. Al intentar registrarnos, debemos de disponer de un Invite code válido.

Initial Foothold

Abusing declared JavaScript functions from the browser console

Al acceder a http://2million.htb/invite, comprobamos que debemos de introducir un Invite Code.

Al revisar el código fuente, verificamos que hay un script de JS relacionada con la API y con el Invite Code.

Al ingresar al script en cuestión, verificamos de la existencia de una función llamada makeInviteCode.

Abriremos el Console del navegador y probaremos de llamar a la función makeInviteCode. Verificamos que al ejecutar la función declarada de JS, se nos proporciona una información codificada en Rot13.

Realizamos la descodificación del contenido cifrado en Rot13. Comprobamos el siguiente mensaje, en el cual se menciona que para generar un invite code, deberemos de realizar una petición por POST a /api/v1/invite/generate.

Abusing the API to generate a valid invite code

Realizaremos la solicitud por el método POST al endpoint que se nos indicaba. Verificamos que nos proporcionan un código codificado en lo que parece ser una cadena de Base64.

Descodificaremos el contenido anterior en Base64 y comprobamos que parece proporcionarnos lo que parece ser el invite code.

Desde http://2million.htb/verify, ingresaremos el invite code y lde daremos a la opción de Sign UP para continuar con el registro de nuestro usuario.

Verificamos que se nos ha rellenado automáticamente el campo de Invite code y al parecer ahora si nos debería permitir registrarnos correctamente.

Una vez registrado nuestro usuario, probaremos de iniciar sesión en http://2million.htb/login.

Abusing the API to elevate our privilege to administrator

Comprobaremos que hemos podido acceder correctamente a la página de HackTheBox con nuestro usuario recién registrado.

Al enumerar las diferentes opciones de la página web, verificamos que al hacer hovering en las opciones de Connection Pack o Regenerate, se nos muestra un endpoint de una API.

Interceptaremos la solicitud con BurpSuite, y comprobamos que accediendo al endpoint de /api/v1/user/vpn/generate, en la respuesta port parte del servidor se nos proporciona el contenido de la VPN generada.

Intentamos enumerar la API desde la raíz, en el resultado obtenido se nos indica el endpoint llamado /api/v1.

Accediendo al endponint llamado /api/v1 se nos proporciona los detalles completos de la API, con las diferentes opciones que ofrece.

Mediante el método GET, tratamos de verificar en el endpoint nombrado /api/v1/admin/auth si el usuario actual que disponemos tenía permisos de administración.

En la respuesta por parte del servidor, se nos indicaba que no disponíamos de permisos de administración.

Tratamos de investigar sobre el endpoint llamado /api/v1/admin/settings/update que según se nos indicaba, nos permitiría modificar la configuración de los usuarios.

La solicitud la deberemos tramitar por el método PUT, en este caso, se nos indicaba que el Content-Type no era válido. Esto debido que normalmente las API esperan un formato JSON, tal y como se aprecia en la respuesta del servidor.

Modificamos el Content-Type para que sea el application/json y el enviar nuevamente la solicitud, se nos indica de la falta del parámetro email.

Añadiremos el parámetro email y indicaremos el de nuestro usuario registrado. Al enviar la petición se nos indicaba nuevamente la falta de un parámetro, en este caso, el parámetro is_admin.

Añadimos el parámetro is_admin y le indicaremos el valor True para realizar una prueba. En la respuesta por parte del servidor, se nos indica que debemos de indicar el valor 0 (no administrador) o 1 (administrador).

Volvemos a adaptar nuestra solicitud, al enviarla nuevamente se nos proporciona que el usuario gzzcoo ha sido modificado como usuario administrador.

Realizaremos la solicitud por GET del endpoint llamado /api/v1/admin/auth para verificar si el usuario que disponemos después de la modificación si tiene los permisos de administración. Verificamos que hemos conseguido proporcionarle los permisos correspondientes.

Ahora que disponemos de permisos de administración, verificamos que disponemos del acceso al endpoint llamado /api/v1/admin/vpn/generate, en la cual mediante el método POST, podemos generar una nueva VPN a cualquier usuario.

En este caso, al tramitar la solicitud, se nos vuelve a indicar que hace falta el Content-Type correcto.

Al enviar la solicitud, con el Content-Type de application/json añadido, se nos indica la falta del parámetro username.

Añadiremos el parámetro username y realizaremos la prueba con nuestro mismo usuario. Al enviar la solicitud, se nos genera una VPN para nuestro usuario.

Command Injection via poorly designed API functionality

Es probable que el código en PHP no sea el que genera la clave VPN directamente, sino que esté ejecutando algún script en Bash para manejar la generación. Deberemos confirmar si podemos inyectar comandos.

Si el servidor está ejecutando algo como: generate_vpn.sh [username]. Podemos intentar inyectar un ; en el nombre de usuario para cortar el comando y ejecutar uno nuevo. También podemos añadir al final de nuevo un ; o # para comentar el resto de código en el caso que lo hubiera,

Al realizar la prueba, verificamos que hemos logrado un Command Injection y RCE.

El siguiente paso, será lograr obtener acceso al sistema a través de una Reverse Shell. Para ello, nos pondremos en escucha con nc.

Ejecutaremos la siguiente Command Injection que nos proporcione la Reverse Shell.

Verificamos que hemos ganado acceso al sistema y nos encontramos como usuario www-data. Al obtener la reverse shell, mejoramos la calidad de la shell con los siguientes pasos para obtener una TTY interactiva.

Initial Access

Information Leakage

Enumerando el directorio actual donde nos encontramos, revisamos la existencia de un archivo .env, que suele ser de entornos virtuales y traer configuraciones.

Al revisar el contenido del archivo .env, se logra obtener las credenciales del usuario admin. Revisamos el archivo /etc/passwd y verificamos que existe el usuario admin y además dispone de bash. Con lo cual, posiblemente sean las credenciales de dicho usuario.

Tratamos de acceder desde SSH con las credenciales del usuario admin, finalmente logramos el acceso correspondiente y podemos visualizar la flag de user.txt.

Privilege Escalation

Basic Enumeration

Realizaremos una verificación inicial de los privilegios que dispone el usuario actual. Verificamos que no disponemos de algún grupo interesante ni permisos de sudoers.

Por otro lado, también revisamos binarios con permisos de SUID y capabilities pero no logramos obtener nada interesante.

Kernel Exploitation - OverlayFS Vulnerability (CVE-2023-0386)

Al acceder por SSH con el usuario admin, se nos indicaba que teníamos un correo electrónico. Revisaremos el contenido de /var/mail/admin en el cual nos encontramos con un correo dirigido a nosotros en el cual se menciona de actualizar el sistema operativo debido que han aparecido nuevos CVE. Recalcan la vulnerabilidad OverlayFS que parece ser bastante grave.

Revisando el kernel del equipo, parece ser una versión vulnerable a OverlayFS.

Realizamos una búsqueda por Internet, y se nos menciona el OverlayFS.

En la siguiente página web, comprobamos que la versión del kernel que dispone el equipo al parecer es vulnerable.

Nos encontramos con el siguiente repositorio de GitHub que nos proporcionan los archivos necesarios para explotar esta vulnerabilidad. Nos descargaremos el repositorio a través de un .zip.

Comprobaremos que disponemos del archivo comprimido en nuestro equipo, lo renombraremos y lo compartiremos a través de un servidor web.

Desde el equipo comprometido, nos descargaremos el comprimido y lo descomprimiremos.

Accederemos al directorio correspondiente y ejecutaremos make all para compilar el proyecto.

Verificamos que se nos han generado diversos archivos adicionales.

Siguiendo la explotación, deberemos de ejecutar los siguientes archivos para conseguir acceso como root.

Deberemos de disponer de otra nueva terminal, ya que desde esta deberemos de ejecutar el comando ./exp el cual finalmente obtendremos acceso como root y podremos visualizar la flag root.txt.

Última actualización

¿Te fue útil?