Github Security

支持 HackTricks

什么是 Github

(来自 这里) 从高层次来看,GitHub 是一个网站和基于云的服务,帮助开发者存储和管理他们的代码,以及跟踪和控制代码的更改

基本信息

外部侦查

Github 仓库可以配置为公共、私有和内部。

  • 私有 意味着 只有 组织中的人才能访问它们

  • 内部 意味着 只有 企业中的人(一个企业可以有多个组织)才能访问它

  • 公共 意味着 所有互联网 用户都可以访问它。

如果你知道 想要针对的用户、仓库或组织,你可以使用 github dorks 来查找敏感信息或搜索 每个仓库中的敏感信息泄露

Github Dorks

Github 允许 指定用户、仓库或组织作为范围进行搜索。因此,使用一系列将出现在敏感信息附近的字符串,你可以轻松地 搜索目标中的潜在敏感信息

工具(每个工具包含其 dorks 列表):

Github 泄露

请注意,github dorks 也旨在使用 github 搜索选项查找泄露。此部分专门介绍那些将 下载每个仓库并搜索其中的敏感信息 的工具(甚至检查某些深度的提交)。

工具(每个工具包含其正则表达式列表):

当你在一个仓库中查找泄露并运行类似 git log -p 的命令时,不要忘记可能还有 其他分支和其他提交 包含秘密!

外部分支

可以通过 滥用拉取请求来妥协仓库。要知道一个仓库是否脆弱,你主要需要阅读 Github Actions yaml 配置。 更多信息见下文

Github 在删除/内部分支中的泄露

即使是删除或内部的,也可能从 github 仓库的分支中获取敏感数据。请在这里查看:

组织强化

成员权限

可以为组织的 成员 分配一些 默认权限。这些可以从页面 https://github.com/organizations/<org_name>/settings/member_privilegesOrganizations API 控制。

  • 基本权限:成员将对组织仓库拥有 None/Read/write/Admin 权限。推荐使用 NoneRead

  • 仓库分叉:如果不必要,最好 不允许 成员分叉组织仓库。

  • 页面创建:如果不必要,最好 不允许 成员从组织仓库发布页面。如果需要,可以允许创建公共或私有页面。

  • 集成访问请求:启用此选项后,外部协作者将能够请求访问 GitHub 或 OAuth 应用程序以访问该组织及其资源。通常是需要的,但如果不需要,最好禁用它。

  • 我在 API 响应中找不到此信息,如果你找到了,请分享

  • 仓库可见性更改:如果启用,具有 admin 权限的 成员 将能够 更改其可见性。如果禁用,只有组织所有者可以更改仓库的可见性。如果你 想让人们将内容 公开,请确保此选项 已禁用

  • 我在 API 响应中找不到此信息,如果你找到了,请分享

  • 仓库删除和转移:如果启用,具有 admin 权限的成员将能够 删除转移 公共和私有 仓库

  • 我在 API 响应中找不到此信息,如果你找到了,请分享

  • 允许成员创建团队:如果启用,任何 成员 都可以 创建 新的 团队。如果禁用,只有组织所有者可以创建新团队。最好将此选项禁用。

  • 我在 API 响应中找不到此信息,如果你找到了,请分享

  • 此页面可以配置更多内容,但前面的内容与安全性相关性更大。

Actions 设置

可以从页面 https://github.com/organizations/<org_name>/settings/actions 配置多个与安全相关的设置。

请注意,所有这些配置也可以在每个仓库中独立设置

  • Github actions 策略:允许你指明哪些仓库可以运行工作流,哪些工作流应该被允许。建议 指定哪些仓库 应该被允许,而不是允许所有操作运行。

  • 来自外部协作者的拉取请求工作流:建议 要求所有 外部协作者的批准。

  • 我找不到包含此信息的 API,如果你找到了,请分享

  • 从拉取请求运行工作流:强烈 不建议从拉取请求运行工作流,因为分叉源的维护者将获得使用具有读取权限的令牌访问源仓库的能力。

  • 我找不到包含此信息的 API,如果你找到了,请分享

  • 工作流权限:强烈建议 仅授予读取仓库权限。不建议授予写入和创建/批准拉取请求的权限,以避免滥用授予运行工作流的 GITHUB_TOKEN。

集成

如果你知道访问此信息的 API 端点,请告诉我!

  • 第三方应用程序访问政策:建议限制对每个应用程序的访问,仅允许必要的应用程序(在审核后)。

  • 已安装的 GitHub 应用程序:建议仅允许必要的应用程序(在审核后)。

侦查与利用凭证的攻击

在此场景中,我们假设你已经获得了对一个 github 账户的某些访问权限。

使用用户凭证

如果你以某种方式已经获得了组织内某个用户的凭证,你可以 直接登录 并检查你拥有的 企业和组织角色,如果你是普通成员,检查普通成员拥有的 权限、你所在的 、你对哪些 仓库 拥有 权限,以及 这些仓库是如何保护的

请注意 可能使用了 2FA,因此你只能在能够 通过该检查 的情况下访问此信息。

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

查看下面关于 分支保护绕过 的部分,以防有用。

使用用户 SSH 密钥

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

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

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

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

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

GPG 密钥

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

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

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

使用用户令牌

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

用户令牌可以替代密码用于通过 HTTPS 进行 Git 操作,或可用于通过基本身份验证对 API 进行身份验证。根据附加的权限,您可能能够执行不同的操作。

用户令牌的格式如下:ghp_EfHnQFcFHX6fGIu5mpduvRiYR584kK0dX123

使用 Oauth 应用程序

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

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

这些是Oauth 应用程序可以请求的范围。在接受之前,应该始终检查请求的范围。

此外,如基本信息中所述,组织可以授予/拒绝第三方应用程序对与组织相关的信息/仓库/操作的访问权限

使用 Github 应用程序

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

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

此外,如基本信息中所述,组织可以授予/拒绝第三方应用程序对与组织相关的信息/仓库/操作的访问权限

破坏与滥用 Github Action

有几种技术可以破坏和滥用 Github Action,查看它们:

分支保护绕过

  • 需要一定数量的批准:如果您破坏了多个帐户,您可能只需从其他帐户接受您的 PR。如果您只有创建 PR 的帐户,则无法接受自己的 PR。然而,如果您可以访问仓库中的Github Action环境,使用GITHUB_TOKEN,您可能能够批准您的 PR,以这种方式获得 1 次批准。

  • 注意,对于此以及代码所有者限制,通常用户无法批准自己的 PR,但如果您可以,您可以利用它来接受您的 PR。

  • 在推送新提交时撤销批准:如果未设置此项,您可以提交合法代码,等待某人批准,然后放入恶意代码并将其合并到受保护的分支中。

  • 需要代码所有者的审查:如果此项已激活且您是代码所有者,您可以让Github Action 创建您的 PR,然后自己批准它

  • CODEOWNER 文件配置错误时,Github 不会抱怨,但也不会使用它。因此,如果配置错误,代码所有者保护将不适用。

  • 允许指定的参与者绕过拉取请求要求:如果您是这些参与者之一,您可以绕过拉取请求保护。

  • 包括管理员:如果未设置此项且您是仓库的管理员,您可以绕过此分支保护。

  • PR 劫持:您可能能够修改其他人的 PR,添加恶意代码,自己批准结果 PR 并合并所有内容。

  • 移除分支保护:如果您是仓库的管理员,您可以禁用保护,合并您的 PR 并重新设置保护。

  • 绕过推送保护:如果一个仓库仅允许某些用户在分支中发送推送(合并代码)(分支保护可能保护所有分支,指定通配符 *)。

  • 如果您对仓库有写入权限,但由于分支保护不允许推送代码,您仍然可以创建一个新分支,并在其中创建一个在代码推送时触发的 github action。由于分支保护在分支创建之前不会保护该分支,因此对该分支的第一次代码推送将执行 github action

绕过环境保护

有关Github 环境的介绍,请查看基本信息

如果一个环境可以从所有分支访问,则没有保护,您可以轻松访问环境中的机密。请注意,您可能会发现某些仓库所有分支都受到保护(通过指定其名称或使用 *),在这种情况下,找到一个可以推送代码的分支,您可以通过创建新的 github action(或修改一个)来提取机密。

请注意,您可能会发现边缘情况,其中所有分支都受到保护(通过通配符 *),并且指定了谁可以向分支推送代码您可以在分支保护中指定这一点),而您的用户不被允许。您仍然可以运行自定义 github action,因为您可以创建一个分支并在其上使用推送触发器。分支保护允许推送到新分支,因此 github action 将被触发

push: # Run it when a push is made to a branch
branches:
- current_branch_name #Use '**' to run when a push is made to any branch

注意,在创建分支后,分支保护将适用于新分支,您将无法修改它,但在那时您已经提取了秘密。

持久性

  • 生成用户令牌

  • 秘密中窃取github令牌

  • 删除工作流结果分支

  • 所有组织更多权限

  • 创建webhooks以提取信息

  • 邀请外部协作者

  • 移除****SIEM使用的webhooks

  • 创建/修改带有后门Github Action

  • 通过秘密值修改查找易受攻击的Github Action以进行命令注入

冒名顶替提交 - 通过仓库提交的后门

在Github中,可以从一个分叉创建一个PR到一个仓库。即使PR未被接受,在原始仓库中也会为代码的分叉版本创建一个提交ID。因此,攻击者可以固定使用一个来自看似合法的仓库的特定提交,该提交并不是由仓库的所有者创建的

这个

name: example
on: [push]
jobs:
commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@c7d749a2d57b4b375d1ebcd17cfbfb60c676f18e
- shell: bash
run: |
echo 'hello world!'

有关更多信息,请查看 https://www.chainguard.dev/unchained/what-the-fork-imposter-commits-in-github-actions-and-ci-cd

支持 HackTricks

Last updated