数据包工具--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 Scapypip install scapy
基础版Scapy & IPython. Highly recommendedpip install --pre scapy[basic]
完整版Scapy & all its main dependenciespip 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官方文档

  • 23
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫零NET

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值