
CTF challenge explotando CVE-2018-10933, bypass de autenticación de libSSH. Incluye configuración de Docker, script de explotación y guía paso a paso para descubrir flags ocultas mediante enlaces simbólicos.
Basado en CVE-2018-10933
CVE-2018-10933 es una vulnerabilidad descubierta en versiones selectas de libSSH, que puede permitir acceso potencialmente ilimitado a la máquina. La vulnerabilidad surge del manejo incorrecto de los encabezados de paquetes durante el proceso de autenticación, donde el envío de un paquete manipulado con el byte MSG_USERAUTH_SUCCESS puede permitir a cualquiera evitar la autenticación. Luego tienen acceso completo a la máquina.
La base de este desafío, entonces, es requerir que los competidores exploren la imagen de docker proporcionada, descubran esta vulnerabilidad, la exploten para obtener acceso y luego encuentren la clave oculta en un enlace simbólico en la máquina.
Someone got into my machine via port 22...
It looks like they didnt even know my credentials.
Anyways, they made a file with an odd name, but it's gone now,
I wonder if there's still some trace of the filename -
it might be something symbolic of the attacker...
Can you figure out how they got in and help me find the filename?
Observe, a partir de la descripción del desafío, que el atacante obtuvo acceso a través del puerto 22, un puerto típicamente reservado para SSH. También observe que el atacante no usó credenciales para obtener acceso.
A partir de esto, si se buscan errores pasados para obtener acceso a una máquina a través de SSH sin credenciales, es muy probable que se trate del problema con el byte MSG_USERAUTH_SUCCESS. Alternativamente, al iniciar una conexión al puerto 22, se puede determinar la versión de libSSH que se está ejecutando y luego buscar exploits comunes para esa versión.
También se puede ver en la Descripción que el nombre de archivo que buscan encontrar (la bandera) solo existe como destino de un enlace simbólico.
Sabiendo ahora que se puede obtener acceso explotando esta vulnerabilidad, uno puede escribir su propio script o copiar un script de ejemplo que pueda ejecutar este exploit y ejecutar un comando en la máquina objetivo. He adaptado un script de explotación para esta solución y lo he llamado libsshauthbypass.py.
Para ejecutar este script y obtener la bandera de la máquina, en el caso de la imagen de demostración, se podría ejecutar un comando similar al siguiente:
./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
lo que luego produce una salida similar a
sspringer-fedora-CVE: ./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
INFO:paramiko.transport:Connected (version 2.0, client libssh_0.8.1)
definitelyarealCTF{totally_a_REAL_flag}
Para usar una versión de este desafío en tu propio CTF, se recomienda encarecidamente cambiar el Dockerfile para utilizar una ruta diferente a la proporcionada por defecto, cambiar la bandera en flag.txt (aunque debe seguir siendo una sola línea), y luego reconstruir la imagen. Tenga en cuenta que puede ser necesario alojar un nuevo contenedor para cada intento de conexión para evitar que alguien ejecute un comando destructivo y afecte a todos los participantes.
Para reconstruir la imagen de Docker con una nueva bandera (y probarla)
flag.txt con la nueva bandera./build_run <nombre de imagen>[:<número de versión] <número de puerto>./libsshauthbypass.py o tu propio script para contactar al contenedor con el payload correcto y un comando que desees ejecutarexit de la shell proporcionada por el script build_run, el contenedor se apagará y eliminará, pero la imagen permanecerá y será etiquetada como <nombre de imagen>Prueba de concepto: https://youtu.be/ELrOBm02ANg
Solución guiada del desafío https://youtu.be/Ii121piSZR0