-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdoc.tex
207 lines (181 loc) · 7.66 KB
/
doc.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
%!TEX option = --shell-escape
\documentclass[parskip=half]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{microtype}
\usepackage[sfdefault,scale=0.85]{FiraSans}
\usepackage[scale=0.85]{FiraMono}
\usepackage[ngerman]{babel}
\usepackage[babel,german=quotes]{csquotes}
\usepackage{tabularx}
\usepackage{xltabular}
\usepackage[table,xcdraw]{xcolor}
\usepackage{graphicx}
\usepackage{svg}
\usepackage{datetime}
\usepackage{multirow}
\usepackage[hidelinks]{hyperref}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{wrapfig}
\usepackage{pgfplotstable}
\usetikzlibrary{positioning,matrix,calc,shapes.misc}
\usepackage{comment}
\usepackage[german]{varioref}
\usepackage[german]{cleveref}
\usepackage[shortlabels]{enumitem}
\usepackage{booktabs}
\usepackage{suffix}
\usepackage{multicol}
\usepackage{xparse}
\usepackage{pdflscape}
\usepackage[headsepline,footsepline]{scrlayer-scrpage}
\clearpairofpagestyles
\renewcommand\sectionlinesformat[4]{%
\makebox[0pt][r]{#3}#4%
}
\newcolumntype{Y}{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}X}
\definecolor{matrixgreen}{HTML}{008F11}
\let\originalhref\href
\renewcommand\href[2]{\originalhref{#1}{\color{matrixgreen}{#2}}}%
\usepackage{listings}
\lstset{
basicstyle=\scriptsize\ttfamily,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
commentstyle=\color{green!50!black},
keepspaces=true,
keywordstyle=\color{blue},
numbers=left,
numbersep=5pt,
numberstyle=\scriptsize\ttfamily,
showspaces=false,
showstringspaces=false,
showtabs=false,
stringstyle=\color{yellow!70!black},
frame=single,
}
\lstset{literate=%
{Ö}{{\"O}}1
{Ä}{{\"A}}1
{Ü}{{\"U}}1
{ß}{{\ss}}1
{ü}{{\"u}}1
{ä}{{\"a}}1
{ö}{{\"o}}1
}
\lstdefinelanguage{JavaScript}{
keywords={typeof, new, true, false, catch, function, return, null, catch, switch, var, if, in, while, do, else, case, break},
keywordstyle=\color{blue}\bfseries,
ndkeywords={class, export, boolean, throw, implements, import, this},
ndkeywordstyle=\color{darkgray}\bfseries,
identifierstyle=\color{black},
sensitive=false,
comment=[l]{//},
morecomment=[s]{/*}{*/},
commentstyle=\color{purple}\ttfamily,
stringstyle=\color{red}\ttfamily,
morestring=[b]',
morestring=[b]"
}
% Switch-case
\usepackage{xifthen}
\newcommand{\ifequals}[3]{\ifthenelse{\equal{#1}{#2}}{#3}{}}
\newcommand{\case}[2]{#1 #2}
\newenvironment{switch}[1]{\renewcommand{\case}{\ifequals{#1}}}{}
\definecolor{eclipseStrings}{RGB}{42,0.0,255}
\definecolor{eclipseKeywords}{RGB}{127,0,85}
\colorlet{numb}{magenta!60!black}
\lstdefinelanguage{json}{
basicstyle=\normalfont\ttfamily,
commentstyle=\color{eclipseStrings}, % style of comment
stringstyle=\color{eclipseKeywords}, % style of strings
numbers=left,
numberstyle=\scriptsize,
stepnumber=1,
numbersep=8pt,
showstringspaces=false,
breaklines=true,
%frame=lines,
%backgroundcolor=\color{gray}, %only if you like
string=[s]{"}{"},
comment=[l]{:\ "},
morecomment=[l]{:"},
literate=
*{0}{{{\color{numb}0}}}{1}
{1}{{{\color{numb}1}}}{1}
{2}{{{\color{numb}2}}}{1}
{3}{{{\color{numb}3}}}{1}
{4}{{{\color{numb}4}}}{1}
{5}{{{\color{numb}5}}}{1}
{6}{{{\color{numb}6}}}{1}
{7}{{{\color{numb}7}}}{1}
{8}{{{\color{numb}8}}}{1}
{9}{{{\color{numb}9}}}{1}
}
\ihead{HackerContest}
\ohead{CTF-Challenge \enquote{Trinity}}
\ofoot{\large Seite \thepage}
\begin{document}
\begin{titlepage}
\begin{tikzpicture}[overlay,remember picture,inner sep=0mm]
\draw[draw=gray,thick] (current page.west) to ++(50mm,0) to ++(0,-100mm) to ++(120mm,0) to ++(0,-50mm);
\draw[draw=matrixgreen,thick,dashed] ($(current page.west) - (0,5mm)$) to ++(55mm,0) to ++(0,-100mm) to ++(140mm,0);
\node[text width=0.5\textwidth,align=center] at ($(current page.north) - (0,40mm)$) {\includegraphics[height=45mm]{img/ninja.png}\\[5pt]\Large \textrm{P{\color{red!50!black}O}SIX}Ninjas};
\node[text width=155mm,align=left] at ($(current page.center) + (0,50mm)$) {
Konrad Langenberg, Jonas Franz und Simon Hilchenbach\\[6pt]
{\color{matrixgreen}\Huge Anfertigung einer eigenen CTF-Challenge
mit Schwerpunkt Privilege Escalation}\\[6pt]
\textbf{Dozenten}: Matthias Göhring und Markus Schader
};
\node (table) at ($(current page.center) + (20mm,-10mm)$) {\begin{tabular}{@{}llr@{}}
\textbf{Challengename}: & Trinity \\
\textbf{Basissystem}: & Alpine Linux\\
\textbf{Kategorie}: & Privilege Escalation \\
\end{tabular}};
\node[below=20mm of table] {
\includesvg[width=60mm]{img/hda_logo.svg}
};
\end{tikzpicture}
\end{titlepage}
\tableofcontents
\clearpage
\section{Einleitung}
\input{story.tex}
\section{Inbetriebnahme}
Die Challenge wird als Docker-Container deployed.
Es wird mindestens ein Linux-Kernel in Version 4.3 benötigt (der letzte Schritt benutzt im Code den Systemaufruf \texttt{prctl(2)} mit dem Flag \texttt{PR\_CAP\_AMBIENT}, welches ab dieser Version unterstützt wird).
Ein bereits kompiliertes Docker-Image steht mit \texttt{registry.code.fbi.h-da.de/hc/trinity} zur Verfügung.
Alternativ kann das Docker-Image auch selbst unter Eingabe von \texttt{make} im Wurzelverzeichnis des Projekts kompiliert werden.
Die Kompilierung findet vollständig isoliert in Docker statt.
Mit dem folgenden Befehl kann der Docker-Container erstellt und gestartet werden:
\begin{lstlisting}
docker run --rm --name trinity registry.code.fbi.h-da.de/hc/trinity
\end{lstlisting}
Anschließend kann über \texttt{docker inspect} die IP-Adresse des Containers ausgelesen werden:
\begin{lstlisting}
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' trinity
\end{lstlisting}
\textbf{Hinweis}: Unter \emph{Docker for macOS} ist es nicht möglich, die IP-Adresse des Containers direkt vom Host anzusprechen.
In diesem Fall müssen im \texttt{docker run} selbst noch die Parameter \texttt{-p 22:22} und \texttt{-p 80:80} angegeben werden, sodass diese beiden Ports über \texttt{localhost} erreichbar sind.
\section{Walkthrough}
\input{frontend/doc.tex}
\input{video/doc.tex}
\input{devlogin/doc.tex}
\input{dejavu/doc.tex}
\clearpage
\section{Bemerkungen}
\subsection{Schwierigkeitsgrad}
An einigen Stellen in der Challenge mussten wir abwägen, wie leicht oder schwierig wir einen Schritt gestalten, wie viele Hinweise wir geben und wie viel Zeit ein Schritt erfordert.
So wurden beispielsweise im ersten Schritt die Zugangsdaten direkt in die HTML-Datei geschrieben.
Ein Bruteforcing wäre zwar in relativ kurzer Zeit möglich gewesen, halten wir aber als ersten Schritt für demotivierend und einen geringen Lerneffekt.
Des Weiteren findet sich im Screenshot ein Hinweis auf die Linux~Capabilities.
Diesen haben wir eingebaut, da wir vermuten, dass die meisten Studenten (die ja in der Lage sein sollen, diese Challenge zu lösen) wenig vertraut mit diesem Linux-Feature sind bzw. möglicherweise dieses garnicht kennen.
Ein Privilege-Escalation-Skript wie \texttt{linpeas.sh} findet die gesetzte Capability jedoch.
Ferner wäre auch ein Weglassen des \texttt{dejavu}-Quellcodes möglich gewesen, mit entsprechend benötigtem Zeitaufwand für diesen Schritt.
\subsection{Limitierungen}
Im Framebuffer-Schritt wird kein echter Framebuffer (das wäre ein Character-Device) gedumpt, sondern nur eine readonly-Datei mit identischen Berechtigungen.
Das liegt daran, dass der Docker-Container nicht die nötigen Privilegien besitzt, um ein \texttt{devfs} mit einem eigenen Framebuffer-Device zu mounten.
Auch können wir dadurch leider nicht die Bildschirmauflösung in \texttt{sysfs} ausgeben; es bleibt ein überschriebenes \texttt{fbset}-Programm mit statischer Ausgabe.
\end{document}