Metasploit payloads模块理解


一、payloads 的使用

继续来看永恒之蓝的漏洞利用过程:

search ms17-010
use exploit/windows/smb/ms17_010_eternalblue
set RHOST 目标ip`
run
shell

use该模块后,options一下
在这里插入图片描述
可以看到,它已经默认为我们设置了一个payload。在该模块上下文中,可以使用set payload来设置我们想用的payload,也可以show payloads,根据显示的编号进行set
show payloads
在这里插入图片描述

二、payload是什么

payload

  • payload,中文“有效载荷”,指成功exploit之后,真正在目标系统执行的代码或指令
  • shellcode,是payload的一种,由于其建立正向/反向shell二得名

这是百度中比较多的说法,直接看《0day安全软件漏洞分析技术》中解释,会比较明白。

    1996 年,Aleph One 在 Underground 发表了著名论文 Smashing the Stack for Fun and Profit, 其中详细描述了 Linux 系统中栈的结构和如何利用基于栈的缓冲区溢出。在这篇具有划时代意义的论文中,Aleph One 演示了如何向进程中植入一段用于获得 shell 的代码,并在论文中称这段被植入进程的代码为“shellcode” 。
后来人们干脆统一用 shellcode 这个专用术语来通称缓冲区溢出攻击中植入进程的代码。这段代码可以是出于恶作剧目的的弹出一个消息框, 也可以是出于攻击目的的删改重要文件、 窃取数据、上传木马病毒并运行,甚至是出于破坏目的的格式化硬盘等。请注意本章讨论的 shellcode 是这种广义上的植入进程的代码,而不是狭义上的仅仅用来获得 shell 的代码。
    shellcode 往往需要用汇编语言编写,并转换成二进制机器码,其内容和长度经常还会受到很多苛刻限制,故开发和调试的难度很高。
    在技术文献中,我们还会经常看到另一个术语——exploit。
    植入代码之前需要做大量的调试工作,例如,弄清楚程序有几个输入点,这些输入将最终会当作哪个函数的第几个参数读入到内存的哪一个区域,哪一个输入会造成栈溢出,在复制到栈区的时候对这些数据有没有额外的限制等。 调试之后还要计算函数返回地址距离缓冲区的偏移并淹没之,选择指令的地址,最终制作出一个有攻击效果的“承载”着 shellcode 的输入字符串。这个代码植入的过程就是漏洞利用,也就是 exploit。
    exploit 一般以一段代码的形式出现, 用于生成攻击性的网络数据包或者其他形式的攻击性输入。exploit 的核心是淹没返回地址, 劫持进程的控制权, 之后跳转去执行 shellcode。 与 shellcode 具有一定的通用性不同,exploit 往往是针对特定漏洞而言的。
    其实,漏洞利用的过程就好像一枚导弹飞向目标的过程。导弹的设计者关注的是怎样计算飞行路线,锁定目标,最终把弹头精确地运载到目的地并引爆,而并不关心所承载的弹头到底是用来在地上砸一个坑的铅球, 还是用来毁灭一个国家的核弹头; 这就如同 exploit 关心的是怎样淹没返回地址, 获得进程控制权, 把 EIP 传递给 shellcode 让其得到执行并发挥作用, 而不关心 shellcode 到底是弹出一个消息框的恶作剧, 还是用于格式化对方硬盘的穷凶极恶的代码
    随着现代化软件开发技术的发展,模块化、封装、代码重用等思想在漏洞利用技术中也得以体现。试想如果仿照武器的设计思想,分开设计导弹和弹头,将各自的技术细节封装起来, 使用标准化的接口, 漏洞利用的过程是不是会更容易些呢?其实在第 4 章中将介绍到的通用漏洞测试平台 Metasploit 就是利用了这种观点。Metasploit 通过规范化 exploit 和 shellcode 之间的接口把漏洞利用的过程封装成易用的模块, 大大减少了 expliot 开发过程中的重复工作, 深刻体现了代码重用和模块化、结构化的思想。在这个平台中:
    (1) 所有的 exploit 都使用漏洞名称来命名, 里边包含有这个漏洞的函数返回地址, 所使用的跳转指令地址等关键信息。
    (2)将常用的 shellcode(例如,用于绑定端口反向连接、执行任意命令等)封装成一个个通用的模块,可以轻易地与任意漏洞的 exploit 进行组合。

读完上面的引用,我们应该理解:

  1. payload就是shellcode,即我们植入的指令。
  2. Exploits模块和Payloads模块是软件开发中解耦思想的应用
  3. Payloads模块就是一个包含很多shellcode/payload的库。

shellcode的编写

正如上述,shellcode

  1. 独立的存在,无需任何格式的包装。
  2. 内存中运行,无需固定指定的宿主进程。
    在这里插入图片描述

我们可以使用C语言编写shellcode(取消编译器的各类优化),然后从生成的可执行文件中提取shellcode(正如上图所示)。也可以直接使用汇编语言谢shellcode,因为汇编语言直接面向机器编程。

三、MSF的Payloads模块

Metasploit提供了发送不同payload的能力,这些payload可以在目标系统上打开shell。MSF的payload模块位于modules/payloads{adapter,singles,stagers,stages}/platform>>,4个目录对应4种payload:

  • adapter:adapter封装single payloads以将它们转换为不同的格式。例如,可以将普通的单个有效负载single payload包装在Powershell适配器中,这将生成一个Powershell命令来执行该有效负载。
  • singles:可独立运行的payload(添加用户,启动notepad.exe等),不需要下载额外的组件来运行。
  • stagers:负责建立Metasploit与目标系统之间的连接通道。在处理分阶段payload时非常有用。“分阶段payload”将首先在目标系统上上传一个stager,然后下载剩余的payload(stage)。这提供了一些优势,因为与一次发送的完整payload相比,payload的初始大小相对较小。
  • stages:由stagers下载,这将允许你使用更大的payload

Payload的名称也揭示了其类型,如下所示:

  • Staged payloads:platform>/ [arch] / stage> / stager>
  • Single payloads:platform>/ [arch] / single>

windows/ x64 / meterpreter / reverse_tcp这样的payload。分离出来,平台是windows,架构是x64,我们投递的最终的stagemeterpreter,而传递它的stagerreverse_tcp

arch是可选的,因为在某些情况下,它是不必要或者已经默认了。比如php/ meterpreter / reverse_tcp。PHP的payload不需要Arch,因为我们提供的是解释代码而不是二进制代码。

四、MSF模块功能

在这里插入图片描述

参考

[1] https://www.freebuf.com/articles/network/263010.html
[2] https://docs.metasploit.com/docs/using-metasploit/basics/how-payloads-work.html
[3] https://www.cobaltstrike.com/blog/staged-payloads-what-pen-testers-should-know/
[4] https://www.offsec.com/metasploit-unleashed/payloads/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值