Extensible Authentication Protocol
认证过程简述:
- 主机向服务器(多播或广播地址)发送EAPOL-Start
- 服务器向主机发送EAP-REQUEST-Identity要求验证身份的请求
- 主机向服务器发送EAP-RESPONSE-Identity回应
- 服务器向主机发送EAP-REQUEST-MD5_Challenge要求验证密码的MD5校验值
- 主机向服务器发送EAP-RESPONSE-MD5_Challenge回应
- 服务器向主机发送EAP-Success
- 保持连接的通信...
当然这只是一般过程,如果在任何时候服务器发来EAP-Failure数据包,都表示整个认证过程终止。
Supplicant主机 服务器
----------- -------------
|------------------------------>|
| 1. EAPOL-Start |
| |
|<------------------------------|
| 2. EAP-REQUEST-Identity |
| |
|------------------------------>|
| 3. EAP-RESPONSE-Identity |
| |
|<------------------------------|
| 4. EAP-REQUEST-MD5_Challenge |
| |
|------------------------------>|
| 5. EAP-RESPONSE-MD5_Challenge |
| |
|<------------------------------|
| 6. EAP-Success |
| |
在以太网中,EAP协议当然也是通过以太网帧的格式来传送,帧类型为0x888e,在基于pcap的抓包程序中,可使用"ether proto 0x888e"来抓取。
Ethernet-Header:
################################################
# 0 5 11 13 #
# +----------------+----------------+--------+ #
# |DST--MAC |SRC--MAC |0x888e | #
# +----------------+----------------+--------+ #
################################################
当用作802.1x应答帧时,常使用802.1x分配的多播地址01-80-c2-00-00-03作为目的地址。
从Wiki的简介得知,EAP协议不仅可用于本文关注的以太网环境中,还可在无线WLAN、令牌环网中应用,而这些链路帧是各不相同的,这就是为什么有EAPOL类型的数据帧,用以抽象EAP协议报文。
EAPOL-报文结构
############################################
# 0 14 15 #
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ #
# | Ethernet-Header |a|b| #
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ #
# 17 #
# +-+-+------------- #
# |c |Packet Body #
# +-+-+------------- #
############################################
a:EAPOL 协议版本
b:EAPOL 报文类型
c:EAPOL 帧长度
a类型说明:通常为常量0x01
b类型取值:
EAPOL-Packet : 0x00
EAPOL-Start: 0x01
EAPOL-Logoff: 0x02
各种EAP协议的信息交互,封装在EAPOL-Packet类型的EAPOL报文内。至于EAP报文的格式,基本就是如下所示。
EAP-报文结构
#########################################
# 0 15 #
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ #
# | | #
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ #
# 17 18 19 21 22 #
# +-+-+-+-+-+-+-+-------------- #
# | |d|e|f |g|EAP Body #
# +-+-+-+-+-+-+-+-------------- #
#########################################
d:EAP通信类型
e:EAP通信id
f:EAP数据长度
g:EAP协商类型
d类型取值:
EAP-Request: 0x01
EAP-Resopnse: 0x02
EAP-Success: 0x03
EAP-Failure: 0x04
e类型说明:
通常由服务器发来的报文指定,在连续的报文内使用这个id来协商或者计算MD5值的数据之一。
g类型取值:
Identity: 0x01
MD5_Challenge: 0x04
一个EAP Supplicant客户端程序主要的任务就是处理服务器发来的数据帧和组织回应服务器的数据帧。除了根据上述的“c:EAP通信类型”和“f:EAP协商类型”位来识别协商类型外,更需要根据这些报文内的其他数据来组织回应数据帧。
下面是需要程序构建的数据包的大概细节:
(需要注意EAPOL帧和EAP帧的两处长度位置,前者的长度是不算EAPOL头的4个字节的,而后者则包含自身头部的5个字节,所以这两个长度的值可能是一致的,但具体可能有扩展信息放在EAPOL帧尾部,则前者比后者大。)
1.EAPOL-Start、EAPOL-Logoff
通常是比较简单的数据包,只需填好相应的位,没有其他附加消息,EAPOL-Start、EAPOL-Logoff两种报文长度为0,通常建立起来两个报文的长度就只有18字节。
2.EAP-REQUEST-Identity
服务器发来的这个报文也比较简单,可能唯一有用的数据是“e:EAP通信id”位,需要给发送回去的报文中把相应位设置为该值,虽然这很可能是常数。
Identity格式
+-+-+-+-.....-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| EAP Header | Username
+-+-+-+-.....-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3.EAP-RESPONSE-Identity
只需要设置“d:EAP通信id”位,然后在EAP头后紧接用户名的ASCII码信息。有些品牌的协议中,则顺带在此数据包开始校验客户端的IP、版本号等信息。
4.EAP-REQUEST-MD5_Challenge
服务器请求MD5校验的报文中包含了重要的信息,首先也是“e:EAP通信id”位,后一个报文也需要设置该位;
在EAP报头后紧接一个一位的长度值L(常量0x10),表示紧跟其后的重要数据的长度,其后的16位值则需要用来计算下一个报文中的信息,我们称之为attach-key。
MD5_Challenge格式
+-+-+-+-.....-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| EAP Header |L|MD5-Key/Value
+-+-+-+-.....-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5.EAP-RESPONSE-MD5_Challenge
首先需要设置“d:EAP通信id”位,然后构建一个这样的字节数组[(e:EAP通信id)(用户密码的ASCII)(attach-key)],这个字节的长度当然是(1+用户密码长度+16),然后送入MD5计算函数中,获得16位的计算结果,再把这16位计算结果填入报文。报文格式跟请求的类似,在包头后紧接一位长度值,当然是0x10,然后是16位的计算结果。
一个客户端程序所做的事情通常就是这么多,而因为EAP协议的“Extensible”的特性,几乎我们见到的每个品牌的协议都有所扩展,而且各不相同,所以各个品牌之间的客户端甚至交换机等设备都可能完全不可兼容的,其协议很可能在上述的报文中都添加一个信息尾,用来校验各种信息。