Internetwache CTF 2016 im Rückblick

Vorletztes Wochenende haben wir unser erstes Capture the Flag im jeopardy Style veranstaltet: Den Internetwache CTF 2016

In diesem Blogpost möchten wir aus unserer Sicht einige Dinge zum CTF berichten. Was war das Setup? Was lief schief? Was haben wir gelernt? Was war gut? Was können wir im nächsten Jahr besser machen? Wir hoffen, dass dieser Artikel vielleicht anderen CTF Veranstaltern in Zukunft helfen kann.

Zunächst einmal ein paar Worte zu uns: Sebastian (aka gehaxelt) hat bereits in der Vergangenheit mit dem Team ENOFLAG an einigen CTFs teilgenommen (jeopardy / attack-defense). Tim (aka TPS) nimmt nicht an CTFs teil, fand die Idee von Sebastian ein eigenes CTF zu veranstalten allerdings sehr gut und hat ihn deswegen etwas unterstützt.

Im November letzten Jahres hatte Sebastian die Idee, dass man selbst einmal ausprobieren könnte einen jeopardy-style CTF zu veranstalten. Er war interessiert daran Aufgaben für andere Hacker zu erstellen und zu sehen, wie diese mit diesen umgehen. Anfang Febuar 2016 war es dann soweit: Wir haben unseren ersten CTF auf ctftime.org angekündigt und haben sogar eine Gewichtung von 5.00 erhalten. Die Wertung hat uns etwas gewundert, da sie von den ctftime.org-Admins subjektiv vergeben wird und wir eigentlich damit gerechnet haben, eine Gewichtung von 0,00 zu erhalten - schließlich haben wir zum ersten Mal ein CTF angekündigt und organisiert. Natürlich würden wir uns freuen, wenn wir diese Gewichtung weiter ausbauen könnten (bspw. im nächsten Jahr) und sich unser CTF positiv weiterentwickerlt :)

Der CTF sollte am 20. Febuar 2016 veranstaltet werden - wir hatten also rund 3 Wochen um alle Vorbereitungen abzuschließen. Die Besonderheit, sofern man von einer Besonderheit sprechen kann, bestand darin, dass wir die Challenges nicht nach Schwierigkeit gestaffelt haben. Das hat mehere Gründe: Erstens ist es immer schwer einzustufen, wie schwierig eine Aufgabe wirklich ist und zweitens sollte das Vorgehen etwas an Klausuren angelehnt sein - bei denen weiß man auch nicht unbedingt auf den ersten Blick welche Aufgaben einem leicht fallen und welche schwer :)

Insgesamt denken wir, dass der CTF nicht schlecht war - auch da wir einige sehr positive Rückmeldungen aus der Community erhalten haben. Wir werden uns einige Rückmeldungen später noch einmal genauer anschauen.

Einige Zahlen:

Um einen Eindruck vom CTF zu bekommen - hier einige Zahlen:

  • Scoreboard (Bestenliste): https://ctf.internetwache.org/scoreboard
  • Durchführungszeitraum: 36 Stunden (20 Feb. 2016, 12:00 CET — 22 Feb. 2016, 00:00 CET)
  • Registrierte Teams: ~1500
  • Aktive Teilnehmerteams: ~650
  • Teams, welche alle Challenges gelöst haben: 38
  • Ctftime.org Bewertung: 4.5
  • Ctftime.org Gewichtung: 5.00
  • Wall of Shame: 35 IP Adressen
  • HTTP Anfragen: 2336957
  • Traffic (Netzwerkverkehr): ~20 GB
  • Kosten: 20$ (Hosting)
  • Preis: 0 (Nichts) (Wenn Sie oder Du beim nächsten CTF als Sponsor auftreten möchten - können Sie/Du sich gern bei uns über Email melden: :) )

Wir waren sehr erfreut, dass es tatsächlich 650 aktive Teams gab (die mindestens eine Challenge gelöst haben). Das ist etwas weniger als 50% der registrierten Nutzer. Etwas enttäuscht waren wir von 35 Leuten, da sie offensichtlich nicht aufmerksam die Regeln gelesen haben und mit aggressiven Tools das CTF überlisten wollten - dadurch haben sie sich alle einen Platz in unseren Iptables verdient. Wie auch immer, einigen Leuten haben wir nach einer Entschuldigung auch wieder Zugang gewährt :). Eine andere Sache die wir überschätzt haben, war der Traffic - im Großen und Ganzen hielt unser Aufbau der Belastung gut Stand.

Setup

Im Bereich Hosting haben wir auf Digitalocean.com vertraut, weil wir dort noch einiges an Belohnung auf unserem Account hatten und Sebastian bislang sehr zufrieden mit dem Anbieter war. Ein weiterer Grund war, dass die Dienste dort prima funktionieren - VMs lassen sich in weniger als einer Minute hochfahren oder sichern (snapshotten) - was das Austesten von Konfigurationen erleichert.

Insgesamt haben wir uns 4 virtuelle Maschinen (VMs) angemietet:

  • 1x $5/mo als Monitoring VM, welche Performance-Daten der anderen VMs eingesammelt und dargestellt hat. Dazu haben wir Collectd genutzt.
  • 3x $80/mo VMs als Proxy, Service und Webserver VMs.

Die Domains *.ctf.internetwache.org zeigte auf eine “floating-ip”, welche wiederum auf die Proxy-VM verwies. Alle 4 virtuelle Maschinen waren über Digitaloceans privates Netzwerk verbunden.

Auf der Proxy-VM war NGINX konfiguriert, welches als Load-Balancer für HTTP(s) und TCP Traffic dienen sollte. Der Web-Traffic wurde zu der Webserver-VM und der TCP-Verkehr zur Service-VM weitergeleitet. Dieser zentrale Proxy erlaubte es uns, bösartige Angreifer dort direkt zu stoppen und bei Bedarf auf mehr VMs zu skalieren. Die Webserver-VM nutzte Apache2, MySQL und php5. Wir nutzten das apache2-mpm-itk Modul, um jedem VHost einen eigenen Benutzer zuzuweisen. Die Service-VM nutzte Tools wie Daemontools und TCPServer, um die Services bereitzustellen. Alle VMs hatten Cgroups konfiguriert, um die Ressourcen der Nutzer der Gruppe ctf zu limitieren.

Das gezeigt Setup erwies sich als stets solide, wir hatten während des CTFs keine massiven Performanceeinbrüche. Rückblickend hätten wir sogar noch kleinere VMs wählen können - dadurch hätte man allerdings auch nur rund ~$6,5 gespart und zudem wollten wir uns gerade bei unserem ersten CTF keine Panne bei zu enger Ressourcenplanung erlauben. Während des CTFs kam es nur zu einem sehr kleinem Zwischenfall, bei dem wir einschreiten mussten.

Wir haben unser Spielpanel basierend auf der tinyctf-platform aufgebaut. Es ist in Python geschrieben und lässt sich einfach erweitern (wir haben beispielsweise einen CSRF Schutz und einige andere Features eingebaut). Das Scoreboard ist nun Internetwache erprobt und wir werden es sicherlich noch einmal einsetzen - vielleicht im nächsten Jahr.

Challenges

Schauen wir uns einmal die Challenges an. Insgesamt gab es 6 Kategorien mit je 5 Challenges:

Misc

  • Misc50: Octal und Base64 Kodierung
  • Misc60: Base64 und QR Codes
  • Misc70: Pcap Dump mit einer Zipdatei
  • Misc80: DNS Requests und Hex
  • Misc90: Barcodes

Web

  • Web50: PHP magic hashes
  • Web60: PHP preg_replace mit e modifier RCE
  • Web70: MySQL truncation vulnerability
  • Web80: Öffentlicher Git Ordner
  • Web90: Latex RCE

Rev

  • Rev50: MIPS assembly
  • Rev60: Dateiinhaltsprüfungen
  • Rev70: Switch case Eingabeprüfungen
  • Rev80: TapeBagel Reversing
  • Rev90: Rubiks Cube mit Flagge

Crypto

  • Crypto50: Mehrere Chiffren hintereinander
  • Crypto60: RSA Schlüsselfaktorisierung
  • Crypto70: Hash Kollisionen
  • Crypto80: Stegano / DTMF
  • Crypto90: Bearbeitung des Ciphertextes

Code

  • Code50: Gleichungen lösen
  • Code60: Primzahlen finden
  • Code70: Kodierte Gleichungen lösen
  • Code80: Eine Zeichenkette bruteforcen
  • Code90: BST Baumoperationen

Exploit

  • Exp50: Ruby Regex
  • Exp60: Integer-Overflow
  • Exp70: Variable-Overflow
  • Exp80: Formatstring Lücke
  • Exp90: NodeJS ‘shell’

Alle Challenges und einige Konfigurationen sind in unserem GitHub Repository zu finden.

Easter-Egg: Alle Portnummern waren Primzahlen

Probleme die aufgetreten sind

Wir sind auch nur Menschen und wir alle machen Fehler oder stellen während des CTF Fehler fest. Wir finden es wichtig über diese Fehler zu sprechen:

Web70

Die angestrebte Lösung für diese Aufgabe war die Nutzung einer sogenannten ”mysql truncation vulnerability”. Diese Schachstelle funktionierte bedauerlicherweise so gut, dass sobald eine Personen einen Exploit erfolgreich ausgeführt hat, andere Teams einfach in der Lage waren sich einzuloggen - zum Beispiel mit admin/admin oder ähnlichen Kombinationen. Das machte die Challenge sehr trivial, aus diesem Grund haben wir die diese einige Zeit offline genommen und einen Quick-and-Dirty Fix implementiert, welcher das Problem behoben hat.

Web90

Während der Erstellung dieser Challenge dachte Sebastian an einen bestimmten Lösungsweg. Allerdings vergaß er den Filter um \write18 zu erweitern, sodass die Challenge trivial mit \immediate\write18{Kommando} lösbar war. Wie auch immer, wir bemerkten diesen Bug leider viel zu spät, als das es noch fair gewesen wäre, ihn zu beheben. Wir hoffen aber, dass ihr trotzdem was gelernt habt :) Sebastian wird irgendwann über die geplante Lösung einen Blogpost auf 0day.work veröffentlichen.

Rev90

Das war die Rubik’s Cube Challenge. Sebastian hat leider einen kleinen Fehler beim Verwürfeln gemacht. Eine korrigierte Version der README wurde während dem CTF hochgeladen. Entschuldigung dafür! (Wie auch immer, es gab noch einen anderen Weg diese Challenge zu lösen.)

Crypto50

Das schien aus unserer Sicht eine einfache Challenge zu sein, allerdings stellte es sich als etwas zu schwierig (zu viel raten?) für die Teilnehmer heraus. Wir hätten die Beschreibung klarer machen sollen.

Code70

Das Zeitformat (TIME:CHAR) war ein wenig unklar.

Code90

Die Beschreibung war ein wenig uneindeutig, was das Eingabe-/Ausgabeformat anging.

Dauer

Die Dauer war eine weitere Sache, die wir überschätzt haben und etwas kürzer hätten wählen sollen. Wir hatten das Gefühl, dass nach 24 Stunden nicht mehr viel Aktivität vorhanden war. Nur noch ein paar Teams, welche die verbleibenden Challenges noch lösen wollten. Allerdings gab es in den letzten Stunden nochmal einen Ansturm. Einige teilten uns mit, dass längere CTFs gut für Einsteigerteams sind und das Zeitzonen-Tageslicht-Differenzen vermeidet, sodass es kein so großes Problem darstellte. Der nächste CTF wird bestimmt etwas kürzer sein (ungefähr 12 Stunden). Sebastian hat festgestellt, dass 2 Flaschen Club Mate ausreichend sind, um 40 Stunden am Stück wach zu bleiben :)

Schwierigkeit

Da dies der erste CTF war, den wir gehostet haben, war es schwer für uns die Schwierigkeit der Aufgaben abzuschätzen. Es stellte sich heraus, dass die Aufgaben ein wenig zu einfach waren. Wie auch immer und oben schon erwähnt, half es Neuankömmlingen zu lernen, wie man CTFs spielt und/oder diese funktionieren. Wir geben uns nächstes Mal noch mehr Mühe!

Weniger Hinweise

Wir erhielten die Kritik, dass wir zu viele Hinweise im privaten Chat vergeben haben. Rückblickend mag das richtig sein, aber wir haben versucht die Teilnehmer motiviert zu halten. Daher stellten wir Fragen wie ‘Wo hängst du fest?’, ‘Was hast du schon probiert?’, ‘Was kennst du noch?’, ‘Was kannst du dir noch (aus)denken?’ und ließen die Fragenden dann die Lösung herausfinden. Unserer Meinung nach reduziert das die Frustration und erhöht das Lernvermögen. Aber nächstes Mal werden wir versuchen die Hinweise allgemeiner zu halten oder öffentlich preiszugeben. (Eine seperate Hinweis-Seite ist eine gute Idee)

Insgesamt lässt sich sagen, dass sich diese Probleme durch noch ausgiebiegeres Testen hätten verhindern lassen können.

Beschreibbare Ordner

Einige Leute teilten uns mit, dass sie eine Challenge durch das ‘Greppen’ nach dem Flaggenformat auf dem Dateisystem gelöst haben. Das führte leider zu einigen trivialen Flaggen, denn einige Ordner wie /tmp enthielten temporäre Lösungsdateien anderer Teams. Wir haben diese Probleme während dem CTF behoben, in dem wir ACLs nutzten, um die Schreibrechte, der Nutzer der Gruppe ctf für die Ordner /tmp, /var/tmp und so weiter, zu entfernen.

Lastspitzen

Es gab einen interessanten Vorfall. Wir wissen immer noch nicht richtig, was genau passiert ist, aber die Last (Load) sprang plötzlich auf 2600 und ungefähr 6 GB Ram wurden zur gleichen Zeit ausgelastet. Es sieht so aus, als hätte das Cgroups-Limit von 6 GB Ram gegriffen. Interessanterweise war die VM während des Vorfalls reaktionsfähig und ein Neustart von Apache hat das Problem beseitigt.

Hohe Lastspitze

Hoher Ramverbrauch

Was wir denken, dass es insgesamt gut war

Okay, dann beleuchten wir auch mal positive Aspekte unseres CTFs. Unserer Meinung nach war die Uptime und die allgemeine Stabilität der Services gut. Ausgeschlossen einiger kleiner Downtimes wegen der Bugfixes, waren alle Services während des CTF erreichbar.

Ein weiterer starker Punkt war die Kommunikation. Wir waren den ganzen CTF lang über Twitter oder im IRC erreichbar. Wir haben kein aktives Cheating, Flaggen-Sharing oder anderes schlechtes Verhalten in unserem IRC channel mitbekommen.

Was uns erfreute waren diverse ‘aha’-Effekte unserer Teilnehmer beim Lösen der Challenges. Es scheint als hätten wir Neuankömmlingen eine gute Möglichkeit geboten, über CTFs zu lernen und das gute Gefühl zu verspüren, wenn man endlich eine Challenge gelöst hat.

Einige erfrischende und/oder interessante Challenges, wie exp80 / exp90 / web90 / rev90 / rev80 (Sebastian’s persönliche Favoriten).

Was andere über den CTF denken

Wir nutzten eine Google Umfrage um nach Feedback zu fragen. 80 Leute waren so nett uns eine handvoll an Fragen zu beantworten. Wir würden gerne einige dieser Antworten mit euch teilen.

Einige Grafiken:

How many CTFs have you participated in?

What was your overall impression of the CTF?

How would you rate the communication between the organizers and competitors during the competition?

How would you rate the overall difficulty of the challenges?

In general, I think the challenges were ...

Would you consider playing in Internetwache CTF next year?

Allgemeines Challenges Feedback:

  • Challenge and scoreboard availability was good, services seemed to be mostly up and responsive for me, even with so many participants, nice job on that! However, we had some beginners on the team and I think it’s great to have easy challenges as well so they don’t get frustrated. They should not constitute the heart of the contest though.
  • Very good, especially for the 1st CTF you’ve run!
  • A bit on the easy side - but that is also fine sometimes. Great quality in presentation, and descriptions.
  • It seems little bit easy to solve the challenges, but even if that we’ve learned lots of new stuff from challenges in time.
  • I liked that the difficulty was not immediately visible. Encouraged me to try all the challenges and not to start with the easy ones.

Abschließende Worte:

  • Extremly well done for the first time hosting a CTF, and one of the most enjoyable CTFs so far this year. Good challenge difficulty for beginning CTF teams. Time limit was okay, bit long maybe, but that leaves the less active teams time to enjoy the challenges
  • Great IRC moderators! This CTF was well run which is very much appreciated after several badly run CTFs this year.
  • Good job.Thanks :)
  • Awesome job guys, looking forward to next year!
  • I’d like to point out that your organizing work is clearly above average.
  • Unlike some CTFs, this has potential to not suck. It’s a little rough right now, but I think everyone forgives you for minor mistakes in the beginnings of a major undertaking.

Wir freuen uns schon darauf, nächtes Jahr einen weiteren CTF zu hosten.

Das Team der Internetwache.org