- 作为客户端,使用 Python 调用和控制 Metasploit Framework (MSF) 的功能。 这是最常见的需求,比如用 Python 编写自动化漏洞验证脚本、漏洞扫描器或攻击工具链的一部分。
- 作为开发者,用 Python 编写 Metasploit 漏洞利用模块 (Exploit) 或辅助模块 (Auxiliary)。 这是更深层次的开发,直接为 Metasploit Framework 本身贡献代码。
我会分别详细介绍这两种情况。

使用 Python 调用和控制 Metasploit (推荐)
这是绝大多数开发者的需求,核心思想是让你的 Python 脚本作为一个“客户端”,去连接一个正在运行的 Metasploit 服务(通常是 msfrpcd),然后发送命令来执行任务。
核心工具:msfrpc
Metasploit 提供了一个基于 XML-RPC 的服务接口 msfrpcd,我们可以通过 Python 的 xmlrpc.client 库来与它通信。
步骤 1:启动 Metasploit RPC 服务
-
启动 Metasploit Console: 打开终端,运行
msfconsole。msfconsole
-
启动 RPC 服务器: 在
msfconsole中,使用msfrpc命令来启动 RPC 服务器。
(图片来源网络,侵删)msf > msfrpc -a 127.0.0.1 -p 55553 -U admin -P your_strong_password
-a: RPC 服务器地址 (通常是0.0.1,即本地)-p: RPC 服务器端口 (默认55553,可以自定义)-U: RPC 用户名-P: RPC 密码
启动后,这个服务会在后台持续运行,等待客户端连接。不要关闭这个终端窗口。
步骤 2:编写 Python 客户端脚本
我们来写一个 Python 脚本来连接这个 RPC 服务并执行一些操作,比如列出所有模块、运行一个辅助模块扫描等。
示例代码:msf_client.py
import xmlrpc.client
import time
# --- 配置 Metasploit RPC 服务信息 ---
MSFRPC_SERVER = "http://127.0.0.1:55553"
MSFRPC_USER = "admin"
MSFRPC_PASSWORD = "your_strong_password"
def main():
"""
主函数:连接 MSF RPC 并执行示例操作
"""
try:
# 1. 连接到 RPC 服务器
print(f"[*] 正在连接到 Metasploit RPC: {MSFRPC_SERVER}")
proxy = xmlrpc.client.ServerProxy(MSFRPC_SERVER)
# 2. 登录获取 token
# login 方法返回一个 token,后续所有操作都需要这个 token
token = proxy.auth.login(MSFRPC_USER, MSFRPC_PASSWORD)
print("[+] 登录成功!")
# 3. 示例操作:列出所有模块
print("\n[*] 正在获取所有模块...")
modules = proxy.module.exploits
print(f"[+] 发现 {len(modules)} 个漏洞利用模块。")
# 打印前5个模块作为示例
print("示例模块:")
for module in modules[:5]:
print(f" - {module}")
# 4. 示例操作:运行一个辅助模块扫描
print("\n[*] 正在运行 auxiliary/scanner/smb/smb_version 扫描...")
# console.create() 创建一个新的会话
console_id = proxy.console.create()
print(f"[+] 创建了新的控制台 ID: {console_id}")
# 构造命令
target = "192.168.1.0/24" # <--- 修改成你的目标网段
command = f"use auxiliary/scanner/smb/smb_version\nset RHOSTS {target}\nrun\n"
# 发送命令到控制台
proxy.console.write(console_id, command)
# 等待扫描完成 (这是一个简化的等待,实际项目中可能需要更复杂的逻辑)
print("[*] 等待扫描结果...")
time.sleep(10) # 等待10秒
# 读取控制台输出
output = proxy.console.read(console_id)
print("\n--- 扫描输出 ---")
print(output)
# 关闭控制台
proxy.console.destroy(console_id)
print("[+] 控制台已关闭。")
# 5. 登出
proxy.auth.logout(token)
print("\n[-] 已登出。")
except xmlrpc.client.Fault as e:
print(f"[!] RPC 错误: {e.faultString}")
except ConnectionRefusedError:
print(f"[!] 连接失败!请确保 msfrpcd 服务正在运行在 {MSFRPC_SERVER}")
except Exception as e:
print(f"[!] 发生未知错误: {e}")
if __name__ == "__main__":
main()
如何运行:

- 确保
msfrpcd服务正在运行(参考步骤1)。 - 将上述代码保存为
msf_client.py。 - 重要: 修改代码中的
your_strong_password为你自己的 RPC 密码。 - 运行脚本:
python msf_client.py
你会看到脚本自动连接 MSF,列出模块,并执行一次 SMB 版本扫描。
步骤 3:使用更高级的库 (推荐)
直接使用 xmlrpc.client 比较底层,命令的构造和解析都需要自己处理,社区已经封装了一些更友好的 Python 库,强烈推荐使用它们。
推荐库:python-msfrpc
这是一个专门为 Metasploit RPC 封装的库,使用起来非常方便。
安装:
pip install python-msfrpc
使用示例:
from msfrpc import MSFRPCClient
import time
# 配置信息
MSFRPC_SERVER = "127.0.0.1"
MSFRPC_PORT = 55553
MSFRPC_USER = "admin"
MSFRPC_PASSWORD = "your_strong_password"
def main():
try:
# 1. 创建客户端实例
# MSFRPCClient 会自动处理登录
client = MSFRPCClient(password=MSFRPC_PASSWORD, username=MSFRPC_USER,
server=MSFRPC_SERVER, port=MSFRPC_PORT)
print("[+] 成功连接到 Metasploit RPC!")
# 2. 列出所有模块 (更简单)
exploits = client.modules.exploits
print(f"\n[+] 发现 {len(exploits)} 个漏洞利用模块。")
# 3. 运行扫描 (更简单)
print("\n[*] 正在使用 python-msfrpc 运行 SMB 扫描...")
# client.call() 是一个通用方法,可以直接执行 MSF 命令
# 'execute' 是一个模块,用于执行其他模块
# payload 可以是 'none'
result = client.call('module.execute', {
'module': 'auxiliary/scanner/smb/smb_version',
'target': '192.168.1.1-10', # <--- 修改成你的目标IP范围
'options': {} # 可以在这里设置 RHOSTS 等选项
})
print(f"[+] 扫描任务已提交,任务 ID: {result['job_id']}")
# 4. 获取任务输出
# 我们需要轮询任务的状态来获取结果
time.sleep(5) # 等待一段时间
# jobs.list() 列出所有任务
jobs = client.call('jobs.list')
job_info = None
for job in jobs:
if job['jid'] == result['job_id']:
job_info = job
break
if job_info:
print(f"\n--- 任务 {job_info['name']} 输出 ---")
# job.output 会返回任务的输出列表
for line in client.call('job.output', {'job_id': job_info['jid']}):
print(line)
else:
print("[!] 未找到任务信息。")
except Exception as e:
print(f"[!] 发生错误: {e}")
if __name__ == "__main__":
main()
可以看到,python-msfrpc 库封装了底层的细节,让代码更简洁、更易读。
用 Python 编写 Metasploit 模块
重要前提: 从 Metasploit 6.0 开始,官方只支持 Ruby 语言来编写模块,Python 支持已被移除。
仍然有一些方法可以实现,但这属于高级/非官方的开发方式,不推荐新手尝试,且可能在未来版本中失效。
方法 1:通过 exec 命令 (不推荐,仅作了解)
你可以在一个 Metasploit 模块文件中,使用 Ruby 的 exec 或 system 命令去调用一个外部的 Python 脚本。
Ruby 模块示例 (exploits/test/python_exec.rb):
#
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Auxiliary
include Msf::Exploit::Remote::HTTP::Wordpress
include Msf::Auxiliary::Report
include Msf::Auxiliary::Scanner
def initialize(info = {})
super(
update_info(
info,
'Name' => 'Python Exec Example',
'Description' => 'This module calls an external Python script.',
'Author' => 'Your Name',
'References' => ['URL'],
'License' => => MSF_LICENSE
)
)
register_options([
OptString.new('TARGETURI', [true, 'The base path', '/']),
OptString.new('PYTHON_SCRIPT_PATH', [true, 'Path to the python script on the attacker machine', '/tmp/my_scanner.py'])
])
end
def run
print_status("Executing external Python script: #{datastore['PYTHON_SCRIPT_PATH']}")
# 使用 system 或 exec 调用 Python 脚本
# 注意:这种方式将脚本在 MSF 控制台所在的机器上执行,而不是在目标机器上
output = `python #{datastore['PYTHON_SCRIPT_PATH']}`
if $?.success?
print_good("Script executed successfully. Output:")
print_line(output)
else
print_error("Script execution failed.")
end
end
end
缺点:
- 耦合性高: Ruby 模块和 Python 脚本是分离的,难以管理。
- 功能受限: 无法直接利用 MSF 的强大框架功能(如
RHOSTS、RPORT的自动处理、会话管理等)。 - 非官方: 不受社区支持,升级 MSF 可能会破坏功能。
方法 2:使用第三方扩展 (非常不推荐)
有一些非常古老的第三方扩展(如 metasploit-py)曾经允许用 Python 写模块,但它们早已过时,与现代 MSF 框架不兼容,强烈不建议使用。
总结与建议
| 开发方式 | 优点 | 缺点 | 推荐度 | 适用场景 |
|---|---|---|---|---|
| Python 调用 MSF RPC | 功能强大、灵活、官方支持、易于集成 | 需要额外启动 msfrpcd 服务 |
⭐⭐⭐⭐⭐ | 绝大多数场景,自动化测试、漏洞扫描、定制化攻击工具链。 |
| Ruby 编写 MSF 模块 | 深度集成 MSF 框架、功能最完整 | 需要学习 Ruby 语言 | ⭐⭐⭐⭐ | 为 Metasploit Framework 本身贡献新功能,编写复杂的、可复用的漏洞利用模块。 |
| Python 编写 MSF 模块 | - | 官方不支持、功能受限、维护困难 | ☆☆☆☆☆ | 不推荐,仅作为历史知识了解。 |
给你的最终建议:
- 如果你想用 Python 去自动化 Metasploit 的功能,请毫不犹豫地选择 情况一,使用
python-msfrpc库,这是最标准、最可靠、最灵活的方式。 - 如果你想为 Metasploit Framework 开发新的漏洞利用或辅助模块,请学习 Ruby 语言,虽然这会增加学习成本,但这是唯一受官方支持和维护的正确方式,Python 在这个领域已经不再是首选。
