scapy发包工具
导包
| from scapy.all import *
from scapy.layers.inet import *
from scapy.layers.l2 import *
from scapy.packet import ls
from faker import Faker
|
伪造一个IPv4地址
| fake = Faker(locale='zh-cn')
ipv4addr = fake.ipv4(network=False, address_class=None, private=None)
|
############################################################################# 下方为生成报文的三个例子
生成一个TCP syn报文
| # 任意源IP地址
packet = IP(src = ipv4addr,dst='8.8.8.8',ttl=18) /UDP(sport=8800,dport=80) / Raw(load=b'hellow i am Zorro')
# 随机生成6个报文
packet2 = IP(dst='10.44.3.3',ttl=18)/TCP(sport=[random.randint(1,65535) for _ in range(2)],dport=80,flags='S')
# ICMP请求报文
packet3 = IP(dst="8.8.8.8")/ICMP()
|
常用发包方式 1 - 发包并校验首个响应
| ## 指定接口发送并记录第一个响应报文(一直等待响应)
rec = sr1(packet3,iface="MIBO")
## 打印响应报文
ipdst = rec[IP].dst
print(f"收到的响应报文的目的地址是 => {ipdst}")
## 打印响应报文的全部细节
ls(rec)
## 保存收到的报文
wrpcap("rec.cap",rec)
可以直接把保存的包导入
pkts = rdpcap("rec.cap")
pkts = sniff(offline="rec.cap")
|
常用发包方式 2 - 发包并校验全部响应
| # # 发送报文并检查响应
ans,unans = sr(packet2,iface="ens3")
print('响应报文')
ans.show()
print('其他报文')
unans.summary()
|
常用发包方式 3 - 随意发包、只管发送(源地址可以随意伪造)
send(packet,verbose=0,iface="MIBO")
抓包并回放
| pkg = sniff(count=4, filter="host 10.44.3.3",iface='eth0')
pkg.show()
sendp(pkg)
|
加载报文文件并部分回放
| pkg = sniff(offline = 'rec.cap',count=10)
pkg.show()
sendp(pkg)
|