本文 首发于 🌱 煎茶转载 请注明 来源

Scapy是一个可以让用户发送、侦听和解析并伪装网络报文的Python程序。这些功能可以用于制作侦测、扫描和攻击网络的工具。

Python 代码中可以通过 sniff 函数调用抓包分析,并对抓到的包进行回调操作。

Sniff 方法定义:

sniff(count=0,
      store=1,
      offline=None,
      prn=None,
      filter=None,
      L2socket=None,
      timeout=None,
      opened_socket=None,
      stop_filter=None,
      iface=None)
count:抓取报的数量设置为0时则一直捕获
store:保存抓取的数据包或者丢弃1保存0丢弃
offline:从pcap文件中读取数据包而不进行嗅探默认为None
prn:为每个数据包定义一个回调函数通常使用lambda表达式来写回调函数
filter:过滤规则可以在里面定义winreshark里面的过滤语法使用 Berkeley Packet Filter (BPF)语法具体参考[http://blog.csdn.net/qwertyupoiuytr/article/details/54670477](http://blog.csdn.net/qwertyupoiuytr/article/details/54670477)
L2socket:使用给定的L2socket
timeout:在给定的事件后停止嗅探默认为None
opened_socket:对指定的对象使用.recv进行读取
stop_filter:定义一个函数决定在抓到指定的数据之后停止
iface:指定抓包的网卡,不指定则代表所有网卡

filter语法

type(定义了类型)
可选值host, net, port, portrange
例如
host hostnameA
net 172.31            //相当于172.31.0.0/16,又例如192.168.1相当于192.168.1.0/24
port 80
portrange 6000-6010

dir(direction定义了传输方向)
可选值src, dst, src or dst, src and dst
例如
src net 172.31
src or dst port 21

proto(protocol定义了网络协议)
可选值ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp, udp, icmp
(fddi, tr, wlan是ether的别名, 包结构很类似)
例如
ether src hostnameA
arp net 172.31
udp portrange 7000-8000

连接词and, or, not
例如
tcp or udp
not icmp

示例代码

#!/usr/bin/python3
# -*- coding: UTF-8 -*-

from scapy.all import *

def pack_callback(packet):
    print ( packet.show() )
    if packet['Ether'].payload:
        print (packet['Ether'].src)
        print (packet['Ether'].dst)
        print (packet['Ether'].type)

    if packet['ARP'].payload:
        print (packet['ARP'].psrc)
        print (packet['ARP'].pdst)
        print (packet['ARP'].hwsrc)
        print (packet['ARP'].hwdst)
    time.sleep(2)

filterstr="arp"

sniff(filter=filterstr,prn=pack_callback, iface='eth0', count=0)

参考文献