領導要求確認設備進行802.1X認證時,是否直接將用戶名密碼明文傳給交換機。配好端口鏡像、搭好Radius環境後進行了抓包分析。html
完整流程以下:編碼
客戶端與交換機間的數據截獲以下,5個數據與上圖描述一致:加密
配置的用戶名密碼爲test/123456,在客戶端發往交換機----Nearest MAC地址01:80:c2:00:00:03,該地址爲保留地址,目的地址該地址表示發送二層廣播包-----的第二和第四個包中發現了用戶名,但未發現密碼。spa
參考網上資料也說密碼是加密的,下邊第二張圖中的EAP-MD5 Value字段的值「51224bd42783bf78e1a5093474122801」便是加密後的密碼。rest
到這已經算完成了領導給的任務:設備將用戶名明文傳給交換機,密碼加密後傳給交換機。code
但處理問題須要追根究底:密碼加密傳輸究竟是怎麼個加密法?你肯定嗎?你能本身把密碼從新計算出來嗎?htm
按網上資料來看密碼都是通過以下計算:blog
R = MD5(id||P||C)
「||」是直接拼接在後面的意思,但大多資料都沒說清這幾個值以什麼類型拼接,本身計算時一直算不對,在此總結一下:md5
id----第三個數據包中的id字段值,以一字節長度整型拼接ci
P----密碼,以ASCII碼形式拼接
C----第三個數據包中返回的MD5值,bin十六進制形式。
從上圖能夠看到交換機返回的id爲4,MD5挑戰值爲"9ec74cf5cbaa27781b1c6203766430fe"。而另外在Radius設置的密碼爲123456
編寫如下代碼進行計算:
import hashlib import binascii # 我這裏交換機返回的id爲4,注意是整型 id = 4 # 我這裏密碼是123456 password = "123456" # 我這裏交換機返回的md5鹽值是"9ec74cf5cbaa27781b1c6203766430fe" challenge = "9ec74cf5cbaa27781b1c6203766430fe" # 將id轉爲一字節長度整型 id = id.to_bytes(1,"big") # 將password進行編碼 password = password.encode("ASCII") # 將challenge改爲bin十六進制 challenge = binascii.a2b_hex(challenge) # 拼接 con_value = id + password + challenge # 計算。R = MD5(id||P||C) md5_value = hashlib.md5(con_value).hexdigest() pass
計算結果以下,獲得的密碼串爲「51224bd42783bf78e1a5093474122801」,與2.2圖二中的密碼串一致。
參考:
https://hal.inria.fr/hal-01534313/document