一、說明
領導要求確認設備進行802.1X認證時,是否直接將用戶名密碼明文傳給交換機。配好端口鏡像、搭好Radius環境后進行了抓包分析。
二、計算
2.1 802.1X認證過程
完整流程如下:
客戶端與交換機間的數據截獲如下,5個數據與上圖描述一致:
2.2 分析場景復現
配置的用戶名密碼為test/123456,在客戶端發往交換機----Nearest MAC地址01:80:c2:00:00:03,該地址為保留地址,目的地址該地址表示發送二層廣播包-----的第二和第四個包中發現了用戶名,但未發現密碼。
參考網上資料也說密碼是加密的,下邊第二張圖中的EAP-MD5 Value字段的值“51224bd42783bf78e1a5093474122801”即是加密后的密碼。
2.3 密碼計算
到這已經算完成了領導給的任務:設備將用戶名明文傳給交換機,密碼加密后傳給交換機。
但處理問題需要追根究底:密碼加密傳輸到底是怎么個加密法?你確定嗎?你能自己把密碼重新計算出來嗎?
按網上資料來看密碼都是經過如下計算:
R = MD5(id||P||C)
“||”是直接拼接在后面的意思,但大多資料都沒說清這幾個值以什么類型拼接,自己計算時一直算不對,在此總結一下:
id----第三個數據包中的id字段值,以一字節長度整型拼接
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