0x0 前言
最近在学习Metasploit相关的东西,主要是基于msfvenom免杀相关的学习,由于免杀技术日新月异,更新速度快。所以本文只抛砖引玉。欢迎各位师傅探讨交流学习。
0x1 Metasploit基础知识
Metasploit Framework 简称msf,是一款开源的渗透测试平台框架,其开源地址位于https://github.com/rapid7/metasploit-framework。Metasploit是跨平台的渗透测试框架,可以运行在windows,linux,macos操作系统下。以kali为例,Metasploit的路径位于/usr/share/metasploit-framework。
lib目录包含metasploit的一些基本库文件,其中值得关注的是msf。这些主要是实现Metasploit的主要代码。
modules目录包含了渗透测试各个环节功能的模块,包含辅助模块(auxiliary),渗透攻击模块(exploits),后渗透攻击模块(post),空指令模块(nops)和编码器模块(encoders)。
还有其他一些目录:plugins,tools,script等也同样重要,可以阅读《Metasploit渗透测试魔鬼训练营》进行了解。
Metasploit的payload(载荷)从传输模式上一共分为3种: singles(独立载荷),stagers(传输器载荷),stage(传输体)。关于这三种载荷的区别很多文章也有提及。
msfvenom是Metasploit的免杀模块,具体使用方法如下:
而现在常见的免杀套路主要是以下几种类型:
- 采用自编码的免杀方案
- 捆绑正常的软件的免杀方案
- 捆绑加自编码的免杀方案
- 多重编码的免杀方案
- 生成shellcode的免杀方案
0x2 我的免杀学习之路
本文采用最常见的payload:windows/meterpreter/reverse_tcp。测试免杀的效果。
首先,采用自编码的免杀方案,这个方案的免杀强度取决于编码器的加密强度。但是随着yara规则的使用,单纯的依靠编码器进行免杀已经很容易被查杀了。
基于捆绑正常软件的免杀方案也有着不错的免杀效果,但是还有继续改进的余地。
使用多编码形式的shellcode生成的msfvenom
然后将其编译成可执行文件,执行,但效果也不是很好
0x3 关于免杀的新思考
当我查看metasploit-framework源码的时候,在%metasploit-framework%/lib/msf/core/payload/windows/reverse_tcp.rb下看到了关于reverse_tcp这个payload的源码,发现实现reverse_tcp的方法很简单。
首先,调用WSAStartup,connect等一系列Windows Socket函数链接主机。
然后调用recv用于接收第二个stage的大小。
接着,调用recv接收第二个stage的内容,然后执行stage。
接下来事情就简单了,我重新仿写了一个stage,因为metasploit通过Hash获取函数地址,虽然Hash值会被加密,但是仍有可能被识别。然后为了减少通过API识别的可能性,我并不想直接调用API函数,或者间接调用API函数,我决定通过仿写GetProcAddress函数,获取各个函数的地址,然后获取第二个Stage并调用。
这并不会触发火绒的警报,并能反弹出一个shell
VT的结果如下。
通过Wireshark抓包,可以看到经过三次握手之后,首先会接收一个四字节的数据,这是stage的大小,然后开辟内存,接收stage的内容。
0x4 基于流量的检测
在上一部分,我们了解到 Metasploit首先会接收四字节的值,然后根据这个值开辟该大小的空间,然后接收Stage的内容。如此的话,可能有人提出,只需要检测网络中的PE数据就可以实现对Metasploit的检测。其实不然,在实网中,数据是杂乱的,有可能数据中也存在白的PE数据,所以不能单纯的检测PE数据来确定。
修改源码即可。def handle_connection(conn, opts={})
https://github.com/rapid7/metasploit-framework/blob/a1eef6a2c194284fe5e90be602eaa6417db51651/lib/msf/core/payload/stager.rb#L172