zoukankan      html  css  js  c++  java
  • [python网络编程]使用scapy修改源IP发送请求

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门

    https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6EmUbbW&id=564564604865

    可以每隔10秒更换ip

     http://www.jb51.net/article/65513.htm

    http://blog.csdn.net/yueguanghaidao/article/details/25246867

    今天同事想测试WAF的页面统计功能,所以需要模拟多个IP向多个域名发送请求,也就是需要修改源IP地址。这个如果使用socket库就比较麻烦了,

    需要使用raw socket,相当麻烦。还好咱有scapy,轻松搞定。

    DOMAIN是我随机构造的域名库,SOURCE也是随机构造的源IP地址。

    [python] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #!/usr/bin/env python  
    2. #-*-encoding:UTF-8-*-  
    3.   
    4. from scapy.all import *  
    5. from threading import Thread  
    6. from Queue import Queue  
    7. import random  
    8. import string  
    9.   
    10.   
    11. USER_AGENTS = (                                               # items used for picking random HTTP User-Agent header value  
    12.     "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7_0; en-US) AppleWebKit/534.21 (KHTML, like Gecko) Chrome/11.0.678.0 Safari/534.21",  
    13.     "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",  
    14.     "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.2) Gecko/20020508 Netscape6/6.1",  
    15.     "Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5",  
    16.     "Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10"  
    17. )  
    18.   
    19. TOP_DOMAIN = ('com','org','net','gov','edu','mil','info','name','biz')  
    20.   
    21. DOMAIN = ["www.%s.%s" %(   
    22.         '.'.join(''.join(random.sample(string.ascii_lowercase, random.randint(2,6))) for x in range(random.randint(1,2))),  
    23.         random.choice(TOP_DOMAIN))  
    24.         for _ in range(100)  
    25. ]  
    26.   
    27.   
    28. SOURCE = ['.'.join((str(random.randint(1,254)) for _ in range(4))) for _ in range(100)]  
    29.   
    30. class Scan(Thread):  
    31.     HTTPSTR = 'GET / HTTP/1.0 Host: %s User-Agent: %s '  
    32.     def run(self):  
    33.         for _ in xrange(100):  
    34.             domain = random.choice(DOMAIN)  
    35.             http = self.HTTPSTR % (domain,random.choice(USER_AGENTS))  
    36.             try:  
    37.                 request = IP(src=random.choice(SOURCE),dst=domain) / TCP(dport=80) / http  
    38.                 #request = IP(dst=domain) / TCP(dport=80) / http  
    39.                 send(request)  
    40.             except:  
    41.                 pass  
    42.             
    43. task = []  
    44. for x in range(10):  
    45.     t = Scan()  
    46.     task.append(t)  
    47.   
    48. for t in task:  
    49.     t.start()  
    50.   
    51. for t in task:  
    52.     t.join()  
    53.   
    54. print 'all task done!'  

    但这将导致一个问题,由于我们域名是随机构造的,发送请求肯定首先查找DNS,很可能解析失败。这里有两个方法解决这个问题:

    1.将所有域名添加到hosts本地文件中,IP可以为服务器地址

    2. 由于hosts文件不支持通配符表示,所以可以使用DNS代理,或者自己写小工具,想怎么解析就怎么解析,这里有一个,http://code.google.com/p/marlon-tools/source/browse/tools/dnsproxy/dnsproxy.py

  • 相关阅读:
    HTML5 WebAudioAPI-实例(二)
    HTML5 WebAudioAPI简介(一)
    HTML5 <Audio/>标签Api整理(二)
    HTML5 <Audio>标签API整理(一)
    CSS3 box-sizing 属性
    CSS3新增Hsl、Hsla、Rgba色彩模式以及透明属性(转)
    CSS3 颜色值HSL表示方式&简单实例
    C#使用Process类调用外部程序(转)
    乐视手机查看运行内存方法、EUI(Eco User Interface)乐视系统查看手机运行内存方法
    HTML5媒体播放说明
  • 原文地址:https://www.cnblogs.com/webRobot/p/5478180.html
Copyright © 2011-2022 走看看