Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请教如何获取 challenge 和 response #151

Open
G-Akiraka opened this issue Jul 15, 2023 · 8 comments
Open

请教如何获取 challenge 和 response #151

G-Akiraka opened this issue Jul 15, 2023 · 8 comments

Comments

@G-Akiraka
Copy link

challenge := microsoft.MSCHAPChallenge_Get(r.Packet)
response := microsoft.MSCHAP2Response_Get(r.Packet)

通过h3c、华硕、openwrt、unifi 无法获取到内容,都为空,想请教知道是为什么,我通过mschapv2去认证
我参考了 https://github.com/layeh/radius/blob/master/vendors/microsoft/mschapv2-server-example.go
直接验证无法验证通过,通过freeradius的radtest -x -t mschap aka 123 127.0.0.1 0 test 可以通过,但是移动设备认证无法验证通过

我有尝试这样操作,由于无法获取到 challenge 与 response 导致无法返回 recvKey与sendKey,想知道是不是少了什么东西导致无法获取
microsoft.MSMPPERecvKey_Add(responsePacket, recvKey)
microsoft.MSMPPESendKey_Add(responsePacket, sendKey)

package main

import (
	"fmt"
	"layeh.com/radius"
	"layeh.com/radius/rfc2865"
	"layeh.com/radius/rfc2868"
	"layeh.com/radius/rfc2869"
	"layeh.com/radius/vendors/microsoft"
	"log"
)

func runRadiusServer() {
	handler := func(w radius.ResponseWriter, r *radius.Request) {
		username := rfc2865.UserName_GetString(r.Packet)
		challenge := microsoft.MSCHAPChallenge_Get(r.Packet)
		response := microsoft.MSCHAP2Response_Get(r.Packet)
		fmt.Println("challenge", challenge)
		fmt.Println("response", response)

		log.Printf("[radius] Access denied for %s", username)
		responsePacket := r.Response(radius.CodeAccessAccept)
		success := make([]byte, 43)
		rfc2869.AcctInterimInterval_Add(responsePacket, rfc2869.AcctInterimInterval(3600))
		rfc2868.TunnelMediumType_Add(responsePacket, 0, rfc2868.TunnelMediumType_Value_IPv4)
		microsoft.MSCHAP2Success_Add(responsePacket, []byte(success))
		////microsoft.MSMPPERecvKey_Add(responsePacket, recvKey)
		////microsoft.MSMPPESendKey_Add(responsePacket, sendKey)
		microsoft.MSMPPEEncryptionPolicy_Add(responsePacket, microsoft.MSMPPEEncryptionPolicy_Value_EncryptionAllowed)
		microsoft.MSMPPEEncryptionTypes_Add(responsePacket, microsoft.MSMPPEEncryptionTypes_Value_RC440or128BitAllowed)
		w.Write(responsePacket)
	}

	server := radius.PacketServer{
		Handler:      radius.HandlerFunc(handler),
		SecretSource: radius.StaticSecretSource([]byte("test")),
	}

	log.Printf("Starting Radius server on :1812")
	if err := server.ListenAndServe(); err != nil {
		log.Fatal(err)
	}
}

func main() {
	runRadiusServer()
}
@jamiesun
Copy link
Contributor

看下原始RADIUS 报文,是否缺乏必要属性, 这个mschapv2 是需要客户端启用才会发送关键属性的

@G-Akiraka
Copy link
Author

我有点不明白,我使用freeradius就可以正常连接上网,但是指向到程序代码则不行,从客户端角度出发客户端是一致的,但是结果却不相同,freeradius 似乎都有一个证书,是否和这个相关

@jamiesun
Copy link
Contributor

jamiesun commented Aug 1, 2023

一般radius认证是不需要证书的,只有eap模式可能会用到,mschapv2在普通认证模式和eap模式都会有,确认你是不是走的eap模式,toughradius目前本身还没有实现eap支持,但是可以将freeradius作为协议解析处理前端处理eap认证,toughradius作为数据管理后端,这个功能已经支持的很好了

@jamiesun
Copy link
Contributor

jamiesun commented Aug 1, 2023

移动设备认证走的应该就是 eap 认证

@jamiesun
Copy link
Contributor

jamiesun commented Aug 1, 2023

走eap 认证的时候, 相关的协议属性封装在eap-message 里面

@G-Akiraka
Copy link
Author

好的谢谢,移动设备连接eap方法peap 阶段2是 mschapv2,我理解客户端过来应该不需要再次封装消息给 服务端,toughradius部分功能不满足需求,所以想自己改造下支持oauth2,等自己系统用户集成。现在遇到问题拿不到challenge和response,所以想是不是忽略了什么重要的东西。
wifi认证设置802.x 指向go 服务器并设置ip 秘钥,端口,实在想不到还有什么不对。

@jamiesun
Copy link
Contributor

可以考虑使用前端freeradius 来解析协议, 后端用户管理使用 toughradius, 这样可以工作的很好,也是我暂时缺乏去实现的动力的原因

@G-Akiraka
Copy link
Author

已经放弃了,改用深信服认证服务器 radius 指向go代码就可以获取到challenge,response,如果使用其他wifi控制器则不正常,有尝试结合freeradius,使用了reset方式,一堆难点也没什么文档参考。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants