nishang中的bypass模块,原来就是为了针对AMSI接口啊——AMSI专门是检测无文件攻击的,尤其是可以扫描一些string,看编码绕过后的真正执行内容是否恶意!
PS C:\Users\bonel\Desktop\nishang-master> Get-Help Bypass -full
nishang脚本,使用众所周知的方法绕过/避免AMSI。语法 调用AmsiBypass[[-Method]<String>[[-ShowOnly][<CommonParameters>]
说明
此脚本在Windows计算机上实现了绕过或避免AMSI的已知方法。AMSI是Windows 10中默认启用的脚本恶意软件检测机制。(https://msdn.microsoft.com/en-us/library/windows/desktop/dn889587(v=vs.85).aspx)该脚本实现了6种绕过AMSI的方法。
unload - Method by Matt Graeber. Unloads AMSI from current PowerShell session. 从当前PowerShell会话中卸载AMSI。
unload2 - Another method by Matt Graeber. Unloads AMSI from current PowerShell session. 从当前PowerShell会话中卸载AMSI。
unloadsilent - Another method by Matt Graeber. Unloads AMSI and avoids WMF5 autologging. 卸载AMSI并避免WMF5自动登录。
unloadobfuscated - 'unload' method above obfuscated with Daneil Bohannon's Invoke-Obfuscation - which avoids WMF5 autologging. 模糊处理—这避免了WMF5的自动日志记录。
dllhijack - Method by Cornelis de Plaa. The amsi.dll used in the code is from p0wnedshell (https://github.com/Cn33liz/p0wnedShell) DLL劫持的方法,后面微软自己也提到了。
psv2 - If .net 2.0.50727 is available on Windows 10. PowerShell v2 is launched which doesn't support AMSI.
The script also provides information on tools which can be used for obfuscation: 该脚本还提供了有关可用于模糊处理的工具的信息
ISE-Steroids (http://www.powertheshell.com/isesteroidsmanual/download/)
Invoke-Obfuscation (https://github.com/danielbohannon/Invoke-Obfuscation)
==》可以看到,大多数方法都是使用卸载AMSI或者不让AMSI执行的方法。todo,待实践。。。
反恶意软件扫描接口 (AMSI)
用途
Windows反恶意软件扫描接口 (AMSI) 是一种通用接口标准,可让应用程序和服务与计算机上存在的任何反恶意软件产品集成。 AMSI 为最终用户及其数据、应用程序和工作负荷提供增强的恶意软件防护。
AMSI 与反恶意软件供应商无关;它旨在允许当今反恶意软件产品提供的最常见恶意软件扫描和保护技术,这些反恶意软件产品可以集成到应用程序中。 它支持调用结构,允许文件和内存或流扫描、内容源 URL/IP 信誉检查和其他技术。
AMSI 还支持会话的概念,以便反恶意软件供应商可以关联不同的扫描请求。 例如,恶意有效负载的不同片段可以关联起来,以做出更明智的决策,仅通过单独查看这些片段,这更难到达。
Windows AMSI 集成的组件
AMSI 功能集成到这些组件Windows 10。
- 用户帐户控制,或 UAC (EXE、COM、MSI 或 ActiveX的)
- PowerShell (脚本、交互式使用和动态代码评估)
- Windows脚本主机 (wscript.exe和cscript.exe)
- JavaScript 和 VBScript
- OfficeVBA 宏
开发人员受众和示例代码
反恶意软件扫描接口旨在供两组开发人员使用。
- 希望从应用内部向反恶意软件产品提出请求的应用程序开发人员。
- 反恶意软件产品的第三方创建者希望其产品为应用程序提供最佳功能。
有关详细信息,请参阅开发人员 受众和示例代码。
备注
从 Windows 10 版本 1903 开始,如果 AMSI 提供程序 DLL 不是 Authenticode 签名的,则可能不会加载 (,具体取决于主机的配置) 。 有关完整详细信息,请参阅 IAntimalwareProvider 接口。
在本节中
主题 | 说明 |
---|---|
AMSI 如何帮助你防范恶意软件 | 作为应用程序开发人员,你可以主动参与恶意软件防御。 具体而言,可以帮助保护客户免受基于脚本的动态恶意软件的攻击,以及免受非传统网络攻击途径的攻击。 |
开发人员受众,示例 | 本主题介绍设计反恶意软件扫描接口的开发人员组。 |
反恶意软件扫描接口参考 | AMSI API 的枚举、COM 接口和其他编程元素。 |
应用程序开发人员
AMSI 专用于对付 "fileless 恶意软件"。(这下GG了!!!) 能以最佳方式利用 AMSI 技术的应用程序类型包括:脚本引擎、需要在使用之前扫描内存缓冲区的应用程序,以及处理文件的应用程序,这些文件可以包含非 PE 可执行代码 (例如 Microsoft Word 和 Excel 宏或 PDF 文档) 。 但是,AMSI 技术的有用性并不局限于这些示例。
可以通过两种方式在应用程序中与 AMSI 进行交互。
- 通过使用 AMSI Win32 Api。 请参阅 反恶意软件扫描接口 (AMSI) 函数。
- 通过使用 AMSI COM 接口。 请参阅 IAmsiStream 接口。
有关演示如何在 COM 应用程序中使用 AMSI 的示例代码,请参阅 IAmsiStream 接口示例应用程序。
反恶意软件产品的第三方创建者
作为反恶意软件产品的创建者,你可以选择创作并注册自己的进程内 COM 服务器 (DLL) 以作为 AMSI 提供程序运行。 该 AMSI 提供程序必须实现 IAntimalwareProvider 接口,并且它必须在进程内运行。
请注意,在 Windows 10,版本 1709 (秋季2017创建者的 Update) ,如果它依赖于其路径中同时加载的其他 dll,则 AMSI 提供程序 DLL 可能不起作用。 若要防止 DLL 劫持,建议提供程序 DLL 使用 LoadLibrary 的完整路径() 使用安全的调用或等效项) (显式加载其依赖项。 建议这样做,而不是依赖于 LoadLibrary 搜索行为。
以下部分演示如何注册 AMSI 提供程序。 有关演示如何创作自己的 AMSI 提供程序 DLL 的完整示例代码,请参阅 IAntimalwareProvider 接口示例应用程序。
向 AMSI 注册提供程序 DLL
首先,需要确保这些 Windows 注册表项存在。
- HKLM\SOFTWARE\Microsoft\AMSI\Providers
- HKLM\SOFTWARE\Classes\CLSID ==》因为COM劫持啥的就是通过这些注册表
AMSI 提供程序是进程内 COM 服务器。 因此,它需要向 COM 注册自身。 COM 类是在中注册的 HKLM\SOFTWARE\Classes\CLSID
。
下面的代码演示如何注册 AMSI 提供程序,该提供程序的 GUID (此示例) 我们假定为 2E5D8A62-77F9-4F7B-A90C-2744820139B2
。
#include <strsafe.h> ... HRESULT SetKeyStringValue(_In_ HKEY key, _In_opt_ PCWSTR subkey, _In_opt_ PCWSTR valueName, _In_ PCWSTR stringValue) { LONG status = RegSetKeyValue(key, subkey, valueName, REG_SZ, stringValue, (wcslen(stringValue) + 1) * sizeof(wchar_t)); return HRESULT_FROM_WIN32(status); } STDAPI DllRegisterServer() { wchar_t modulePath[MAX_PATH]; if (GetModuleFileName(g_currentModule, modulePath, ARRAYSIZE(modulePath)) >= ARRAYSIZE(modulePath)) { return E_UNEXPECTED; } // Create a standard COM registration for our CLSID. // The class must be registered as "Both" threading model, // and support multithreaded access. wchar_t clsidString[40]; if (StringFromGUID2(__uuidof(SampleAmsiProvider), clsidString, ARRAYSIZE(clsidString)) == 0) { return E_UNEXPECTED; } wchar_t keyPath[200]; HRESULT hr = StringCchPrintf(keyPath, ARRAYSIZE(keyPath), L"Software\\Classes\\CLSID\\%ls", clsidString); if (FAILED(hr)) return hr; hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, nullptr, L"SampleAmsiProvider"); if (FAILED(hr)) return hr; hr = StringCchPrintf(keyPath, ARRAYSIZE(keyPath), L"Software\\Classes\\CLSID\\%ls\\InProcServer32", clsidString); if (FAILED(hr)) return hr; hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, nullptr, modulePath); if (FAILED(hr)) return hr; hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, L"ThreadingModel", L"Both"); if (FAILED(hr)) return hr; // Register this CLSID as an anti-malware provider. hr = StringCchPrintf(keyPath, ARRAYSIZE(keyPath), L"Software\\Microsoft\\AMSI\\Providers\\%ls", clsidString); if (FAILED(hr)) return hr; hr = SetKeyStringValue(HKEY_LOCAL_MACHINE, keyPath, nullptr, L"SampleAmsiProvider"); if (FAILED(hr)) return hr; return S_OK; }
如上面的示例所示,如果您的 DLL 实现了DllRegisterServer 函数,则可以使用 Windows 提供的可执行文件进行注册 regsvr32.exe
。 在提升的命令提示符下,发出此窗体的命令。
C:>C:\Windows\System32\regsvr32.exe SampleAmsiProvider.dll
在此示例中,命令创建以下项。==》就是在进行com注册表相关设置
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\ {2E5D8A62-77F9-4F7B-A90C-2744820139B2}
(默认) REG_SZ 示例 AMSI 提供程序实现
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\ {2E5D8A62-77F9-4F7B-A90C-2744820139B2} \InprocServer32
(默认) REG_EXPAND_SZ% ProgramFiles% \TestProvider\SampleAmsiProvider.dll
ThreadingModel REG_SZ
除了常规的 COM 注册,还需要将提供程序注册到 AMSI。 为此,可将条目添加到以下键。
HKLM\SOFTWARE\Microsoft\AMSI\Providers
例如,
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI\Providers\ {2E5D8A62-77F9-4F7B-A90C-2744820139B2}
反恶意软件扫描接口 (AMSI) 帮助防范恶意软件
有关 AMSI Windows反恶意软件扫描接口 (的) ,请参阅反恶意软件扫描接口 (AMSI) 。
作为应用程序开发人员,你可以主动参与恶意软件防御。 具体而言,可以帮助保护客户免受基于脚本的动态恶意软件的攻击,以及免受非传统网络攻击途径的攻击。
例如,假设应用程序可编写脚本:它接受任意脚本,然后通过脚本引擎执行它。 当脚本准备好提供给脚本引擎时,应用程序可以调用 Windows AMSI API 来请求内容扫描。 这样,在决定继续执行脚本之前,可以安全地确定脚本是否恶意。【AMSI的作用!!!】
即使脚本是在运行时生成的,也是如此。【如何做???】 脚本 (恶意或其他) ,可能会经历多次模糊处理过程。 但最终需要为脚本引擎提供纯文本、未混淆的代码【这就是说powershell的编码混淆绕过场景可直接通过amsi就搞定了???】。 这就是调用 AMSI API 的点。
下面是 AMSI 体系结构的插图,其中你自己的应用程序由"其他应用程序"框之一表示。
==》从这个图看,最终是通过调用RPC实现脚本扫描的!!!
AMSI Windows接口已打开。 这意味着任何应用程序都可以调用它;和任何已注册的反恶意软件引擎都可以处理提交到它的内容。
我们不需要将讨论限制为脚本引擎。 你的应用程序可能是一个通信应用,它会在向客户显示病毒之前扫描即时消息中的病毒。 或者,软件可能是一个在安装插件之前验证插件的游戏。 使用 AMSI 有很多机会和方案。
AMSI 的可操作性
让我们看一下 AMSI 的可操作性。 本示例中,Windows Defender调用 AMSI API 的应用程序。 但是,可以从自己的应用程序中调用相同的 API。
下面是一个脚本示例,该脚本使用 XOR 编码技术隐藏其意向, (意向是否) 。 对于此图,我们可以想象此脚本是从 Internet 下载的。
为了更有趣,我们可以在命令行中手动输入此脚本,以便没有要监视的实际文件。 这反映了所谓的"无文件威胁"【invoke-expressoin就是类似eval string效果】。 它并不像扫描磁盘上的文件那么简单。 威胁可能是仅存于计算机内存中的后门。
下面,我们将看到在 Windows PowerShell 中运行脚本的结果。 你将看到,Windows Defender使用标准 AMSI 测试示例签名,就能检测此复杂方案中的 AMSI 测试示例。
AMSI 与 JavaScript/VBA 集成
下面演示的工作流描述了另一个示例的端到端流,其中演示了 AMSI 与应用程序内宏执行的Microsoft Office。
- 用户收到一个文档,其中包含恶意 (宏) ,该宏通过使用模糊处理、密码保护文件等技术来避免静态防病毒软件扫描。
- 然后,用户打开包含恶意 (的文档) 宏。 如果文档在"受保护的视图"中打开,则用户单击" 启用编辑" 退出受保护视图。
- 用户单击 "启用宏 "以允许宏运行。
- 当宏运行时,VBA 运行时使用循环缓冲区来记录 [ 与调用 Win32、COM 和 VBA API 相关的 1 个 ] 数据和参数。
- 当观察到被视为高风险的特定 Win32 或 COM API (也称为触发器 ) 2 时,将停止宏执行,并且循环缓冲区的内容将传递到 [ ] AMSI。
- 已注册的 AMSI 反恶意软件服务提供商以一个指示宏行为是否恶意的判断进行响应。
- 如果行为不是恶意行为,则继续执行宏。
- 否则,如果行为是恶意的,Microsoft Office关闭会话以响应警报 [ 3,AV ] 可以隔离文件。
这是什么意思呢?
对于Windows用户,在 Windows 10 的内置脚本主机上使用模糊处理和规避技术的任何恶意软件都会在比之前更深层的级别自动进行检查,从而提供额外的保护级别。
对于应用程序开发人员,如果希望从 (中获益,并针对潜在恶意内容进行额外的) 扫描和分析,请考虑让应用程序调用 Windows AMSI 接口。
作为防病毒软件供应商,可以考虑实现对 AMSI 接口的支持。 这样做时,引擎将更深入地了解应用程序 (包括 Windows 10 的内置脚本主机) 可能恶意的数据。
有关无文件威胁的更多背景信息
你可能想知道有关 AMSI 旨在Windows无文件威胁类型的更多背景信息。 本部分将介绍在恶意软件生态系统中播放的传统猫和鼠标游戏。
我们将使用 PowerShell 作为示例。 但是,你可以利用我们将通过任何动态语言 — VBScript、Perl、Python、Ruby 等演示的相同技术和过程。
下面是恶意 PowerShell 脚本的示例。
虽然此脚本只是将消息写入屏幕,但恶意软件通常更恶意。 但可以轻松编写签名来检测此签名。 例如,签名可以搜索字符串"Write-Host 'pwnd!'" 在用户打开的任何文件中。 很好:我们检测到第一个恶意软件!
但是,在我们的第一个签名检测到后,恶意软件作者将做出响应。 它们通过创建动态脚本(如此示例)进行响应。
在这种情况下,恶意软件作者会创建一个表示要运行的 PowerShell 脚本的字符串。 但它们使用简单的字符串串联技术来破坏我们之前签名。 如果你曾经查看过广告网页的源,你将看到许多此方法的实例用于避免广告阻止软件。
最后,恶意软件作者将此串联字符串传递给 cmdlet PowerShell 的机制,以评估在运行时组合或 Invoke-Expression
— 创建的脚本。
作为响应,反恶意软件开始执行基本语言仿真。 例如,如果看到两个字符串连接在一起,那么我们将模拟这两个字符串的串联,然后对结果运行签名。 遗憾的是,这是一种相当不稳定的方法,因为语言往往有许多表示和连接字符串的方法。
因此,在被此签名捕获后,恶意软件作者将移动到更复杂的内容,例如,在 Base64 中编码脚本内容, — 如下例所示。
由于具有资源,大多数反恶意软件引擎也实现 Base64 解码仿真。 因此,由于我们还实现了 Base64 解码仿真,因此我们提前了一段时间。
作为响应,恶意软件作者移动到算法模糊处理,例如,在运行的脚本中采用简单的 — XOR 编码机制。
此时,我们通常已了解防病毒引擎将模拟或检测哪些内容,因此,我们不必检测此脚本正在执行哪些操作。 但是,我们可以开始针对模糊处理和编码技术编写签名。 事实上,这就是大多数基于脚本的恶意软件签名所基于的。
但是,如果模糊处理器非常简单,看起来就像许多行为良好的脚本一样,又如何呢? 它的签名会生成不可接受的误报数。 下面是一个示例 阶段程序 脚本,它太良性,无法自行检测。
在此示例中,我们将下载一个网页,并调用其中一些内容。 下面是脚本中的等效Visual Basic。
在这两个示例中,情况更差的是,防病毒引擎会检查用户打开的文件。 如果恶意内容仅存于内存中,则攻击可能未检测到。
本部分介绍使用传统签名进行检测的限制。 但是,虽然恶意脚本可能会经历多次模糊处理过程,但它最终需要为脚本引擎提供无模糊代码。 此时,如上述第一部分所述,Windows 10脚本宿主调用 AMSI API 来请求扫描此未受保护的 — — 内容【这句话本质上是说AMSI是检测最终运行的脚本还原后的内容】。 应用程序也可以执行相同的工作。
相关资源
反恶意软件扫描接口 (AMSI) 参考
AMSI 参考页面包含对 AMSI API 的枚举、COM 接口和其他编程元素的说明。 这些主题提供有关应用程序用于与反恶意软件产品集成的编程元素的信息。
参考页分为以下几组。
部分 | 说明 |
---|---|
反恶意软件扫描接口枚举 | AMSI 编程元素使用的枚举。 |
反恶意软件扫描接口函数 | 应用程序可以调用来请求扫描的函数。 |
反恶意软件扫描接口接口 | 构成 AMSI API 的 COM 接口。 |
AMSI (函数的反恶意软件) 接口
应用程序可以调用以请求扫描的函数。 AMSI 提供以下函数。
函数 | 说明 |
---|---|
AmsiCloseSession | 关闭由 AmsiOpenSession 打开的会话。 |
AmsiInitialize | 初始化 AMSI API。 |
AmsiNotifyOperation | 向反恶意软件提供程序发送任意操作的通知。 |
AmsiOpenSession | 打开可在其中关联多个扫描请求的会话。 |
AmsiResultIsMalware | 确定扫描结果是否指示应阻止内容。 |
AmsiScanBuffer | 扫描缓冲区中的内容中寻找恶意软件。 |
AmsiScanString | 扫描字符串中的恶意软件。 |
AmsiUninitialize | 删除 AmsiInitialize最初打开的 AMSI API 实例。 |
Requirements
Minimum supported client | Windows 10 [desktop apps only] |
Minimum supported server | Windows Server 2016 [desktop apps only] |
Target Platform | Windows |
Header | amsi.h |
Library | Amsi.lib |
DLL | Amsi.dll |
反恶意软件扫描接口 (AMSI) 接口
构成 AMSI API 的 COM 接口。 AMSI 提供以下接口。
接口 | 说明 |
---|---|
IAmsiStream | 表示要扫描的流。 |
IAntimalware | 表示反恶意软件产品。 |
IAntimalware2 | 表示反恶意软件产品。 |
IAntimalwareProvider | 表示反恶意软件产品的提供程序。 |
IAntimalwareProvider2 | 表示反恶意软件产品的提供程序。 |
看下扫描的结果返回:
AMSI_RESULT enumeration (amsi.h)
The AMSI_RESULT enumeration specifies the types of results returned by scans.
Syntax
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
} ;
Constants
AMSI_RESULT_CLEAN Known good. No detection found, and the result is likely not going to change after a future definition update. |
AMSI_RESULT_NOT_DETECTED No detection found, but the result might change after a future definition update. |
AMSI_RESULT_BLOCKED_BY_ADMIN_START Administrator policy blocked this content on this machine (beginning of range). |
AMSI_RESULT_BLOCKED_BY_ADMIN_END Administrator policy blocked this content on this machine (end of range). |
AMSI_RESULT_DETECTED Detection found. The content is considered malware and should be blocked. |