首先,在尝试传输原始802.12帧时,您需要注意一个问题-设备驱动程序必须支持数据包注入。
您提到了监视模式,这在高级别上相当于注入能力的接收端-这不是一种“模式”,而是一种能力/特性。我之所以这样说,是因为Linux上的一些892.11设备驱动程序要么:
1. 支持监视模式和帧注入
2. 支持监视模式但不支持帧注入
3. 两者都不支持
我不知道有什么简单的方法可以检查驱动程序是否支持帧注入,除非尝试进行帧注入并在另一台设备上嗅探空气以确认它是否被看到。
通常可以通过使用
sudo wlan0 set monitor
来检查监视模式,并查看返回代码和/或输出来检查。
几年前我曾经做过这方面的工作,当时很少有设备“开箱即用”支持监视模式和帧注入。许多设备只支持修改后的供应商或内核驱动程序的监视模式。
您需要确保您的设备有可用的驱动程序,完全支持这两种功能。这种任务(帧监视和注入)对于渗透测试人员来说很常见,他们倾向于使用Kali Linux,它实际上只是一个Ubuntu发行版,预装了一堆“黑客”工具和(修改后的)802.11设备驱动程序,并在其存储库中。您可以通过使用搜索引擎找到为Kali用户推荐的设备和驱动程序来节省时间,以找到受良好支持的卡。
我特别提到了监控/注入功能,因为几年前我第一次参与类似的项目时,需要使用官方内核驱动的修补版本来支持监控模式- 它是rtl8812au芯片组。那时,我错误地假设驱动程序中的监控模式支持意味着完全的注入支持。我花了两天时间不停地尝试,以为我的应用程序中的帧构建不正确,导致没有帧离开卡。结果证明,我需要使用更近期的
驱动程序分支才能获得完整的注入支持。这种驱动程序特别支持监控模式和帧注入。诊断该问题最令人沮丧的事情是,在尝试传输帧时,我没有收到任何系统调用或内核消息中的错误提示 - 这些帧只是在某个地方被静默丢弃,可能是在驱动程序中。
关于如何实现这一点的主要问题,答案几乎肯定是
libpcap,如果您正在使用C/C++编写应用程序,因为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的情况下执行此操作,那么这是您应该更深入研究的事情。除非您有一个非常好的理由,否则我不建议这样做。