Skip to content

Python3 implementation of ADRecon with support for NTLM and Kerberos authentication. Generates individual CSV files and a single XSLX report about your AD domain.

License

Notifications You must be signed in to change notification settings

pentestfactory/PyADRecon

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

214 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

pyadrecon

Python3 implementation of an improved ADRecon for Pentesters, Red 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.

Table of Contents

Installation

Generic:

# clone the repo
git clone https://github.com/l4rm4nd/PyADRecon && cd PyADRecon

# create virtual environment
virtualenv venv && source venv/bin/activate

# install dependencies
pip install -r requirements.txt

PyPi:

pipx install pyadrecon

BlackArch Linux:

pacman -Syu pyadrecon

Usage

usage: pyadrecon.py [-h] [--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 --ssl is 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, please create a valid /etc/krb5.conf and DC hostname entry in /etc/hosts. May read this.

Note that you can provide an already existing TGT ticket to the script via --tgt-file or --tgt-base64. For example, obtained by Netexec via netexec smb <TARGET> <ARGS> --generate-tgt <FILEMAME>.

Note

PyADRecon uses an empty workstation name by default (like Impacket/NetExec), which bypasses userWorkstations restrictions automatically. This means accounts restricted to specific computers will work without any special flags!

If needed, you can explicitly spoof a workstation name using --workstation <name> flag during NTLM authentication.

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 βœ…
  • schema or schemahistory βœ…

Domain Controllers

  • dcs or domaincontrollers βœ…

Users & Groups

  • users βœ…
  • userspns βœ…
  • groups βœ…
  • groupmembers βœ…
  • protectedgroups βœ…πŸ’₯
  • krbtgt βœ…
  • asreproastable βœ…
  • kerberoastable βœ…

Computers & Printers

  • computers βœ…
  • computerspns βœ…
  • printers βœ…

OUs & Group Policy

  • ous βœ…
  • gpos βœ…
  • gplinks βœ…

Passwords & Credentials

  • passwordpolicy βœ…
  • fgpp or finegrainedpasswordpolicy πŸ›‘
  • laps πŸ›‘
  • bitlocker πŸ›‘

Managed Service Accounts

  • gmsa or groupmanagedserviceaccounts βœ…πŸ’₯
  • dmsa or delegatedmanagedserviceaccounts βœ…πŸ’₯
    • Only works for Windows Server 2025+ AD schema

Certificates

  • adcs or certificates βœ…πŸ’₯
    • Detects ESC1, ESC2, ESC3, ESC4 and ESC9

DNS

  • dnszones βœ…
  • dnsrecords βœ…

Acknowledgements

Many thanks to the following folks:

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.

About

Python3 implementation of ADRecon with support for NTLM and Kerberos authentication. Generates individual CSV files and a single XSLX report about your AD domain.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 99.6%
  • Dockerfile 0.4%