Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
282 changes: 200 additions & 82 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ def registerExtenderCallbacks(self, callbacks):

callbacks.registerContextMenuFactory(self)
callbacks.registerExtensionStateListener(self)
callbacks.registerScannerCheck(passiveScanner(self))
# callbacks.registerScannerCheck(passiveScanner(self))

# add the custom tab to Burp's UI
callbacks.addSuiteTab(self)
Expand Down Expand Up @@ -661,22 +661,26 @@ def markAnalyzed(self, messageIsRequest, state):
#print "markAnalyzed..."
self._lock.acquire()

method = self.getMethod(messageIsRequest)
url = self.getEndpoint(messageIsRequest)
#这里有bug,应该同时比较method
for item in self._log:
if url == item._url:
if url == item._url and method==self._helpers.analyzeRequest(item._requestResponse).getMethod():
item._analyzed = state
self._lock.release()
return
self._lock.release()
return

# 不能把右键和代理混在一起,不然来源于porxy的非右键流量会覆盖item,存在逻辑错误
# 完美调试通过了
def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
# only process requests

#print "processing httpMessage.."
#print messageIsRequest

print "processHttpMessage toolFlag: " + str(toolFlag)
# print "processHttpMessage toolFlag: " + str(toolFlag)
#print " -- " + str(self._callbacks.getToolName(toolFlag)) + " -- "

if not(self.STATUS):
Expand All @@ -685,28 +689,122 @@ def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
#print "global handler status: (true): " + str(self.GLOBAL_HANDLER)
#print "(processHTTP) messageIsRequest"
#print messageIsRequest
if messageIsRequest and not(self.GLOBAL_HANDLER):
# print "1.5 processHttpMessage droping message"
return

if self.scopeOptionButton.isSelected():
url = self._helpers.analyzeRequest(messageInfo).getUrl()
if not self._callbacks.isInScope(url):
#print 'Url not in scope, skipping.. '
return

url = self.getEndpoint(messageInfo)
method = self.getMethod(messageInfo)

isFromPassiveScan = False
if toolFlag == 1234:
print "1 processHttpMessage: processing passiveScan item"
isFromPassiveScan = True
#print "(processHTTP) before extensions check: " + url

if toolFlag != 1234:
if messageIsRequest and not(self.GLOBAL_HANDLER):
print "1.5 processHttpMessage droping message"
for extension in self.BAD_EXTENSIONS:
if url.endswith(extension):
return

if messageInfo.getResponse():
mime = self._helpers.analyzeResponse(messageInfo.getResponse()).getStatedMimeType()
#print 'Declared mime:' + mime
mime = mime.lower()
if mime in self.BAD_MIMES:
#print 'Bad mime:' + mime
return

#print "[httpMessage] before lock"
# create a new log entry with the message details
self._lock.acquire()

row = self._log.size()

analyzed=False
ined=False


self.GLOBAL_HANDLER=True
self.GLOBAL_HANDLER_ANALYZED=False

try:
for item in self._log:
# print "arrive 735"
if url == item._url:
# print "arrive 737"
if method == self._helpers.analyzeRequest(item._requestResponse).getMethod():
#print 'duplicate URL+method, skipping.. '
# self._lock.release()
# has it been analyzed?
# 非右键的同路径新请求(也就是被动扫描)会覆盖掉所在的item,比如测过的会被刷新为非测过的,不合逻辑,因此这里是个bug
# 已经存在记录表里的话可以直接break
ined=True
analyzed=item._analyzed
self.GLOBAL_HANDLER_ANALYZED = True if analyzed else False
# print "arrive 745"
self.paintItems(messageInfo, item)
# print('paint item with:'+str(analyzed))
break


# 如果在scope里但是没有在log里则创建新的item项
if not ined:
# print "arrive 755"
# print "into not ined but in scope"
messageInfo.setComment(SCOPE_MONITOR_COMMENT)
date = datetime.datetime.fromtimestamp(time.time()).strftime('%H:%M:%S %d %b %Y')
entry = LogEntry(toolFlag, self._callbacks.saveBuffersToTempFiles(messageInfo), url, analyzed, date, method)
#print "toolFlag: " + str(toolFlag)
#print "(processHTTP) Adding URL: " + url
# print("add item with:"+str(analyzed))
self._log.add(entry)
self._fullLog.add(entry)
self.fireTableRowsInserted(row, row)
# print "arrive 766"
self.paintItems(messageInfo, entry)
#注意还原全局标志变量
self.GLOBAL_HANDLER_ANALYZED = False
self.GLOBAL_HANDLER=False
except Exception as e:
# print "772"
print e.message
#异常后也应该释放锁
self._lock.release()

self._lock.release()
#print "columnCoun:" + str(self.logTable.getColumnCount())



# 处理右键相关的message
def processHttpMessageAdvanced(self, toolFlag, messageIsRequest, messageInfo):
# only process requests

#print "processing httpMessage.."
#print messageIsRequest

# print "processHttpMessageAdvanced toolFlag: " + str(toolFlag)
#print " -- " + str(self._callbacks.getToolName(toolFlag)) + " -- "

if not(self.STATUS):
return

#print "global handler status: (true): " + str(self.GLOBAL_HANDLER)
#print "(processHTTP) messageIsRequest"
#print messageIsRequest

if messageIsRequest and not(self.GLOBAL_HANDLER):
# print "1.5 processHttpMessageAdvanced droping message"
return

if self.scopeOptionButton.isSelected():
url = self._helpers.analyzeRequest(messageInfo).getUrl()
if not self._callbacks.isInScope(url):
#print 'Url not in scope, skipping.. '
return

#print "still processing httpMessage.., request came from: " + self._callbacks.getToolName(toolFlag)
if toolFlag == 1234:
print "2 processHttpMessage: processing passiveScan item; setting toolFlag to proxy (4)"
toolFlag = 4

#toolFlag = 4
if ((self._callbacks.getToolName(toolFlag) != "Repeater") and (self._callbacks.getToolName(toolFlag) != "Proxy") and (self._callbacks.getToolName(toolFlag) != "Target")):
#print 'Aborting processHTTP, request came from: ' + str(self._callbacks.getToolName(toolFlag))
Expand Down Expand Up @@ -737,53 +835,54 @@ def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
self._lock.acquire()
row = self._log.size()


for item in self._log:
if url == item._url:
if method == self._helpers.analyzeRequest(item._requestResponse).getMethod():
#print 'duplicate URL+method, skipping.. '
self._lock.release()

# has it been analyzed?
analyzed = False
if self._callbacks.getToolName(toolFlag) == "Repeater":
if self.repeaterOptionButton.isSelected():
try:
for item in self._log:
if url == item._url:
if method == self._helpers.analyzeRequest(item._requestResponse).getMethod():
#print 'duplicate URL+method, skipping.. '
self._lock.release()

# has it been analyzed?
analyzed = False
if self._callbacks.getToolName(toolFlag) == "Repeater":
if self.repeaterOptionButton.isSelected():
analyzed = True
#print "[httpMessage] setting analyzed as true"
if self.GLOBAL_HANDLER_ANALYZED:
analyzed = True
#print "[httpMessage] setting analyzed as true"
if self.GLOBAL_HANDLER_ANALYZED:
analyzed = True

item._analyzed = analyzed
self.paintItems(messageInfo, item)

return
item._analyzed = analyzed
self.paintItems(messageInfo, item)
return

#print "[httpMessage] before setComment"
if not (isFromPassiveScan):
#print "[httpMessage] before setComment"
messageInfo.setComment(SCOPE_MONITOR_COMMENT)
# reached here, must be new entry
analyzed = False
if self._callbacks.getToolName(toolFlag) == "Repeater":
if self.repeaterOptionButton.isSelected():
# reached here, must be new entry
analyzed = False
if self._callbacks.getToolName(toolFlag) == "Repeater":
if self.repeaterOptionButton.isSelected():
analyzed = True
#print "[httpMessage] setting analyzed as true"
if self.GLOBAL_HANDLER_ANALYZED:
analyzed = True
#print "[httpMessage] setting analyzed as true"
if self.GLOBAL_HANDLER_ANALYZED:
analyzed = True

#print "[httpMessage] after comment"
#print 'in httpmessage, response:'
#print self._helpers.analyzeResponse(messageInfo.getResponse())
#print "[httpMessage] after comment"
#print 'in httpmessage, response:'
#print self._helpers.analyzeResponse(messageInfo.getResponse())

date = datetime.datetime.fromtimestamp(time.time()).strftime('%H:%M:%S %d %b %Y')
entry = LogEntry(toolFlag, self._callbacks.saveBuffersToTempFiles(messageInfo), url, analyzed, date, method)
#print "toolFlag: " + str(toolFlag)
date = datetime.datetime.fromtimestamp(time.time()).strftime('%H:%M:%S %d %b %Y')
entry = LogEntry(toolFlag, self._callbacks.saveBuffersToTempFiles(messageInfo), url, analyzed, date, method)
#print "toolFlag: " + str(toolFlag)

#print "(processHTTP) Adding URL: " + url
self._log.add(entry)
self._fullLog.add(entry)
self.fireTableRowsInserted(row, row)
#print "(processHTTP) Adding URL: " + url
self._log.add(entry)
self._fullLog.add(entry)
self.fireTableRowsInserted(row, row)

self.paintItems(messageInfo, entry)
self.paintItems(messageInfo, entry)
except Exception as e:
print e.message
self._lock.release()

self._lock.release()

Expand All @@ -794,18 +893,20 @@ def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
#

def paintItems(self, messageInfo, item):
'''
print "in paint Items"
print "mark color is: (true)" + str(self.markTestedRequestsProxy.isSelected())
print "global handler analyzed: :" + str(self.GLOBAL_HANDLER_ANALYZED)
print "item analyzed should be the same ^^:" + str(item._analyzed)
'''
print "arrive 897: in paint Items"
# print "mark color is: (true)" + str(self.markTestedRequestsProxy.isSelected())
# print "global handler analyzed: :" + str(self.GLOBAL_HANDLER_ANALYZED)
# print "item analyzed should be the same ^^:" + str(item._analyzed)
# print "--------893:"+str(self.GLOBAL_HANDLER_ANALYZED)+"---------------"
if (self.markTestedRequestsProxy.isSelected()) and (item._analyzed and self.GLOBAL_HANDLER_ANALYZED):
messageInfo.setHighlight("green")
# print "---------897:into paint green--------------"
return

if self.markNotTestedRequestsProxy.isSelected() and not(item._analyzed):
messageInfo.setHighlight("red")
# print "---------897:into red green--------------"
# return
# print "--------------903:into exception---------"


def getRowCount(self):
Expand Down Expand Up @@ -1180,26 +1281,42 @@ def __init__(self, extender, state):
def actionPerformed(self, e):
#print "COPY SELECTED URL HANDLER ******"
#print "Status is: " + str(self._state)
# print "into markrequestedshandler"

rows = self._extender.logTable.getSelectedRows()
for row in rows:

model_row = self._extender.logTable.convertRowIndexToModel(row)
url = self._extender._log.get(model_row)._url

#print "Changing url: " + url

### TODO REPLACE FOR MARK_AS_ANALYZED
self._extender._lock.acquire()

for item in self._extender._log:
if url == item._url:
item._analyzed = self._state
self._extender.paintItems(item._requestResponse, item)
#break
try:
for row in rows:
# print "into for"

model_row = self._extender.logTable.convertRowIndexToModel(row)
url = self._extender._log.get(model_row)._url
method =self._extender._log.get(model_row)._method

#print "Changing url: " + url

### TODO REPLACE FOR MARK_AS_ANALYZED
self._extender._lock.acquire()

# print "arrive 1302"
for item in self._extender._log:
if url == item._url and method==item._method:
# print "arrive 1305"
item._analyzed = self._state
# print "arrive 1307: panintitems with",item._analyzed
# 修改即可无须重画会造成死锁,set value的时候会和ColoredTableCellRenderer的触发监听函数造成冲突
# self._extender.paintItems(item._requestResponse, item)
break
# 同步修改对应的log 和 fulllog数据
for item in self._extender._fullLog:
if url == item._url and method==item._method:
# print "arrive 1313"
item._analyzed = self._state
# print "arrive 1315"
self._extender._lock.release()
except Exception as e:
print e.message
self._extender._lock.release()


self._extender.fireTableDataChanged()
#print 'refreshing view ..... *****'

Expand All @@ -1222,13 +1339,13 @@ def actionPerformed(self, e):

if self._menuName == "analyzed":
self._extender.GLOBAL_HANDLER_ANALYZED = True
self._extender.processHttpMessage(4, self._messageInfo, self._messageInfo)
self._extender.processHttpMessageAdvanced(4, self._messageInfo, self._messageInfo)
self._extender.markAnalyzed(self._messageInfo, True)
#start_new_thread(self._extender.sendRequestToAutorizeWork,(self._messageInfo,))

if self._menuName == "not":
self._extender.GLOBAL_HANDLER_ANALYZED = False
self._extender.processHttpMessage(4, self._messageInfo, self._messageInfo)
self._extender.processHttpMessageAdvanced(4, self._messageInfo, self._messageInfo)
self._extender.markAnalyzed(self._messageInfo, False)

self._extender.GLOBAL_HANDLER_ANALYZED = False
Expand All @@ -1240,10 +1357,11 @@ def __init__(self, extender):
self._extender = extender

def doPassiveScan(self, messageInfo):
print "--> passiveScan:"
#print messageInfo
# 4 = "Proxy"
self._extender.processHttpMessage(1234, messageInfo, messageInfo)
pass
# print "--> passiveScan:"
#print messageInfo
# 4 = "Proxy"
# self._extender.processHttpMessageAdvanced(1234, messageInfo, messageInfo)

if __name__ in ('__main__', 'main'):
EventQueue.invokeLater(Run(BurpExtender))