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 获取示例。
PyBurp 支持通过 gRPC 进行方法调用。您需要实现 burpextender.proto 中定义的服务接口。
对于 Python 用户,服务接口在 pyburp 中实现。使用以下命令安装:
pip install pyburp以下是 Python 演示:
-
使用以下代码运行 RPC 服务器,它提供
test1和test2函数: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")
-
在 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()
注意:
- pyburp 仅支持以下参数类型:
str、bool、int、float、bytes、None。 - 如果服务器端暴露的方法只有一个参数且类型为 bytes,在 PyBurp 中,您需要使用 bytearray 包装参数或将其放在
[]中;否则,byte[]将被视为可变长度参数数组,每个字节都被视为单独的参数。 - 服务器返回的
bytes类型在 PyBurp 中是 array.array('b',initializer) 类型,您可以将其视为byte[],但需要使用tostring()而不是toString()来转换为字符串。
更多示例请查看 rpc_debug.py 和 encryptedJsonParamRpc.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。无论您是修复错误、添加功能还是改进文档,您的帮助都将受到极大的赞赏!以下是我接下来要关注的内容:
- 简化
HttpRequestEditorProvider和HttpResponseEditorProvider的注册过程 - 使超链接可点击
- 创建更好的视频演示
- 增强错误处理
感谢您的支持和参与!
-
为什么某些 Python 库或方法不能在 PyBurp 中使用?
PyBurp 使用 Jython 而不是标准的 CPython,因此并非所有第三方 Python 库都兼容,但它提供了对 Java 库的无缝访问。 -
如何在 Jython 中创建
byte[]兼容的字节数组?
有三种方法:bytestring("asdf")bytearray("asdf").getBytes()import array; print(array.array('b', [97, 115, 100, 102]))
注意,这些方法创建的字节数组应该使用
tostring()而不是toString()来转换为字符串。
PyBurp 的灵感来自 Turbo Intruder
