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
Cifras 2 - Detección mediante múltiples identificadores de sucesos (1)
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.
Cifras 4 - Modificación del atributo
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
Cifras 6 - Detección mediante varios identificadores de sucesos (1)
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
Figura 8 - Modificación del atributo
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
Figura 10 - Detección con los ID de suceso 5136, 4662 y 4624 (1)
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.
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
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
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:
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
Figura 16 - Solicitud final de modificación de gPCMachineExtensionName (1)
Cifras 17 – Solicitud 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.
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
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
Figura 20 - Detección final de gPCFileSysPath (1)
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.
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.
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
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.
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
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
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
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
Cifras 29 - Detección de cambio de ntSecurityDescriptor a través del evento ID 4898 (1)
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
Figura 31 - Detección con ID de suceso 5136, 4624 y 4662 (1)
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
Cifras 33 - Detección de cambios en objetos adicionales (objetos ICP) (1)
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.
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.
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.
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".
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.
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.
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
Figura 41 - Detección con ID de suceso 5136, 4662 y 4624 (1)
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
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
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
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 :
msDS-Tipos de cifrado admitidos :
https://learn.microsoft.com/en-us/windows/win32/adschema/a-msds-supportedencryptiontypes
msds-RevealOnDemandGroup :
https://eladshamir.com/2023/01/25/RODCs.html
gPCMachineExtensionNames :
https://www.trustedsec.com/blog/weaponizing-group-policy-objects-access/
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://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/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/