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存在爆破或泄漏风险,不推荐。