Move all pages into template-able functions, add black/grey/white box explanation appendix
This commit is contained in:
@@ -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()))
|
||||
]
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user