利用PIN码破解wifi密码(WPA2-PSK)

無奈宿舍無線網絡實在太差,校園網連個QQ都登錄不上,看到XX地方的信號居然是滿格,難免想讓我做一次網絡安全方面的實驗。聲明下,僅僅是實驗而已,禁用於非法目的。

首先,亂扯一些東西,看看就好,不看也行。

1.      Pin碼

WPS中的PIN碼,WPS是一種免輸入密碼和SSID的建議無線配置協議,它的好處就是能夠讓支持WPS的設備,在第一次連接某個設備室,能夠通過非手工輸入SSID和密碼的方式自動建立連接。

順帶一個:

若路由器支援WPS,且有push btn方式。可用Push button方式的,大致是這樣工作的:按下路由器上面一個WPS按鈕;在無線設備(電腦、iPad等需要連接這個路由器的設備)上打開Wifi配置,選擇WPS,確定;自動配置就完成了,不用輸入SSID和密碼。為了保證安全性,按下WPS按鈕之後,如果超過一定時間沒有受到設備的WPS配置請求,則此次WPS握手就超時失效了。

PIN碼這東西據說在一些牌子的路由上可有後六位的MAC獲得,而且正確率頗高啊。

2.      QSS

QSS又稱快速安全設置。QSS快速安全設置功能,配合具有QSS或WPS功能的無線網卡使用時,只需分別按下路由器和網卡上的QSS快速安全按鈕,或在電腦上輸入路由器PIN碼,即可完成比傳統WEP加密更安全的WPA2級別的無線安全連接,不需要再記憶複雜的密碼。通過按下無線路由和無線網卡上的QSS按鈕,即可自動建立WPA2級別的安全連接,無需在路由器或網卡管理軟體的介面上進行繁瑣的設置,大大簡化無線安全設置的操作。

3.      PSK==無線密碼(這個就是平常我們上Wifi時候輸入的密碼)

4.      WEP加密

WEP:有線等效加密演算法,它是一種可選的鏈路層安全機制,用來提供訪問控制,數據加密和安全性檢驗等。



發送端加密過程分析:IV為初始化向量;PASSWORD為密碼,KSA=IV+PASSWORD;DATA為明文數據,CRC-32為銘文的完整性校驗值;PRGA=RC4(KSA)的偽隨機數密鑰流;XOR為異或的加密演算法;ENCRYPTEDDATA為最後的密文。最後IV+ENCRYPTEDDATA一起發送出去。

接受端解密過程分析:CIPHERTEXT為密文。它採用與加密相同的辦法產生解密密鑰序列,再將密文與之XOR得到明文,將明文按照CRC32演算法計算得到完整性校驗值CRC-32‘,如果加密密鑰與解密密鑰相同,且CRC-32’==CRC-32,則接受端得到了原始明文數據,否則解密失敗。

破WEP密碼就是利用加密體制缺陷,收集足夠IV數據包,使用分析密鑰演算法還原出密碼。

5.      WPA&WPA2加密

WPA2是WPA的升級版。

WPA=802.1x+EAP+TKIP+MIC=Pre-shared Key+TKIP+MIC

WPA2(802.11i)=802.1x+EAP+AES+CCMP= Pre-shared Key+AES+CCMP

其中,802.1x,Pre-sharedKey是身份驗證演算法(WEP沒有的);TKIP和AES是數據傳輸加密演算法(類似WEP中的RC4);MIC和CCMP是數據完整性編碼校驗演算法(類似於WEP中的CRC32演算法):EAP稱為擴展認證協議,是一種架構,而不是演算法。

WPA認證方式:

           工業級的,安全性高的地方用,需要認證服務器:802.1x+EAP

           家用級的,安全性低的地方用,無需認證服務器:Pre-sharedKey

WPA的破解方式(這個是以前的用法,太不實用了,還是順帶說說吧)

WPA破解不是抓越多的包就可以同WEP一樣破解掉了,WPA破解跟抓包數量的多少沒有半毛錢關係,破解的關鍵是要獲取握手包,四次握手包!WPA四次握手過程如下圖所示:


      WPA-PSK初始化工作:

         使用 SSID 和passphares使用以下演算法產生PSK 在WPA-PSK 中PMK=PSK,PSK=PMK=pdkdf2_SHA1(passphrase,SSID,SSID length,4096)

       第一次握手
AP廣播SSID,AP_MAC(AA)→STATION
STATION 端使用接受到的SSID,AP_MAC(AA)和passphares使用同樣演算法產生PSK
       第二次握手
STATION 發送一個亂數SNonce,STATION_MAC(SA)→APAP端接受到SNonce,STATION_MAC(SA)後產生一個亂數ANonce然後用PMK,AP_MAC(AA),STATION_MAC(SA),SNonce,ANonce 用以下演算法產生PTK,PTK=SHA1_PRF(PMK, Len(PMK), "Pairwise key expansion",MIN(AA,SA) ||Max(AA,SA) || Min(ANonce,SNonce) || Max(ANonce,SNonce))
提取這個PTK 前16 個位元組組成一個MIC KEY
       第三次握手
       AP發送上面產生的ANonce→STATION
STATION 端用接收到ANonce 和以前產生PMK,SNonce,AP_MAC(AA),STATION_MAC(SA),用同樣的演算法產生PTK。提取這個PTK 前16 個位元組組成一個MIC KEY,使用以下演算法產生MIC值,用這個MIC KEY 和一個802.1x data 資料幀使用以下演算法得到MIC值。MIC = HMAC_MD5(MIC Key,16,802.1x data)
第四次握手
STATION 發送802.1x data ,MIC→AP
STATION 端用上面那個準備好的802.1x 資料幀在最後填充上MIC值和兩個位元組的0(十六進位)讓後發送這個資料幀到AP。
AP端收到這個資料幀後提取這個MIC。並把這個資料幀的MIC部分都填上0(十六進位)這時用這個802.1x data 資料幀,和用上面AP產生的MIC KEY 使用同樣的演算法得出MIC’。如果MIC’等於STATION 發送過來的MIC。那麼第四次握手成功。若不等說明則AP 和STATION 的金鑰不相同,或STATION 發過來的資料幀受到過中間人攻擊,原資料被篡改過。握手失敗了。
總之,想要破解WPA-PSK,必須符合以下條件:
A.      必須要有合法客戶端,並且存在合法的通信流量。
B.      通過抓取數據包進行破解的幾率為0,唯一的破解方法是抓取WPA-PSK的四次握手包然後暴力破。
C.      得到四次握手包之後,破解的關鍵就是字典的好壞,運氣很重要滴。
 
然後,我們開始幹活:

1.      破解的方法

以前我所瞭解的都是跑字典,暴力的破解密碼,這個字典聽說是G級別的容量,不過貌似有簡化版的,而且跑字典的方法,耗時實在是太多了,受不了啊~現在出現了另外一種的破解方法,接下來說說:

         利用WPS的PIN碼,以窮舉的方式猜PIN碼連接路由。這裡說明一下,因為PIN碼都是數字,八位的,破解的時候先破前四位,如果發現一致就反饋一個資訊,所以,前四位破撐飽了也就10^4次,確定了前四位後破接下來的三位,接下來的3位撐飽了也只有1000次,最後一位是校驗位,它根據前七位得到,所以,這麼算下來也就11000次,比跑字典輕鬆多了!

P.S.只有AP 開啟了WPS功能,才可以用PIN法學習PSK 密碼!

2.      破解的工具

目前就我用過知道的破解軟件有BT,CDLinux,奶瓶,水滴,打氣筒。BT很早之前玩過了,需要一些配置,略過。剩下的,不知道是不是rp的問題,只有打氣筒讓我成功了,其他的多少都有點問題。所以,接下來說說打氣筒怎麼用。

然後,我們開始實際動手玩一玩。(換個實驗環境來寫此篇教程,在宿舍的實驗環境下寫,影響太不好了,嘻嘻)

         言歸正傳,需要的設備:UltraoISO+U盤或者VmWare,無線網卡一張,筆記本電腦鼠標等等。軟件就是上面提到的打氣筒。

這裡說說Vmware的方法,另外一個百度、google、bing之:

1.安裝Vmware:http://www.vmware.com/

2.安裝完成後打開,接下來按照圖示操作:

文件—新建虛擬機—















轉載請註明出處。謝謝!

blog.csdn.net/chenpeggy

以下是一个简单的实现,需要根据具体硬件和库函数进行调整。 ```c #include "main.h" #include "stm32f1xx_hal.h" #include "ssd1306.h" #include "keypad.h" #include "buzzer.h" #include <string.h> #define PASSWORD_LEN 4 #define PASSWORD_ADDR 0x08008000 UART_HandleTypeDef huart1; // 定义密结构体,包括密和是否设置标记 typedef struct { uint8_t password[PASSWORD_LEN]; uint8_t is_set; } Password; Password password; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); // OLED 屏幕显示函数 void display(char *message) { ssd1306_Fill(Black); ssd1306_SetCursor(0, 0); ssd1306_WriteString(message, Font_7x10, White); ssd1306_UpdateScreen(); } // 读取密 void read_password() { memcpy(&password, (Password*) PASSWORD_ADDR, sizeof(Password)); if (!password.is_set) { // 如果密未设置,则设置默认密为 1234 memcpy(password.password, "1234", PASSWORD_LEN); password.is_set = 1; HAL_FLASH_Unlock(); FLASH_Erase_Sector(FLASH_SECTOR_2, FLASH_VOLTAGE_RANGE_3); HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, PASSWORD_ADDR, (uint32_t) &password); HAL_FLASH_Lock(); } } // 检查密是否正确 uint8_t check_password(uint8_t *input_password) { if (memcmp(input_password, password.password, PASSWORD_LEN) == 0) { return 1; } else { return 0; } } // 修改密 void change_password() { uint8_t new_password[PASSWORD_LEN]; uint8_t confirm_password[PASSWORD_LEN]; display("New password:"); keypad_wait(&new_password, PASSWORD_LEN); display("Confirm password:"); keypad_wait(&confirm_password, PASSWORD_LEN); if (memcmp(new_password, confirm_password, PASSWORD_LEN) == 0) { memcpy(password.password, new_password, PASSWORD_LEN); HAL_FLASH_Unlock(); FLASH_Erase_Sector(FLASH_SECTOR_2, FLASH_VOLTAGE_RANGE_3); HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, PASSWORD_ADDR, (uint32_t) &password); HAL_FLASH_Lock(); display("Password changed!"); } else { display("Passwords don't match!"); } } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); ssd1306_Init(); keypad_init(); buzzer_init(); read_password(); uint8_t input_password[PASSWORD_LEN]; uint8_t input_count = 0; uint8_t input_success = 0; while (1) { display("Enter password:"); keypad_wait(&input_password, PASSWORD_LEN); if (check_password(&input_password)) { display("Unlock success!"); input_success = 1; HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); } else { input_count++; if (input_count == 1) { display("Wrong password!"); buzzer_buzz(); } else if (input_count == 2) { display("Forgot password?"); change_password(); input_count = 0; } } } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); /*Configure GPIO pin : PC13 */ GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } ``` 注意:上述代仅供参考,具体实现需要根据实际硬件和库函数进行调整。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值