红队安全研发系列之免杀原理和绕过研究——静态查杀实现与绕过

 

前言

这篇文章我们将介绍一款开源杀毒软件Clamav,通过学习开源杀毒软件病毒查杀原理来绕过其查杀技术。

 

环境配置

1.下载Clamav,建议下载portable版本。
2.运行下列命令配置Clamav。

cd "解压的目录\clamav"
copy .\conf_examples\freshclam.conf.sample .\freshclam.conf
copy .\conf_examples\clamd.conf.sample .\clamd.conf
write.exe .\freshclam.conf,删除Example一行
write.exe .\clamd.conf,删除Example一行

 

开始实战

该实战通过两个示例,查杀已知病毒和查杀未知病毒,让读者了解病毒查杀的基本原理。

查杀已知病毒

制作病毒

写一个包含了下列文本的txt。保存为file1.txt文件。我们将其作为病毒文件。它有明显的特征,hideDir(“c:\”)函数。正常程序不会把C盘隐藏。

this is virus;
hideDir("c:\");

写一个包含了下列文本的txt。保存为file2.txt文件。

abcdthis is virusefg。

写一个包含了下列文本的txt。保存为file3.txt文件。

12345this is virus6789。

将上述三个文件放置在同一个目录。

编写Yara规则

首先通过分析病毒文件,发现病毒文件包含了hideDir(“c:\”),编写一个简单的规则,其含义为只要包含了hideDir(“c:\”)函数的的则是病毒。然后将其保存为文件。

rule virus
{
    strings:
        $flag = "hideDir(\"c:\\\")"
    condition:
        $flag
}

执行查杀

执行以下命令
clamscan -d 规则目录 病毒存放目录
其中-d标志表示使用自定义规则

执行结果如下图所示

其中file1.txt包含了特征,被表示为YARA.virus.UNOFFICIAL FOUND,说明发现病毒。而其余两个文件没包含,则显示OK,表示没有包含病毒。

查杀未知病毒

制作病毒

写一个包含了下列文本的txt。保存为file1.txt文件。原始病毒文件。

this is virus;
hideDir("c:\");

写一个包含了下列文本的txt。保存为file2.txt文件。该文件是file1的变种,由于作者发现被查杀后。更换了hideDir函数为hideDirEx。

this is virus version 2;
hideDirEx("c:\");

写一个包含了下列文本的txt。保存为file3.txt文件。该文件是file2的变种,由于作者发现被查杀后。又更改了隐藏盘符的实现方式!

this is virus version 3;
changDirAttribute("c","display=no");

将上述文件放置在同一个目录。

编写Yara规则

通过分析上述例子,我们发现,对于单一的特征码形式的查杀,我们都是属于发现病毒,编写规则。那么我们也可以很明显发现特征,这三个病毒都会调用和目录相关的函数,并且都设置为隐藏。那么我们就可以提取出特征,既隐藏盘符的特征码。我们通过查阅计算机接口文档,发现还有一函数hideAllDir()。那么我们提前将其纳入到规则中。

rule virus
{
    strings:
        $flag = "hideDir"
        $flag2 = "hideDirEx"
        $flag3 = "changDirAttribute"
        $flag4 = "hideAllDir"
    condition:
        $flag or $flag2 or $flag3 or $flag4
}

运行后,发现file1原始病毒和变种file2,file3都能查杀。

伪造未知变种

那么上述我们通过已获取到的样本,编写好了规则,并且将一个还未发现的病毒file4类型也纳入了规则中。那么我们现在尝试是否会监测到新添加进去的样本。结果如下图。

可以看到,在我们建立好启发规则后,新病毒也被监测到了。

 

总结

特征码和启发式查杀在免杀制作过程中,需要非常注意的是启发式查杀,因为启发式查杀对壳一类的查杀非常厉害。或者数组中包含PE文件,也会直接被定为为病毒。这就导致了你需要尽量模仿正常PE文件才能绕过查杀。具体会在静态查杀绕过一章介绍方法。

 

绕过

通过前面章节的静态查杀原理学习,我们知道要绕过静态查杀需要绕过两种查杀方式,一种为指定特征码查杀,一种为启发式查杀。

 

环境配置

1.虚拟机安装Kaspersky Endpoint Security 11

 

开始实战

特征码查杀绕过

制作病毒

接下来我们使用Mimikatz作为测试工具,从Mimikatz Release下载处下载Mimikatz,将Mimikatz.exe放入kas中。

如上述所示,会被Kas查杀。

绕过方式

那么接下来我们则使用Github上开源的加密工具来加密。从该地址文件加密工具下载,使用FileCryptAES.exe -e 1234 mimikatz.exe加密后。得到一个加密文件,我们将其放到KAS进行扫描,发现成功绕过。之后使用内存加载,解密执行即可。

特征码查杀绕过总结

对文件反复加密,加密方式可以自选,之后内存解密加载即可

内存加载方式可以使用下列几个项目:

1.https://github.com/aaaddress1/RunPE-In-Memory
2.https://github.com/nettitude/SimplePELoader
3.https://github.com/BenjaminSoelberg/ReflectivePELoader
4.https://github.com/hasherezade/pe_to_shellcode
4.https://github.com/hasherezade/pe_to_shellcode
5.https://github.com/fancycode/MemoryModule
6.https://github.com/Scavanger/MemoryModule.net

注意:
1.这里仅仅是绕过了静态特征码查杀,内存加载后会被动态查杀,具体绕过方式将会在动态一章介绍。
2.对于Xor或base64等加密后特征一致的算法需要多次加密。

 

启发式查杀绕过

制作病毒

下面我们来制作一个最小体积程序。使用Visualstudio创建Win32程序。删除所有资源和窗口。仅仅留下一句MessageBox。看看是否会被查杀。


#include "stdafx.h"
#include "KasHeuristicBypass.h"

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    MessageBox(NULL, TEXT("title"), TEXT("123"), MB_OK);
    return (int) 0;
}

当删除所有资源后。项目工程如下图所示:

之后我们将其拷贝到安装了Kas的虚拟机中。发现会报如下病毒,HEUR:trojan.win32.generic。HEUR指的是启发式查杀,而后面指的是病毒类型,我们的病毒被是被为一个常见的WIN32病毒。

 

绕过方式

还记得我们之前删除的资源和其他的窗体文件吗?将其还原即可,既给我们的病毒程序增加窗体和资源文件既像正常程序该有的我们都有,就很难被启发式查杀了。

启发式绕过总结

模仿正常PE特征。

 

总结

无论是特征码还是启发式,只要不是加载器都可以使用反复加密,内存加载执行来绕过静态查杀

(完)