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

关于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))等等等等。

理念非常easy。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)。机器擅长解码并能帮助人类完毕这个工作。

解释应该留给人类。

一些程序试图模拟这个行为。比方它们说“这个port是打开的”而不是说“我收到一个SYN-ACK“.有时它们是对的。但有时不是。

这样做对于刚開始学习的人来说更easy,可是当您知道您正在做什么,您将继续试图推从程序的解释中測实际上发生了什么来制作自己的工具,可是这相当困难。由于大量的信息已经丢失。因此终于经常是您使用tcpdump -xX来解码和解释这些工具丢掉的内容。

第三,即使是那些仅仅管解码的程序也没有把它们收到的全部的信息交给您。它们给您展示的网络信息仅仅是其作者觉得足够的信息。可是这些并不完整,对您来说是偏颇的。

比方。您知道有什么工具能够得到以太帧填充的报文吗(reports the Ethernet padding)?

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

在探測(probe)(或者扫描(scan)、路由跟踪(traceroute)等等)之后,Scapy总是在不论什么的解释之前把探測到的全部的包解码后给您。

这意味着您能够探測一次而解释非常多次,也能够使用路由跟踪并查看报文填充内容。

高速的报文设计

其他的工具坚持命令行执行的模式。这导致描写叙述一个报文须要糟糕的语法。对于这些工具。解决办法是在其作者想像的情景下,採用一种更高层可是功能更弱的描写叙述方法。

举例来说。在port扫描的情景中,port扫描器必须的參数仅仅有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给出完整的原始数据,因此这些数据能够多次使用从而同意关注点在分析过程中发生变化。比方,可能探測一个TCPport扫描而关注(展示)port扫描的结果。同一时候也能够查看回应报文的TTL方面的内容。一个新的探測并不须要再来一次,而仅仅是在已有的数据中改一下关注点就可以。

Scapy解码而不解释

网络探測工具所共同拥有的一个问题是它们都试图解释收到的回应而非仅仅解码并给出结果。

报告一些相似于在80port收到一个TCP Reset报文这种消息不属于解释错误。报告80port关闭在多数情况下是正确的,可是在某些特定的工具的作者没有想到的上下文中是错误的。比方。一些扫描器在收到一个目的地址不可达的ICMP报文后倾向于报告一个过滤TCPport。这可能是正确的。可是在某些情况下,这表明报文被防火墙过滤掉而找不到报文的非目的主机。

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

高速展示(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源port为20,目的port为80
  • UDP源port和目的port均为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

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

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

    由于其他事情耽误,这个翻译现在才完成.接上篇—— 4 瘦客户端核心库架构 由于AllJoyn瘦客户端核心库(AJTCL)必须运行在那些功耗受限.计算能力有限.资源紧缺的设备上,因此它无法像运行在通用型 ...

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

    Alljoyn瘦客户端库介绍(上) 1.简介 本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍.本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设 ...

  3. Kafka介绍 (官方文档翻译)

    摘要:Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动 ...

  4. GreenDao官方文档翻译(上)

    笔记摘要: 上一篇博客简单介绍了SQLite和GreenDao的比较,后来说要详细介绍下GreenDao的使用,这里就贴出本人自己根据官网的文档进行翻译的文章,这里将所有的文档分成上下两部分翻译,只为 ...

  5. Retrofit官方文档翻译

    Retrofit官方文档翻译 官方文档网址 http://square.github.io/retrofit/ 介绍 Retrofit 将你的 HTTP API 转换为 Java 接口. public ...

  6. Spark官方文档翻译(一)~Overview

    Spark官方文档翻译,有问题请及时指正,谢谢. Overview页 http://spark.apache.org/docs/latest/index.html Spark概述 Apache Spa ...

  7. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)

    编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址 Django 2.0.1 官方文档翻译: Django 2.0.1.dev20171223092829 documen ...

  8. Spring官方文档翻译(1~6章)

    Spring官方文档翻译(1~6章) 转载至 http://blog.csdn.net/tangtong1/article/details/51326887 Spring官方文档.参考中文文档 一.S ...

  9. UIWebView---iOS-Apple苹果官方文档翻译

    CHENYILONG Blog UIWebView---iOS-Apple苹果官方文档翻译 UIWebView 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博h ...

随机推荐

  1. 关于android中线程,进程,组件,app的理解

    android系统是一座房子.有一个正常执行的公司进驻这所座子 cpu是这家公司的老板 进程是公司中的办公室,办公室不干活 线程是办公室中的员工,干活的永远是员工 一间办公室中可有多个员工,而且办公室 ...

  2. C语言 - .c和.h文件的困惑

    本质上没有任何区别. 只不过一般:.h文件是头文件,内含函数声明.宏定义.结构体定义等内容. .c文件是程序文件,内含函数实现,变量定义等内容.而且是什么后缀也没有关系,只不过编译器会默认对某些后缀的 ...

  3. The Euler function(hdoj --2824-欧拉函数)

    The Euler function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. Spring版本功能变更&Spring4.x的新特性

    有朋友想知道Spring不同版本都有哪些功能变更,说直接在百度搜索找到的结果都不是想要的,其实还是关键词不对,找Spring不同版本的新特性就能获得更好的结果.其实在Spring工程github的wi ...

  5. Selenium等待某个元素出现之隐式等待

    找不到元素这个问题困扰了两天了,一直怀疑是页面div层次太多,定位不准确.于是就从table开始到最后一层精确定位,仍然找不元素.怎么办,在网上搜索答案,说是可以加个隐式试试,于是在执行前加了一句等待 ...

  6. 抽象工厂模式(AbsFactory)C++实现

    模式意图:提供一个创建一系列相关或相互依赖对象的接口,二无需指定他们具体的类. 效果: 分离了具体的类.     使  a.客户与类的实现分离  b.客户通过抽象接口操纵实例  c.产品的类名在实现中 ...

  7. 第6章 服务模式 Service Interface(服务接口)

    Service Interface(服务接口) 上下文 您正在设计企业应用程序,并且需要能够通过网络使用其部分功能.此功能需要能够被各类系统使用,因此互操作性是设计的重要方面.除互操作性之外,可能还需 ...

  8. JavaScript实现网页换肤

    <html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...

  9. Spring AOP理解

    Spring的核心思想的IOC和AOP.最近学习AOP,对切面的学习有了进一步的认识. Spring用代理类包裹切面,把他们织入到Spring管理的bean中.也就是说代理类伪装成目标类,它会截取对目 ...

  10. (转载)TNSPING命令

    Oracle Net 工具(命令)tnsping,是一个OSI会话层的工具,它用来: 1)验证名字解析(name resolution,当然是oracle自己的网络服务名) 2)远程的listener ...