106
 
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
# @Time    : 2019/10/21 9:47
4
# @Author  : xiaodong
5
# @Site    : #获取经过burp的目标的url,用于后续的awvs、bbscan的扫描
6
# @File    : get-link.py
7
# @Software: PyCharm
8
from burp import IBurpExtender
9
from burp import IHttpListener
10
from burp import IHttpRequestResponse
11
from burp import IResponseInfo
12
from burp import IRequestInfo
13
from burp import IHttpService
14
from burp import IScannerCheck
15
from burp import IScannerInsertionPointProvider
16
from burp import IParameter
17
from burp import IScanIssue
18
import string
19
from  array import array
20
import re
21
class BurpExtender(IBurpExtender,IScannerCheck):
22
23
    def registerExtenderCallbacks(self,callbacks):
24
        self._callbacks = callbacks
25
        self._helpers = callbacks.getHelpers()
26
        self._callbacks.registerScannerCheck(self) #注册扫描插件
27
        self._callbacks.setExtensionName("get link")#定义插件的名称
28
        print("whats wrong")
29
    #以上都是标准化程序
30
31
32
33
34
35
    def doPassiveScan(self, baseRequestResponse):
36
        Request = baseRequestResponse.getRequest()
37
        analyzedRequest, reqHeaders, reqBodys, reqMethod, reqParameters= self.get_request_info(Request )
38
        httpService = baseRequestResponse.getHttpService()
39
        host, port, protocol, ishttps, = self.get_server_info(httpService)
40
        targetHost = ['saicmaxus', 'saicmotor', 'maxuscloud']
41
        if (host.split('.')[-3] in  targetHost) or (host.split('.')[-2] in targetHost):#多级或单级或类似baidu.net.cn的形势取主域名字段,比对是否在目标列表中
42
            url = self.get_request_url(protocol,reqHeaders)
43
            print(url)
44
45
    def consolidateDuplicateIssues(self, existingIssue, newIssue):
46
47
        return 0
48
49
    def doActiveScan(self, baseRequestResponse, insertionPoint):
50
            # report the issue
51
            return None
52
53
54
55
    # 获取响应的一些信息:响应头,响应内容,响应状态码
56
    def get_response_info(self, response):
57
        analyzedResponse = self._helpers.analyzeResponse(
58
            response)  # analyzeResponse方法可用于分析HTTP响应,并获取有关它的各种关键详细信息。返回:IResponseInfo可以查询的对象以获取有关响应的详细信息。
59
        resHeaders = analyzedResponse.getHeaders()  # getHeaders方法用于获取响应中包含的HTTP标头。返回:响应中包含的HTTP标头。
60
        resBodys = response[
61
                   analyzedResponse.getBodyOffset():].tostring()  # getBodyOffset方法用于获取消息正文开始的响应中的偏移量。返回:消息正文开始的响应中的偏移量。response[analyzedResponse.getBodyOffset():]获取正文内容
62
        resStatusCode = analyzedResponse.getStatusCode()  # getStatusCode获取响应中包含的HTTP状态代码。返回:响应中包含的HTTP状态代码。
63
        for header in resHeaders:
64
            if 'Content-Length' in header:
65
                resLength = int(header.split(':')[1].strip())  # 我在这里增加了一个返回包长度检测
66
        return resHeaders, resBodys, resStatusCode, resLength
67
68
        # 获取服务端的信息,主机地址,端口,协议
69
    def get_server_info(self, httpService):
70
        host = httpService.getHost()
71
        port = httpService.getPort()
72
        protocol = httpService.getProtocol()
73
        ishttps = False
74
        if protocol == 'https':
75
            ishttps = True
76
        return host, port, protocol, ishttps
77
78
        # 获取请求的参数名、参数值、参数类型(get、post、cookie->用来构造参数时使用)
79
    def get_parameter_Name_Value_Type(self, parameter):
80
        parameterName = parameter.getName()
81
        parameterValue = parameter.getValue()
82
        parameterType = parameter.getType()
83
        return parameterName, parameterValue, parameterType
84
85
        # 获取请求的url
86
87
    def get_request_url(self, protocol, reqHeaders):
88
        link = reqHeaders[0].split(' ')[1]
89
        host = reqHeaders[1].split(' ')[1]
90
        return protocol + '://' + host + link
91
92
    # 保存结果
93
    def save(self, content):
94
        print(content)
95
        f = open('get_link.txt', 'at')
96
        f.writelines(content + '\n\n')
97
        f.close()
98
99
    def get_request_info(self, request):
100
        analyzedRequest = self._helpers.analyzeRequest(
101
            request)  # analyzeRequest用于分析HTTP请求,并获取有关它的各种关键详细信息。生成的IRequestInfo对象
102
        reqHeaders = analyzedRequest.getHeaders()  # 用于获取请求中包含的HTTP头。返回:请求中包含的HTTP标头。
103
        reqBodys = request[analyzedRequest.getBodyOffset():].tostring()  # 获取消息正文开始的请求中的偏移量。返回:消息正文开始的请求中的偏移量。
104
        reqMethod = analyzedRequest.getMethod()  # 获取请求方法
105
        reqParameters = analyzedRequest.getParameters()
106
        return analyzedRequest, reqHeaders, reqBodys, reqMethod, reqParameters