python插件开发怎么扩展主程序_Python 开发 BurpSuite 插件扩展笔记

List

1.前言

2.加载Python插件扩展

3.官方示例插件扩展解析

3.1 Hello world 示例插件解析

3.2 Event listeners 示例插件解析

3.3 Traffic redirector 示例插件解析

[Tips] 转载请保留原文链接及作者.

0x1 前言

想学一下 Python 编写 BurpSuite 的插件扩展,找不到学习的头绪,在 BurpSuite 官方发现给出了不同语言(java,python,ruby)编写的简单插件示例,这里选择 Python 语言,别问。本文输出官方插件件扩展示例解析,遇到不懂的就查官方的API,然后谷歌翻译来一遍并记录,自己再敲一遍就完事了。

0x2 加载Python插件扩展

下载 jython并在 BurpSuite 的 Extender 的 Options 中配置 jython 环境。

0x3 官方示例插件扩展解析

3.1 Hello world 示例插件解析

查看官方给出的第一个插件示例,这是一个非常简单的扩展,它将一些输出打印到 Burp 中的不同位置。#!/usr/bin/python

# -*- coding: utf-8 -*-

from burp import IBurpExtender

from java.io import PrintWriter

from java.lang import RuntimeException

class BurpExtender(IBurpExtender):

# 所有扩展都必须实现此接口。 实现必须在burp包中称为BurpExtender,必须声明为public,并且必须提供默认(公共,无参数)构造函数。

# implement IBurpExtender

# 实现 IBurpExtender

def registerExtenderCallbacks(self, callbacks):

# registerExtenderCallbacks Burpsuite 加载扩展时,将调用此方法。

# callbacks 参数 - 回调 IBurpExtenderCallbacks 类的对象。

# set our extension name

callbacks.setExtensionName("Hello world extension")

# setExtensionName() 此方法用于设置当前扩展名的显示名称,该名称将显示在扩展器工具的用户界面中。

# obtain our output and error streams

stdout = PrintWriter(callbacks.getStdout(), True)

# getStdout() 此方法用于获取当前扩展的标准输出流。 扩展应该将所有输出写入此流,从而允许Burp用户配置如何在UI中处理该输出。

stderr = PrintWriter(callbacks.getStderr(), True)

# getStderr() 此方法用于获取当前扩展的标准错误流。 扩展程序应将所有错误消息写入此流,从而允许Burp用户配置如何在UI中处理该输出。

# write a message to our output stream

stdout.println("Hello output")

# 成功安装则在标准UI中显示输出 Hello output。

# write a message to our error stream

stderr.println("Hello errors")

# 安装失败则在错误UI中输出 Hello errors。

# write a message to the Burp alerts tab

callbacks.issueAlert("Hello alerts")

# 在Burpsuite 仪表盘事件日志过滤器中的调试输出 Hello alerts。

# throw an exception that will appear in our error stream

raise RuntimeException("Hello exception")

# 当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行。

3.2 Event listeners 示例插件解析

此扩展为各种运行时事件注册侦听器,并在每个事件发生时打印消息。#!/usr/bin/python

# -*- coding: utf-8 -*-

from burp import IBurpExtender

from burp import IHttpListener

from burp import IProxyListener

from burp import IScannerListener

from burp import IExtensionStateListener

from java.io import PrintWriter

class BurpExtender(IBurpExtender, IHttpListener, IProxyListener, IScannerListener, IExtensionStateListener):

# 所有扩展都必须实现此接口。 实现必须在burp包中称为BurpExtender,必须声明为public,并且必须提供默认(公共,无参数)构造函数。

# implement IBurpExtender

# 实现 IBurpExtender

def registerExtenderCallbacks(self, callbacks):

# keep a reference to our callbacks object

self._callbacks = callbacks

# set our extension name

callbacks.setExtensionName("Event listeners")

# setExtensionName() 此方法用于设置当前扩展名的显示名称,该名称将显示在扩展器工具的用户界面中。

# obtain our output stream

self._stdout = PrintWriter(callbacks.getStdout(), True)

# getStdout() 此方法用于获取当前扩展的标准输出流。 扩展应该将所有输出写入此流,从而允许Burp用户配置如何在UI中处理该输出。

# register ourselves as an HTTP listener

callbacks.registerHttpListener(self)

# registerHttpListener() 此方法用于注册一个侦听器,该侦听器将被通知任何Burp工具发出的请求和响应。

# register ourselves as a Proxy listener

callbacks.registerProxyListener(self)

# registerProxyListener() 此方法用于注册一个侦听器,该侦听器将收到有关代理工具正在处理的请求和响应的通知。

# register ourselves as a Scanner listener

callbacks.registerScannerListener(self)

# registerScannerListener() 此方法用于注册一个侦听器,该侦听器将被通知由扫描程序工具报告的新问题。 扩展程序可以通过注册扫描器侦听器来执行自定义分析或记录扫描器问题。

# register ourselves as an extension state listener

callbacks.registerExtensionStateListener(self)

# registerExtensionStateListener() 此方法用于注册一个侦听器,该侦听器将收到有关扩展状态更改的通知。

#

# implement IHttpListener

# 当即将发出HTTP请求时,以及在收到HTTP响应时,将调用此方法。

def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):

# messageIsRequest boolean 标记是否正在为请求或响应调用该方法,输出1为请求,0为响应。

# self._stdout.println(messageIsRequest)

self._stdout.println(

("HTTP request to " if messageIsRequest else "HTTP response from ") +

messageInfo.getHttpService().toString() +

" [" + self._callbacks.getToolName(toolFlag) + "]")

# toolFlag int 指示发出请求的Burp工具的标志。Burp工具标志在IBurpExtenderCallbacks接口中定义。

# callbacks.getToolName 此方法用于获取由提供的工具标志标识的Burp工具的描述性名称。

# messageInfo 要处理的请求/响应的详细信息。扩展可以调用这个对象上的setter方法来更新当前消息,从而修改Burp的行为。

# getHttpService() 此方法用于检索此请求/响应的HTTP服务。

# java toString() 方法返回此对象本身(它已经是一个字符串)。

# self._stdout.println(messageInfo.getHttpService().toString()) 输出请求的host http://127.0.0.1

#

# implement IProxyListener

# 当代理正在处理HTTP消息时,将调用此方法。

def processProxyMessage(self, messageIsRequest, message):

# messageIsRequest boolean 标记是否正在为请求或响应调用该方法,输出1为请求,0为响应。

self._stdout.println(

("Proxy request to " if messageIsRequest else "Proxy response from ") +

message.getMessageInfo().getHttpService().toString())

# self._stdout.println(messageInfo.getHttpService().toString()) 输出请求的host http://127.0.0.1

#

# implement IScannerListener

# 将新问题添加到Burp Scanner的结果时,将调用此方法。

def newScanIssue(self, issue):

self._stdout.println("New scan issue: " + issue.getIssueName())

# issue 扩展程序可以查询的IScanIssue对象,以获取有关新问题的详细信息。

# getIssueName() 此方法返回问题类型的名称。

#

# implement IExtensionStateListener

#

def extensionUnloaded(self):

# 卸载扩展时调用此方法。

self._stdout.println("Extension was unloaded")

3.3 Traffic redirector 示例插件解析

该扩展将所有出站请求从一台主机重定向到另一台。#!/usr/bin/python

# -*- coding: utf-8 -*-

from burp import IBurpExtender

from burp import IHttpListener

HOST_FROM = "www.secbook.com"

HOST_TO = "www.baidu.com"

class BurpExtender(IBurpExtender, IHttpListener):

#

# implement IBurpExtender

# 实现 IBurpExtender

def registerExtenderCallbacks(self, callbacks):

# obtain an extension helpers object

self._helpers = callbacks.getHelpers()

# getHelpers() 此方法用于获取IExtensionHelpers对象,扩展可使用该对象执行许多有用的任务。

# set our extension name

callbacks.setExtensionName("Traffic redirector")

# setExtensionName() 此方法用于设置当前扩展名的显示名称,该名称将显示在扩展器工具的用户界面中。

# register ourselves as an HTTP listener

callbacks.registerHttpListener(self)

# registerHttpListener() 此方法用于注册一个侦听器,该侦听器将被通知任何Burp工具发出的请求和响应。

#

# implement IHttpListener

# 实现 IHttpListener

def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):

# only process requests

if not messageIsRequest:

# # 判断如果返回响应则结束该函数。

return

# get the HTTP service for the request

# 获取请求的HTTP服务

httpService = messageInfo.getHttpService()

# getHttpService() 此方法用于检索此请求/响应的HTTP服务。

# if the host is HOST_FROM, change it to HOST_TO

# 如果 host 为 HOST_FROM ,就更改为 HOST_TO

if (HOST_FROM == httpService.getHost()):

# httpService.getHost() 此方法返回服务的主机名或IP地址。

# This method returns the hostname or IP address for the service.

messageInfo.setHttpService(self._helpers.buildHttpService(HOST_TO,

httpService.getPort(), httpService.getProtocol()))

# setHttpService() 此方法用于更新此请求/响应的HTTP服务。

# buildHttpService() 此方法根据提供的详细信息构造IHttpService对象。

# httpService.getPort() 此方法返回服务的端口号。

# httpService.getProtocol() 此方法返回服务的协议。预期值为"http"或"https"。

这里不够明显还记得Event listeners 示例插件吗?

它会将各种运行时的事件打印出来。

可以看到请求的Host为 www.secbook.info 域名返回HTTP信息的则是 www.baidu.com 返回。

Traffic redirector 该插件扩展强制修改了HTTP请求包中的 Host 来达到重定向的效果。

0x3 待更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值