如何使用 Metasploit Messagepack RPC
RPC API 使你能够通过基于 HTTP 的远程过程调用(RPC)服务以编程方式控制 Metasploit 框架和商业产品。RPC 服务是一组消息类型和远程方法,提供了外部应用程序与 Web 应用程序交互的结构化方式。你可以使用 RPC 接口本地或远程执行 Metasploit 命令,执行基本任务,如运行模块、与数据库通信、与会话交互、导出数据以及生成报告。
Metasploit 产品主要使用 Ruby 编写,这是使用远程 API 的最简单方式。然而,除了 Ruby 之外,任何支持 HTTPS 和 MessagePack 的语言,如 Python、Java 和 C,也可以用来利用 RPC API。
目前 Metasploit 的 RPC 有两个实现:
- HTTP 和 MessagePack — 本指南将涵盖
- HTTP 和 JSON — 另有指南
请注意,MessagePack 和 JSON RPC 服务提供非常相似的操作,值得查看这两个文档。
一、启动 Messagepack RPC 服务器
在使用 RPC 接口之前,你必须启动 RPC 服务器。根据你使用的 Metasploit 产品,有几种方式可以启动服务器。在此示例中,我们将使用 MSFRPD 登录工具,但其他方法可以在这里找到。
使用以下命令设置用户名和密码,当前示例使用的是用户 user
和密码 pass
:
$ ruby msfrpcd -U <username> -P <pass> -f
二、使用 MSFRPC 登录工具连接
msfrpc 登录工具使你能够通过 msfrpcd 连接到 RPC 服务器。如果你是通过 msfrpcd 工具启动的服务器,作为 Framework 用户,请进入你的框架目录,或者作为 Pro 用户,进入 metasploit/apps/pro/msf3
目录,然后运行以下命令连接到服务器:
$ ruby msfrpc -U <username> -P <pass> -a <ip address>
你可以提供以下选项:
-P <opt>
- 访问 msfrpcd 的密码。-S
- 启用或禁用 RPC 套接字上的 SSL。将此值设置为 true 或 false。默认情况下启用 SSL。-U <opt>
- 访问 msfrpcd 的用户名。-a <opt>
- msfrpcd 运行的地址。-p <opt>
- msfrpc 监听的端口。默认端口是 55553。
例如,如果你想连接到本地服务器,可以输入以下命令:
$ ruby msfrpc -U user -P pass123 -a 127.0.0.1
这将返回以下响应:
[*] exec: ruby msfrpc -U user -P pass123 -a 127.0.0.1
[*] The 'rpc' object holds the RPC client interface
[*] Use rpc.call('group.command') to make RPC calls
三、RPC工作流示例
1、启动服务器
使用以下命令启动服务器,并配置用户名和密码:
$ ruby msfrpcd -U user -P pass -f
2、在第二个终端标签中启动客户端
使用在之前命令中设置的用户名和密码访问客户端:
# Start the client in second terminal tab
$ ruby msfrpc -U user -P pass -a 0.0.0.0
一个交互式提示符将会打开:
[*] The 'rpc' object holds the RPC client interface
[*] Use rpc.call('group.command') to make RPC calls
3、命令
在查看命令之前,我们将列出可以传递给 RPC 调用的选项:
--rpc-host HOST
--rpc-port PORT
--rpc-ssl <true|false>
--rpc-uri URI
--rpc-user USERNAME
--rpc-pass PASSWORD
--rpc-token TOKEN
--rpc-config CONFIG-FILE
--rpc-help
辅助模块示例
要执行 scanner/smb/smb_enumshares
模块:
>> rpc.call("module.execute", "auxiliary", "scanner/smb/smb_enumshares", {"RHOSTS" => "192.168.175.135", "SMBUSER" => "Administrator", "SMBPASS" => "Password1"})
=> {"job_id"=>0, "uuid"=>"yJWES2Y6d4MRyfFLWjqhqvon"}
请注意,结果返回了 job_id
和 uuid
,这些可以用来跟踪模块的进度。
提供的参数包括:
"module.execute"
- 你想要对模块调用的方法"auxiliary"
- 模块类型"scanner/smb/smb_enumshares"
- 你想要运行的具体模块{"RHOSTS" => "192.168.175.135", "SMBUSER" => "Administrator", "SMBPASS" => "Password1"}
- 模块的数据存储选项
查询所有运行状态:
>> rpc.call('module.running_stats')
=> {"waiting"=>[], "running"=>[], "results"=>["yJWES2Y6d4MRyfFLWjqhqvon"]}
请注意,输出包含了先前的 uuid
,现在已被标记为完成。要查看给定 UUID
的模块结果,使用以下命令:
>> rpc.call('module.results', 'yJWES2Y6d4MRyfFLWjqhqvon')
=> {"status"=>"completed", "result"=>nil}
列出当前的工作任务,可以使用以下命令:
>> rpc.call('job.list')
=> {"0"=>"Exploit: windows/smb/ms17_010_psexec"}
列出当前会话,可以使用以下命令:
>> rpc.call('session.list')
=>
{1=>
{"type"=>"meterpreter",
"tunnel_local"=>"192.168.8.125:4444",
"tunnel_peer"=>"192.168.8.125:63504",
"via_exploit"=>"exploit/windows/smb/psexec",
"via_payload"=>"payload/windows/meterpreter/reverse_tcp",
"desc"=>"Meterpreter",
"info"=>"NT AUTHORITY\\SYSTEM @ DC1",
"workspace"=>"false",
"session_host"=>"192.168.175.135",
"session_port"=>445,
"target_host"=>"192.168.175.135",
"username"=>"cgranleese",
"uuid"=>"hqtjjwgx",
"exploit_uuid"=>"hldyog8j",
"routes"=>"",
"arch"=>"x86",
"platform"=>"windows"}}
终止会话
要停止一个活动会话,可以使用 session.stop
命令并传递会话ID。要找到会话ID,可以使用 session.list
命令。
rpc.call('session.stop', 1)
4、示例工作流
让我们看一下使用上面讨论的命令的工作流,了解完整的操作流程。
辅助模块工作流
[*] The 'rpc' object holds the RPC client interface
[*] Use rpc.call('group.command') to make RPC calls
>> rpc.call("module.execute", "auxiliary", "scanner/smb/smb_enumshares", {"RHOSTS" => "xxx.xxx.xxx.xxx", "SMBUSER" => "user", "SMBPASS" => "password"})
=> {"job_id"=>0, "uuid"=>"yJWES2Y6d4MRyfFLWjqhqvon"}
>> rpc.call('module.running_stats')
=> {"waiting"=>[], "running"=>[], "results"=>["yJWES2Y6d4MRyfFLWjqhqvon"]}
>> rpc.call('module.results', 'yJWES2Y6d4MRyfFLWjqhqvon')
=> {"status"=>"completed", "result"=>nil}
漏洞利用模块工作流
这个工作流使用了 module.check
方法来检查目标是否易受该模块的漏洞利用攻击:
[*] The 'rpc' object holds the RPC client interface
[*] Use rpc.call('group.command') to make RPC calls
>> rpc.call("module.check", "exploit", "windows/smb/ms17_010_psexec", {"RHOSTS" => xxx.xxx.xxx.xxx", "SMBUSER" => "user", "SMBPASS" => "password"})
=> {"job_id"=>0, "uuid"=>"q3eewYtM3LqxuVN5ai1Wya3i"}
>> rpc.call('module.running_stats')
=> {"waiting"=>[], "running"=>[], "results"=>["q3eewYtM3LqxuVN5ai1Wya3i"]}
>> rpc.call('module.results', 'q3eewYtM3LqxuVN5ai1Wya3i')
=> {"status"=>"completed", "result"=>{"code"=>"vulnerable", "message"=>"The target is vulnerable.", "reason"=>nil, "details"=>{"os"=>"Windows 8.1 9600", "arch"=>"x64"}}}
module.result
调用显示目标是易受攻击的,并返回了关于目标的附加元数据。