Scapy 中文文档:一、介绍

article/2025/9/6 4:19:46

介绍

译者:pdcxs007

来源:Scapy介绍官方文档翻译

原文:Introduction

协议:CC BY-NC-SA 2.5

  • 关于Scapy
  • Scapy为何如此特别
  • 快速的报文设计
  • 一次探测多次解释
  • Scapy解码而不解释
  • 快速展示Quick demo
  • 合理的默认值
  • 学习Python

本人英文水平有限,翻译不当之处,请参考官方网站。

关于Scapy

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

换言之,Scapy 是一个强大的操纵报文的交互程序。它可以伪造或者解析多种协议的报文,还具有发送、捕获、匹配请求和响应这些报文以及更多的功能。Scapy 可以轻松地做到像扫描(scanning)、路由跟踪(tracerouting)、探测(probing)、单元测试(unit tests)、攻击(attacks)和发现网络(network discorvery)这样的传统任务。它可以代替hping,arpspoof,arp-sk,arping,p0f 甚至是部分的Namp,tcpdumptshark 的功能。

testing-taxonomy.png

Scapy 在大多数其它工具无法完成的特定任务中也表现优异,比如发送无效帧、添加自定义的802.11的侦、多技术的结合(跳跃攻击(VLAN hopping)+ARP缓存中毒(ARP cache poisoning)、在WEP加密信道(WEP encrypted channel)上的VOIP解码(VOIP decoding))等等等等。

理念非常简单。Scapy 主要做两件事:发送报文和接收回应。您定义一系列的报文,它发送这些报文,收到回应,将收到的回应和请求匹配,返回一个存放着(request, answer)即(请求, 回应)的报文对(packet couples)的列表(list)和一个没有匹配的报文的列表(list)。这样对于像Nmaphping 这样的工具有一个巨大的优势:回应没有被减少 (open/closed/filtered)而是完整的报文。

在这之上可以建立更多的高级功能,比如您可以跟踪路由(traceroutes)并得到一个只有请求的起始TTL和回应的源IP的结果,您也可以ping整个网络并得到匹配的回复的列表,您还可以扫描商品并得到一个<nobr>LATEX</nobr> 报表。

Scapy为何如此特别

第一,对于其它的大多数网络工具来说,您无法制作一些作者无法想到的东西。这些工具已经被一个特定的目标所局限和固定,因此无法和这个目标有大的偏离。比如,一个ARP缓存中毒程序不会让您使用double 802.1q 包裹内容,同样无法找到一个程序可以发送填充(padding)的ICMP报文(是填充(padding),不是负载(payload))。事实上,每次有新需求时,您必需重新建立一个新的工具。

第二,这些工具经常混淆解码(decoding)和解释(interpreting)。机器擅长解码并能帮助人类完成这个工作。解释应该留给人类。一些程序试图模拟这个行为。比如它们说“这个端口是打开的”而不是说“我收到一个SYN-ACK“.有时它们是对的,但有时不是。这样做对于初学者来说更容易,但是当您知道您正在做什么,您将继续试图推从程序的解释中测实际上发生了什么来制作自己的工具,但是这相当困难,因为大量的信息已经丢失。因此最终常常是您使用tcpdump -xX来解码和解释这些工具丢掉的内容。

第三,即使是那些只管解码的程序也没有把它们收到的所有的信息交给您。它们给您展示的网络信息只是其作者认为足够的信息。但是这些并不完整,对您来说是偏颇的。比如,您知道有什么工具可以得到以太帧填充的报文吗(reports the Ethernet padding)?

事实上,每次运行本程序,更像是建造一个新的工具,不是处理上百行的C程序代码,您使用Scapy只需写几行代码。

在探测(probe)(或者扫描(scan)、路由跟踪(traceroute)等等)之后,Scapy总是在任何的解释之前把探测到的所有的包解码后给您。这意味着您可以探测一次而解释很多次,也可以使用路由跟踪并查看报文填充内容。

快速的报文设计

其它的工具坚持命令行运行的模式,这导致描述一个报文需要糟糕的语法。对于这些工具,解决的方法是在其作者想像的情景下,采用一种更高层但是功能更弱的描述方法。举例来说,在端口扫描的情景中,端口扫描器必须的参数只有IP地址。即使情景有所改变,情况依然如此(Even if the scenario is tweaked a bit, you still are stuck to a port scan)。

Scapy的原则是推荐使用一种特定领域语言(Domain Specific Language (DSL))以达到对于任何种类报文的功能强大并快速的描述。使用Python语法和Python解释器作为特定领域语言(DSL)的语法和解释器有许多优势:没有必要写一个单独的解释器,用户不需要再学一种新语言并可以从这个完整、简约且非常强大的语言中受益。

Scapy允许用户将一个或一系列报文描述成为一个个堆起来的层(layer)。每层的数据域有有用的且可重载的默认值。Scapy不强制用户使用预先定义的方法和模板。这样每次碰到不同的情景时写新工具的需要得到了减少。在C语言中,描述一个报文可能平均要用60行代码。使用Scapy,发送的报文可能仅需一行代码描述再加一行打印结果的代码。90%的网络探测工具可以使用Scapy使用2行代码重新实现。

一次探测,多次解释

网络的发现是一个黑盒测试。当探测一个网络时,许多侦测报文(stimuli)发送然而它们当中只有少数能够被回应。如果选择了正确的侦测报文,希望得到的信息可以通过回应的报文或者是没有回应的情况来获得。不像很多其它的工具,Scapy得到所有的信息,也就是说,所有的发送的侦测报文和所有收到的回应。通过检查这些数据用户可以得到想要的信息。当数据量较小时,用户可以直接查看数据。在其它情况下,对于数据的解释将依赖于关注点的不同。多数工具选择展示关注点内容而忽略和关注点无关的内容。由于Scapy给出完整的原始数据,因此这些数据可以多次使用从而允许关注点在分析过程中发生变化。比如,可能探测一个TCP端口扫描而关注(展示)端口扫描的结果。同时也可以查看回应报文的TTL方面的内容。一个新的探测并不需要再来一次,而只是在已有的数据中改一下关注点即可。

scapy concept

Scapy解码而不解释

网络探测工具所共有的一个问题是它们都试图解释收到的回应而非仅仅解码并给出结果。报告一些类似于在80端口收到一个TCP Reset报文这样的消息不属于解释错误。报告80端口关闭在多数情况下是正确的,但是在某些特定的工具的作者没有想到的上下文中是错误的。比如,一些扫描器在收到一个目的地址不可达的ICMP报文后倾向于报告一个过滤TCP端口。这可能是正确的,但是在某些情况下,这表明报文被防火墙过滤掉而找不到报文的非目的主机。

解释结果可以帮助那些不知道什么是端口扫描的用户,但是弊大于利,因为这对于结果是一种主观的解释。可能的结果就是它们可以自己解释,知识丰富的用户将试图反向还原这个工具的解释以得到引起这个解释的真正原因。不幸的是,在这个过程中有大量的信息丢失。

快速展示(Quick demo)

首先我们稍微试一下,一次创建4个IP报文来看看这个工具是如何工作的。我们首先初始化IP类。然后,我们重新将其实例化并给出4个IP报文的目的地址(/30给出掩码)。使用Python语法,我们在一系列明确的报文中定义这个报文(we develop this implicit packet in a set of explicit packets)。然后,我们退出解释器。作为我们提供的会话文件(session file),这些我们正在使用变量已经保存,然后重新加载:

# ./scapy.py -s mysession
New session [mysession]
Welcome to Scapy (0.9.17.108beta)
>>> IP()
<IP |>
>>> target="www.target.com"
>>> target="www.target.com/30"
>>> ip=IP(dst=target)
>>> ip
<IP dst=<Net www.target.com/30> |>
>>> [p for p in ip]
[<IP dst=207.171.175.28 |>, <IP dst=207.171.175.29 |><IP dst=207.171.175.30 |>, <IP dst=207.171.175.31 |>]
>>> ^D 
# scapy -s mysession
Using session [mysession]
Welcome to Scapy (0.9.17.108beta)
>>> ip
<IP dst=<Net www.target.com/30 |> 

现在,我们来操纵一些报文:

>>> IP()
<IP |>
>>> a=IP(dst="172.16.1.40")
<IP dst=172.16.1.40 |>
>>> a.dst
'172.16.1.40'
>>> a.ttl
64

让我们来说我想要一个广播的MAC地址,并且负载的IP报文要到达ketchup.com和mayo.com,TTL值从1到9,并负载UDP报文:

>>> Ether(dst="ff:ff:ff:ff:ff:ff")/IP(dst=["ketchup.com", "mayo.com"], ttl=(1,9))/UDP()

现在我们在一行(一个确定报文(implicit packet))中定义了18个报文。

合理的默认值

Scapy试图在所有种类的报文数据域中使用合理的默认值,如果没有被重载的话,

  • IP源地址根据目的地址和路由表选择
  • 校验和自动计算
  • 源MAC地址根据输出接口(output interface)选择
  • 以太网类型和IP协议由高层决定

default values ip

其它数据域选择最有用的值:

  • TCP源端口为20,目的端口为80
  • UDP源端口和目的端口均为53
  • ICMP类型为echo request

学习Python

Scapy使用Python解释器作为命令面板。这意味着你可以直接使用Python语言(创建变量,使用循环,定义函数等等)。

如果你刚开始使用Python并且因此你不理解这些词语,或者如果你想学习这个语言,花一个小时来阅读一个Guido Van Rossum写的非常棒的Python教程。在此之后,你将知道Python :)(真的!)。对于更加深入的学习,Dive Into Python也是一个很好的开始。

作为一个快速的开始,下面是Python数据类型的概览:

  • int(signed, 32bits) : 42
  • long(signed, infinite) : 42L
  • str : "bell\x07\n" or 'bell\x07\n'
  • tuple (immutable): (1,4,"42")
  • list (mutable): [4,2,"1"]
  • dict (mutable): {"one":1, "two":2}

Python中没有块分割符,而是同缩进决定:

if cond:instrinstr
elif cond2:instr
else:instr

http://chatgpt.dhexx.cn/article/sKcyqw5P.shtml

相关文章

Scapy的介绍(一)

介绍 关于Scapy的 Scapy是一个Python程序&#xff0c;使用户能够发送&#xff0c;嗅探和剖析并伪造网络数据包。此功能允许构建可以探测&#xff0c;扫描或攻击网络的工具。 换句话说&#xff0c;Scapy是一个功能强大的交互式数据包操作程序。它能够伪造或解码大量协议的数据…

scapy基本操作

scapy基本操作 scapy是一款基于Python强大的数据包处理工具。它可以用来发送各类定制的数据包也可以用于数据包解析。 由于毕业论文需要对数据包进行预处理&#xff08;数据清洗&#xff0c;数据归一化等&#xff09;&#xff0c;使用scapy进行数据处理。 本文是scapy学习过程…

Scapy的基本操作

Scapy模块的使用 Scapy的基本操作Scapy模块中的函数利用Scapy进行端口屏蔽探测 Scapy的基本操作 1.IP()类型数据包 在Scapy中&#xff0c;每一个协议就是一个类。只需要实例化一个协议类&#xff0c;就可以创建一个该协议的数据包。例如&#xff0c;如果要创建一个IP类型的数…

数据包工具--Scapy基础篇

数据包工具--Scapy基础篇 零、前言一、Scapy是什么&#xff1f;二、Scapy基础1 利用pip安装库2 基本使用2.1 conf变量2.2 lsc()方法2.3 ls()方法 3 发送数据3.1 创建数据3.2 发送数据3.3 fuzz()方法3.4 发送与接收数据 三、结尾 零、前言 学习过程中用到Scapy这个工具&#xf…

SCAPY官方教程一

一、Scapy简介 Scapy是一个强大的基于Python的交互式数据包操作程序和库。Scapy 使用 Python 解释器作为命令板,这意味着您可以直接使用 Python 语言(分配变量、使用循环、定义函数等) Scapy 是一个 Python 程序,它使用户能够发送、嗅探、剖析和伪造网络数据包。这种能力…

Python中Scapy使用方法,模块中的常用函数,简单的端口扫描编写

目录 scapy是什么 scapy的使用 IP() src()和dst() Ether() 采用分层的方式来构造数据包 raw()和hexdump() summary()和show() 如何在scapy中发送和接收数据包 send()和sendp() sr()、sr1()和srp() 简单的端口扫描 sniff() 使用scapy编写简单的端口扫描 scapy是什…

斯特林公式、沃利斯公式

目录 一&#xff0c;斯特林公式 1&#xff0c;公式 2&#xff0c;证明 3&#xff0c;更多项 4&#xff0c;变形 二&#xff0c;沃利斯公式 1&#xff0c;公式 2&#xff0c;变形 一&#xff0c;斯特林公式 1&#xff0c;公式 2&#xff0c;证明 3&#xff0c;更多项 …

在谈天津2023年高考压轴题:斯特林公式数列极限

证明单调性&#xff0c;转化为数列极限问题&#xff0c;利用斯特林公式求极限

斯特林公式应用

51nod1058 这题让求n的阶乘长度&#xff0c;n范围到1e6&#xff0c;很明显会爆long long&#xff0c;那么就需要一个公式直接算出结果–斯特林公式&#xff0c;这个公式的作用就是求n阶乘的近似值。 我们知道求一个十进制数x的位数&#xff0c;log10(x) 1&#xff0c; 用斯特…

【高等数学】伽马函数与斯特林公式

伽马函数的背景 1728年&#xff0c;哥德巴赫在考虑数列插值的问题&#xff0c;通俗的说就是把数列的通项公式定义从整数集合延拓到实数集合&#xff0c;例如数列1,4,9,16…可以用通项公式n自然的表达&#xff0c;即便 n 为实数的时候&#xff0c;这个通项公式也是良好定义的。直…

数论 斯特林公式

斯特林公式是一条用来取n阶乘近似值的数学公式。一般来说&#xff0c;当n很大的时候&#xff0c;n阶乘的计算量十分大&#xff0c;所以斯特灵公式十分好用。从图中可以看出&#xff0c;即使在n很小的时候&#xff0c;斯特灵公式的取值已经十分准确。 公式为&#xff1a; 从图…

求N的阶乘长度(斯特林公式)

输入N求N的阶乘的10进制表示的长度。例如6! 720&#xff0c;长度为3。 求N的阶乘长度 计算n!的公式是斯特林公式: 计算一个数的长度为 log10&#xff08;n&#xff09; 1 AC代码&#xff1a; /***  ┏┓   ┏┓ * ┏┛┻━━━┛┻┓ * ┃       ┃  * ┃…

阶乘问题——斯特林公式

1、计算n&#xff01;的位数 2、估计lg(n&#xff01;)的大小 斯特林公式&#xff1a;&#xff08;n越大越精确&#xff09; 更加精确地&#xff1a; 或者&#xff1a; 相关题目&#xff1a;假的数学游戏 1、计算n&#xff01;的位数 对于整数x&#xff0c;我们知道其位…

斯特林公式的证明

斯特林公式的证明 0.引言 斯特林公式&#xff08;Stirling’s approximation&#xff09;是一条用来取n的阶乘的近似值的数学公式。一般来说&#xff0c;阶乘的计算复杂度为线性。当要为某些极大大的n求阶乘时&#xff0c;常见的方法复杂度不可接受。斯特林公式能够将求解阶乘…

斯特林公式(Stirling's approximation)

斯特林公式&#xff08;Stirlings approximation&#xff09;是一条用来取n的阶乘的近似值的数学公式。一般来说&#xff0c;当n很大的时候&#xff0c;n阶乘的计算量十分大&#xff0c;所以斯特林公式十分好用&#xff0c;而且&#xff0c;即使在n很小的时候&#xff0c;斯特林…

斯特林公式

斯特林公式 定义&#xff1a; 斯特林公式是用来求N的阶乘近似值的公式&#xff1a; 公式为&#xff1a; n ! 2 π n ( n e ) n n!\sqrt{2\pi n}(\frac{n}{e})^n n!2πn ​(en​)n 公式的应用&#xff1a;求n&#xff01;的位数 大家都知道&#xff0c;求一个十进制数n的位…

斯特林公式 ——Stirling公式(取N阶乘近似值)

斯特灵公式是一条用来取n阶乘近似值的数学公式。一般来说&#xff0c;当n很大的时候&#xff0c;n阶乘的计算量十分大&#xff0c;所以斯特灵公式十分好用。从图中可以看出&#xff0c;即使在n很小的时候&#xff0c;斯特灵公式的取值已经十分准确。 公式为&#xff1a; 从图…

popwindow的封装

popwindow使用中还是遇到几个问题&#xff0c;记录一下 1、popwindow弹出位置&#xff0c;还未解决弹出在控件上方的办法&#xff08;目前高度写死&#xff09; 2、popwindow弹出时背景变灰&#xff08;类似dialog的效果&#xff09; 3、popwindow与Listview使用时&#xff…

Andorid PopWindow使用总结

popwindow 经常使用的一个底部弹框 简单的几行代码实现 public class InflateActivity extends AppCompatActivity {private PopupWindow popupWindow;Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentV…