AD Automatic Enumeration
Choose the missing information. Do not run every LDAP/SMB collector for identical users and groups under the same identity.
Relationship graph: SharpHound and BloodHound CE
Use SharpHound compatible with your deployed BloodHound CE. On a Windows domain-authenticated collection host, use working DNS and the selected reachable DC:
.\SharpHound.exe --collectionmethods DCOnly --domain DOMAIN --domaincontroller DC_HOST --outputdirectory C:\Evidence --zipfilename ad-directory.zip --memcache
Replace DOMAIN with the DNS domain and DC_HOST with its DC; use an existing writable output directory. Import the generated *ad-directory.zip through that BloodHound version's ingestion interface; the filename may carry a timestamp prefix. Read collection errors as well as the ZIP contents. Review memberships and rights from your identity, then validate useful edges.
This replaces All-by-default and the obsolete Neo4j/Electron startup instructions. DCOnly does not establish current sessions, local-admin access or member-host execution rights. Retain focused host/session collection when a path depends on it: complete domain-mapping variants.
Kali directory graph without a menu
Use BloodHound.py's CE branch from a fresh private working directory. DC_HOST is the DC FQDN; DC_IP is the DNS server/DC IP. It produces CE-compatible JSON/ZIP, not a finished finding:
bloodhound-ce-python -d DOMAIN -u USER -p 'PASSWORD' -dc DC_HOST -ns DC_IP -c DCOnly --disable-autogc --zip
DCOnly collects directory groups, trusts, object properties, ACLs and containers; it bypasses member-computer/session enumeration. --disable-autogc avoids automatically choosing a separate Global Catalog when none is discovered. DNS, DC/GC discovery and directory resolution still require scoped connectivity; this is not a packet-level endpoint allowlist. The normal authentication mode can request a TGT and fall back to NTLM: stop on an invalid credential instead of repeatedly retrying. ZIP creation replaces this run's local JSON files; use a new directory per run.
Do not substitute linWinPwn's all,LoggedOn as a routine first pass. That adds member-host RPC and remote-registry queries; connecting to the registry pipe can trigger the target's RemoteRegistry service. Use the focused Windows host/session variants below only when that evidence is needed. No PEAS-style result is proof of usable rights.
Retained host facts: local groups and a session snapshot
Put only the evidence-backed, assigned host FQDNs in candidate-hosts.txt, one per line. With a collector compatible with the installed CE version:
.\SharpHound.exe --CollectionMethods LocalGroup --ComputerFile .\candidate-hosts.txt --OutputDirectory C:\Evidence --ZipFileName candidate-localgroups.zip
.\SharpHound.exe --CollectionMethods Session --ComputerFile .\candidate-hosts.txt --OutputDirectory C:\Evidence --ZipFileName candidate-sessions.zip
These are separate host/API reads with their own permissions and connectivity requirements. Denied or empty session output is inconclusive; sessions are volatile. Group membership is not proof that a chosen remote transport permits execution. Do not add an All run just to obtain these two views.
Readable inventory from Kali: ldapdomaindump
Choose this for readable users/groups/computers/policies when you do not already have that inventory. It is not a rights graph:
ldapdomaindump -u 'DOMAIN_NETBIOS\USER' -p 'PASSWORD' -o ldap-inventory ldap://DC_IP
Use the NetBIOS domain in DOMAIN_NETBIOS\USER; the explicit password avoids a prompt. Command arguments and collected data need private handling. Read the domain_users, domain_groups, domain_computers and policy reports. Missing attributes or denied reads remain gaps. Do not enable extra hostname resolution by default (-r). Its LDAP connection does not explicitly disable referrals, so do not treat one supplied IP as an enforced single-host boundary. Transport signing/channel-binding support differs between upstream and forks; handle a failed bind through the LDAP procedure rather than adding SIMPLE authentication. Upstream.
Writable directory objects from Kali
With the same valid domain identity, ask the DC which attributes, security descriptors and child classes are writable. This performs LDAP searches, not test modifications:
bloodyAD --host DC_HOST --dc-ip DC_IP -d DOMAIN -u USER -p 'PASSWORD' get writable --detail --partition DOMAIN
--detail reports the affected attributes/classes; --partition DOMAIN confines the query to the default domain naming context. Configuration/schema/DNS partitions are intentionally omitted. Do not add --transitive or --bh: those expand trust traversal or collection. A result is a permission candidate; confirm object type, effective rights, protected-object behavior and the relevant consumer/trigger before choosing a write. A missing result can reflect unreadable attributes or incomplete visibility. Upstream.
If get writable -h lacks --partition, use a compatible reviewed version; do not assume an older default searches only the domain partition.
Native fallback: our AD surface helper
When the graph workflow or third-party collector is unavailable, copy the entire scripts/ad-map directory. From Windows PowerShell 5.1 with usable domain authentication:
.\scripts\ad-map\Invoke-ADMap.ps1 -Server DC_HOST -Domain DOMAIN
Read next-checks.md, raw.json and queries.csv in the printed private directory. Accounts/groups/delegation/policy/AD CS metadata and visible object DACLs generate candidate clues and missing checks. This is not BloodHound's graph or effective-access calculation: nested groups, object-specific rights, deny effects and remote sessions require further validation.
[SUMMARY] lists the returned query counts and candidate clues; [GAPS] identifies failed/limited/partial reads. Start with one clue's evidence and missing check. Returned means that query returned, not that the directory is fully visible. A failed initial RootDSE/domain check stops collection; fix endpoint, authentication or domain context before interpreting absence of findings. Keep the whole ad-map directory together; the entry script needs ADMap.psm1.
Use explicit network credentials or a focused saved pass
An SSH/remote logon can have a usable local token without reusable network credentials. Supply one known identity instead of assuming delegation:
$Credential = Get-Credential -UserName 'USER@DOMAIN'
.\scripts\ad-map\Invoke-ADMap.ps1 -Server DC_HOST -Domain DOMAIN -Credential $Credential -Module Accounts,Groups,Policies -OutputDirectory "$env:LOCALAPPDATA\ADMap\directory-pass1" -SummaryLimit 8
Here DOMAIN is the DNS domain; the output directory must be new and local. -Preview prints the selected query plan without a bind or credential prompt. -SummaryLimit 20 shows more clues without changing saved findings. -MaxResults 2000 is a per-query object cap, not a completeness guarantee; reaching it produces PossiblyLimited. To use the current Windows network identity instead, omit -Credential. Do not place passwords in command lines.
For a specifically missing metadata question, avoid another broad pass:
.\scripts\ad-map\Invoke-ADMap.ps1 -Server DC_HOST -Domain DOMAIN -Module ADCS
Template flags alone do not prove a certificate attack. Setup and limits.
Retain manual LDAP for precise objects/attributes, SMB/RPC for its service view and real host-access checks after obtaining a new identity. A new credential or route justifies targeted re-enumeration.
Prepare tools used on this page
Run setup on Kali after preparing the shared workspace. Skip a clone when its checkout already exists; review/update it deliberately rather than cloning over it. Operational commands remain in the sections above.
Prepare ldapdomaindump
Runs on Kali. Readable LDAP inventory; credentials/connectivity are supplied only when using the procedure. Upstream.
sudo apt install python3-ldapdomaindump
Check on Kali:
ldapdomaindump --help
Prepare SharpHound
Runs on a Windows collection host. Keep companion files and match the collector to the installed BloodHound CE ingestion version. Upstream.
sudo apt install sharphound
cp -a /usr/share/sharphound "$HOME/oscp/tools/artifacts/windows/"
Check on Kali:
file "$HOME/oscp/tools/artifacts/windows/sharphound/SharpHound.exe"
Prepare BloodHound
Optional local AD graph service using the upstream CE quickstart, not the old Electron startup sequence. Requires Docker/Compose, at least 8 GB RAM and about 10 GB free storage. CLI installation is interactive and starts local containers; record its generated credentials privately and change them on first login. If port 8080 is occupied, use the CLI configuration rather than stopping unrelated services. Upstream.
sudo apt install docker.io docker-compose-v2
sudo systemctl start docker
mkdir -p "$HOME/oscp/tools/repos/bloodhound-ce"
cd "$HOME/oscp/tools/repos/bloodhound-ce"
curl -fL https://github.com/SpecterOps/bloodhound-cli/releases/download/v0.2.1/bloodhound-cli-linux-amd64.tar.gz -o "$HOME/oscp/tools/downloads/bloodhound-cli.tar.gz"
tar -xzf "$HOME/oscp/tools/downloads/bloodhound-cli.tar.gz"
sudo ./bloodhound-cli install
Check on Kali:
sudo "$HOME/oscp/tools/repos/bloodhound-ce/bloodhound-cli" running
curl -I http://127.0.0.1:8080
Keep using the same sudo context for CLI management so its configuration/data directory stays consistent. Installation is a first-time operation: resume an existing installation with sudo "$HOME/oscp/tools/repos/bloodhound-ce/bloodhound-cli" up, and stop its containers with the same path followed by down; do not use uninstall as a stop command because it deletes stored data.
Use the official CE quickstart for installation prompts, version matching, start/stop and recovery. Confirm the web login before collecting domain data; docker ps alone does not prove the application is ready.
Prepare BloodHound.py CE
Optional Kali-side alternative to Windows SharpHound; requires Python/pipx and a compatible BloodHound CE importer. Upstream CE branch. Skip installation if a suitable command already exists; do not replace a managed installation merely to obtain another collector.
pipx install bloodhound-ce
bloodhound-ce-python --help
Help must expose DCOnly, --disable-autogc and --zip. Legacy bloodhound-python uses a different output schema. A successful help screen does not verify domain connectivity or graph ingestion.
Prepare bloodyAD
Optional Kali LDAP rights query tool. Upstream. Use an isolated Python environment; keep a suitable existing installation.
pipx install bloodyAD
bloodyAD get writable -h
Help must include --detail and --partition. Select get writable for the inventory above; add, remove and set are separate state-changing operations. Setup/help checks do not authorize target activity.