ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于 Scapy 构建自定义网络工具与扩展:从自动化脚本到 add-on 交互式环境

基于 Scapy 构建自定义网络工具与扩展:从自动化脚本到 add-on 交互式环境 网络网络安全【免费下载链接】scapyScapy: the Python-based interactive packet manipulation program library.项目地址https://gitcode.com/gh_mirrors/sc/scapy点击查看免费下载本文是 Scapy 官方文档 Build your own tools构建你自己的工具 的深度实战解读。你将在本文中掌握三类核心能力把 Scapy 作为库嵌入你自己的 Python 脚本实现 ping 探测、ARP 扫描、流量监控等自动化工具精确控制 Scapy 日志系统与输出详细度以及不修改 Scapy 源码、以独立 add-on 文件扩展协议与函数并通过interact()启动带自定义 banner 的交互式控制台。写在前面Scapy 扩展的两条路径Scapy 的价值不仅在于交互式命令行更在于它提供了两条清晰的扩展路径本文覆盖官方文档的全部内容在你的工具中使用 Scapy将scapy.all作为 Python 库导入编写独立的自动化脚本以 add-on 方式扩展 Scapy把自定义协议类、辅助函数写在一个单独的文件中不修改 Scapy 源码并通过interact()将其注入到交互式会话中。官方文档doc/scapy/extending.rst明确表示You can also extend Scapy without having to edit its source file这正是两种路径的共同基石。下面逐一展开。在你的工具中使用 Scapy把 Scapy 嵌入你自己的工具非常简单导入所需模块直接调用即可。其底层能力由 scapy/sendrecv.py发送与接收、scapy/layers/inet.pyIP/ICMP 等网络层协议和 scapy/packet.py包构建与解析等模块支撑。示例一ICMP 回显探测第一个例子接收一个 IP 地址或主机名作为参数发送 ICMP 回显请求包并显示完整解析后的返回包#! /usr/bin/env python import sys from scapy.all import sr1, IP, ICMP p sr1(IP(dstsys.argv[1]) / ICMP()) if p: p.show()要点说明sr1()发送一层Layer 3数据包并等待第一个响应返回解析后的应答包p.show()以分层缩进方式打印包的完整字段使用/操作符组合IP(dst...)与ICMP()这是 Scapy 构建协议栈的标准语法若sr1()超时未收到应答默认超时行为由conf相关参数控制p为None脚本因此做了判空保护。示例二ARP ping 并输出 LaTeX 表格arping2tex这是一个更完整的实战工具对指定网段执行 ARP ping并将结果格式化为 LaTeX 表格输出#! /usr/bin/env python # arping2tex : arpings a network and outputs a LaTeX table as a result import sys if len(sys.argv) ! 2: print(Usage: arping2tex net\n eg: arping2tex 192.168.1.0/24) sys.exit(1) from scapy.all import srp, Ether, ARP, conf conf.verb 0 ans, unans srp(Ether(dstff:ff:ff:ff:ff:ff) / ARP(pdstsys.argv[1]), timeout2) print(r\begin{tabular}{|l|l|}) print(r\hline) print(rMAC IP\\) print(r\hline) for snd, rcv in ans: print(rcv.sprintf(r%Ether.src% %ARP.psrc%\\)) print(r\hline) print(r\end{tabular})该脚本用到三个关键机制conf.verb 0静默模式conf是 Scapy 的全局配置对象定义于 scapy/config.py其中verb字段控制输出详细度。源码注释scapy/config.py#L984写明其取值范围为 0几乎静默到 3详细默认值为 2。设置为 0 可以让脚本输出保持干净srp()二层收发srp()发送 Layer 2 帧区别于一层的sr1()返回二元组(answered, unanswered)即ans与unans。通过广播目的 MACff:ff:ff:ff:ff:ff加上ARP(pdst网段)实现网段扫描timeout2秒控制等待时间sprintf()格式化rcv.sprintf(%Ether.src% %ARP.psrc%)按模板提取应答包中的源 MAC 与源 IP逐行拼接成 LaTeX 表格行。示例三ARP 流量实时监控回调下面的工具会持续监听本机所有接口并打印捕获到的所有 ARP 请求包括来自 Wi-Fi 网卡 monitor 模式下 802.11 帧中的 ARP。注意sniff()的store0参数避免在内存中无谓地保存全部报文#! /usr/bin/env python from scapy.all import * def arp_monitor_callback(pkt): if ARP in pkt and pkt[ARP].op in (1, 2): # who-has or is-at return pkt.sprintf(%ARP.hwsrc% %ARP.psrc%) sniff(prnarp_monitor_callback, filterarp, store0)要点说明sniff()是 Scapy 抓包入口实现在 scapy/sendrecv.py。prn指定对每个捕获包调用的回调函数回调的返回值会被打印filter使用 BPFBerkeley Packet Filter语法只捕获 ARP 流量store0让数据包不被保存在内存列表中适合长时间运行的监控型工具ARP in pkt检查数据包中是否包含 ARP 层pkt[ARP].op取 ARP 操作码1 表示 who-has请求、2 表示 is-at应答if ARP in pkt之所以必要是因为在 monitor 模式下Wi-Fi 帧802.11可能承载着不同链路层协议需要先确认内部确有 ARP 层再访问字段。配置 Scapy 的日志系统Scapy 会自动基于 Python 标准库的logging模块配置一个 logger。这个 logger 是定制化的支持颜色输出和频率过滤等特性。默认情况下非交互模式日志级别为WARNING你可以通过以下方式修改例如设为CRITICAL以几乎禁用所有日志import logging logging.getLogger(scapy).setLevel(logging.CRITICAL)需要理解的两点默认级别因模式而异官方文档特别提示交互模式下默认日志级别为INFO。这与 scapy/config.py#L967 中的logLevel配置项直接相关——该配置项是一个带拦截器Interceptor的属性级别变化会触发_loglevel_changer回调scapy/config.py#L915来同步调整底层log_scapy的实际级别CRITICAL 的边界官方文档明确指出Scapy simply wont work properly if a CRITICAL failure occurs即 CRITICAL 用于严重故障设为该级别后正常运行时几乎无日志输出但如果真发生 CRITICAL 级错误Scapy 可能无法正常工作——因此该设置适合对输出有洁癖的稳定脚本调试期建议保留WARNING甚至INFO。用 add-on 扩展 Scapy自定义协议与 interact()当你需要新增协议、函数等任何内容时直接写进 Scapy 源码当然可以但官方文档明确不推荐这种方式But this is not very convenient. Even if those modifications are to be integrated into Scapy, it can be more convenient to write them in a separate file. 更优雅的做法是写成独立文件编写包含自定义内容协议类、辅助函数等的 Python 文件让该文件可执行并在if __name__ __main__:分支中调用 Scapy 的interact()函数把自定义命名空间与自定义 banner 注入交互式会话。官方文档给出的完整 add-on 示例#! /usr/bin/env python # Set log level to benefit from Scapy warnings import logging logger logging.getLogger(scapy) logger.setLevel(logging.INFO) from scapy.all import * class Test(Packet): name Test packet fields_desc [ShortField(test1, 1), ShortField(test2, 2)] def make_test(x, y): return Ether() / IP() / Test(test1x, test2y) if __name__ __main__: interact(mydictglobals(), mybannerTest add-on v3.14)自定义协议类的结构Test继承自Packet基类scapy/packet.py#L82核心组成name协议的人类可读名称显示在show()等输出中fields_desc字段描述列表定义了该包的二进制布局。这里使用两个ShortField16 位短整数字段名分别为test1默认值 1与test2默认值 2。ShortField等基础字段类定义在 scapy/fields.py例如 scapy/fields.py#L1319同族还包括ByteFieldscapy/fields.py#L1062、IntFieldscapy/fields.py#L1349等可按需组合出不同的包结构。interact() 如何把自定义内容注入会话interact()定义于 scapy/main.py#L648签名如下def interact(mydictNone, argvNone, mybannerNone, mybanneronlyFalse, loglevellogging.INFO):其工作流程对应 scapy/main.py 的实现可以概括为进入交互模式设置conf.interactive True、加载默认主题scapy/main.py#L661-L663并将conf.logLevel设为传入的loglevel默认logging.INFO这与交互模式下默认 INFO 级别的行为一致解析命令行选项支持-h帮助、-H无花哨 banner、-c/-C自定义/禁用启动文件、-p/-P自定义/禁用预启动文件、-d降低日志级别等参数scapy/main.py#L674-L691注入自定义命名空间调用init_session(mydictmydict, retTrue)scapy/main.py#L713。在 scapy/main.py#L530-L532 可以看到mydict中的键值会被更新进scapy_session因此你在 add-on 中通过globals()传入的自定义类Test和函数make_test都会成为交互控制台中的可用名字拼接自定义 banner当mybanner非空时会追加到默认 banner 之后若同时设置mybanneronlyTrue则默认 banner 被清空、只显示你的自定义 bannerscapy/main.py#L857-L861选择交互式 shell根据conf.interactive_shell可选ipython、bpython、ptpython、ptipython、python、auto启动对应的解释器默认auto模式下依次探测 IPython → bpython → ptpython都不存在时回退到标准 Python shellscapy/main.py#L741-L778。运行效果把上面的代码保存为test_interact.py并赋予可执行权限后运行会得到官方文档所示的输出# ./test_interact.py Welcome to Scapy (0.9.17.109beta) Test add-on v3.14 make_test(42,666) Ether type0x800 |IP |Test test142 test2666 |可以看到默认 banner 之后紧跟着自定义 banner Test add-on v3.14make_test(42, 666)直接可用返回的是Ether/IP/Test三层叠放的包对象test142、test2666正是传入的自定义字段值。这样你就拥有一个带个人定制协议的交互式 Scapy 环境无需改动 Scapy 任何源码。小结与进一步探索本文覆盖了官方文档 doc/scapy/extending.rst 的全部核心内容作为库嵌入脚本ICMP 探测、ARP ping LaTeX 输出、ARP 监控回调、日志级别控制logging.getLogger(scapy).setLevel(...)与conf.verb、以及以 add-on 方式扩展自定义Packet子类 interact(mydictglobals(), mybanner...)。这些能力相互独立又可自由组合——例如你可以在自动化脚本中conf.verb 0保持输出干净也可以把调试期日志设为INFO借助频率过滤器观察告警。如果你想深入底层建议继续阅读scapy/packet.pyPacket基类与/组合操作符的构造与解析机制scapy/sendrecv.pysr1、srp、sniff等收发与抓包函数的完整实现scapy/fields.pyByteField、ShortField、IntField等字段类家族是自定义协议布局的基础scapy/main.pyinteract()、init_session()与启动文件startup file机制的完整实现scapy/config.pyconf全局配置包括verb、logLevel、interactive等开关的默认值。赞分享网络网络安全【免费下载链接】scapyScapy: the Python-based interactive packet manipulation program library.项目地址https://gitcode.com/gh_mirrors/sc/scapy点击查看免费下载相关推荐Airsonic功能详解10个必知的核心特性与使用技巧Airsonic功能详解10个必知的核心特性与使用技巧 Airsonic是一款免费开源的媒体服务器作为Subsonic和Libresonic的分支项目它允PaintingLight与其他光照工具对比优势、局限性与适用场景PaintingLight与其他光照工具对比优势、局限性与适用场景 PaintingLight是一款基于RGB空间几何的数字绘画光照效果生成工具由StyleOpenSpec与Git集成规范版本控制的最佳实践OpenSpec与Git集成规范版本控制的最佳实践 OpenSpec是一款面向AI编码助手的规范驱动开发SDD工具它通过结构化的规范定义和变更管理帮助开发工具CLIAI 应用工作流自动化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表