上集传送 《如何编写burpsuite联动sqlmap的插件》
之前写过burpsuite联动sqlmap的插件,这次是一个信息采集的插件,插件名字是TheMagician。是“渗透测试重心由Windows转移至Mac”计划的一小步。本来想简单写写的,但是越写越麻烦,幸亏基友的鼎力相助,总算顺利完成。
在使用该插件之前需要修改三个全局变量,分别是NMAPPATH,BINGKEY以及HOMEPATH,其他的全局变量不需要改
插件的使用和联动sqlmap插件的一样遵循”简单就是美”的原则通过右键单击最简单的调用
创建右键菜单的源代码
#创建菜单右键 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
三个标签代表三个不同的功能
第一个是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地址扫描结果
C段扫描结果
通过之前的联动sqlmap的插件,实现了三神器:burpsuite,sqlmap和nmap的三位一体化。
当前子域名查询的方案我知道的有三个:一个是通过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)
敏感文件扫描也是信息采集重要的一步,通过文件扫描往往会有有意想不到的收获。第三个功能仿御剑大牛的设计
并发20线程,速度还算说的过去
除此之外这个有个特点就是能完整继承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()
如果时间允许的话,我打算写成一个系列。下次打算写个端口扫描的工具,插件名字是 The High Priestess(女祭司)
完整的源代码在: https://github.com/5ir1us/Tarot/tree/master/s1riu5TheMagician
*本文作者:山东安云(企业账号),转载须注明来自FreeBuf黑客与极客(FreeBuf.COM)