Scapy使用文档中文版

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”。

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” = recursiondesired)。主机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使用文档中文版

可以对收集的数据包进行摘要(summary),来快速地浏览响应:

Scapy使用文档中文版

以上显示了我们在扫描过程中的请求应答对。我们也可以用一个循环来只显示我们感兴趣的信息:

Scapy使用文档中文版

可以使用“make_table()”函数建立一个表格,更好地显示多个目标信息:

Scapy使用文档中文版

在以上的例子中,如果接收到作为响应的ICMP数据包而不是预期的TCP数据包,就会打印出ICMP差错类型(errortype)。

对于更大型的扫描,我们可能对某个响应感兴趣,下面的例子就只显示设置了“SA”标志位的数据包:

Scapy使用文档中文版

如果我们想对响应进行专业分析,我们可以使用以下的命令显示哪些端口是开放的:

Scapy使用文档中文版

对于更大型的扫描,我们可以建立一个端口开放表:

Scapy使用文档中文版

如果以上的方法还不够,Scapy还包含一个“report_ports()”函数,该函数不仅可以自动化SYNscan,而且还会对收集的结果以LaTeX形式输出:

Scapy使用文档中文版

10. TCP traceroute

TCP路由追踪: 

Scapy使用文档中文版

注意:TCP路由跟踪和其他高级函数早已被构造好了:

Scapy使用文档中文版

11. 配置高级sockets

发送和接收数据包的过程是相当复杂的。我想用PF_PACKET接口来通过netfilter,我也需要实现一个ARP堆栈、ARP缓存和一个堆栈。在以太网和ppp接口上看来可以工作,但我不保证任何事情。不管怎样,事实上我使用一种super-socket,这意味着你可以很容易的切换IO层,并使用PF_INET/SOCK_RAW,或者使用PF_PACKET的级别2(得到LL头(以太网,…)和自己的mac地址,…)。我刚刚添加了一个使用libdnet和libpcap,的supersocket,所以它应该可以移植:

Scapy使用文档中文版

12. Sniffing

我们可以简单地捕获数据包,或者是克隆tcpdump或tethereal的功能。如果没有指定接口,则会在所有的接口上进行嗅探:

Scapy使用文档中文版

对于控制输出信息,我们可以使用“sprintf()”函数:

Scapy使用文档中文版

我们可以嗅探并进行被动操作系统指纹识别:

Scapy使用文档中文版

猜测操作系统版本前的数字为猜测的精确度。

13. Filters

演示一下bpf过滤器和sprintf()方法:

Scapy使用文档中文版

14. 在循环中接收和发送

这儿有一个例子来实现类似(h)ping的功能:你一直发送同样的数据包集合来观察是否发生变化:

Scapy使用文档中文版

15. 导入和导出数据

PCAP

通常可以将数据包保存为pcap文件以备后用,或者是供其他的应用程序使用:

Scapy使用文档中文版

还原之前保存的pcap文件:

Scapy使用文档中文版

或者

Scapy使用文档中文版

Hexdump

Scapy允许你以不同的十六进制格式输出编码的数据包。

使用“hexdump()”函数会以经典的hexdump格式输出数据包:

Scapy使用文档中文版

使用“import_hexcap()”函数可以将以上的hexdump重新导入到Scapy中:

Scapy使用文档中文版

Hex string

使用“str()”函数可以将整个数据包转换成十六进制字符串: 

Scapy使用文档中文版

通过选择合适的起始层(例如“Ether()”),我们可以重新导入十六进制字符串。

Scapy使用文档中文版

Base64

使用“export_object()”函数,Scapy可以数据包转换成base64编码的Python数据结构:

Scapy使用文档中文版

使用“import_object()”函数,可以将以上输出重新导入到Scapy中:

Scapy使用文档中文版

Sessions

最后可以使用“save_session()”函数来保存所有的session变量:

Scapy使用文档中文版

使用“load_session()”函数,在下一次你启动Scapy的时就能加载保存的session:

Scapy使用文档中文版

16. Making tables

现在我们来演示一下“make_table()”函数的功能。该函数的需要一个列表和另一个函数(返回包含三个元素的元组)作为参数。第一个元素是表格x轴上的一个值,第二个元素是y轴上的值,第三个原始则是坐标(x,y)对应的值,其返回结果为一个表格。这个函数有两个变种,“make_lined_table()”和“make_tex_table()”来复制/粘贴到你的LaTeX报告中。这些函数都可以作为一个结果对象的方法:

在这里,我们可以看到一个多机并行的traceroute(Scapy的已经有一个多TCP路由跟踪功能,待会儿可以看到):   

Scapy使用文档中文版

这里有个更复杂的例子:从他们的IPID字段中识别主机。我们可以看到172.20.80.200只有22端口做出了应答,而172.20.80.201则对所有的端口都有应答,而且172.20.80.197对25端口没有应答,但对其他端口都有应答。

Scapy使用文档中文版

你在使用TTL和显示接收到的TTL等情况下,它可以很轻松地帮你识别网络拓扑结构。

17. Routing

现在Scapy有自己的路由表了,所以将你的数据包以不同于操作系统的方式路由:

Scapy使用文档中文版

18. Gnuplot

我们可以很容易地将收集起来的数据绘制成Gnuplot。(清确保你已经安装了Gnuplot-py和Gnuplot)例如,我们可以通过观察图案知道负载平衡器用了多少个不同的IP堆栈:

Scapy使用文档中文版

Scapy使用文档中文版
19. TCP traceroute (2)

Scapy也有强大的TCPtraceroute功能。并不像其他traceroute程序那样,需要等待每个节点的回应才去下一个节点,scapy会在同一时间发送所有的数据包。其缺点就是不知道什么时候停止(所以就有maxttl参数),其巨大的优点就是,只用了不到3秒,就可以得到多目标的traceroute结果:

Scapy使用文档中文版

最后一行实际上是该函数的返回结果:traceroute返回一个对象和无应答数据包列表。traceroute返回的是一个经典返回对象更加特殊的版本(实际上是一个子类)。我们可以将其保存以备后用,或者是进行一些例如检查填充的更深层次的观察:

Scapy使用文档中文版

和其他返回对象一样,traceroute对象也可以相加:

Scapy使用文档中文版

Traceroute返回对象有一个非常实用的功能:他们会将得到的所有路线做成一个有向图,并用AS组织路线。你需要安装graphviz。在默认情况下会使用ImageMagick显示图形。

Scapy使用文档中文版

Scapy使用文档中文版
如果你安装了VPython,你就可以用3D来表示traceroute。右边的按钮是旋转图案,中间的按钮是放大缩小,左边的按钮是移动图案。如果你单击一个球,它的IP地址就会出现/消失。如果你按住Ctrl单击一个球,就会扫描21,22,23,25,80和443端口,并显示结果:

Scapy使用文档中文版

Scapy使用文档中文版

Scapy使用文档中文版

20. Wireless frame injection

frame injection的前提是你的无线网卡和驱动得正确配置好。

Scapy使用文档中文版

你可以造一个FakeAP:

Scapy使用文档中文版

0x03 Simple one-liners

1. ACK Scan

使用Scapy强大的数据包功能,我们可以快速地复制经典的TCP扫描。例如,模拟ACKScan将会发送以下字符串:

Scapy使用文档中文版

我们可以在有应答的数据包中发现未过滤的端口:

Scapy使用文档中文版

同样的,可以在无应答的数据包中发现过滤的端口:

Scapy使用文档中文版

2. Xmas Scan

可以使用以下的命令来启动Xmas Scan:

Scapy使用文档中文版

有RST响应则意味着目标主机的对应端口是关闭的。

3. IP Scan

较低级的IP Scan可以用来枚举支持的协议:

Scapy使用文档中文版

4. ARP Ping

在本地以太网络上最快速地发现主机的方法莫过于ARP Ping了:

Scapy使用文档中文版

用以下命令可以来审查应答:

Scapy使用文档中文版

Scapy还包含内建函数“arping()”,该函数实现的功能和以上的两个命令类似:

Scapy使用文档中文版

5. ICMP Ping

可以用以下的命令来模拟经典的ICMP Ping:

Scapy使用文档中文版

用以下的命令可以收集存活主机的信息:

Scapy使用文档中文版

6. TCP Ping

如果ICMP echo请求被禁止了,我们依旧可以用不同的TCP Pings,就像下面的TCP SYN Ping:

Scapy使用文档中文版

对我们的刺探有任何响应就意味着为一台存活主机,可以用以下的命令收集结果:

Scapy使用文档中文版

7. UDP Ping

如果其他的都失败了,还可以使用UDP Ping,它可以让存活主机产生ICMP Portunreachable错误。你可以挑选任何极有可能关闭的端口,就像端口0:

Scapy使用文档中文版

同样的,使用以下命令收集结果:

Scapy使用文档中文版

8. Classical attacks

畸形数据包:

Scapy使用文档中文版

死亡之ping (Muuahahah):

Scapy使用文档中文版

Nestea attack:

Scapy使用文档中文版

Land攻击(专为微软视窗):

Scapy使用文档中文版

9. ARP cache poisoning

这种攻击可以通过VLAN跳跃攻击使ARP缓存中毒,使得其他客户端无法加入真正的网关地址。

经典的ARP缓存投毒:

Scapy使用文档中文版

对使用double 802.1q封装的进行ARP缓存投毒:

Scapy使用文档中文版

10. TCP Port Scanning

发送一个TCP SYN到每一个端口上。等待一个SYN-ACK或者是RST或者是一个ICMP错误:

Scapy使用文档中文版

将开放的端口结果可视化:

Scapy使用文档中文版

11. IKE Scanning

我们试图通过发送ISAKMP Security Associationproposals来确定VPN集中器,并接收应答:

Scapy使用文档中文版

可视化结果列表:

Scapy使用文档中文版

12. Advanced traceroute

TCP SYN traceroute

Scapy使用文档中文版

结果会是:

Scapy使用文档中文版

UDP traceroute

相比较TCP来说,traceroute一个UDP应用程序是不可靠的,因为ta没有握手的过程。我们需要给一个应用性的有效载荷(DNS,ISAKMP,NTP等)来得到一个应答:

Scapy使用文档中文版

我们可以想象得到一个路由器列表的结果:

Scapy使用文档中文版

DNS traceroute

我们可以在“traceroute()”函数中设置“l4”参数为一个完整的数据包,来实现DNStraceroute:

Scapy使用文档中文版

13. Etherleaking

Scapy使用文档中文版

14. ICMP leaking

这是一个Linux2.0的一个bug:

Scapy使用文档中文版

15. VLAN hopping

在非常特殊的情况下,使用double 802.1q封装,可以将一个数据包跳到另一个VLAN中:

Scapy使用文档中文版

16. Wireless sniffing

以下的命令将会像大多数的无线嗅探器那样显示信息:

Scapy使用文档中文版

以上命令会产生类似如下的输出:

Scapy使用文档中文版

0x04 Recipes

1. Simplistic ARP Monitor

以下的程序使用了“sniff()”函数的回调功能(prn参数)。将store参数设置为0,就可以使“sniff()”函数不存储任何数据(否则会存储),所以就可以一直嗅探下去。filter参数则用于在高负荷的情况下有更好的性能:filter会在内核中应用,而且Scapy就只能嗅探到ARP流量。

Scapy使用文档中文版

2. Identifying rogue DHCP servers on yourLAN

Problem

你怀疑有人已经在你的LAN中安装了额外的未经授权的DHCP服务器-无论是故意的还是有意的。因此你想要检查是否有任何活动的DHCP服务器,并确定他们的IP和MAC地址。

Solution

使用Scapy发送一个DHCP发现请求,并分析应答:

Scapy使用文档中文版

在这种情况下,我们得到了两个应答,所以测试网络上有两个活动的DHCP服务器:

Scapy使用文档中文版

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


3. Firewalking

TTL减一操作过滤后,只有没被过滤的数据包会产生一个ICMP TTL超时

Scapy使用文档中文版

在对多网卡的防火墙查找子网时,只有它自己的网卡IP可以达到这个TTL:

Scapy使用文档中文版

4. TCP Timestamp Filtering

Problem

在比较流行的端口扫描器中,一种常见的情况就是没有设置TCP时间戳选项,而许多防火墙都包含一条规则来丢弃这样的TCP数据包。

Solution

为了让Scapy能够到达其他位置,就必须使用其他选项:

Scapy使用文档中文版

5. Viewing packets with Wireshark

Problem

你已经使用Scapy收集或者嗅探了一些数据包,因为Wireshark高级的数据包展示功能,你想使用Wireshark查看这些数据包。

Solution

正好可以使用“wireshark()”函数:

Scapy使用文档中文版

Discussion

“wireshark()”函数可以生成一个临时pcap文件,来包含你的数据包,然后会在后台启动Wireshark,使其在启动时读取该文件。

请记住Wireshark是处理第二层的数据包(通常被称为“帧”)。所以我们必须为ICMP数据包添加一个Ether()头。如果你直接将IP数据包(第三层)传递给Wireshark,你将会得到一个奇怪的结果。

你可以通过改变conf.prog.wireshark的配置设置,来告诉Scapy去哪寻找Wireshark可执行文件。

6. OS Fingerprinting

ISN

Scapy的可用于分析ISN(初始序列号)递增来发现可能有漏洞的系统。首先我们将在一个循环中发送SYN探头,来收集目标响应:

Scapy使用文档中文版

一旦我们得到响应之后,我们可以像这样开始分析收集到的数据:

Scapy使用文档中文版

nmap_fp

在Scapy中支持Nmap指纹识别(是到Nmap v4.20的“第一代”功能)。在Scapyv2中,你首先得加载扩展模块:

Scapy使用文档中文版

如果你已经安装了Nmap,你可以让Scapy使用它的主动操作系统指纹数据库。清确保version1签名数据库位于指定的路径:

Scapy使用文档中文版

然后你可以使用“namp_fp()”函数,该函数和Nmap操作系统检测引擎使用同样的探针:

Scapy使用文档中文版

p0f

如果你已在操作系统中安装了p0f,你可以直接从Scapy中使用它来猜测操作系统名称和版本。(仅在SYN数据库被使用时)。首先要确保p0f数据库存在于指定的路径:

Scapy使用文档中文版

例如,根据一个捕获的数据包猜测操作系统:

Scapy使用文档中文版
 
0x05 后记

由于本人英语水平太次,翻译能力有限,文章存在很多问题,还请大家多多指正,不胜感激。

猜你喜欢

转载自blog.csdn.net/THMAIL/article/details/75309004
今日推荐