我正在着手一个与wifi相关的研究项目,它要求我分析wifi客户端和ap之间在连接设置期间的帧交换。
实验设置:我有一台笔记本电脑M,在监控模式下使用Wireshark捕捉WiFi流量,设备A(运行Linux)通过802.1X身份验证连接到WiFi网络,特别是使用EAP-PEAP协议。
我只控制笔记本电脑M和设备A,但不控制AP和网络(包括RADIUS服务器)。
目标:我想解码Wireshark在笔记本电脑M上捕获的WiFi数据帧。根据this Wireshark how to,我需要以某种方式提取网络和设备A之间交换的PMK(成对主密钥)。
因为我只控制设备A,所以我需要从中提取PMK。
问题:我不知道如何从设备A(假设是Linux操作系统)中提取PMK,特别是考虑到我们正在讨论一个EAP-PEAP会话,而且我在Web上搜索时还没有找到任何结论性的提示。
我可以找到this discussion,这意味着pmk直接存储在wifi网卡或驱动程序中。
问题:
甚至可以提取pmk,例如在linux系统中,而不必对客户端系统进行重大修改(例如修改无线驱动程序的代码等)?考虑到这种“安全漏洞”会有多严重,我认为这很难做到。
pmk是否以某种方式存储(例如在linux中)?从以上情况来看,我不认为会是这样。
我需要修改什么代码(假设是linux操作系统)来提取pmk?
注:我想指出的是,我不认为这是一个“黑客”问题(因此也不违背stackoverflow.com的政策),因为我控制客户端设备(不仅仅是监控设备)。

最佳答案

我发现了两种输出pmk的方法:
简单方法:使用wpa_supplicant选项调用wpa_supplicant,同时使用一些调试选项(例如-K)。这将包括调试输出中的密钥(密码等)。
硬方法:改变-dd的代码以输出键。考虑到cc选项存在,这种方式是不必要的困难,但这是我尝试的第一件事(不要问)。我在下面总结了我是如何做到这一点的,对于希望修改wpa_supplicant代码的人来说,这可能很有趣。
2)硬办法:修改-K代码
我可以通过改变wpa_supplicant的代码找到答案,使其在身份验证期间输出pmk。在我的例子中,客户端设备是一个运行raspbian gnu/linux 7(喘息)的raspberry pi模型b+,v1 2,它使用了一个旧版本的wpa_supplicant,即v1.0, 2012-05-10
对于想知道的人,我已经修改了源文件wpa_supplicant,函数wpa_supplicant,以输出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

10-08 17:21