En esta entrada utilizaremos distintas herramientas para analizar un entorno de Active Directory, tanto desde Linux como desde Windows.

Este post sirve tanto a Pentesters como a miembros de Blue Team, ya que se identifican posibles vectores de ataque y configuraciones inseguras sobre un dominio. Tanto para explotar por el lado de un atacante, como para corregir y monitorear desde el lado de Blue Team.

Utilizaremos el Active Directory desplegado anteriormente para practicar, las herramientas que utilizaremos son:

Windows:

  • Powerview – https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1 (Ya no se desarrolla de manera activa, pero aun es bastante útil para obtener información de un AD).
  • RSAT Active Directory DLL – https://github.com/samratashok/ADModule.git (DLL oficial de Microsoft para gestion de Active Directory desde Powershell, se puede importar la DLL directamente sin necesidad de instalar RSAT o tener privilegios administrativos)
  • SharpHound – https://github.com/BloodHoundAD/BloodHound/tree/master/Collectors (Herramienta para realizar consultas a un controlador de dominio, obteniendo información sobre usuarios, equipos, grupos, ACLs, acceso administrativo de ciertos usuarios, entre otros. Esta información se almacena en ficheros .json que pueden ser importados a BloodHound, obteniendo gráficos sobre la información obtenida y posibles vectores de ataque)

Linux:

  • Ldapdomaindump – https://github.com/dirkjanm/ldapdomaindump.git (Herramienta para consultar información del dominio respectivo, extrayendo usuarios, equipos, grupos, política de contraseñas y relaciones de confianza en formato facil de procesar, json y HTML para visualizar los datos desde un navegador, se mostro un pequeño detalle de la herramienta en posts anteriores)
  • bloodhound-python – https://github.com/fox-it/BloodHound.py.git (Versión en Python del ingestor SharpHound, no cuenta con todas las funcionalidades de SharpHound, pero sirve para darle un vistazo rápido a un forest especifico)

En ambos casos, es necesario contar con Bloodhound correctamente instalado, incluyendo la base de datos Neo4j.

INSTALACIÓN DE NEO4J/BLOODHOUND

Instalación sobre Windows:

https://bloodhound.readthedocs.io/en/latest/installation/windows.html

Instalación sobre Linux:
https://bloodhound.readthedocs.io/en/latest/installation/linux.html

Las instrucciones de instalación son directas, pero en resumen se realizan los siguientes pasos:

Windows:

  • Instalar Oracle JDK para Java: https://www.oracle.com/java/technologies/javase-jdk11-downloads.html (Las opciones por defecto deberían funcionar bien)
  • Descargar Neo4j Community Edition: https://neo4j.com/download-center/#community
    • Una ves descargado el fichero, lo descomprimimos en una ruta de nuestra elección.
    • Levantamos una terminal de comandos como administrador y navegamos a la ruta donde descomprimimos el fichero, específicamente al directorio “bin” (C:\neo4j….\bin)
    • Ejecutamos el comando “neo4j.bat install-service”.
    • Iniciamos el servicio ejecutando “net start neo4j”
  • Una ves instalada la base de datos, podemos utilizar un navegador web para acceder a la ruta http://localhost:7474, donde nos autenticaremos a la base de datos con las credenciales neo4j:neo4j, cambiando esta contraseña al acceder exitosamente.
  • Descargar la GUI de Bloodhound: https://github.com/BloodHoundAD/BloodHound/releases
  • Descomprimir el fichero y ejecutar Bloodhound.exe, autenticándose con las credenciales de Neo4j definidas anteriormente.

Linux:

  • Actualizar los repositorios: echo “deb http://httpredir.debian.org/debian stretch-backports main” | sudo tee -a /etc/apt/sources.list.d/stretch-backports.list
  • Ejecutar apt-get update, de esta manera, los instaladores de neo4j obtendrán automáticamente la mejor versión de java para ejecutarse.
  • Agregar el repositorio de Neo4j a los sources del equipo linux.
    • wget -O – https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add –
    • echo ‘deb https://debian.neo4j.com stable 4.0’ > /etc/apt/sources.list.d/neo4j.list
    • sudo apt-get update
  • Instalar apt-transport-https en caso de no tenerlo: sudo apt-get install apt-transport-https
  • Instalar Neo4j: sudo apt-get install neo4j
  • Se puede ejecutar neo4j desde la ruta /usr/bin/ con el siguiente comando: sudo /usr/bin/neo4j console | start
    • Console para observar los logs de la base de datos en la terminal, para propositos de debugging.
    • Start para iniciar la base de datos en segundo plano.
  • Navegar a la ruta http://localhost:8834, autenticarse con las credenciales neo4j:neo4j y actualizar la credencial de acceso.
  • Descargar la GUI de Bloodhound: https://github.com/BloodHoundAD/BloodHound/releases
  • Descomprimir el fichero y ejecutar Bloodhound: sudo ./BloodHound –no-sandbox
  • Autenticarse con las credenciales definidas anteriormente.

De esta manera instalamos Bloodhound en nuestros equipos para poder visualizar la información recolectada por los Ingestors.

CONFIGURACIÓN DEL AD PARA EXPLORAR VECTORES DE ATAQUE EN BLOODHOUND

Para el laboratorio, agregaremos algunas configuraciones inseguras sobre nuestro Active Directory para tener varios vectores de ataque.

Accedemos al menú ADSI Edit en nuestro DC.

En la nueva ventana, hacemos click en Actions > Connect To

Podemos dejar los valores por defecto para este escenario.

Una ves realizada la conexión, expandimos las carpetas hasta identificar el nivel CN=Users donde observaremos los grupos y usuarios existentes en nuestro AD.

Desde esta ventana podemos modificar las ACLs de cualquier objeto del dominio, en este escenario, otorgaremos privilegios indirectos del usuario hank.scorpio al usuario admin.

Le damos click derecho al objeto admin y luego en Properties

Luego, accedemos a la pestaña Security y le damos click en Add.

En la nueva ventana, escribimos el nombre de usuario y le damos click a Check Names para que automaticamente se identifique el objeto de dominio respectivo.

Le damos OK y luego definimos que permisos queremos que el usuario hank.scorpio tenga sobre el usuario admin

Para este escenario, le daremos privilegios de cambio y reseteo de contraseña al usuario.

Hacemos click en Apply y luego OK para aplicar los cambios.

Adicionalmente, otorgaremos otro privilegio al usuario Service_BD sobre el grupo Administrators.

Para identificar a este grupo, navegamos a la pestaña CN=Builtin en el panel izquierdo.

Replicamos los pasos anteriores, agregando al usuario Service_BD.

Le daremos permisos Write (de escritura) sobre el grupo Administrators.

Posteriormente, actualizaremos el esquema para que los cambios ejecutados se guarden.

Con estas configuraciones, procederemos a realizar la extracción de información con SharpHound/bloodhound-python.

EJECUCIÓN DE SHARPHOUND

Sharphound viene en formato exe y PS1, en este caso, utilizaremos el binario que descargamos anteriormente, cabe destacar que se debe utilizar un equipo Windows para ejecutarlo de manera correcta.

*NOTA: Cabe destacar que no es necesario tener Bloodhound instalado para correr el Ingestor, es un binario independiente.

Utilizaremos el equipo TECNOLOGIA01 para ejecutar el Ingestor, aprovechando que el mismo ya se encuentra en dominio y es Windows 10.

Se debe deshabilitar el antivirus para ejecutar el binario.

Ya que el equipo se encuentra en dominio y el usuario esta autenticado, no necesitamos especificar usuario a menos que se quiera utilizar un usuario distinto para realizar las consultas, mas adelante veremos como ejecutar el binario con el contexto de un usuario de dominio desde un equipo fuera de dominio.

Ejecutamos Sharphound con la flag -c all para que obtenga la mayor cantidad de informacion posible.

Una ves termina la extracción de información, obtenemos un fichero compreso que debemos importar a nuestra base de datos Neo4j.

La extracción de información desde Linux utilizando bloodhound-python es bastante similar, la unica diferencia notable es que se tendria que especificar el controlador de dominio, el dominio, usuario y su password respectivo, o establecer al controlador de dominio como un servidor DNS en el equipo Linux y establecer el dominio, usuario y password.

Estableciendo el servidor DNS de manera manual.

Ejecutamos bloodhound-python especificando los parámetros mencionados anteriormente.

Obtenemos 4 ficheros en formato json.

Estos ficheros están listos para ser importados a bloodhound.

Enviamos los ficheros hacia el equipo con Bloodhound y lo arrastramos directamente a la interfaz grafica, en este caso, yo usare una maquina virtual para levantar el software necesario.

Arrastrando el fichero compreso directo a la interfaz grafica, obtenemos la data.

Existen múltiples consultas predefinidas en Bloodhound, las cuales exploraremos ahora.

Find all Domain Admins.

Identificara todos los miembros del grupo Domain Admins que para atacantes son el objetivo principal y para los defensores, los usuarios que tienen que proteger.

Ahí observamos los miembros existentes del grupo, incluyendo una computadora, indicando que para obtener privilegios de administración de dominio, solo necesitamos comprometer el equipo TECNOLOGIA01, obtener el hash NTLM del equipo y podremos acceder a los DCs con privilegios administrativos, obviamente es una configuración deficiente, por lo que un Blue Team puede tomar acciones sobre este punto.

Ya conocemos a todos los administradores de dominio, pero acá nos preguntamos, ¿Qué otros vectores de ataque podemos identificar desde esta herramienta?

Anteriormente hicimos configuraciones inseguras sobre ACLs de usuarios y grupos, las cuales podemos observar en Bloodhound.

Si ejecutamos una de las consultas pre-cargadas Find Shortest Paths to Domain Admins observamos la siguiente imagen:

Es un poco complicado entender toda la información que se nos presenta, pero analizando punto a punto vemos que usuarios o equipos un atacante tendría que comprometer para obtener privilegios de administrador de dominio.

Observamos que los usuarios PWNED, ADMIN, JSEC, ADMINISTRATOR y el equipo TECNOLOGIA01 pertenecen al grupo de domain admins, por lo que comprometer uno de esos usuarios es el camino directo, sin embargo en la parte superior observamos un caso un poco distinto.

Observamos que el usuario SERVICE_BD tiene un enlace con GenericWrite marcado apuntando al grupo ADMINISTRATORS.

Este enlace indica que el usuario SERVICE_BD puede cambiar las propiedades del grupo ADMINISTRATORS.

Simplificando un poco algunos conceptos de Active Directory, podemos considerar a usuarios, grupos, equipos, políticas de grupo, unidades organizacionales, etc. como OBJETOS, cada uno con propiedades especificas y distintas según el tipo de objeto (un objeto usuario no tiene las mismas propiedades que un objeto grupo), este enlace que observamos nos indica que el usuario respectivo puede modificar estas propiedades especificas de grupos, en este caso, indicando que este usuario, si bien no pertenece al grupo ADMINISTRATORS, tiene los privilegios suficientes para agregar a cualquier otro usuario de dominio al grupo respectivo.

Si bien el grafico identifica este vector indirecto para comprometer el Active Directory, siempre recomiendo revisar cada uno de los usuarios privilegiados, específicamente si se encuentran autenticados en algún equipo especifico y los objetos del dominio que lo pueden modificar (Explicit Object Controllers)

Revisando Bloodhound nuevamente, seleccionamos al usuario admin y analizamos sus Explicit Object Controllers.

Observamos un privilegio especial para el usuario hank.scorpio, el puede forzar el cambio de contraseña del usuario admin.

Esto quiere decir que si comprometemos al usuario hank.scorpio, podemos utilizarlo para definir una nueva contraseña para el usuario admin, que pertenece al grupo de administradores de dominio.

De esta manera identificamos un nuevo vector de ataque que no fue marcado por la herramienta, por eso se recomienda revisar cada uno de los objetos privilegiados para identificar estos posibles caminos.

Ya que vimos métodos distintos para escalar privilegios, procederemos a explotarlos.

EXPLOTACION DE ACLS

Podemos utilizar Powerview para explotar este tipo de privilegios, sin embargo, la herramienta es detectada por un antivirus, si bien en nuestro caso deshabilitamos el mismo para la ejecución de Bloodhound, puede que en escenarios reales, donde uno ya se encuentre en oficinas de cliente o por VPN conectado a un equipo de dominio, no podamos bajar el antivirus, justo por esta situación prefiero utilizar una DLL oficial de gestión de Active Directory, presentada al inicio del post, esta DLL nos permitirá explotar estas ACLs sin restricciones, ya que esta firmada por Microsoft y es una herramienta legitima de gestión.

Descargamos la DLL en el equipo TECNOLOGIA01 y la importamos a través de Powershell.

Puede que obtengamos un error al importarla, reintentando la acción será suficiente para continuar.

Ya con las herramientas necesarias explotamos el primer escenario.

Service_BD con privilegios de escritura sobre el grupo Administrators.

Para este escenario, crearemos un nuevo usuario de dominio sin ningún privilegio adicional, con una contraseña cualquiera (Julio2022 en mi caso, patrones débiles y predecibles de contraseñas, no utilizarlas en ambientes productivos)

Fanatico de los Simpson por si no se dieron cuenta

Consultamos la información de este usuario antes de realizar cambios.

Podemos utilizar el mismo modulo que importamos, para obtener una lista de comandos, utilizamos Powershell

Comando: Get-Command -Module AD (En mi caso es AD ya que asi se llama la DLL que importe)

Obtenemos información del grupo al que vamos a atacar.

Observamos que existen 6 miembros de este grupo, legendario.esquilax y Service_BD no son parte del mismo.

Para mantener las cosas simples, utilizaremos la pass del usuario Service_BD que obtuvimos en posts anteriores.

Definimos un objeto credencial para ejecutar los comandos como el usuario Service_BD, recordemos que la sesión que tenemos iniciada en el equipo de dominio es con el usuario cosme.fulanito, si ejecutamos los comandos de manera directa, los ejecutaremos como si fuéramos el usuario cosme.fulanito y no Service_BD, que es el que necesitamos.

En resumen, lo que se realiza es:

En el objeto $pass almacenar la contraseña “P4ssw0rd123” de manera segura, perteneciente al usuario Service_BD.

En el objeto $cred crear una credencial de usuario válida, especificando que será para el usuario Service_BD con la contraseña almacenada en el objeto $pass.

Con este objeto nosotros podremos ejecutar ciertos comandos sobre el dominio personificando al usuario respectivo.

El modulo que necesitamos para explotar el privilegio de escritura sobre un grupo es Add-ADGroupMember, para añadir a un usuario al grupo, como su nombre lo indica.

Si ejecutamos el comando directamente, podremos definir paso a paso los parámetros respectivos, también se puede definir todo en una sola linea, como se observa en la siguiente captura.

En la primera linea, ejecutamos el comando para agregar al usuario legendario.esquilax al grupo Administrators utilizando la credencial perteneciente al usuario Service_BD, luego volvemos a enumerar los miembros del grupo Administrators y observamos que el nuevo usuario es parte del mismo.

Podemos validar los privilegios del usuario intentando hacer un DCSync desde el equipo Kali.

Explotamos el vector de ataque de ACLs mal configuradas con éxito.

HANK.SCORPIO CON PRIVILEGIOS DE RESETEO DE CONTRASEÑA SOBRE EL USUARIO ADMIN

El segundo vector por ACLs es a traves de hank.scorpio, ya que el mismo puede cambiar la contraseña del usuario admin de manera directa.

Continuaremos utilizando la DLL de Active Directory para este ejercicio.

Creamos nuevamente el objeto $pass y $cred para personificar al usuario hank.scorpio

La credencial expiro, por lo que la actualice a ese valor.

Probamos la credencial “Test1234!!” sobre el usuario admin, la cual sera la nueva pass.

Obtenemos un error, ya que no es la contraseña respectiva.

Para cambiar la contraseña del usuario admin utilizaremos el comando Set-ADAccountPassword.

En la primera linea definimos la nueva contraseña en un objeto SecureString.

En la segunda realizamos el cambio, apuntando a la cuenta admin, utilizando la credencial del usuario hank.scorpio almacenada en el objeto $cred y definiendo la nueva contraseña del usuario almacenada en el objeto $newpass.

Volvemos a validar la credencial desde la maquina Kali, obteniendo esta ves control sobre el dominio.

Esta es una pequeña muestra de ACLs mal configuradas y como pueden ser explotadas sobre un dominio de Windows, en entradas posteriores exploraremos un poco más sobre otro tipo de ACLs que dan lugar a ataques como Resource Based Constrained Delegation y creación de SPNs para ataques de Kerberoasting.

Así mismo, se realizará la explotación desde un host Windows fuera de dominio, a través de objetos de Powershell y creación de procesos con usuarios distintos utilizando runas.

Para personas que pertenecen al Blue Team, se recomienda analizar a detalle la información de Bloodhound para identificar este tipo de configuraciones que podrían existir en su AD, ya que estos vectores son más complicados, pero también más sigilosos.