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)

原始的Scapyhttp抓包的支持不够友好,数据包的分割只能到TCP级别,需要编码将TCP包合并为HTTP数据包,故无法对应用层数据包进行筛选。

packet是在网卡抓到的帧,每取一次payload就相当于向上解封装一次。

参考

posted @ 2021-07-22 11:02  CH3UHX9  阅读(6670)  评论(1编辑  收藏  举报