freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

nginxWebUI漏洞
10086zzz 2023-11-27 17:38:25 158082

一、漏洞概述

1.1 组件描述

nginxWebUI是一款图形化管理nginx配置的工具,能通过网页快速配置nginx的各种功能,包括HTTP和TCP协议转发、反向代理、负载均衡、静态HTML服务器以及SSL证书的自动申请、续签和配置,配置完成后可以一键生成nginx.conf文件,并控制nginx使用此文件进行启动和重载。

1.2 使用方法

目标信息,源码名称:nginxWebUI,下载地址:https://www.nginxwebui.cn/。官方使用教程https://www.nginxwebui.cn/product.html

Windows系统: java -jar -Dfile.encoding=UTF-8 D:/home/nginxWebUI/nginxWebUI.jar --server.port=8080 --project.home=D:/home/nginxWebUI/


此处复现版本我们下载nginxWebUI-3.4.6.jar版本。因为下载下来的是jar包,所以我们通过反编译来拿到源码。

反编译源码我使用jd-gui,可以直接去GitHub下载

1701077257_65646109bd47b277280c0.jpg!small?1701077257576

选择 "Save All sources" 导出该项目,导出成功后 使用IDEA去打开该项目。使用IDEA的debug动态调试+web请求来复现全部过程

1701077272_656461187dca68f0d8501.jpg!small?1701077272417

我们在这里开始远程JVM调试,一般我们java web远程debug的话  只要设置好三要素

  • 1.主机
  • 2.端口
  • 3.JDK版本

如图  服务端的地址为localhost  端口为5055 复制给出的命令行实参

在dos窗口中,使用Java命令行参数启动服务

添加到启动jar包的cmd命令:
java  -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar -Dfile.encoding=UTF-8 D:/home/nginxWebUI/nginxWebUI.jar --server.port=8082 --project.home=D:/home/nginxWebUI/ 

而后,启动IDEA的debug服务

1701077386_6564618a39bccf2fe6079.jpg!small?1701077385890

二、漏洞复现

2.1 权限绕过

config下目录AppFillter 类发现doFilter方法,通过全局过滤器发现这里校验不严格,可以大小写绕过。后续2.2的无需登录状态下远程命令执行漏洞产生,也是因为2.1的原因造成的

2.1 命令执行

在项目中全局搜索exec相关函数

可以看到在ConfController类中调用了RuntimeUtil.exec。进入ConfController类,跟踪查找有哪些上层类调用了ConfController的runCmd方法

1701077466_656461dac1f5a74b8a8d7.jpg!small?1701077466426

可以看到是NginxApiController调用了runCmd方法。只要构造好payload,此处即有命令执行漏洞

回想到2.1的权限绕过,那么路径大小写,即可以构造payload。如下

url+/AdminPage/conf/runCmd?cmd=calc

url+/Api/nginx/runNginxCmd?cmd=calc

2.2 命令执行-RCE(jar包)

还是通过全局搜索exec相关。发现了很多处地方都有调用。代码审计就是要一个个找、跟踪执行方法呗。此处在UpdateUtil类中又发现一处

1701077520_6564621014f0306c3013e.jpg!small?1701077519712

跟踪run方法,发现是MainController类的autoUpdate方法调用了。

1701077531_6564621bb49b7630c2e9f.jpg!small?1701077531242

该方法里面的逻辑,粗略一看感觉没有问题,可是问题点就出在第96行。我们传入url,服务器把我们传入的url下载,并且重命名为jar.getParent() + "/nginxWebUI.jar.update"。也就是path。我们继续根据run方法

1701077545_65646229a3ee1f4d16238.jpg!small?1701077545701

在run方法里面,先是把.update结尾给删除了,然后重命名了一下文件名。后续就直接执行了服务器下载的jar包。

所以我们只需要搭建一个服务器,在服务器上创建一个恶意的jar包,让它去下载即可。复现过程如下图

1701077562_6564623a83c1582ad0f33.jpg!small?1701077562153

1701077593_6564625910db2049097d4.jpg!small?17010775927481701077611_6564626b26513687628ba.jpg!small?17010776107351701077634_6564628275ca95f15906a.jpg!small?17010776340531701077647_6564628fae596546512b1.jpg!small?17010776472021701077669_656462a5c29985e900390.jpg!small?1701077669728

除了以上的命令执行外,还有其他几处,多挖挖,肯定有

2.3 任意文件读取

对传入的文件进行判断,是否为空,是否为文件,是否存在。以上三者都满足的话就readString。然后赋值给confExt,而后用for循环对confExt进行换行读取。最后通过return返回。

该文件读取漏洞也可以配合权限绕过进行直接文件读取,如下

2.4 SSRF

根据关键http请求函数,定位到RemoteControll类,如下

1701141450_65655bca61c8e00f4db66.jpg!small?1701141451475

服务器对传入的url进行了请求,并且以Stream流形式返回了数据

复现过程如下

1701141475_65655be3b1584247614fd.jpg!small?1701141476341

1701141513_65655c094c9e0a9aa91ab.jpg!small?1701141513734

1701141525_65655c15b12443a0fbdf9.jpg!small?1701141526321

1701141542_65655c26e1e0f2ed9671c.jpg!small?1701141543657

# 渗透测试 # 网络安全 # web安全 # 代码审计 # 代码安全
本文为 10086zzz 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
10086zzz LV.2
这家伙太懒了,还未填写个人描述!
  • 4 文章数
  • 2 关注者
某Java电商系统代码审计
2025-03-10
shiro 550反序列化分析
2023-09-11
log4j漏洞复现及详细分析
2023-05-31
文章目录