Hotdry.
systems-engineering

使用 libwifi 制作自定义 deauth 帧进行 WiFi 安全审计

通过 libwifi 库自定义生成 deauth 帧,实现针对性断开测试,而不依赖操作系统 WiFi 驱动。提供工程参数和监控要点。

在 WiFi 安全审计中,deauth 帧(Deauthentication Frame)是一种常见的测试工具,用于模拟接入点(AP)向客户端发送断开连接的指令,从而评估网络的抗干扰能力和客户端的响应机制。传统的 WiFi 驱动往往受限于操作系统策略,无法灵活生成自定义的管理帧,这导致审计工具依赖于外部注入设备或特定硬件。然而,libwifi 库作为一个纯 C 实现的 802.11 帧解析与生成工具,提供了一种高效、跨平台的解决方案。它允许开发者直接构造 deauth 帧,而无需依赖 OS 驱动的限制,实现更精确的针对性测试。

libwifi 的核心优势在于其简洁的 API 和对 802.11 标准的全面支持。根据官方文档,该库支持所有管理帧类型,包括 deauth(subtype 12),并提供严格的错误检查和跨架构兼容性(x86、ARM 等)。在安全审计场景下,使用 libwifi 生成 deauth 帧可以避免驱动层面的抽象化,确保帧的字段(如地址、原因码)完全符合标准,从而提高测试的可靠性。例如,在渗透测试中,攻击者常伪造 deauth 帧来强制客户端重连,捕获握手包;审计者则可模拟此过程,验证防护措施的有效性。相比 Scapy 等 Python 工具,libwifi 的 C 实现更高效,适合嵌入式或高性能需求。

生成 deauth 帧的流程分为三个步骤:初始化帧结构、填充必要字段、序列化输出。首先,需要包含 libwifi 的头文件并链接库(-lwifi)。核心函数是 libwifi_create_deauth,它接受一个 struct libwifi_deauth 指针、接收者 MAC(addr1)、发送者 MAC(addr2)、BSSID(addr3)以及原因码(reason)。原因码是关键参数,定义在 IEEE 802.11 标准中,例如 7 表示 “Class 3 frame received from nonassociated STA”,适合模拟未授权断开;1 表示 “Unspecified reason”,通用但不具体。以下是简化代码示例:

#include <libwifi.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    struct libwifi_deauth deauth = {0};
    unsigned char receiver[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};  // 广播或特定客户端 MAC
    unsigned char transmitter[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55};  // 伪造 AP MAC
    unsigned char bssid[6] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};  // 目标 BSSID

    int ret = libwifi_create_deauth(&deauth, receiver, transmitter, bssid, 7);  // reason=7
    if (ret != 0) {
        fprintf(stderr, "Failed to create deauth frame: %d\n", ret);
        return 1;
    }

    size_t frame_len = libwifi_get_deauth_length(&deauth);
    unsigned char *frame = malloc(frame_len);
    if (!frame) {
        libwifi_free_deauth(&deauth);
        return 1;
    }

    ret = libwifi_dump_deauth(&deauth, frame, frame_len);
    if (ret < 0) {
        fprintf(stderr, "Failed to dump deauth frame: %d\n", ret);
        free(frame);
        libwifi_free_deauth(&deauth);
        return 1;
    }

    // 这里将 frame 发送到 monitor mode 接口,例如使用 pcap_inject
    // 示例:pcap_t *handle = pcap_open_live("mon0", BUFSIZ, 1, 1000, errbuf);
    // pcap_inject(handle, frame, frame_len);

    free(frame);
    libwifi_free_deauth(&deauth);
    return 0;
}

编译时使用:gcc example.c -o example -lwifi -lpcap。注意,发送帧需要将网卡置于 monitor mode(使用 airmon-ng start wlan0),并确保硬件支持 packet injection(如 Atheros 或 Ralink 芯片)。在审计中,推荐参数包括:间隔 50-100ms 发送 10-50 帧,避免过度洪泛;针对特定客户端时,将 receiver 设置为客户端 MAC,提高效率;结合频道锁定(iwconfig mon0 channel 6)以匹配目标 AP。

为确保测试的可落地性,以下是工程化清单:1. 环境准备:安装 libwifi(cmake .. && make && sudo make install),验证版本(libwifi_get_version ());2. 硬件检查:使用 iw list 确认支持 monitor 和 injection;3. 帧验证:生成后用 Wireshark 捕获,检查 subtype=0x0C(管理帧 deauth)、FC 字段(ToDS=0, FromDS=0);4. 监控指标:观察客户端重连时间(正常 <5s)、丢包率(iw dev mon0 stats);5. 回滚策略:测试后立即停止注入,恢复网卡模式(airmon-ng stop mon0)。这些参数基于 libwifi 的文档和 802.11 标准,确保审计过程可控。

尽管 libwifi 简化了帧生成,但仍需注意风险。deauth 攻击可能干扰合法网络,现代 AP(如支持 PMF/802.11w)可忽略未加密管理帧;此外,频繁注入可能触发 IDS/IPS 警报。审计时,应在隔离环境中进行,并记录所有操作以符合合规要求。总体而言,libwifi 提升了 WiFi 安全测试的精度和效率,适用于 pentest 工具开发或研究。

资料来源:libwifi 官方文档(https://libwifi.so),GitHub 仓库(https://github.com/libwifi/libwifi),IEEE 802.11 标准。

查看归档