burp_plugin开发

burp_plugin开发

0x00 序

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

0x01 基础

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# -*- 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函数
    注册代码
    1
    2
    3
    4
    5
    def registerExtenderCallbacks( self, callbacks):
    self._helpers = callbacks.getHelpers()
    self._callbacks = callbacks
    callbacks.setExtensionName("demo2") # burp插件命名语句
    callbacks.registerHttpListener(self) #注册HttpListener
  2. 注册完之后需要调用的函数

    toolFlag的定义在这

    用来标记来自burp的哪一个模块,如下代码是只处理来自repeate模块的请求,如果需要处理其他模块的数据包,就在添加几个or if即可。
    1
    2
    def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
    if toolFlag == self._callbacks.TOOL_REPEATER: #处理来自repeate的包
  3. 然后是messageIsRequest参数,用来标记是否发送了请求,发送了就是true
  4. messageInfo参数是需要处理的整个请求的的对象
    查看messageInfo对象可调用参数
1
2
getRequest()  //获取请求的完整信息,返回参数是byte类型
getHttpService() //获取http服务,其中包含的参数是

1
setRequest()//更新请求

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

1
setResponse() //用来修改返回的报文
  1. 还需要用到的函数有
    IExtensionHelpers接口下的

1
analyzeRequest()//用来将request请求信息转化方便操作的IHttpInfo对象

IHttpInfo接口所有的函数

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54


完整代码如下

```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参数的值

启用后的效果

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

0x03总结

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

0x04 参考

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

  • © 2019-2023 sunny250
  • Hexo Theme Ayer by shenyu
    • PV:
    • UV: