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

运行效果:

 

  

 

转载于:https://www.cnblogs.com/KevinGeorge/p/8650367.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值