借助Python理解WPA四次握手过程

您所在的位置:网站首页 pmk是什么品牌 借助Python理解WPA四次握手过程

借助Python理解WPA四次握手过程

2024-03-27 04:38| 来源: 网络整理| 查看: 265

环境准备

在正式开始分析之前,先要准备一下软件和分析对象。

系统环境

本次使用的操作系统是Windows10 1909,部分需要Linux的使用虚拟机安装的Kali进行。

代码部分,解释器版本为Python 2.7。

数据包分析工具使用经典的Wireshark。

数据准备

由于不同的加密方法和参数对握手包的影响较大,因此分析对象使用了Wireshark官方给出的WPA数据包。

该数据包可以在https://wiki.wireshark.org/HowToDecrypt802.11页面上进行下载:

image-20200629105537200.png

手动捕获握手包

额外说明一下,如果想自己捕获设备的WPA握手包,则需要额外的软件,并将网卡置为Monitor Mode。下面简单介绍一下。

Windows平台:在Windows平台下想要捕获802.11管理帧,需要使用微软官方的软件Microsoft Network Monitor。它的安装和使用也相对比较方便,网上也有相当多的教程,如《windows下抓取802.11管理包》。有一点需要注意,该软件在“扫描设置(Scanning Options)”中开启Monitor Mode后,该窗口不能关闭,否则会退出:

20150905181951_10373.png

Linux平台:在Linux平台下,可以借助我们熟悉的aircrack-ng套件来设置网卡的Monitor Mode,并使用Wireshrak来获取和查看数据。此处以Kali为例,其他Linux系统可以自行安装相关套件。

设置监听模式的命令为:

root@kali:~# airmon-ng start wlan0

其中wlan0是网卡的名称。若出现以下情况:

root@kali:~# airmon-ng start wlan0​Found 2 processes that could cause trouble.If airodump-ng, aireplay-ng or airtun-ng stops working aftera short period of time, you may want to run 'airmon-ng check kill'​    PID Name   1959 NetworkManager   1989 wpa_supplicant​PHY Interface Driver Chipset​phy0 wlan0 rt2800usb Ralink Technology, Corp. RT2870/RT3070​ (mac80211 monitor mode vif enabled for [phy0]wlan0 on [phy0]wlan0mon) (mac80211 station mode vif disabled for [phy0]wlan0)​

说明网卡被占用,需要使用airmon-ng check kill命令来结束占用进程:

root@kali:~# airmon-ng check kill​Killing these processes:​    PID Name   1989 wpa_supplicant​root@kali:~# airmon-ng start wlan0​​PHY Interface Driver Chipset​phy0 wlan0mon rt2800usb Ralink Technology, Corp. RT2870/RT3070​

这里网卡名称会变成wlan0mon,需要注意。

但是,直接设置后抓包有时只能抓到部分,比如仅有AP侧的数据,设备端的数据包都丢失了,原因是未指定信道。此时需要使用airodump-ng工具查看目标AP的信道:

root@kali:~# airodump-ng wlan0mon

image-20200629141915808.png

上图中第一行所示的信息中,CH表示信道,我们想对该AP进行四次握手的捕获,则需要将网卡监听的信道固定为11:

root@kali:~# airmon-ng start wlan0mon 11​​PHY Interface Driver Chipset​phy0 wlan0mon rt2800usb Ralink Technology, Corp. RT2870/RT3070​ (mac80211 monitor mode already enabled for [phy0]wlan0mon on [phy0]11)

看到命令行中最后一行括号里的提示,表示已经设置为固定监听信道11。

此时打开wireshark,选中网卡wlan0mon即可捕获。

WPA四次握手

在上一篇文章《Wi-Fi攻击方式简述》中,已经对WPA的握手过程进行过简单讲解,总结起来WPA的四次握手完成了:

1)Wi-Fi密码的验证

2)后续通信加密的密码的计算(注意这里是“计算”不是“传输”)

而在其握手过程中,会生成一些过程产物,如加密握手数据的密钥、完整性校验数据等。密钥计算的总览视图如下:

image-20200629154441387.png

四次握手的简单示意图:

686769-20161117152254170-216963418.png

接下来会逐步介绍每一步的计算过程。

握手前的准备:计算PMK

PMK(Pairwise Master Key) 是整个WPA认证过程中非常核心的一个密钥,是由Wi-Fi的SSID和Pre-Shared-Key(即Wi-Fi密码)计算而来,其算法被称为Password-Based Key Derivation Function 2 (PBKDF2) ,是一种使用HMAC-SHA1,使用SSID作为盐值来进行哈希的一种算法。

image-20200629170801055.png

在默认的Python环境中,需要安装pbkdf2库来支持这种算法,可以使用pip install pbkdf2命令来安装 。

from pbkdf2 import PBKDF2​psk = "Induction"ssid = "Coherer"pmk = PBKDF2(psk, ssid, 4096).read(32)

image-20200629165810353.png

此外,可以利用Linux系统中的wpa_passphrase工具来计算PMK,其命令为:

pentest@DESKTOP-2AE07FJ:~$ wpa_passphrase Coherer Induction

image-20200629165935651.png

这里可以看出来,计算出来的值是一致的。

第一次握手:传递ANonce,STA计算PTK

在WPA的第一次握手时,由AP向STA发送ANonce:

image-20200629170336475.png

在这个数据包中,除了 ANonce 以外,在头部包含了双方的MAC地址。此时STA本地生成SNonce,满足了PTK计算的全部条件,因此进行PTK的计算。

image-20200629171145032.png

由于SNonce在第二次握手的数据包中,因此这部分计算的演示在下一节进行。

第二次握手:传递SNonce,AP计算PTK

第二次握手时,STA向AP发送SNonce:

image-20200629171638896.png

PTK(Pairwise Transient Key)的计算需要使用PRF512算法,其实现是参照《Understanding WPA/WPA2 Hash (MIC) Cracking Process In Python》文章中给出的算法进行:

def customPRF512(key, A, B):    blen = 64    i = 0    R = ''    while i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3