{"id":515,"date":"2026-10-03T18:24:40","date_gmt":"2026-10-03T16:24:40","guid":{"rendered":"https:\/\/ttz-wue.fiw.thws.de\/blog\/?p=515"},"modified":"2026-10-03T18:27:49","modified_gmt":"2026-10-03T16:27:49","slug":"acht-stunden-attack-defense-unser-erstes-faust-ctf","status":"publish","type":"post","link":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/2026\/10\/03\/acht-stunden-attack-defense-unser-erstes-faust-ctf\/","title":{"rendered":"Acht Stunden Attack\/Defense: Unser erstes FAUST CTF"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><strong>Was passiert, wenn das Netzwerk aufgeht?<\/strong><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Eine PDF, die pl\u00f6tzlich als Crontab dient. Eine Webanwendung in XeLaTeX. Und ein Exploit, der zwar Flags findet, aber zun\u00e4chst vor allem abgelaufene. Unser erstes FAUST CTF hatte einiges zu bieten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Am 26. September 2026 trat unser Team am Technologietransferzentrum W\u00fcrzburg (TTZ-WUE) erstmals in diesem Format an. Nach acht Stunden erreichten wir Platz 107 in der Gesamtwertung und Platz 47 in der Low-LLM-Wertung. Dazwischen lagen viel Analyse, einige Umwege und die Erkenntnis, dass eine gefundene Schwachstelle noch lange keine sicheren Punkte bedeutet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei einem Attack\/Defense-CTF betreiben alle Teams dieselben absichtlich verwundbaren Services auf ihrer eigenen sogenannten Vulnbox. Der Gameserver hinterlegt dort regelm\u00e4\u00dfig Flags, also Zeichenfolgen, die als Nachweis eines erfolgreichen Angriffs eingereicht werden. Gleichzeitig m\u00fcssen die Teams fremde Flags erbeuten, ihre eigenen sch\u00fctzen und ihre Services funktionsf\u00e4hig halten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bei FAUST dauert ein Tick drei Minuten; Flags k\u00f6nnen innerhalb von f\u00fcnf Ticks nach ihrer Erzeugung eingereicht werden. Nach einer Stunde zur Analyse der Services wird das Netzwerk zwischen den Teams ge\u00f6ffnet. Dann beginnen acht Stunden Wettbewerb. Die Details erkl\u00e4ren die <a href=\"https:\/\/2026.faustctf.net\/information\/rules\/\">FAUST-Regeln<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Die erste Stunde: Wo sind eigentlich unsere Services?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Einige Tage vorher hatten wir bereits <strong>MOTH<\/strong> entwickelt, unser eigenes System zur zentralen Verarbeitung und \u00dcbermittlung erbeuteter Flags. Technisch waren wir also vorbereitet. Zumindest auf einen Teil dessen, was uns erwartete.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die erste Stunde sollte der Reconnaissance geh\u00f6ren: Services verstehen, Angriffsfl\u00e4chen finden und erste Patches vorbereiten. Stattdessen besch\u00e4ftigten uns zun\u00e4chst IPv6, VPN, DNS und die Frage, wo einzelne Services \u00fcberhaupt erreichbar waren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auch die Aufgabenverteilung lief noch nicht rund. Teilweise untersuchten mehrere Personen dieselbe Schwachstelle, w\u00e4hrend andere Bereiche liegen blieben. Uns fehlten au\u00dferdem feste Blue-Team-Rollen und eine zentrale \u00dcbersicht \u00fcber die Aktivit\u00e4ten auf unserer Vulnbox. Wenn ein Service Probleme machte, war deshalb nicht immer klar, ob ein eigener Patch, ein fremder Angriff oder die Verbindung daf\u00fcr verantwortlich war.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W\u00e4hrend wir uns noch sortierten, wurde das Netzwerk ge\u00f6ffnet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ALF: Die PDF war pl\u00f6tzlich ein Crontab<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Einer der ersten Services, mit denen wir uns intensiver besch\u00e4ftigten, war <strong>ALF<\/strong>. Er kombinierte Flask und PostgreSQL mit einer Dokumentkonvertierung durch Typst und einer nativen Bibliothek zur Verarbeitung von \u00dcbersetzungen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im Upload von Typst-Projekten fanden wir einen unsicheren Umgang mit symbolischen Links. Dadurch lie\u00dfen sich Dateien au\u00dferhalb des vorgesehenen Projektverzeichnisses lesen. Auch das Ziel der PDF-Ausgabe konnte beeinflusst werden. Unter bestimmten Bedingungen lie\u00df sich das erzeugte Dokument dadurch als Datei f\u00fcr einen Cron-Dienst missbrauchen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die PDF war pl\u00f6tzlich ein Crontab.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00dcber die Dateilesem\u00f6glichkeit sahen wir au\u00dferdem, wie andere Teams ihre ALF-Instanzen ver\u00e4nderten. Dabei stie\u00dfen wir auf eine ausgefeilte Persistenzstrategie mit PostgreSQL-Triggern, durch die neue Flags automatisch in einen eigenen Benutzerkontext kopiert wurden. Weitere \u00c4nderungen sollten diesen Zugriff erhalten und konkurrierende Persistenz entfernen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Damit untersuchten wir l\u00e4ngst nicht mehr nur den urspr\u00fcnglichen Service. Wir mussten auch verstehen, welche \u00c4nderungen andere Teams eingebaut hatten und wie diese miteinander interagierten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sp\u00e4ter f\u00fchrte die Analyse zu einer weiteren Schwachstelle in der nativen Bibliothek <code>libparser.so<\/code>: Bestimmte Eingaben konnten \u00e4ltere Heap-Inhalte in die Antwort \u00fcbernehmen. Diese Speicherpreisgabe konnten wir lokal reproduzieren und \u00fcber HTTP beobachten. Einen zuverl\u00e4ssigen Exploit, der daraus g\u00fcltige FAUST-Flags extrahierte, entwickelten wir w\u00e4hrend des Wettbewerbs allerdings nicht mehr.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach ungef\u00e4hr vier Stunden steckten wir tief in fremden Patches, Persistenzmechanismen und Reverse Engineering. Nach einer kurzen Zusammenfassung im Team entschieden wir uns, zun\u00e4chst einen anderen Service anzusehen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">LAMP: LaTeX, Apache, MariaDB, Pain<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der n\u00e4chste Service hie\u00df <strong>LAMP<\/strong>. F\u00fcr uns stand das ziemlich schnell f\u00fcr <strong>LaTeX, Apache, MariaDB, Pain<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Teile der Webanwendung waren tats\u00e4chlich in XeLaTeX implementiert. HTTP-Informationen wurden in TeX-Makros \u00fcberf\u00fchrt, Daten aus MariaDB sp\u00e4ter erneut als TeX verarbeitet. An diesen \u00dcberg\u00e4ngen fanden wir mehrere Fehler, die sich zu einer Angriffskette verbinden lie\u00dfen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine manipulierte HTTP-Eingabe erm\u00f6glichte zun\u00e4chst das Lesen von Dateien im Container. Ein unzureichend validiertes Datenbankfeld f\u00fchrte au\u00dferdem zu einer persistenten TeX-Injection. Weil XeLaTeX mit aktivierter Shell-Ausf\u00fchrung lief, konnten dar\u00fcber Betriebssystembefehle ausgef\u00fchrt werden, mit <strong>Root-Rechten innerhalb des LAMP-Containers<\/strong>. Die darunterliegende Vulnbox war damit noch nicht \u00fcbernommen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine besondere Einschr\u00e4nkung blieb: F\u00fcr den entscheidenden Payload standen ungef\u00e4hr <strong>32 Bytes<\/strong> zur Verf\u00fcgung. F\u00fcr einen Testbefehl gen\u00fcgte das, f\u00fcr einen vollst\u00e4ndigen Flag-Harvester nicht. Wir mussten deshalb einen l\u00e4ngeren Befehl getrennt hinterlegen und ihn \u00fcber den kurzen Payload aufrufen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Damit hatten wir eine funktionierende Angriffskette. Die vollst\u00e4ndige technische Analyse und die Proof of Concepts haben wir nach dem Wettbewerb in unserem <a href=\"https:\/\/github.com\/Denis-Krueger-labs\/faustctf-2026-lamp\">LAMP-Repository auf GitHub<\/a> dokumentiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im laufenden Wettbewerb wartete aber schon das n\u00e4chste Problem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Flags finden ist nicht gleich Punkte bekommen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die erste Version unseres Harvesters suchte gro\u00dfz\u00fcgig nach FAUST-Flags. Sie lieferte eine beeindruckende Sammlung, allerdings waren viele davon bereits abgelaufen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir schr\u00e4nkten die Suche deshalb auf aktuelle Checker-Dateien ein, also Dateien, die bei den Pr\u00fcfungen des Gameservers entstanden. Zus\u00e4tzlich entwickelten wir Werkzeuge, um erreichbare und noch verwundbare Targets zu erkennen, sie regelm\u00e4\u00dfig erneut zu pr\u00fcfen und bereits bekannte Flags auszusortieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier zahlte sich MOTH aus. Unsere Skripte konnten gefundene Flags direkt an die vorbereitete Infrastruktur \u00fcbergeben. Deduplizierung und Kommunikation mit dem Gameserver mussten wir dadurch nicht f\u00fcr jeden Exploit neu implementieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W\u00e4hrenddessen patchten andere Teams ihre Services. Manche Targets verschwanden, kamen zur\u00fcck oder verhielten sich pl\u00f6tzlich anders. Unsere Werkzeuge mussten mit diesen Ver\u00e4nderungen umgehen k\u00f6nnen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ein Proof of Concept muss nur einmal funktionieren. Ein Attack\/Defense-Exploit muss immer wieder funktionieren, w\u00e4hrend sich seine Umgebung ver\u00e4ndert.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit der vollst\u00e4ndigen LAMP-Kette gelang uns schlie\u00dflich genau das: Wir extrahierten g\u00fcltige Flags und \u00fcbermittelten sie erfolgreich an den Gameserver.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">KI und das Tempo des Wettbewerbs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">FAUST 2026 erlaubte KI-gest\u00fctzte Werkzeuge und bot zugleich eine freiwillige Low-LLM-Kategorie mit Einschr\u00e4nkungen bei deren Einsatz an. Die Bedingungen sind in der <a href=\"https:\/\/2026.faustctf.net\/information\/rules\/#llm-policy\">LLM Policy<\/a> beschrieben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr uns wirft diese Entwicklung vor allem eine Frage auf: Was wird wichtiger, wenn Analyse und Code-Erzeugung immer schneller werden? Unsere Erfahrung spricht f\u00fcr Systemverst\u00e4ndnis und gute Entscheidungen unter Zeitdruck. Ein Exploit muss verstanden, ein Fehler richtig eingeordnet und ein Patch \u00fcberpr\u00fcft werden. Vor allem muss das Team entscheiden, welches Problem gerade seine Aufmerksamkeit verdient.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was wir beim n\u00e4chsten Mal anders machen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Am Ende standen <strong>Platz 107 von 223 Teams in der Gesamtwertung<\/strong> und <strong>Platz 47 in der Low-LLM-Wertung<\/strong>. Die Gesamtwertung ist auf <a href=\"https:\/\/ctftime.org\/event\/3312\">CTFtime<\/a> dokumentiert. F\u00fcr unseren ersten Attack\/Defense-CTF sind wir darauf stolz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr den n\u00e4chsten Wettbewerb haben wir drei konkrete Verbesserungen mitgenommen: die Erreichbarkeit der Infrastruktur vorher durchtesten, feste Verantwortlichkeiten pro Service vereinbaren und Monitoring sowie defensive Aufgaben von Anfang an besetzen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auch den Wechsel zwischen Services w\u00fcrden wir bewusster entscheiden. ALF war technisch spannend, band aber viel Zeit. LAMP zeigte uns anschlie\u00dfend, wie viel Arbeit zwischen einer gefundenen Schwachstelle und einem Werkzeug liegt, das tats\u00e4chlich Punkte bringt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">FAUST hat uns acht Stunden lang gleichzeitig als Angreifer, Verteidiger, Entwickler und Team gefordert. Wir haben uns festgebissen, umgedacht und am Ende gemeinsam funktionierende Angriffe auf die Beine gestellt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir w\u00fcrden definitiv wieder antreten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was passiert, wenn das Netzwerk aufgeht? Eine PDF, die pl\u00f6tzlich als Crontab dient. Eine Webanwendung&#8230;<\/p>\n","protected":false},"author":13,"featured_media":517,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,72,123,74],"tags":[149,148,150,147],"class_list":["post-515","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","category-bedrohungen-angriffe","category-menschzentrierte-informationssicherheit","category-tools-techniken","tag-attack-defense","tag-capture-the-flag","tag-exploit-entwicklung","tag-faust-ctf"],"_links":{"self":[{"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/posts\/515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=515"}],"version-history":[{"count":2,"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/posts\/515\/revisions"}],"predecessor-version":[{"id":519,"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/posts\/515\/revisions\/519"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/media\/517"}],"wp:attachment":[{"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=515"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=515"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ttz-wue.fiw.thws.de\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}