by 0x45dd
Autonomous agentic network penetration-testing tool (authorized use only)
# Add to your Claude Code skills
git clone https://github.com/0x45dd/pwnerGuides for using ai agents skills like pwner.
See how pwner compares with popular alternatives.
pwner is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by 0x45dd. Autonomous agentic network penetration-testing tool (authorized use only). It has 50 GitHub stars.
pwner's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/0x45dd/pwner" and add it to your Claude Code skills directory (see the Installation section above).
pwner is primarily written in Python. It is open-source under 0x45dd on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh pwner against similar tools.
No comments yet. Be the first to share your thoughts!
Available after the catalog security scan passes.
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
pwner is an LLM-driven agent that plans and runs a network penetration test from your
terminal. It discovers hosts, fingerprints services, checks them against known issues, and —
when the target warrants it and you approve — exploits them to prove impact. It drives
real tools (nmap, nuclei, netexec, impacket, hydra and others) rather than simulating them,
and it reports confirmed findings with severity, evidence and a fix.
It runs on your own model, or on no model at all.
--no-ai runs the full discovery → fingerprint → detect pipeline
deterministically, with no API key and nothing leaving the machine.Two mechanisms, both in the tool layer, both outside the model's reach. The model can ask for anything; it cannot widen its own authorization.
flowchart LR
OP(["operator"]) -->|"plain language"| AG["agent loop"]
AG -->|"tool call"| SG{"scope guard"}
SG -->|"host outside<br>the target"| R1["refused"]
SG -->|"in scope"| CG{"consent gate"}
CG -->|"intrusive,<br>not approved"| R2["skipped"]
CG -->|"approved, or<br>not intrusive"| RUN["runs against<br>the target"]
classDef guard fill:#ffb000,stroke:#8a5f00,color:#140d00,stroke-width:2px
classDef stop fill:none,stroke:#8b949e,stroke-dasharray:4 4
class SG,CG guard
class R1,R2 stop
A refusal is not an error that stops the run: it goes back to the model as a tool result, so the agent learns it overstepped and carries on inside the boundary.
Scope lock. build_dispatch wraps every tool so each
host-carrying argument is checked against your target before the tool body runs. Tools are
in-scope-by-default: one that forgets its own check is still guarded, and an unregistered
tool name fails closed. A network argument has to sit entirely inside the authorization, so
a /24 scope cannot be widened to a /16 by a tool argument.
Changing the scope. The one thing the guard cannot check is set_target, because its
argument is the new scope, so there is nothing to check it against. It carries its own
gate instead: narrowing, or returning to something you already authorized, is free, and
moving anywhere else needs your answer every time. An earlier approval for some other
action does not buy it, --auto-consent does not cover it, and a non-interactive run
refuses it outright.
Consent gate. Anything active is denied unless you approve it in that session. The agent cannot self-approve — consent is resolved outside the model, and in a non-interactive run the answer is always no.
These two are the part of the codebase under the most test: 77 tests on the scope boundary
in tests/test_scope.py and 13 on the consent gate in
tests/test_consent.py, out of 725 overall. If you are going to
read one thing before pointing this at a network, read those.
Intended use:
Not this tool's purpose, and not defensible:
Python 3.10+. nmap is the only hard requirement — everything else enables more tools and is optional.
curl -fsSL https://raw.githubusercontent.com/0x45dd/pwner/main/install.sh | bash
That builds an isolated virtualenv under ~/.local/share/pwner, leaves your system
Python alone, and puts pwner on your PATH so it works from any directory. Add
--with-tools to install nmap and the optional scanners too, and --uninstall to take
it all back out. On macOS there is also a tap:
brew install 0x45dd/tap/pwner
That brings nmap with it. From source instead:
git clone https://github.com/0x45dd/pwner.git
cd pwner
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
Then the external tools, and a check:
./scripts/install-deps.sh # brew/apt/kali/pacman/dnf
pwner doctor # what's missing
install-deps.sh installs only what is missing and skips anything your distro does not
package instead of failing. pwner doctor reports every external tool, what each one
enables, and the install command for the system you are on; it exits non-zero only when
nmap is missing, so it works as a setup check in a script.
On Kali there is almost nothing to install. A default Kali image already ships 8 of the
11 external tools pwner drives — nmap, hydra, netexec, impacket, certipy, searchsploit,
hashcat and snmpwalk. sudo apt install nuclei bloodhound.py adds two more, and only
kerbrute is unpackaged. pwner detects Kali as its own ecosystem rather than as Debian, so
pwner doctor hands you apt commands instead of the source builds a plain Debian box needs.
If you are choosing where to run this, run it there.
uv venv && uv pip install -e .
pipx install -e .
The whole toolchain in one image, nothing installed on your host. The base is Kali, so every tool but kerbrute comes from apt:
docker build -t pwner .
docker run --rm -it --net=host \
--cap-add=NET_RAW --cap-add=NET_ADMIN \
-v pwner-config:/root/.config/pwner \
-v pwner-sessions:/root/.local/share/pwner \
pwner
--net=host and the two capabilities are what let nmap do SYN scans and ICMP/ARP discovery;
without them it quietly falls back to slower connect scans and finds fewer hosts. The
volumes persist your key and your saved transcripts.
The image is ~2.7 GB and carries 10 of the 11 external tools plus nuclei's 14k templates, baked in so the first scan does not stall on a download. kerbrute is the one omission: it has no Kali package and no arm64 release. Built and run on arm64; the package set resolves on amd64 too.
pwner
The first run asks for a provider and an API key once and saves them to
~/.config/pwner/config.json (owner-only). Every run after that drops you straight into a
session. Change it later with pwner --pick for a provider/model menu, pwner setup for the
full prompts, or /model and /provider from inside a running session.
pwner chat 10.0.0.5 # session, target set
pwner 10.0.0.0/24 --no-ai # sweep, no model
pwner doctor # tool status
pwner --pick # choose a provider/model, then open a session
In a session you talk to the agent and steer it while it works; /help lists the commands,
/findings and /topology show what it has built so far, and /dump writes the transcript
to ~/.local/share/pwner/sessions/ (owner-only — it contains every credential the
engagement turned up, in cleartext).
Point it at a provider and give it a key. Presets cover OpenAI, Anthropic, Google and
DeepSeek; anything else that speaks the OpenAI API works via --base-url.
export PWNER_A