seignior 发表于 2009-10-24 10:55:18

折腾raidus中,请教rfc2865,2866

朋友需要,摆弄winraidus,然后才发现这玩意居然不支持pptp、l2tp......一气之下自己动手写raidus,努力翻看rfc2865,2866,好像也挺简单,各主要段落很快就被拆分(方便理解),唯一的就是在理解Authenticator的时候卡住了,楞是没在字面上理解request authenticator及response authenticator的算法,反正我按照公式算出来的结果和预期的总是对不上-_-",我猜我应该是理解错公式了

另问,2865、2866两者之间究竟是什么关系?什么设备支持2865什么设备支持2866?raidus怎知道送过来的是2865还是2866请求(貌似两者就authenticator的算法不一样)?

心想事成 发表于 2009-10-24 11:00:11

你参考下freeradius的源码不就OK了。
主要看里面的mschap那个模块的代码,然后copy一些过来,呵呵

心想事成 发表于 2009-10-24 11:14:42

在电脑上找到这个
RADIUS协议的包格式(2007-07-19 00:12:08)   分类:技术文档
1、 RADIUS协议的包格式
RADIUS数据包是被封装在UDP的数据域中的。
RADIUS的包数据格式如下所示,各域(Fields)的先后次序是从左到右。
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Code      |Identifier   |            Length             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                         Authenticator                         |
   |                                                               |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Attributes ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-
   Code
Code域有一个字节长度,用来标示RADIUS通信包的类型。当收到一个非法的包类型,将被丢弃。
Code可代表如下类型(十进制):
1       Access-Request
2       Access-Accept
3       Access-Reject
4       Accounting-Request
5       Accounting-Response
11       Access-Challenge
12       Status-Server (experimental)
13       Status-Client (experimental)
255       Reserved
Identifier
Identifier有一个字节长度,用来匹配RADIUS的请求和应答。
Length
Length有2个字节长度,它标明整个RADIUS数据包的长度,包括:Code, Identifier, Length, Authenticator 和Attributes。Length的最小值为20,最大值为4096。RADIUS的应用程序将丢弃小于20的包;对大于4096的包将把超出部分丢弃,只处理有效部分(超出部分被认为是填充域)。
Authenticator
Authenticator域有16个字节。这个域用来完成安全性检查,所以是非常重要的。Authenticator的作用有两个,一个是验证从RADIUS服务器返回的应答;另一个是为对口令部分加密算法做参数。
有两种Authenticator:
1)          Request Authenticator
出现在通信包“Access-Request”中,是长度为16字节的随机二进制串。格式为:
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Code      |Identifier   |            Length             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                     Request Authenticator                     |
   |                                                               |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Attributes ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-
RADIUS协议建议Request Authenticator应该是不可预测和在整个生命期内是唯一的。这是为了防止攻击者伪装成通信的一方的措施。RADIUS请求方(NAS)用Request Authenticatior加密用户密码;相反,RADIUS服务器则用它来对用户密码,并生成应答包的Authenticator(Response Authenticatior)。如果Request Authenticator不是唯一的话,网络窃听者将可以伪造RADIUS服务器的应答,因为此时Response Authenticator的加密算法有相同的参数(详见下文)。
用户密码部分的加密算法是:
enpassword = password XOR MD5(secret + Request Authenticator)
2)          Response Authenticator
出现在通信包“Access-Accept”、“Access-Reject”、“Access-Challenge”和“Accounting-Response”中。格式为:
    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Code      |Identifier   |            Length             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                     Response Authenticator                  |
   |                                                               |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Attributes ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-
Response Authenticator产生的算法:
Response Authenticator =
MD5(Code + Id + Length + Req-Authenticator + Attributes + Secret)

seignior 发表于 2009-10-24 11:20:28

我知道,我也看过了,单就是在这里迷糊了...
你这是2865的,算法是 enpassword = password XOR MD5(secret + Request Authenticator)
和 Response Authenticator = MD5(Code + Id + Length + Req-Authenticator + Attributes + Secret)
但在2866里则是 Code+Identifier+Length+16个值为0的字节+请求属性+共享密钥 和 MD5( Code+Identifier+Length+对应的计费请求包的请求认证字+回应属性(如果有的话)+共享密钥 )

2865里有示范性的应答报文,但我无论怎理解 password XOR MD5(secret + Request Authenticator) ,得出的结果依然和2865里的示范结果不一致-_-"

seignior 发表于 2009-10-24 19:48:18

搞半天终于搞定 password XOR MD5(secret + Request Authenticator) ,也算重要突破了,的确是理解错误.........
有谁有更多资料或者曾经折腾过的,来点经验之谈?

zmtvia 发表于 2009-10-24 20:18:28

又见高手 鸡动ing

WGHBOY 发表于 2009-10-24 20:34:31

:lol

木木 发表于 2009-10-24 21:25:45

呵呵,不错,自己动手,本来也想研究一下,不过现在暂时不研究了。

seignior 发表于 2009-10-24 21:34:48

楼上的,api那那里俺也初步搞明白了....嘿嘿...半桶水就是郁闷,在这里被称呼高手,但在编程论坛俺却被损了半天-_-"

nmwhfx 发表于 2009-10-24 23:00:34

支持!慢慢研究吧。呵呵。
页: [1]
查看完整版本: 折腾raidus中,请教rfc2865,2866