杰瑞科技汇

metasploit 开发python

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

我会分别详细介绍这两种情况。

metasploit 开发python-图1
(图片来源网络,侵删)

使用 Python 调用和控制 Metasploit (推荐)

这是绝大多数开发者的需求,核心思想是让你的 Python 脚本作为一个“客户端”,去连接一个正在运行的 Metasploit 服务(通常是 msfrpcd),然后发送命令来执行任务。

核心工具:msfrpc

Metasploit 提供了一个基于 XML-RPC 的服务接口 msfrpcd,我们可以通过 Python 的 xmlrpc.client 库来与它通信。

步骤 1:启动 Metasploit RPC 服务

  1. 启动 Metasploit Console: 打开终端,运行 msfconsole

    msfconsole
  2. 启动 RPC 服务器:msfconsole 中,使用 msfrpc 命令来启动 RPC 服务器。

    metasploit 开发python-图2
    (图片来源网络,侵删)
    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()

如何运行:

metasploit 开发python-图3
(图片来源网络,侵删)
  1. 确保 msfrpcd 服务正在运行(参考步骤1)。
  2. 将上述代码保存为 msf_client.py
  3. 重要: 修改代码中的 your_strong_password 为你自己的 RPC 密码。
  4. 运行脚本: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 的 execsystem 命令去调用一个外部的 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 的强大框架功能(如 RHOSTSRPORT 的自动处理、会话管理等)。
  • 非官方: 不受社区支持,升级 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 在这个领域已经不再是首选。
分享:
扫描分享到社交APP
上一篇
下一篇