新浪博客

Scapy使用文档中文版

2016-02-17 13:32阅读:
0x00 前言
scapy是一个强大的交互式(interactive)的包操作程序,用python写的,有一个python的命令行解释器界面,可直接运行,当然也可以作为第三库,导入到我们的python程序中去使用它的类和方法。
关于scapy作者的一个简介:
Philippe Biondi is a research engineer at EADS Innovation Works(欧洲宇航防务集团创新中心). He works in the IT security lab, and is the creator of many programs like Scapy or ShellForge. Philippe authored chapter 6 of Security Power Tools, in which Scapy takes a good place, and also chapter 11.
scapy可以仿造和解析大量协议类型的包,可以把包发到网上,或者捕捉包,可以match请求和回复。更强大的是它可以扫描路由器,扫描协议端口,攻击网络等等等等吧,非常之多,非常之强大。有人称它为可编程的wireshark,它的强大我现在也没能亲身体会,但我感觉它应该比wireshark强大。
0x01 起航Scapy
Scapy的交互shell是运行在一个终端会话当中。因为需要root权限才能发送数据包,所以我们在这里使用“sudo”。

Scapy使用文档中文版

在Windows当中,请打开命令提示符(“cmd.exe”),并确保您拥有管理员权限:
Scapy使用文档中文版
如果您没有安装所有的可选包,Scapy将会告诉你有些功能不可用:
Scapy使用文档中文版
虽然没有安装,但发送和接收数据包的基本功能仍然有效。
0x02 互动教程
本节将会告诉您一些Scapy的功能。让我们按上文所述打开Scapy,亲自尝试些例子吧。
1. 第一步
让我们来建立一个数据包试一试。
Scapy使用文档中文版
2. 层结构(OSI参考模型)
“/”操作符在两个层之间起到一个组合的作用。当使用该操作符时,下层可以根据其上层,使它的一个或多个默认字段被重载。(您仍可以赋予您想要的值)一个字符串也可以被用作原始层。
Scapy使用文档中文版
Scapy使用文档中文版
每一个数据包都可以被建立或分解(注意:在Python中“_”(下划线)是上一条语句执行的结果):
Scapy使用文档中文版
我们看到一个分解的数据包将其所有的字段填充。那是因为,我认为每个字段值由原始字符串附加。如果这太冗长,“hide_defaults()”方法将会删除具有默认值的字段:
Scapy使用文档中文版
3. 读取PCAP文件
你可以从PCAP文件中读取数据包,并将其写入到一个PCAP文件中。
Scapy使用文档中文版

4. 图形转储(PDF,PS)
如果您已经安装PyX,你可以做一个数据包的图形转储PostScript/PDF或数据包的列表(见下面丑陋的PNG图像,PostScript/PDF则具有更好的质量...)
Scapy使用文档中文版
Scapy使用文档中文版
Scapy使用文档中文版
5. 生成一组数据包
目前我们只是生成一个数据包。让我们看看如何轻易地定制一组数据包。整个数据包的每一个字段(甚至是网络层次)都可以是一组。在这里隐含地定义了一组数据包的概念,意思是在所有字段中使用笛卡尔积来生成一组数据包。
Scapy使用文档中文版
某些操作(如修改一个数据包中的字符串)无法对一组数据包使用。在这些情况下,如果您忘记展开您的数据包集合,只有您忘记生成的列表中的第一个元素会被用于组装数据包。
Scapy使用文档中文版
6. 发送数据包
现在我们知道了如何处理数据包。让我们来看看如何发送它们。“send()”函数将会在第3层发送数据包。也就是说它会为你处理路由和第2层的数据。“send()”函数将会工作在第2层。选择合适的接口和正确的链路层协议都取决于你。
Scapy使用文档中文版
7. Fuzzing
“fuzz()”函数可以通过一个具有随机值、数据类型合适的对象,来改变任何默认值,但该值是不能被计算的(像校验和那样)。这使得可以快速建立循环模糊化测试模板。在下面的例子中,IP层是正常的,UDP层和NTP层被fuzz。UDP的校验和是正确的,UDP的目的端口被NTP重载为123,而且NTP的版本被更变为4.其他所有的端口将被随机分组:
Scapy使用文档中文版
8. 发送和接收数据包(“sr”)
现在让我们做一些有趣的事情。“sr()”函数是用来发送数据包和接收应答。该函数返回一对数据包及其应答,还有无应答的数据包。“sr1()”函数是一种变体,用来返回一个应答数据包。发送的数据包必须是第3层报文(IP,ARP等)。“srp()”则是使用第2层报文(以太网,802.3等)。
Scapy使用文档中文版
DNS查询(“rd” = recursion desired)。主机192.168.5.1是我的DNS服务器。注意从我Linksys来的非空填充具有Etherleak缺陷:
Scapy使用文档中文版
发送和接收函数族是scapy中的核心部分。它们返回一对两个列表。第一个就是发送的数据包及其应答组成的列表,第二个是无应答数据包组成的列表。为了更好地呈现它们,它们被封装成一个对象,并且提供了一些便于操作的方法:
Scapy使用文档中文版
如果对于应答数据包有速度限制,你可以通过“inter”参数来设置两个数据包之间等待的时间间隔。如果有些数据包丢失了,或者设置时间间隔不足以满足要求,你可以重新发送所有无应答数据包。你可以简单地对无应答数据包列表再调用一遍函数,或者去设置“retry”参数。如果retry设置为3,scapy会对无应答的数据包重复发送三次。如果retry设为-3,scapy则会一直发送无应答的数据包,直到“timeout”参数等待最后一个数据包已发送的时间。
9. SYN Scans
在Scapy提示符中执行以下命令,可以对经典的SYN Scan初始化:
Scapy使用文档中文版
以上向Google的80端口发送了一个SYN数据包,会在接收到一个应答后退出:
Scapy使用文档中文版
从以上的输出中可以看出,Google返回了一个SA(SYN-ACK)标志位,表示80端口是开放的。
使用其他标志位扫描一下系统的440到443端口:
Scapy使用文档中文版
或者
Scapy使用文档中文版

我的更多文章

下载客户端阅读体验更佳

APP专享