Scapy 是一个强大的 Python 库,用于网络数据包的操作,包括数据包的生成、解析、嗅探和注入。以下是 Scapy 库的全部知识点汇总:
1. 安装与配置
安装 Scapy
使用 pip 安装:
pip install scapy
验证安装:
from scapy.all import *
2. 基本操作
数据包生成
- 创建数据包:
pkt = IP(dst="8.8.8.8")/ICMP()
- 层叠数据包:
pkt = Ether()/IP()/TCP()/"Hello, World!"
数据包字段
- 查看数据包字段:
pkt.show()
- 修改数据包字段:
pkt[IP].dst = "8.8.4.4"
3. 数据包发送与接收
发送数据包
- 发送数据包:
send(pkt)
- 发送并接收响应:
response = sr1(pkt)
嗅探数据包
- 嗅探网络数据包:
sniff(filter="icmp", count=10, prn=lambda x: x.summary())
- 停止嗅探:
packets = sniff(timeout=10)
4. 协议层
链路层
- Ethernet 数据包:
eth = Ether(dst="ff:ff:ff:ff:ff:ff")
- ARP 数据包:
arp = ARP(pdst="192.168.1.1")
网络层
- IP 数据包:
ip = IP(dst="8.8.8.8")
- ICMP 数据包:
icmp = ICMP()
传输层
- TCP 数据包:
tcp = TCP(dport=80, flags="S")
- UDP 数据包:
udp = UDP(dport=53)
5. 高级功能
数据包注入
- 将数据包注入网络:
sendp(pkt)
数据包重放
- 重放捕获的数据包:
packets = rdpcap("example.pcap")
sendp(packets)
数据包解析与构建
- 从二进制数据解析数据包:
raw_pkt = b'\x00\x01\x02...'
pkt = Ether(raw_pkt)
- 构建自定义协议:
class Custom(Packet):name = "Custom"fields_desc = [ByteField("field1", 0), ShortField("field2", 1)]
6. 网络攻击与防御
ARP 欺骗
- 执行 ARP 欺骗:
send(ARP(op=2, pdst="192.168.1.1", psrc="192.168.1.254", hwdst="ff:ff:ff:ff:ff:ff"))
DOS 攻击
- SYN 洪水攻击:
send(IP(dst="target_ip")/TCP(dport=80, flags="S"))
检测和防御
- 检测 ARP 欺骗:
def detect_arp_spoof(pkt):if ARP in pkt and pkt[ARP].op == 2:if pkt[ARP].psrc in arp_cache and arp_cache[pkt[ARP].psrc] != pkt[ARP].hwsrc:print("ARP Spoofing Detected!")
sniff(filter="arp", prn=detect_arp_spoof)
7. 工具集成与自动化
结合其他工具
- 与 nmap 结合使用:
from scapy.layers.inet import IP, TCP
from scapy.sendrecv import sr1for i in range(1, 255):ip = f"192.168.1.{i}"pkt = IP(dst=ip)/TCP(dport=80, flags="S")response = sr1(pkt, timeout=1, verbose=0)if response:response.show()
脚本化任务
- 自动化网络扫描:
def scan_network(ip_range):for ip in ip_range:pkt = IP(dst=ip)/ICMP()response = sr1(pkt, timeout=1, verbose=0)if response:print(f"{ip} is up")ip_range = [f"192.168.1.{i}" for i in range(1, 255)]
scan_network(ip_range)
8. Scapy工作上使用的实例场景
- 实例:抓取TCP报文的flags,或者某一帧的以太网报文
from scapy.all import sniff
from scapy.layers.inet import IP, TCPdef packet_handler(packet):if packet.haslayer(TCP) and packet.haslayer(IP):src_ip = packet[IP].srcdst_ip = packet[IP].dstsrc_port = packet[TCP].sportdst_port = packet[TCP].dportflags = packet[TCP].flagsprint(f"Source IP: {src_ip}, Destination IP: {dst_ip}, Source Port: {src_port}, Destination Port: {dst_port}, Flags: {flags}")sniff(filter="tcp", prn=packet_handler)
- 实例二:捕获TCP包并保存到本地 ,在本地分析包
from scapy.all import sniff
from scapy.utils import wrpcap# 捕获10个TCP包
packets = sniff(filter="tcp", count=10)# 保存到本地文件captured_packets.pcap
wrpcap("captured_packets.pcap", packets)
然后对这个离线包进行解析分析报文
from scapy.all import rdpcap
from scapy.layers.inet import IP, TCPdef packet_handler(packet):if packet.haslayer(TCP) and packet.haslayer(IP):src_ip = packet[IP].srcdst_ip = packet[IP].dstsrc_port = packet[TCP].sportdst_port = packet[TCP].dportflags = packet[TCP].flagsprint(f"Source IP: {src_ip}, Destination IP: {dst_ip}, Source Port: {src_port}, Destination Port: {dst_port}, Flags: {flags}")# 从文件读取数据包
packets = rdpcap("captured_packets.pcap")# 处理每个数据包
for packet in packets:packet_handler(packet)
9. 学习资源与实践
官方文档
- Scapy 官方文档和教程
书籍
- 《Scapy 网络安全》
在线课程
- Udemy、Coursera 等平台的 Scapy 课程
实践项目
- 捕获与分析网络流量
- 实现网络扫描器
- 开发自定义网络工具
通过这些知识点的学习和实践,可以全面掌握 Scapy 的使用,并应用于各种网络安全与数据包操作的任务中。