背景:
在WEB安全的學習過程中,了解過了原理之后,就是學習各種Payload,這里面蘊藏着豐富的知識含量,是在基本上覆蓋了漏洞原理之后的進一步深入學習的必經之路。無理是Burpsuite還是Sqlmap、Awvs亦或是其他工具,包括人工收工構造的Payload都有很高的記錄和學習意義,一方面如上所說的提高對WEB安全的掌握和理解,另一方面也對WEB安全自動化測試做積累。
需求:
記錄WEB安全各種報文payload的工具
開發語言:
Python2.7
依賴第三方庫:
pypcap
dpkt
程序邏輯:
配置指定網卡和站定信息,記錄本機對指定站定的滲透過程中所產生的所有報文信息。
支持協議和系統:
目前是1.0.1版本 只支持HTTP/MacOSX
安裝和使用:
無需安裝,只需要安裝好第三方庫支持即可
python PayloadLogger.py -t 192.168.1.1 -p 80 -i eth1 &
程序代碼:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 5 """ 6 基於HTTP的Burpsuite、Sqlmap等的Payload收集器 7 作者:陳然 8 版本:V1.0.1 9 聯系:WeChat-Number -> cr1914518025 10 """ 11 12 13 #腳本信息配置: 14 _author = "陳然" 15 _nicky = "挖洞的土撥鼠" 16 _version = "v1.0.1" 17 _version_string = """\033[0;32m 18 基於HTTP的Burpsuite、Sqlmap等的Payload收集器 19 作者:陳然 20 版本:V1.0.1 21 聯系:WeChat-Number -> cr1914518025 22 操作系統:支持Linux、Unix、MacOS X 23 \033[0m""" 24 25 #引入依賴的庫文見、包 26 import sys 27 import time 28 import pcap 29 import dpkt 30 import urllib 31 import logging 32 import datetime 33 from threading import Thread 34 from optparse import OptionParser 35 36 37 #配置全局設置 38 reload(sys) 39 sys.setdefaultencoding("utf-8") 40 logging.basicConfig(filename="./burpsuite_payload_logger.error.log",level=logging.INFO,filemode='a',format='%(asctime)s-%(levelname)s:%(message)s') 41 42 43 #定義數據報文棧結構 44 class packet_queue(object): 45 """存儲報文的數據結構""" 46 def __init__(self): 47 """創建數據報文結構隊列""" 48 logging.info("創建報文存儲結構") 49 self.size = 0#初始化隊列數目 50 self.packet_list = []#初始化隊列 51 def push(self,packet): 52 """向隊列中追加一個數據報文""" 53 logging.info("添加一個報文信息") 54 self.packet_list.append(packet) 55 self.size += 1#隊列數據報文+1 56 def pop(self): 57 """當隊列中的報文數目多於0個的事后,獲取隊列中的一個數據報文""" 58 logging.info("獲取一個報文信息") 59 if self.size != 0: 60 ret = self.packet_list[0] 61 self.packet_list.remove(self.packet_list[0]) 62 self.size -= 1 63 return ret 64 else: 65 return None 66 def isempty(self): 67 """返回隊列是否為空""" 68 if self.size == 0: 69 return True 70 else: 71 return False 72 73 74 #定義Payload記錄文件類 75 class PayloadFile(object): 76 def __init__(self): 77 self.file = "./PayloadLogger.txt" 78 def logit(self,string): 79 with open(self.file,'a') as fw: 80 logging.info("記錄一個Payload報文數據!") 81 now = str(datetime.datetime.now()) 82 fw.write("^"*150+"\n"+now+"\n"+string+"^"*150+"\n\n\n\n") 83 84 #定義全局變量 85 PacketQueue = packet_queue()#報文存儲隊列 86 PayloadLogging = PayloadFile() 87 88 89 #定義全局函數 90 def http_request_analyst(string): 91 """解HTTP請求報文""" 92 logging.info("分析報文請求") 93 global PayloadLogging 94 PayloadLogging.logit(string) 95 string = string[0:-1] 96 method = string.split(" ")[0] 97 print "\n" 98 print "\033[0;32m^\033[0m"*120 99 print "\033[1;32;40mMethod:%s\033[0m"%str(method) 100 path = string.split(" ")[1] 101 print "\033[1;32;40mPath:%s\033[0m"%str(urllib.unquote(path)) 102 protover = string.split(" ")[2].split("\r\n")[0] 103 print "\033[1;32;40mProtocol Version:%s\033[0m"%str(protover) 104 string = string.replace("HTTP/1.","\\r\\n\\r\\n\\r\\n") 105 headers = string.split("\\r\\n\\r\\n\\r\\n")[-1].split("\r\n\r")[0] 106 for header in headers.split("\r\n")[1:]: 107 header = header.split(":") 108 try: 109 hstr = "%s:%s"%(str(header[0]),str(header[1])) if header[0] not in ["Referer"] else "%s:%s:%s"%(str(header[0]),str(header[1]),str(header[2])) 110 except Exception,reason: 111 logging.error(reason) 112 continue 113 print "\033[1;32;40m%s\033[0m"%hstr 114 print "\033[1;32;40mData:%s\033[0m"%string.split("\\r\\n\\r\\n\\r\\n")[-1].split("\r\n\r")[-1].replace("\n","") 115 print "\033[0;32m^\033[0m"*120 116 print "\n" 117 118 119 #定義Burpsuite報文獲取類 120 class Packet_Sniffer_Filter(Thread): 121 """嗅探並過濾報文""" 122 def __init__(self,destinationip,siteport,iterfacename): 123 """創建報文嗅探器""" 124 logging.info("創建嗅探器") 125 Thread.__init__(self,name="Packet_Sniffer_Filter")#調用父類構造函數 126 self.dip = destinationip#過濾器目的地址 127 self.port = siteport#站點的HTTP服務端口 128 self.name = iterfacename#本機的嗅探網卡名稱 129 self.sniffer = pcap.pcap(name=self.name)#設置嗅探器嗅探指定網卡 130 self.sniffer.setfilter("tcp port %s"%self.port)#初步過濾 131 def run(self): 132 """過濾IP地址""" 133 logging.info("嗅探器線程開始運行") 134 global PacketQueue 135 while True: 136 for packet_time,packet_data in self.sniffer: 137 packet = dpkt.ethernet.Ethernet(packet_data)#使用dpkt解pcap格式報文 138 dip = tuple(map(ord,list(packet.data.dst)))#獲取目的IP地址 139 dip = str(str(dip[0])+"."+str(dip[1])+"."+str(dip[2])+"."+str(dip[3])) 140 logging.info("開始過濾站點") 141 if dip == self.dip:#過濾目的IP地址 142 logging.info("壓入一個站點報文") 143 PacketQueue.push(packet.data.data.data)#加入待分析隊列 144 else: 145 logging.info("過濾一個站點報文") 146 continue 147 148 149 #定義報文分析寫文件類 150 class Packet_Analyst(Thread): 151 """報文分析器""" 152 def __init__(self): 153 """創建報文分析器""" 154 logging.info("創建解析器") 155 Thread.__init__(self,name="Packet_Analyst") 156 def run(self): 157 """分析隊列中的報文""" 158 logging.info("解析器線程開始運行") 159 global PacketQueue 160 while True: 161 while not PacketQueue.isempty(): 162 packet = PacketQueue.pop() 163 logging.info("獲取一個站點報文") 164 if packet == '': 165 continue 166 try: 167 logging.info("解析一個站定報文") 168 http_request_analyst(packet) 169 except Exception,reason: 170 logging.error(reason) 171 continue 172 time.sleep(1) 173 174 175 if __name__ == "__main__": 176 logging.info("程序啟動") 177 parser = OptionParser() 178 parser.add_option("-t","--dstip",dest="target",help="Target Site IP Addresses!") 179 parser.add_option("-p","--port",dest="port",help="Target Site Port!") 180 parser.add_option("-i","--ifname",dest="name",help="Interface Name!") 181 parser.add_option("-v","--version",dest="version",action="store_true",help="Show Version!") 182 parser.add_option("-d","--docs",dest="docs",action="store_true",help="Show Documents!") 183 parser.add_option("-r","--requirments",dest="reqr",action="store_true",help="Show Requriments!") 184 (options, arges) = parser.parse_args() 185 if options.version: 186 print _version_string 187 exit(0) 188 if options.docs: 189 print """\033[0;32m 190 使用手冊--使用於V1.0.1版本 191 [1] python PayloadLogger.py -t 192.168.1.1 -p 80 -i eth1 & 192 \033[0""" 193 exit(0) 194 if options.reqr: 195 print """\033[0;32m 196 [+] sudo pip install pypcap 197 [+] sudo pip install dpkt 198 \033[0""" 199 exit(0) 200 if options.target in ["",None]: 201 logging.info("程序缺乏目標站點地址參數,退出運行!") 202 print "\033[0;31m[-] 請指定目標站點!\033[0m" 203 exit(0) 204 if options.port in ["",None]: 205 logging.info("程序缺乏目標站點端口參數,默認端口80!") 206 print "\033[0;32m[-] 目標站點獲取端口失敗,將使用默認端口80\033[0" 207 options.port = "80" 208 else: 209 try: 210 options.port = int(options.port) 211 options.port = str(options.port) 212 except Exception: 213 logging.info("程序獲取目標站點端口參數錯誤,默認端口80!") 214 print "\033[0;32m[-] 目標站點獲取端口失敗,將使用默認端口80\033[0" 215 options.port = "80" 216 if options.name in ["",None]: 217 logging.info("程序缺乏網卡參數,退出運行!") 218 print "\033[0;31m[-] 請指定網卡\033[0m" 219 exit(0) 220 logging.info("程序初始化") 221 PacketSniffer = Packet_Sniffer_Filter(options.target,options.port,options.name) 222 PacketSniffer.start() 223 PacketAnalyst = Packet_Analyst() 224 PacketAnalyst.start() 225 PacketSniffer.join() 226 PacketAnalyst.join()
運行效果: