• 关于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 \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:instrinstr
elif cond2:instr
else:instr

Scapy介绍官方文档翻译相关推荐

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

    之前写了[iOS官方文档翻译]iOS的蓝牙连接.数据接收及发送一文,介绍了怎样进行蓝牙通讯,但是很多基本概念没有进行解释,看起来可能有点吃力,所以现在再翻译一篇苹果对官方蓝牙4.0一些基本概念介绍的文 ...

  2. 欢迎参与 KubeVela 官方文档翻译活动

    来源 | 阿里巴巴云原生公众号 背景 KubeVela v1.0 启用了新的官网架构和文档维护方式,新增功能包括文档版本化控制.i18n 国际化以及自动化流程.但目前 KubeVela 官方文档只有英 ...

  3. 【KubeVela 官方文档翻译】,欢迎大家踊跃参与

    简介:KubeVela v1.0 启用了新的官网架构和文档维护方式,新增功能包括文档版本化控制.i18n 国际化以及自动化流程.但目前 KubeVela 官方文档只有英文版,这提高了学习和使用 Kub ...

  4. Log4j2官方文档翻译--欢迎使用Log4j2!

    官网原文标题<Welcome to Log4j 2!> 官网原文地址http://logging.apache.org/log4j/2.x/manual/index.html 译者:本文介 ...

  5. Jess 7.2p2——Java平台规则引擎官方文档翻译1

    Jess 7.2p2--Java平台规则引擎官方文档翻译1 本博客转载自本体小本营. 1.入门 1.1.需求 在使用Jess前请先确认JVM是否正确安装并能正常工作. 使用JessDE集成开发环境,你 ...

  6. [iOS]Advanced Memory Management Programming Guide 高级内存管理编程指南(官方文档翻译)

    Advanced Memory Management Programming Guide - 高级内存管理编程指南(官方文档翻译) 版权声明:本文为博主原创翻译,如需转载请注明出处. 新博客文章地址: ...

  7. 官方文档翻译《The Libra Blockchain》之执行交易(一)

    译自:官方文档翻译<The Libra Blockchain>之执行交易,第三小节.本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可. 执行交易 Lib ...

  8. Okio学习之官方文档翻译

    Okio学习之官方文档翻译 链接: Okio官方文档连接 Okio是一个对java.io和java.nio的补充库.它使我们对数据的访问.存储和加工更加容易. 它最初是作为 OkHttp的一个组件库, ...

  9. Ionic Framework 5官方文档翻译

    Ionic Framework 5官方文档翻译 入门 Ionic Framework 5特点 Ionic Framework是什么? 核心概念 构建你的第一个应用 先进的Web应用 浏览器支持 版本控 ...

最新文章

  1. Logstash(四)插件Output详解
  2. php 单例模式 序列化,php设计模式(二)单例模式
  3. 如何在php搜索显示数据库数据结构_PHP如何实现抓取百度搜索结果并分析数据结构...
  4. 字符串中的编码解码问题
  5. Codeforces Round #664 (Div. 2)
  6. Datawha组队——Pandas(下)综合练习(打卡)
  7. 友情提示!距离CVPR 2020截稿还剩2天!
  8. Packt发布了2018年技能提升报告
  9. android studio 自动引用,Android Studio三方引用报错但是项目可以运行的解决方案
  10. 王道计算机考研——计算机组成原理笔记
  11. 计算机高级应用都有啥,计算机二级MS OFFICE高级应用都有什么题型?
  12. 将长方形转换为正方形
  13. UWP 中的各种文件路径(用户、缓存、漫游、安装……)
  14. 计算机串口故障,电脑故障:主板串口接口故障的维修方法总结
  15. mysql执行计划详解
  16. 琵琶行 (白居易诗作)
  17. 搭配Online:瑞幸昔日“盟友”神州优车,与北汽集团达成战略合作
  18. Istio - 集成ELK - HPE_INVALID_METHOD, lumberjack protocol error
  19. 下连队锻炼(5)----抗洪
  20. 运维工程师需要具备哪些性格特质?

热门文章

  1. myeclipse templete
  2. python3.8怎么安装urllib3_yum 安装python-urllib3报错
  3. flume中hdfs sinks参数配置详解
  4. 广州房地产契税完税凭证在微信无法下载的解决办法
  5. C++STL常用函数
  6. : EXC_BAD_ACCESS (code=EXC_I386_GPFLT)[r retain]: message sent to deallocated instance
  7. 国内首家公安大数据交互式微信服务平台上线
  8. 河南工程学院OJ郑州轻工业学院OJ代码(C语言)
  9. Maven的工程类型有哪些?
  10. 南京某公司二期安居房工程大事记