Attaques entre approbations entre domaines



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:

  • catalogue global
  • rĂ©gime.

Le tableau ci-dessous montre les types d'approbation entre les domaines et leurs propriétés.

Non.Type de confianceTransitivitéDirectionMécanisme d'authentificationLa description
1ExterneNon transitiveUnidirectionnel ou bidirectionnelNTLM uniquementIls sont installĂ©s entre des domaines appartenant Ă  des forĂȘts diffĂ©rentes ou avec un domaine Windows NT 4.0.
2RoyaumeTransitive ou non transitiveUnidirectionnel ou bidirectionnelKerberos uniquementInstallĂ© entre les domaines Windows et non Windows Ă  l'aide du protocole Kerberos. Ce type d'approbation peut ĂȘtre utilisĂ© pour fournir une authentification de bout en bout sur les systĂšmes Windows et UNIX.
3La forĂȘtTransitiveUnidirectionnel ou bidirectionnelKerberos ou NTLMSituĂ© entre les forĂȘts. Dans le mĂȘme temps, les administrateurs dĂ©cident eux-mĂȘmes si la relation sera bilatĂ©rale ou unilatĂ©rale.
4RaccourciTransitiveUnidirectionnel ou bidirectionnelKerberos ou NTLMSituĂ© entre les domaines d'arbres diffĂ©rents appartenant Ă  la mĂȘme forĂȘt. UtilisĂ© pour rĂ©duire le chemin de la confiance, augmentant ainsi l'efficacitĂ© de l'interaction entre les deux domaines.
5Parent-enfantTransitiveBidirectionnelKerberos ou NTLMIls sont installés automatiquement lorsqu'un nouveau domaine est créé dans l'arborescence. Dans une arborescence de domaine, les relations sont décrites par le schéma parent-enfant.
6Confiance Ă  la racine de l'arbreTransitiveBidirectionnelKerberos ou NTLMInstallĂ© automatiquement lorsqu'une nouvelle arborescence de domaine est créée dans une forĂȘt existante. En fait, la confiance s'Ă©tablit entre le domaine racine de la forĂȘt et le domaine créé, qui sera la racine de la nouvelle arborescence.

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:

  • unilatĂ©ral;
  • bilatĂ©rale.

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




  1. Le client envoie une demande d'authentification directement Ă  la ressource elle-mĂȘme, situĂ©e dans un autre domaine, Ă  laquelle il souhaite accĂ©der.
  2. 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.
  3. 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.
  4. Le serveur envoie une requĂȘte et une rĂ©ponse au contrĂŽleur de son domaine B.
  5. 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:

    1. via l'API Win32;
    2. via les méthodes .NET;
    3. 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.

    Drapeaux
    DS_DOMAIN_DIRECT_INBOUNDÉnumĂ©rer les domaines qui approuvent directement le domaine dont ServerName est membre.
    DS_DOMAIN_DIRECT_OUTBOUNDÉnumĂ©rer les domaines directement approuvĂ©s par le domaine dont ServerName est membre.
    DS_DOMAIN_IN_FORESTÉnumĂ©rer les domaines qui sont membres de la mĂȘme forĂȘt qui a ServerName comme membre.
    DS_DOMAIN_NATIVE_MODEÉnumĂ©rer les domaines oĂč le domaine principal s'exĂ©cute en mode natif Windows 2000.
    DS_DOMAIN_PRIMARYÉnumĂ©rer les domaines qui sont le domaine principal du domaine dont ServerName est membre.
    DS_DOMAIN_TREE_ROOTÉnumĂ©rer les domaines qui se trouvent Ă  la racine de la forĂȘt dont ServerName est membre.


    Attributs


    TRUST_ATTRIBUTE_NON_TRANSITIVEInterdisez la transitivité.
    TRUST_ATTRIBUTE_UPLEVEL_ONLYLe lien d'approbation n'est pas valide pour les systÚmes d'exploitation clients antérieurs à Windows 2000.
    TRUST_ATTRIBUTE_FILTER_SIDSDomaines de quarantaine.
    TRUST_ATTRIBUTE_FOREST_TRANSITIVELe lien d'approbation peut contenir des informations d'approbation de forĂȘt.
    TRUST_ATTRIBUTE_CROSS_ORGANIZATIONCette approbation concerne un domaine / forĂȘt qui ne fait pas partie de cette entreprise.
    TRUST_ATTRIBUTE_TREAT_AS_EXTERNALLa confiance est traitée comme externe à des fins de limite de confiance.
    TRUST_ATTRIBUTE_WITHIN_FORESTLa confiance est interne Ă  cette forĂȘt.


    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:

    1. Nous avons réussi à compromettre le domaine et nous avons des droits d'administrateur de domaine.
    2. 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:


    Non.Démarrer le domaine Position de l'attaquantDomaine attaquéTechnique d'attaqueRelation de confiance
    1RacineEnfantGolden Ticket + Groupe Admin EntrepriseInter-royaume (2 voies)
    2EnfantEnfantFonctionnement de l'historique SIDParent-enfant inter-royaumes (2 voies)
    3EnfantRacineFonctionnement de l'historique SID
    Trust Trust Operation
    Racine d'arbre inter-domaines (2 voies)
    4ForĂȘt 1ForĂȘt 2Bug d'imprimanteForĂȘt inter-royaumes ou Approbation externe (bidirectionnelle)

    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:
    1. Utilisateurs d'un autre domaine disposant de droits d'administrateur local sur les machines de notre domaine.
    2. Utilisateurs d'autres domaines membres de groupes de domaines d'utilisateurs. Groupes contenant des utilisateurs d'un autre domaine.
    3. 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.

Source: https://habr.com/ru/post/fr466445/


All Articles