Translated ['src/pentesting-ci-cd/gitblit-security/gitblit-embedded-ssh-

This commit is contained in:
Translator
2025-08-31 08:22:37 +00:00
parent 7024d7fcb1
commit cad838919a
3 changed files with 178 additions and 47 deletions

View File

@@ -0,0 +1,21 @@
# Gitblit 安全
{{#include ../../banners/hacktricks-training.md}}
## 什么是 Gitblit
Gitblit 是用 Java 编写的自托管 Git 服务器。它可以作为独立的 JAR 运行或部署在 servlet 容器中,并内置了一个用于 Git over SSH 的 SSH 服务Apache MINA SSHD
## 主题
- Gitblit Embedded SSH Auth Bypass (CVE-2024-28080)
{{#ref}}
gitblit-embedded-ssh-auth-bypass-cve-2024-28080.md
{{#endref}}
## 参考资料
- [Gitblit project](https://gitblit.com/)
{{#include ../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,107 @@
# Gitblit Embedded SSH Auth Bypass (CVE-2024-28080)
{{#include ../../banners/hacktricks-training.md}}
## 摘要
CVE-2024-28080 是 Gitblit 嵌入式 SSH 服务中的一个认证绕过漏洞,原因是在与 Apache MINA SSHD 集成时对会话状态处理不当。如果用户账户至少注册了一个 SSH 公钥,攻击者只要知道用户名和该用户的任意公钥,就可以在无需私钥和密码的情况下进行认证。
- 受影响Gitblit < 1.10.0(在 1.9.3 上观察到)
- 已修复1.10.0
- 利用条件:
- 实例上启用了 Git over SSH
- 受害账户在 Gitblit 中至少注册了一个 SSH 公钥
- 攻击者知道受害者的用户名和其中一个公钥(通常可发现,例如 https://github.com/<username>.keys
## 根本原因SSH 方法之间的状态 leaks
在 RFC 4252 中publickey authentication 分为两个阶段:服务器首先检查提供的公钥是否对该用户名可接受,只有在 challenge/response 与签名之后才真正认证用户。在 MINA SSHD 中PublickeyAuthenticator 会被调用两次:在 key acceptance尚无签名以及在客户端返回签名之后。
Gitblit 的 PublickeyAuthenticator 在第一次(前签名)调用时修改了会话上下文:将已识别的 UserModel 绑定到会话并返回 true"key acceptable"。当认证随后回退到密码时PasswordAuthenticator 信任该已被修改的会话状态并直接短路,返回 true 而不验证密码。因此,在同一用户之前发生了公钥 "acceptance" 之后,任意密码(包括空密码)都会被接受。
高层次的错误流程:
1) 客户端提供用户名 + 公钥(尚无签名)
2) 服务器识别该密钥属于该用户并过早将用户附加到会话,返回 true"acceptable"
3) 客户端无法签名(没有私钥),因此认证回退到密码
4) 密码认证看到会话中已存在用户并无条件返回成功
## 逐步利用
- 收集受害者的用户名和其中一个公钥:
- GitHub 在 https://github.com/<username>.keys 暴露公钥
- 公开服务器通常会暴露 authorized_keys
- 配置 OpenSSH 仅提供公钥部分以使签名生成失败,从而强制回退到密码,同时仍触发服务器上的公钥接受路径。
Example SSH client config (no private key available):
```sshconfig
# ~/.ssh/config
Host gitblit-target
HostName <host-or-ip>
User <victim-username>
PubkeyAuthentication yes
PreferredAuthentications publickey,password
IdentitiesOnly yes
IdentityFile ~/.ssh/victim.pub # public half only (no private key present)
```
连接并在密码提示符处按回车(或输入任意字符串):
```bash
ssh gitblit-target
# or Git over SSH
GIT_SSH_COMMAND="ssh -F ~/.ssh/config" git ls-remote ssh://<victim-username>@<host>/<repo.git>
```
Authentication succeeds because the earlier publickey phase mutated the session to an authenticated user, and password auth incorrectly trusts that state.
Note: 如果在你的 SSH 配置中启用了 ControlMaster multiplexing后续的 Git 命令可能会重用已认证的连接,从而增加影响范围。
## Impact
- Full impersonation of any Gitblit user with at least one registered SSH public key
- Read/write access to repositories per victims permissions (source exfiltration, unauthorized pushes, supplychain risks)
- Potential administrative impact if targeting an admin user
- Pure network exploit; no brute force or private key required
## Detection ideas
- Review SSH logs for sequences where a publickey attempt is followed by a successful password authentication with an empty or very short password
- Look for flows: publickey method offering unsupported/mismatched key material followed by immediate password success for the same username
## Mitigations
- Upgrade to Gitblit v1.10.0+
- Until upgraded:
- Disable Git over SSH on Gitblit, or
- Restrict network access to the SSH service, and
- Monitor for suspicious patterns described above
- Rotate affected user credentials if compromise is suspected
## General: abusing SSH auth method stateleakage (MINA/OpenSSHbased services)
Pattern: 如果服务器的 publickey authenticator 在 presignature "key acceptable" 阶段修改了用户/会话状态,而其他 authenticators例如 password信任该状态那么可以通过以下方式绕过认证
- Presenting a legitimate public key for the target user (no private key)
- Forcing the client to fail signing so the server falls back to password
- Supplying any password while the password authenticator shortcircuits on leaked state
Practical tips:
- Public key harvesting at scale: pull public keys from common sources such as https://github.com/<username>.keys, organizational directories, team pages, leaked authorized_keys
- Forcing signature failure (clientside): point IdentityFile to only the .pub, set IdentitiesOnly yes, keep PreferredAuthentications to include publickey then password
- MINA SSHD integration pitfalls:
- PublickeyAuthenticator.authenticate(...) must not attach user/session state until the postsignature verification path confirms the signature
- PasswordAuthenticator.authenticate(...) must not infer success from any state mutated during a prior, incomplete authentication method
Related protocol/design notes and literature:
- SSH userauth protocol: RFC 4252 (publickey method is a twostage process)
- Historical discussions on early acceptance oracles and auth races, e.g., CVE201620012 disputes around OpenSSH behavior
## References
- [Gitblit CVE-2024-28080: SSH publickey fallback to password authentication bypass (Silent Signal blog)](https://blog.silentsignal.eu/2025/06/14/gitblit-cve-CVE-2024-28080/)
- [Gitblit v1.10.0 release notes](https://github.com/gitblit-org/gitblit/releases/tag/v1.10.0)
- [Apache MINA SSHD project](https://mina.apache.org/sshd-project/)
- [PublickeyAuthenticator API](https://svn.apache.org/repos/infra/websites/production/mina/content/sshd-project/apidocs/org/apache/sshd/server/auth/pubkey/PublickeyAuthenticator.html)
- [RFC 4252: The Secure Shell (SSH) Authentication Protocol](https://datatracker.ietf.org/doc/html/rfc4252)
{{#include ../../banners/hacktricks-training.md}}

View File

@@ -1,4 +1,4 @@
# Pentesting CI/CD Methodology
# Pentesting CI/CD 方法论
{{#include ../banners/hacktricks-training.md}}
@@ -6,99 +6,102 @@
## VCS
VCS 代表 **版本控制系统**,该系统允许开发人员 **管理他们的源代码**。最常见的是 **git**通常会在以下 **平台** 中找到公司使用它:
VCS 代表 **Version Control System**,该系统允许开发**管理他们的源代码**。最常见的是 **git**通常会在以下 **platforms** 之一看到公司使用它:
- Github
- Gitlab
- Bitbucket
- Gitea
- 云提供商(他们提供自己的 VCS 平台)
- Gitblit
- Cloud providers (they offer their own VCS platforms)
## CI/CD Pipelines
CI/CD 管道使开发人员能够 **自动执行代码**,用于构建、测试和部署应用程序等各种目的。这些自动化工作流是通过 **特定操作** 触发,例如代码推送、拉取请求或计划任务。它们有助于简化从开发到生产的程。
CI/CD pipelines 使开发者能够**自动执行代码**用于各种目的,包括构建、测试和部署应用。这些自动化工作流会由特定操作触发,例如 code pushes、pull requests 或定时任务。它们有助于简化从开发到生产的程。
然而,这些系统需要在某处 **执行**,通常需要 **特权凭据来部署代码或访问敏感信息**
但是,这些系统需要在某处**执行**,通常需要**特权的凭证来部署代码或访问敏感信息**。
## VCS Pentesting Methodology
> [!NOTE]
> 即使某些 VCS 平台允许创建管道,在本节中我们将仅分析对源码控制的潜在攻击。
> 即使某些 VCS 平台允许为本节创建 pipelines我们这里将只分析对源码控制的潜在攻击。
包含项目源代码的平台包含敏感信息,用户需要非常小心在此平台授予的权限。这些是 VCS 平台上攻击者可能滥用的一些常见问题:
包含项目源代码的平台承载敏感信息,人员需要非常注意在该平台授予的权限。以下是攻击者可能滥用的一些常见问题:
- **泄漏**如果的代码在提交中包含泄漏,并且攻击者可以访问该仓库(因为它是公开的或因为他有访问权限),他可能会发现这些泄漏
- **访问**如果攻击者可以 **访问 VCS 平台内的帐户**,他可能获得 **更多的可见性和权限**
- **注册**:某些平台允许外部用户创建户。
- **SSO**某些平台不允许用户注册,但允许任何人使用有效 SSO 访问(例如攻击者可以使用他的 github 户进入)。
- **凭据**:用户名+密码、个人令牌、ssh 密钥、Oauth 令牌、cookies……用户可窃取多种类型的令牌以某种方式访问仓库
- **Webhooks**VCS 平台允许生成 webhooks。如果它们没有用不可见的秘密 **保护**,则 **攻击者可能滥用它们**
- 如果没有秘密,攻击者可能会滥用第三方平台的 webhook
- 如果秘密在 URL 中,情况也是如此,攻击者也会拥有秘密
- **代码妥协**如果恶意行为者对仓库有某种 **写入** 访问权限,他可能会尝试 **注入恶意代码**。为成功,他可能需要 **绕过分支保护**。这些操作可以以不同的目标进行
- 妥协主分支以 **妥协生产**
- 妥协主分支(或其他分支)以 **妥协开发者机器**因为他们通常在自己的机器上执行测试、terraform 或其他操作)。
- **妥协管道**(查看下一节)
- **Leaks**: 如果的代码在提交中包含 leaks 且攻击者能访问 repo因为它是 public 或因为他有访问权限),他可能会发现这些 leaks
- **Access**: 如果攻击者**访问 VCS 平台内的一个账号**,他可能获得**更多的可见性和权限**。
- **Register**: 一些平台允许外部用户直接创建户。
- **SSO**: 某些平台不允许用户注册,但允许任何拥有有效 SSO 的人登录(例如攻击者可以用他的 github 户进入)。
- **Credentials**: Username+Pwd, personal tokens, ssh keys, Oauth tokens, cookies... 用户可窃取多种令牌以某种方式访问 repo
- **Webhooks**: VCS 平台允许生成 webhooks。如果它们**没有用不可见的 secrets 进行保护****攻击者可能滥用它们**。
- If no secret is in place, the attacker could abuse the webhook of the third party platform
- If the secret is in the URL, the same happens and the attacker also have the secret
- **Code compromise:** 如果恶意行为者对 repo 有某种**写入**权限,他可以尝试**注入恶意代码**。为成功,他可能需要**绕过分支保护**。这些操作可能有多种目的
- 危害主分支以**危害 production**。
- 危害主分支(或其他分支)以**危害开发者机器**(因为他们通常在自己的机器上执行测试、terraform 或 repo 内的其他内容)。
- **Compromise the pipeline** (check next section)
## Pipelines Pentesting Methodology
定义管道的最常见方法是使用 **托管在仓库中的 CI 配置文件**。该文件描述执行作业顺序、影响流程的条件构建环境设置。\
这些文件通常有一致的名称和格式,例如 — JenkinsfileJenkins、.gitlab-ci.ymlGitLab、.circleci/config.ymlCircleCI)和位于 .github/workflows 下的 GitHub Actions YAML 文件。触发时,管道作业 **从选定的源中提取代码**(例如提交/分支),并 **根据 CI 配置文件中指定的命令** 运行该代码
定义 pipeline 最常见的方式是使用**托管在仓库中的 CI 配置文件**来描述执行作业顺序、影响流程的条件以及构建环境设置。\
这些文件通常有一致的名称和格式,例如 — Jenkinsfile (Jenkins)、.gitlab-ci.yml (GitLab)、.circleci/config.yml (CircleCI),以及位于 .github/workflows 下的 GitHub Actions YAML 文件。触发时,pipeline job 会**从选定的源取代码**(例如 commit / branch并**对该代码运行 CI 配置文件中指定的命令**
因此,攻击者的最终目标是以某种方式 **妥协这些配置文件****它们执行的命令**
因此,攻击者的最终目标是以某种方式**妥协这些配置文件**或**它们执行的命令**。
### PPE - Poisoned Pipeline Execution
毒化管道执行(PPE路径利用 SCM 仓库中的权限来操纵 CI 管道并执行有害命令。具有必要权限的用户可以修改 CI 配置文件或管道作业使用的其他文件,以包含恶意命令。这会“毒化” CI 管道,导致这些恶意命令的执行
Poisoned Pipeline Execution (PPE) 路径利用 SCM 仓库中的权限来操纵 CI pipeline 并执行有害命令。具有必要权限的用户可以修改将被 pipeline job 执行的 CI 配置文件或 pipeline 使用的其他文件包含恶意命令。这会“poison” CI pipeline,导致执行这些恶意命令。
为了使恶意行为者成功执行 PPE 攻击,需要能够:
为了成功执行 PPE 攻击,恶意行为者需要能够:
- 拥有 **对 VCS 平台的写入访问权限**,因为通常在执行推送或拉取请求时会触发管道。(查看 VCS 渗透测试方法以获取获取访问权限的摘要)。
- 注意有时 **外部 PR 计入“写入访问”**
- 即使拥有写权限,他需要确保他可以 **修改 CI 配置文件或其他配置所依赖的文件**
- 为此,他可能需要能够 **绕过分支保护**
- 拥有 **write access to the VCS platform**,因为通常 pipeline 在 push 或 pull request 时被触发。(有关获取访问的方式,请查看 VCS pentesting methodology 的总结)。
- 注意有时一个 **external PR** 也算作“write access”
- 即使拥有写权限,他需要确保**修改 CI config 文件或配置所依赖的其他文件**。
- 为此,他可能需要能够**绕过分支保护**。
有 3 种 PPE 风格
PPE 有 3 种变体
- **D-PPE****直接 PPE** 攻击发生在行为者 **修改将执行的 CI 配置** 文件时。
- **I-DDE****间接 PPE** 攻击发生在行为者 **修改** CI 配置文件所 **依赖的** **文件**如 make 文件或 terraform 配置)时。
- **公共 PPE 3PE**在某些情况下,管道可以 **没有写入访问权限的用户触发**(而且可能甚至不是组织的一部分),因为他们可以发送 PR。
- **3PE 命令注入**通常CI/CD 管道会 **设置环境变量**,其中包含 **有关 PR 的信息**。如果该值可以被攻击者控制(如 PR 的标题),并且在 **危险位置**如执行 **sh 命令**)中 **使用**,攻击者可能会 **在其中注入命令**
- **D-PPE**: **Direct PPE** 发生在攻击者直接**修改将执行的 CI config** 文件时。
- **I-DDE**: **Indirect PPE** 发生在攻击者**修改** CI config 依赖的**文件**(例如 make file 或 terraform 配置)时。
- **Public PPE or 3PE**: 在某些情况下,pipelines 可以被**没有 repo 写入权限的用户触发**(他们甚至可能不属于 org),因为他们可以发送 PR。
- **3PE Command Injection**: 通常CI/CD pipelines 会通过**环境变量**设置关于 PR 的信息。如果该值可以被攻击者控制(如 PR 的 title并且被**用于危险位置**(比如执行 **sh commands**,攻击者可能会在其中**注入命令**。
### Exploitation Benefits
了解毒化管道的 3 种风格后,我们检查攻击者在成功利用后可获得的内容
了解了三种 poison pipeline 的变体后,我们来看看攻击者在成功利用后可获得什么
- **秘密**:如前所述,管道的作业需要 **特权**(检索代码、构建、部署等……),这些特权通常在秘密中 **授予**。这些秘密通常可以通过 **环境变量或系统内的文件** 访问。因此攻击者总是会尝试提取尽可能多的秘密
- 根据管道平台,攻击者 **可能需要在配置中指定秘密**。这意味着如果攻击者无法修改 CI 配置管道(例如 **I-PPE**),他可能 **只能提取该管道拥有的秘密**
- **计算**代码在某处执行,具体取决于执行位置,攻击者可能能够进一步转移
- **本地**:如果管道在本地执行,攻击者可能进入 **内部网络访问更多资源**
- **云**攻击者可访问 **云中其他机器**,还可以 **提取** IAM 角色/服务帐户 **令牌** 以获得 **进一步的云内部访问**
- **平台机器**:有时作业将在 **管道平台机器** 内执行,这些机器通常位于没有更多访问权限的云中
- **选择它**有时 **管道平台将配置多机器**,如果您可以 **修改 CI 配置文件**,则可以 **指示要运行恶意代码的位置**。在这种情况下,攻击者可能会在每台可能的机器上运行反向 shell,以尝试进一步利用。
- **妥协生产**:如果您在管道内部,并且最终版本是从中构建部署的,您可能会 **妥协即将在生产中运行的代码**
- **Secrets**: 如前所述pipelines 的 jobs 需要**权限**(检索代码、构建、部署等),这些权限通常以 **secrets** 的形式授予。这些 secrets 通常可以通过 **env variables 或系统内的文件**访问。因此攻击者会尽可能地尝试外泄尽可能多的 secrets
- 根据 pipeline 平台,攻击者**可能需要在配置中指定 secrets**。这意味着如果攻击者无法修改 CI configuration pipeline(例如 I-PPE),他**只能外泄该 pipeline 本身拥有的 secrets**。
- **Computation**: 代码在某处执行,取决于执行位置,攻击者可能能够进一步 pivot
- **On-Premises**: 如果 pipelines 在本地执行,攻击者可能进入**内部网络访问更多资源**。
- **Cloud**: 攻击者可访问**云中其他机器**,也可能**外泄**IAM roles/service accounts **tokens**,从而在云内获得**进一步的权限**。
- **Platforms machine**: 有时 jobs 会在 **pipelines platform machines** 内执行,这些机器通常位于云中且**没有更多访问权限**
- **Select it:** 有时 **pipelines platform 会配置多机器**,如果你能**修改 CI 配置文件**,你可以**指定要在哪台机器上运行恶意代码**。在这种情况下,攻击者可能会在每台可机器上运行反向 shell尝试进一步利用。
- **Compromise production**: 如果你在 pipeline 内并且最终版本是从中构建部署的,你可以**危害将要在 production 中运行的代码**。
## More relevant info
### Tools & CIS Benchmark
- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) 是一个开源工具,用于审计您的软件供应链堆栈的安全合规性,基于新的 [**CIS 软件供应链基准**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf)。审计集中在整个 SDLC 过程中,可揭示从代码时间到部署时间的风险。
- [**Chain-bench**](https://github.com/aquasecurity/chain-bench) 是一个开源工具,用于基于新的 [**CIS Software Supply Chain benchmark**](https://github.com/aquasecurity/chain-bench/blob/main/docs/CIS-Software-Supply-Chain-Security-Guide-v1.0.pdf) 审计你的软件供应链堆栈的安全合规性。该审计关注整个 SDLC 流程,可揭示从代码到部署阶段的风险。
### Top 10 CI/CD Security Risk
查看这篇关于 Cider 的前 10 大 CI/CD 风险的有趣文章[**https://www.cidersecurity.io/top-10-cicd-security-risks/**](https://www.cidersecurity.io/top-10-cicd-security-risks/)
查看这篇关于 Cider 所列 CI/CD 前 10 大风险的有趣文章: [**https://www.cidersecurity.io/top-10-cicd-security-risks/**](https://www.cidersecurity.io/top-10-cicd-security-risks/)
### Labs
- 在每个平台上,您可以本地运行,您将找到如何本地启动它,以便您可以根据需要进行配置以进行测试
- Gitea + Jenkins 实验室:[https://github.com/cider-security-research/cicd-goat](https://github.com/cider-security-research/cicd-goat)
- 在每个可以本地运行的平台,你会找到如何本地启动它的说明,这样你可以按需配置以进行测试
- Gitea + Jenkins lab: [https://github.com/cider-security-research/cicd-goat](https://github.com/cider-security-research/cicd-goat)
### Automatic Tools
- [**Checkov**](https://github.com/bridgecrewio/checkov)**Checkov** 是一个用于基础设施即代码的静态代码分析工具。
- [**Checkov**](https://github.com/bridgecrewio/checkov): **Checkov** 是一个用于 infrastructure-as-code 的静态代码分析工具。
## References
- [https://www.cidersecurity.io/blog/research/ppe-poisoned-pipeline-execution/?utm_source=github\&utm_medium=github_page\&utm_campaign=ci%2fcd%20goat_060422](https://www.cidersecurity.io/blog/research/ppe-poisoned-pipeline-execution/?utm_source=github&utm_medium=github_page&utm_campaign=ci%2fcd%20goat_060422)
{{#include ../banners/hacktricks-training.md}}