1

burp_plugin开发

 1 year ago
source link: https://sunny250.github.io/2021/03/30/burp_plugin%E5%BC%80%E5%8F%91/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

burp_plugin开发

0x00 序

由于测试app,需要用到brida,brida的高级功能需要动手写js+bp插件,还是需要单独编写的burp插件,很早就知道burp可以用py开发插件,但从前都是拿来主义(现在也是),毕竟白嫖的不香嘛?但是独立的bp插件又不能都让其他的师傅帮忙,于是就有了此篇文章。

0x01 基础

首先是打开burp的插件官网去看看,上面写的介绍
编写你的第一个burp插件
里面的写法和java很像,都是写一个类。
文中给出了一个可以正常导入而不会报错的一个例子

from burp import IBurpExtender
class BurpExtender(IBurpExtender):
def registerExtenderCallbacks( self, callbacks):
# your extension code here
return

于是跟着这个例子和文中提到的其他接口写出了自己的第一个demo

# -*- coding:utf-8 -*-
from burp import IBurpExtender
from java.io import PrintWriter

class BurpExtender(IBurpExtender):
def registerExtenderCallbacks( self, callbacks):


stdout = PrintWriter(callbacks.getStdout(), True) #取得标准输出流
stderr = PrintWriter(callbacks.getStderr(), True) #取得标准错误流
callbacks.setExtensionName("demo1") #burp插件命名语句

stdout.println("Hello My first demo!")
return

0x02 尝试改写repeate模块的请求

尝试改写repeate发送的数据

  1. 先需要在registerExtenderCallbacks注册一个HttpListener,否则无法调用processHttpMessage函数
    注册代码
    def registerExtenderCallbacks( self, callbacks):
    self._helpers = callbacks.getHelpers()
    self._callbacks = callbacks
    callbacks.setExtensionName("demo2") # burp插件命名语句
    callbacks.registerHttpListener(self) #注册HttpListener
  2. 注册完之后需要调用的函数
    upload_ea0bcbe647e20197a0e864591322e177.png
    toolFlag的定义在这
    upload_d3ffa0b0200f7848b069d0270430537f.png
    用来标记来自burp的哪一个模块,如下代码是只处理来自repeate模块的请求,如果需要处理其他模块的数据包,就在添加几个or if即可。
    def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
    if toolFlag == self._callbacks.TOOL_REPEATER: #处理来自repeate的包
  3. 然后是messageIsRequest参数,用来标记是否发送了请求,发送了就是true
  4. messageInfo参数是需要处理的整个请求的的对象
    查看messageInfo对象可调用参数
    upload_61c34a41aa97972535616fb8084e581d.png
getRequest()  //获取请求的完整信息,返回参数是byte类型
getHttpService() //获取http服务,其中包含的参数是

upload_8d6fed5dd61b33b60aff36598fd7c50e.png

setRequest()//更新请求

后续联动brida插件时还需要用到一下函数

setResponse() //用来修改返回的报文
  1. 还需要用到的函数有
    IExtensionHelpers接口下的
    upload_21f1ff8255e9f90b8cef81c0ce59446c.png
    upload_98437ab52eeef718e040112a3f933b67.png
analyzeRequest()//用来将request请求信息转化方便操作的IHttpInfo对象

IHttpInfo接口所有的函数
upload_ddcbf0e9cc0eb1328dcbc8602fe19807.png

buildRequest()//处理完后构建新的request请求
```

6. 再来说说IHttpInfo接口所包含的函数

getBodyOffset()//函数是获取body部分的开偏移值
getHeaders() //获取header,如果是一个完整的GET,header就是所有的请求部分;如果是一个post请求,header+body就是整个部分。
getParameters() //有好几个接口都有这个函数,但是这个函数吧,不好用,也可能是没学会这个函数的用法。



完整代码如下

```python
# -*- coding:utf-8 -*-
from burp import IBurpExtender
from burp import IHttpListener

class BurpExtender(IBurpExtender,IHttpListener):


def registerExtenderCallbacks( self, callbacks):
self._helpers = callbacks.getHelpers()
self._callbacks = callbacks
callbacks.setExtensionName("demo2") # burp插件命名语句
callbacks.registerHttpListener(self)

def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
if toolFlag == self._callbacks.TOOL_REPEATER: #处理来自repeate的包
if messageIsRequest: #获取请求数据
Httpservice=messageInfo.getHttpService()
para={}
host=Httpservice.getHost() #获取host
port=Httpservice.getPort() #获取端口

raw=messageInfo.getRequest() #获取完整请求信息
analyzeraw=self._helpers.analyzeRequest(raw) #将完整请求转换成IRequestInfo实例
request_header=analyzeraw.getHeaders() #获取请求header


request_body = raw[analyzeraw.getBodyOffset():].tostring() #获取body
print(' HOST:',host,'\n Port: ',port,' \nHeader:',request_header,'\nBody:',request_body) #打印请求

request_header0=request_header[0].split(" ") #分割requestheader第一行
path=request_header0[1] #取中间的参数 /index.php?a=aaa
print(path) #打印path
parastr=path.split("?")[1] # 取参数合集的字符串
paras=parastr.split("&") #将参数用列表保存每一个参数


paras0=paras[0].split("=")[0]+"=new_a" #将第一个参数值替换为 new_a

request_header[0]=request_header[0].replace(paras[0],paras0) #在requests_header中将原参数替换为new_a

print(request_header[0]..tostring()) #打印request_header第一行
http=self._helpers.buildHttpMessage(request_header,request_body) #构建新的http request

print(http.tostring()) # 打印新的http request
messageInfo.setRequest(http) #用新构建的http request更新当前request

在本地起一个php的简易服务器,传入a参数,打印a参数的值
upload_9ba998e3b1f5006b66a9b2a30f472477.png
启用后的效果
upload_809262d9a018f70ca1dde12ea46dfd50.png

下一篇文章将联合brida插件,进行自动加解密。

0x03总结

google,百度了一便,发现直接教python编写burp的插件的文章少得可怜,讲的我也不太看的明白,只好自己去翻burp的doc。一点一点的看,一点一点的学。做开发真的没有提示很容易敲错代码,然后调试调半天,还不知道那里错了。

0x04 参考

https://portswigger.net/burp/extender/api/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK