Python Active Directory Reconnaissance Tool (ADRecon port) with NTLM and Kerberos support.
Project description
Python3 implementation of an improved ADRecon for Pentesters and Blue Teams.
ADRecon is a tool which gathers information about MS Active Directory and generates an XSLX report to provide a holistic picture of the current state of the target AD environment.
[!TIP] If you are a Red Team, may check out ADRecon-ADWS instead.
Table of Contents
Installation
# stable release from pypi
pipx install pyadrecon
# latest commit from github
pipx install git+https://github.com/l4rm4nd/PyADRecon
Then verify installation:
pyadrecon --version
[!TIP] For Windows, may read this. NTLM + Kerberos supported.
Usage
usage: pyadrecon.py [-h] [--version] [--generate-excel-from CSV_DIR] [-dc DOMAIN_CONTROLLER] [-u USERNAME] [-p [PASSWORD]] [-d DOMAIN] [--auth {ntlm,kerberos}] [--tgt-file TGT_FILE] [--tgt-base64 TGT_BASE64]
[--ssl] [--port PORT] [-o OUTPUT] [--page-size PAGE_SIZE] [--threads THREADS] [--dormant-days DORMANT_DAYS] [--password-age PASSWORD_AGE] [--only-enabled] [--collect COLLECT]
[--no-excel] [-v]
PyADRecon - Python Active Directory Reconnaissance Tool
options:
-h, --help show this help message and exit
--version show program's version number and exit
--generate-excel-from CSV_DIR
Generate Excel report from CSV directory (standalone mode, no AD connection needed)
-dc, --domain-controller DOMAIN_CONTROLLER
Domain Controller IP or hostname
-u, --username USERNAME
Username for authentication
-p, --password [PASSWORD]
Password for authentication (optional if using TGT)
-d, --domain DOMAIN Domain name (e.g., DOMAIN.LOCAL) - Required for Kerberos auth
--auth {ntlm,kerberos}
Authentication method (default: ntlm)
--tgt-file TGT_FILE Path to Kerberos TGT ccache file (for Kerberos auth)
--tgt-base64 TGT_BASE64
Base64-encoded Kerberos TGT ccache (for Kerberos auth)
--ssl Force SSL/TLS (LDAPS). No LDAP fallback allowed.
--port PORT LDAP port (default: 389, use 636 for LDAPS)
-o, --output OUTPUT Output directory (default: PyADRecon-Report-<timestamp>)
--page-size PAGE_SIZE
LDAP page size (default: 500)
--dormant-days DORMANT_DAYS
Days for dormant account threshold (default: 90)
--password-age PASSWORD_AGE
Days for password age threshold (default: 180)
--only-enabled Only collect enabled objects
--collect COLLECT Comma-separated modules to collect (default: all)
--workstation WORKSTATION
Explicitly spoof workstation name for NTLM authentication (default: empty string, bypasses userWorkstations restrictions)
--no-excel Skip Excel report generation
-v, --verbose Verbose output
Examples:
# Basic usage with NTLM authentication
pyadrecon.py -dc 192.168.1.1 -u admin -p password123 -d DOMAIN.LOCAL
# With Kerberos authentication (bypasses channel binding)
pyadrecon.py -dc dc01.domain.local -u admin -p password123 -d DOMAIN.LOCAL --auth kerberos
# With Kerberos using TGT from file (bypasses channel binding)
pyadrecon.py -dc dc01.domain.local -u admin -d DOMAIN.LOCAL --auth kerberos --tgt-file /tmp/admin.ccache
# With Kerberos using TGT from base64 string (bypasses channel binding)
pyadrecon.py -dc dc01.domain.local -u admin -d DOMAIN.LOCAL --auth kerberos --tgt-base64 BQQAAAw...
# Only collect specific modules
pyadrecon.py -dc 192.168.1.1 -u admin -p pass -d DOMAIN.LOCAL --collect users,groups,computers
# Output to specific directory
pyadrecon.py -dc 192.168.1.1 -u admin -p pass -d DOMAIN.LOCAL -o /tmp/adrecon_output
# Generate Excel report from existing CSV files (standalone mode)
pyadrecon.py --generate-excel-from /path/to/CSV-Files -o report.xlsx
[!TIP] PyADRecon always tries LDAPS on TCP/636 first.
If flag
--sslis not used, LDAP on TCP/389 may be tried as fallback.
[!WARNING] If LDAP channel binding is enabled, this script will fail with
automatic bind not successful - strongerAuthRequired, as ldap3 does not support it (see here). You must use Kerberos authentication instead.If you use Kerberos auth under Linux, please create a valid
/etc/krb5.confand DC hostname entry in/etc/hosts. May read this. If you are on Windows, please make sure you have valid Kerberos tickets. May read this. Note that you can provide an already existing TGT ticket to the script via--tgt-fileor--tgt-base64. For example, obtained by Netexec vianetexec smb <TARGET> <ARGS> --generate-tgt <FILEMAME>.
Docker
There is also a Docker image available on GHCR.IO.
docker run --rm -v /etc/krb5.conf:/etc/krb5.conf:ro -v /etc/hosts:/etc/hosts:ro -v ./:/tmp/pyadrecon_output ghcr.io/l4rm4nd/pyadrecon:latest -dc dc01.domain.local -u admin -p password123 -d DOMAIN.LOCAL -o /tmp/pyadrecon_output
Collection Modules
As default, PyADRecon runs all collection modules. They are referenced to as default or all.
Though, you can freely select your own collection of modules to run:
| Icon | Meaning |
|---|---|
| 🛑 | Requires administrative domain privileges (e.g. Domain Admins) |
| ✅ | Requires regular domain privileges (e.g. Authenticated Users) |
| 💥 | New collection modul in beta state. Results may be incorrect. |
Forest & Domain
forest✅domain✅trusts✅sites✅subnets✅schemaorschemahistory✅
Domain Controllers
dcsordomaincontrollers✅
Users & Groups
users✅userspns✅groups✅groupmembers✅protectedgroups✅💥krbtgt✅asreproastable✅kerberoastable✅
Computers & Printers
computers✅computerspns✅printers✅
OUs & Group Policy
ous✅gpos✅gplinks✅
Passwords & Credentials
passwordpolicy✅fgpporfinegrainedpasswordpolicy🛑laps🛑bitlocker🛑💥
Managed Service Accounts
gmsaorgroupmanagedserviceaccounts✅💥dmsaordelegatedmanagedserviceaccounts✅💥- Only works for Windows Server 2025+ AD schema
Certificates
adcsorcertificates✅💥- Detects ESC1, ESC2, ESC3, ESC4 and ESC9
DNS
dnszones✅dnsrecords✅
Acknowledgements
Many thanks to the following folks:
- S3cur3Th1sSh1t for a first Claude draft of this Python3 port
- Sense-of-Security for the original ADRecon script in PowerShell
- cannatag for the awesome ldap3 Python client
- Forta for the awesome impacket suite
- Anthropic for Claude LLMs
License
PyADRecon is released under the MIT License.
The following third-party libraries are used:
| Library | License |
|---|---|
| ldap3 | LGPL v3 |
| openpyxl | MIT |
| gssapi | MIT |
| impacket | Apache 2.0 |
| winkerberos | Apache 2.0 |
Please refer to the respective licenses of these libraries when using or redistributing this software.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyadrecon-0.12.0.tar.gz.
File metadata
- Download URL: pyadrecon-0.12.0.tar.gz
- Upload date:
- Size: 644.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfa280f6077ec8e789b8ad1f4d8fc75ee2314620028f318543ded0981fb7289f
|
|
| MD5 |
e39e394943391830c779eaa6e287dd27
|
|
| BLAKE2b-256 |
648331b2643ba7dd4254b79224bc616b823a29959afadad0e0cc033fda2fe537
|
Provenance
The following attestation bundles were made for pyadrecon-0.12.0.tar.gz:
Publisher:
pypi.yml on l4rm4nd/PyADRecon
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyadrecon-0.12.0.tar.gz -
Subject digest:
bfa280f6077ec8e789b8ad1f4d8fc75ee2314620028f318543ded0981fb7289f - Sigstore transparency entry: 975391347
- Sigstore integration time:
-
Permalink:
l4rm4nd/PyADRecon@36aa71f63376052180d2cb8dc6016e12747513e2 -
Branch / Tag:
refs/tags/v0.12.0 - Owner: https://github.com/l4rm4nd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@36aa71f63376052180d2cb8dc6016e12747513e2 -
Trigger Event:
release
-
Statement type:
File details
Details for the file pyadrecon-0.12.0-py3-none-any.whl.
File metadata
- Download URL: pyadrecon-0.12.0-py3-none-any.whl
- Upload date:
- Size: 86.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e53232c88611a59b70a7be7009b90f028a5aef01988a22d00c8a2e7ca6a89016
|
|
| MD5 |
393c588dfaea5c49bbb25896e134009c
|
|
| BLAKE2b-256 |
04fad77b523878faf1be5318fc1d2297bcd71935e393c8b28e7f57ed3f90e665
|
Provenance
The following attestation bundles were made for pyadrecon-0.12.0-py3-none-any.whl:
Publisher:
pypi.yml on l4rm4nd/PyADRecon
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyadrecon-0.12.0-py3-none-any.whl -
Subject digest:
e53232c88611a59b70a7be7009b90f028a5aef01988a22d00c8a2e7ca6a89016 - Sigstore transparency entry: 975391378
- Sigstore integration time:
-
Permalink:
l4rm4nd/PyADRecon@36aa71f63376052180d2cb8dc6016e12747513e2 -
Branch / Tag:
refs/tags/v0.12.0 - Owner: https://github.com/l4rm4nd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@36aa71f63376052180d2cb8dc6016e12747513e2 -
Trigger Event:
release
-
Statement type: