跳转至

scapy发包工具

导包

1
2
3
4
5
6
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报文

1
2
3
4
5
6
7
# 任意源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 - 发包并校验全部响应

1
2
3
4
5
6
7
# # 发送报文并检查响应
ans,unans = sr(packet2,iface="ens3")
print('响应报文')
ans.show()

print('其他报文')
unans.summary()

常用发包方式 3 - 随意发包、只管发送(源地址可以随意伪造)

send(packet,verbose=0,iface="MIBO")

抓包并回放

1
2
3
pkg = sniff(count=4, filter="host 10.44.3.3",iface='eth0')
pkg.show()
sendp(pkg)

加载报文文件并部分回放

1
2
3
pkg = sniff(offline = 'rec.cap',count=10)
pkg.show()
sendp(pkg)