Scapy是什么?

来源:TechTMT.Com  作者:整理  日期:2022-02-25 13:49:05

Scapy是一种用于计算机网络的数据包处理工具,由 Philippe Biondi 用Python编写。它可以伪造或解码数据包,通过网络发送它们,捕获它们,并匹配请求和响应。它还可以用于处理扫描、跟踪路由、探测、单元测试、攻击和网络发现等任务。

Scapy

Scapy 为 libpcap(Windows 上是 WinPCap/Npcap)提供了一个 Python 接口,与 Wireshark 提供视图和捕获 GUI 的方式类似。它可以与许多其他程序接口来提供可视化,包括用于解码数据包的 Wireshark、用于提供图形的 GnuPlot、用于可视化的 graphviz 或 VPython 等。

Scapy 自 2018 年起开始支持 Python 3(Scapy 2.4.0 )。

Kamene 是 Scapy 的一个独立分支。最初,创建它的目的是向 Scapy 添加 Python 3 的支持,并将其命名为 scapy3k。自 2018 年更名为 Kamene,继续独立发展。

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

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

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

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

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

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 解码而不解释

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

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

分类:资讯
标签:是什么
编辑:tmt
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。文章版权归原作者所有,内容不代表本站立场!
免责声明: 阁下应知本站所提供的内容不能做为操作依据。本站作为信息内容发布平台,不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考! 如文中内容影响到您的合法权益(含文章中文字、图片等),请及时联系本站,我们会及时删除处理。