Scapy之sniff抓包
简介
- 同为
C4
遇到的问题:模拟各种网络流量时,若使用真实环境下流量,需要对真实环境报文进行抓取。 - 学长推荐使用
Scapy
进行抓取,于是做了一点笔记。
Sniff
参数
参数名 | 用途 | 默认值 |
---|---|---|
count | 抓包的个数,0 为无限 |
0 |
store | 是否存储抓到的包 | 1 |
offline | 从pcap 文件读取 |
None |
prn | 回调函数(一般是lambda ) |
None |
session | 流处理器 | TCPSession |
filter | BPF 过滤规则 |
None |
L2socket | 特定的L2socket | None |
timeout | 设置中断计时器 | None |
opened_socket | 使用recv 读取打开的socket |
None |
stop_filter | 设置中断过滤规则 | None |
iface | 指定网卡,None 则代表所有网卡 |
None |
回调函数:一个高层调用底层,底层再回过头来调用高层的过程。
BPF:柏克莱封包过滤器(
Berkeley Packet Filter
,缩写BPF
),是类Unix系统上数据链路层的一种原始接口,提供原始链路层封包的收发。
常规使用
TCP
from scapy.all import *
def CallBack(packet):
print ( packet.show() )
if packet.haslayer('TCP'):
print (packet['TCP'].sport)
print (packet['TCP'].dport)
print (packet['TCP'].seq)
print (packet['TCP'].dataofs)
filter="tcp"
sniff(filter=filter, prn=callback, iface='WLAN', count=0)
ARP
from scapy.all import *
def CallBack(packet):
print ( packet.show() )
if packet.haslayer('ARP'):
print (packet['ARP'].psrc)
print (packet['ARP'].pdst)
print (packet['ARP'].hwsrc)
print (packet['ARP'].hwdst)
time.sleep(2)
filter="arp"
sniff(filter=filter, prn=CallBack, iface='WLAN', count=0)
HTTP
from scapy.all import *
def CallBack(packet):
if packet.haslayer('HTTP'):
http = packet.payload.payload.payload
print(http.show())
sniff(prn=CallBack, iface='WLAN', count=0)
原始的
Scapy
对http
抓包的支持不够友好,数据包的分割只能到TCP
级别,需要编码将TCP
包合并为HTTP
数据包,故无法对应用层数据包进行筛选。
packet
是在网卡抓到的帧,每取一次payload
就相当于向上解封装一次。