nps简介及安装使用
nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。支持tcp、udp、socks5、http等几乎所有流量转发,可用来访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析、内网socks5代理等等……,并带有功能强大的web管理端。
官方版本三年前已经停止维护,还有个新的维护分支,是在 0.26.10 版本的基础上继续开发的。新用户建议直接使用最新版本。
nps安装使用:
nps漏洞描述
nps存在一个身份验证的缺陷,存在越权漏洞。无需登录,通过特殊构造的url可以直接绕过登录未授权访问控制台,使用控制台大多数功能。具体操作是伪造两个参数auth_key、timestamp完成越权操作。目前该漏洞已经实现武器化,可一键利用,可能联合其他漏洞造成大范围影响。相关链接:
nps漏洞修复
三个修复方案:
1.更新至兼容官方0.26.10的漏洞修复版:0.26.17(新维护分支0.26.14版本已修复API鉴权漏洞修复)
0.26.10代码:web/controllers/base.go
// web api verify // param 1 is md5(authKey+Current timestamp) // param 2 is timestamp (It's limited to 20 seconds.) md5Key := s.getEscapeString("auth_key") timestamp := s.GetIntNoErr("timestamp") configKey := beego.AppConfig.String("auth_key") timeNowUnix := time.Now().Unix() if !(md5Key != "" && (math.Abs(float64(timeNowUnix-int64(timestamp))) <= 20) && (crypt.Md5(configKey+strconv.Itoa(timestamp)) == md5Key)) { if s.GetSession("auth") != true { s.Redirect(beego.AppConfig.String("web_base_url")+"/login/index", 302) } } else { s.SetSession("isAdmin", true) s.Data["isAdmin"] = true }
0.26.14修复代码:https://github.com/yisier/nps/commit/ab81f5b68ea896c1cde76b6ae04dee11be9d477a
md5Key := s.getEscapeString("auth_key") timestamp := s.GetIntNoErr("timestamp") configKey := beego.AppConfig.String("auth_key") if configKey == "" { configKey = crypt.GetRandomString(64) } timeNowUnix := time.Now().Unix() if !(md5Key != "" && (math.Abs(float64(timeNowUnix-int64(timestamp))) <= 20) && (crypt.Md5(configKey+strconv.Itoa(timestamp)) == md5Key)) { if s.GetSession("auth") != true { s.Redirect(beego.AppConfig.String("web_base_url")+"/login/index", 302) } } else { s.SetSession("isAdmin", true) s.Data["isAdmin"] = true } ...... //Generating Random Verification Key func GetRandomString(l int) string { str := "0123456789abcdefghijklmnopqrstuvwxyz" bytes := []byte(str) result := []byte{} r := rand.New(rand.NewSource(time.Now().UnixNano())) for i := 0; i < l; i++ { result = append(result, bytes[r.Intn(len(bytes))]) } return string(result) }
2.修改/etc/nps/conf/nps.conf配置文件,注释auth_crypt_key,将auth_key取消注释并修改为随机性强密码,网上已有修复版本。
3.同时保留auth_crypt_key和auth_key,且修改auth_crypt_key为随机的16位数字(必须是16位数字),修改auth_key为任意强密码,待测试影响,认证key存在爆破或泄漏风险,不推荐。