- A pentest report is the only deliverable your client will keep — it's more important than the testing itself
- Two audiences: executives (business risk, big picture) and technical teams (reproduce and fix the finding)
- Every finding needs five things: description, impact, evidence, CVSS score, and remediation steps
- Write in plain English — avoid jargon in executive sections; use precise technical language in findings
- Proof of exploitation is what separates a finding from an allegation — screenshots, logs, and command output are mandatory
Prerequisites
- Understanding of the vulnerability classes you'll document
- Note-taking throughout the engagement — you cannot reconstruct quality evidence after the fact
- Completed engagement — report writing starts during testing, not after
Report Structure Overview
A professional penetration test report has two distinct audiences within the same document.
Standard Pentest Report Sections
- 1Cover Page
Client name, engagement dates, report date, classification (CONFIDENTIAL), version
- 2Table of Contents
With page numbers. Long reports need quick navigation
- 3Executive Summary
1-2 pages. Business risk language. No technical jargon. Senior leadership audience
- 4Scope and Methodology
What was tested, what wasn't, testing approach, tools used
- 5Findings Summary
Table with finding name, severity, CVSS score, status. Gives both audiences a quick overview
- 6Technical Findings
One section per finding. Detailed, reproducible, with evidence
- 7Appendices
Raw tool output, full scope lists, methodology references
The Executive Summary
The executive summary is the most-read section. Most executives will read only this.
Write for a non-technical audience. Assume they understand business risk, not SQL injection.
What to Include
| Element | Example |
|---|---|
| Engagement purpose | "To assess the security posture of the external perimeter and internal network" |
| Testing window | "Testing was conducted from 14–21 April 2026" |
| Overall risk posture | "The external perimeter contains critical vulnerabilities that could allow an unauthenticated attacker to gain full access to internal systems" |
| Top findings in plain English | "An attacker could steal all customer data without needing to log in" |
| Positive findings | "Internal network segmentation was well-implemented and limited lateral movement" |
| Recommended priority actions | Top 3 things to fix first |
What NOT to Include
- CVE numbers or CVSS scores
- Tool names or technical exploit details
- Raw command output
- Jargon ("SQL injection", "Remote Code Execution") — translate to business impact instead
Instead of "The login form is vulnerable to SQL injection with stacked queries, allowing direct OS command execution," write: "An external attacker with no credentials can gain full control of the web server and access all customer data stored in the database."
CVSS Scoring
CVSS (Common Vulnerability Scoring System) v3.1 is the standard for vulnerability severity. Use it consistently.
Base Score Metrics
| Metric | Options |
|---|---|
| Attack Vector | Network / Adjacent / Local / Physical |
| Attack Complexity | Low / High |
| Privileges Required | None / Low / High |
| User Interaction | None / Required |
| Scope | Unchanged / Changed |
| Confidentiality Impact | None / Low / High |
| Integrity Impact | None / Low / High |
| Availability Impact | None / Low / High |
Severity Ranges
| Score | Severity | Colour |
|---|---|---|
| 9.0–10.0 | Critical | Red |
| 7.0–8.9 | High | Orange |
| 4.0–6.9 | Medium | Yellow |
| 0.1–3.9 | Low | Blue |
| 0.0 | Informational | Grey |
Example: Unauthenticated RCE via public API
AV:N / AC:L / PR:N / UI:N / S:C / C:H / I:H / A:H
Score: 10.0 (Critical)CVSS measures technical severity, not business risk. An internal-only SQL injection that reaches only public data might score High technically but be Low business risk. Note the distinction between CVSS score and actual risk in your report.
Writing a Technical Finding
Each finding should follow a consistent structure. Inconsistency between findings looks unprofessional.
Finding Template
## [Finding Title]
**Severity**: Critical / High / Medium / Low / Informational
**CVSS Score**: 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
**CWE**: CWE-89 (SQL Injection)
**Affected Asset(s)**: https://api.target.com/users/search
---
### Description
What the vulnerability is. 2-3 sentences, technically accurate.
Explain the root cause.
### Impact
What an attacker can do if they exploit this. Be concrete.
Quantify where possible: "access to 50,000 user records".
### Evidence
[Screenshot of the exploit working]
[Command used and output]
Request:
GET /api/search?q=' OR 1=1--
Response:
HTTP/1.1 200 OK
{"users": [{"id":1,"email":"admin@target.com"...}]}
### Remediation
Specific, actionable fix steps.
1. Use parameterised queries / prepared statements
2. Validate and sanitise all user input
3. Apply principle of least privilege to database account
### References
- https://owasp.org/www-community/attacks/SQL_Injection
- CWE-89: https://cwe.mitre.org/data/definitions/89.htmlTaking Notes During Testing
Quality evidence requires systematic note-taking during the engagement — not after.
Evidence Collection Protocol
- 1Screenshot everything exploitable
Including the URL/command used in the screenshot — don't crop it out
- 2Copy full request/response pairs
Burp Suite > Right-click > Copy to file. Include all headers
- 3Log all commands
Use script command: `script -a pentest.log`. Every command is timestamped
- 4Note timestamps
When each finding was discovered — for the scope/methodology section
- 5Record tooling versions
nmap 7.94, Burp Suite Pro 2024.1.1 — for methodology section
- 6Note failed attempts too
Documents due diligence and scope of testing
Finding Severity: Common Mistakes
Every finding being Critical or High makes the report noise. Clients lose trust when a "Critical" finding turns out to be a missing security header. Reserve Critical for: unauthenticated RCE, credential exposure, full database access, domain compromise.
| Finding | Correct severity |
|---|---|
| Missing HSTS header | Informational |
| Clickjacking (no sensitive actions) | Low |
| SSL/TLS using TLS 1.1 | Low |
| Reflected XSS with limited impact | Medium |
| Stored XSS on high-traffic page | High |
| SQL injection (data exposure) | High–Critical |
| Unauthenticated RCE | Critical |
| Domain Admin compromise | Critical |
| Missing rate limiting (low-value endpoint) | Informational–Low |
| Missing rate limiting (login endpoint) | Medium |
Remediation Writing
Bad remediation advice destroys a finding's value. Your client needs to know exactly what to do.
Bad: "Fix the SQL injection vulnerability."
Good:
1. Replace string concatenation in the login function (auth.php, line 47) with
PDO prepared statements.
2. Apply input validation: reject non-alphanumeric characters in the username field.
3. Configure the database user (app_user) to have SELECT/INSERT only on the
users table — revoke EXECUTE and admin privileges.
4. Review all other database queries in the codebase for the same pattern using:
grep -n "SELECT.*\$" *.phpReport Quality Checklist
Before Sending the Report
- 1Spell-check and grammar-check the entire document
Errors undermine credibility
- 2Verify all screenshots are legible
Text in screenshots must be readable at normal zoom
- 3Confirm all CVSS scores are calculated correctly
Use the official calculator at first.org/cvss
- 4Check scope consistency
Every finding must be within agreed scope
- 5Verify remediation steps are actionable
Have a developer review your recommendations
- 6Remove internal notes and draft comments
Search for TODO, FIXME, TBD, Draft
- 7Check page numbers and TOC match
If TOC says Finding A is on page 12, it must be
- 8Mark document classification on every page
CONFIDENTIAL or RESTRICTED in header/footer
- 9Confirm client name and dates are correct
Wrong client name is an embarrassing error
- 10Deliver as PDF — not Word/DOCX
PDF preserves formatting and can be signed
Operational Notes
- Take notes live — the quality of your evidence correlates directly with how consistently you capture it during testing. There's no recovering a fuzzy screenshot or half-remembered command after the engagement.
- One finding per issue — don't bundle five SQL injection instances into one finding to save time. List them separately or clearly note all affected endpoints. Clients need to track remediation per item.
- Retest and update — if the client fixes findings and you retest, mark each finding Resolved / Partially Resolved / Open with a comment. Retested reports have a higher perceived value.
- Sensitivity — your report contains instructions to compromise the client's systems. Handle delivery securely: encrypt the PDF (password-protected + key delivered separately), use a secure file transfer, confirm the recipient.
- Client calls — always offer a debrief call to walk through findings. Many clients won't fully understand written findings until explained verbally.
What to Read Next
- Reconnaissance — the engagement methodology section should document your recon approach
- Exploitation — the evidence you document in findings comes directly from your exploitation steps
- OWASP Testing Guide — the standard reference for web application findings and remediation