简介
- 同为
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就相当于向上解封装一次。
