WEB安全番外第六篇--關於通過記錄滲透工具的Payload來總結和學習測試用例


背景:

  在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()

運行效果:

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM