背景:
在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
时间: 2024-10-13 04:22:46