Scapy 是一个开源的 Python 库,专注于网络数据包的创建、嗅探、分析和注入。它支持几乎所有标准的网络协议(如 IP、TCP、UDP、ICMP、ARP 等),并提供灵活的扩展机制,可自定义协议字段或开发专用工具。
核心特点:
# 使用pip安装最新版本
sudo pip install scapy
# 验证安装(Linux/macOS)
python3 -c "from scapy.all import sniff; print(scapy.__version__)"
scapy.py
和依赖库复制到 Python 环境路径下。conda install -c conda-forge scapy
示例:捕获 HTTP 流量
from scapy.all import sniff, HTTP
def packet_callback(packet):
if packet.haslayer(HTTP):
print(f"HTTP Request: {packet[HTTP].method} {packet[HTTP].host}")
sniff(iface="eth0", filter="tcp.port==80", prn=packet_callback)
关键参数:
iface
:监听的网络接口(如 eth0
、wlan0
)。filter
:BPF 过滤表达式(如 tcp.port==80
)。prn
:回调函数,处理捕获的数据包。示例:发送 ICMP PING 包
from scapy.all import IP, ICMP, send
# 构造ICMP报文
icmp_packet = IP(dst="8.8.8.8")/ICMP()
send(icmp_packet)
示例:构造 TCP SYN 攻击包
from scapy.all import IP, TCP, send
syn_packet = IP(dst="192.168.1.1")/TCP(dport=80, flags="S")
send(syn_packet, verbose=1) # verbose=1 显示发送细节
解析 HTTP 请求头
from scapy.all import sniff
def parse_http(packet):
if packet.haslayer(HTTP):
http_layer = packet[HTTP]
print(f"URL: {http_layer.Host}/{http_layer.Path}")
print(f"Method: {http_layer.Method}")
sniff(iface="eth0", filter="tcp.port==80", prn=parse_http)
修改 IP 目标地址
packet = IP(dst="8.8.8.8")/ICMP()
modified_packet = packet[IP].dst = "1.1.1.1"
send(modified_packet)
常用过滤规则:
规则示例 | 作用 |
---|---|
tcp.port == 80 |
过滤目标端口为80的TCP包 |
ip.src == 192.168.1.0/24 |
过滤源IP地址为子网的包 |
http.request.method == "GET" |
过滤HTTP GET请求 |
在 Scapy 中应用过滤:
sniff(iface="eth0", filter="ip.src == 192.168.1.100 and tcp.port == 443")
保存为 PCAP 文件:
packets = sniff(count=100, output_file="capture.pcap")
从 PCAP 文件读取:
from scapy.all import rdpcap
packets = rdpcap("capture.pcap")
for pkt in packets:
print(pkt.summary())
定义简单自定义协议:
from scapy.all import Packet, bytesbind, ShortField
class MyProtocol(Packet):
name = "MyProtocol"
fields_desc = [
ShortField("opcode", 0),
bytesbind("data", length_from=lambda pkt: pkt.opcode * 2),
]
# 构造数据包
my_pkt = MyProtocol(opcode=3, data=b"abcdefgh")
部分操作(如发送原始数据包)需要管理员权限:
sudo python3 my_script.py
确保监听接口的防火墙规则允许数据包捕获:
# Linux (iptables)
sudo iptables -A INPUT -i eth0 -j ACCEPT
# macOS (pfctl)
sudo pfctl -e -f /etc/pf.conf # 确保 pf.conf 允许流量
网络渗透测试
网络监控与诊断
协议开发与测试
结语
Scapy 凭借其灵活性和强大的功能,成为网络工程师和渗透测试者的必备工具。无论是简单的数据包分析还是复杂的网络攻击模拟,都能通过 Scapy 快速实现。建议从基础示例入手,逐步探索其高级特性。