Linux下Meterpreter执行原理浅析

前言

针对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的生成过程

image

可以看到,以上代码是服务端在连接建立后的相关处理,首先生成第二阶段要用到的payload
image

跟进generate_stage函数

image

继续跟进,在mettle.rb中找到payload生成的关键函数

image

发现是从现有文件中读取得来,定位到目标文件

image

可知,第二阶段用到的主体文件就是这个mettle.bin

注意,此时还未发送该payload,回到前面接着往下看

image

对stage做编码和加密等处理,暂时先不管,继续往下看

image

可以看到,这里发送了midstager,这是第二阶段发送的第一个shellcode

跟进generate_intermediate_stage函数,去看看它的生成过程

image
image

为了方便阅读,我把源码中两函数上下调换了位置

可以看出,midstager是由一段固定的汇编代码生成的shellcode,只是需要的payload长度和入口偏移地址等参数不同

shellcode.rb中的具体生成过程这里就不跟进了

回到最开始的stager.rb继续分析

image

最后就是一些信息的打印和stage的发送了

以上就是第二阶段的一个大致流程

结语

后面的实践中,我简单地提取了几条规则,然后复现了一波并在流量中捕获到了相关特征,证实了我上述分析的正确性

这次针对Meterpreter的分析,原本是为了做恶意流量检测

但是在实际场景中,深入理解其具体的执行流程,可以做更多有意思的事

比如在之前的学习过程中,我看到很多大佬都重写了一些加载器,有的甚至自写了Meterpreter的服务端

到了真正的攻防对抗场景中,只有深入理解攻击原理,才能激发更多有意义的idea

而只有具备扎实的基本功,才有能力将这些idea落地

你可能感兴趣的:(Linux下Meterpreter执行原理浅析)