Gitea Security

支持 HackTricks

什么是 Gitea

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

基本信息

Basic Gitea Information

实验室

要在本地运行 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 keys 也可以在仓库中设置为部署密钥。任何拥有此密钥的人都可以从仓库启动项目。通常在具有不同部署密钥的服务器中,本地文件 ~/.ssh/config 将为您提供有关密钥相关的信息。

GPG Keys

此处所述,有时需要对提交进行签名,否则您可能会被发现。

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

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