首先,在尝试传输原始 802.12 帧时,您应该注意一些事情——设备驱动程序必须支持数据包注入。
您提到了监视模式,它在高级别的 rx 等效于注入功能 - 这不是“模式”,而是一种功能/功能。我这样说是因为 Linux 上的一些 892.11 设备驱动程序:
- 支持监控模式和帧注入
- 支持监听模式,不支持帧注入
- 都不支持
除了尝试帧注入和嗅探另一个设备上的空气以确认它被看到之外,我不知道有任何直接的方法来检查驱动程序是否支持帧注入。
监控模式通常很容易通过使用sudo wlan0 set monitor
和查看返回码和/或输出来检查。
我从事这项工作已经有几年了,但当时,很少有设备支持“开箱即用”的监控模式和帧注入。许多只支持带有修改版本的供应商或内核驱动程序的监控模式
您需要确保您的设备有一个完全支持两者的驱动程序。这种任务(帧监控和注入)对于倾向于使用 Kali Linux 的渗透测试人员来说很常见,Kali Linux 实际上只是一个 Ubuntu 发行版,其中预装了一堆“黑客”工具和(修改过的)802.11 设备驱动程序并在其存储库中。通过使用搜索引擎查找推荐给 Kali 用户的设备和驱动程序,您通常可以节省查找支持良好的卡的时间
我明确提出了这种监控/注入功能,因为几年前我第一次从事类似项目时,我需要使用官方内核驱动程序的补丁版本来支持监控模式——它是一个 rtl8812au 芯片组。当时,我做了一个错误的假设,即驱动程序中的监控模式支持意味着完全注入支持。我花了 2 天的时间把头撞在墙上,确信我的框架没有在我的应用程序中正确构建,导致没有框架离开卡。原来我需要一个更新的驱动程序分支我用来获得完整的注入支持。该驱动程序现在特别支持监控模式和帧注入。诊断该问题最令人沮丧的是,在尝试传输帧时,我没有收到来自系统调用或内核消息的任何错误——它们只是被默默地丢弃在某个地方,大概是在驱动程序中
关于如何做到这一点的主要问题 -如果您使用 C/C++ 编写应用程序,答案几乎肯定是libpcap ,因为 libpcap 不仅提供数据包捕获 API,还提供数据包注入 API
如果你用 Python 来做,scapy是一个很好的选择。Python/scapy 的好处是
- Python 代码比 C 写得快得多
- scapy 提供了大量的类,您可以使用它们来直观地逐层创建框架
- 因为这些层是作为类实现的,所以您还可以扩展和“注册”现有类以使某些帧更容易创建(或在收到时解析)
您可以直接使用带有原始套接字的 UNIX 套接字 API 在直接 C 中执行此操作 - 但您必须处理 libpcap 存在的东西以从您那里抽象出来 - 例如进行原始帧传输时可能需要的底层系统调用,除了标准socket()
, send()
,recv()
调用。我推测ioctl
您可能至少需要一些调用,特定于内核 802.11x 子系统/框架 - 这些ioctl()
调用及其值可能无法在不同的主要内核版本之间完全移植。我承认我最终没有使用纯 C(没有 libpcap)方法,所以我不能 100% 确定这个潜在的问题。如果您打算在没有 libpcap 的情况下执行此操作,那么您应该更多地研究它。我不推荐它,除非你有充分的理由