簡單聊聊Radius的PEAP協(xié)議
簡述:radius協(xié)議很少有人知道,但是生活中還是很常使用的。先看看他的wiki上面是怎么說的
RADIUS(Remote Authentication Dial In User Service) 用戶遠程撥入認證服務(wù),它主要針對的遠程登錄類型有:SLIP、PPP、telnet和rlogin等。RADIUS協(xié)議應(yīng)用范圍很廣奸腺,包括普通電話、上網(wǎng)業(yè)務(wù)計費血久,對VPN的支持可以使不同的撥入服務(wù)器的用戶具有不同權(quán)限突照。
EAP協(xié)議:可擴展的網(wǎng)絡(luò)認證協(xié)議,這個就是我認為網(wǎng)絡(luò)工程師最取巧的地方氧吐,好我給你一個可擴展的鍵值讹蘑,這個鍵值在我的字典中的鍵值是79,79內(nèi)我分給你一個位的長度(也就是FF 255的長度)筑舅,你隨便玩兒吧座慰,放啥隨你,只要我認得翠拣。
現(xiàn)在常用的是PEAP的協(xié)議進行radius認證處理版仔。首先看這個名詞就知道,它是一個EAP協(xié)議的擴展误墓,進行protect的EAP協(xié)議蛮粮。這的P是最坑的地方,鬼知道他們是怎么想的把P用TLS協(xié)議進行保護的處理谜慌。我的天然想,抓狂中....... 言歸正傳,我們開始抓包咯:
上面可以看到相關(guān)的請求(這么多包....)
我們先看第一個包:
可以看到在EAP中出現(xiàn)了
|code|id|Length|Type|identity|
| 1 |1 |1 2 |1 | |
在上面identity一般是username
這個時候是告訴radius服務(wù)器我需要對你發(fā)送這個的認證請求畦娄,請準(zhǔn)備處理
對于這個包中的Message-Authenticator是對包完整性檢測的一個值,服務(wù)端或者客戶端生成一個發(fā)送過去弊仪,服務(wù)端或者客戶端收到后先進行驗證一遍熙卡,再進行其他的業(yè)務(wù)處理
radius
服務(wù)器會給你mschap-v2的響應(yīng)(在后面的講解中會相關(guān)mschapv2的講解)
這個包就開始了發(fā)送challenge包的處理。
服務(wù)端發(fā)送mschap-v2的challenge進行挑戰(zhàn)處理励饵。
服務(wù)端發(fā)送mschap-v2的挑戰(zhàn)后驳癌,客戶端開始發(fā)送AccesRequest的包進行處理
我們打開這個包后,看到客戶端發(fā)送役听,我們期望使用PEAP這個協(xié)議進行保護傳送的信息
服務(wù)端進行發(fā)揮EAP-TLS的標(biāo)記颓鲜,進行開始的處理
這個屬性是一個byte分成8位進行表示相關(guān)屬性
0....... Length Included False
.0...... More Fragments False 在下面?zhèn)髯C書的時候會需要這個屬性表窘,因為一開始EAP的長度是255,HandShake的certificate長度屬性是三位甜滨,4095的長度乐严。所以需要分段。發(fā)送這個請求是1的時候客戶端會再次過來請求余下的信息
..1..... Start True
.....000 Version 0
重點來了WTF這到底是什么衣摩。 首先是一個EAP-TLS flags 然后進行傳輸昂验。第一個標(biāo)記是content-Type 告訴服務(wù)端這個是handshake的。在這個22的表示時候服務(wù)端和客戶端都會進行記下這個數(shù)據(jù)艾扮,后面會有使用既琴。 TLS來了
TLS來了,第一個是Client Hello 客戶端給服務(wù)端發(fā)送一個請求并且?guī)е?dāng)前客戶端支持的tls的版本泡嘴。服務(wù)端的版本必須低于這個版本才能支持甫恩。這個時候客戶端發(fā)送一個隨機數(shù)我們叫做random1
客戶端發(fā)送客戶端所支持的安全組件。
TLS_RSA_WHITH_AES_256_CBC_SHA
認證算法|RSA | RSA(主流),DSA,ECDSA
加密算法|ES_256_GCM AES128/256 bit酌予,加密模式gcm/ cbc/ ecb
RC4和3DES(不推薦)磺箕,DES(已淘汰)
MAC算法 | SHA256, SHA384, SHA1
密鑰交換算法|ECDHE DHE,ECDHE
這個是server端發(fā)送的server hello的包
server hello 生成一個32位的隨機數(shù),并且選擇一個加密組件(這個加密組件必須是客戶端提供的列表當(dāng)中)這個時候生成了random2
certificate 發(fā)送證書
Server Key Exchange 如果是DH算法霎终,這里發(fā)送服務(wù)器使用的DH參數(shù)滞磺。RSA算法不需要這一步。
Certificate Request Certificate Request 是服務(wù)端要求客戶端上報證書莱褒,這一步是可選的击困,對于安全性要求高的場景會用到。
這個傳輸證書就需要了我們上面提到過的TLS-FLAGS的more fragement
在經(jīng)過了三個包陸續(xù)把上面的東西發(fā)送完成后广凸,我們的server hello 終于完成阅茶。

客戶端發(fā)送 Certificate 這個屬性是因為我們server端有Certificate Request的屬性,需要客戶端上傳證書谅海。
Client Key Exchange 這個是一個隨機數(shù)脸哀,我們用上一步獲取的服務(wù)端的公鑰證書進行加密,服務(wù)端這個時候需要解密這個扭吁,算出random3
Encrypted HandShake Message 這個是用master screct + hash+ "client finshed" 生成的一個文字撞蜂。然后用兩邊協(xié)商好的公鑰進行加密。
注意:1)上面的Client Key Exchange 用服務(wù)端的私鑰解密后產(chǎn)生的是random3侥袜,再通過這個算法PRF生成Master Sercet
TlsUtils.PRF(pms, "master secret", TlsUtils.concat(securityParameters.clientRandom, securityParameters.serverRandom), 48);
2)生成Master Sercet 是為了在后面通過對稱加密蝌诡,因為非對稱加密非常浪費性能。
3)Encrypted HandShake Message 是通過master secret 加密后的東西枫吧。服務(wù)端在收到后必先進行解密浦旱,然后服務(wù)端在根據(jù)"client server"生成一個字符串,對比是否想等九杂。
服務(wù)端要進行最后一步了Server Done
Server Done ?!哪呢颁湖,哪里有ServerDone宣蠕。
這個server done 是機密服務(wù)端存儲進去的∩啵客戶端需要解密后對比抢蚀,如果正確,就認為這次握手是成功的涎永。
生成的算法是 Master+hash+"server done"
其中這個hash是記錄所有handshake值后計算出來的思币。所以如果客戶端和服務(wù)端都收到所有的包后,兩邊的(這個hash是32位羡微,前16位MD5 后16位SHA1)hash值應(yīng)該是一樣的
這個時候客戶端再發(fā)送一個EAP-TLS請求表示握手完成谷饿。
剩下的包都是application data的包了,各位兄弟妈倔,祝你好運博投,因為這些都是加密后的,wireshark以及無法幫你解包了
剩下的基本都是mschap-v2的流程了盯蝴,簡單說一下就是服務(wù)端先給你個隨機挑戰(zhàn)數(shù)毅哗,客戶端收到后
randomServer+username+password+random2 (peer random) 發(fā)送給服務(wù)端,服務(wù)端收到后再算一遍看看兩個是否一樣捧挺。提醒下這中間的解密虑绵,不能漏過任何一個包!C隼印翅睛! 都要解開不要管是否有用,因為TLS為了保證每次對話都雙方通過黑竞,有個類似于HMAC的捕发,每次都計算出來,然后解密處理很魂。
mschapv2可以參考mschap-v2
radius 代碼 jradius
當(dāng)然啦扎酷,JRadius是客戶端的代碼,服務(wù)端自學(xué)吧遏匆。