Scapy强大的Python网络包解析库

中科白癜风医院 http://www.pfzhiliao.com/

随着Python越来越流行,在安全领域的用途也越来越多。比如可以用requests模块撰写进行Web请求工具;用sockets编写TCP网络通讯程序;解析和生成字节流可以使用struct模块。而要解析和处理网络包在网络安全领域更加普遍,时常

我们会使用tcpdump和wireshark(tshark)。但是如果要自己写程序进行处理,则需要更灵活的语言包(库),这就是本文要介绍的Scapy。

概述

Scapy是一个用来解析底层网络数据包的Python模块和交互式程序,该程序对底层包处理进行了抽象打包,使得对网络数据包的处理非常简便。该类库可以在在网络安全领域有非常广泛用例,可用于漏洞利用开发、数据泄露、网络监听、入侵检测和流量的分析捕获的。Scapy与数据可视化和报告生成集成,可以方便展示起结果和数据。

Scapy的基本理念是提出一个基于领域特定语言,从而轻松快速地进行有线格式(WireFormat)管理。

安装运行

Scapy可以通过pip安装:

pipinstallscapy

也可以通过发行版的包管理器安装,比如yum,但是其版本可能太老已经过时。

也可以通过直接从官方仓库clone源码安装:

gitclonegithub/secdev/scapy

然后,可以可以简单地运行:

cdscapy

./run_scapy

用法示例解析PCAP抓包

用Scapy做的最简单的事情就是读取PCAP文件。让我们下载Wireshark的sip-rtp-opus-hybrid.pcap示例PCAP数据包为例子:

用rdpcap()函数引入PCAP文件,读取其内容的函数:

pkts=rdpcap("sip-rtp-opus-hybrid.pcap")

pkts

sip-rtp-opus-hybrid.pcap:TCP:0UDP:7ICMP:0Other:0

为了更详细读取PCAP文件中的数据,可以使用PcapReader从打开的文件句柄中迭代地读取数据包,一次一个包,bing实例化的对象:

fd=open("sip-rtp-opus-hybrid.pcap","rb")

reader=PcapReader(fd)

reader

scapy.utils.PcapReaderat0x7fc7c24e0

forCCinreader:

...:print(CC)

...:

fd.close()

如上面所示,每个数据包都以有线格式提供。Scapy将每个数据包以网络层的堆栈。Scapy层对象对应于网络协议及其有线格式。

获取第一个数据包并检查IP层是否可用:

first=CC[0]

first.haslayer(IP)

True

IPinfirst

True

要解析来自特定层的数据包,可按想要的层对其进行索引,并让Scapy打印所有字段:

要以十六进制打印数据包,可以使用hexdump()功能:

hexdump(first)

为了完全解析和完美地输出一个数据包,需要调用show()方法:

first.show()

可以看到,上面未能有效地解析SI负载。这是因为Scapy主要处理二进制协议网络堆栈的较低部分,而SIP不是。但是可以引入第三方模块来解析一些应用层协议,比如HTTP协议。

实时抓包解析

比如可以读取带有预先捕获的数据包的PCAP文件,如果要做一些数据包嗅探,如果系统准备好在混杂模式下使用网络接口,可以调用sniff()从网卡获取一些数据包的函数:

forCCinsniff(count=5):

...:CC.show()

...:

Scapy中也可以使用和Wireshark(tshark)、tcpdump相同BPF语法来过滤嗅探到的数据包和许多其他工具支持:

forCCinsniff(filter="udp",count=5):

...:CC.show()

...:

要将捕获的数据包保存到PCAP文件中以供进一步分析,可以使用wrpcap()函数来导出到文件:

capture=sniff(filter="udp",count=5)

capture

Sniffed:TCP:0UDP:5ICMP:0Other:0

wrpcap("udp.pcap",capture)

发送ping包

除了可以嗅探(捕获和解析)网络数据包,但Scapy也支持生成数据包进行各种主动欺骗:网络扫描、服务器探测、通过发送攻击系统格式错误的请求等等。

下面尝试ping一个服务器,涉及到要给服务发送一个ICMP数据包:

CC=IP(dst="XXX")/ICMP()

CC.show()

然后调用sr1()函数,可以发送一个ICMP数据包(即ping),等待返回数据包返回:

rr=sr1(CC)

Beginemission:

Finishedsending1packets.

...*

Received4packets,got1answers,remaining0packets

rr

上面得到了正确的ICMP回复。

为了发送多个数据包和接收响应(例如实现ping扫描),可以用sr()功能。发送多个数据包,但等待单个响应。还可以用sr1_flood()功能。

网络协议层乱序

Scapy通过重载了Python“/”运算符来实现层堆叠,不再不强制按照网络层顺序执行,以达到以预期人为顺序执行(这在某些测试和应用中很有用)。

CC=ICMP()/UDP()/IP()/IP()

CC

ICMP

UDP

IPfrag=0proto=ipencap

IP

CC.show()

###[ICMP]###

type=echo-request

code=0

chksum=None

id=0x0

seq=0x0

###[UDP]###

sport=domain

dport=domain

len=None

chksum=None

###[IP]###

version=4

ihl=None

tos=0x0

len=None

id=1

flags=

frag=0

ttl=64

proto=ipv4

chksum=None

src=.0.0.1

dst=.0.0.1

\options\

###[IP]###

version=4

ihl=None

tos=0x0

len=None

id=1

flags=

frag=0

ttl=64

proto=hopopt

chksum=None

src=.0.0.1

dst=.0.0.1

\options\

hexdump(CC)

WARNING:NoIPunderlayerto


转载请注明:http://www.aierlanlan.com/rzdk/7903.html