Gitea Security

支持 HackTricks

什么是 Gitea

Gitea 是一个 自托管的社区管理轻量级代码托管 解决方案,使用 Go 编写。

基本信息

实验室

要在本地运行 Gitea 实例,您只需运行一个 Docker 容器:

docker run -p 3000:3000 gitea/gitea

连接到端口 3000 以访问网页。

您还可以使用 kubernetes 运行它:

helm repo add gitea-charts https://dl.gitea.io/charts/
helm install gitea gitea-charts/gitea

未经身份验证的枚举

请注意,默认情况下 Gitea 允许新用户注册。这不会给新用户提供对其他组织/用户仓库的特别有趣的访问权限,但已登录用户可能能够查看更多的仓库或组织

内部利用

在此场景中,我们假设您已获得某个 GitHub 账户的访问权限。

如果您以某种方式已经获得了组织内某个用户的凭据(或您窃取了会话 Cookie),您可以直接登录并检查您对哪些仓库拥有权限,您在哪些团队中,列出其他用户,以及仓库是如何保护的

请注意,可能会使用 2FA,因此您只有在能够通过该检查时才能访问此信息。

请注意,如果您设法窃取了 i_like_gitea Cookie(当前配置为 SameSite: Lax),您可以完全冒充该用户而无需凭据或 2FA。

使用用户 SSH 密钥

Gitea 允许用户设置SSH 密钥,该密钥将作为代表他们部署代码的身份验证方法(不适用 2FA)。

使用此密钥,您可以对用户拥有某些权限的仓库进行更改,但是您不能使用它访问 Gitea API 来枚举环境。然而,您可以枚举本地设置以获取有关您有访问权限的仓库和用户的信息:

# Go to the the repository folder
# Get repo config and current user name and email
git config --list

如果用户将其用户名配置为他的 gitea 用户名,您可以访问他在 https://github.com/<gitea_username>.keys 中设置的 公钥,您可以检查此内容以确认您找到的私钥是否可以使用。

SSH 密钥 也可以在仓库中设置为 部署密钥。任何拥有此密钥的人都将能够 从仓库启动项目。通常在具有不同部署密钥的服务器上,本地文件 ~/.ssh/config 将提供与密钥相关的信息。

GPG 密钥

这里 所述,有时需要签署提交,否则您可能会被发现。

在本地检查当前用户是否有任何密钥:

gpg --list-secret-keys --keyid-format=long

使用用户令牌

有关用户令牌的介绍,请查看基本信息

用户令牌可以替代密码认证Gitea服务器通过API。它将对用户拥有完全访问权限

使用Oauth应用程序

有关Gitea Oauth应用程序的介绍,请查看基本信息

攻击者可能创建一个恶意Oauth应用程序来访问接受它们的用户的特权数据/操作,这可能是网络钓鱼活动的一部分。

如基本信息中所述,该应用程序将对用户帐户拥有完全访问权限

绕过分支保护

在Github中,我们有github actions,默认情况下会获得对仓库的写访问令牌,可以用来绕过分支保护。在这种情况下不存在,因此绕过的方式更有限。但让我们看看可以做些什么:

  • 启用推送:如果任何具有写访问权限的人可以推送到该分支,只需推送即可。

  • 白名单限制推送:同样,如果您是此列表的一部分,则推送到该分支。

  • 启用合并白名单:如果有合并白名单,您需要在其中。

  • 需要的批准大于0:那么...您需要妥协另一个用户。

  • 将批准限制为白名单:如果只有白名单用户可以批准...您需要妥协另一个在该列表中的用户。

  • 撤销过期的批准:如果批准未随新提交而删除,您可以劫持已批准的PR以注入您的代码并合并PR。

请注意如果您是组织/仓库管理员,您可以绕过保护。

枚举Webhooks

Webhooks能够将特定的gitea信息发送到某些地方。您可能能够利用该通信。 然而,通常在webhook中设置了一个您无法检索密钥,这将防止外部用户知道webhook的URL但不知道密钥来利用该webhook。 但在某些情况下,人们不是将密钥设置在其位置,而是将其作为参数设置在URL中,因此检查URL可能会让您找到密钥和其他您可以进一步利用的地方。

Webhooks可以在仓库和组织级别设置。

利用后

服务器内部

如果您以某种方式设法进入运行gitea的服务器,您应该搜索gitea配置文件。默认情况下,它位于/data/gitea/conf/app.ini

在此文件中,您可以找到密钥密码

在gitea路径(默认:/data/gitea)中,您还可以找到有趣的信息,例如:

  • sqlite数据库:如果gitea不使用外部数据库,它将使用sqlite数据库。

  • 会话在会话文件夹中:运行cat sessions/*/*/*可以看到已登录用户的用户名(gitea也可以将会话保存在数据库中)。

  • jwt私钥在jwt文件夹中。

  • 该文件夹中可能会找到更多敏感信息

如果您在服务器内部,您还可以使用gitea二进制文件来访问/修改信息:

  • gitea dump将转储gitea并生成一个.zip文件。

  • gitea generate secret INTERNAL_TOKEN/JWT_SECRET/SECRET_KEY/LFS_JWT_SECRET将生成指定类型的令牌(持久性)。

  • gitea admin user change-password --username admin --password newpassword更改密码。

  • gitea admin user create --username newuser --password superpassword --email user@user.user --admin --access-token创建新管理员用户并获取访问令牌。

支持HackTricks

Last updated