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:
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:

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:

Hier ist die Zeile, die dieses Board beschreibt:

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:

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

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:

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:

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:

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:

Funktionen zur Manipulation von Zeichenfolgen:

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

Ergebnis:
Herausforderung: Tischtennis
Beschreibung:
Ich wette, du bist nicht schnell genug, um mich zu schlagen.
Hier bin ich:
nc 35.157.111.68 10158Wenn Sie diesen Befehl ausführen, erhalten Sie:

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.

Nach einer großen Anzahl solcher Ping-Pong-Umbesetzungen (vielleicht mehr als tausend) zwischen dem Client und dem Server habe ich endlich alles erledigt.
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ückIch habe die Datei heruntergeladen und mit Wireshark geöffnet

Und überprüfte die registrierten Verhandlungen

Es erlaubte mir herauszufinden, was los war.

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"

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:





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

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.


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:

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

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.

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

Und die Flagge war in meinen Händen:

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