So bestehen Sie einen Cyber-Test am Checkpoint Teil 2

Hallo allerseits, ich bin Nikita Kurtin, Kuratorin der HackerU Israeli High School IT und Sicherheit.

Und ich spreche weiterhin über Cyber-Tests des führenden israelischen Unternehmens im Bereich Informationssicherheits-Checkpoint. In einem früheren Beitrag habe ich beschrieben, wie ich vier Tests durchlaufen habe, und in diesem möchte ich über die nächsten drei sprechen, die ich bestanden habe.

Für diejenigen, die den ersten Beitrag verpasst haben, sage ich Ihnen, dass Checkpoint diesen Sommer eine Reihe von Cyber-Tests veröffentlicht hat.
Die Challenge endete offiziell Ende September 2018.

Die Aufgaben wurden in sechs Kategorien unterteilt:

• Logik
• Web
• Programmierung
• Vernetzung
• Rückwärtsfahren
• Überraschung

Zwei Aufgaben für jede Richtung. Wie ich bereits schrieb , hatte Checkpoint es bereits geschafft, meinerseits Respekt und Interesse zu gewinnen, und so beschloss ich, diese Herausforderungen anzunehmen. Aufgrund der Beschäftigung konnte ich es mir jedoch leisten, nur 8 von 12 Aufgaben (aus vier verschiedenen Kategorien) zu übernehmen. Und ich habe es geschafft, 7 davon zu lösen.

Und so:

Herausforderung: Puzzle

Beschreibung:

Endlich haben wir dich gefunden!
Wir müssen dieses Rätsel zusammensetzen, und wie die Prophezeiung sagt - nur Sie sind dazu in der Lage.

Das Puzzle ist sehr bizarr. Es besteht aus einer Tafel mit 10 Spalten und 10 Zeilen. Insgesamt - 100 Teile. Und jeder von ihnen trägt ein Geheimnis! Die Teile bestehen aus vier Teilen: oben, unten, rechts und links. Jeder Schlag ist eine Zahl. Zum Beispiel:

Bild

Oben - 12, rechts - 3, unten - 4 und links - 5.

Damit sich das Puzzle entwickeln kann, müssen alle Details so auf das Brett gelegt werden, dass jedes Stück an den gleichen Wert angrenzt.

Außerdem muss ein Bruch, der an nichts angrenzt, aber Teil der Kartengrenze ist, auf 0 gesetzt werden. Die verbleibenden Brüche dürfen keinen Nullwert haben. Hier ist ein gültiges Beispiel für 4 Teile:

Bild

Am oberen Rand der Tafel sind alle Brüche, die den Rand bilden, Null.

Betrachten Sie den oberen linken Teil. Sein rechter Lappen ist 9, und der benachbarte Lappen (linker Lappen des oberen rechten Teils) ist ebenfalls 9.

Leider werden alle unsere Details gemischt. Sie werden im folgenden Format angegeben:
Id des Würfels [Bruch]; Würfel-ID, [Freigaben]; ... Würfel-ID, [Freigaben]

Wobei die Würfel-ID Zahlen von 0 bis 99 ist und die Brüche aus Zahlen bestehen, die in der Reihenfolge angeordnet sind: oben, rechts, unten, links.

Schauen Sie sich zum Beispiel das folgende gemischte Brett an:

Bild

Hier ist die Zeile, die dieses Board beschreibt:

Bild

Sie müssen das Puzzle zusammensetzen!

Schreiben Sie uns eine Zeile, die genau so aussehen würde:

ID des Würfels, wie oft er im Uhrzeigersinn gedreht werden muss; ID des Würfels, wie oft er im Uhrzeigersinn gedreht werden muss; ... ID des Würfels, wie oft er im Uhrzeigersinn gedreht werden muss

Die Zeile mit der Lösung für dieses Board sieht folgendermaßen aus:

Bild

Die obige Zeile entspricht dem folgenden (gelösten) Rätsel:

Bild

Betrachten Sie den oberen linken Teil. In der Zeile entspricht es der Bezeichnung "2.2". Wie nehmen wir Würfel Nummer 2 aus der Eingabe:

Bild

Aber wir drehen es zweimal im Uhrzeigersinn und erhalten [0,19,5,0].

Betrachten Sie nun den oberen Mittelteil. In der Zeile entspricht es der Bezeichnung "1.0". Daher nehmen wir Würfel Nummer 1 aus der Eingabe:

Bild

Und drehen Sie es überhaupt nicht (ja, drehen Sie es 0 Mal) - es bedeutet, dass es sich bereits in der richtigen Position befindet.

Verstanden?
Jetzt hilf uns, das Puzzle zusammenzusetzen!

Es sieht so aus:

Bild

Viel Glück

Theoretisch kann dieses Problem auf viele verschiedene Arten gelöst werden. Finde deine und teile sie. Ich dachte über verschiedene Optionen nach und kam schließlich zu folgenden Schlussfolgerungen:

Der erste. Zu jedem Zeitpunkt muss ich nur einen Würfel definieren. Für jeden Würfel kenne ich immer zwei Seiten: die obere und die linke. Am Anfang ist es 0 und 0. Der nächste Würfel oben hat ebenfalls 0, und links befindet sich eine Ziffer, die der Nummer des rechten Lappens des vorherigen Würfels entspricht.
Der zweite. Aufgrund der großen Anzahl unterschiedlicher Variationen zwischen den Würfeln sollte ich versuchen, so wenig Schritte wie möglich zu machen und beim ersten negativen Ergebnis eine bedeutungslose Prüfung zu vermeiden.

Der dritte. Um mit verschiedenen Würfeln arbeiten zu können, muss ich mir immer ihre Anfangsposition (ID), die Anzahl der Umdrehungen vom Startpunkt und anscheinend die Anzahl der Seiten (oben, rechts, unten, links) merken.

Viertens. Die anfängliche Eingabe ist eine Zeichenfolge. Und die Ausgabe ist auch eine Zeichenfolge (und nicht die aktuelle Position).

Basierend auf all dem habe ich die folgende Strategie für mich entwickelt:

Bewegen Sie sich linear - von links nach rechts, bis Sie die rechte Ecke erreichen. Als nächstes gehen Sie eine Linie entlang und beginnen links mit der unteren Nummer des Würfels, der sich oben befindet.
Die Konformität sollte nach jeder Umdrehung überprüft werden. Wenn Sie also bereits 4 Runden absolviert haben und es noch keine einzige Übereinstimmung für diesen Würfel gibt, nehme ich die nächste auf. Jeder überprüfte Würfel kann möglicherweise mit allen anderen Details überprüft werden. Dazu kann ich die Initialisierung jedes einzelnen Würfels mit einem vollständigen Satz aller anderen Würfel rekursiv wiederholen.
Um alle Manipulationen mit den Quelldaten zu verfolgen, habe ich eine objektorientierte Programmiermethode gewählt, bei der ein Würfel ein Objekt ist, das eine ID, eine Anzahl von Umdrehungen und vier Seiten hat: oben, rechts, unten und links.

Anstatt den Ausgangszustand zu kopieren und falsche Zählungen nach mehreren Drehungen zu vermeiden, habe ich die Zählung immer um eins erhöht. Aber als ich die endgültige Anzahl der Umdrehungen überprüfte, benutzte ich das Modulo (Rest der Division) durch 4.

Zum Beispiel, wenn eine Umdrehung erforderlich ist (von [1,2,3,4] bis [4,1,2,3]), aber zunächst drei Umdrehungen fälschlicherweise durchgeführt wurden (derzeit [2,3,4,1]). ), das nächste Mal dauert es 2 (von der aktuellen [2,3,4,1] zu der notwendigen [4,1,2,3]). 3 plus 2 ist 5. Und 5% 4 = 1, und das ist, was Sie brauchen.
Ich muss immer die verwendeten Würfel im Auge behalten und erneute Überprüfungen verhindern. Dafür verwende ich eine Tabelle mit ID-Cubes. Und wenn der verglichene Würfel übereinstimmt, entferne ich ihn aus der Liste.

Ich habe folgende Datenstrukturen ausgewählt:

HashMap - zum Binden der ID (Anfangsposition) und eines aus der Eingabezeichenfolge erstellten Cubes.
Stapel - um verwandte ID-Cubes zu überprüfen.
Array - zum temporären Testen des Ergebnisses.

Objektcode-Würfel:

Bild

Funktionen zur Manipulation von Zeichenfolgen:

Bild

Die Logik der Lösung zum Finden passender Würfel:

Bild

Ergebnis:

Bild

Herausforderung: Tischtennis

Beschreibung:

Ich wette, du bist nicht schnell genug, um mich zu schlagen.
Hier bin ich:
nc 35.157.111.68 10158

Wenn Sie diesen Befehl ausführen, erhalten Sie:

Bild


Auf den ersten Blick scheint dies eine Aufgabe für die Arbeit mit Streams zu sein.

Nach dem Empfang der ersten Daten scheint es jedoch so zu sein, dass sie in Timeout fallen und dann vollständig - sie werden abgedeckt.

Wenn die Daten enden, wird ein neues Zeilentrennzeichen angezeigt.

Ich habe den Stream mit Python-Code neu erstellt.
Es scheint zu funktionieren, also habe ich einen iterativen Code hinzugefügt, der den Ping-Pong-Algorithmus wiederholt, und ich werde warten, bis das Flag erscheint.

Bild

Nach einer großen Anzahl solcher Ping-Pong-Umbesetzungen (vielleicht mehr als tausend) zwischen dem Client und dem Server habe ich endlich alles erledigt.

Bild

Herausforderung: "Protokoll"

Beschreibung:

Hallo, da!
Wir müssen die geheimen Daten von einem speziellen Server extrahieren. Wir wissen nicht viel über ihn, aber wir haben es geschafft, Datenverkehr abzufangen, der die Kommunikation mit diesem Server unterstützt.
Wir wissen auch, dass der Pfad zu dieser geheimen Datei lautet: /usr/PRivAtE.txt

Die Sniff-Datei finden Sie hier (Link zur Datei).

Bitte sagen Sie uns, was das Geheimnis ist!
Viel Glück

Ich habe die Datei heruntergeladen und mit Wireshark geöffnet

Bild

Und überprüfte die registrierten Verhandlungen

Bild

Es erlaubte mir herauszufinden, was los war.

Bild

Ich bemerkte, dass es Verhandlungen zwischen IP 35.157.111.68 über Port 20120 und SSH-Port 22 gab. Ich sollte diesen Port 20120 überprüfen und dann zu SSH wechseln (später wurde mir klar, dass dies nicht notwendig war).

Ich habe den Befehl nc verwendet, um diese IP und diesen Port zu überprüfen, und eine Antwort erhalten: "0 8 Willkommen"

Bild

Ich war mir nicht sicher, welchen Input er erwartete, also ging ich zurück zu Wireshark, um zu sehen, ob noch Hinweise übrig waren.

Ich habe alle Datenpakete für 35.157.111.68 auf Port 20120 herausgefiltert und eine leicht lesbare Konversation gefunden:

Bild

Bild

Bild

Bild

Bild

Ich habe das alles über die Befehlszeile von nc neu erstellt:

Bild

Ich habe festgestellt, dass die Antwort auf meine Anfrage „2 3 XOR“ anders war als die in der Datei.
Ich wiederholte den gesamten Vorgang immer wieder, um festzustellen, ob sich die Antwort jedes Mal änderte.

Bild

Bild
Wie ich dachte, waren die 4 erhaltenen Werte jedes Mal unterschiedlich, ebenso wie die endgültigen Daten.
Die vier erhaltenen Werte scheinen der Schlüssel zur Entschlüsselung der endgültigen Daten zu sein.
Mir ist auch aufgefallen, dass die Zahlen vor jedem Datenpaket nicht zufällig sind.

Es sieht wie folgt aus.

Die erste Zahl bedeutet Reihenfolge: 0 -> erste, 1 -> zweite, 2 -> dritte usw.
Die zweite Zahl bedeutet die Dauer der Phrase 8 -> "Willkommen", 5 -> "Hallo" -> usw.

Ich dachte mir, ob dies nicht der Schlüssel zur Entschlüsselung ist. Da die endgültigen Daten eine fortlaufende Reihe von Blöcken mit 4 HEX-Werten sind und der XOR-Schlüssel auch 4 HEX-Werte enthält. Vielleicht kann ich über jedes iterieren und es in separate Bytes unterteilen und sie dann mit Bytes aus dem Schlüssel beißen.

Und ich habe versucht zu entschlüsseln:

Bild

Alles stellte sich heraus, aber die empfangenen Daten enthielten kein Flag.

Bild

Ich habe die Regeln erneut gelesen und mich daran erinnert, dass der Pfad zu dieser geheimen Datei wie folgt lautet: /usr/PRivAtE.txt

Ich habe den Vorgang erneut wiederholt, diesmal jedoch den Pfad "/usr/PRivAtE.txt" angefordert.

Bild

Ich habe erneut versucht, die endgültigen Daten zu entschlüsseln:

Bild

Und die Flagge war in meinen Händen:

Bild

Warst du erfolgreich? Schreiben Sie Ihre Ideen und Möglichkeiten, ich werde gerne kommentieren.

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


All Articles