地表最强数据包工具--Scapy基础篇

举报
zhoulive 发表于 2021/06/09 22:31:19 2021/06/09
【摘要】 学习过程中用到Scapy这个工具,用了一些小功能之后发现效果挺好的,自由度高,比其他的很多工具的可自定义程度要高太多了,所以写一篇Scapy基础篇分享给各位,希望能对各位有用

零、前言

学习过程中用到Scapy这个工具,用了一些小功能之后发现效果挺好的,自由度高,比其他的很多工具的可自定义程度要高太多了,所以写一篇Scapy基础篇分享给各位,希望能对各位有用。


一、Scapy是什么?

咱们看看官方文档怎么介绍Scapy工具的:

Scapy is a Python program that enables the user to send, sniff and dissect and forge network packets. This capability allows construction of tools that can probe, scan or attack networks.

Scapy 是一个 Python 程序,它使用户能够发送、嗅探、剖析和伪造网络数据包。此功能允许构建可以探测、扫描或攻击网络的工具。

In other words, Scapy is a powerful interactive packet manipulation program. It is able to forge or decode packets of a wide number of protocols, send them on the wire, capture them, match requests and replies, and much more. Scapy can easily handle most classical tasks like scanning, tracerouting, probing, unit tests, attacks or network discovery. It can replace hping, arpspoof, arp-sk, arping, p0f and even some parts of Nmap, tcpdump, and tshark.

换句话说,Scapy 是一个强大的交互式数据包操作程序。它能够伪造或解码多种协议的数据包,通过网络发送它们,捕获它们,匹配请求和回复等等。Scapy 可以轻松处理大多数经典任务,例如扫描、跟踪路由、探测、单元测试、攻击或网络发现。它可以替代 hping、arpspoof、arp-sk、arping、p0f 甚至 Nmap、tcpdump 和 tshark 的某些部分。

Scapy also performs very well on a lot of other specific tasks that most other tools can’t handle, like sending invalid frames, injecting your own 802.11 frames, combining techniques (VLAN hopping+ARP cache poisoning, VOIP decoding on WEP encrypted channel, …), etc.

Scapy 在大多数其他工具无法处理的许多其他特定任务上也表现出色,例如发送无效帧、注入您自己的 802.11 帧、组合技术(VLAN 跳跃 + ARP 缓存中毒、WEP 加密通道上的 VoIP 解码等), 等等。

scapy介绍

二、Scapy基础

1 利用pip安装库

类型 包含内容 Pip命令
默认版 Only Scapy pip install scapy
基础版 Scapy & IPython. Highly recommended pip install --pre scapy[basic]
完整版 Scapy & all its main dependencies pip install --pre scapy[complete]

如果只需要安装scapy库的话,直接使用pip安装以下命令就行了

pip install scapy

但对于想要完整体验Scapy强大功能的兄弟姐妹们而言,官方还是推荐至少使用以下命令安装基础版Scapy

pip install --pre scapy basic

完全体的Scapy直接敲!!!!!!!

pip install --pre scapy complete

Windows环境下除了安装Python环境之外还需要安装Npcap或Wincap,官方推荐使用Npcap

关于系统安装使用Scapy的命令行界面可以参考官方的下载与安装文档:Scapy的下载与安装

当以上安装环节全部完成之后不如终端上敲个“scapy”试试,然后就能看到Scapy的欢迎界面了(虽然没有GUI来的美观):
scapy安装完成后

2 基本使用

起手引个包(Scapy v2 )

from scapy.all import *

2.1 conf变量

咱们可以通过conf变量来查看scapy的配置参数,然后根据咱们的需求来修改参数

print(conf)

放一些局部参数出来感受感受
conf结果

对于使用命令行的兄弟们来说,修改命令行的主题色必定是使用命令行界面前的第一件事,咱们可以通过以下命令来修改命令行颜色:

''' 
包含以下几种主题
DefaultTheme, BrightTheme, RastaTheme, ColorOnBlackTheme, BlackAndWhite, HTMLTheme, LatexTheme
'''
conf.color_theme = BrightTheme()  # 使用明亮色主题,默认是没有主题,即<NoTheme>

2.2 lsc()方法

lsc()方法用来查看Scapy支持的所有命令

lsc()

部分命令截图如下:
lsc()结果

然后悄咪咪地看了以下lsc()的实现代码:

def lsc():
    # type: () -> None
    """Displays Scapy's default commands"""
    print(repr(conf.commands))

哦,原来就是之前conf中的commands,那没事了

2.3 ls()方法

ls()方法的使用分两种情况

  • 无参数的情况下,用来查看可以实现的所有的网络协议
  • 带参数的情况下,用来查看参数(网络协议)的字段详情
ls()  # 不带参数情况下输出所有支持的网络协议

ls()结果

'''
ls(网络协议类)
'''
ls(UDP())  # 带参数情况下输出协议相关参数

UDP字段

嗯?你们说知道这些字段有什么用?我都不好意思拆穿你们,不知道有什么用你还会搜到这篇文章吗?

3 发送数据

3.1 创建数据

咱们这里先用IP数据包举例吧:

'''
实例化一个IP数据包
调用"data.show"方法查看数据包的默认字段
'''
data = IP()
data.show()

IP字段

啥?一个包不够?OK,满足你们的需要,咱们直接按IP+掩码来构建一组IP数据可以吧?不多说,直接上代码:

'''
构建了一组数据,目标地址为www.slashdot.org的IP,且掩码为30的所有IP地址
'''
data=IP(dst="www.slashdot.org/30")
data.show()

IP数据包集

是不是发现原来咱们设置的dst为127.0.0.1的显示结果不一样?咱们这就已经根据一个网段生成一组数据包了。除此之外,咱们还能构建一个指定多层字段的数据包,比如指定IP协议之后再指定ICMP协议字段,就可以修改成以下方式:

'''
指定IP目的地址并使用上层的ICMP协议
'''
data = IP(dst="1.2.3.4")/ICMP()

多层数据包

3.2 发送数据

1、send()方法在第三层(网络层)发工作,处理路由数据与第二层数据:

'''
处理第三层数据,构建数据发送即可,设置return_packets=True可接收返回的数据包
'''
send(IP(dst="1.2.3.4")/ICMP())
resp = send(IP(dst="1.2.3.4")/ICMP(), return_packets=True)

2、sendp()方法在第二层(数据链路层)工作,需要指定正确的接口与数据链路层协议:

'''
处理第二层数据,需要指定接口与链路层协议,设置return_packets=True可接收返回的数据包
'''
sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")
resp = sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), return_packets=True, iface="eth1")

3.3 fuzz()方法

fuzz()方法是用来创建随机的合理参数的数据包,比如下面这个:

'''
loop字段代表循环发送
fuzz(随机的协议类)
这里咱们就构建了一个除了目标地址与NTP版本为4之外的一个随机数据包
(如果您在 IP 层使用 fuzz(),则 src 和 dst 参数不会是随机的,如果需要的话,请使用 RandIP())
'''
send(IP(dst="127.0.0.1")/fuzz(UDP()/NTP(version=4)),loop=1)

构建的随机数据包

3.4 发送与接收数据

1、sr()方法发送数据包与接收数据,返回值为两个,一个是应答返回的数据包,一个是未应答的数据包

'''
ans为返回的应答数据包
unans为发送的未应答的数据包
调用ans.summary()与unans.summary()查看简单的数据包信息,比".show"的信息要少
'''
ans, unans = sr(IP(dst="192.168.3.1")/TCP(dport=[21,22,23]))
ans.summary()
unans.summary()

发送数据包

2、sr1()方法是sr()的特殊用法,仅仅返回一个参数,就是所收到的应答的数据包

'''
resp为返回的应答数据包
'''
resp = sr1(IP(dst="www.slashdot.org")/ICMP())

3、srp()方法与srp1()方法是针对二层数据的发送方法,区别也就是sr()与sr1()的区别,即返回参数是否包含未应答的发送数据。

三、结尾

差不多Scapy的基础使用就到这里了吧,至于一些高级应用,就暂时不讲了,等之后对这方面的应用需求更高的时候,再整理一些Scapy的“骚”操作吧,Scapy这个几乎“万能”的数据构造库可不仅仅这么一些功能。建议各位还是参照官方文档来玩一些“技巧”。

Scapy官方文档

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。