Skip to main content
HackTheBox endgames – Ascension WriteUp

HackTheBox endgames – Ascension WriteUp

Ascension es uno de los endgames existentes actualmente en la plataforma HacktheBox en el cual debemos ser capaces de obtener acceso de administrador en los dos bosques de Active Directory existentes.

Ascension es uno de los endgames existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Media.

 

Introducción

Daedalus Airlines is quickly becoming a major player in global aviation.

The pace of growth has meant that the company has accumulated a lot of technical debt. In order to avoid a data breach and potentially putting their supply chain at risk, Daedalus have hired your Cyber Security firm to test their systems.
Ascension is designed to test your skills in Enumeration, Exploitation, Pivoting, Forest Traversal and Privilege Escalation inside two small Active Directory networks.
The goal is to gain access to the trusted partner, pivot through the network and compromise two Active Directory forests while collecting several flags along the way.
Can you Ascend?
 
Entry Point: 10.13.38.20

 

Servidores

Hostname IP Pública IP Privada
WEB01.daedalus.local 10.13.38.20 192.168.10.39
DC1.daedalus.local   192.168.10.6
MS01.megaairline.local   192.168.11.210
DC2.megaairline.local   192.168.11.201

 

1. Takeoff

Empezaremos realizando un escaneo de puertos a la ip 10.13.38.20, en primer lugar para ver los puertos abiertos

Descubiertos los puertos abiertos lanzamos un escaneo más detallado sobre los mismos

 

Vemos un portal web en el puerto 80 bajo un IIS, así que accedemos a través del navegador al mismo

 

Navegamos por el portal web y descubrimos un formulario para la solicitud de billetes

Hacemos algunas pruebas sobre el mismo, y al introducir un carácter no habitual nos devuelve un error de mssql

 

El error nos muestra dos cosas, por un lado que es posible realizar un ataque de SQLi y por otro que podemos ver los errores, por lo que esto nos ayudará a detectar fallos en nuestras consultas.

Así que interceptamos la petición con burp

Y la guardaremos en un fichero para utilizarla con sqlmap.

Dicho esto vamos a lanzar un primer ataque para listar las bases de datos existentes

 

Listaremos también los usuarios existentes

 

Listamos las tablas de la base de datos de Daedalus

 

Y nos llama la atención la tabla de proxies

 

Vista esta parte vamos a obtener una shell para obtener más información del servidor de base de datos

 

No podemos utilizar xp_dirtree ni xp_cmdshell así que vamos a buscar otras posibles formas de conseguir explotar el servicio y obtener una shell en el sistema.

Debido a que no tenemos permisos para listar los roles existentes, vamos a crear una tabla en la ddbb de daedalus, sobre el cual después importaremos los datos.

Crearemos la tabla con la siguiente query

Que lanzamos desde el sqli detectado en el portal web con el siguiente payload

Una vez creada la tabla, importaremos los datos siguiendo el ejemplo de la web de microsoft

Lanzaremos la siguiente query

Que en el sqli quedaría de la siguiente forma

 

Y verificamos los datos existentes en la tabla

 

Nos fijaremos sobre todo el usuario daedalus_admin, el cual dispone de los permisos SQLAgentUserRole, SQLAgentReaderRole y SQLAgentOperatorRole.

Estos roles nos indican que el usuario es capaz de leer y ejecutar Agent Jobs en el servidor aunque no sea un sysadmin como tal, por lo que el siguiente paso será verificar si podemos impersonarnos como el mismo para la ejecución de un job que nos permita ejecutar comandos en el sistema.

 

Así que vamos a crear una tabla sobre la cual guardar los permisos que encontremos

Utilizando la siguiente query obtenida de la web de netspi importaremos los privilegios en nuestra tabla

Y verificamos

 

Podemos impersonarnos como el usuario daedalus_admin, pero antes de continuar, nos fijamos en lo que dice la documentación oficial de microsoft

A SQL Server Agent proxy account defines a security context in which a job step can run. Each proxy corresponds to a security credential. To set permissions for a particular job step, create a proxy that has the required permissions for a SQL Server Agent subsystem, and then assign that proxy to the job step.

 

Para poder ejecutar los jobs necesitamos disponer de un proxy a través del cual podamos realizar las ejecuciones pertinentes, así que vamos a crear una tabla proxy sobre la cual importemos la configuración actual.

Creamos la tabla

Nos impersonamos como daedalus_admin e importamos los datos de sp_help_proxy

Una vez hecho verificamos

 

Vista la configuración existente del proxy podemos crear y ejecutar un Agent Job que nos permita ejecutar una revshell con la cual ganar acceso al sistema y revisando en google encontramos un post interesante que explica como lanzar un Command Execution a través de los Agent Job de MSSQL

En nuestro caso subiremos el binario de netcat en un primer paso y en el segundo lo ejecutaremos para ganar acceso, así que he hecho el siguiente script sencillito siguiente el post para poder llevar a cabo el ataque

 

Una vez listo el script, levantamos una escucha en python para servir el binario de netcat y una escucha y ejecutaremos

Esperamos unos segundos y vemos como ha descargado el binario de netcat

Y poco después tenemos una shell con el usuario svc_dev

Vamos al escritorio del usuario y obtenemos la primera flag

 

2. Intercept

Una vez tenemos acceso al servidor vamos a enumerar el mismo. Revisamos en primer lugar la configuración de red para detectar la red interna

Y vemos que tiene una pata en la red 192.168.10.0/24 así que vamos a analizar las peticiones en red que hace esta máquina y para ello vamos a utilizar Inveigh

Lo subimos a la máquina y ejecutamos

 

Nos habrá generado un fichero con la salida

Así que revisamos el mismo

 

Y vemos que realiza peticiones de forma continuada contra el servidor FIN01, lo que nos da que pensar que podría haber alguna tarea programada encargada de llevar a cabo esa comunicación.

Probamos a obtener las tareas programadas pero carecemos de permisos para ello

Así que vamos a utilizar meterpreter para que nos ayude en esta tarea.

Generamos un ejecutable malicioso con dicha revshell

Lanzamos la escucha en metasploit

Subimos el binario y lo ejecutamos

Y tenemos una sesión activa

Accedemos y obtenemos información del sistema en primer lugar

 

Enumeraremos los procesos del usuario, a ver si vemos alguno con privilegios más altos que los que disponemos actualmente con el fin de migrar al mismo

Nos centramos en el proceso de RuntimeBroker y migramos al mismo

A continuación cargaremos powershell, subiremos SeatBelt y lo ejecutaremos para obtener las tareas programadas

Y si nos fijamos en las mismas hay una tarea contra el servidor fin01, en la cual vemos además las credenciales del usuario billing_user.

Aprovechando la conexión enumeraremos credenciales y obtenemos la password del usuario de mssql sa

 

Completada esta parte y con las credenciales obtenidas, vamos a crear un tunel con ligolo que nos permita acceder a la red interna y poder acceder con las credenciales descubiertas hasta el momento.

Así que creamos la interfaz para ligolo y enrutamos a través de este la red interna descubierta

Levantamos nuestro servidor

Y ejecutamos el cliente para conectarnos

 

Ya tenemos acceso a la red 192.168.10.0/24 así que vamos a lanzar un escaneo con nmap para detectar los puertos abiertos en el servidor

Y una vez descubiertos los puertos vamos a lanzar un escaneo más detallado sobre los mismos

 

Vemos que tiene abierto el puerto de winrm así que conectamos con las credenciales obtenidas

 

Y como el usuario tiene permisos de admin, vamos al escritorio del usuario administrator para obtener la segunda flag

 

3. Contrails

Vistas las credenciales obtenidas del usuario sa realizamos varias pruebas en el MSSQL pero sin éxito, así que parece que no será la forma de obtener más privilegios.

Pasamos de este y después de mucho tiempo perdido enumerando vamos a utilizar SharpDpapi a ver si podemos sacar a la luz algún secreto oculto.

Así lo ejecutamos con las credenciales descubiertas del usuario billing_user

 

Y obtenemos las credenciales del usuario svc_backup.

Siguiendo con la investigación, nos fijamos en el siguiente post de credential harvesting con DPAPI para obtener las masterkeys

 

Y vemos que están las credenciales de administrator así que vamos a ver si podemos sacarlas en plano

 

Y vemos que hemos obtenido dos credenciales de usuarios administrator, una del servidor actual, WEB01, y otra del AD DAEDALUS

 

Así que tratamos de descubrir donde está el ad y lo descubrimos en la ip 192.168.10.6 por lo que vamos a lanzar un escaneo a ver que puertos tiene abiertos

Y posteriormente lanzamos un escaneo completo sobre los puertos abiertos

 

Enumerada esta parte y visto que tiene abierto winrm vamos a conectarnos al mismo

 

Y del escritorio del usuario sacamos la tercera flag

 

4. Wingman

Llegados a este punto, después de dar muchas vueltas, y de querer hacerlo de la forma para la que fue diseñado (tenemos credenciales del administrator del AD, pero vamos a hacerlo bien), descubrimos un segundo disco montado en el sistema

Revisamos el mismo y vemos varios ficheros interesantes

Y en uno de ellos vemos las credenciales del usuario administrator local de la máquina

Verificamos con crackmapexec

Y antes de continuar, y ya que tenemos credenciales, hacemos un dumpeo de hashes

Pasamos los mismos por un servicio online como crackstation y sacamos la password del usuario elliot que puede ser de utilidad más adelante

Acabada esta parte conectamos como administrator y cogemos la cuarta flag

 

5. Corridor

Una vez dentro del AD como administrator revisamos interfaces de red

Y vemos que este tiene una pata en otra red, la 192.168.11.0/24, la cual pertenece al segundo bosque que mencionaba en la introducción de este endgame.

Descubierta la nueva red vamos a revisar la tabla arp a ver si podemos ver un listado de servidores a los cuales se ha conectado

Y obtenemos dos ips en la red 11

Subiremos powerview y lanzaremos la utilidad de MapDomainTrust para obtener el nombre de este segundo bosque

Con el AD descubierto podemos tratar de descubrir que ip tiene cada uno de los dos servidores que nos quedan (MS01 y DC2), así que lanzamos un nslookup para ver a que servidor pertenece cada una de las ips

Subiremos a continuación Portscan para poder ver que puertos tienen abiertos sin necesidad de tener que lanzar un segundo tunel para llegar desde nuestro kali

 

En este caso y para facilitar la vida vamos a conectarnos por RDP al servidor, pero este no se encuentra habilitado, así que lo habilitamos y lo permitimos en el firewall

Y conectaremos por rdp, donde veremos una sesión abierta en el navegador con acceso a un portal de Secret Server de Thycotic contra el puerto 80 de la máquina MS01

 

 

Probamos el acceso con las credenciales descubiertas hasta el momento y entramos con el usuario elliot

 

Navegamos por el portal buscando algún punto vulnerable, buscamos información a cerca de la versión, posibles vulnerabilidades pero perdemos demasiado tiempo para nada, hasta que al final detectamos una vulnerabilidad de Command Injection en los scripts configurados.

Revisamos los scripts existentes, y sobre todo uno en particular

 

Hay un script en bash que podemos modificar para ejecutar comandos en el sistema, así que hacemos una prueba para ejecutar el comando whoami en el servidor

 

Configuramos el acceso

 

Y ejecutamos, verificando que el comando se ha ejecutado correctamente

 

Así que lanzamos otra ejecución pero en este caso para obtener la quinta flag

Y obtenemos la misma

 

6. Upgrade

Ya tenemos la flag, pero seguimos necesitando acceder al servidor para poder continuar por lo que tratamos de subir una revshell, aunque nada funciona.

Esto quiere decir que está habilitado el firewall, así que como el DC1 tiene una pata en el DC2 podemos crear una GPO que deshabilite el firewall en todos los servidores del AD, por lo tanto vamos a ello.

Abrimos el panel de Group Policy Management ejecutando

Y crearemos una GPO nueva a la que llamaremos «Disable Firewall»

 

 

Posteriormente la editamos y nos vamos a

Computer Configuration → Policies → Administrative Templates → Network → Network Connections → Windows Defender → Firewall → Domain Profile

Y deshabilitaremos la directiva «Windows Defender Firewall: Protect all network connections.»

 

Y ahora sí que podremos ejecutar la revshell, así que vamos a subir netcat a la máquina, y para ello necesitamos instalar python.

Descargamos el ejecutable en msi de python2 de su web oficial y lo instalamos

Levantamos el servidor

Y codificaremos el payload nuevo que será el siguiente

Lo codificamos

Y enviamos a través de la vulnerabilidad en el panel de Thycotic, viendo como se ha descargado el fichero

Ahora vamos con el segundo payload, que nos ejecutará la revshell

Y obtenemos acceso con el usuario elliot en la máquina MS01

 

Llegados a este punto, comenzamos la enumeración en este servidor y, en la carpeta de descargas del usuario, vemos el instalador de Slack

Por lo que buscamos en los ficheros temporales del usuario y encontramos un blob del navegador Chrome

Copiamos el fichero al directorio del portal web

Descargamos el mismo y con strings en nuestro kali obtenemos una contraseña

 

Con las credenciales obtenidas, accedemos por rdp al servidor MS01, abrimos una terminal, y como tenemos permisos de admin vamos al escritorio del usuario administrator para coger la sexta flag

 

7. Maverick

El siguiente paso será conseguir acceso en el servidor DC2 para obtener la última flag con la que acabar este endgame.

Subimos SharpDpapi de nuevo y lo ejecutamos en esta máquina

 

Y tenemos las credenciales del usuario administrator, pero seguimos haciendo un backup de la sam

Y sacamos credenciales con secretsdump de impacket

 

En el último dumpeo vemos varios usuarios del dominio MEGAAIRLINE.LOCAL, así que guardamos los hashes en un fichero y vamos a ver si reutilizan alguna de las passwords descubiertas hasta el momento y descubrimos que el usuario anna utiliza la password del usuario administrator

 

Probamos a loguearnos con las credenciales pero no podemos hacerlo desde este equipo

 

Probaremos con la técnica de Pass-The-Hash con mimikatz, y aunque parece que funciona, no nos da el resultado esperado

 

Así que vamos a tratar de realizar este ataque utilizando Rubeus en su lugar.

Lanzamos asktgt para tratar de impersonarnos como anna en el DC2

Y conseguimos llevarlo a cabo.

 

El siguiente paso será crear un usuario nuevo en el DC2, así que importamos powermad y powerview

Añadiremos la nueva cuenta

Setearemos el RBCD para delegar privilegios en la nueva cuenta

Y solicitamos el ticket para nuestro usuario privesc

 

Una vez hecho cargamos el ticket para impersonarnos como el usuario administrator

Y verificamos el acceso

 

Una vez validado, importamos de nuevo para darnos de alta en el ldap

 

Y finalmente hacemos un dumpeo del dcsync con mimikatz

 

Y ya tenemos los hashes, aunque vamos a necesitar realizar un segundo salto para poder llegar al DC2 desde nuestro kali y ejecutar wmiexec.

Por lo tanto, en este caso, vamos a usar chisel para hacer el doble salto, así que levantamos un primer servidor en nuestro kali

Y lanzamos el cliente desde WEB01

 

Para el segundo salto lanzamos un servidor desde WEB01

Y el cliente desde DC1

 

Configuramos proxychains en nuestro kali para la comunicación con ambos

 

Y finalmente ejecutamos wmiexec para conectar al DC2 con los hashes descubiertos y obtener la última flag

Y podemos dar por finalizado este endgame.

 

Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *