Guía del hacker para la detección basada en DACL (parte 3)

Esta serie de blogs ha sido escrita por Megan Nilsen, consultora de seguridad, y Andrew Schwartz, director de prácticas de TAC.

1 Introducción

En esta tercera y última sección, continuamos nuestra exploración de los ataques a objetos y atributos y su detección. Al igual que la primera parte se centró en el estudio de los diagramas de flujo proporcionados en el documento DACL Hacker Recipes, y la parte 2 se centró en los atributos que se pueden modificar utilizando PowerMadLa parte 3 se centrará en una colección de atributos adicionales que no entran en el ámbito de las partes 1 y 2, pero que hemos identificado como de interés para la construcción de detecciones.

Aunque en este post se utilizan diferentes herramientas de "ataque", cabe señalar que la herramienta es un medio para ejecutar el ataque, pero nos centramos más en las técnicas subyacentes de atributos modificables y las detecciones que las rodean.

Al igual que en los dos (2) primeros mensajes, he aquí algunos recordatorios:

  • Suponemos que el adversario ya tiene un punto de apoyo en el campo y ha adquirido el acceso necesario para realizar cambios en los objetos que vamos a discutir.
  • La post-explotación no es una prioridad.
  • La inteligencia aplicada a la atribución del adversario no ha sido cartografiada.
  • Se utilizó un subconjunto del registro de eventos de Windows y no se analizaron todos los posibles puntos de datos telemétricos de este conjunto de datos.

2 Configuración de grabación

Como se mencionó en la Parte 1, para propósitos de telemetría nos basaremos en el establecimiento de un SACL de "Auditoría" para cada uno de estos atributos y los siguientes Windows Event IDs:

Configurar un SACL es un paso adicional que debe llevarse a cabo incluso si se están adquiriendo los eventos de Windows enumerados anteriormente.

Por favor, consulte la Parte 1A para obtener información sobre cómo habilitar y configurar el registro SACL y cómo habilitar o ingerir los Windows Event IDs anteriores.

3 Formato de blog

Debido a la extensión de este artículo y al número de atributos que abarca, es importante recordar algunas reglas de formato clave de la parte 1 a medida que avanzamos en este artículo.

  • Cada sección contendrá los siguientes títulos:
  • Nombre del atributo (nombre común (CN) del atributo)
  • Contexto
    • Esta página ofrece un breve resumen de lo que es el atributo (LDAP-Display-Name) y los enlaces pertinentes a la documentación de Microsoft.
  • Modificar atributo (Ataque)
    • Cubre cómo se llevó a cabo el "ataque", incluyendo la configuración relevante para modificar el atributo en cuestión, capturas de pantalla/comandos y herramientas utilizadas.
    • Si se ha habilitado una auditoría adicional para la configuración de la detección, probablemente también se tratará aquí - o, si la configuración adicional era más compleja, se dividirá en una sección anterior o posterior.
  • Construcción de detecciones
    • Cubrirá una variedad de detecciones que incluyen una gama de complejidades
    • Como se menciona en la introducción, no se han analizado todos los posibles puntos de datos telemétricos de este conjunto de datos. Sin embargo, hemos hecho todo lo posible por abarcar los ID de eventos más accesibles e importantes para el desarrollo de detecciones.
    • Cuando sea necesario, proporcionaremos un flujo lógico para las detecciones que impliquen una mayor complejidad o información adicional para interpretar lo que se muestra. Sin embargo, la mayoría de las detecciones seguirán un formato similar y no se explicarán más.

4 Atributos

4.1 AdminSDHolder

4.1.1 Contexto

En AdminSDHolder El objeto AdminSDHolder actúa como un contenedor que se rellena con permisos predeterminados. Este contenedor se utiliza como plantilla para las cuentas protegidas con el fin de evitar alteraciones o modificaciones no intencionadas o no autorizadas. Los usuarios protegidos pueden ser definidos por la política del dominio, pero también suelen incluir por defecto usuarios pertenecientes a grupos como Administradores de dominio, administradores, administradores de empresa y administradores de esquema.

Los atacantes con privilegios suficientes pueden utilizar este contenedor para mantener la persistencia de las listas de control de acceso (ACL) a la bóveda. AdminSDHolder se vuelven a aplicar por defecto cada 60 minutos.

4.1.2 Modificación del objeto (ataque)

Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=BREAKFASTLAND,DC=local' -PrincipalIdentity dacled.egg -Rights All -verbose 

Cifras 1 - Modificar el objeto

4.1.3 Construcción de la detección

4.1.3.1 Detección con ID de suceso 5136 y 4662
index=main ((EventCode=5136 Class=container DN="CN=AdminSDHolder,CN=System,DC=BREAKFASTLAND,DC=LOCAL" LDAP_Display_Name=nTSecurityDescriptor) OR (index=main Account_Name!=*$ Object_Type="%{195a5b-6da0-11d0-afd3-00c04fd930c9}" Object_Name="%{754fb287-55d2-4d68-b7fc-0332e1746740}"  EventCode=4662 Access_Mask = 0x40000))
| eval Logon_ID=if(EventCode==4662,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval usuario=if(EventCode==4662,mvindex( Nombre_cuenta,-1), mvindex( Nombre_cuenta,-1))
| eval DACL=if(EventCode==5136,mvindex( Valor,-1), mvindex( Valor,-1))
| join type=outer Logon_ID
    [ search index=main ¡Nombre_cuenta!=*$ Object_Type="%{19195a5b-6da0-11d0-afd3-00c04fd930c9}" Object_Name="%{754fb287-55d2-4d68-b7fc-0332e1746740}"  EventCode=4662 Access_Mask = 0x40000
    | eval Props=Propiedades
    | eval AccessMask=Máscara_acceso
    | eval ObjectType=Tipo_Objeto
    | eval ObjectName=Nombre_objeto
    |Tabla Account_Name,Logon_ID,Props,AccessMask,ObjectType, ObjectName].
| Tabla _time, Logon_ID, Account_Name, Props, AccessMask, ObjectType, ObjectName, DN, GUID, DACL, Class, Type, LDAP_Display_Name
|Valores de estadísticas por _time, Logon_ID, DACL

Imagen002 1

Cifras 2 - Detección mediante múltiples identificadores de sucesos (1)

Imagen003 2

Cifras 3 - Detección mediante múltiples identificadores de sucesos (2)

4.2 ms-DS-Supported-Encryption-Types

4.2.1 Contexto

En msDS-SupportedEncryptionTypes define los algoritmos de cifrado que Kerberos puede utilizar para cifrar los vales Kerberos.

4.2.2 Modificación de atributo (Ataque)

Antes de poder modificar el msDS-SupportedEncryptionTypes primero tenemos que entender cómo se asocian los valores hexagonales y/o decimales con los tipos de cifrado. con el fin de modificar el atributo utilizando nuestro cmdlet PowerMad.

El gráfico enlazado aquí indica el valor decimal, el valor hexadecimal y los tipos de cifrado admitidos por el msDS-SupportedEncryptionTypes puede definirse del siguiente modo. Para nuestros propósitos, utilizaremos el valor decimal 24 (valor hexadecimal 0x18) para modificar el atributo con el fin de activar la función supp.orte para los tipos de cifrado AES 128 y AES 256. Este valor se ha elegido arbitrariamente.

Imagen004

Cifras 4 - Modificación del atributo

Imagen005

Cifras 5 - Validación del cambio de modificación de atributos

4.2.3 Construcción de la detección

4.2.3.1 Detección con ID de suceso 5136, 4624 y 4662
index=main ((EventCode=5136 AND LDAP_Display_Name=msDS-SupportedEncryptionTypes) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM") OR (EventCode=4662 AND Access_Mask=0x20))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Nombre_cuenta,-1), mvindex(Nombre_cuenta,-1))
| eval Mod_Value=if(EventCode==5136,mvindex(Valor,-1), mvindex(Valor,-1))
| join type=outer Logon_ID
        [Buscar (EventCode=5136) O (EventCode=4624)
        | stats count by Logon_ID, Account_Name, Source_Network_Address
        | Tabla Nombre_de_cuenta,ID_de_entrada, Dirección_de_red_de_origen ]
| join type=outer Logon_ID
    [search index=main ¡Nombre_cuenta!=*$ EventCode=4662 Access_Mask = 0x20
    | Evalu Props=Propiedades
    | eval AccessMask=Máscara_acceso
    | eval ObjectType=Tipo_Objeto
    | eval ObjectName=Nombre_objeto
    | rex field=Mensaje "(?(?ms)(?0
| stats values by _time, Mod_Value

Imagen006 1

Cifras 6 - Detección mediante varios identificadores de sucesos (1)

Imagen007 2

Cifras 7 - Detección mediante varios identificadores de sucesos (2)

4.3 ms-DS-Reveal-On-Demand-Group

Para esta sección, nos referiremos al blog Al filo del cero: el curioso caso de RODC de Elad Shamir (@elad_shamir). El artículo del blog anterior es una herramienta excelente para comprender los RODC y la importancia de la interfaz de administración. msds-RevealOnDemandGroup atributo.

Sin embargo, para resumir a efectos de este post, el atributo msds-RevealOnDemandGroup El atributo msds-RevealOnDemandGroup almacena los objetos (es decir, usuarios, equipos, grupos) cuyas contraseñas están autorizadas a almacenarse en caché en un controlador de dominio de sólo lectura (RODC).

4.3.1 Modificar atributos (Ataque)

Set-ADObject -Identity 'CN=BREAKFAST-DC-03,OU=Domain Controllers,DC=BREAKFASTLAND,DC=LOCAL' -Add @{'msDS-RevealOnDemandGroup'=@('CN=Grupo de replicación de contraseñas RDOC permitidas,CN=Usuarios,DC=BREAKFASTLAND,DN=LOCAL', 'CN=dacled.egg,CN=Usuarios,DC=BREAKFASTLAND,DC=LOCAL')} -Servidor 10.0.2.4

Imagen008

Figura 8 - Modificación del atributo

Imagen009

Figura 9 - Validación de la modificación de atributos

4.3.2 Construcción de la detección

4.3.2.1 Detección mediante los identificadores de sucesos 5136, 4624 y 4662
index=main ((EventCode=5136 AND LDAP_Display_Name=msDS-RevealOnDemandGroup) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM") OR (EventCode=4662 AND Access_Mask=0x20 AND {303d9f4a-1dd6-4b38-8fc5-33afe8c988ad}))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Nombre_cuenta,-1), mvindex(Nombre_cuenta,-1))
| join type=outer Logon_ID
        [Buscar (EventCode=5136) O (EventCode=4624)
        | stats count by Logon_ID, Account_Name, Source_Network_Address
        | Tabla Nombre_de_cuenta,ID_de_entrada, Dirección_de_red_de_origen ]
| join type=outer Logon_ID
    [search index=main ¡Nombre_cuenta!=*$ EventCode=4662 Access_Mask = 0x20
    | Evalu Props=Propiedades
    | eval AccessMask=Máscara_acceso
    | eval ObjectType=Tipo_Objeto
    | eval ObjectName=Nombre_objeto
    | rex field=Mensaje "(?(?ms)(?0
| stats values by _time, Value, Logon_ID

Imagen010 1

Figura 10 - Detección con los ID de suceso 5136, 4662 y 4624 (1)

Imagen011 2

Figura 11 - Detección con los ID de suceso 5136, 4662 y 4624 (2)

4.4 GPC-Máquina-Extensión-Nombres

4.4.1 Contexto

En gPCMachineExtensionName mantiene una lista de identificadores únicos globales (GUID) para los que la configuración de directivas de equipo requiere extensiones de objetos de directiva de grupo (GPO) del lado del cliente y snap-ins de Microsoft Management Console (MMC).

Modificando los GUIDS almacenados en el atributo, un atacante podría potencialmente utilizar GPO para extraer un archivo de un host controlado remotamente y subirlo a un controlador de dominio.

4.4.2 Modificación de atributo (Ataque)

Para esta secuencia de ataque en particular, seguiremos muy de cerca la ruta de ataque descrita en esta entrada del blog de TrustedSec.

En primer lugar, vamos a realizar un reconocimiento para identificar el nombre del GPO que vamos a modificar.

Imagen012

Figura 12 - Realización de un reconocimiento

Como puedes ver, el "DisplayName" del GPO es AttackGPO, pero su nombre, y el valor que necesitaremos para hacer nuestros cambios, es "{7ECE4273-CEEB-44BA-B777-C5FE3DBES 257}".

$objs= Get-ADObject -SearchBase "CN=Policies,CN=System,DC=BREAKFASTLAND,DC=LOCAL" -LDAPFilter "(objectclass=*)" -Credencial $creds -Servidor 10.0.2.4 -Propiedades displayName,gPCMachineExtensionNames

$dcgpos =$objs | ?{$_.displayName -like "Attack"}

$dcgpos

Imagen013

Figura 13 - Realización de un reconocimiento

Con un nombre de GPO y GUID en la mano, ahora podemos lanzar nuestro ataque.

Nota: Para realizar correctamente este ataque, el gPCMachineExtensionNames con la cadena [{GUID}{GUID}] obviamente no funcionará correctamente. Sin embargo, como sólo estamos interesados en detectar cambios en el objeto, y no necesariamente en diseñar un ataque funcional, esto es suficiente para generar los datos de registro que necesitaremos para la detección dentro de nuestro SIEM. Para ejecutar este ataque correctamente, te recomendamos que leas las referencias enlazadas en esta sección (o los enlaces cortos de arriba), ya que hacen un trabajo fantástico guiándote a través de la secuencia de ataque designada. También es importante tener en cuenta quel GPO fue creado con el propósito de realizar estos cambios, así que tenga cuidado si realiza el siguiente ataque en un entorno de producción.

$dcgomain = $dcgpos | ?{$_.Name -eq "{7ECE4273-CEEB-44BA-B777-C5FE3DBE5257}"}

$gpcme = "[{GUID}{GUID}]" + $dcgpomain.gPCMachineExtensionNames

Set-ADObject -Replace @{gPCMachineExtensionNames=$gpcme} -Server 10.0.2.4 -Credential $creds -Identity $dcgpomain.DistinguishedName

Get-ADObject -Credencial $creds -Servidor 10.0.2.4 -Identidad $dcgpomain.DistinguishedName -Propiedades displayName, gPCMachineExtensionNames

Imagen014

Figura 14 - Modificación del GPO

Y podemos confirmar con Active Directory Servithis Interface Editor (ADSI) que el cambio se ha realizado en el GPO correcto:

Imagen015

Figura 15 - Validación de cambios

4.4.3 Construcción de la detección

4.4.3.1 Detección con ID de suceso 5136 y 4624
index=main ((EventCode=5136 AND LDAP_Display_Name=gPCMachineExtensionNames) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM"))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Nombre_cuenta,-1), mvindex(Nombre_cuenta,-1))
| join type=outer Logon_ID
        [Buscar (EventCode=5136) O (EventCode=4624)
        | stats count by Logon_ID, Account_Name, Workstation_Name
        | tabla Nombre_de_cuenta,ID_de_entrada, Nombre_de_la_estación_de_trabajo ]
| tabla _time, EventCode, Mod_Account, Workstation_Name , Class, DN, Logon_ID, Type, LDAP_Display_Name, Value
| donde len(Clase)>0 

Imagen016 1

Figura 16 - Solicitud final de modificación de gPCMachineExtensionName (1)

Imagen017 2

Cifras 17Solicitud final de modificación de gPCMachineExtensionName (2)

4.5 GPC-File-Sys-Path

4.5.1 Contexto

gpC-File-Sys-Path es otro atributo basado en GPO que, al igual que el atributo gPCMachineExtensionNamepuede dar acceso a "derechos clonados en la carpeta específica del GPO en el sistema de archivos donde se encuentra el SYSVOL asociado". (Un atout dans la manche, p. 30) cuando se concede a un usuario acceso de escritura a un GPO.

En la siguiente imagen se puede ver que el gPCFileSysPath se refiere a la ubicación del Sysvol.

Imagen018

Figura 18 - gPCFileSysPath antes de la modificación

4.5.2 Modificación de atributo (Ataque)

Utilizando exactamente la misma ruta de ataque que hicimos para el gPCMachineExtension podemos utilizar el reconocimiento ya realizado y simplemente crear una nueva variable con la que almacenar nuestro cambio. A continuación, realizamos y confirmamos el cambio con el mismo comando PowerShell, ajustando el comando para añadir nuestra nueva variable.

$gpfsp = \imposter.LOCALSysVol\imposter.LOCALPolicies{7ECE4273-CEEB-44BA-B777-C5FE3DBE5257} + $dcgpomain.gPCMachineExtensionNames
 
Set-ADObject -Replace @{gPCFileSysPath=$gpfsp} -Server 10.0.2.4
-Credencial $creds -Identidad $dcgpomain.DistinguishedName
 
Get-ADObject -Credencial $creds -Servidor 10.0.2.4 -Identidad $dcgpomain. DistinguishedName -Propiedades displayName, gPCFileSysPath

Imagen019

Figura 19 - Modificación del atributo gPCFileSysPath

4.5.3 Construcción de la detección

4.5.3.1 Detección con ID de suceso 5136 y 4624
index=main ((EventCode=5136 AND LDAP_Display_Name=gpcFileSysPath) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM"))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Nombre_cuenta,-1), mvindex(Nombre_cuenta,-1))
| join type=outer Logon_ID
        [Buscar (EventCode=5136) O (EventCode=4624)
        | stats count by Logon_ID, Account_Name, Workstation_Name
        | tabla Nombre_de_cuenta,ID_de_entrada, Nombre_de_la_estación_de_trabajo ]
| tabla _time, EventCode, Mod_Account, Workstation_Name , Class, DN, Logon_ID, Type, LDAP_Display_Name, Value
| donde len(Clase)>0

Imagen020 1

Figura 20 - Detección final de gPCFileSysPath (1)

Imagen021 2

Figura 21 - Detección final de gPCFileSysPath (2)

4.6 Descriptor de seguridad NT

4.6.1 Antecedentes

En NTSecurityDescriptor almacena los datos relativos a un objeto, como la propiedad y los permisos, en un archivo " Formato de cadena del descriptor de seguridad. "

4.6.2 Activación de la auditoría

Para estas detecciones en particular, necesitaremos activar la auditoría en dos (2) lugares. En primer lugar, es necesario activar la auditoría desde certsrvque puede abrirse a través del administrador de servidores de su controlador de dominio.

Imagen022

Cifras 22 - Activación de la auditoría de certsrv

Para auditar el acceso a los objetos, también tenemos que ir a nuestros modelos en ADSI edit y activar la auditoría para el modelo de certificado cuyos eventos queremos rastrear - en este caso, el modelo de certificado Usuario modelo.

Imagen023

Cifras 23 - Activar la auditoría de objetos

4.6.3 Modificación de atributo (Ataque)

Para este ataque, utilizaremos un modelo de certificado que es vulnerable a un ataque ESC4 utilizando el método Certipy para buscar y localizar todas las plantillas de certificados disponibles en el dominio. Para más información sobre vulnerabilidades y exploits relacionados con plantillas de certificados, consulte el documento Certipy GitHub.

certipy find -u [email protected] -p  -scheme ldap -dc-ip 10.0.2.4

Imagen024

Cifras 24 - Búsqueda de modelos AD CS

En este caso, podemos identificar rápidamente que el Usuario es vulnerable a ESC4.

Nota: Como regla general, en la naturaleza, buscamos el grupo que tiene los "permisos peligrosos", es decir, usuarios de dominio, usuarios autenticados o equipos de dominio. En este caso, el único grupo con los permisos necesarios para degradar el modelo vulnerable a ESC4 es el grupo Domain Admins, que es suficiente para llevar a cabo el ataque para modificar el atributo.

Imagen025

Cifras 25 - Modelo vulnerable ESC4

A continuación, degradamos el modelo ESC4 para que sea vulnerable a ESC1 y guardamos la configuración antigua del modelo en la carpeta Usuario.json.

certipy template -username [email protected] -p  -template 'User' -scheme ldap -save-old -dc-ip 10.0.2.4

Imagen026

Cifras 26 - ESC4 rebajado a ESC1

A continuación, solicitamos un certificado utilizando el modelo ESC1. En este caso, el usuario solicitante es sous.chefun usuario sin privilegios, que solicita el certificado en nombre de una cuenta de administrador de dominio, jefe.chef. Esto se especifica mediante la opción UPN bandera.

certipy req -username [email protected] -p  -upn head.chef.breakfastland.local -template 'User' -ca BREAKFASTLAND-BREAKFAST-DC-01-CA -target BREAKFAST-DC-01.BREAKFASTLAND.LOCAL -dc-ip 10.0.2.4

Imagen027

Cifras 27 - Solicitud de certificado

Y ahora restauramos el certificado, de nuevo utilizando Certificado. Como se puede ver en la salida, modifica el ntSecurityDescriptor . Según Artículo Rapid7 que inspiró esta sección, es la especificación UPN la que desencadena el proceso de licitación. ntSecurityDescriptor para actualizar.

certipy template -username [email protected] -p  -template -User -configuration User.json -dc-ip 10.0.2.4

Imagen028

Cifras 28 - Restaurar el certificado/modificar el atributo ntSecurityDescriptor

4.6.4 Construcción de detecciones

4.6.4.1 Detección mediante el ID de evento 4898
index=principal EventCode=4898
| tabla hora, EventCode, host, DomainController, Security_Descriptor, Mensaje

Imagen029 1

Cifras 29 - Detección de cambio de ntSecurityDescriptor a través del evento ID 4898 (1)

Imagen030 2

Figura 30 - Detección de cambio de ntSecurityDescriptor a través del evento ID 4898 (2)

4.6.4.2 Detección mediante los ID de suceso 5136, 4662 y 4624
index=main ((EventCode=5136 AND LDAP_Display_Name=ntSecurityDescriptor) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM") OR (EventCode=4662 AND Access_Mask=0x20))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Nombre_cuenta,-1), mvindex(Nombre_cuenta,-1))
| join type=outer Logon_ID
        [Buscar (EventCode=5136) O (EventCode=4624)
        | stats count by Logon_ID, Account_Name, Source_Network_Address
        | Tabla Nombre_de_cuenta,ID_de_entrada, Dirección_de_red_de_origen ]
| join type=outer Logon_ID
    [search index=main ¡Nombre_cuenta!=*$ EventCode=4662 Access_Mask = 0x20
    | Evalu Props=Propiedades
    | eval AccessMask=Máscara_acceso
    | eval ObjectType=Tipo_Objeto
    | eval ObjectName=Nombre_objeto
    | rex field=Mensaje "(?(?ms)(?0
| stats values by time, Value, LogonID

Imagen031 1

Figura 31 - Detección con ID de suceso 5136, 4624 y 4662 (1)

Imagen032 2

Cifras 32 - Detección con ID de suceso 5136, 4624 y 4662 (2)

4.6.4.3 Detección mediante los identificadores de sucesos 5136, 4662 y 4624 - ICP

En este caso, se inician cambios de atributos adicionales cuando se ejecuta este ataque. Para tenerlos en cuenta, también puede crear una detección que añada los atributos adicionales de la infraestructura de clave pública (PKI) a la detección.

index=main ((EventCode=5136 AND (LDAP_Display_Name="*pki*" OR LDAP_Display_Name=ntSecurityDescriptor)) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM") OR (EventCode=4662 AND Access_Mask=0x20))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Nombre_cuenta,-1), mvindex(Nombre_cuenta,-1))
| join type=outer Logon_ID
        [Buscar (EventCode=5136) O (EventCode=4624)
        | stats count by Logon_ID, Account_Name, Source_Network_Address
        | Tabla Nombre_de_cuenta,ID_de_entrada, Dirección_de_red_de_origen ]
| join type=outer Logon_ID
    [search index=main ¡Nombre_cuenta!=*$ EventCode=4662 Access_Mask = 0x20
    | Evalu Props=Propiedades
    | eval AccessMask=Máscara_acceso
    | eval ObjectType=Tipo_Objeto
    | eval ObjectName=Nombre_objeto
    | rex field=Mensaje "(?(?ms)(?0
| stats values by time, LDAP_Display_Name, Value, Logon_ID

Imagen033 1

Cifras 33 - Detección de cambios en objetos adicionales (objetos ICP) (1)

Imagen034 2

Cifras 34 - Detección de cambios en objetos adicionales (objetos ICP) (2)

4.7 Certificado CA

4.7.1 Contexto

En cACertificado El atributo cACertificate almacena certificados que han sido registrados con autoridades de certificación (CAs) de confianza.

4.7.2 Activación de la auditoría/configuración errónea del dominio

Para el próximo ataque, seguiremos la entrada del blog de decodificador (@decodificador_it).

Nota: No seguiremos la secuencia completa del ataque, ya que la modificación de atributos se realiza en las primeras etapas del post. Para simular el parche de ataque completo, siga el procedimiento completo aquí.

Para preparar nuestro ataque, primero tenemos que dar privilegios a un usuario estándar "GenericAll" en el directorio NTAuthCertificates . Esta operación puede realizarse mediante ADSI edit o PowerShell.

En este caso, utilizamos avena.impostora como nuestra cuenta mal configurada.

Imagen035

Cifras 35 - Configuración incorrecta del objeto

A continuación, tenemos que crear la entrada SACL para el archivo NTAuthCertificates para recibir los datos de registro en Splunk.

Imagen036

Cifras 36 - Creación del SACL

Una vez superada esta etapa, podemos lanzar nuestro ataque para modificar el atributo.

4.7.3 Modificación de atributo (Ataque)

Para empezar, vamos a crear una autoridad de certificación autofirmada falsa.

Imagen037

Cifras 37 - Creación de CA (1)

Como se indica en el blog del descodificador, puedes dejar todos los campos vacíos, a excepción de "Nombre común".

Imagen038

Cifras 38 -Creación del CCA (2)

Una vez creada la autoridad de certificación falsa, ya podemos mover el archivo falso.crt creado en un host Windows conectado a un dominio y utilizar el archivo binario nativo certutil para actualizar el cACertificado con el valor de la clave pública adicional.

Es importante señalar aquí que estamos conectados al host de Windows como un avena.impostora, que es la cuenta que hemos "mal configurado" para que tenga permisos especiales sobre el objeto que estamos modificando.

Imagen039

Cifras 39 - Introducir la autoridad de certificación falsa en el dominio

Y ahora, si echamos un vistazo a nuestro cACertificado podemos ver que ha sido modificado con el valor del certificado falso.

Imagen040

Cifras 40 - Atributo Modificación posterior

4.7.4 Construcción de detecciones

4.7.4.1 Detección con ID de suceso 5136, 4662 y 4624
index=main ((EventCode=5136 AND LDAP_Display_Name=cACertificate) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM") OR (EventCode=4662 AND Access_Mask=0x20))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Nombre_cuenta,-1), mvindex(Nombre_cuenta,-1))
| eval Valor_cambiado=if(EventCode==5136,mvindex(Valor,-1), mvindex(Valor,-1))
| join type=outer Logon_ID
        [Buscar (EventCode=5136) O (EventCode=4624)
        | stats count by Logon_ID, Account_Name, Source_Network_Address
        | Tabla Nombre_de_cuenta,ID_de_entrada, Dirección_de_red_de_origen ]
| join type=outer Logon_ID
    [search index=main ¡Nombre_cuenta!=*$ EventCode=4662 Access_Mask = 0x20
    | Evalu Props=Propiedades
    | eval AccessMask=Máscara_acceso
    | eval ObjectType=Tipo_Objeto
    | eval ObjectName=Nombre_objeto
    | rex field=Mensaje "(?(?ms)(?0
| stats values by _time, Changed_Value

Imagen041 1

Figura 41 - Detección con ID de suceso 5136, 4662 y 4624 (1)

Imagen042 2

Cifras 42 - Detección con ID de suceso 5136, 4662 y 4624 (2)

4.8 Primary-Group-ID

4.8.1 Contexto

En primaryGroupID contiene el identificador del grupo primario (RID) al que pertenece el usuario u objeto informático.

4.8.2 Modificación de atributo (Ataque)

En primaryGroupID es fácil de modificar a través de la interfaz gráfica de ADUC.

  • Navegue primero a ADUC
  • Abra la ventana de propiedades del objeto ordenador/usuario que está modificando
  • Navegue hasta la sección "Miembro de
  • Haga clic en "Añadir
    • Seleccione el nombre del grupo que desea convertir en grupo principal.
    • Haga clic en Aceptar y, a continuación, en Aplicar.
  • Seleccione el grupo recién añadido en la casilla "Miembro de".
    • Haga clic en el botón situado debajo de la casilla "Definir grupo principal".
    • Haga clic en Aplicar

Imagen043

Cifras 43 - Cambio de COFFEEPOT-PC primaryGroupID

4.8.3 Construcción de detecciones

Para las siguientes detecciones, nos basamos en los ID de evento 4738 y 4742 para los objetos usuario y ordenador respectivamente. Asegúrese de configurar su SACL en el objeto que está intentando auditar para garantizar que se generen registros y se envíen a su SIEM.

4.8.3.1 Detección mediante ID de suceso 4738 e ID de suceso 4624
index=main AND (EventCode=4738 AND Primary_Group_ID!="-") OR EventCode=4624
| eval logon_id=if(EventCode=4624,mvindex(Logon_ID,1),mvindex(Logon_ID,0))
| eventstats values(EventCode) values(Source_Network_Address) by logon_id
| renombrar valores(*) como *
| eval nombre_cuenta=mvindex(nombre_cuenta,1)
| Ordenar _time
| where isnotnull(Primary_Group_ID)
| Tabla _time, account_name, logon_id, Source_Network_Address, Primary_Group_ID
| stats values by logon_id, account_name

Imagen044

Cifras 44 - Detección con ID de evento 4738 y 4624

4.8.3.2 Detección mediante ID de suceso 4742 e ID de suceso 4624
index=main AND (EventCode=4742 AND Primary_Group_ID!="-") OR EventCode=4624
| eval logon_id=if(EventCode=4624,mvindex(Logon_ID,1),mvindex(Logon_ID,0))
| eventstats values(EventCode) values(Source_Network_Address) by logon_id
| renombrar valores(*) como *
| eval nombre_cuenta=mvindex(nombre_cuenta,1)
| Ordenar _time
| where isnotnull(Primary_Group_ID)
| Tabla _time, account_name, logon_id, Source_Network_Address, Primary_Group_ID
| stats values by logon_id, account_name

Imagen045

Cifras 45 - Detección con ID de evento 4742 y 4624

4.8.3.3 Detección de PrimaryGroupID con filtrado RID

Es importante tener en cuenta que las consultas anteriores sólo filtran los ID de grupo primario que no son iguales a "-" (nulo). Sin embargo, en el caso de las organizaciones que puedan encontrar grandes volúmenes de eventos para estos EventID, puede ajustar el filtrado para buscar o excluir determinados grupos RID.

Por ejemplo, podría modificar la detección de abajo para que sólo las cuentas de los usuarios que tienen su primaryGroupID modificado a 512 (Administradores de dominio) e incluido en el archivo :

index=main AND (EventCode=4738 AND Primary_Group_ID="512") OR EventCode=4624
| eval logon_id=if(EventCode=4624,mvindex(Logon_ID,1),mvindex(Logon_ID,0))
| eventstats values(EventCode) values(Source_Network_Address) by logon_id
| renombrar valores(*) como *
| eval nombre_cuenta=mvindex(nombre_cuenta,1)
| Ordenar _time
| where isnotnull(Primary_Group_ID)
| Tabla _time, account_name, logon_id, Source_Network_Address, Primary_Group_ID
| stats values by logon_id, account_name

5 Conclusión

Esperamos que esta serie de entradas de blog no sólo haga que los profesionales y las organizaciones sean conscientes del alcance de la superficie de ataque de Active Directory (AD), sino también de cómo detectar ataques comunes de los que abusan los probadores de penetración, los miembros del equipo rojo y los actores de amenazas.

Desde el punto de vista de la seguridad, también esperamos que una de las principales lecciones que se extraigan de estos artículos sea la importancia de auditar con frecuencia las autorizaciones de lectura o escritura de estos atributos. Herramientas como Bloodhound, PingCastley PurpleKnight puede ayudar a identificar y comprobar muchos de estos problemas de fácil solución.

Otro punto clave que hay que recordar al intentar implementar las detecciones proporcionadas en estas tres (3) entradas del blog en su propio entorno SIEM es que todas las detecciones se desarrollaron en un entorno de laboratorio. Un entorno de producción real requerirá ajustes adicionales para eliminar los falsos positivos.

Aunque la mejor práctica y preferencia es auditar todos los atributos, reconocemos, entendemos y operamos dentro de las limitaciones de los costes de licencia SIEM. Hemos intentado destacar y priorizar algunos de los ataques/abusos más significativos y, por lo tanto, no hemos cubierto todos los atributos. Reconocemos que no hemos utilizado la "inteligencia" para priorizar los atributos entre los artículos. En su lugar, hemos comenzado con los atributos más "comunes" (empezando por la tabla de abuso DACL de Hacker Recipes) que los equipos rojos y los probadores de penetración pueden abusar, y terminando con los atributos menos comunes o "pasados por alto".

Como las detecciones no se han construido para todos los ataques/abusos posibles, los modelos de detección contenidos en estos artículos pueden utilizarse para desarrollar los casos de uso descritos a medida que se publiquen nuevos ataques/técnicas, o para cubrir objetos que no hayamos cubierto.

Por último, muchas gracias a todos los que han participado en el análisis, la edición y las sugerencias para que esta serie de blogs sea lo mejor posible:

Charlie Bromberg (@_nwodtuhs)

Jonathan Johnson (@jsecurity101)

Jim Sykora (@jimsycurity)

Kevin Clark (@GuhnooPlusLinux)

6 Referencias :

https://www.thehacker.recipes/ad/movement/dacl

https://stackoverflow.com/questions/73107061/convert-datetime-in-a-command

https://www.youtube.com/watch?v=ExO535CITXs

https://specterops.io/wp-content/uploads/sites/3/2022/06/an_ace_up_the_sleeve.pdf

Eventos de Windows :

https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4662

https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4624

https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-5145

https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4742

https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4738

AdminSDHolder :

https://viperone.gitbook.io/pentest-everything/everything/everything-active-directory/persistence/adminsdholder

msDS-Tipos de cifrado admitidos :

https://learn.microsoft.com/en-us/windows/win32/adschema/a-msds-supportedencryptiontypes

https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/decrypting-the-selection-of-supported-kerberos-encryption-types/ba-p/1628797

msds-RevealOnDemandGroup :

https://eladshamir.com/2023/01/25/RODCs.html

gPCMachineExtensionNames :

https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-gpod/896f59a5-5b72-4fb5-b1d4-8d007fdd6cb3

https://www.trustedsec.com/blog/weaponizing-group-policy-objects-access/

https://community.spiceworks.com/topic/345202-tips-and-tricks-for-total-control-the-inner-workings-of-group-policy

https://labs.withsecure.com/tools/sharpgpoabuse

https://sdmsoftware.com/security-related/sending-gpos-down-the-wrong-track-redirecting-the-gpt/

gPC-Ruta-Sistema-Archivo :

https://specterops.io/wp-content/uploads/sites/3/2022/06/an_ace_up_the_sleeve.pdf

https://learn.microsoft.com/en-us/windows/win32/adschema/a-gpcfilesyspath

NTSecurityDescriptor :

https://learn.microsoft.com/en-us/windows/win32/adschema/a-ntsecuritydescriptor

https://github.com/ly4k/Certipy

https://learn.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-string-format?redirectedfrom=MSDN

https://www.rapid7.com/blog/post/2023/06/02/metasploit-weekly-wrap-up-12/

cACertificado :

https://decoder.cloud/2023/09/05/from-ntauthcertificates-to-silver-certificate/

https://learn.microsoft.com/en-us/windows/win32/adschema/a-cacertificate

https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-wcce/f1004c63-8508-43b5-9b0b-ee7880183745

https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/certutil

primaryGroupID :

https://learn.microsoft.com/en-us/windows/win32/adschema/a-primarygroupid

https://www.qomplx.com/blog/primary-group-id-attacks/

https://dovestones.com/changing-primary-group-primarygroupid/

https://www.semperis.com/blog/how-attackers-can-use-primary-group-membership-for-defense-evasion/

Deja una respuesta

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