
TĂŽt ou tard, pendant le pentest, la tĂąche se pose de compromettre la forĂȘt entiĂšre - Ă condition qu'il y ait des droits dans l'un des domaines. Ă de tels moments, de nombreuses questions se posent concernant les fiducies, leurs propriĂ©tĂ©s et les attaques elles-mĂȘmes. Essayons de tout comprendre.
La confiance entre les domaines est utilisĂ©e pour authentifier les utilisateurs d'un domaine sur le contrĂŽleur d'un autre domaine. En d'autres termes, pour que les utilisateurs du domaine A puissent avoir accĂšs aux ressources du domaine B. La structure du domaine peut ĂȘtre de deux types:
- Arbres de domaine
- forĂȘts de domaine.

Lors de la création d'une arborescence de domaines entre les domaines, par défaut, les approbations transitives sont établies. Tous les ordinateurs ont en commun:
- catalogue global
- espace de noms
- régime.
Les arbres de domaine peuvent ĂȘtre combinĂ©s en forĂȘts. Lors de la crĂ©ation d'une forĂȘt de domaine, des approbations transitives sont Ă©tablies et tous les ordinateurs de la forĂȘt partagent les Ă©lĂ©ments suivants:
Le tableau ci-dessous montre les types d'approbation entre les domaines et leurs propriétés.
Plus clairement, les types d'approbations entre domaines sont illustrés dans l'image ci-dessous.

Transitivité
La transitivité est nécessaire pour définir la confiance en dehors des deux domaines entre lesquels elle a été formée et est utilisée pour étendre les relations de confiance avec d'autres domaines. Si nous ajoutons un domaine enfant au domaine, une relation d'approbation bidirectionnelle est établie entre les domaines parent et enfant. Ces relations sont transitives, c'est-à -dire si le domaine A approuve le domaine D et le domaine D approuve le domaine E, le domaine A approuve également le domaine E.

La confiance non transitoire peut ĂȘtre utilisĂ©e pour refuser la confiance avec d'autres domaines.
Direction
Un chemin de relation d'approbation est une sĂ©rie de relations d'approbation entre des domaines auxquels des demandes d'authentification doivent ĂȘtre reçues. En d'autres termes, avant d'authentifier un utilisateur, la confiance entre les domaines est dĂ©terminĂ©e. Pour que les utilisateurs du domaine A accĂšdent aux ressources du domaine D, le domaine D doit approuver le domaine A.
La direction de la confiance est de deux types:
La confiance unidirectionnelle est un chemin d'authentification unidirectionnel créé entre deux domaines. Dans une approbation unidirectionnelle entre le domaine A et le domaine B, les utilisateurs du domaine B ont accÚs aux ressources du domaine A. Cependant, les utilisateurs du domaine A n'ont pas accÚs aux ressources du domaine B. Ce type d'approbation n'est pas transitoire.
La confiance bilatérale est une combinaison de deux relations de confiance unidirectionnelles. Dans une confiance bidirectionnelle entre les domaines A et B, leurs utilisateurs ont accÚs aux ressources des deux domaines. Ce type de confiance est transitoire.
La direction de la confiance est toujours opposée à la direction de l'accÚs. Diagramme représentatif de Microsoft ci-dessous:

Liens pour des types d'approbation plus approfondis:
Kerberos entre domaines approuvés
Prenons un exemple. Le client tente d'accéder au serveur.
Des points 1 à 3, des actions standard se produisent lors de l'utilisation du protocole Kerberos.- Le mot de passe est converti en hachage NTLM, l'horodatage est chiffré avec un hachage et envoyé à KDC en tant qu'authentificateur dans la demande de ticket TGT (AS-REQ). Le contrÎleur de domaine (KDC) vérifie les informations utilisateur et crée un ticket TGT.
- Le ticket TGT est crypté, signé et envoyé à l'utilisateur (AS-REP). Seul le service Kerberos (KRBTGT) peut ouvrir et lire les données d'un ticket TGT.
- Un utilisateur soumet un ticket TGT à un contrÎleur de domaine lors de la demande d'un ticket TGS (TGS-REQ). Le contrÎleur de domaine ouvre un ticket TGT et vérifie la somme de contrÎle PAC.
Les changements commencent à partir du point 4: un ticket TGT inter-domaine apparaßt, le soi-disant ticket de référence, qui est crypté / signé avec une clé inter-domaine créée à partir d'un mot de passe de confiance. Un mot de passe approuvé est défini lors de l'établissement de l'approbation et est connu des deux contrÎleurs de domaine. à l'aide du ticket TGT inter-domaines, un utilisateur du domaine 1 peut demander un ticket TGS pour accéder aux ressources du domaine 2.

NTLM entre domaines approuvés

- Le client envoie une demande d'authentification directement Ă la ressource elle-mĂȘme, situĂ©e dans un autre domaine, Ă laquelle il souhaite accĂ©der.
- Le serveur reçoit une demande du client et lui envoie une réponse CHALLENGE_MESSAGE, qui contient une séquence aléatoire de 8 octets. Il s'agit du Server Challenge.
- Le client, aprÚs avoir reçu la séquence Server Challenge du serveur, crypte cette séquence avec son mot de passe, puis envoie au serveur une réponse qui contient 24 octets.
- Le serveur envoie une requĂȘte et une rĂ©ponse au contrĂŽleur de son domaine B.
- Dans le cas d'une authentification entre approbations, la logique suivante est effectuée:
- Relations d'approbation de direction vérifiées.
- Les informations d'identification du client sont envoyées au domaine A pour s'authentifier.
- S'il n'y a pas de relation d'approbation, la transitivité est vérifiée avec le domaine A.
- Vérification de la transivité entre les domaines
- En cas de transitivité entre les domaines, une demande d'authentification est envoyée au domaine suivant dans le chemin de confiance. Ce contrÎleur de domaine répÚte le processus, vérifiant les informations d'identification de l'utilisateur par rapport à sa base de données de comptes de sécurité.
- S'il n'y a pas de transitivité, un message d'accÚs refusé est renvoyé au client.
6-8. La réponse avec la décision d'authentifier le client.
Attaques entre approbations entre domaines
Donc, pour mener une attaque, nous avons besoin d'informations sur les relations de confiance dans notre domaine.
Cotation des fiducies
Il existe 3 méthodes principales pour répertorier les approbations dans un domaine:
- via l'API Win32;
- via les méthodes .NET;
- via LDAP.
API Win32
L'énumération est effectuée en appelant la fonction DsEnumerateDomainTrusts , qui renvoie la structure DS_DOMAIN_TRUSTSA . En utilisant cette méthode, le SID et le GUID du domaine cible, les indicateurs et les attributs caractérisant la confiance actuelle dans le domaine sont renvoyés.
BloodHound collecte des informations à l'aide de la méthode API Win32.

.Net
La méthode GetCurrentDomain de l'espace de noms [System.DirectoryServices.ActiveDirectory.Domain] est utilisée, qui renvoie une instance de la classe System.DirectoryServices.ActiveDirectory.Domain . Cette classe implémente la méthode GetAllTrustRelationships , qui renvoie toutes les approbations du domaine actuel.
([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()).GetAllTrustRelationships()
L'utilisation de cette méthode est implémentée dans le module Get-DomainTrust dans PowerView .

Un des avantages de cette méthode est sa simplicité. L'information est facile à lire et à comprendre, mais son volume est beaucoup plus petit que lors de l'énumération par d'autres méthodes.
LDAP
Les informations d'approbation de domaine sont stockées dans Active Directory en tant que classe d' objet de la classe trustedDomain .
Exemple d'utilisation:
dsquery * -filter "(objectClass=trustedDomain)" -attr *

PowerView utilise cette méthode par défaut.

Avec des informations sur les domaines et les types d'approbation, vous pouvez accĂ©der directement Ă l'attaque elle-mĂȘme. ConsidĂ©rez 2 options:
- Nous avons réussi à compromettre le domaine et nous avons des droits d'administrateur de domaine.
- Nous n'avons pas de droits d'administrateur de domaine.
Avec des droits d'administrateur sur l'un des domaines
Selon le domaine compromis, plusieurs vecteurs d'attaque peuvent ĂȘtre distinguĂ©s:
Il convient de noter que pour une mise en Ćuvre rĂ©ussie de tous les vecteurs, une confiance bilatĂ©rale entre les domaines est nĂ©cessaire.
1. Historique de l'opération SID
L'historique SID a été introduit pour faciliter la migration des utilisateurs d'un domaine à un autre. L'attribut contient les objets SID précédents. Chaque fois qu'un objet passe d'un domaine à un autre, un nouveau SID est créé, qui devient un objectSID. Le SID précédent est ajouté à la propriété sIDHistory.
Chaque forĂȘt a un groupe d'utilisateurs Enterprise Admins qui n'existe que dans le domaine racine et dispose de droits d'administrateur local sur les contrĂŽleurs de domaine de tous les domaines enfants de la forĂȘt. Cette attaque a Ă©tĂ© dĂ©montrĂ©e pour la premiĂšre fois par Sean Metcalf au BlackHat USA 2015 . L'essence de l'attaque est que nous Ă©mettons un ticket d'or avec l'ajout d'un SID supplĂ©mentaire du groupe Enterprise Admins. Cela se fait en ajoutant des ExtraSids dans la structure KERB_SID_AND_ATTRIBUTES , qui est envoyĂ©e dans la structure KERB_VALIDATION_INFO .

Démo d'attaque:

Impacket a un script qui automatise tout cela.
2. Golden Admin + Enterprise Admin Group
Ayant des droits d'administrateur dans le domaine racine, nous pouvons créer un Golden Ticket avec l'ajout d'un utilisateur au groupe Enterprise Admins (519).
Kerberos::golden /domain:<domain> /sid:<domain_SID> /krbtgt:<ntlm_hash_krbtgt_user> /user:<user> /groups:500,501,513,512,520,518,519 /ptt
Comme dĂ©crit ci-dessus, Enterprise Admin dispose de droits d'administrateur local sur les domaines DC Child. Ainsi, nous pourrons compromettre tous les domaines enfants de la forĂȘt.
3. Fonctionnement des tickets de fiducie
Pour accĂ©der Ă une ressource Ă l'aide du protocole Kerberos, vous avez besoin d'un ticket TGS, qui est chiffrĂ© avec le hachage NTLM du mot de passe du compte de service. Un contrĂŽleur de domaine stocke uniquement des hachages de mots de passe utilisateur pour son domaine. Ainsi, lorsqu'un utilisateur du domaine A a besoin d'accĂ©der Ă une ressource du domaine B, une clĂ© inter-domaine est utilisĂ©e. Cette clĂ© est créée sur la base d'un mot de passe approuvĂ©, qui est dĂ©fini lors de la crĂ©ation de relations d'approbation entre les domaines de la mĂȘme forĂȘt. Dans la base de donnĂ©es de mots de passe (NTDS.dit) sur le contrĂŽleur de domaine, vous pouvez trouver des utilisateurs avec le signe $ Ă la fin. Leur mot de passe est Ă©galement utilisĂ© pour crĂ©er des clĂ©s inter-domaines. Pour crĂ©er un ticket TGT inter-domaines, nous avons besoin d'un hachage de mot de passe de ce compte.
Kerberos::golden /user:<user> /domain:<domain> /sid:<sid_domain> /sids:<extra_sid_entrprice_admin_group_from _another_domain> /aes256:<aes256_trust_user_password> /service:krbtgt /target:<target_domain> /ptt
Démo d'attaque:

L'attaque est particuliÚrement pertinente lorsque le service IS a remarqué une menace et a changé le mot de passe krbtgt 2 fois. Dans ce cas, nous pourrons créer des tickets d'or en utilisant un mot de passe de confiance entre les domaines.
4. Bug d'imprimante
Le protocole distant du systÚme d'impression Windows (MS-RPRN) a la méthode RpcRemoteFindFirstPrinterChangeNotification (Ex) activée par défaut, qui vous permet de forcer l'authentification sur tout ordinateur exécutant le service Spouleur sur l'hÎte spécifié à l'aide du protocole Kerberos ou NTLM. Dans le cas de c NTLM, nous pouvons exécuter NTLM-relay, ou commencer à casser le mot de passe de l'ordinateur (ne jamais décocher). Dans le cas de Kerberos, une machine compromise avec délégation illimitée est nécessaire. Ensuite, nous pouvons prendre un ticket TGT et développer une attaque.
Démo d'attaque:

La figure ci-dessous montre les étapes illustrées dans la vidéo.

Nous n'avons pas de droits d'administrateur de domaine
Un peu de théorie. Carlos Garsia dans son rapport a donné un excellent tableau qui illustre les propriétés de différents types de groupes.

Parmi les fonctionnalités, il convient de considérer que les groupes AD Domain Local et AD Global sont répliqués sans membres de groupe dans le catalogue global et que les groupes AD Universal sont répliqués avec les utilisateurs.
En raison de la façon dont les groupes sont énumérés par le catalogue global, les résultats d'une recherche de lien arriÚre [c.-à -d. Les membres peuvent varier, selon que vous recherchez le catalogue global (port 3268) ou le domaine (port 389), le type de groupes auxquels l'utilisateur appartient (groupes globaux vs groupes locaux de domaine).
Dans le cas oĂč nous n'avons pas de droits d'administrateur de domaine, nous Ă©numĂ©rons les objets. Nous sommes intĂ©ressĂ©s par:
- Utilisateurs d'un autre domaine disposant de droits d'administrateur local sur les machines de notre domaine.
- Utilisateurs d'autres domaines membres de groupes de domaines d'utilisateurs. Groupes contenant des utilisateurs d'un autre domaine.
- Responsables ACL étrangers.
1. Utilisateurs d'un autre domaine disposant de droits d'administrateur local sur les machines de notre domaine
Recherchez les utilisateurs d'un autre domaine qui sont des administrateurs locaux sur les hĂŽtes de notre domaine dans BloodHound:
MATCH (c:Computer) OPTIONAL MATCH p1 = (u1)-[:AdminTo]->(c) WHERE NOT u1.domain = c.domain WITH p1,c OPTIONAL MATCH p2 = (u2)-[:MemberOf*1..]->(:Group)-[:AdminTo]->(c) WHERE NOT u2.domain = c.domain RETURN p1,p2

Commande dans PowerView :
Get-NetLocalGroupMember <server>
2. Utilisateurs d'autres domaines, composés de groupes de domaines d'utilisateurs. Groupes contenant des utilisateurs d'un autre domaine
Comme mentionné ci-dessus, les utilisateurs qui sont membres de groupes Universal uniquement sont répliqués dans le catalogue global. Pour illustrer cette fonctionnalité, nous interrogerons les groupes du catalogue global qui contiennent au moins un utilisateur et une demande LDAP directe au contrÎleur de domaine.
Get-DomainGroup -Properties name, grouptype, member, DistinguishedName -LDAPFilter '(member=*)' -SearchBase "GC://jet.lab"

Lors de l'exĂ©cution d'une requĂȘte dans le catalogue global, nous ne voyons qu'un seul groupe Universal Group de type AD Universal du domaine one.jet.lab.
Si nous exĂ©cutons une requĂȘte LDAP directe sur one.jet.lab, nous verrons d'autres groupes de type AD Domain local et AD Global.

Ceci est important à prendre en compte lors de l'énumération des utilisateurs et des groupes.
Commandes dans PowerView :
Get-DomainForeignUser -Domain <Domain> Get-DomainForeignGroupMember -Domain <Domain>


3. Directeurs étrangers de l'ACL
Le descripteur de sécurité ntSecurityDescriptor (https://docs.microsoft.com/en-us/windows/win32/adschema/a-ntsecuritydescriptor) est accessible à tous les utilisateurs des domaines approuvés et est répliqué dans le catalogue global. Ainsi, nous pouvons interroger tous les DACL pour tous les objets dans les domaines de confiance et filtrer les utilisateurs d'autres domaines.
Get-DomainObjectAcl -Domain jet.lab -ResolveGuids | ?{$_.SecurityIdentifier -like 'SID_Domain*'}

Nous avons donc réussi à identifier l'utilisateur Mike du domaine forestc.lab, qui avait des droits sur le groupe mondial dans le domaine jet.lab.
Le filtrage PS SID et l'authentification sĂ©lective sont utilisĂ©s pour la protection entre les forĂȘts. Une attaque entre les forĂȘts avec le filtrage SID a activĂ© dirkjan sur son blog . Le 9 juillet Ă©galement, Microsoft a publiĂ© une mise Ă jour qui dĂ©sactive la dĂ©lĂ©gation TGT entre les forĂȘts par dĂ©faut. Maintenant, tout, l'histoire avec la dĂ©lĂ©gation illimitĂ©e et le compromis d'une forĂȘt Ă l'autre en utilisant le protocole Kerberos ne fonctionne plus.