Scapy是一个Python程序,使用户能够发送,嗅探和剖析并伪造网络数据包。此功能允许构建可以探测,扫描或攻击网络的工具。
换句话说,Scapy是一个功能强大的交互式数据包操作程序。它能够伪造或解码大量协议的数据包,通过线路发送,捕获它们,匹配请求和回复等等。Scapy可以轻松处理大多数经典任务,如扫描,跟踪路由,探测,单元测试,攻击或网络发现。它可以取代hping,arpspoof,arp-sk,arping,p0f甚至是Nmap,tcpdump和tshark的某些部分。
Scapy在很多其他工具无法处理的其他特定任务上表现也很好,比如发送无效帧,注入自己的802.11帧,组合技术(VLAN跳频+ ARP缓存中毒,WEP加密通道上的VOIP解码,... )等
这个想法很简单。Scapy主要做两件事:发送数据包和接收答案。您定义一组数据包,它发送它们,接收答案,匹配带有答案的请求,并返回数据包对(请求,应答)列表和不匹配数据包列表。这比Nmap或hping这样的工具有一个很大的优势,即答案不会减少到(打开/关闭/过滤),而是整个数据包。
除此之外,还可以构建更多高级功能,例如,执行跟踪路由并仅提供请求的起始TTL和答案的源IP的功能。一个ping整个网络并提供机器回答的列表。执行portscan并返回LaTeX报告的人。
首先,使用大多数其他网络工具,您将无法构建作者无法想象的东西。这些工具是为特定目标而构建的,不能偏离它。例如,ARP缓存中毒程序不允许您使用双802.1q封装。或者尝试找一个可以发送带有填充的ICMP数据包的程序(我说填充,而不是有效负载,请参阅?)。事实上,每次有新需求时,都必须构建一个新工具。
其次,它们通常会混淆解码和解释。机器擅长解码,可以帮助人类。解释是为人类保留的。有些程序试图模仿这种行为。例如,他们说“ 这个端口是开放的 ”而不是“ 我收到了一个SYN-ACK ”。有时他们是对的。有时不是。这对初学者来说更容易,但是当你知道自己在做什么的时候,你会继续尝试从程序的解释中推断出真正发生的事情来制作你自己的,这很难,因为你丢失了大量的信息。而且您经常最终使用解码和解释工具遗漏的内容。tcpdump -xX
第三,即使是只能解码的程序也不会向您提供他们收到的所有信息。他们给你的网络愿景是他们的作者认为足够的。但它并不完整,你有偏见。例如,您是否知道报告以太网填充的工具?
Scapy试图克服这些问题。它使您能够准确地构建所需的数据包。即使我认为在TCP之上堆叠802.1q层没有任何意义,但对于其他人来说,它可能还有一些我不知道的产品。Scapy有一个灵活的模型,试图避免这种任意限制。您可以在任何您想要的字段中随意添加任何值,并按照您的需要进行堆叠。毕竟你是一个成年人。
事实上,它就像每次构建一个新工具,但不是处理百行C程序,而是只编写两行Scapy。
在探测(扫描,跟踪路由等)之后,在进行任何解释之前,Scapy始终会为探测器提供完整的解码数据包。这意味着您可以探测一次并多次解释,请求traceroute并查看填充。
其他工具坚持程序 - 你从shell运行的范例。结果是描述数据包的可怕语法。对于这些工具,采用的解决方案使用工具作者想象的场景形式的更高但不太强大的描述。例如,只有IP地址必须提供给端口扫描程序才能触发端口扫描方案。即使方案稍微调整一下,您仍然会遇到端口扫描。
Scapy的范例是提出一种域特定语言(DSL),它可以对任何类型的数据包进行强大而快速的描述。使用Python语法和Python解释器作为DSL语法和解释器有许多优点:不需要编写单独的解释器,用户不需要学习另一种语言,并且他们可以从完整,简洁和非常强大的语言中受益。
Scapy使用户能够将一个包或一组包描述为一个堆叠在一起的层。每个图层的字段都有可用的默认值,可以重载。Scapy并不要求用户使用预定的方法或模板。这减轻了每次需要不同场景时编写新工具的要求。在C中,可能需要平均60行来描述分组。使用Scapy,要发送的数据包可能只用一行描述另一行来打印结果。90%的网络探测工具可以用2行Scapy重写。
网络发现是黑盒测试。在探测网络时,会发送许多刺激,而只有少数刺激被回答。如果选择了正确的刺激,则可以通过响应或缺乏响应来获得所需信息。与许多工具不同,Scapy提供所有信息,即发送的所有刺激和收到的所有响应。检查这些数据将为用户提供所需的信息。当数据集很小时,用户可以挖掘它。在其他情况下,数据的解释将取决于所采用的观点。大多数工具选择视点并丢弃与该视点无关的所有数据。由于Scapy提供了完整的原始数据,因此可以多次使用该数据,从而允许视点在分析过程中发展。例如,可以探测TCP端口扫描,并将数据视为端口扫描的结果。然后,还可以相对于响应分组的TTL来可视化数据。不需要启动新的探测来调整数据的视点。
网络探测工具的一个常见问题是它们试图解释所接收的答案,而不是仅解码和给出事实。报告 端口80上的“接收TCP重置”之类的内容不受解释错误的影响。报告端口80关闭是一种解释,可能在大多数情况下是正确的,但在该工具的作者无法想象的某些特定上下文中是错误的。例如,某些扫描程序在收到ICMP目标不可达数据包时往往会报告已过滤的TCP端口。这可能是正确的,但在某些情况下,这意味着数据包未被防火墙过滤,而是没有主机将数据包转发到。
解释结果可以帮助那些不知道端口扫描是什么但却弊大于利的用户,因为它会在结果中注入偏差。可能发生的事情是,他们可以自己进行解释,知识渊博的用户将尝试对工具的解释进行逆向工程,以得出触发该解释的事实。不幸的是,此操作中丢失了大量信息。
通过scapy命令进入交互式界面
首先,我们播放一下并一次创建四个IP数据包。让我们看看它是如何工作的。我们首先实例化IP类。然后,我们再次实例化它,我们提供一个值得四个IP地址的目的地(/ 30给出网络掩码)。使用Python习语,我们在一组显式数据包中开发此隐式数据包。然后,我们退出了翻译。当我们提供会话文件时,我们正在处理的变量被保存,然后重新加载:
# ./run_scapy -s mysession
New session [mysession]
Welcome to Scapy (2.4.0)
>>> IP()
>>> target="www.target.com/30"
>>> ip=IP(dst=target)
>>> ip
|>
>>> [p for p in ip]
[, ,
, ]
>>> ^D
# ./run_scapy -s mysession
Using session [mysession]
Welcome to Scapy (2.4.0)
>>> ip
|>
现在,让我们操纵一些数据包:
>>> IP()
>>> a=IP(dst="172.16.1.40")
>>> a
>>> a.dst
'172.16.1.40'
>>> a.ttl
64
假设我想要广播MAC地址,以及到ketchup.com和mayo.com的IP有效负载,从1到9的TTL值以及UDP有效负载:
>>> Ether(dst="ff:ff:ff:ff:ff:ff")
/IP(dst=["ketchup.com","mayo.com"],ttl=(1,9))
/UDP()
我们在1行中定义了18个数据包(1个隐式数据包)
Scapy尝试为所有数据包字段使用合理的默认值。如果没有被覆盖,
其他字段的默认值被选为最有用的值:
Scapy使用Python解释器作为命令板。这意味着您可以直接使用Python语言(分配变量,使用循环,定义函数等)
如果你是Python的新手并且因为这个原因你真的不懂一个词,或者如果你想学习这门语言,花一个小时阅读 Guido Van Rossum 的非常好的Python教程。在那之后,你会知道Python :)(真的!)。有关更深入的教程,Dive Into Python也是一个非常好的开始。
为了快速入门,这里是Python数据类型的概述:
int
(签名,32位): 42
long
(签名,无限): 42L
str
:"bell\x07\n"
或’bell\x07\n’
tuple
(不变): (1,4,"42")
list
(可变): [4,2,"1"]
dict
(可变): { "one":1 , "two":2 }
Python中没有块分隔符。相反,缩进确实很重要:
if cond:
instr
instr
elif cond2:
instr
else:
instr