linux - 在 EAP-PEAP 身份验证下从 WiFi 客户端提取 PMK,用于 Wireshark 分析

标签 linux wifi driver wpa

我正在开始一个与 WiFi 相关的研究项目,这需要我分析在连接设置期间 WiFi 客户端和 AP 之间的帧交换。

实验设置:我有一台笔记本电脑 M,在监控模式下使用 Wireshark 捕获 WiFi 流量,一台设备 A(运行 Linux)通过 802.1x 身份验证连接到 WiFi 网络,特别是使用 EAP- PEAP 协议(protocol)。

我只控制笔记本电脑 M 和设备 A,但不控制 AP 或网络(包括 RADIUS 服务器)。

目标: 我想解码笔记本电脑 M 上 Wireshark 捕获的 WiFi 数据帧。根据 this Wireshark how to ,我需要以某种方式提取在网络和设备 A 之间交换的 PMK(成对主 key )。

因为我只控制设备 A,所以我需要从中提取 PMK。

问题:我不知道如何从设备 A(假设是 Linux 操作系统)中提取 PMK,特别是考虑到我们正在谈论 EAP-PEAP session ,而且我还没有在网络上搜索时未能找到任何确凿的提示。

我可以找到 this discussion ,这意味着 PMK 直接存储在 WiFi NIC 或驱动程序中。

问题:

  • 是否有可能提取 PMK,例如在 Linux 系统中,无需对客户端系统进行重大修改(例如修改无线驱动程序的代码等)?考虑到这种“安全漏洞”的严重性,我认为这会非常困难。
  • PMK 是否以某种方式存储(例如在 Linux 中)?根据上述情况,我不希望出现这种情况。
  • 我需要修改什么代码(假设是 Linux 操作系统)来提取 PMK?

P.S.:我想指出,我不认为这是一个“黑客”问题(因此与 stackoverflow.com 的政策不一致),因为我控制客户端设备(不仅是监控设备)。

最佳答案

我找到了两种让 wpa_supplicant 输出 PMK 的方法:

  1. 简单方法:使用-K 选项调用wpa_supplicant,以及一些调试选项(例如-dd).这将在调试输出中包含 key (密码等)。
  2. 硬方式:修改wpa_supplicant的代码输出 key 。考虑到 -K 选项存在,这种方式不必要地困难,但这是我尝试的第一件事(不要问)。我在下面总结了我是如何做到这一点的,这对于希望更改 wpa_supplicant 代码的人来说可能会很有趣。

2) 困难的方法:改变wpa_supplicant代码

我能够通过更改wpa_supplicant 的代码找到答案,使其在身份验证期间输出 PMK。在我的例子中,客户端设备是 Raspberry Pi 型号 B+,V1 2,运行 Raspbian GNU/Linux 7 (wheezy),它使用旧版本的 wpa_supplicant,即 v1.0, 2012-05-10 .

对于任何想知道的人,我已经改变了源文件src/rsn_supp/wpa.c,函数wpa_supplicant_key_neg_complete(),输出PMK,如下:

static void wpa_supplicant_key_neg_complete(struct wpa_sm *sm,
                    const u8 *addr, int secure)
{
    // pass the pmk (pairwise master key) to a hex string.
    int i;
    // hex str to hold pmk. 1024 bit 
    // should be enough (the pmk is supposed to be 256 bit, thus 32 byte, thus 
    // 64 hex chars)
    char pmk_str[1024] = {'\0'};
    char * pmk_ptr = pmk_str;
    // use os_snprintf() (as used by other methods in wpa.c)
    for (i = 0; i < sm->pmk_len; i++) {
        // wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
        //  "WPA: pmk[%d]: %02X", i, sm->pmk[i]);
        pmk_ptr += sprintf(pmk_ptr, "%02X", sm->pmk[i]);
    }
    *(pmk_ptr + 1) = '\0';

    wpa_msg(sm->ctx->msg_ctx, MSG_INFO,
        "WPA: Key negotiation completed with "MACSTR": \
        \n\tPMK=%s \
        \n\t[PTK=%s GTK=%s]", 
        MAC2STR(addr),
        pmk_str,
        wpa_cipher_txt(sm->pairwise_cipher),
        wpa_cipher_txt(sm->group_cipher));
(...)

}

此定制可用on my github .

关于linux - 在 EAP-PEAP 身份验证下从 WiFi 客户端提取 PMK,用于 Wireshark 分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45037197/

相关文章:

linux - 如何在多个文件夹层次结构中删除除最后几个之外的 zip 文件

linux - Linux 中使用 readdir() 的 Level 2 I/O 可能吗?

android - Android 可以做点对点的 ad-hoc 网络吗?

ios - iphone 识别 wifi 接入点的变化很慢

Android 在托管热点时查找设备的 ip 地址

python - 通过 PySpark 连接到 Redshift,我们如何让驱动程序工作?

windows - 学习编写 Windows 驱动程序

c - 线程的意外行为

linux - 从文件中删除范围内的行

linux - 我应该把我编译的.ko文件放在哪个文件夹里?