本文围绕CICD的Gitea风险进行分析,简单介绍了Gitea是什么,以及常见的风险及利用方式
Gitea 基础
Gitea是一个用Go编写的自托管的社区管理的轻量级代码托管解决方案。
基本结构
Gitea的基本环境结构是通过组织将仓库分组,每个组织可以包含多个仓库和多个团队。但是,请注意,就像在github中,用户可以在组织之外拥有仓库。
此外,用户可以是不同组织的成员。在组织内,用户可以对每个仓库拥有不同的权限。
用户还可以是不同团队的一部分,对不同的仓库拥有不同的权限。
最后,仓库可能具有特殊的保护机制。
权限
组织
当创建一个组织时,会创建一个名为Owners的团队,并将用户放入其中。该团队将赋予对组织的管理员访问权限,这些权限和团队的名称****无法修改。
组织管理员(所有者)可以选择组织的可见性:
-
公开
-
有限制(仅限登录用户)
-
私有(仅限成员)
组织管理员还可以指示仓库管理员是否可以为团队添加或删除访问权限。他们还可以指定仓库的最大数量。
创建新团队时,选择了几个重要的设置:
-
指定团队成员将能够访问的组织的仓库:特定仓库(团队被添加的仓库)或全部仓库。
-
还指定了成员是否可以创建新的仓库(创建者将获得对其的管理员访问权限)。
-
仓库成员将拥有的权限:
-
管理员访问权限
-
特定访问权限
团队和用户
在仓库中,组织管理员和仓库管理员(如果组织允许)可以管理分配给协作者(其他用户)和团队的角色。有3种可能的角色:
-
管理员
-
写入
-
读取
Gitea身份验证
Web访问
使用用户名+密码和可能(建议)的2FA。
SSH密钥
您可以配置您的帐户使用一个或多个公钥,允许相关的私钥代表您执行操作。http://localhost:3000/user/settings/keys
GPG密钥
您不能使用这些密钥冒充用户,但如果您不使用它,可能会发现您发送的提交没有签名。
个人访问令牌
您可以生成个人访问令牌,以授予应用程序访问您的帐户。个人访问令牌可以完全访问您的帐户:http://localhost:3000/user/settings/applications
Oauth应用程序
就像个人访问令牌一样,Oauth应用程序将对您的帐户和您的帐户具有访问权限的位置具有完全访问权限,因为如文档中所示,尚不支持范围
部署密钥
部署密钥可能对仓库具有只读或写入访问权限,因此它们可能对于破坏特定仓库很有趣。
分支保护
分支保护旨在不将仓库的完全控制权交给用户。目标是在能够在某些分支中编写代码之前,在其前面放置几种保护方法。
仓库的分支保护可以在https://localhost:3000/<orgname>/<reponame>/settings/branches中找到
无法在组织级别设置分支保护。因此,所有这些保护都必须在每个仓库中声明。
可以对分支应用不同的保护(例如对主分支):
-
禁用推送:无人可以推送到此分支
-
启用推送:具有访问权限的任何人都可以推送,但不能强制推送。
-
白名单限制推送:只有选定的用户/团队可以推送到此分支(但不能强制推送)
-
启用合并白名单:只有在白名单上的用户/团队可以合并PR。
-
启用状态检查:要求状态检查通过后才能合并。
-
要求批准:指示在可以合并PR之前需要的批准数量。
-
将批准限制为白名单:指示可以批准PR的用户/团队。
-
在拒绝审查时阻止合并:如果请求更改,则无法合并(即使其他检查通过)
-
在官方审查请求上阻止合并:如果有官方审查请求,则无法合并
-
忽略过时的批准:有新提交时,旧的批准将被忽略。
-
要求签名的提交:提交必须签名。
-
如果拉取请求已过时,则阻止合并
-
受保护/未受保护的文件模式:指定要保护/取消保护的文件模式
Gitea环境搭建
要在本地运行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风险
未经身份验证的枚举
-
公共仓库:http://localhost:3000/explore/repos
-
注册用户:http://localhost:3000/explore/users
-
注册组织:http://localhost:3000/explore/organizations
请注意,默认情况下,Gitea允许新用户注册。这不会给新用户特别有趣的访问权限,但是已登录的用户可能能够查看更多的仓库或组织。
内部利用
在这种情况下,我们假设您已经获得了某个github账户的访问权限。
使用用户凭据/网页Cookie
如果您已经以某个组织内的用户的凭据登录(或者您窃取了一个会话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应用程序
攻击者可能创建一个恶意的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 [email protected] --admin --access-token创建新的管理员用户并获取访问令牌。
原文始发于微信公众号(暴暴的皮卡丘):CICD之 Gitea Security
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论