Python利用Scapy修改源IP发送HTTP请求
本文介绍如何使用Python的Scapy库轻松修改数据包源IP地址,以模拟多个IP向域名发送HTTP请求。针对随机域名解析失败的问题,提供了添加本地hosts文件或配置DNS代理两种解决方案,帮助开发者高效进行WAF功能测试。
本文详细介绍了一种基于Python Scapy库修改IP地址并发送网络请求的实现方法,供读者参考学习。
使用Scapy修改源IP
近期有同事需要测试WAF(Web应用防火墙)的页面统计功能,这要求模拟来自多个不同IP地址的请求访问多个域名,即需要动态修改数据包的源IP地址。若使用传统的socket库,需操作raw socket,实现过程较为复杂繁琐。
借助Scapy库,可以简化这一过程,轻松完成源IP的修改与请求发送。
代码示例中,DOMAIN变量代表随机生成的域名库,SOURCE变量代表随机生成的源IP地址池。
#!/usr/bin/env python
#-*-encoding:UTF-8-*-
from scapy.all import *
from threading import Thread
from Queue import Queue
import random
import string
USER_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:
pass
task = []
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解析,这极易导致解析失败。为解决此问题,可采用以下两种方案:
第一种方案是将所有测试域名添加到操作系统的本地hosts文件中,对应的IP地址可指向目标服务器地址。
第二种方案是利用DNS代理或自行开发解析工具,因为hosts文件不支持通配符。这里推荐一个开源项目:https://github.com/phuslu/dnsproxy/blob/master/dnsproxy.py,可根据需求灵活配置解析规则。
如需了解更多Python相关知识,可查看本站相关专题,包括《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。
希望本文提供的解决方案对您的Python编程实践有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













