NPS服务端未授权访问控制台越权漏洞修复

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

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6068.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注