web-pentest skill
Authorized web pentest: recon, proof-based exploits, report.
Is the web-pentest skill safe?
Clean: nothing in its files matched our rules. We read 9 files in the folder on 2026-10-25.
No findings.
Install the web-pentest skill
A skill is a folder. Copy it into your agent's skills folder and the agent loads it when the task matches its description.
git clone --depth 1 https://github.com/NousResearch/hermes-agent.git /tmp/hermes-agent mkdir -p ~/.claude/skills cp -r /tmp/hermes-agent/optional-skills/security/web-pentest ~/.claude/skills/web-pentest
In the Claude apps, zip the folder and upload it from the Skills settings. The folder on GitHub
The instructions your agent would load
SKILL.md as published, without the frontmatter. Read it on GitHub
Web Application Penetration Testing
A phased pentesting workflow for running web applications. Adapted from Shannon's pipeline (Keygraph, AGPL — concepts only, no code borrowed). Built around three rules:
pre-declared. Off-scope hosts are refused.
- No exploit, no report — every finding requires reproducible evidence.
- Bounded scope — every active request goes against a target the operator
is not a clean bill of health until you've tried the bypass set.
- Bypass exhaustion before false-positive dismissal — a "blocked" payload
⚠️ Hard Guardrails — Read Before Every Engagement
Violating any of these invalidates the engagement and may be illegal.
MUST confirm with the user, in writing, that they own or have written authorization to test the target. Record the acknowledgement in engagement/authorization.md (see template). No acknowledgement → no active scanning. Reading public pages with curl is fine; sending payloads is not.
- Authorization gate. Before the first active scan in a session, you
CIDR per line. Every nmap, curl, whatweb, browser navigation, or payload-bearing request MUST be against an entry in scope. If a target redirects you off-scope (3xx to a different host, a link in HTML), STOP and confirm with the user before following.
- Scope allowlist. Maintain engagement/scope.txt — one hostname or
"yes, prod is in scope and I have written sign-off," assume not. Default targets are staging, local docker, dedicated test instances.
- No production systems without paper. If the user hasn't told you
metadata.google.internal, 100.100.100.200, [fd00:ec2::254], or equivalent unless the engagement explicitly includes SSRF-to-metadata as a goal AND the target is one you control. The agent's browser tool can reach these from inside your own infrastructure — don't.
- Cloud metadata is off by default. Do not probe 169.254.169.254,
filesystem-write SSTI, command injection with rm/shutdown/mkfs, anything that mutates beyond a single test row → ASK FIRST. The approval.py system catches some; don't rely on it alone.
- Destructive payloads need approval. SQLi payloads that DROP/DELETE,
sessions full of SQLi/XSS/RCE payloads, captured credentials, JWT tokens. Hermes' compression and title-generation paths replay history through the auxiliary client (often the main model). Anything sensitive you write to the conversation can leave the box on the next compress. Mitigation:
- Aux-client leakage risk (Hermes-specific). This skill produces
them in any message. Full values go to engagement/evidence/ files, never into chat history.
- Redact captured tokens/credentials to the LAST 6 CHARS before logging
in ~/.hermes/config.yaml for the session.
- If the engagement is sensitive, set auxiliary.title_generation.enabled: false
any single host. The recon-scan.sh script enforces this. Don't bypass it without operator approval.
- Rate limit yourself. Default 200ms between active requests against
assessment, not a "PASS." Even a clean run is "no exploitable issues FOUND in scope X within time T using methods Y" — not "the application is secure." Mirror that language in the report.
- Authority of the report. This skill produces a security
Phase 0: Engagement Setup
Before any scanning happens, create the engagement directory and authorization acknowledgement.
ENGAGEMENT=engagement-$(date +%Y%m%d-%H%M%S)
mkdir -p "$ENGAGEMENT"/{evidence,findings,reports}
cd "$ENGAGEMENT"- Ask the user (verbatim):
"Confirm: (a) the target URL is [X], (b) you own this application
or have written authorization to test it, and (c) the engagement
may run for up to [N] hours starting now. Reply 'authorized' to
proceed."
- Wait for explicit authorized response. Any other answer means STOP.
template in templates/authorization.md. Include:
- Record authorization to engagement/authorization.md using the
- Target URL(s) and IP(s)
- Authorization basis (ownership / written authz from $name)
- Engagement window
- Out-of-scope items (production, third-party services, etc.)
- Operator name (the user driving this session)
- Build scope.txt:
localhost
127.0.0.1
staging.example.com
192.168.1.0/24 # internal lab only, with operator OKactive request — that doc has the host-extraction rules you apply to every command/URL before it goes out.
- Read references/scope-enforcement.md before issuing the first
Phase 1: Pre-Recon (Code Analysis, optional)
Skip if no source access (black-box engagement).
If you have read access to the application source:
template render, file read/write, redirect target
- Map the architecture — framework, routing, middleware stack
- Inventory sinks — every execute(, os.system(, eval(,
privileged endpoints
- Map auth — session cookie vs JWT, OAuth flows, password reset,
what comes from request.*
- Identify trust boundaries — what's authenticated, what's not,
when proper sanitization is found (parameterized queries, allowlists, shlex.quote, well-known escapers).
- Backward taint from each sink to a request source. Early-terminate
Output: evidence/pre-recon.md — architecture map, sink inventory, suspected vulnerable code paths.
This is OFFLINE work. No traffic to the target.
Phase 2: Recon (Live, Read-Only)
Maps the attack surface. All requests are GETs of public pages, no payloads yet. Still scope-bounded.
in scope (avoids the "DNS points somewhere unexpected" trap).
More skills from NousResearch/hermes-agent
- A1passwordSet up op CLI, sign in, and read or inject secrets.
- A3-statement-modelBuild integrated IS/BS/CF financial workbooks in Excel.
- AaccelerateRun PyTorch training across GPUs with minimal changes.
- Cactual-setupSet up Actual Computer (actual.inc) inference in Hermes.
- Aadversarial-ux-testRoleplay a hostile user to find and triage UX pain points.
- Aagent-merge-conflict-arbiterNeutral arbiter for merge conflicts between two agents.
- AagentmailUse when an agent needs AgentMail CLI email inboxes.
- Aai-presenter-videoMake a verified AI presenter video from script + image.
- AairtableAirtable REST API via curl. Records CRUD, filters, upserts.
- AanatomyExplain an idea as an interactive isometric machine figure.
- Cantigravity-cliOperate the Antigravity CLI (agy): plugins, auth, sandbox.
- Aapple-notesManage Apple Notes via memo CLI: create, search, edit.