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

img

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

跟进 generate_stage 函数

img

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

img

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

img

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

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

img

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

img

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

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

img

img

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

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

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

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

img

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

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

结语

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

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

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

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

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

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


Linux下Meterpreter执行原理浅析
https://muchangfeng.com/posts/2686102635/
作者
慕长风
发布于
2020年2月3日
许可协议