Advertisement

SCAPY官方教程一

阅读量:

总结:
Scapy 是一个基于 Python 的交互式数据包操作程序和库,允许用户发送、嗅探、剖析和伪造网络数据包。它支持多种协议(如 TCP/UDP/ICMP)并提供灵活的功能,包括发送/接收数据包、探测网络路径以及生成报告等。
核心特点:
Python 基础:使用 Python 解释器作为命令板,直接使用 Python 语言(分配变量、循环等)操作数据包。
多协议处理:能伪造或解码多种协议的数据包,并在线路上发送/捕获这些数据。
高效探测与分析:支持复杂任务如扫描路由、生成完整报告及匹配请求/回复。
高级功能:例如执行跟踪路由、网络扫描并返回结果报告等。
灵活性与扩展性:通过域特定语言 (DSL) 描述层叠结构化的层状数据包,默认值优化提升效率。
对比传统工具:避免简单解释导致的偏见问题;提供更全面的数据解析能力。
应用场景示例:
执行端口扫描并生成详细报告。
发送无效帧以测试网络边界条件。
组合技术如 VLAN 跳转与 ARP 缓存攻击。
支持多个操作系统(Linux, macOS, Windows)运行。
总体而言,Scapy 是一个强大且灵活的工具集,在网络安全与系统测试领域具有重要价值。

一、Scapy简介

Scapy 是一个利用 Python 语言的强大交互式数据包操作工具与库。
Scapy 依赖于 Python 解释器作为控制台界面,并即意味着 即使是您也可 即使是您也可 进行各种基本操作如 分配变量 使用循环 定义函数 等等。

Scapy 是一种基于 Python 的工具,在网络层面上提供强大的功能使得开发者能够创建用于探测威胁的系统。通过其丰富的接口和模块化设计,在发送请求的同时也可以实时捕获并分析数据包,并生成各种类型的攻击向量以模拟恶意行为。

简单来说, Scapy 是一个功能强大的交互式数据包操作工具. 它能够生成或解析各种协议的通信数据, 并被发送到网络上被捕获. 此外, 在处理过程中还能识别并匹配各个请求与响应.

该系统能够生成或解析多种协议的数据包,在传输层面上发送这些流量,并捕获网络通信中的数据报。通过pcap文件存储和解析这些流量之外的信息,并对客户端的请求进行识别与对应响应。此外,请注意该方案通过预设的标准参数配置实现快速构建这些流量模型。

它不仅能够轻松处理一系列经典的网络任务操作(包括但不限于扫描活动状态和网络配置信息),同时也具备强大的功能特性(例如支持实时监控网络流量并提供详细的流量统计分析)。此外,在某些特定场景下(如进行渗透测试或网络安全威胁检测),该系统还可以取代传统手工方式下的相关检测流程(例如:hping协议探测漏洞;85%的nmap操作;arpspoof协议进行欺骗性通信;arp-sk协议完成地址解析服务;arping协议实现地址解析功能;tcpdump协议捕获数据流量;wireshark软件分析数据包;p0f程序执行端口扫描;tshark程序完成复杂的数据流分析)。

该方法能够有效执行大部分现有工具无法处理的特定任务。例如,在某些情况下它能够传输无效帧或向您自己的802.11网络层发送数据帧,并结合VLAN域切换技术与ARP缓存攻击手段进行防护;同时,在WEP加密通道上提供语音解码防护措施。

Scapy支持Python 2.7和Python 3(3.4到3.9)。

它旨在跨平台,并在许多不同的平台(Linux、OSX、*BSD和Windows)上运行。

Scapy 负责生成并发送各种类型的网络测试用例以及捕获相应的网络回应。当您定义一组特定的数据类型后,请您注意以下几点:首先,请您明确所需的具体参数;其次,请您详细说明所需的输出格式;最后,请您提供足够的计算资源支持以确保测试的有效性。相比于传统的网络扫描工具如Nmap或htop这类开源软件而言,在Scapy的设计中,默认情况下不会将结果简化为简单的状态码(如打开/关闭/过滤),而是完整地返回所有相关的HTTP响应内容。

在此基础上可以开发出更多高级功能模块作为补充,在具体实施过程中需要考虑以下几点:首先需要实现对路由路径的追踪追踪,并据此仅输出请求起始时间戳TTL以及响应源IP地址的相关信息;其次需要配置一次完整的网络回测测试过程以获取所有响应服务器IP地址列表;最后则需要建立一套完整的端口扫描分析框架以便自动生成包含详细报告信息的LaTeX格式文档

官网:

GitHub - secdev/scapy: Visit GitHub - secdev/scapy for more information about Scapy, a Python-based interactive packet manipulation tool and library that supports both versions of Python, including Python 2 and Python 3.

是什么让 Scapy 如此特别?

首先,在大多数现有的网络工具中,并不会为您想不到的功能进行构建。这些工具都是为了满足特定需求而设计的,并且在偏离主要功能时会有明显的限制。例如,在ARP缓存中植入木马程序时会阻止双重802.1q封装。或者寻找能够发送填充ICMP数据包的程序(这里指的是填充类型的ICMP数据包而非有效负载类型的数据包,请问明白了吗?)。实际上,在任何情况下如果您需要一个新的功能或解决方案,则必须开发专门针对该功能或问题的设计。

其次,在处理数据时它们往往将解码与解释混为一谈尽管机器具备解码能力能够协助人类完成这一任务而将这种任务分配给人类更为合理一些程序则试图复制这一行为模式例如他们倾向于以"这个端口是开放的"而非"我接收到一个SYN-ACK"的形式来表述这一概念对于新手来说这或许更容易理解但有时他们的说法正确无误;而有时候则可能出现偏差这种差异可能导致对某些技术细节的理解产生混淆尤其是在缺乏完整上下文的情况下因此建议大家在面对这类问题时不要仅仅依赖于现成的描述方式而是应该主动获取更多的信息以便全面准确地理解事件的本质原因以及后续处理流程在这种情况下使用tcpdump -xX命令可以帮助我们更好地获取所需的信息从而弥补现有描述可能带来的不足

然后, 即使仅进行解码的程序也无法提供所有原始数据. 他们所展示的网络架构或目标设定是其开发者认为足够的框架, 但并非完全准确. 不管怎样, 这并非完整的真相, 并且可能存在主观判断的影响. 您是否了解报告中使用的以太网填充工具?

Scapy 设法解决了这些问题。
它允许您精确地构造所需的数据包。
尽管认为在TCP上叠加一个802.1Q层没有意义,
但它可能在某些未知产品的环境中仍具有一些意义。
Scapy提供了一个灵活的架构来规避这些任意性的约束,
从而让用户随意放置各种数据项于其选择的位置,
并按照个人意愿进行组合配置。
当然你已经成年了...

每次都在开发一个新的工具包,而不仅仅只是处理大量复杂的任务,只需少量Scapy代码即可实现

每当进行探测(包括扫描和追踪路由等操作)时,在任何解释之前,Scapy都会释放来自探测的完整解码数据包。这表明您只需进行一次探测即可反复进行多次解释。如请求追踪路由并查看填充数据。

快速数据包设计

其他工具遵循与从 shell 运行程序相同的范式操作。然而,在描述数据包时存在语法上的缺陷。为了解决这一问题,这些工具采用了更为复杂的语法结构(即所谓的"工具作者想象中的场景")。例如,在这种情况下只需提供 IP 地址给端口扫描器即可触发端口扫描场景。即便对这些场景进行了一些微调调整后仍然会陷入同样的困境。

Scapy 的范式基于一种域特定语言 (DSL),它能够对所有数据包进行有力且高效的描述。使用 Python 语法和 Python 解释器作为 DSL 的语法和解释器有多益处:无需开发专门的解释器、无需学习另一种编程语言,并带来完整、简洁而强大的功能。

Scapy允许用户将一个数据包或一组数据包表示为分层结构。每层都包含有用的默认字段信息,并支持重新定义这些字段内容。无需预先定义固定模式或格式,在C语言中通常需要60行代码来描述一个数据包内容和输出结果。然而使用Scapy这一过程被简化为一行描述数据包内容和另一行输出结果。现有90%以上的网络探测工具均能通过两行Scapy指令实现。

一次探测,多次解读

网络探测属于一种黑箱测试方法。在探测网络时会发送大量刺激信号,并仅收到少量有效的响应信号。若能够选择到合适的刺激信号,则可以通过其是否存在响应来推断所需信息。与多数工具不同的是Scapy系统能够提供完整的原始数据包序列即所有发送出去的信号和接收到的所有回应信息。通过分析这些数据包序列将能够推断所需信息。对于规模较小的数据集而言用户可以直接进行分析而对于较大的数据集其解释结果则取决于所采用的具体分析视角多数工具会选择特定视角并将与该视角无关的数据予以丢弃。然而由于Scapy系统提供了完整的原始数据序列因此这些原始数据可能会被多次调用从而使得所选分析视角在后续分析过程中不断优化和更新例如可以通过检测TCP端口扫描行为并将检测到的数据可视化为端口扫描结果图然后还可以基于响应包的时间延kad (TTL)属性将同一组数据以不同的方式可视化无需重新发起探测过程即可完成不同角度的数据视图。

Scapy 解码,它不解释

网络探测工具的一个常见问题是它们倾向于分析收到的答案而非仅进行编码处理以获取信息。报告类似Received a TCP Reset on port 80不会产生解释错误。报告端口 80 已关闭是一种可能的解释在大多数情况下是正确的但在一些未被预见的特定情况下可能是错误的例如一些扫描器在接收到 ICMP 目标不可达数据包时通常会报告已过滤的 TCP 端口这可能是对的但在某些情况下这意味着数据包没有被防火墙过滤而没有主机能够将其转发到目标。

对于那些尚未了解端口扫描基本概念的用户而言,解释结果确实具有一定的帮助作用;然而这可能导致负面效果超过预期(即弊大于利),因为它可能会引入主观性偏差(即给结果注入偏见)。一种可能出现的情形是(即一种情况是),知识渊博的用户可能会尝试通过对工具本身进行逆向工程(即对其解释进行分析),从而推断出导致该解释产生的事实依据(即触发条件)。不幸的是,在这种做法中会导致大量关键信息被忽略(即被丢失)。

二、Scapy简单使用

试着玩一下

复制代码
 # ./run_scapy -s mysession

    
 New session [mysession]
    
 Welcome to Scapy (2.4.0)
    
 >>> IP()
    
 <IP |>
    
 >>> target="www.target.com/30"
    
 >>> ip=IP(dst=target)
    
 >>> ip
    
 <IP dst=<Net www.target.com/30> |>
    
 >>> [p for p in ip]
    
 [<IP dst=207.171.175.28 |>, <IP dst=207.171.175.29 |>,
    
  <IP dst=207.171.175.30 |>, <IP dst=207.171.175.31 |>]
    
 >>> ^D
    
    
    
    
    AI助手
复制代码
 # ./run_scapy -s mysession

    
 Using session [mysession]
    
 Welcome to Scapy (2.4.0)
    
 >>> ip
    
 <IP dst=<Net www.target.com/30> |>
    
    
    
    
    AI助手

现在,让我们操作一些数据包:

复制代码
 >>> IP()

    
 <IP |>
    
 >>> a=IP(dst="172.16.1.40")
    
 >>> a
    
 <IP dst=172.16.1.40 |>
    
 >>> a.dst
    
 '172.16.1.40'
    
 >>> a.ttl
    
 64
    
    
    
    
    AI助手

假设我需要获取一个广播型的 MAC 地址,并带有指向这两个域名(ketchup.commayo.com)的 IP 地址的有效负载。其 TTL 值设置为1至9之间的整数,并且还有一个 UDP 类型的有效负载。

复制代码
 >>> Ether(dst="ff:ff:ff:ff:ff:ff")

    
       /IP(dst=["ketchup.com","mayo.com"],ttl=(1,9))
    
       /UDP()
    
    
    
    
    AI助手

我们在 1 行中定义了 18 个数据包(1 个隐式数据包)

合理的默认值

Scapy 尝试对所有数据包字段使用合理的默认值。如果没有被覆盖,

根据目的地和路由表选择IP源

计算校验和

根据输出接口选择源MAC

以太网类型和IP协议由上层决定

其他字段的默认值被选为最有用的:

TCP源端口是20,目的端口是80。

UDP 源端口和目标端口为 53。

ICMP 类型是回显请求。

全部评论 (0)

还没有任何评论哟~