Move all pages into template-able functions, add black/grey/white box explanation appendix

This commit is contained in:
2025-11-17 14:42:15 +01:00
parent 078f4486c6
commit 11fe5e95ef
3 changed files with 205 additions and 143 deletions
+65 -119
View File
@@ -1,13 +1,11 @@
#import "@preview/diagraph:0.3.6": render
#import "pages.typ"
#import "helper.typ"
// Project-specific values
// Project-specific variables
#helper.panicOnPlaceholder.update(false)
#let place = helper.placeholder("Düsseldorf")
#let author = helper.placeholder("Martin \"maride\" Dessauer")
#let targetFull = helper.placeholder("FooBar Dummy Lab")
#let targetHandy = helper.placeholder("Dummy Lab")
#let targetInSentence = helper.placeholder("the Dummy Lab")
// ---
@@ -16,8 +14,11 @@
v(1em)
par(text(it.body, fill: color.linear-rgb(4.5%, 14.5%, 14.5%, 255)))
}
#set heading(numbering: "1.1")
#set par(justify: true)
#pages.cover(targetFull, author)
// ----- Cover & Legal disclaimer(s) -----
#pages.cover(targetFull, place, author)
#pages.legal(author)
#set page(
@@ -29,137 +30,82 @@
#text(fill: silver, [Penetration Test Report #targetFull])
#h(1fr)
#context(
text(fill: silver,
counter(page).display("1 of 1", both: true)
)
text(fill: silver, counter(page).display("1 of 1", both: true))
)
]
)
// ----- Table of contents -----
#pages.toc()
#set heading(numbering: "1.1")
#set par(justify: true)
= Management Summary
== Motivation
This penetration test was conducted to proactively identify, assess, and validate the severity of security vulnerabilities within the defined scope of #targetInSentence, specifically those exploitable by #helper.placeholder("external attackers in real-world scenarios"). Adversarial techniques to bypass controls, gain unauthorized access, and compromise critical assets were performed for this test scenario to determine the actual impact on confidentiality, integrity, and availability.
== Test Object
#helper.placeholder(lorem(30))
== Test Methodology
The aim of the test was to uncover vulnerabilities and weaknesses of all kinds. These were carried out in accordance with the OWASP Web Security Testing Guide, version 4#footnote("https://owasp.org/www-project-web-security-testing-guide/stable/4-Web_Application_Security_Testing"), and, where applicable, the MITRE ATT&CK Framework#footnote("https://attack.mitre.org"). Recommendations for system hardening were made based on the current version of the CIS Benchmarks#footnote("https://www.cisecurity.org/") and the appropriate variant in each case.
The penetration test was performed as a #helper.placeholder("black box test, without any access to source code or other information other than the scope").
== Findings
The penetration test revealed #context(helper.riskCategoryStats.values().map(v => v.final()).sum()) findings, which can be divided into the following risk categories:
#table(
columns: (16.66%, 16.66%, 16.66%, 16.66%, 16.66%, 16.66%),
align: center,
[Critical], [High], [Medium], [Low], [None], [Other],
table.cell(context(helper.riskCategoryStats.Critical.final()), fill: red, align: center),
table.cell(context(helper.riskCategoryStats.High.final()), fill: orange, align: center),
table.cell(context(helper.riskCategoryStats.Medium.final()), fill: yellow, align: center),
table.cell(context(helper.riskCategoryStats.Low.final()), fill: lime, align: center),
table.cell(context(helper.riskCategoryStats.None.final()), fill: white, align: center),
table.cell(context(helper.riskCategoryStats.Other.final()), fill: gray, align: center),
)
== Recommendations & Next Steps
Based on the results of this penetration test, #targetInSentence may be exposed to a production environment.
#pagebreak()
== Test Scope and Setup
The test was conducted from #helper.placeholder("01.01.1970") to #helper.placeholder("01.01.1970").
#helper.placeholder([
Connection to #targetHandy was made through a dedicated VPN connection via vpnhost.maride.inv. The inner IP address of the test device was 10.0.0.42.
])
The following scope was set for the penetration test:
#let inscope = table.cell("In scope", fill: lime, align: center)
#let outscope = table.cell("Out of scope", fill: gray, align: center)
#table(
columns: (25%, 50%, 25%,),
align: center,
[*Type*], [*Value*], [*State*],
[Address], [#helper.placeholder("10.23.42.1")], inscope,
[Address], [#helper.placeholder("2001:db8::2342")], inscope,
[Domain], [#helper.placeholder("*.maride.inv")], inscope,
[URL], [#helper.placeholder("secret.maride.inv/flag.txt")], outscope,
[URL], [#helper.placeholder("important.maride.inv/rickroll")], outscope,
// ----- Management Summary -----
#pages.managementSummary(
target: targetFull,
targetInSentence: targetInSentence,
testFocus: helper.placeholder("external attackers in real-world scenarios"),
testObject: helper.placeholder(lorem(30)),
testScenario: helper.placeholder("black box test"),
recommendation: helper.placeholder([Based on the results of this penetration test, #targetInSentence may be exposed to a production environment.])
)
#pagebreak()
From the perspective of the machine used for the penetration test, the network layout was seen as shown in the graph below - simplified by leaving out hops that are not relevant for the penetration test, like third-party network operators and ISPs.
#figure(
render("
digraph G {
rankdir=LR;
node [shape=rectangle];
subgraph stage1 {
style=filled;
color=red;
label=\"Connection\";
User -> Firewall [label=\"OpenVPN\"];
}
subgraph targetnet1 {
style=filled;
color=red;
label=\"Target Network\";
Firewall -> Target1;
Firewall -> Target2;
Firewall -> Target3;
Firewall -> Target4;
}
subgraph targetnet2 {
style=filled;
color=red;
label=\"Target Network\";
Target2 -> Target5;
Target2 -> Target6;
Target2 -> Target7;
}
subgraph targetnet3 {
style=filled;
color=red;
label=\"Target Network\";
Target4 -> Target8;
}
// ----- Test Scope & Setup -----
#pages.scopeAndSetup(
target: targetFull,
start: helper.placeholder("01.01.1970"),
end: helper.placeholder("31.12.1970"),
setup: helper.placeholder([Connection to #targetFull was made through a dedicated VPN connection. The inner IP address of the test device was 10.0.0.42.]),
nodes: "
subgraph stage1 {
label=\"Connection\";
User -> Firewall [label=\"OpenVPN\"];
}
"),
caption: [
Schematic graph showing the test objective network
]
subgraph targetnet1 {
label=\"Target Network\";
Firewall -> Target1;
Firewall -> Target2;
Firewall -> Target3;
Firewall -> Target4;
}
subgraph targetnet2 {
label=\"Target Network\";
Target2 -> Target5;
Target2 -> Target6;
Target2 -> Target7;
}
subgraph targetnet3 {
label=\"Target Network\";
Target4 -> Target8;
}
",
scope: (
( type: "Address", content: helper.placeholder("10.23.42.1"), inScope: true ),
( type: "Address", content: helper.placeholder("10.23.42.1"), inScope: true ),
( type: "Address", content: helper.placeholder("2001:db8::2342"), inScope: true ),
( type: "Domain", content: helper.placeholder("*.maride.inv"), inScope: true ),
( type: "URL", content: helper.placeholder("secret.maride.inv/flag.txt"), inScope: false),
( type: "URL", content: helper.placeholder("important.maride.inv/rickroll"), inScope: false)
)
)
#pagebreak()
// ----- Findings -----
#include "findings.typ"
#pagebreak()
// ----- Appendix -----
= Appendix
#context(
[
#if helper.hasCVSSTable.get() {
pages.cvssAppendix()
pagebreak()
pages.ciaAppendix()
}
#((
pages.boxAppendix(),
pages.ciaAppendix(),
if helper.hasCVSSTable.get() { pages.cvssAppendix() }
).join(pagebreak()))
]
)