前言
针对Meterpreter的投递流程和原理分析,网上已有一部分相关资料了
但是大多是基于Windows系统,Linux下的分析资料好像并不全面。
为此,我从源码入手,简单的分析了Linux下Meterpreter的生成和执行流程,以下记录了部分过程
说明
研究对象: linux/x86/meterpreter/reverse_tcp
这种staged类型的payload,攻击过程通常是先由服务端生成一段shellcode
接着可以选择msf自带的各种shellcode_loader,不过其特征都太明显,通常都是自己去对shellcode做免杀
在我这篇博客中就提到过一种简单的技巧 —— 记一则免杀技巧
Meterpreter的执行流程主要分两个阶段,第一阶段就是上述shellcode的执行
这段shellcode也被称作stager,其作用只是简单的与服务端建立连接,然后开始接受第二阶段服务端发送的stage并执行
针对这段shellcode网上已经有很多很详细的分析资料了,感兴趣的可以自行查阅
下面我主要从源码分析第二阶段的执行流程
先简单的提一下
Stage部分由两个文件组成,一段shellcode和一份ELF格式的可执行文件
后者是C编写的跨平台的meterpreter,在新版的msf中被称作mettle,而该shellcode可以看成是mettel的加载器
开始
直接进入相关代码来看stage的生成过程
跟进generate_stage函数
继续跟进,在mettle.rb中找到payload生成的关键函数
发现是从现有文件中读取得来,定位到目标文件
可知,第二阶段用到的主体文件就是这个mettle.bin
注意,此时还未发送该payload,回到前面接着往下看
对stage做编码和加密等处理,暂时先不管,继续往下看
可以看到,这里发送了midstager,这是第二阶段发送的第一个shellcode
跟进generate_intermediate_stage函数,去看看它的生成过程
为了方便阅读,我把源码中两函数上下调换了位置
可以看出,midstager是由一段固定的汇编代码生成的shellcode,只是需要的payload长度和入口偏移地址等参数不同
shellcode.rb中的具体生成过程这里就不跟进了
回到最开始的stager.rb继续分析
最后就是一些信息的打印和stage的发送了
以上就是第二阶段的一个大致流程
结语
后面的实践中,我简单地提取了几条规则,然后复现了一波并在流量中捕获到了相关特征,证实了我上述分析的正确性
这次针对Meterpreter的分析,原本是为了做恶意流量检测
但是在实际场景中,深入理解其具体的执行流程,可以做更多有意思的事
比如在之前的学习过程中,我看到很多大佬都重写了一些加载器,有的甚至自写了Meterpreter的服务端
到了真正的攻防对抗场景中,只有深入理解攻击原理,才能激发更多有意义的idea
而只有具备扎实的基本功,才有能力将这些idea落地