Reporting & Professional Practice · beginner · ~11 min

The penetration test report: structure

By the end of this lesson you will be able to: - Lay out a professional penetration test report using the standard sections in the right order. - Write the same engagement for two audiences at once — an executive summary for leadership and a technical body for engineers. - Choose what belongs in the report versus the appendices, and what must never appear in it at all. - Apply the four guiding principles — impact-first, actionable, accurate, reproducible — to every section you write. - Handle report data safely: mark it confidential, redact secrets, and follow secure handling and retention.

Overview

Security objective: the asset you protect in this lesson is the report itself — a document that concentrates every weakness of the client's systems in one place. The report is the deliverable: it is the thing the client actually receives, pays for, and acts on. The test only creates knowledge; the report is how that knowledge becomes fixes. A brilliant test written up badly delivers almost nothing.

This builds directly on your prerequisite, The phases of an engagement (methodology-phases). There you learned that reporting is the final phase, after scoping, discovery, exploitation, and post-exploitation. This lesson zooms into that phase and asks: once the testing is done, how do you structure the write-up so it is credible, usable, and safe?

A good report serves two audiences at once:

  • A one-page executive summary that explains business risk in plain language — no jargon, no payloads.
  • A detailed technical body that lets an engineer reproduce and fix each finding on their own.

The standard sections, in order, are: executive summary, scope, methodology, findings (ordered by severity), remediation roadmap, and appendices. Throughout, you lead with impact, stay honest, keep every recommendation actionable, and make every finding reproducible.

One more thing this lesson protects: the confidentiality of the report as a data object. A pentest report is a roadmap to compromise. If it leaks, it hands an attacker a pre-written attack plan. So structure is not only about clarity — it is also about handling the document securely.

Why it matters

In authorized professional work, clients act on the report, not on the test. Whoever signed the contract rarely watched you work; the PDF you hand over is the entire visible product of weeks of effort.

A clear, well-structured report is what turns findings into fixes. If the executive summary is muddy, leadership will not fund remediation. If the technical body is not reproducible, the engineering team cannot confirm or close a finding, and it lingers unfixed. If severities are inflated or evidence is sloppy, you lose credibility and the client discounts everything else you wrote.

Writing for both executives and engineers — impact-first, accurate, reproducible, and actionable — is one of the most valued and most differentiating skills a penetration tester has. Two testers can find the exact same bug; the one who reports it clearly is the one who gets rehired. Report quality is also what auditors, insurers, and regulators inspect when they ask a company to prove it tested its systems.

Core concepts

1. The report is the product

Definition. The report is the formal written deliverable that documents scope, method, findings, and remediation for an engagement.

Plain explanation. The client is not paying for the excitement of the test. They are paying for a document they can act on, share with auditors, and use to drive fixes. The write-up — not the testing activity — is the thing that has value after you leave.

How it works. Everything you did during the engagement gets distilled into a structured document with a predictable shape, so any reader knows where to look.

When / when not. Always produce a report for a paid or formal engagement. For an informal internal check you may use a lightweight ticket instead — but the same discipline (impact, evidence, fix) still applies.

Pitfall. Treating the report as an afterthought written the night before delivery. Good testers take notes and screenshots as they go, so the report writes itself.

2. Two audiences, two registers

Definition. A single report deliberately written in two styles for two readers.

  • Executive summary — for leadership. Business risk in plain language, overall posture, the few issues that matter most, and whether the test objectives were met. No jargon, no payloads. Aim for one page.
  • Technical body — for engineers. Every finding with enough detail to understand, reproduce, and fix it.

Plain explanation. An executive wants to know "how bad is it and what will it cost me"; an engineer wants to know "exactly what is broken and how do I fix it." One document must answer both without making either reader wade through the other's section.

Pitfall. Writing the executive summary in engineer-speak ("unauthenticated IDOR on /api/v2/orders"). Executives stop reading. Translate to impact: "any logged-in user could view other customers' orders."

3. The standard sections

# Section Audience Purpose
1 Executive summary Leadership Business-level overview, top risks, posture
2 Scope Both Exactly what was tested (assets, dates) and what was not
3 Methodology Both How you tested; standards followed
4 Findings Engineers Detailed issues, ordered by severity
5 Remediation roadmap Both Prioritized, actionable fixes
6 Appendices Engineers Tooling, raw evidence, out-of-scope notes

Scope protects both sides legally and technically: it states the authorized targets and the test window so no one can claim you touched something you were not allowed to. Methodology cites recognized standards — the OWASP Web Security Testing Guide (WSTG) or the Penetration Testing Execution Standard (PTES) — which makes results credible and repeatable.

4. The four guiding principles

  • Lead with impact, not tools. "An attacker could read all customer records" beats "ran sqlmap" every time.
  • Be actionable. Every finding ends with a concrete fix an engineer can implement.
  • Be accurate and honest. Report what you found, what you could not test, and negative results. Never overstate. Passing an automated scan is not proof of security, and you must never claim a system is "completely secure."
  • Be reproducible. Someone else should confirm each finding from your write-up alone.

5. The report is sensitive data

A pentest report is a concentrated map of how to break in. Treat it as confidential: mark every page, redact live secrets, control who receives it, and agree retention up front. Structure and safety go together.

THREAT MODEL — the report as a protected asset

   ASSET: the penetration test report
   (contains: findings, reproduction steps, evidence,
    sometimes screenshots with tokens/PII)

   +-------------------- TRUST BOUNDARY --------------------+
   |  TESTER SIDE (authorized)                              |
   |                                                        |
   |   [Engagement notes] --> [Draft report] --> [Final]    |
   |         |                    |                |        |
   |   encrypted disk        encrypted disk    signed PDF   |
   +--------------------------|-----------------------------+
                              | secure delivery
                              v  (entry point: how it is shared)
   +-------------------- TRUST BOUNDARY --------------------+
   |  CLIENT SIDE (authorized recipients only)             |
   |    named stakeholders  ->  remediation teams          |
   +--------------------------------------------------------+

   ENTRY POINTS an attacker would target:
     - email attachment sent to the wrong address
     - unencrypted file share / public bucket
     - a laptop with the draft, lost or stolen
     - screenshots that still contain live tokens or PANs

Knowledge check.

  1. What asset is being protected in this lesson, and why is it unusually sensitive?
  2. Where is the trust boundary that a leaked report crosses, and what is the most common entry point at that boundary?
  3. What insecure assumption causes a tester to email a full report as an unencrypted attachment — and what would you do instead?

Syntax notes

There is no programming syntax here; the "syntax" of a report is its section skeleton and its per-finding template. Lock these in and every report you write becomes consistent and reviewable.

A lab-safe report skeleton in Markdown:

# Penetration Test Report — <Client> <Engagement>
> CONFIDENTIAL — authorized recipients only. Do not redistribute.

## 1. Executive Summary        <!-- 1 page, plain language, impact-first -->
## 2. Scope                     <!-- assets tested + explicitly NOT tested + dates -->
## 3. Methodology               <!-- approach + standards: OWASP WSTG / PTES -->
## 4. Findings                  <!-- ordered by severity, one block each -->
## 5. Remediation Roadmap       <!-- prioritized, actionable -->
## Appendix A. Tooling & Evidence

The per-finding block that lives under section 4 (you will go deep on severity in the next lesson):

### F-01  <Title>  — Severity: <Critical/High/Medium/Low/Info>
- Affected component: <asset / endpoint>
- Preconditions:     <access needed to reproduce>
- Reproduction:      <numbered, lab-safe steps>
- Evidence:          <redacted screenshot / log excerpt>
- Impact:            <business consequence>
- Likelihood:        <how easy to exploit>
- Remediation:       <concrete fix>
- Retest:            <how to verify the fix works>

Note the two guardrails baked into the syntax: a confidentiality banner on line 2, and a Retest line on every finding so remediation can be verified rather than assumed.

Lesson

The report is the product.

A brilliant test that is reported badly delivers little value. A clear report is what the client pays for and acts on.

Two audiences, two registers

  • Executive summary — written for leadership. Cover business risk in plain language, overall security posture, the few issues that matter most, and whether the test objectives were met. No jargon, no payloads. Keep it to one page.
  • Technical body — written for engineers. Include every finding with enough detail to understand, reproduce, and fix it.

Standard sections

  1. Executive summary — the business-level overview.
  2. Scope — exactly what was tested (assets and dates), and what was not.
  3. Methodology — how you tested. Note your approach and any standards followed, such as the OWASP Web Security Testing Guide (WSTG) or the Penetration Testing Execution Standard (PTES). This makes the results credible and repeatable.
  4. Findings — the detailed list, ordered by severity (covered in the next lessons).
  5. Remediation roadmap — prioritized fixes.
  6. Appendices — tooling, raw evidence, and out-of-scope notes.

Principles

  • Lead with impact, not tools. "An attacker could read all customer records" is far stronger than "ran sqlmap".
  • Be actionable. Every finding should end with a concrete fix.
  • Be accurate and honest. Report what you found, including what you could not test and any negative results. Do not overstate.
  • Be reproducible. Someone else should be able to confirm each finding from your write-up alone.

The platform's build-markdown-report exercises cover the C side of assembling a report programmatically. This track focuses on what goes inside it.

Code examples

Below is a complete, self-contained example: the same finding written badly, then rewritten to standard, then a verification checklist that proves the rewrite is adequate. This is documentation, not exploit code — every value is a placeholder for a local lab.

(1) WARNING: intentionally vulnerable — use only in a local, isolated, authorized lab. Do not deploy.

This is a bad report entry for a finding discovered on a deliberately vulnerable app running on localhost in a container. It is what NOT to write:

### Found SQL injection lol
Ran sqlmap against the login and it's totally hacked. Super critical.
Everything is vulnerable. Payload: ' OR '1'='1
Proof: see my screenshot (has the admin session cookie in it).

Why this is dangerous as a report: no scope reference, no reproduction steps an engineer can follow, an inflated blanket severity, no fix, no retest, and — worst — it pastes a live session cookie into the evidence, turning the report itself into a credential leak.

(2) SECURE — the same finding, written to standard

### F-01  Authentication bypass via SQL injection on login — Severity: High

- Affected component: `POST /login` on the lab app (localhost:8080, container `dvwa-lab`)
- Preconditions:      Network access to the login form. No valid account required.
- Reproduction (lab only):
  1. Send a login request with the email field set to a value that
     terminates the SQL string early (a single quote followed by an
     always-true clause). The exact payload is recorded in Appendix A.
  2. Observe that the application returns an authenticated session
     without valid credentials.
- Evidence:  Appendix A, redacted. Response body and headers included;
             the session token is masked as `Set-Cookie: session=<REDACTED>`.
- Impact:    An unauthenticated attacker can log in as an existing user
             and read that user's records. On this lab the affected table
             is `users` (test data only).
- Likelihood: High — reachable pre-auth, no special tooling required.
- Remediation: Use parameterized queries / prepared statements so input
               is never concatenated into SQL. Example (pseudo-SQL):
                 db.query("SELECT * FROM users WHERE email = ?", [email])
               Add server-side input validation and least-privilege DB
               credentials as defense in depth.
- Retest:    Re-send the same request after the fix; the app must reject
             the input and return an authentication failure, while a
             valid credential must still succeed.

(3) VERIFY — a reviewer checklist that proves the entry is adequate

Run this checklist over every finding before delivery. It rejects the bad entry and accepts the good one:

[ ] Has a stable ID and a plain-language title?           bad: FAIL  good: PASS
[ ] Severity justified by impact + likelihood (not blanket)? bad: FAIL good: PASS
[ ] Reproduction steps another tester could follow?        bad: FAIL  good: PASS
[ ] Evidence contains NO live secret/token/PAN/PII?        bad: FAIL  good: PASS
[ ] Concrete remediation an engineer can implement?        bad: FAIL  good: PASS
[ ] Retest step that ACCEPTS good input, REJECTS bad?      bad: FAIL  good: PASS
[ ] Ties back to a scoped, authorized asset?               bad: FAIL  good: PASS

Expected result: the bad entry fails on all seven lines; the standard entry passes all seven. That contrast is the whole lesson: same bug, wildly different value and safety depending on how it is written.

Line by line

Walking through the SECURE finding block, field by field, and why each earns its place:

Field What it does Why it matters
F-01 + title Gives the finding a stable handle and a one-line plain-language summary Lets the client track "is F-01 fixed?" across emails and retests; the title alone tells an executive what broke
Affected component Names the exact scoped asset (localhost:8080, container name) Proves the finding is inside authorized scope and points engineers at the right code
Preconditions States the access needed to reproduce ("no valid account") Directly feeds likelihood and severity — a pre-auth bug is worse than one needing admin
Reproduction Numbered steps; the raw payload is pushed to the appendix Reproducibility is the credibility test; keeping the payload in an appendix keeps the body readable and lets you redact centrally
Evidence Points to appendix, token shown as <REDACTED> Proof the issue is real, without turning the report into a live credential leak
Impact Translates the bug into a business consequence, naming the data at risk This is the sentence the executive summary is built from
Likelihood How easy the bug is to trigger Combined with impact, it justifies the severity rating (next lesson)
Remediation A concrete, implementable fix (parameterized queries) plus defense in depth Turns a finding into a work ticket; "be more secure" is not a fix
Retest Exactly how to confirm the fix — reject bad input, accept good input Closes the loop: without it, no one can prove the issue is actually resolved

How the value "flows" up the document: the Impact line of each finding is summarized (de-jargoned) into the Executive Summary; the Severity of each finding determines its order in section 4; the Remediation lines are collected and prioritized into section 5's roadmap. So a well-written finding block is the atom from which the whole report is assembled — write the blocks well and the summary and roadmap almost fall out for free.

Common mistakes

Real mistakes testers make when structuring reports:

1. Everything is Critical.

  • WRONG: Rating every finding Critical to look impressive.
  • WHY WRONG: Severity depends on exploitability, access required, and impact — not on drama. If everything is critical, nothing is, and the client cannot prioritize.
  • CORRECTED: Justify each severity from impact + likelihood; reserve Critical for issues that are both severe and readily exploitable.
  • RECOGNIZE / PREVENT: If your report has ten Criticals and no Lows, re-review. A realistic report has a spread.

2. Leading with tools instead of impact.

  • WRONG: "We ran Nmap, Nikto, and sqlmap."
  • WHY WRONG: The client cannot act on a tool list; they act on consequences.
  • CORRECTED: "An attacker on the guest network could reach the admin panel and read customer records."
  • RECOGNIZE / PREVENT: If a sentence names a tool but no business consequence, rewrite it.

3. Findings that cannot be reproduced.

  • WRONG: "The API is vulnerable to injection" with no request, endpoint, or steps.
  • WHY WRONG: Engineers cannot confirm or fix what they cannot reproduce; the finding stalls.
  • CORRECTED: Give the endpoint, preconditions, and numbered steps (payload in an appendix).
  • RECOGNIZE / PREVENT: Ask a colleague to reproduce a finding from your text alone before delivery.

4. Leaking secrets in evidence.

  • WRONG: Pasting screenshots that still show session tokens, API keys, or full card numbers.
  • WHY WRONG: The report itself becomes a breach if it leaks; you have created a new vulnerability.
  • CORRECTED: Redact tokens (<REDACTED>), mask PANs, crop PII, use development placeholders.
  • RECOGNIZE / PREVENT: A redaction pass is a mandatory delivery gate.

5. Confusing "scanner passed" with "secure."

  • WRONG: "Automated scan clean, so the app is secure."
  • WHY WRONG: A passing scanner only means those checks did not fire; it never proves security, and nothing is ever "completely secure."
  • CORRECTED: State what was tested, what was not, and the residual risk honestly.
  • RECOGNIZE / PREVENT: Ban the words "completely secure" from your reports.

6. No retest / verification path.

  • WRONG: A fix recommendation with no way to confirm it worked.
  • WHY WRONG: The client patches, but no one can prove the issue is gone; it may reopen.
  • CORRECTED: Every finding gets a Retest line that accepts good input and rejects bad.
  • RECOGNIZE / PREVENT: The reviewer checklist fails any finding missing a retest.

Debugging tips

"Debugging" a report means catching structural and safety defects before the client does.

Common problems and how to chase them down:

  • The client keeps asking "so what?" — Your findings lead with tools or mechanics. Fix: add an Impact line in business terms to every finding, then rewrite the executive summary from those lines.
  • Engineers reply "cannot reproduce." — Missing preconditions or steps. Fix: reproduce it yourself from only the written steps; whatever you had to remember from memory is what is missing from the text.
  • A reviewer flags a leaked token. — Redaction gap. Fix: grep your evidence and appendices for token/key/cookie/PAN patterns before export; redact all hits.
  • Two findings contradict on severity. — No consistent rating basis. Fix: rate every finding on the same impact + likelihood scale (next lesson covers CVSS).
  • The PDF is huge and unreadable. — Raw output dumped into the body. Fix: move raw tool output to appendices; keep the body to findings.

Questions to ask when a report "fails":

  1. Could a stranger reproduce this finding from the text alone?
  2. Does every finding name a business impact, not just a mechanism?
  3. Is any live secret, token, PAN, or real PII visible anywhere?
  4. Is each severity justified by impact and likelihood, consistently?
  5. Does every finding have a concrete fix and a retest?
  6. Is every asset in the findings inside the authorized scope?
  7. Is the confidentiality banner present and the delivery channel encrypted?

Memory safety

Security & safety — handling, detection, and logging for the report itself.

The report is a high-value document. Handle it like the sensitive asset it is, and keep an audit trail around it.

What to LOG around a report's lifecycle (so misuse is detectable):

  • Timestamp of each action (draft saved, exported, delivered, retested).
  • Source / actor: which tester or account performed it, from which host.
  • Resource: which report/version and which client engagement.
  • Result / security decision: delivered to whom, over which encrypted channel, access granted or denied.
  • Correlation id: an engagement ID tying notes, report versions, and retests together.

What to NEVER put in the report or its logs:

  • Passwords, session tokens, API keys, private keys.
  • Full payment card numbers (PANs) — mask all but the last four if needed at all.
  • Session cookies or bearer tokens in screenshots.
  • Unneeded PII — collect and show the minimum required to prove a finding.
  • Real production secrets — use placeholders such as API_KEY=<development-placeholder>.

Events that signal abuse / a problem:

  • A report accessed by an account outside the named recipient list.
  • Bulk download or forwarding of report files.
  • A draft opened from an unexpected host or geography.
  • Evidence files containing unredacted secret patterns at export time.

How false positives arise: a legitimate reviewer or the client's own remediation team accessing the report can look like unexpected access; a security tool scanning attachments can trip forwarding alerts. Confirm against the agreed recipient list before treating access as an incident, and record the resolution.

Handling checklist: store drafts on encrypted disk; mark every page CONFIDENTIAL; deliver over an encrypted channel to named recipients only; agree a retention/destruction date up front and follow it.

Real-world uses

Authorized real-world use case. A SaaS company hires a firm for an annual web application penetration test to satisfy a SOC 2 / customer security review. Everything happens under a signed statement of work against explicitly scoped, authorized systems. The deliverable is a report whose executive summary the CISO forwards to the board, whose findings the engineering team turns into Jira tickets, and whose remediation roadmap sets the fix priority for the next quarter. Months later the same report — and its retest section — is what an auditor inspects as evidence the company tests and fixes its systems.

Professional best-practice habits:

  • Validation: verify every finding is real and reproducible before it enters the report; drop unconfirmed hunches or mark them clearly as observations.
  • Least privilege: deliver only to named recipients; do not CC the whole company.
  • Secure defaults: confidentiality banner on by default, evidence redacted by default, encrypted delivery by default.
  • Logging: keep an audit trail of report versions and deliveries tied to an engagement ID.
  • Error handling / honesty: document what you could not test, negative results, and residual risk; never claim "completely secure."

Beginner vs advanced:

Beginner Advanced
Structure Follows the six-section template Tailors sections to the client's compliance context (PCI, SOC 2)
Findings One clear finding block each Chains related low findings into a higher-impact attack narrative
Severity Impact + likelihood, plain Full CVSS with environmental scoring, justified
Summary Plain-language paragraph Board-ready risk narrative tied to business objectives
Retest States how to verify Delivers a formal retest report closing each finding

Practice tasks

All tasks are documentation exercises. Any testing they reference is lab-only — localhost, containers, or intentionally vulnerable VMs you own or are explicitly authorized to test. Each security task ends defensively: remediate and verify.

Authorization checklist (before any lab work): (1) You own or have written authorization for the target. (2) It runs isolated on localhost/container/VM. (3) You have a rollback/reset plan. (4) No third-party or production system is involved.

Beginner 1 — Build the skeleton.

  • Objective: produce a Markdown report skeleton with all six standard sections in order plus a confidentiality banner.
  • Requirements: correct section order; one-sentence purpose note under each heading; banner on line 2.
  • Output: a .md file.
  • Constraints: no findings yet; structure only.
  • Hints: reuse the syntax_notes skeleton; do not reorder sections.
  • Concepts: standard sections, confidentiality.

Beginner 2 — Translate for executives.

  • Objective: rewrite three jargon-heavy finding titles into plain-language, impact-first sentences an executive would understand.
  • Input: e.g. "Unauthenticated IDOR on /api/v2/orders."
  • Output: three rewritten sentences.
  • Constraints: no tool names, no payloads; name a business consequence.
  • Hints: start each with "An attacker could…".
  • Concepts: two registers, lead with impact.

Intermediate 1 — Redaction pass.

  • Objective: given a sample evidence block containing a fake session token, API key, and full card number (all placeholders), produce a safely redacted version.
  • Requirements: mask/redact every secret; keep enough context to prove the finding.
  • Output: the redacted block plus a one-line note on what you removed and why.
  • Constraints: use placeholders like <REDACTED> and <development-placeholder>; invent no real secrets.
  • Hints: last-four only for the PAN, if kept at all.
  • Concepts: never-log list, evidence handling.

Intermediate 2 — Write one standard finding with a retest.

  • Objective: for a single vulnerability you reproduced in a local lab, write a complete finding block (all fields from the template) including a Retest line.
  • Requirements: reproduction steps, redacted evidence, impact, likelihood, concrete remediation, retest that accepts good input and rejects bad.
  • Output: one finding block.
  • Constraints: lab-only; payload in an appendix reference, not the body.
  • Defensive conclusion: state the fix and the exact retest that proves it.
  • Concepts: per-finding template, reproducibility, verification.

Challenge — Review-and-repair.

  • Objective: take a deliberately weak report entry (like the bad example in this lesson) and produce (a) a filled reviewer checklist showing every failure, and (b) a fully repaired standard entry that passes all seven checks.
  • Requirements: address severity justification, reproducibility, redaction, remediation, retest, and scope.
  • Output: the checklist table plus the repaired entry.
  • Constraints: keep it lab-scoped; no real targets or secrets.
  • Defensive conclusion: end with the retest step and confirm no live secret remains.
  • Concepts: all four principles, verification, secure handling.

Summary

  • The report is the product. The client acts on the write-up, not the test; a brilliant test reported badly delivers little value.
  • Two registers: a one-page plain-language executive summary for leadership, and a reproducible technical body for engineers — one document, two readers.
  • Standard sections in order: executive summary, scope, methodology, severity-ordered findings, remediation roadmap, appendices.
  • Per-finding template: ID + title, affected component, preconditions, reproduction, redacted evidence, impact, likelihood, remediation, and a retest that accepts good input and rejects bad.
  • Four principles: lead with impact not tools; be actionable; be accurate and honest (a passing scan is not proof of security, nothing is "completely secure"); be reproducible.
  • Common mistakes: everything-is-Critical, tool-first writing, unreproducible findings, leaking secrets in evidence, and no retest path.
  • The report is sensitive data: mark it confidential, redact all secrets/tokens/PANs/PII, deliver encrypted to named recipients, log its lifecycle with an engagement correlation id, and agree retention up front.
  • Remember: structure plus honesty plus safe handling is what turns findings into fixes — and keeps the roadmap-to-compromise from becoming a breach of its own.

Practice with these exercises