本文實例講述了Python基于scapy實現修改IP發送請求的方法。分享給大家供大家參考,具體如下:
今天同事想測試WAF的頁面統計功能,所以需要模擬多個IP向多個域名發送請求,也就是需要修改源IP地址。這個如果使用socket庫就比較麻煩了,
需要使用raw socket,相當麻煩。還好咱有scapy,輕松搞定。
DOMAIN是我隨機構造的域名庫,SOURCE也是隨機構造的源IP地址。
#!/usr/bin/env python#-*-encoding:UTF-8-*-from scapy.all import *from threading import Threadfrom Queue import Queueimport randomimport stringUSER_AGENTS = ( # items used for picking random HTTP User-Agent header value "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", "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.2) Gecko/20020508 Netscape6/6.1", "Mozilla/5.0 (X11;U; Linux i686; en-GB; rv:1.9.1) Gecko/20090624 Ubuntu/9.04 (jaunty) Firefox/3.5", "Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10")TOP_DOMAIN = ('com','org','net','gov','edu','mil','info','name','biz')DOMAIN = ["www.%s.%s" %( '.'.join(''.join(random.sample(string.ascii_lowercase, random.randint(2,6))) for x in range(random.randint(1,2))), random.choice(TOP_DOMAIN)) for _ in range(100)]SOURCE = ['.'.join((str(random.randint(1,254)) for _ in range(4))) for _ in range(100)]class Scan(Thread): HTTPSTR = 'GET / HTTP/1.0/r/nHost: %s/r/nUser-Agent: %s/r/n/r/n' def run(self): for _ in xrange(100): domain = random.choice(DOMAIN) http = self.HTTPSTR % (domain,random.choice(USER_AGENTS)) try: request = IP(src=random.choice(SOURCE),dst=domain) / TCP(dport=80) / http #request = IP(dst=domain) / TCP(dport=80) / http send(request) except: passtask = []for x in range(10): t = Scan() task.append(t)for t in task: t.start()for t in task: t.join()print 'all task done!'但這將導致一個問題,由于我們域名是隨機構造的,發送請求肯定首先查找DNS,很可能解析失敗。這里有兩個方法解決這個問題:
1.將所有域名添加到hosts本地文件中,IP可以為服務器地址
2. 由于hosts文件不支持通配符表示,所以可以使用DNS代理,或者自己寫小工具,想怎么解析就怎么解析,這里有一個https://github.com/phuslu/dnsproxy/blob/master/dnsproxy.py
希望本文所述對大家Python程序設計有所幫助。
新聞熱點
疑難解答