Scapy的介绍(一)

article/2025/9/6 4:37:16

介绍

关于Scapy的

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

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

Scapy在很多其他工具无法处理的其他特定任务上表现也很好,比如发送无效帧,注入自己的802.11帧,组合技术(VLAN跳频+ ARP缓存中毒,WEP加密通道上的VOIP解码,... )等

这个想法很简单。Scapy主要做两件事:发送数据包和接收答案。您定义一组数据包,它发送它们,接收答案,匹配带有答案的请求,并返回数据包对(请求,应答)列表和不匹配数据包列表。这比Nmap或hping这样的工具有一个很大的优势,即答案不会减少到(打开/关闭/过滤),而是整个数据包。

除此之外,还可以构建更多高级功能,例如,执行跟踪路由并仅提供请求的起始TTL和答案的源IP的功能。一个ping整个网络并提供机器回答的列表。执行portscan并返回LaTeX报告的人。

是什么让Scapy如此特别

首先,使用大多数其他网络工具,您将无法构建作者无法想象的东西。这些工具是为特定目标而构建的,不能偏离它。例如,ARP缓存中毒程序不允许您使用双802.1q封装。或者尝试找一个可以发送带有填充的ICMP数据包的程序(我说填充,而不是有效负载,请参阅?)。事实上,每次有新需求时,都必须构建一个新工具。

其次,它们通常会混淆解码和解释。机器擅长解码,可以帮助人类。解释是为人类保留的。有些程序试图模仿这种行为。例如,他们说“ 这个端口是开放的 ”而不是“ 我收到了一个SYN-ACK ”。有时他们是对的。有时不是。这对初学者来说更容易,但是当你知道自己在做什么的时候,你会继续尝试从程序的解释中推断出真正发生的事情来制作你自己的,这很难,因为你丢失了大量的信息。而且您经常最终使用解码和解释工具遗漏的内容。tcpdump -xX

第三,即使是只能解码的程序也不会向您提供他们收到的所有信息。他们给你的网络愿景是他们的作者认为足够的。但它并不完整,你有偏见。例如,您是否知道报告以太网填充的工具?

Scapy试图克服这些问题。它使您能够准确地构建所需的数据包。即使我认为在TCP之上堆叠802.1q层没有任何意义,但对于其他人来说,它可能还有一些我不知道的产品。Scapy有一个灵活的模型,试图避免这种任意限制。您可以在任何您想要的字段中随意添加任何值,并按照您的需要进行堆叠。毕竟你是一个成年人。

事实上,它就像每次构建一个新工具,但不是处理百行C程序,而是只编写两行Scapy。

在探测(扫描,跟踪路由等)之后,在进行任何解释之前,Scapy始终会为探测器提供完整的解码数据包。这意味着您可以探测一次并多次解释,请求traceroute并查看填充。

快速包设计

其他工具坚持程序 - 你从shell运行的范例。结果是描述数据包的可怕语法。对于这些工具,采用的解决方案使用工具作者想象的场景形式的更高但不太强大的描述。例如,只有IP地址必须提供给端口扫描程序才能触发端口扫描方案。即使方案稍微调整一下,您仍然会遇到端口扫描。

Scapy的范例是提出一种域特定语言(DSL),它可以对任何类型的数据包进行强大而快速的描述。使用Python语法和Python解释器作为DSL语法和解释器有许多优点:不需要编写单独的解释器,用户不需要学习另一种语言,并且他们可以从完整,简洁和非常强大的语言中受益。

Scapy使用户能够将一个包或一组包描述为一个堆叠在一起的层。每个图层的字段都有可用的默认值,可以重载。Scapy并不要求用户使用预定的方法或模板。这减轻了每次需要不同场景时编写新工具的要求。在C中,可能需要平均60行来描述分组。使用Scapy,要发送的数据包可能只用一行描述另一行来打印结果。90%的网络探测工具可以用2行Scapy重写。

探测一次,解释很多

网络发现是黑盒测试。在探测网络时,会发送许多刺激,而只有少数刺激被回答。如果选择了正确的刺激,则可以通过响应或缺乏响应来获得所需信息。与许多工具不同,Scapy提供所有信息,即发送的所有刺激和收到的所有响应。检查这些数据将为用户提供所需的信息。当数据集很小时,用户可以挖掘它。在其他情况下,数据的解释将取决于所采用的观点。大多数工具选择视点并丢弃与该视点无关的所有数据。由于Scapy提供了完整的原始数据,因此可以多次使用该数据,从而允许视点在分析过程中发展。例如,可以探测TCP端口扫描,并将数据视为端口扫描的结果。然后,还可以相对于响应分组的TTL来可视化数据。不需要启动新的探测来调整数据的视点。

Scapy解码,它不解释

网络探测工具的一个常见问题是它们试图解释所接收的答案,而不是仅解码和给出事实。报告 端口80上的“接收TCP重置”之类的内容不受解释错误的影响。报告端口80关闭是一种解释,可能在大多数情况下是正确的,但在该工具的作者无法想象的某些特定上下文中是错误的。例如,某些扫描程序在收到ICMP目标不可达数据包时往往会报告已过滤的TCP端口。这可能是正确的,但在某些情况下,这意味着数据包未被防火墙过滤,而是没有主机将数据包转发到。

解释结果可以帮助那些不知道端口扫描是什么但却弊大于利的用户,因为它会在结果中注入偏差。可能发生的事情是,他们可以自己进行解释,知识渊博的用户将尝试对工具的解释进行逆向工程,以得出触发该解释的事实。不幸的是,此操作中丢失了大量信息。

快速演示

通过scapy命令进入交互式界面

首先,我们播放一下并一次创建四个IP数据包。让我们看看它是如何工作的。我们首先实例化IP类。然后,我们再次实例化它,我们提供一个值得四个IP地址的目的地(/ 30给出网络掩码)。使用Python习语,我们在一组显式数据包中开发此隐式数据包。然后,我们退出了翻译。当我们提供会话文件时,我们正在处理的变量被保存,然后重新加载:

# ./run_scapy -s mysession
New session [mysession]
Welcome to Scapy (2.4.0)
>>> IP()
<IP |>
>>> 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
# ./run_scapy -s mysession
Using session [mysession]
Welcome to Scapy (2.4.0)
>>> ip
<IP dst=<Net www.target.com/30> |>

现在,让我们操纵一些数据包:

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

假设我想要广播MAC地址,以及到ketchup.com和mayo.com的IP有效负载,从1到9的TTL值以及UDP有效负载:

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

我们在1行中定义了18个数据包(1个隐式数据包)

合理的默认值

Scapy尝试为所有数据包字段使用合理的默认值。如果没有被覆盖,

  • 根据目的地和路由表选择IP源
  • 计算校验和
  • 根据输出接口选择源MAC
  • 以太网类型和IP协议由上层决定

其他字段的默认值被选为最有用的值:

  • TCP源端口为20,目标端口为80。
  • UDP源和目标端口为53。
  • ICMP类型是echo请求。

学习

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

如果你是Python的新手并且因为这个原因你真的不懂一个词,或者如果你想学习这门语言,花一个小时阅读 Guido Van Rossum 的非常好的Python教程。在那之后,你会知道Python :)(真的!)。有关更深入的教程,Dive Into Python也是一个非常好的开始。

为了快速入门,这里是Python数据类型的概述:

  • int (签名,32位): 42
  • long (签名,无限): 42L
  • str"bell\x07\n"’bell\x07\n’
  • tuple (不变): (1,4,"42")
  • list (可变): [4,2,"1"]
  • dict (可变): { "one":1 , "two":2 }

Python中没有块分隔符。相反,缩进确实很重要:

if cond:instrinstr
elif cond2:instr
else:instr

进QQ群(779809018)免费领取学习资源,疑难问题解答。同时欢迎大家关注我的微信公众号:代码帮 ,免费领取学习资源。

本公众号将秉持活到老学到老学习无休止的交流分享开源精神,汇聚于互联网和个人学习工作的精华干货知识,一切来于互联网,反馈回互联网。
目前研究领域:大数据、机器学习、深度学习、人工智能、数据挖掘、数据分析。 语言涉及:Java、Scala、Python、Shell、Linux等 。同时还涉及平常所使用的手机、电脑和互联网上的使用技巧、问题和实用软件破解。 只要你一直关注和呆在群里,每天必须有收获,讨论和答疑QQ群:大数据和人工智能总群(779809018)微信公众号(代码帮)每天分享最新IT、大数据和人工智能新技术。


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

相关文章

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…

android自定义popwindow,Android应用开发Android 自定义PopWindow的简单使用

本文将带你了解Android应用开发Android 自定义PopWindow的简单使用,希望本文对大家学Android有所帮助。 下面用一个简单的自定义布局来讲解PopWindow的使用 先看效果图: 1.popwidow的类实现: import android.content.Context; import android.graphics.drawable.BitmapDrawa…