logo资料库

Scapy 中文文档.pdf

第1页 / 共120页
第2页 / 共120页
第3页 / 共120页
第4页 / 共120页
第5页 / 共120页
第6页 / 共120页
第7页 / 共120页
第8页 / 共120页
资料共120页,剩余部分请下载后查看
Scapy 中文文档
介绍
下载和安装
使用方法
高级用法
构建你自己的工具
添加新的协议
常见问题
Scapy 开发
目錄 Scapy 中文文档 介绍 下载和安装 使用方法 高级用法 构建你自己的工具 添加新的协议 常见问题 Scapy 开发 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1
Scapy 中文文档 Scapy 中文文档 原文:Welcome to Scapy's documentation! 在线阅读 PDF格式 EPUB格式 MOBI格式 Github 译者 章节 原文 介绍 下载和安装 使用方法 高级用法 构建你自己的工具 添加新的协议 常见问题 Scapy 开发 Introduction Download and Installation Usage Advanced usage Build your own tools Adding new protocols Troubleshooting Scapy development 译者 pdcxs007 飞龙 Larry 草帽小子_DJ 草帽小子_DJ 草帽小子_DJ 飞龙 飞龙 2
介绍 介绍 译者:pdcxs007 来源:Scapy介绍官方文档翻译 原文:Introduction 协议:CC BY-NC-SA 2.5 关于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 , tcpdump 和 tshark 的功能。 Scapy 在大多数其它工具无法完成的特定任务中也表现优异,比如发送无效帧、 添加自定义的802.11的侦、多技术的结合(跳跃攻击(VLAN hopping)+ARP缓存中毒 (ARP cache poisoning)、在WEP加密信道(WEP encrypted channel)上的VOIP解码 3
介绍 (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地址。即 4
介绍 使情景有所改变,情况依然如此(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 解码而不解释 5
介绍 网络探测工具所共有的一个问题是它们都试图解释收到的回应而非仅仅解码并给出 结果。报告一些类似于在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() >>> target="www.target.com" >>> target="www.target.com/30" >>> ip=IP(dst=target) >>> ip |> >>> [p for p in ip] [, , ] >>> ^D # scapy -s mysession Using session [mysession] Welcome to Scapy (0.9.17.108beta) >>> ip 现在,我们来操纵一些报文: 6
介绍 >>> IP() >>> a=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协议由高层决定 7
介绍 其它数据域选择最有用的值: 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 8
分享到:
收藏