一. 安装scapy

执行下列命令

1
pip install scapy

官方文档:https://scapy.readthedocs.io/en/latest/usage.html

二. 进行抓包

获取网络信息

windows系统下,在命令行执行ipconfig /all获取网络信息。(如果是linux系统获取iface参数详见官方文档)

尝试抓包

先说明下即将用到的sniff方法。

定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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)语法
L2socket:使用给定的L2socket
timeout:在给定的事件后停止嗅探,默认为None
opened_socket:对指定的对象使用.recv进行读取
stop_filter:定义一个函数,决定在抓到指定的数据之后停止
iface:指定抓包的网卡,不指定则代表所有网卡

下面是Python代码:

1
2
3
4
from scapy.all import *

dpkt = sniff(iface="Broadcom 802.11ac Network Adapter", count=100)
print(dpkt)

在windows上运行,会报错:

RuntimeError: Sniffing and sending packets is not available at layer 2: winpcap is not installed. You may use conf.L3socket orconf.L3socket6 to access layer 3

它提示我们要去安装winpcap,这是一个免费,公共的网络访问系统,目的在于为win32应用程序提供访问网络底层的能力。

安装链接:https://www.winpcap.org/install/default.htm

再次执行代码,运行结果如下:

1
<Sniffed: TCP:91 UDP:9 ICMP:0 Other:0>

这告诉我们,在100次嗅探中分别是什么连接。

数据分析

我们首先运行下面的代码,看看抓到的具体内容。

1
2
3
4
5
from scapy.all import *

dpkt = sniff(iface="Broadcom 802.11ac Network Adapter", count=1)
for i in dpkt:
i.show() # 打印内容

运行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
###[ Ethernet ]### 
dst = 2c:b2:1a:60:00:29
src = d4:61:9d:25:c6:cc
type = IPv4
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 427
id = 62309
flags = DF
frag = 0
ttl = 128
proto = tcp
chksum = 0xca38
src = 192.168.2.105
dst = 101.91.19.66
\options \
###[ TCP ]###
sport = 8702
dport = 8080
seq = 1452087747
ack = 4270867081
dataofs = 5
reserved = 0
flags = PA
window = 514
chksum = 0xcc23
urgptr = 0
options = []
###[ Raw ]###
load = "\x17\xf1\x03\x01~\xe5n\x10"

上面的内容,对应了一次请求的网络包。

如果要获取某一项具体值,可以参考下面的方法,并举一反三。

1
2
3
4
5
6
7
8
9
10
11
from scapy.all import *

# 定义回调函数,嗅探一次返回执行一次
def pack_callback(pack):
try:
if pack['IP'].payload:
print(pack['IP'].chksum) # 获取IP的chksum参数
except Exception as e:
print(e)

dpkt = sniff(iface="Broadcom 802.11ac Network Adapter", prn=pack_callback, count=0)

获取完参数后,可以进行一些其他操作,例如存储到数据库中。