Analysieren von CTF-Aufgaben

Anfang Dezember veranstalteten wir einen Teamwettbewerb im Bereich Informationssicherheit. Veranstalter der Veranstaltung für die „weißen Hacker“ waren neben OTUS Volga CTF und CTF.Moscow . Vielleicht ist es an der Zeit, die Aufgaben zusammenzufassen und ausführlich zu besprechen.

Erstens war die Veranstaltung erfolgreich:

  • Es wurden 9 Aufgaben in drei Bereichen vorbereitet: Pentest, Reverse Engineering, Linux-Sicherheit und sichere Entwicklung;
  • 217 Teams nahmen teil;
  • Über 800 Versuche, Flaggen zu übergeben, wurden registriert.
  • Es wurden mehr als 300 Flaggen registriert.



Zweitens waren die Aufgaben unterschiedlich komplex, sodass nicht jeder das Problem lösen konnte:



Drittens haben wir unmittelbar nach Abschluss des Online-Marathons drei Webinare abgehalten, in denen wir über die Gewinner gesprochen, die richtigen Antworten gegeben und die endgültigen Ergebnisse bekannt gegeben haben:

- CTF-Ergebnisse: „Linux-Sicherheit und sichere Entwicklung“;


- CTF-Ergebnisse: Pentest;


- die Ergebnisse von CTF: "Reverse Engineering".


Viertens bieten wir Ihnen die Bedingungen der Aufgaben und textuelle Beschreibungen ihrer Lösungen . Bitte beachten Sie, dass einige Aufgaben Dateien enthalten.

Richtung 1: Pentest


Aufgabe 1 - Datenbanken

100

Die Site verwendet aktiv Datenbanken. Versuchen Sie, SQL-Injektionen durchzuführen.
Link zur Website: http://193.41.142.9:8001/shop/login

Lösung:

Wir gehen zum Hauptbereich des Ladens / shop / products / und finden, nachdem wir im Suchfeld stecken geblieben sind, SQL Injection.

Wir geben 1 "ODER" 1 "=" 1 "- ein, scrollen nach unten und sehen das vorher fehlende Produkt, die Flagge ist in seiner Beschreibung.

Flag: flag {5ql_1nject10n_15_t00_51mpl3_f0r_y0u}

Aufgabe 2 - Cookies

150

Mein Freund hat eine Online-Shop-Plattform entwickelt. Er bat um einen Blackbox-Test. Überprüfen Sie die Cookie-Sicherheit. Möglicherweise können Sie Administratorrechte erhalten.

Link zur Website: http://193.41.142.9:8001/shop/login

Lösung:

Loggen Sie sich ein, schauen Sie sich die Cookies an und sehen Sie sich die geheimen Cookies an:

«MTExMTAxMSAxMDAwMTAgMTExMDEwMSAxMTEwMDExIDExMDAxMDEgMTExMDAxMCAxMTAxMTEwIDExMDAwMDEgMTEwMTEwMSAxMTAwMTAxIDEwMDAxMCAxMTEwMTAgMTAwMDEwIDExMTAxMDEgMTExMDAxMSAxMTAwMTAxIDExMTAwMTAgMTAwMDEwIDEwMTEwMCAxMDAwMDAgMTAwMDEwIDExMDEwMDEgMTExMDAxMSAxMDExMTExIDExMDAwMDEgMTEwMDEwMCAxMTAxMTAxIDExMDEwMDEgMTEwMTExMCAxMDAwMTAgMTExMDEwIDEwMDAxMCAxMDAwMTEwIDExMDAwMDEgMTEwMTEwMCAxMTEwMDExIDExMDAxMDEgMTAwMDEwIDExMTExMDE =»

Decode base64, erhalten wir die binären Daten: 1111011 100010 1110101 1110011 1100101 1110010 1101110 1100001 1101101 1100101 100010 111010 100010 1110101 1110011 1100101 1110010 100010 101100 100000 100010 1101001 1110011 1011111 1100001 1100100 1101101 1101001 1101110 100010 111010 100010 1000110 1100001 1101100 1110011 1100101 100010 1111101

Wir übersetzen in Text und erhalten: {"username":"user", "is_admin":"False"} , ändern False in True und dekodieren ihn zurück:

01111011 00100010 01110101 01110011 01100101 01110010 01101110 01100001 01101101 01100101 00100010 00111010 00100010 01110101 01110011 01100101 01110010 00100010 00101100 00100000 00100010 01101001 01110011 01011111 01100001 01100100 01101101 01101001 01101110 00100010 00111010 00100010 01010100 01110010 01110101 01100101 00100010 01111101

«MDExMTEwMTEgMDAxMDAwMTAgMDExMTAxMDEgMDExMTAwMTEgMDExMDAxMDEgMDExMTAwMTAgMDExMDExMTAgMDExMDAwMDEgMDExMDExMDEgMDExMDAxMDEgMDAxMDAwMTAgMDAxMTEwMTAgMDAxMDAwMTAgMDExMTAxMDEgMDExMTAwMTEgMDExMDAxMDEgMDExMTAwMTAgMDAxMDAwMTAgMDAxMDExMDAgMDAxMDAwMDAgMDAxMDAwMTAgMDExMDEwMDEgMDExMTAwMTEgMDEwMTExMTEgMDExMDAwMDEgMDExMDAxMDAgMDExMDExMDEgMDExMDEwMDEgMDExMDExMTAgMDAxMDAwMTAgMDAxMTEwMTAgMDAxMDAwMTAgMDEwMTAxMDAgMDExMTAwMTAgMDExMTAxMDEgMDExMDAxMDEgMDAxMDAwMTAgMDExMTExMDE =»

Ändern Sie den Wert von Cookies in einen neuen und wechseln Sie zum Benutzerprofil.
Flag: flag {d0_y0u_l1k3_c00k13s}

Aufgabe 3 - Lesen von Dateien

200

Oft stoßen wir auf undichte Quellen und seltsame Logik der Arbeit. Mögliche Angriffsvektoren werden normalerweise durch Fuzzing gefunden. Ich schlage vor, Sie tun dies.

Link zur Website: http://193.41.142.9:8001/shop/login

Lösung:

Wir starten dirb (normales common.txt reicht), wir finden pages /shop/_source/ und /shop/files/ .

Nachdem wir uns mit der Quelle _source vertraut _source wir, dass wir die Path Traversal-Schwachstelle und einige einfache Filter haben.

Um das Flag zu erhalten, müssen Sie eine POST-Anforderung an /shop/files/ mit dem Parameter "file" senden, dessen Wert %2E%2E/%2E%2E/flag .

Als Antwort auf die Anfrage wird eine Flagge angezeigt.

Flag: flag {y0u_g0t_0ur_s3cr3t}

Anweisung 2: "Linux-Sicherheit und sichere Entwicklung"


Aufgabe 1 - VCS

50

Aber hat uns der Kunde etwas Überflüssiges gegeben?
Das Archiv enthält den Quellcode für einen Teil der Site.
Link zur Website: http://193.41.142.9:8002/
Anlage: task.7z

Lösung:

Wir haben Zugriff auf den Quellcode. Wie sich herausstellte, haben die Entwickler auch ein Git-Repository erstellt. Wir schauen uns git log an und sehen Commit mit Fixes. Wir benutzen git show <hash commit>, wir sehen die geänderten Dateien und ihren Inhalt, ein Flag ist in einer der Zeilen gespeichert.

flag {22717297f6a3603608d260c9e5f69e0a}

Aufgabe 2 - Algo

50

Wir haben eine neue Herausforderung. Führen Sie eine sichere Entwicklungsprüfung durch. Der Kunde stellte ein Archiv mit dem offenen Teil der zu entwickelnden Site zur Verfügung. Um seinen Hash-Algorithmus zu testen, stellte er einen Hash bereit: 666c61677b32646733326473323334327d. Überprüfen Sie den Algorithmus auf die Möglichkeit einer inversen Transformation.

Das Archiv enthält den Quellcode für einen Teil der Site.
Link zur Website: http://193.41.142.9:8002/
Anlage: task.7z

Lösung:

Der Quellcode hat einen Passwort-Hashing-Algorithmus. Tatsächlich handelt es sich nicht um einen Hashing-Algorithmus, sondern lediglich um die Konvertierung von Daten aus einem Zeichenfolgenformat in hexadezimal.

Wir benutzen Python:

 import binascii binascii.unhexlify("666c61677b32646733326473323334327d") 

Wir bekommen die Flagge: flag {2dg32ds2342}

Aufgabe 3 - Files files files

150

Beenden wir das Audit. Sehen Sie diese Sicherheitsanfälligkeit auch? Großartig. So ist es für Sie einfach, eine geheime Datei zu erhalten.
Das Archiv enthält den Quellcode für einen Teil der Site.
Link zur Website: http://193.41.142.9:8002/
Anlage: task.7z

Lösung:

Im Quellcode des Hauptmoduls des Programms können Sie den Leser von Dateien bemerken (dies ist die Hauptanwendung dieses Dienstes). Die Funktion zum Überprüfen des Vorhandenseins einer Datei sucht in keiner Weise nach Sonderzeichen und verkettet einfach zwei Zeilen => Sicherheitsanfälligkeit durch Pfadüberquerung.

Außerdem können Sie in Dockerfile, docker-compose.yml, die Dateizuordnungen und die Struktur des Ladens in den Container sehen. Mit diesem Wissen erzeugen wir eine Nutzlast:

 http://193.41.142.9:8002/files?password=qgzc6!78zxcbkj123fdgd234&filename=../../../../../../src/secret_files/flag.txt 

flag {a0a7c3fff21f2aea3cfa1d0316dd816c}

Richtung 3: "Reverse Engineering"


Aufgabe 1 - Schlange
100

Unser Unternehmen ist stets bemüht, jeglichen Softwareschutz zu umgehen. Helfen Sie uns, dieses Mal mit Python fertig zu werden.
Angehängte Datei: task.pyc

Lösung:

Wir verwenden den Python-Bytecode, der vom uncompyle6-Modul dekompiliert wurde:
uncompyle6 task.pyc.
Wir dekompilieren, wir bekommen eine Flagge:

flag {w3l1_pyth0n}

Aufgabe 2 - Roboter
150

Dieses Mal sind wir auf eine seltsame Anwendung gestoßen. Hilf mir, das Passwort für die Eingabe zu finden.
Anhang: app.apk

Lösung:

Die Anwendung ist auf Android, laden Sie sie also einfach in einen statischen Analysator wie BytecodeViewer und sehen Sie den wiederhergestellten Quellcode des Programms. Beachten Sie, dass dies Kotiln ist und wie in diesem Fall häufig funktionale Programmierung verwendet. In einer der dekompilierten anonymen Funktionen finden wir die Flag-Prüfung, die Prüfung selbst:

 (String)paramFunction1.invoke(Boolean.valueOf(Arrays.equals(paramString, h)));  invoke: ((StringBuilder)localObject).append("flag{"); ((StringBuilder)localObject).append(this.$m); ((StringBuilder)localObject).append('}'); 

Variable h: {102, 97, 50, 98, 102, 54, 52, 54, 101, 52, 57, 97, 98, 53, 101, 53, 54, 102, 50, 98, 55, 52, 52, 56, 48, 98, 97, 54, 49, 48, 49, 55};

Wir sehen, dass es wie codierte gedruckte Zeichen aussieht. Wir benutzen Python:

'' .join (chr (x) für x in [102, 97, 50, 98, 102, 54, 52, 54, 101, 52, 57, 97, 98, 53, 101, 53, 54, 102, 50 , 98, 55, 52, 52, 56, 48, 98, 97, 54, 49, 48, 49, 55])

Wir bekommen die Flagge:

flag {fa2bf646e49ab5e56f2b74480ba61017}

Quest 3 - Bin

200

Diesmal sind wir auf eine Binärdatei gestoßen. Die Aufgabe ist die gleiche, holen Sie sich das geheime Passwort.
Anlage: Aufgabe

Lösung:
Es wird eine Binärdatei angegeben. Wir laden in den Disassembler und sehen sechs in C ++ geschriebene Validierungsfunktionen.

Sie werden identisch ausgeführt und ineinander aufgerufen, wobei das Flag in 5er-Stücken geprüft wird.

Wir stellen es schrittweise mit Informationen aus dem Disassembler wieder her. Wir bekommen die Flagge in Teilen:

0) Längenprüfung
1) flag {
2) feefa
3) _172a
4) k14sc
5) _eee}

Kombiniere und erhalte die Flagge:

flag {feefa_172ak14sc_eee}

Das ist alles, Kollegen! Vielen Dank für Ihre Teilnahme, kümmern Sie sich um sich selbst, Ihre Lieben und Ihre Daten! Frohes neues Jahr!

Source: https://habr.com/ru/post/de482538/


All Articles