使用Python创建WPA消息完整性码(MIC)

3 投票
1 回答
4455 浏览
提问于 2025-04-17 17:25

我尝试计算WPA握手包的MIC,但不幸的是失败了。更具体地说,我使用了802.1x的数据包(就像规范所说的那样)。

MIC = HMAC_MD5(MIC Key, 16, 802.1x data)

这是相关的代码:

mic = hmac.new(ptk[0:16],data)
print "mic: " + mic.hexdigest()  + "\n"

其中hmac.new是从hmac库中获取的:

import hmac,hashlib,binascii

加密的密钥显然是成对临时密钥(也叫做密钥确认密钥)的前16个字节。PTK是通过一个叫cowPatty的程序来确认的。所以我可以排除这两个因素是错误的。这是我的802.1x数据,它以十六进制值0103开头:

01030077fe010a001000000000000000
01ae11df37f5fb100665ce0c849f5950
c0e7901da3224ddfc9e9434babad5512
73000000000000000000000000000000
00000000000000000000000000000000
00e8b4b90bfc3fd97b657afeb66262ae
940018dd160050f20101000050f20201
000050f20401000050f202

Wireshark计算出的MIC是:

e8b4b90bfc3fd97b657afeb66262ae94

我计算出的MIC是:

5492624bb538b52d6aa6261c692bd595

不幸的是,无论我怎么做,我都无法计算出相同的MIC。也许有专家能提供一些有价值的建议,这将非常感谢!

最好的祝福!

1 个回答

6

这里是一个4次握手中第二条消息的EAPOL数据(从逻辑链路控制之后开始):

unsigned char eapol[] =
{
    '\x01',        // Version
    '\x03',        // Type
    '\x00','\x77', // Length
    '\xfe',        // Key Descriptor Type
    '\x01','\x0a', // Key information
    '\x00','\x10', // Key length
    // Replay counter
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x01',
    // WPA Key Nounce
    '\x77','\xd6','\x54','\xad','\x0c','\x1f','\xea','\x2f',
    '\x20','\x99','\xf1','\xdd','\x1c','\xae','\xdb','\xd8',
    '\xf7','\xe8','\x86','\xb0','\x81','\x60','\xed','\x7f',
    '\x70','\xdd','\xbb','\x33','\xb6','\xf1','\xd9','\x98',
    // Key IV
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00',
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00',
    // Key RSC
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00',
    // Key ID
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00',
    // MIC **************** CHANGE HERE ********************
//  '\x0a','\x62','\x24','\x07','\x11','\x36','\xd5','\x67',
//  '\x87','\xc0','\x7b','\x82','\x6b','\x06','\xf7','\xff',
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00',
    '\x00','\x00','\x00','\x00','\x00','\x00','\x00','\x00',
    // Key Data Length
    '\x00','\x18',
    // Key Data
    '\xdd','\x16','\x00','\x50','\xf2','\x01','\x01','\x00',
    '\x00','\x50','\xf2','\x04','\x01','\x00','\x00','\x50',
    '\xf2','\x04','\x01','\x00','\x00','\x50','\xf2','\x02'
};

确保你把MIC字段的16个字节替换成'\x00',这样你就有了一个有效的EAPOL数据,可以用来计算Michael算法。

另外,确保你使用的算法是根据WPA版本来选择的。WPA1使用的是HMAC和MD5哈希函数,而WPA2使用的是HMAC和SHA1哈希,正如你在aircrack-ng的源代码中看到的:

if (ap->wpa.keyver == 1)
    HMAC(EVP_md5(), ptk[j], 16, ap->wpa.eapol, ap->wpa.eapol_size, mic[j], NULL);
else
    HMAC(EVP_sha1(), ptk[j], 16, ap->wpa.eapol, ap->wpa.eapol_size, mic[j], NULL);

我觉得在HMAC对象中,Python默认使用的是MD5。

撰写回答