nexus 远程命令执行 (CVE-2019-5475)
描述: Sonatype Nexus Repository Manager(NXRM)是美国Sonatype公司的一款Maven仓库管理器。 该漏洞默认存在部署权限账号,成功登录后可使用“createrepo”或“mergerepo”自定义配置,可触发远程命令执行漏洞。 用户名密码:admin:admin123
影响版本
Nexus Repository Manager OSS <= 2.14.13
Nexus Repository Manager Pro <= 2.14.13
限制:admin权限才可触发漏洞
右上角登录管理员
然后找到漏洞位置:Capabilities - Yum:Configuration - Settings
点击 Save 抓包,更改mergerepoPath后的value值
C:\\Windows\\System32\\cmd.exe /k dir&
此处使用 /k 是因为这样命令执行完会保留进程不退出,而 /c 后执行完会退出
这样好像没有回显
分析一下,下图中,红圈的两个字段都是可以执行任意命令的地方,点击save会把这两个字段再加上上面那个字段都提交,我第一次直接save抓包替换payload的时候没有执行,报的500错误,然后修改了这俩字段的默认值(随便改一个,点save保存),修改后可执行成功
哦 我用的服务器是搭在linux上的,需要linux命令
在前端显示是无法执行实际后端是已经处理并执行了命令)**
换成bash -c "ls";&
试了好几遍还是不行
看看别人的源码分析
漏洞点是出现在 Yum Repository 插件中,当配置 Yum 的createrepo
或者mergerepo
时
代码层面会跳到YumCapability
的activationCondition
方法中。
在上面Path of "createrepo"
中设置的值会通过getConfig().getCreaterepoPath()
获取到,获取到该值之后,调用this.validate()
方法
传进来的path
是用户可控的,之后将path
拼接--version
之后传递给commandLineExecutor.exec()
方法,看起来像是执行命令的方法,而事实也是如此。跟进CommandLineExecutor
类的exec
方法
在执行命令前先对命令解析,CommandLine.parse()
,会以空格作为分隔,获取可执行文件及参数。
最终是调用了Runtime.getRuntime().exec()
执行了命令。
例如,用户传入的 command 是cmd.exe /c whoami
,最后到getRuntime().exec()
方法就是Runtime.getRuntime().exec({"cmd.exe","/c","whoami"})
。
所以漏洞的原理也很简单,就是在createrepo
或者mergerepo
路径设置的时候,该路径可以由用户指定,中途拼接了--version
字符串,最终到了getRuntime.exec()
执行了命令。
妈呀测试了好几次还是不行,留着以后二刷三刷测吧
下面是大佬的漏洞代码加几次补丁绕过原理分析