Scapy介绍官方文档翻译

  • 关于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 的功能。

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整个网络并得到匹配的回复的列表,您还可以扫描商品并得到一个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端口。这可能是正确的,但是在某些情况下,这表明报文被防火墙过滤掉而找不到报文的非目的主机。

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

快速展示(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协议由高层决定

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

  • 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:
    instr
    instr
elif cond2:
    instr
else:
    instr
时间: 2024-10-06 05:42:21

Scapy介绍官方文档翻译的相关文章

Alljoyn瘦客户端库介绍(官方文档翻译)

Alljoyn瘦客户端库介绍(1) 1.简介 本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍.本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设备加入AllJoyn系统整体架构中.1.1目的 本文档介绍了如何使一个受限于功耗.计算能力和内存的设备(嵌入式设备)加入AllJoyn分布式系统.具体而言,本文档包括了对AllJoyn面向嵌入式系统的方面的介绍,并着重描述了基于AllJoyn的系统的各个组件是如何与嵌入式设备协作以构建一个基于接近式

Alljoyn瘦客户端库介绍(官方文档翻译 下)

由于其他事情耽误,这个翻译现在才完成.接上篇—— 4 瘦客户端核心库架构 由于AllJoyn瘦客户端核心库(AJTCL)必须运行在那些功耗受限.计算能力有限.资源紧缺的设备上,因此它无法像运行在通用型计算机系统上那样使用和AllJoyn标准核心库(AJSCL)一样的架构. 一个AJSL或服务进程的分层结构如图3所示.<Introduction to the AllJoyn Framework>一文描述了这些层次结构的更详尽细节.需要特别注意的是, 每个Alljoyn客户端或服务器程序都会以这种

JavaFX 2.0+ 官方文档翻译和技术资料整理计划

一年以来,公司在采用最新的Java桌面技术-JavaFX 2.0(在Java 8中版本已经升级为JavaFX8)来开发行业软件,团队内部只有少部分人对这门新技术有一定程度的掌握.本着在团队内部普及JavaFX基础知识,以及为JavaFX在国内的传播发展贡献部分力量的目标,接下来计划将JavaFX 8的官方文档进行翻译和注解,并配上使用过程中的一些心得. JavaFX8 官方英文文档:http://docs.oracle.com/javase/8/javase-clienttechnologies

【iOS官方文档翻译】iOS蓝牙的基本概念

之前写了[iOS官方文档翻译]iOS的蓝牙连接.数据接收及发送一文,介绍了怎样进行蓝牙通讯,但是很多基本概念没有进行解释,看起来可能有点吃力,所以现在再翻译一篇苹果对官方蓝牙4.0一些基本概念介绍的文章. 1.中心设备和外围设备以及它们在蓝牙通讯中的角色. 在所有的BLE( Bluetooth low energy,下文简称蓝牙4.0 )通讯中都涉及2个主要的角色:中心设备和外围设备.它是基于传统的客户-服务器(主从式)结构,一般来说,外围设备有其它设备需要的数据,中心设备使用外围设备提供的数据

GoogleServices之GooglePlayService官方文档翻译

GoogleServices之GooglePlayService官方文档翻译 在更广泛的设备上给你的应用程序更多的特性去吸引用户,使用GooglePlayService,你的应用程序能利用最新的优势,谷歌驱动特性比如地图,Googl+和更多,使用自动分布式更新平台通过GooglePlay商店更新APK.这使他更快的为你的用户接收更新和更容易的为你集成谷歌提供的最新的. GoogleTechnology(谷歌科技) Googleplay services 为你提供轻松访问谷歌服务,与安卓系统紧密集

JNI官方文档翻译3-基本数据类型 字符串 数组

在使用JNI的时候,你问的最多的问题莫过于 Java的数据类型和C/C++的数据类型怎么一对一映射.在我们的HelloWord例子当中,我们并没有传入任何参数给我们的java层print方法,native方法也并没有返回任何数据而是void,本地方法只是简单的打印一个字符串,然后就返回了.实际开发中我们都需要传入参数,返回参数,本章就会讨论如何从java层向底层传数据,以及如何从底层向java层返回数据.我们从基本数据类型 字符串 数组开始, 下一章再介绍如何传任意类型的数据,以及如何访问他们的

JNI官方文档翻译4-属性和方法的访问

本篇文章介绍如何访问任意对象的属性和方法,当然是在native层访问,方法的访问一般作为java层的回调来访问.我们先从 属性的访问和回调函数的访问开始,接下来再讨论一下使用一种高效简单的缓存技术来提高效率.最后我们讨论native访问java层属性和方法的性能特点. 属性的访问: Java语言支持两种属性,每个实例都有自己独立的属性,所有实例共享同一份静态属性.JNI提供get set 系列方法来访问静态属性和非晶态属性. 请看如下代码片段: class InstanceFieldAccess

Ext JS 4 架构你的应用 第2节 (官方文档翻译)

原文地址:http://docs.sencha.com/extjs/4.0.7/#!/guide/mvc_pt2 [翻译 by 明明如月 QQ 605283073 本章节配套项目代码将在第3节给出] 上一节:Ext JS 4 架构你的应用 第1节 (官方文档翻译) 下一节:Ext JS4 架构你的应用 第3节 (官方文档翻译) 在上一篇文章中我们介绍了,怎样基于Ext JS构建一个 潘多拉风格的应用. 让我们探讨一下Model-View-Controller(模型-视图-控制器)架构以及怎样将其

web2py官方文档翻译03

概述 最美代码 web2py官方文档翻译 2016年2月10日 启动 web2py进来二进制包为Windows和Mac OS x包括Python解释器,所以你不需要预装. 还有一个源代码版本运行在Windows,Mac,Linux和其他Unix系统. Windows和mac OS X的二进制版本包括必要的Python解释器. Python源代码包假设已经安装在电脑上. web2py不需要安装. 首先,解压缩下载的zip文件的特定的操作系统和相应的执行 web2py 文件. 在Windows上,运