Exegol for Offensive Security
Overview
Exegol is a Docker-based pentest environment with 100+ pre-installed offensive tools, managed via a Python CLI wrapper. It replaces traditional Kali VMs with fast, reproducible, disposable containers.
Core concept: exegol start <name> <image> creates a ready-to-hack container in seconds. All tools, resources, and configurations are pre-loaded.
For the complete CLI reference, images list, and resource catalog, see exegol-reference.md in this skill directory.
When to Use
- User needs to set up a pentest/red team environment
- User wants to launch tools available in Exegol (BloodHound, Burp, Responder, CrackMapExec, etc.)
- User is doing HTB, CTF, or lab work and needs a quick environment
- User asks about container-based offensive security setups
- User needs to manage multiple engagement environments simultaneously
When NOT to use: For defensive/blue team tooling, forensics-only workflows, or general Docker questions unrelated to security testing.
Quick Reference
| Task | Command |
|------|---------|
| Start interactive container | exegol start mypentest full |
| Start with workspace | exegol start client1 full -w ./engagement/ |
| Start with current dir | exegol start client1 full -cwd |
| Start with VPN | exegol start htb full --vpn ~/vpn/lab.ovpn |
| Start with logging | exegol start client1 full -l -w ./engagement/ |
| Run single command | exegol exec mypentest 'nmap -sV 10.10.10.1' |
| Run GUI tool in background | exegol exec -b mypentest burpsuite |
| Temp container for one-off | exegol exec --tmp full 'whatweb http://target' |
| List containers/images | exegol info |
| Stop container | exegol stop mypentest |
| Remove container | exegol remove mypentest |
| Install an image | exegol install full |
| Update everything | exegol update |
Engagement Setup Workflow
1. Choose the Right Image
| Image | Use Case |
|-------|----------|
| full | General pentest, full toolkit (50GB+) |
| ad | Active Directory / internal pentest |
| web | Web application testing |
| light | Quick recon, limited disk space |
| osint | OSINT / reconnaissance only |
| free | Same as full but community edition (delayed releases) |
2. Create the Engagement Container
# Standard engagement setup with workspace and logging
exegol start <engagement-name> <image> -w /path/to/engagement/ -l
# Example: Internal AD pentest
exegol start acme-internal ad -w ./acme-corp/ -l
# Example: Web app pentest
exegol start webapp-audit web -w ./webapp-audit/ -l
# Example: HTB lab with VPN
exegol start htb full --vpn ~/vpn/htb-lab.ovpn -w ./htb/
3. Network Configuration
| Scenario | Config |
|----------|--------|
| Host network (default) | No flag needed, shares host interfaces |
| VPN to target network | --vpn ~/path/to/config.ovpn |
| VPN with credentials | --vpn config.ovpn --vpn-auth creds.txt |
| Isolated container | --network disable |
| Container-to-container | --network docker |
| Port forwarding | -p 8080:8080 -p 4444:4444 |
4. Privilege Options for Specific Attacks
# WiFi / network sniffing (needs NET_ADMIN)
exegol start wifi full --cap NET_ADMIN -d /dev/bus/usb/
# USB device access (Proxmark, Rubber Ducky, etc.)
exegol start hw full -d /dev/ttyACM0
# Full privilege (use sparingly)
exegol start lab full --privileged
Pentest Workflow Patterns
AD / Internal Pentest
# Create container with AD image
exegol start internal ad -w ./client-engagement/ -l --vpn client-vpn.ovpn
# Inside container:
neo4j start # Start Neo4j for BloodHound
bloodhound-ce # Launch BloodHound CE (port 1030)
crackmapexec smb 10.0.0.0/24 # Network discovery
responder -I eth0 # LLMNR/NBT-NS poisoning
bloodhound-python -d domain.local -u user -p pass -c All # Collect AD data
Default credentials inside container:
| Service | User | Password |
|---------|------|----------|
| Neo4j | neo4j | exegol4thewin |
| BloodHound CE | via web UI | exegol4thewin |
| Empire | empireadmin | exegol4thewin |
Web Application Pentest
# Create container with web image
exegol start webapp web -w ./webapp-audit/ -l
# Inside container:
burpsuite # Launch Burp Suite (proxy on 8080)
nuclei -u https://target.com # Automated vuln scanning
sqlmap -u "http://target/page?id=1" # SQL injection testing
ffuf -u http://target/FUZZ -w /opt/resources/... # Directory fuzzing
Recon / OSINT
exegol start recon osint -w ./recon/
# Inside container:
subfinder -d target.com # Subdomain enumeration
httpx -l subdomains.txt # HTTP probing
theHarvester -d target.com -b all # Email/domain harvesting
Privilege Escalation (Using Built-in Resources)
Resources are available at /opt/resources inside every container:
| Resource | Path | Purpose |
|----------|------|---------|
| LinPEAS | /opt/resources/linux/linPEAS/ | Linux privesc enumeration |
| WinPEAS | /opt/resources/windows/winPEAS/ | Windows privesc enumeration |
| Mimikatz | /opt/resources/windows/mimikatz/ | Windows credential extraction |
| Chisel | /opt/resources/linux/chisel/ | TCP/UDP tunneling |
| ligolo-ng | /opt/resources/linux/ligolo-ng/ | Network pivoting |
| SharpHound | /opt/resources/windows/SharpHound/ | AD collection |
| PrintSpoofer | /opt/resources/windows/PrintSpoofer/ | Windows privesc |
| GodPotato | /opt/resources/windows/GodPotato/ | Windows privesc |
| netcat (static) | /opt/resources/linux/nc | Reverse shells |
# Serve resources to target via HTTP
cd /opt/resources && python3 -m http.server 8888
# Or transfer specific tool
python3 -m http.server -d /opt/resources/linux/linPEAS/ 8888
Multi-Container Engagements
Run parallel containers for different phases or targets:
# Recon container
exegol start recon-phase osint -w ./engagement/recon/
# Attack container with VPN
exegol start attack full --vpn client.ovpn -w ./engagement/attack/ -l
# C2 container
exegol start c2 full -p 443:443 -p 80:80 -w ./engagement/c2/ -l
Switch between containers by spawning new shells:
exegol start attack # Opens new shell in existing "attack" container
Credential Management (exegol-history)
# Add credentials found during engagement
exh add creds -u 'admin' -p 'P@ssw0rd!' -d 'ACME.LOCAL'
exh add creds -u 'svc_sql' -H 'aad3b435b51404eeaad3b435b51404ee:...' -d 'ACME.LOCAL'
# Set active credentials as environment variables
exh set creds
# Add discovered hosts
exh add hosts --ip 10.10.10.1 -n dc01 -r "Domain Controller"
exh add hosts --ip 10.10.10.5 -n web01 -r "IIS Web Server"
# View current context
exh show
# Bulk import
exh import creds --file found_creds.csv --format CSV
Logging & Evidence
# Enable logging at container creation
exegol start engagement full -l -w ./engagement/
# Logs are stored in /workspace/logs/ (asciinema format by default)
# Replay a session:
asciinema play /workspace/logs/session.cast
Logging methods:
asciinema(default) — records terminal sessions, replayablescript— raw terminal recording
Customization (my-resources)
Personal configs persist across all containers via ~/.exegol/my-resources/:
| Path | Purpose |
|------|---------|
| bin/ | Custom tools (auto-added to $PATH) |
| setup/zsh/aliases | Custom shell aliases |
| setup/zsh/history | Custom command history |
| setup/python3/requirements.txt | Python packages to auto-install |
| setup/apt/packages.list | APT packages to auto-install |
| setup/bloodhound/customqueries_merge/ | BloodHound custom queries |
| setup/firefox/policies.json | Firefox extensions, bookmarks |
| setup/load_user_setup.sh | Custom setup script (runs on first start) |
Common Mistakes
| Mistake | Fix |
|---------|-----|
| Trying to modify container config after creation | Container options are set at creation only. Remove and recreate. |
| Forgetting -l for logging | Always use -l on real engagements for evidence |
| Using --privileged everywhere | Use specific --cap flags instead (e.g., --cap NET_ADMIN) |
| Not setting workspace | Always use -w to persist data outside the container |
| Running out of disk space | full image is 50GB+. Use light or ad/web for focused work |
| VPN not working | VPN auto-switches to docker network mode. Check with exegol info <container> |
| GUI apps not displaying | Ensure X11 is not disabled. On macOS, install XQuartz. |
Scan to join WeChat group