0x00 前言
scapy是一个强大的交互式(interactive)的包操作程序,用python写的,有一个python的命令行解释器界面,可直接运行,当然也可以作为第三库,导入到我们的python程序中去使用它的类和方法。
关于scapy作者的一个简介:
Philippe Biondi is a research engineer at EADS InnovationWorks(欧洲宇航防务集团创新中心). He works in the IT security lab, and is thecreator of many programs like Scapy or ShellForge. Philippeauthored chapter 6 of Security Power Tools, in which Scapy takes agood place, and also chapter 11.
scapy可以仿造和解析大量协议类型的包,可以把包发到网上,或者捕捉包,可以match请求和回复。更强大的是它可以扫描路由器,扫描协议端口,攻击网络等等等等吧,非常之多,非常之强大。有人称它为可编程的wireshark,它的强大我现在也没能亲身体会,但我感觉它应该比wireshark强大。
0x01 起航Scapy
Scapy的交互shell是运行在一个终端会话当中。因为需要root权限才能发送数据包,所以我们在这里使用“sudo”。
在Windows当中,请打开命令提示符(“cmd.exe”),并确保您拥有管理员权限:
如果您没有安装所有的可选包,Scapy将会告诉你有些功能不可用:
虽然没有安装,但发送和接收数据包的基本功能仍然有效。
0x02 互动教程
本节将会告诉您一些Scapy的功能。让我们按上文所述打开Scapy,亲自尝试些例子吧。
1. 第一步
让我们来建立一个数据包试一试。
2. 层结构(OSI参考模型)
“/”操作符在两个层之间起到一个组合的作用。当使用该操作符时,下层可以根据其上层,使它的一个或多个默认字段被重载。(您仍可以赋予您想要的值)一个字符串也可以被用作原始层。

每一个数据包都可以被建立或分解(注意:在Python中“_”(下划线)是上一条语句执行的结果):
我们看到一个分解的数据包将其所有的字段填充。那是因为,我认为每个字段值由原始字符串附加。如果这太冗长,“hide_defaults()”方法将会删除具有默认值的字段:
3. 读取PCAP文件
你可以从PCAP文件中读取数据包,并将其写入到一个PCAP文件中。
 
4. 图形转储(PDF,PS)
如果您已经安装PyX,你可以做一个数据包的图形转储PostScript/PDF或数据包的列表(见下面丑陋的PNG图像,PostScript/PDF则具有更好的质量...)
5. 生成一组数据包
目前我们只是生成一个数据包。让我们看看如何轻易地定制一组数据包。整个数据包的每一个字段(甚至是网络层次)都可以是一组。在这里隐含地定义了一组数据包的概念,意思是在所有字段中使用笛卡尔积来生成一组数据包。
某些操作(如修改一个数据包中的字符串)无法对一组数据包使用。在这些情况下,如果您忘记展开您的数据包集合,只有您忘记生成的列表中的第一个元素会被用于组装数据包。
6. 发送数据包
现在我们知道了如何处理数据包。让我们来看看如何发送它们。“send()”函数将会在第3层发送数据包。也就是说它会为你处理路由和第2层的数据。“send()”函数将会工作在第2层。选择合适的接口和正确的链路层协议都取决于你。
7. Fuzzing
“fuzz()”函数可以通过一个具有随机值、数据类型合适的对象,来改变任何默认值,但该值是不能被计算的(像校验和那样)。这使得可以快速建立循环模糊化测试模板。在下面的例子中,IP层是正常的,UDP层和NTP层被fuzz。UDP的校验和是正确的,UDP的目的端口被NTP重载为123,而且NTP的版本被更变为4.其他所有的端口将被随机分组:
8. 发送和接收数据包(“sr”)
现在让我们做一些有趣的事情。“sr()”函数是用来发送数据包和接收应答。该函数返回一对数据包及其应答,还有无应答的数据包。“sr1()”函数是一种变体,用来返回一个应答数据包。发送的数据包必须是第3层报文(IP,ARP等)。“srp()”则是使用第2层报文(以太网,802.3等)。
DNS查询(“rd” = recursiondesired)。主机192.168.5.1是我的DNS服务器。注意从我Linksys来的非空填充具有Etherleak缺陷:
发送和接收函数族是scapy中的核心部分。它们返回一对两个列表。第一个就是发送的数据包及其应答组成的列表,第二个是无应答数据包组成的列表。为了更好地呈现它们,它们被封装成一个对象,并且提供了一些便于操作的方法:
如果对于应答数据包有速度限制,你可以通过“inter”参数来设置两个数据包之间等待的时间间隔。如果有些数据包丢失了,或者设置时间间隔不足以满足要求,你可以重新发送所有无应答数据包。你可以简单地对无应答数据包列表再调用一遍函数,或者去设置“retry”参数。如果retry设置为3,scapy会对无应答的数据包重复发送三次。如果retry设为-3,scapy则会一直发送无应答的数据包,直到“timeout”参数等待最后一个数据包已发送的时间。
9. SYN Scans
在Scapy提示符中执行以下命令,可以对经典的SYN Scan初始化:
以上向Google的80端口发送了一个SYN数据包,会在接收到一个应答后退出:
从以上的输出中可以看出,Google返回了一个SA(SYN-ACK)标志位,表示80端口是开放的。
使用其他标志位扫描一下系统的440到443端口:
或者
可以对收集的数据包进行摘要(summary),来快速地浏览响应:
以上显示了我们在扫描过程中的请求应答对。我们也可以用一个循环来只显示我们感兴趣的信息:
可以使用“make_table()”函数建立一个表格,更好地显示多个目标信息:
在以上的例子中,如果接收到作为响应的ICMP数据包而不是预期的TCP数据包,就会打印出ICMP差错类型(errortype)。
对于更大型的扫描,我们可能对某个响应感兴趣,下面的例子就只显示设置了“SA”标志位的数据包:
如果我们想对响应进行专业分析,我们可以使用以下的命令显示哪些端口是开放的:
对于更大型的扫描,我们可以建立一个端口开放表:
如果以上的方法还不够,Scapy还包含一个“report_ports()”函数,该函数不仅可以自动化SYNscan,而且还会对收集的结果以LaTeX形式输出:
10. TCP traceroute
TCP路由追踪: 
注意:TCP路由跟踪和其他高级函数早已被构造好了:
11. 配置高级sockets
发送和接收数据包的过程是相当复杂的。我想用PF_PACKET接口来通过netfilter,我也需要实现一个ARP堆栈、ARP缓存和一个堆栈。在以太网和ppp接口上看来可以工作,但我不保证任何事情。不管怎样,事实上我使用一种super-socket,这意味着你可以很容易的切换IO层,并使用PF_INET/SOCK_RAW,或者使用PF_PACKET的级别2(得到LL头(以太网,…)和自己的mac地址,…)。我刚刚添加了一个使用libdnet和libpcap,的supersocket,所以它应该可以移植:
12. Sniffing
我们可以简单地捕获数据包,或者是克隆tcpdump或tethereal的功能。如果没有指定接口,则会在所有的接口上进行嗅探:
对于控制输出信息,我们可以使用“sprintf()”函数:
我们可以嗅探并进行被动操作系统指纹识别:
猜测操作系统版本前的数字为猜测的精确度。
13. Filters
演示一下bpf过滤器和sprintf()方法:
14. 在循环中接收和发送
这儿有一个例子来实现类似(h)ping的功能:你一直发送同样的数据包集合来观察是否发生变化:
15. 导入和导出数据
PCAP
通常可以将数据包保存为pcap文件以备后用,或者是供其他的应用程序使用:
还原之前保存的pcap文件:
或者
Hexdump
Scapy允许你以不同的十六进制格式输出编码的数据包。
使用“hexdump()”函数会以经典的hexdump格式输出数据包:
使用“import_hexcap()”函数可以将以上的hexdump重新导入到Scapy中:
Hex string
使用“str()”函数可以将整个数据包转换成十六进制字符串: 
通过选择合适的起始层(例如“Ether()”),我们可以重新导入十六进制字符串。
Base64
使用“export_object()”函数,Scapy可以数据包转换成base64编码的Python数据结构:
使用“import_object()”函数,可以将以上输出重新导入到Scapy中:
Sessions
最后可以使用“save_session()”函数来保存所有的session变量:
使用“load_session()”函数,在下一次你启动Scapy的时就能加载保存的session:
16. Making tables
现在我们来演示一下“make_table()”函数的功能。该函数的需要一个列表和另一个函数(返回包含三个元素的元组)作为参数。第一个元素是表格x轴上的一个值,第二个元素是y轴上的值,第三个原始则是坐标(x,y)对应的值,其返回结果为一个表格。这个函数有两个变种,“make_lined_table()”和“make_tex_table()”来复制/粘贴到你的LaTeX报告中。这些函数都可以作为一个结果对象的方法:
在这里,我们可以看到一个多机并行的traceroute(Scapy的已经有一个多TCP路由跟踪功能,待会儿可以看到):   
这里有个更复杂的例子:从他们的IPID字段中识别主机。我们可以看到172.20.80.200只有22端口做出了应答,而172.20.80.201则对所有的端口都有应答,而且172.20.80.197对25端口没有应答,但对其他端口都有应答。
你在使用TTL和显示接收到的TTL等情况下,它可以很轻松地帮你识别网络拓扑结构。
17. Routing
现在Scapy有自己的路由表了,所以将你的数据包以不同于操作系统的方式路由:
18. Gnuplot
我们可以很容易地将收集起来的数据绘制成Gnuplot。(清确保你已经安装了Gnuplot-py和Gnuplot)例如,我们可以通过观察图案知道负载平衡器用了多少个不同的IP堆栈:
19. TCP traceroute (2)
Scapy也有强大的TCPtraceroute功能。并不像其他traceroute程序那样,需要等待每个节点的回应才去下一个节点,scapy会在同一时间发送所有的数据包。其缺点就是不知道什么时候停止(所以就有maxttl参数),其巨大的优点就是,只用了不到3秒,就可以得到多目标的traceroute结果:
最后一行实际上是该函数的返回结果:traceroute返回一个对象和无应答数据包列表。traceroute返回的是一个经典返回对象更加特殊的版本(实际上是一个子类)。我们可以将其保存以备后用,或者是进行一些例如检查填充的更深层次的观察:
和其他返回对象一样,traceroute对象也可以相加:
Traceroute返回对象有一个非常实用的功能:他们会将得到的所有路线做成一个有向图,并用AS组织路线。你需要安装graphviz。在默认情况下会使用ImageMagick显示图形。
如果你安装了VPython,你就可以用3D来表示traceroute。右边的按钮是旋转图案,中间的按钮是放大缩小,左边的按钮是移动图案。如果你单击一个球,它的IP地址就会出现/消失。如果你按住Ctrl单击一个球,就会扫描21,22,23,25,80和443端口,并显示结果:
20. Wireless frame injection
frame injection的前提是你的无线网卡和驱动得正确配置好。
你可以造一个FakeAP:
0x03 Simple one-liners
1. ACK Scan
使用Scapy强大的数据包功能,我们可以快速地复制经典的TCP扫描。例如,模拟ACKScan将会发送以下字符串:
我们可以在有应答的数据包中发现未过滤的端口:
同样的,可以在无应答的数据包中发现过滤的端口:
2. Xmas Scan
可以使用以下的命令来启动Xmas Scan:
有RST响应则意味着目标主机的对应端口是关闭的。
3. IP Scan
较低级的IP Scan可以用来枚举支持的协议:
4. ARP Ping
在本地以太网络上最快速地发现主机的方法莫过于ARP Ping了:
用以下命令可以来审查应答:
Scapy还包含内建函数“arping()”,该函数实现的功能和以上的两个命令类似:
5. ICMP Ping
可以用以下的命令来模拟经典的ICMP Ping:
用以下的命令可以收集存活主机的信息:
6. TCP Ping
如果ICMP echo请求被禁止了,我们依旧可以用不同的TCP Pings,就像下面的TCP SYN Ping:
对我们的刺探有任何响应就意味着为一台存活主机,可以用以下的命令收集结果:
7. UDP Ping
如果其他的都失败了,还可以使用UDP Ping,它可以让存活主机产生ICMP Portunreachable错误。你可以挑选任何极有可能关闭的端口,就像端口0:
同样的,使用以下命令收集结果:
8. Classical attacks
畸形数据包:
死亡之ping (Muuahahah):
Nestea attack:
Land攻击(专为微软视窗):
9. ARP cache poisoning
这种攻击可以通过VLAN跳跃攻击使ARP缓存中毒,使得其他客户端无法加入真正的网关地址。
经典的ARP缓存投毒:
对使用double 802.1q封装的进行ARP缓存投毒:
10. TCP Port Scanning
发送一个TCP SYN到每一个端口上。等待一个SYN-ACK或者是RST或者是一个ICMP错误:
将开放的端口结果可视化:
11. IKE Scanning
我们试图通过发送ISAKMP Security Associationproposals来确定VPN集中器,并接收应答:
可视化结果列表:
12. Advanced traceroute
TCP SYN traceroute
结果会是:
UDP traceroute
相比较TCP来说,traceroute一个UDP应用程序是不可靠的,因为ta没有握手的过程。我们需要给一个应用性的有效载荷(DNS,ISAKMP,NTP等)来得到一个应答:
我们可以想象得到一个路由器列表的结果:
DNS traceroute
我们可以在“traceroute()”函数中设置“l4”参数为一个完整的数据包,来实现DNStraceroute:
13. Etherleaking
14. ICMP leaking
这是一个Linux2.0的一个bug:
15. VLAN hopping
在非常特殊的情况下,使用double 802.1q封装,可以将一个数据包跳到另一个VLAN中:
16. Wireless sniffing
以下的命令将会像大多数的无线嗅探器那样显示信息:
以上命令会产生类似如下的输出:
0x04 Recipes
1. Simplistic ARP Monitor
以下的程序使用了“sniff()”函数的回调功能(prn参数)。将store参数设置为0,就可以使“sniff()”函数不存储任何数据(否则会存储),所以就可以一直嗅探下去。filter参数则用于在高负荷的情况下有更好的性能:filter会在内核中应用,而且Scapy就只能嗅探到ARP流量。
2. Identifying rogue DHCP servers on yourLAN
Problem
你怀疑有人已经在你的LAN中安装了额外的未经授权的DHCP服务器-无论是故意的还是有意的。因此你想要检查是否有任何活动的DHCP服务器,并确定他们的IP和MAC地址。
Solution
使用Scapy发送一个DHCP发现请求,并分析应答:
在这种情况下,我们得到了两个应答,所以测试网络上有两个活动的DHCP服务器:
Discussion
我们设置“multi=True”来确保Scapy在接收到第一个响应之后可以等待更多的应答数据包。这也就是我们为什么不用更方便的“dhcp_request()”函数,而是手动地构造DCHP数据包的原因:“dhcp_request()”使用“srp1()”来发送和接收数据包,这样在接收到一个应答数据包之后就会立即返回。
此外,Scapy通常确保应答来源于之前发送请求的目的地址。但是我们的DHCP数据包被发送到IP广播地址(255.255.255.255),任何应答数据包都将回复DCHP服务器的IP地址作为其源IP地址(e.g.192.168.1.1)。由于这些IP地址不匹配,我们必须在发送请求前使用“conf.checkIPaddr =False”来禁用Scapy的check。
See also
http://en.wikipedia.org/wiki/Rogue_DHCP
3. Firewalking
TTL减一操作过滤后,只有没被过滤的数据包会产生一个ICMP TTL超时
在对多网卡的防火墙查找子网时,只有它自己的网卡IP可以达到这个TTL:
4. TCP Timestamp Filtering
Problem
在比较流行的端口扫描器中,一种常见的情况就是没有设置TCP时间戳选项,而许多防火墙都包含一条规则来丢弃这样的TCP数据包。
Solution
为了让Scapy能够到达其他位置,就必须使用其他选项:
5. Viewing packets with Wireshark
Problem
你已经使用Scapy收集或者嗅探了一些数据包,因为Wireshark高级的数据包展示功能,你想使用Wireshark查看这些数据包。
Solution
正好可以使用“wireshark()”函数:
Discussion
“wireshark()”函数可以生成一个临时pcap文件,来包含你的数据包,然后会在后台启动Wireshark,使其在启动时读取该文件。
请记住Wireshark是处理第二层的数据包(通常被称为“帧”)。所以我们必须为ICMP数据包添加一个Ether()头。如果你直接将IP数据包(第三层)传递给Wireshark,你将会得到一个奇怪的结果。
你可以通过改变conf.prog.wireshark的配置设置,来告诉Scapy去哪寻找Wireshark可执行文件。
6. OS Fingerprinting
ISN
Scapy的可用于分析ISN(初始序列号)递增来发现可能有漏洞的系统。首先我们将在一个循环中发送SYN探头,来收集目标响应:
一旦我们得到响应之后,我们可以像这样开始分析收集到的数据:
nmap_fp
在Scapy中支持Nmap指纹识别(是到Nmap v4.20的“第一代”功能)。在Scapyv2中,你首先得加载扩展模块:
如果你已经安装了Nmap,你可以让Scapy使用它的主动操作系统指纹数据库。清确保version1签名数据库位于指定的路径:
然后你可以使用“namp_fp()”函数,该函数和Nmap操作系统检测引擎使用同样的探针:
p0f
如果你已在操作系统中安装了p0f,你可以直接从Scapy中使用它来猜测操作系统名称和版本。(仅在SYN数据库被使用时)。首先要确保p0f数据库存在于指定的路径:
例如,根据一个捕获的数据包猜测操作系统:
0x05 后记
由于本人英语水平太次,翻译能力有限,文章存在很多问题,还请大家多多指正,不胜感激。
原文地址:http://www.secdev.org/projects/scapy/doc/usage.html

Scapy使用文档中文版相关推荐

  1. javaAPI文档中文版(JDK11在线版)无需下载、直接打开

    强烈推荐!巨好用! 菜鸟教程javaAPI文档中文版:https://www.runoob.com/manual/jdk11api/index.html

  2. JAVA API文档中文版,网盘下载

    JAVA API 1.9文档中文版,网盘下载 链接:https://pan.baidu.com/s/1FKMSg-7xrvNms44W51vR6Q 提取码:4yg4

  3. Direct3D 9.0 SDK 文档(中文版)

    一直以来想将D3D的文档翻译一下,一来是为了学习,二来也是给其他朋友提供一下方便,但一直没有时间来做这件事情,今天偶尔在网上发现有人已经将这件事情做得足够好了,我将链接贴出来,希望想学习D3D的哥们, ...

  4. Java API文档中文版

    Java API文档中文版 Sun 公司提供的Java API Docs是学习和使用Java语言中最经常使用的参考资料之一.但是长期以来此文档只有英文版,对于中国地区的Java开发者来说相当的不便.目 ...

  5. SQLAlchemy 1.3文档中文版 - 对象关系指南

    SQLAlchemy 1.3文档中文版 - 对象关系指南(Object Relational Tutorial) 中文翻译:郭夫子(374jetko@sina.com) 英文原文地址:https:// ...

  6. python3.6手册中文版-python3.6文档中文版

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 新pythonmalloc环境变量现在可用于调试解释器内存分配与访问错误. 标准库 ...

  7. JAVA API文档 中文版

    在学习Java过程中,学会阅读API文档有时候能帮助我们解决不少问题,API文档就像是字典,在我们需要时候可以很方便的进行查找,奈何很多小伙伴的英文可能不是很好,这里分享一个Java 的API文档的中 ...

  8. Apache HTTP Server Version 2.2 文档中文版

    模块索引 | 指令索引 | 常见问题 | 词汇表 | 站点导航 Apache HTTP Server 版本2.2 Apache > HTTP Server > 文档 > 版本2.2 ...

  9. 常用控件产品官方文档/手册/API列表 c#控件文档API列表 asp.net控件产品技术文档中文版...

    .netCHARTING报表图表控件 文档帮助手册  Ab3d.PowerToys 文档帮助手册  Ab3d.Reader3ds 文档帮助手册  ABViewer 文档帮助手册 (工程图纸文档管理系统 ...

最新文章

  1. OpenCV3.3中主成分分析(Principal Components Analysis, PCA)接口简介及使用
  2. linux命令之diff,whereis,locate,pwd,cat,grep,touch,find
  3. quick-cocos2dx在eclipse下的lua调试
  4. decode的mysql用法_MySQL DECODE( )用法及代码示例
  5. Altium Designer -- PCB设置板框
  6. c语言 元组顺序随机化,为什么关系中的元组没有先后顺序且不允许有重复元组?...
  7. java mp4 视频时间戳_MP4文件中音视频时间戳的计算
  8. node中操作MySQL
  9. PHP笔记-PHP中构造函数要注意的地方
  10. rocketmq namesrv 第一章启动过程
  11. ssis 计划任务_SSIS Web服务任务
  12. Linux风雨20年回顾 道路是沧桑
  13. MogileFS与FastDFS的见解
  14. linux系统双网卡不能同时启动,Linux下双网卡绑定eth0,eth1启动失败
  15. Excel-VBA 快速上手(一、宏、VBA、过程、类型与变量、函数)
  16. MATLAB鲁棒控制器实现
  17. 小米笔记本装linux教程视频教程,手把手教你加装SSD,让小米笔记本运行更加666!...
  18. 桌面出现2个计算机,在一个电脑屏幕上如何同时显示两个word
  19. English语法_分词 - 概述
  20. 如何利用JDK8彻底弄懂UNIX时间戳与时区的概念!

热门文章

  1. “速课小龙”项目冲刺2
  2. html点击div等元素隐藏光标
  3. Silverlight 简介
  4. php 无法加载activex,IE怎么无法加载 Activex 控件?
  5. 9.0怎样学习英语?
  6. au6989sn-gtd_GTD和OmniFocus 2-我的工作流程
  7. eclipse中dtd文件约束影射到本地文件
  8. 除了iPhone 还有哪些能确保信息安全的手机?
  9. launcher功能入口(三)
  10. 分布式事务 spring 两阶段提交 tcc