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.
IMPORTANTE: deberemos de eliminar el Content-Type de JSON y los datos anteriores, para no tener problemas con la solicitud.

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.

Se encontró una falla en el kernel de Linux, donde se encontró acceso no autorizado a la ejecución del archivo setuid con capacidades en el subsistema OverlayFS del kernel de Linux cuando un usuario copia un archivo con capacidades desde un montaje nosuid a otro montaje. Este error de mapeo de uid permite que un usuario local escale sus privilegios en el sistema.
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?