神州數碼802.1x認證協議簡析
一. 前言
本次神州數碼802.1x認證協議的分析有這麼幾個前提:
1. 使用神州數碼客戶端進行上網認證。
2. 協議選擇的是神州數碼私有報文。
3. 使用的靜態IP地址而不是DHCP分配。
4. 不涉及計時計費。
5. 分析的版本基於3.3/3.4
二.基本認證流程
1. 客戶端向認證系統發送EAPOL-Start數據包發起認證。
2. 認證系統向客戶端發送EAP-Request/Identity數據包,請求客戶端發送身份標示。
3. 客戶端接收到認證系統發來的EAP-Request/Identity後,發送包含身份標示信息(用戶名)的EAP-Response-Identity數據包。
4. 認證系統接收到客戶端發送的EAP-Response/Identity後,查詢用戶名,如果驗證成功,繼續,否則返回錯誤信息,客戶端執行步驟11。
5. 認證系統向客戶端發送EAP-Request/Md5-Challenge數據包,數據包中包含客戶端進行Md5加密時所需的16字節Md5-Challenge。
6. 客戶端接收到認證系統發送的EAP-Request/Md5-Challenge,從中取出所需要的Md5-Challenge字段和Id字段,結合密碼,運算得到16字節的加密結果,用於合成EAP-Response/Md5-Challenge數據包。合成完畢,發送數據包。
7. 認證系統接收到客戶端發送的EAP-Response/Md5-Challenge,進行驗證,如果通過,則繼續,否則返回錯誤信息,執行步驟11。
8. 認證系統向客戶端發送EAP-Success數據包,同時將Port狀態置爲Enable,客戶端所在的電腦就此得到上網權限。
9. 認證系統每隔一段時間主動向客戶端發送EAP-Keepalive數據包。
10. 客戶端接收到EAP-Keepalive數據包後(與EAP-Request/Identity數據包內容相同),客戶端執行步驟3,完成連接的保持工作。重複步驟10。
11. 接收到錯誤信息,發送EAP-Logoff數據包,中止認證。
三.協議具體分析
神州數碼
802.1x認證協議並不是完全的私有協議,只是在標準協議的基礎上進行了自己的擴展,爲了敘述方便,對於標準802.1x的描述,附上一部分關於標準802.1x,EAP,EAPOL的相關說明
,不再贅述:
1.以太網協議幀頭描述:
destination
|
6字節
|
目的MAC地址
|
source
|
6字節
|
源MAC地址
|
type
|
2字節
|
協議類型,802.1x的類型是88 8E
|
神州數碼客戶端在發送認證包的時候,無論是否可以得到認證服務器的MAC地址,都採用802.1x協議分配的組播地址01-80-c2-00-00-03作爲目的MAC地址。
4.神州數碼私有報文部分的分析
在標準802.1x認證協議的基礎上,神州數碼進行了擴展。具體表現如下:
A.從EAP-Response-Identity數據包開始,客戶端發送的數據包中均包含一段45字節的私有數據。與標準數據之間用一個值爲0的字節進行分隔【當該字節爲01時表示是DHCP認證模式……後面的IP地址就是網卡信息中那個非法IP,子網掩碼是FF FF 00 00,後面八個字節全零,這種認證方式目前還沒有好好研究】。該數據段的意義如下:
IpAdress
|
4字節
|
Ip地址
|
SubnetMasks
|
4字節
|
子網掩碼
|
GateWay
|
4字節
|
網關
|
Dns
|
4字節
|
Dns地址
|
UsernameMd5
|
16字節
|
用戶名的Md5
|
VerInfor
|
13字節
|
版本信息的ASCII碼
|
例如,我見到的最新的版本號是:0x33 ,0x2e ,0x34 ,0x2e ,0x32 ,0x30 ,0x30 ,0x36 ,0x2e ,0x31 ,0x30 ,0x32 ,0x37
相應的文本就是:
3 . 4 . 2 0 0 6 . 1 0 2 7
B.EAP-Response/Md5-Challenge數據包中加密信息的形成
在EAP-Response/Md5-Challenge數據包中,有16字節的數據是通過md5加密形成的,該過程用C語言描述如下:
//讀取md5 challenge,存儲於m_digiMd5中
memmove(m_digiMd5,pkt_data+0x18,16);
//計算md5值
MD5_CTX md5;
md5.MD5Update(pkt_data+0x13,1);
md5.MD5Update(m_password,strlen((const char*)m_password));
md5.MD5Update(m_digiMd5,16);
md5.MD5Final(m_digiMd5);
//結果保留在m_digiMd5中
其中pkt_data是EAP-Request/Md5-Challenge數據包的起始位置,pkt_data+0x18起的16個字節是Md5-Challenge,pkt_data+0x13起的一個字節是Id,也就是對Id+密碼+Md5-Challenge進行md5運算。
C.神州數碼反饋信息的解析(目前只瞭解了少量信息的格式)
1.認證成功時的信息格式:
認證成功時,認證系統有可能返回相關信息,該信息的格式目前不是很清楚,只知道有時在pkt_data[0x82]處出現0x12標誌,有時在pkt_data[0x99]處出現該標誌,所以現在程序中的考慮是這樣的:
if(pkt_data[0x82]==0x12)
{
char *msg=(char*)malloc(pkt_data[0x83]-2+1);
memmove(msg,pkt_data+0x84,pkt_data[0x83]-2);
msg[pkt_data[0x83]-2]=0;
printf(" 系統消息:/n[%s]/n",msg);
free(msg);
}
else
{
if(pkt_data[0x99]==0x12)
{
char *msg=(char*)malloc(pkt_data[0x9A]-2+1);
memmove(msg,pkt_data+0x9B,pkt_data[0x9A]-2);
msg[pkt_data[0x9A]-2]=0;
printf(" 系統消息:/n[%s]/n",msg);
free(msg);
}
}
標誌位0x12後面的那一個字節就是附加信息的長度,但是這個長度是包含標誌位以及長度自身的,所以信息真正的長度應該是pkt_data[0x83]-2或者pkt_data[0x9A]-2。因爲協議使用一個字節來表示信息長度,所以信息的最大有效長度爲254字節。信息使用GB2312編碼,所以在linux下直接顯示的話,可能會出現問題。
2.失敗信息的格式。
在神州數碼的失敗信息,已經瞭解的有兩個:用戶名驗證失敗,用戶名或密碼錯誤。與成功的消息一樣,都是在找到一個標誌位0x12後,讀取接下來一個字節中存儲的長度信息,從而獲取消息字符串。
在用戶名驗證失敗的消息中,標誌位位於pkt_data[0x2A]
在用戶名或密碼錯誤消息中,標誌位位於pkt_data[0x42]
目前爲止對神州數碼802.1x認證協議的瞭解就是這些。
附加材料:
802.1x協議在實現整個認證的過程中,其三個關鍵部分(客戶端、認證系統、認證服務器)之間是通過不同的通信協議進行交互的,其中認證系統和認證服務器之間是EAP報文。
EAP幀結構如下表所示:
字段
|
字節
|
Code
|
1
|
Identifier
|
2
|
Length
|
3-4
|
Data
|
5-N
|
EAP幀格式中各字段含義如下:
字段
|
佔用字節數
|
描述
|
Code
|
1個字節
|
表示EAP幀四種類型:1.Request;2.Response
3.Success;4.Failure
|
Identifier
|
1個字節
|
用於匹配Request和Response。Identifier的值和系統端口一起單獨標識一個認證過程
|
Length
|
2個字節
|
表示EAP幀的總長度
|
Data
|
0或更多字節
|
表示EAP數據
|
其中Code的取值如下:
1: Request
2: Response
3: Success
4: Failure
802.1x協議定義了一種報文封裝格式,這種報文稱爲EAPoL(EAP over LANs局域網上的擴展認證協議)報文,主要用於在客戶端和認證系統之間傳送EAP協議報文,以允許EAP協議報文在LAN上傳送。
標準EAPoL幀結構如下表所示:
字段
|
字節
|
PAE Ethernet Type
|
1-2
|
Protocol Version
|
3
|
Packet Type
|
4
|
Packet Body Length
|
5-6
|
Packet Body
|
7-N
|
EAPoL幀格式中各字段含義如下:
字段
|
佔用字節
|
描述
|
PAE Ethernet Type
|
2個字節
|
表示協議類型,802.1x分配的協議類型爲888E
|
Protocol Version
|
1個字節
|
表示EAPOL 幀的發送方所支持的協議版本號。本規範使用值爲0000 0001
|
Packet Type
|
1個字節
|
表示傳送的幀類型,如下幾種幀類型:
a) EAP-Packet. 值爲 0000 0000
b)EAPOL-Start.值爲0000 0001
b) EAPOL-Logoff. 值爲0000 0010
|
Packet Body Length
|
2個字節
|
表示Packet Body的長度
|
Packet Body
|
0/多字節
|
如果Packet Type爲EAP-Packet,取相應值。對於其他幀類型,該值爲空。
|
EAPOL幀在二層傳送時,必須要有目標MAC地址,當客戶端和認證系統彼此之間不知道發送的目標時,其目標MAC地址使用由802.1x協議分配的組播地址01-80-c2-00-00-03。