IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Burpsuite插件开发之信息采集插件

    小残发表于 2016-05-19 16:21:46
    love 0

    0×00

    之前写过burpsuite联动sqlmap的插件,这次是一个信息采集的插件,插件名字是TheMagician。是“渗透测试重心由Windows转移至Mac”计划的一小步。本来想简单写写的,但是越写越麻烦,幸亏基友的鼎力相助,总算顺利完成。

    在使用该插件之前需要修改三个全局变量,分别是NMAPPATH,BINGKEY以及HOMEPATH,其他的全局变量不需要改

    14615066118718

    插件的使用和联动sqlmap插件的一样遵循”简单就是美”的原则通过右键单击最简单的调用

    14615071447845

    创建右键菜单的源代码

    #创建菜单右键
        def createMenuItems(self, invocation):
            menu = []
            responses = invocation.getSelectedMessages()
            if len(responses) == 1:
                menu.append(JMenuItem(self._actionName, None, actionPerformed=lambda x, inv=invocation: self.quoteJTab(inv)))
                return menu
            return None

    三个标签代表三个不同的功能

    14615071585836

    0×01 C段端口扫描

    第一个是C段扫描,其中的IP地址继承自Proxy标签中HTTP请求头的host地址,可以是单个IP地址,也可以是一个CIDR。
    鉴于nmap在端口扫描的绝对领袖地位,我并没有自己重写端口扫描引擎,而是通过Python的subprocess库调用nmap。
    Mac在使用之前要首先安装nmap

    brew install nmap

    class NmapScan(threading.Thread):
        def __init__(self):  
            threading.Thread.__init__(self)  
            self.thread_stop = False
            
        def setCommds(self,cmds,Jobject,pcontrol):
            self.runcms=cmds
            self.setobject=Jobject
            self.pcontrol=pcontrol
          
            
        def run(self):
            
            #self.setobject.setResult('Nmap task for '+self.runcms[5]+' is running\n')
            child1 = subprocess.Popen(self.runcms,  stdout = subprocess.PIPE, stdin = subprocess.PIPE, shell = False)
            child1.poll()
            resultScan = child1.stdout.read()
            self.setobject.setResult(resultScan)
     
            #self.setobject.setResult('Nmap task for '+self.runcms[5]+' is finnished\n')
            self.pcontrol.subnum()
            self.stop()
        def stop(self):  
            self.thread_stop = True

    单个IP地址扫描结果

    14615074653524

    C段扫描结果

    14615075592758

    通过之前的联动sqlmap的插件,实现了三神器:burpsuite,sqlmap和nmap的三位一体化。

    0×02 子域名查询

    当前子域名查询的方案我知道的有三个:一个是通过bing的语法查询,第二个是通过二级域名的集合网站,第三个则是进行DNS爆破。
    三种方案比较好的是第三种方案,比较优秀的轮子是subdomainsbrute。当然最好的方法是三种方案全部使用,只需要一个好的去重方式,我这边用的是第一个方案,别问我为什么:写起来简单。

    调用bing的主函数

    def BingSearch(query):
                    payload={}
                    payload['$top']=top
                    payload['$skip']=skip
                    payload['$format']=format
                    payload['Query']="'"+query+"'"
                    url='https://api.datamarket.azure.com/Bing/Search/Web?' + urllib.urlencode(payload)
                    sAuth='Basic '+base64.b64encode(':'+BINGKEY)
                
                    headers = { }
                    headers['Authorization']= sAuth
                    try:
                        req = urllib2.Request(url,headers=headers)
                        response = urllib2.urlopen(req)
                        data=response.read()
                        #print data
                        data=json.loads(data)
                
                        return data
                    except Exception as e:
                        print e
                        #print e.info()
                
                urlList = []
                returnData = BingSearch("domain:" + theTopDomain)
                if not returnData['d']['results']:
                    print "The Url Error"
                else:
                    for tarUrl in returnData["d"]["results"]:
                        tmpUrl = urlparse.urlparse(tarUrl["Url"]).netloc
                        if tmpUrl not in urlList:
                            urlList.append(tmpUrl)

    14615079465072

    0×03 敏感文件扫描

    敏感文件扫描也是信息采集重要的一步,通过文件扫描往往会有有意想不到的收获。第三个功能仿御剑大牛的设计

    14615083523128

    并发20线程,速度还算说的过去

    14615084012262

    除此之外这个有个特点就是能完整继承Proxy标签中的http请求头信息包括ua和cookie

    用的是httplib库,一开始用的是urllib2库,但在burpsuite下多线程并发各种问题,浪费了不少时间

    try:
                connection = httplib.HTTPConnection(self.hostUrl)
                connection.request("GET", self.eachUrl, "", self.theDict)
                time.sleep(0.1)
                response = connection.getresponse()
                if response.status == 200 or response.status == 302 or response.status == 301:
                    theDisMess = "http://" + self.hostUrl+self.eachUrl + "----------" + str(response.status) + os.linesep
                    #print theDisMess
                    self.luoAgain.setResult3(theDisMess)
                if connection:
                    connection.close()
            except :
                if connection:
                    connection.close()
                pass
            finally:
                if connection:
                    connection.close()

    14615085152743

    如果时间允许的话,我打算写成一个系列。下次打算写个端口扫描的工具,插件名字是 The High Priestess(女祭司)
    完整的源代码在:https://github.com/5ir1us/Tarot/tree/master/s1riu5TheMagician
    本文作者:山东安云



沪ICP备19023445号-2号
友情链接