optional-skills/security/web-pentest/templates/pentest-report.md
Target: <name + URL> Engagement ID: <slug> Engagement window: <start> – <end> Operator: <name> Tester: Hermes Agent + operator Report generated: <ISO 8601 timestamp>
<2-4 paragraph plain-language summary. Focus on:
| Severity | Count |
|---|---|
| Critical | 0 |
| High | 0 |
| Medium | 0 |
| Low | 0 |
| Info | 0 |
In-scope targets (from engagement/scope.txt):
Out of scope: see engagement/authorization.md.
Authorization basis: see engagement/authorization.md.
Approach was based on the Hermes web-pentest skill (a Hermes Agent
adaptation of the OWASP Testing Guide with elements of Shannon's
proof-based methodology). Phases performed:
Tools used: <nmap, whatweb, curl, Hermes browser tool, ...>.
Every finding in this section has a reproducible proof-of-concept. L1/L2 candidates that were not promoted to confirmed exploitation are listed in the "Not Exploited" section.
CVSS:3.1/AV:N/AC:L/...GET https://target.example/api/...id<What is the bug, in plain language.>
Request:
GET /api/items?id=1%27%20OR%201=1-- HTTP/1.1
Host: target.example
Cookie: session=...
Response (excerpt):
HTTP/1.1 200 OK
Content-Type: application/json
[{"id":1,...}, {"id":2,...}, ... <full table dumped>]
curl -sS 'https://target.example/api/items?id=1%27%20OR%201=1--' \
-H 'Cookie: session=YOUR_TEST_SESSION'
<What an attacker gains. Be specific. "Could allow data extraction" is
worse than "Allowed extraction of all 4 columns from the users table
in our test (PoC redacted PII), and the same query shape applies to
any other parameter using the same code path.">
<Specific, actionable. "Use parameterized queries" is better than "sanitize inputs." Include code example if possible.>
To verify the fix, re-run the reproduction command. The response
should be HTTP 400, an empty result, or a result containing only the
record matching id=1 literally.
(repeat per finding)
Candidates that pattern-matched but were not promoted to L3 within the engagement window. Listed for completeness; do NOT report these as confirmed vulnerabilities.
| ID | Class | Endpoint | Status | Why not promoted |
|---|---|---|---|---|
| INJ-002 | SQLi | /api/search?q= | L2 partial | Bypass set exhausted; appears to use parameterized binding |
| XSS-003 | reflected | /error?msg= | L1 identified | Could not produce executable context — output is JSON-encoded |
(Findings or hints noticed but NOT tested because they were outside scope. These are documentation, not findings. The operator decides whether to extend scope and re-test.)
https://third-party.example/... — payload
could trigger third-party-side bugs but third party is out of scope.What was NOT tested, and why:
Examples:
engagement/authorization.md — authorization on fileengagement/scope.txt — machine-readable scopeengagement/request-log.jsonl — every active request issuedfindings/*-queue.json — per-class candidate queuesevidence/ — raw captures (request/response pairs)This report describes vulnerabilities discovered during a time-bounded penetration test against the listed targets within the listed scope. Absence of a finding in this report does not imply the target is secure; only that no exploitable issue was found in scope X within time T using methods Y.