CSCG CTF - Captcha 1 und 2
Willkommen zur Serie ! Diverse Aufgaben sind in dem Zeitraum zwischen dem 1. November und dem 15. Januar in der Cyber Security Challenge Germany gestellt worden. Alle Aufgaben mussten gelöst um zur Endrude in Berlin eingeladen zu werden. Viele schlaflose Nächte wurden verbracht, um Ansätze für die jeweiligen Aufgaben zu finden. Gerade in dem Feld der Cryptografie und Stegnografie wusste ich oft nicht, welcher Weg der Zielführende ist. Es gab 13 verschiedene Aufgaben, welche von Coding, über Crypto und Reverse Engineering bis Stegnografie reichten. Alle dieser Aufgaben werden nach und nach in der folgenden Serie präsentiert werden. Beginnen wir doch direkt mit Captcha 1 und 2.
Generelles zu den Captcha Levels: Es war jeweils ein Username und eine Wordliste gegeben, welche das Passwort des Users enthielt. Nun musste man den Captcha Mechanismus umgehen, um alle Wörter der Wordlist durchzuprobieren. Nach dem erfolgreich “erbruteten” Login konnte man die Flag auslesen und sein eingenes Programm einschicken.
Captcha 1:
Ein Blick in den HTML-Quelltext von Captcha 1 verrät schnell, dass es sich um eine clientbasierten Captcha-Validierung handelt. Der eingegebene Captcha-Text wurde im Javascript-Code überprüft und die Login-Request nur nach erfolgreicher Überprüfung angeschickt. Das Sicherheitsproblem liegt klar auf der Hand: Der Server kann das Captcha nicht verifizieren, deshalb können wir die Requests direkt an den Server richten. Ein kleines Python-Script schaffte Abhilfe (Source ist leider nicht mehr auffindbar )
Captcha 2:
Level 2 gestaltete sich schon als etwas schwieriger, hier wurde der Captcha-Check serverseitig durchgeführt. Allerdings wurden keine Filter (Verzerrung, Graustufen, Linien) in das Bild eingefügt und zudem nur Zahlen von 0 bis 9 verwendet.
Ohne Verzerrungen ist die Zahl 6 auch im nächsten Captcha wieder genau die selbe Grafik der Zahl 6. Diese einzelnen Zahlen wurden nun “von Hand” extrahiert und als Bilder gespeichert. Nun musste also nur geprüft werden, ob das “Teilbild” der Zahl in dem gesammten Captcha-Bild vorkam. Soetwas ist leicht implementiert, aber dennoch ist es leichter auf eine fertige Bibliothek zurückzugreifen. In diesem Fall wurde das AForge-Framework verwendet. Der spannende Code ist hierbei wie folgt:
// Alle Zahlen in ein Dictionary Laden, um ein Mapping zwischen Zahl und Zahlengrafik zu haben var images = new Dictionary<String, System.Drawing.Bitmap >(); for (int i = 0; i <= 9; i++) { images.Add(i.ToString(), (Bitmap)Bitmap.FromFile(i + ".png")); } // Laden unserer Captchagrafik (im echten Fall dynamisch vom Server) Bitmap bigImage = (Bitmap) Bitmap.FromFile("captcha6.png"); // Ein Mapping zwischen Zahl und gefundener Position in dem Captcha Dictionary<String, Point> dicLocationImageMapping = new Dictionary<string, Point>(); // Alle geladenen Zahlengrafiken durchlaufen und auf das Vorkommen prüfen foreach (var t in images) { // Uns reicht eine Übereinstimmungsquote von 90% ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.9f); TemplateMatch[] matchings = tm.ProcessImage(bigImage, t.Value); // Alle gefundenen Positionen durchlaufen foreach (TemplateMatch m in matchings) { // Jede Position an das Matching zwischen "Zahl" und "Position" anhängen dicLocationImageMapping.Add(t.Key, m.Rectangle.Location); } } // Ein String der die erkannte Zahlenfolge enthält String captchaValue = ""; // Das Zahl/Positionsmapping nach der X-Koordinate sortieren, dass wir die richtige Reihenfolge haben // und an die erkannte Zahlenfolge anhängen foreach (var t in dicLocationImageMapping.OrderBy(m => m.Value.X)) captchaValue += t.Key; |
Captcha 1 und 2 waren relativ schnell gelöst. Doch richtig spannend wurde es ab Captcha 3 ;) Mehr dazu im nächsten Post!
Easy
Noch keine Kommentare vorhanden.