• 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 = """33[0;32m
     18             基于HTTP的Burpsuite、Sqlmap等的Payload收集器
     19             作者:陈然
     20             版本:V1.0.1
     21             联系:WeChat-Number -> cr1914518025
     22             操作系统:支持Linux、Unix、MacOS X
     23 33[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+"
    "+now+"
    "+string+"^"*150+"
    
    
    
    ")
     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 "
    "
     98     print "33[0;32m^33[0m"*120
     99     print "33[1;32;40mMethod:%s33[0m"%str(method)
    100     path = string.split(" ")[1]
    101     print "33[1;32;40mPath:%s33[0m"%str(urllib.unquote(path))
    102     protover = string.split(" ")[2].split("
    ")[0]
    103     print "33[1;32;40mProtocol Version:%s33[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("
    
    ")[0]
    106     for header in headers.split("
    ")[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 "33[1;32;40m%s33[0m"%hstr
    114     print "33[1;32;40mData:%s33[0m"%string.split("\r\n\r\n\r\n")[-1].split("
    
    ")[-1].replace("
    ","")
    115     print "33[0;32m^33[0m"*120
    116     print "
    "
    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 """33[0;32m
    190             使用手册--使用于V1.0.1版本
    191             [1] python PayloadLogger.py -t 192.168.1.1 -p 80 -i eth1 &
    192         33[0"""
    193         exit(0)
    194     if options.reqr:
    195         print """33[0;32m
    196             [+] sudo pip install pypcap
    197             [+] sudo pip install dpkt
    198         33[0"""
    199         exit(0)
    200     if options.target in ["",None]:
    201         logging.info("程序缺乏目标站点地址参数,退出运行!")
    202         print "33[0;31m[-] 请指定目标站点!33[0m"
    203         exit(0)
    204     if options.port in ["",None]:
    205         logging.info("程序缺乏目标站点端口参数,默认端口80!")
    206         print "33[0;32m[-] 目标站点获取端口失败,将使用默认端口8033[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 "33[0;32m[-] 目标站点获取端口失败,将使用默认端口8033[0"
    215             options.port = "80"
    216     if options.name in ["",None]:
    217         logging.info("程序缺乏网卡参数,退出运行!")
    218         print "33[0;31m[-] 请指定网卡33[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()

    运行效果:

      

  • 相关阅读:
    布局重用 include merge ViewStub
    AS 常用插件 MD
    AS 2.0新功能 Instant Run
    AS .ignore插件 忽略文件
    AS Gradle构建工具与Android plugin插件【大全】
    如何开通www国际域名个人网站
    倒计时实现方案总结 Timer Handler
    AS 进行单元测试
    RxJava 设计理念 观察者模式 Observable lambdas MD
    retrofit okhttp RxJava bk Gson Lambda 综合示例【配置】
  • 原文地址:https://www.cnblogs.com/KevinGeorge/p/8650367.html
Copyright © 2020-2023  润新知