Active Directory Attack-Path Discovery Mapper
A Windows-hosted, web-based security analysis dashboard for post-compromise AD reconnaissance. LURKHOUND performs LDAP-based enumeration, builds a permission graph, discovers privilege escalation attack paths, detects misconfigurations, and generates PowerShell remediation guidance, all tagged with MITRE ATT&CK techniques.
- LDAP Enumeration - Users, groups, computers, OUs, and ACLs via LDAPS (port 636)
- Attack Path Discovery - BFS/DFS engine finds privilege escalation chains to Domain Admin
- Misconfiguration Detection - ACL abuse, DA sprawl, Kerberoastable accounts, nested group abuse
- Interactive Dashboard - Dark glassmorphism UI with risk gauges, graphs, and real-time search
- Graph Visualization - Cytoscape.js-powered permission graph with severity-colored nodes
- Remediation Engine - Copy-ready PowerShell commands for every finding
- MITRE ATT&CK Mapping - 30 unique technique IDs covering every finding and attack path
- Scan History - Track and compare enumeration results over time
- BloodHound Import/Export - Ingest BloodHound/SharpHound JSON exports for analysis
- Shortest Path Calculator - Find shortest privilege escalation path between any two AD objects
- Finding Status Tracking - Track remediation status (open/acknowledged/in_progress/fixed/accepted_risk)
LURKHOUND/
├── backend/
│ ├── main.py # FastAPI application & REST API
│ ├── config.py # Environment config loader (.env)
│ ├── auth.py # LDAPS authentication (port 636, NTLM)
│ ├── ldap_enum.py # LDAP enumeration (users, groups, computers, ACLs)
│ ├── normalizer.py # Data normalization & deduplication
│ ├── graph_builder.py # NetworkX permission graph construction
│ ├── attack_paths.py # BFS/DFS attack path discovery engine
│ ├── misconfig_detector.py # Misconfiguration detection module
│ ├── risk.py # Risk score calculation engine
│ ├── remediation.py # PowerShell remediation generator
│ ├── mitre_mapping.py # MITRE ATT&CK technique mapping
│ ├── bloodhound_io.py # BloodHound JSON import/export
│ ├── report_generator.py # PDF/HTML report generation
│ ├── scan_history.py # Scan history tracking (SQLite)
│ └── models.py # Pydantic request/response models
│
├── frontend-next/ # Primary UI (Next.js 16 + TypeScript)
│ ├── src/
│ │ ├── app/
│ │ │ ├── page.tsx # Landing / login page
│ │ │ ├── layout.tsx # Root layout
│ │ │ ├── globals.css # Global styles
│ │ │ └── dashboard/
│ │ │ ├── layout.tsx # Dashboard shell with sidebar
│ │ │ ├── overview/ # Domain overview & risk score
│ │ │ ├── objects/ # Object explorer (users/groups/computers)
│ │ │ ├── paths/ # Attack path viewer
│ │ │ ├── graph/ # Permission graph visualization
│ │ │ ├── findings/ # Findings & remediation panel
│ │ │ ├── ou-tree/ # OU tree view
│ │ │ └── history/ # Scan history & comparisons
│ │ ├── components/
│ │ │ ├── Sidebar.tsx # Navigation sidebar
│ │ │ ├── SearchModal.tsx # Global search (Ctrl+K)
│ │ │ ├── ObjectDrawer.tsx # Object detail slide-out drawer
│ │ │ ├── NotificationBell.tsx # Real-time notifications
│ │ │ ├── OnboardingTour.tsx # First-run guided tour
│ │ │ ├── AboutModal.tsx # About / credits modal
│ │ │ ├── PantherIcon.tsx # LURKHOUND branding icon
│ │ │ ├── ErrorBoundary.tsx # Error handling wrapper
│ │ │ ├── SkeletonLoader.tsx # Loading state skeletons
│ │ │ └── Toast.tsx # Toast notifications
│ │ ├── context/
│ │ │ └── SessionContext.tsx # Session state management
│ │ ├── lib/
│ │ │ └── api.ts # API client layer
│ │ └── types/
│ │ └── index.ts # TypeScript type definitions
│ ├── tailwind.config.js
│ ├── next.config.ts
│ ├── tsconfig.json
│ └── package.json
│
├── frontend/ # ⚠️ DEPRECATED — Legacy UI (HTML/CSS/JS)
│ # Use frontend-next/ instead.
│
├── sample_data/
│ └── marvel_sample.json # Sample MARVEL.local test dataset
│
├── tests/ # Pytest test suite
│ ├── conftest.py
│ ├── test_attack_paths.py
│ ├── test_remediation.py
│ └── test_risk.py
│
├── data/ # Runtime data (gitignored)
│ └── scan_history.db # SQLite scan history database
│
├── .env # Environment config (gitignored)
├── .gitignore
├── requirements.txt # Python dependencies
├── Dockerfile # Container deployment
├── docker-compose.yml # Multi-service deployment
├── start.bat # Windows launcher (CMD)
├── start.ps1 # Windows launcher (PowerShell)
├── start.sh # Linux/macOS launcher
└── README.md
| Requirement | Version |
|---|---|
| Python | 3.10+ |
| Node.js | 18+ (for Next.js frontend) |
| pip | Latest |
| Network access | To your Domain Controller |
| LDAPS (port 636) | Must be enabled on DC |
| Valid domain account | Read access to AD is sufficient |
docker-compose up --buildThis starts both the backend API (port 8000) and the Next.js frontend (port 3000).
Use the included launcher script:
# PowerShell
.\start.ps1:: CMD
start.batchmod +x start.sh
./start.shcd LURKHOUND
pip install -r requirements.txtcd frontend-next
npm installCreate a .env file in the project root (see .env.example):
API_PORT=8000
LOG_LEVEL=info
SESSION_TTL_MINUTES=30
CORS_ORIGINS=http://localhost:3000,http://127.0.0.1:3000,http://localhost:8000,http://127.0.0.1:8000
LDAP_TLS_VERIFY=falsecd backend
python main.pyServer starts at http://localhost:8000
cd frontend-next
npm run devDashboard opens at http://localhost:3000
Fill in the login form:
- DC IP: Your domain controller IP
- Domain: Your AD domain (e.g.,
MARVEL.local) - Username: Domain account with read access
- Password: Domain account password
- LDAPS: Enabled (port 636)
Click Connect & Enumerate — the system will authenticate, enumerate all AD objects, build the permission graph, and display results.
| Principle | Implementation |
|---|---|
| Zero credential storage | Passwords cleared immediately after authentication |
| In-memory only | No database writes of credentials |
| LDAPS encryption | All AD communication over TLS (port 636) |
| Input validation | All API inputs sanitized; SSRF protection on DC IP |
| Session-based | Session tokens via Authorization header, never in URL paths |
| Rate limiting | Authentication endpoint rate-limited to prevent brute-force |
- Total Users / Groups / Computers / Privileged Accounts
- Risk Score gauge (0–100)
- Domain Admins list
- Risk trend chart over time
- Top 5 critical findings preview
- Quick search across all objects
- Browse Users, Groups, Computers
- Filter and search objects
- Detailed view: memberships, permissions, SPNs
- Slide-out drawer with cross-references to findings and attack paths
- Visual graph rendering via Cytoscape.js
- Step-by-step chain:
User → [MemberOf] → Group → [AdminTo] → DC - Severity classification (Critical / High / Medium / Low)
- Filter by severity and path type
- MITRE ATT&CK technique tags per path
- Full interactive permission graph
- Severity-colored nodes and edges
- Zoom, pan, and node selection
- Orphan node filtering
- Expandable finding cards with severity badges
- Impact and description per finding
- Step-by-step remediation guidance
- Copy-ready PowerShell remediation commands
- MITRE ATT&CK tagging
- Finding status tracking (open/acknowledged/in_progress/fixed/accepted_risk)
- Hierarchical Organizational Unit browser
- Collapse/expand OU branches
- Object counts per OU
- Historical scan results comparison
- Track changes in risk score over time
- Side-by-side diff between scans
| Category | Detections |
|---|---|
| ACL Abuse | GenericAll, WriteDACL, WriteOwner, GenericWrite |
| Privilege Escalation | User → Group → Domain Admin paths |
| Lateral Movement | AdminTo relationships, local admin rights |
| Domain Admin Sprawl | Excessive DA group membership |
| Nested Group Abuse | Over-privileged nested group chains |
| Credential Risk | Kerberoastable admin accounts, passwords never expire |
| Delegation | Unconstrained, constrained, and RBCD delegation abuse |
| GPO Abuse | Write access to GPOs linked to privileged OUs |
| Trust Risk | SID filtering disabled on trust relationships |
30 unique technique IDs mapped across all detections:
| Technique | Name |
|---|---|
| T1003 | OS Credential Dumping |
| T1003.006 | DCSync |
| T1021.002 | Remote Services: SMB/Windows Admin Shares |
| T1069.002 | Permission Groups Discovery: Domain Groups |
| T1078.002 | Valid Accounts: Domain Accounts |
| T1087.002 | Account Discovery: Domain Account |
| T1098 | Account Manipulation |
| T1110 | Brute Force |
| T1187 | Forced Authentication |
| T1207 | Rogue Domain Controller |
| T1222 | File and Directory Permissions Modification |
| T1484 | Domain Policy Modification |
| T1484.001 | Group Policy Modification |
| T1550.002 | Use Alternate Authentication Material: Pass the Hash |
| T1550.003 | Use Alternate Authentication Material: Pass the Ticket |
| T1558 | Steal or Forge Kerberos Tickets |
| T1558.003 | Kerberoasting |
A mock MARVEL.local dataset is provided in sample_data/marvel_sample.json with:
- 7 users (including Tony Stark, Natasha Romanoff, Peter Parker)
- 10 groups (Domain Admins, AVENGERS-IT, HelpDesk, etc.)
- 3 computers (DC, WORKSTATION01, WORKSTATION02)
- 4 ACL entries (WriteDACL, GenericAll, GenericWrite, WriteOwner)
- Intentional misconfigurations for demo purposes
You can also import BloodHound JSON exports via the /api/import/bloodhound endpoint.
| Endpoint | Method | Description |
|---|---|---|
/api/authenticate |
POST | Authenticate & enumerate AD |
/api/summary/{sid} |
GET | Domain overview summary |
/api/users/{sid} |
GET | All user objects |
/api/groups/{sid} |
GET | All group objects |
/api/computers/{sid} |
GET | All computer objects |
/api/acls/{sid} |
GET | All ACL relationships |
/api/attack-paths/{sid} |
GET | Attack paths with MITRE tags |
/api/findings/{sid} |
GET | Misconfigurations + remediation |
/api/graph/{sid} |
GET | Permission graph (nodes/edges) |
/api/data/{sid} |
GET | All session data in one response |
/api/path/{sid}?source=X&target=Y |
GET | Shortest path between objects |
/api/finding-status/{sid} |
GET/POST | Finding remediation status |
/api/object/{sid}/{name} |
GET | Single object detail |
/api/report/{sid}?format=html |
GET | Generate security report |
/api/scans |
GET | List all scan records |
/api/scans/{id} |
GET | Get specific scan |
/api/scans/diff/{id1}/{id2} |
GET | Compare two scans |
/api/export/bloodhound/{sid} |
GET | Export BloodHound JSON |
/api/import/bloodhound |
POST | Import BloodHound JSON |
/api/mitre-techniques |
GET | MITRE technique lookup |
/api/logout/{sid} |
POST | Clear session |
/ws/enumerate |
WebSocket | Real-time enumeration progress |
Note: Session IDs should be provided via the
Authorization: Bearer <session_id>header for security. URL path parameters are supported for backward compatibility.
┌──────────────────────────────────────────────────────────┐
│ Browser (Client) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Next.js 16 Frontend (TypeScript + Tailwind CSS) │ │
│ │ ── Landing Page ── Dashboard ── Graph Viewer ── │ │
│ └────────────────────────┬────────────────────────────┘ │
└───────────────────────────┼──────────────────────────────┘
│ REST API (JSON) + WebSocket
┌───────────────────────────┼──────────────────────────────┐
│ FastAPI Backend │
│ ┌────────────┐ ┌────────────────┐ ┌───────────────┐ │
│ │ auth.py │ │ ldap_enum.py │ │ normalizer.py │ │
│ └─────┬──────┘ └───────┬────────┘ └──────┬────────┘ │
│ │ │ │ │
│ ┌─────▼─────────────────▼───────────────────▼────────┐ │
│ │ graph_builder.py (NetworkX) │ │
│ └─────────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌─────────────────────▼──────────────────────────────┐ │
│ │ attack_paths.py │ misconfig_detector.py │ risk.py │ │
│ └─────────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌─────────────────────▼──────────────────────────────┐ │
│ │ remediation.py │ mitre_mapping.py │ report_gen.py │ │
│ └────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
│ LDAPS (636)
┌───────────▼───────────┐
│ Domain Controller │
│ Active Directory │
└───────────────────────┘
- Single-threaded pipeline: Enumeration runs synchronously. Only one enumeration can execute at a time per server instance. For large ADs (1,000+ users), enumeration may take 30–60 seconds.
- In-memory sessions: Each session stores complete enumeration results in memory. Large ADs with extensive ACLs may consume significant RAM.
- Lab-scale validation: Performance metrics are validated against the 7-user MARVEL.local environment. Enterprise-scale validation (10,000+ objects) has not been performed.
- No multi-domain/forest support: Currently supports single-domain enumeration.
- Platform dependencies: PDF export via weasyprint may have GTK dependency issues on Windows (xhtml2pdf fallback is available).
- This tool does NOT perform: LLMNR poisoning, SMB relay, NTLM relay, or hash cracking
- Starting assumption: Valid domain credentials are already available
- LDAPS certificate: The tool accepts self-signed certificates in lab environments (set
LDAP_TLS_VERIFY=truefor production) - Scope: Designed for small-to-medium AD environments (up to ~500 objects)
- Platform: Runs on Windows and Linux; tested with Python 3.11
| Layer | Technology |
|---|---|
| Backend | Python 3.11, FastAPI, Uvicorn |
| AD Communication | ldap3 (LDAPS / NTLM) |
| Graph Engine | NetworkX |
| Frontend | Next.js 16, TypeScript, Tailwind CSS |
| Visualization | Cytoscape.js |
| Data Models | Pydantic v2 |
| Database | SQLite (scan history only) |
| Testing | pytest |
| Containerization | Docker |
This project is licensed under the MIT License.
LURKHOUND — Sniff out every attack path in your Active Directory.