Skip to content

Latest commit

 

History

History
205 lines (165 loc) · 14.8 KB

File metadata and controls

205 lines (165 loc) · 14.8 KB

PyBurp

English Version

PyBurp 是一个 Burp Suite 扩展,提供预定义的 Python 函数用于 HTTP/WebSocket 流量修改、上下文菜单注册、Intruder 负载处理、被动/主动扫描以及 Collaborator 交互。您还可以在 Python 脚本中直接访问 Montoya API

主要特性

  • HTTP 和 WebSocket 流量的动态修改,特别适合处理加密通信
  • 复杂的嵌套 JSON、XML 和 Form/QueryString 转换
  • 强大的参数模糊测试
  • 通过 Chrome DevTools Protocol 或 gRPC 进行远程方法调用

更多特性请参见下面的示例部分。

视频教程

安装

Release下载或直接从 BApp Store 安装,然后从顶部菜单栏打开 PyBurp。

使用指南

构建

./gradlew clean shadowJar 

预定义函数

PyBurp 提供了几个预定义函数,当在脚本中定义时,会自动在 Burp Suite 中注册相应的功能。以下是详细列表:

函数名称 描述
handleRequest(request: HttpRequest, annotations: Annotations) 处理 Burp Suite 和服务器之间的请求
handleResponse(response: HttpResponse, annotations: Annotations) 处理 Burp Suite 和服务器之间的响应
handleProxyRequest(request: HttpRequest, annotations: Annotations) 处理客户端和 Burp Suite 之间的请求
handleProxyResponse(response: HttpResponse, annotations: Annotations) 处理客户端和 Burp Suite 之间的响应
urlPrefixAllowed(prefixes) 设置当前 PyBurp 标签页允许的 URL 前缀
registerContextMenu(menus) 注册自定义上下文菜单项
processPayload(str) 注册自定义 Intruder 负载处理器
handleInteraction(interaction: Interaction) 轮询 Collaborator 服务器
passiveAudit(baseRequestResponse: HttpRequestResponse) 执行被动扫描
activeAudit(baseRequestResponse: HttpRequestResponse, auditInsertionPoint: AuditInsertionPoint) 执行主动扫描
handleWsTextMsg(message: TextMessage) 处理文本 WebSocket 消息
handleWsBinMsg(message: BinaryMessage) 处理二进制 WebSocket 消息
handleProxyWsTextMsg(message: InterceptedTextMessage) 处理代理中的文本 WebSocket 消息
handleProxyWsBinMsg(message: InterceptedBinaryMessage) 处理代理中的二进制 WebSocket 消息
finish() 脚本停止时调用

示例

PyBurp 包含各种示例脚本来展示其功能:

文件 描述
env_init.py 在每个用户脚本执行前自动运行,提供通用类和方法
bambdas.py 从代理历史中快速提取信息
chrome_devtools_protocol.py 远程 Chrome DevTools 方法调用
collaborator.py Collaborator 使用示例
customise_context_menu.py 上下文菜单注册示例
default.py 基本请求/响应修改演示
encryptedCompleteBody.py 完整 HTTP 体加密处理
encryptedCompleteBodyAes.py 完整 HTTP 体的 AES 加密
encryptedJsonParam.py JSON 参数加密处理
encryptedJsonParamRpc.py RPC 处理 JSON 参数加密
encryptedQueryForm.py 查询字符串加密处理
fuzz_params.py 全面的参数模糊测试
highlight_interesting_http.py HTTP 请求/响应高亮
passive_active_scan.py 主动和被动扫描示例
process_intruder_payload.py 自定义 Intruder 负载处理
race_condition.py 竞态条件测试
rpc_debug.py RPC 测试
save_subdomain_to_sqlite.py 从代理历史中收集子域名
signatureHeader.py Header中的签名处理
traffic_redirector.py HTTP 目标重定向
urls_from_file.py 多线程 URL 请求处理
urls_from_file2.py 基于线程池的 URL 请求处理
websocket.py WebSocket 消息处理和修改
use_pip2_packages.py 第三方包使用示例

快速入门

上下文菜单注册

要注册上下文菜单项,定义一个接受菜单集合作为参数的 registerContextMenu 函数。register 方法接受三个参数:菜单名称、关联的函数名称和菜单类型(MenuType)。菜单类型决定了菜单项何时何地出现,以及传递给关联函数的数据。

可用的菜单类型:

  • CARET:在 Repeater 工具的光标位置显示菜单,返回要在光标处插入的字符串
  • SELECTED_TEXT:在文本被选中时显示菜单,处理选中的文本并可以修改它
  • REQUEST:仅在请求上下文中显示菜单,接收当前 HttpRequest 作为参数
  • REQUEST_RESPONSE:仅在请求和响应都可用时显示菜单,接收 HttpRequestResponse 作为参数
  • MESSAGE_EDITOR:在消息编辑器上下文中显示菜单,接收 MessageEditorHttpRequestResponse 参数

使用 MESSAGE_EDITOR 作为菜单类型时,还可以使用以下两个实用方法:

  • getSelectedText(editor),获取选中的文本,返回 ByteArray 实例。
  • replaceSelectedText(editor, "new string"),替换编辑器中的选中文本,返回 HttpRequest 实例。

参见 customise_context_menu.py 获取示例。

RPC 集成

PyBurp 支持通过 gRPC 进行方法调用。您需要实现 burpextender.proto 中定义的服务接口。

对于 Python 用户,服务接口在 pyburp 中实现。使用以下命令安装:

pip install pyburp

以下是 Python 演示:

  1. 使用以下代码运行 RPC 服务器,它提供 test1test2 函数:

    import pyburp
    from base64 import b64encode
    
    def test1(s):
        return b64encode(s)
    
    def test2(i, j):
        return i + j
    
    pyburp.expose(test1)
    pyburp.expose(test2)
    pyburp.run("127.0.0.1:30051")
  2. 在 PyBurp 中运行客户端代码:

    client = rpc("localhost", 30051)
    result1 = client.callFunc('test1', bytearray("123"))
    result2 = client.callFunc('test2', 3, 4)
    print(result1)
    print(result1.tostring()) # 或 print(bytearray(result1))
    print(result2)
    client.shutdown()

注意:

  1. pyburp 仅支持以下参数类型:strboolintfloatbytesNone
  2. 如果服务器端暴露的方法只有一个参数且类型为 bytes,在 PyBurp 中,您需要使用 bytearray 包装参数或将其放在 [] 中;否则,byte[] 将被视为可变长度参数数组,每个字节都被视为单独的参数。
  3. 服务器返回的 bytes 类型在 PyBurp 中是 array.array('b',initializer) 类型,您可以将其视为 byte[],但需要使用 tostring() 而不是 toString() 来转换为字符串。

更多示例请查看 rpc_debug.pyencryptedJsonParamRpc.py。有关与 Frida 交互的示例,请查看 server_frida.py

开发快速入门

项目结构

PyBurp/
├── src/
    ├── main/
        ├── java/
        │   └── io/github/cyal1/pyburp/
        │       ├── PyBurp.java             # 扩展主入口点
        │       ├── PyBurpTab.java          # 扩展标签页实现
        │       ├── PyBurpTabs.java         # 标签页管理
        │       ├── MyHttpHandler.java      # HTTP 请求/响应处理器
        │       ├── MyProxyRequestHandler.java  # 代理请求处理器
        │       ├── MyProxyResponseHandler.java # 代理响应处理器
        │       ├── MyPayloadProcessor.java # Intruder 负载处理器
        │       ├── MyContextMenuItemsProvider.java  # 上下文菜单提供者
        │       ├── MyWebSocketCreatedHandler.java  # WebSocket 处理器
        │       ├── MyProxyWebSocketCreationHandler.java  # 代理 WebSocket 处理器
        │       ├── MyInteractionHandler.java  # Collaborator 交互处理器
        │       ├── MyScanCheck.java        # 扫描器实现
        │       ├── ContentTypeContextMenu.java  # 内容类型菜单处理器
        │       ├── ContentTypeConverter.java  # 内容类型转换
        │       ├── Tools.java              # 工具函数
        │       ├── ComboBoxRenderer.java   # UI 组件
        │       ├── CallFuncClient.java     # gRPC 客户端
        │       ├── CallFuncServiceGrpc.java  # gRPC 服务
        │       ├── Burpextender.java       # 源文件:burpextender.proto
        │       └── poller/                 # 轮询器实现
        └── resources/
            ├── examples/                   # 示例脚本
            └── qs.js                       # https://github.com/ljharb/qs

大部分代码基于 PortSwigger's Burp Extensions Montoya API Examples

贡献

欢迎社区贡献来帮助改进 PyBurp。无论您是修复错误、添加功能还是改进文档,您的帮助都将受到极大的赞赏!以下是我接下来要关注的内容:

  • 简化 HttpRequestEditorProviderHttpResponseEditorProvider 的注册过程
  • 使超链接可点击
  • 创建更好的视频演示
  • 增强错误处理

感谢您的支持和参与!

常见问题

  1. 为什么某些 Python 库或方法不能在 PyBurp 中使用?
    PyBurp 使用 Jython 而不是标准的 CPython,因此并非所有第三方 Python 库都兼容,但它提供了对 Java 库的无缝访问。

  2. 如何在 Jython 中创建 byte[] 兼容的字节数组?
    有三种方法:

    注意,这些方法创建的字节数组应该使用 tostring() 而不是 toString() 来转换为字符串。

致谢

PyBurp 的灵感来自 Turbo Intruder