解压后进入bin目录启动
bash startup.sh -m standalone
浏览器访问:
修改nacos.core.auth.enabled=true
漏洞利用
使用默认密钥生成token查看用户:
使用默认密钥生成的token创建用户:
如果不添加jwt则提示403:
漏洞分析
寻找密钥
Nacos是springboot写的项目,可以通过application.properties查看项目配置文件。
默认密钥:
SecretKey012345678901234567890123456789012345678901234567890123456789
官方说明也在application.properties这个文件中,如果没有手工配置,那默认就是:
SecretKey012345678901234567890123456789012345678901234567890123456789
设置远程调试
在JAVA_OPT中添加调试参数:
-agentlib:jdwp=transport=dt_socket,server=y,
suspend
=n,address=5005
在idea中添加调试设置:
鉴权filter配置
通过下断点在jwt认证的地方,然后通过调用栈查找Filter,把断点下到JwtTokenManager的validateToken方法上:
通过栈找到Filter为com.alibaba.nacos.core.auth.AuthFilter
通过com.alibaba.nacos.core.auth.AuthFilter查找springboot的配置类为com.alibaba.nacos.core.auth.AuthConfig:
鉴权过程
进入com.alibaba.nacos.core.auth.AuthFilter首先读取配置文件中的鉴权开关是否为false(这是再配置文件中设置的nacos.core.auth.enabled配置项),为false则直接进入下一个filter,也就不需要鉴权:
接下来会检查配置文件中是否设置了
nacos
.core
.auth
.server
.identity
.key
和
nacos
.core
.auth
.server
.identity
.value
如果配置了这两个参数,则去判断在header中nacos.core.auth.server.identity.key对应的值是否为nacos.core.auth.server.identity.value,如果是则直接去下一个filter,就造成了权限绕过:
接着判断请求中的方法是否在需要授权的map中,如果不在则不需要授权:
最终会走到如下方法:
com
.alibaba
.nacos
.auth
.AbstractProtocolAuthService
#validateIdentity
这个方法是对jwt进行验证的操作:
通过调试也可以将jwt通过普通的jwt认证方式进行认证
com
.alibaba
.nacos
.plugin
.auth
.impl
.NacosAuthManager
#resolveToken
(
com
.alibaba
.nacos
.plugin
.auth
.api
.IdentityContext
)
最终走到
com
.alibaba
.nacos
.plugin
.auth
.impl
.JwtTokenManager
#validateToken
这里直接使用jwtParse对jwt进行验证:
jwtParser设置密钥
接下来就需要找到这个jwtParser中的jwt密钥从何而来;
在
com
.alibaba
.nacos
.plugin
.auth
.impl
.JwtTokenManager
#processProperties
中通过
this
.jwtParser = Jwts.parserBuilder().setSigningKey(
this
.secretKey).build();
来设置密钥:
然后this.secretKey是从配置文件中读取nacos.core.auth.plugin.nacos.token.secret.key之后进行base64解码之后作为密钥:
0x02 Nacos2.2.0权限绕过
漏洞利用
如果没有或者不对应则返回403:
漏洞分析
根据前面的分析判断是否开启鉴权开关和是否开启userAgentAuthWhite,然后是对配置文件是否配置了
nacos
.core
.auth
.server
.identity
.key
和
nacos
.core
.auth
.server
.identity
.value
如果配置了则判断header里面的serverIdentity是否为配置文件中的security:
如果是则进入下一个filter,就不需要对jwt进行鉴权
0x03 Nacos默认配置未授权访问漏洞
漏洞利用
http:
/
/10.10.84.207:8848/nacos
/v1/auth
/users?pageNo=1&pageSize=9&search=accurate&accessToken=
漏洞分析
再配置文件中nacos.core.auth.enabled的值默认为false,也就是不需要进行身份验证:
在代码中就是com.alibaba.nacos.core.auth.AuthFilter#doFilter中的第一个判断,如果取值为false则直接进入下一个filter,就不需要身份验证:
this.authConfigs.isAuthEnabled()不论是在配置文件中还是在注释中都为flase,不需要进行身份验证:
0x04 Nacos1.x.x版本User-Agent权限绕过
漏洞复现
从GitHub下载1.3.2版本,并修改系统授权选项为true:
设置远程调试参数:
使用curl命令进行复现
:
curl
'http://10.10.84.207:8848/nacos/v1/auth/users?pageNo=1&pageSize=9&accessToken='
-H
'User-Agent: Nacos-Server'
漏洞分析
进入com.alibaba.nacos.core.auth.AuthFilter#doFilter的第一个if语句是判断当前是否开启鉴权:
首先通过系统配置读取nacos.core.auth.enabled设置的值,如果没有找到则通过配置文件读取该配置:
接下来读取header中的User-Agent值,如果User-Agent为Nacos-Server则直接进入下一个filter造成了权限绕过:
0x05 Nacos-client<1.4.2yaml反序列化
漏洞复现
客户端连接服务端,使用官方的示例:
然后在客户端就能够执行命令:
漏洞分析
在
com
.alibaba
.nacos
.client
.config
.impl
.CacheData
#safeNotifyListener
一直监听服务端的配置改变,当发生改变时会进入
com
.alibaba
.nacos
.client
.config
.impl
.ConfigChangeHandler
#parseChangeData
在
com
.alibaba
.nacos
.client
.config
.impl
.ConfigChangeHandler
#parseChangeData
会根据配置文件类型进入不同的处理方法里面,这里进入yaml的处理方法,其中newContent和oldContent分别为配置内容:
进到
com
.alibaba
.nacos
.client
.config
.impl
.YmlChangeParser
#doParse
不论是新改的配置,还是原来的配置都会经过(new Yaml()).load()方法,最终造成命令执行漏洞:
END
- 我的微信
- 微信扫一扫
-
- 我的微信公众号
- 微信扫一扫
-
评论