Ich komme gerade vom iCTF 2013.
Das Szenario war wie folgt: Auf einem isolierten Server liefen eine Reihe von (größtenteils Python-)Diensten, z.B. ein kleines Blogsystem und ein Spiel. Die Teams schreiben Exploits, um über die enthaltenen Sicherheitslücken an die Flaggen (spezielle Strings) zu kommen, führen diese aber nicht selbst aus, sondern übermitteln sie an die Spielleiter, die in einem eigenen Dienst die Exploits dann gegen die Dienste der anderen laufen lassen. Entdeckt ein Team, dass ein anderes gerade auf eine eigene Flagge zugegriffen hat, kann es das melden und so auch dafür Punkte bekommen.
Die Exploits zu finden war durchaus eine Herausforderung. Kurz vor Ende wurde noch ein echtes entdeckt, konnte aber nicht mehr rechtzeitig programmiert werden, ein anderes Exploit funktionierte unerklärlicherweise nicht und ein drittes wurde zwar übermittelt, aber nicht mehr ausgeführt. Das war durchaus schade.
Mich hat die Verteidigung gereizt. Relativ früh bemerkten wir, dass Flaggen aus dem Pseudo-Blogsystem ausgelesen wurden. Das Schema war relativ simpel: Flaggen lagen als Datei in blogsystem/flags, die Artikel des Blogsystems als Datei gespeichert in blogsystem/posts, und die Angreifer schafften es, in die blogsystem/posts.metadata Javascript einzuschleusen, das dann vom (node-)Server ausgeführt wurde und die Flaggen in die posts geschrieben hat. Also schrieb ich ein Bash-Skript, dass sekündlich alle Posts auf Flaggen durchsucht, bei entdeckter Flagge das Änderungsdatum der Datei protokolliert und an meinen Rechner schickte (per netcat). Dort lief dann ein Skript, das aus dem netflow-Protokoll die id desjenigen auslas, der zu dem Zeitpunkt des Angriffs auf den Port des Blogsystems zugegriffen hat. Wegen mechanize erledigten ruby-Skript das Ausfüllen der Formulare, wieder ein Bashskript steuerte die beiden Rubyskripte und nahm die Angriffszeitpunkte entgegen.
Das hat auch ganz gut funktioniert, obwohl es in dem Trubel unwahrscheinlich lang gedauert hat, die Skripte zum Laufen zu kriegen (mein letztes Bash-Skript ist ne Weile her). Oder es hätte ganz gut funktioniert, wenn nicht die ganze Zeit die Infrastruktur ausgefallen wäre. In den letzten Stunden sah das netflow-Log so aus:
{
"netflow": []
}
Das machte das Schreiben der Skripte nicht einfacher (json mit Bash parsen erfordert grep und sed, und das muss man schon wirklich gegen Livedaten testen) und machte die ganze Bemühungen für die Katz, weil das fertige Skript ohne Angreifer-Log dann ja auch nichts reporten konnte.
Trotzdem kamen aus dieser Ecke, vor dem Zusammenbruch der Infrastruktur, unsere Punkte, und das könnte man das nächste mal sicher noch verbessern (Intrusion-Detection-System verwenden und direkt Wireshark einrichten).
onli blogging am : Bash: echo mit Umbrüchen
Vorschau anzeigen