15 KiB
Github Security
{{#include ../../banners/hacktricks-training.md}}
什么是Github
(来自 这里) 从高层次来看,GitHub是一个网站和基于云的服务,帮助开发者存储和管理他们的代码,以及跟踪和控制代码的更改。
基本信息
{{#ref}} basic-github-information.md {{#endref}}
外部侦查
Github 仓库可以配置为公共、私有和内部。
- 私有意味着只有组织中的人才能访问它们
- 内部意味着只有企业中的人(一个企业可能有多个组织)才能访问它
- 公共意味着所有互联网都可以访问它。
如果你知道要针对的用户、仓库或组织,你可以使用github dorks来查找敏感信息或搜索每个仓库中的敏感信息泄露。
Github Dorks
Github 允许通过指定用户、仓库或组织作为范围来搜索某些内容。因此,使用一系列将出现在敏感信息附近的字符串,你可以轻松地搜索目标中的潜在敏感信息。
工具(每个工具包含其 dorks 列表):
- https://github.com/obheda12/GitDorker (Dorks list)
- https://github.com/techgaun/github-dorks (Dorks list)
- https://github.com/hisxo/gitGraber (Dorks list)
Github 泄露
请注意,github dorks 也旨在使用 github 搜索选项查找泄露。本节专门介绍那些将下载每个仓库并搜索其中敏感信息的工具(甚至检查某些提交深度)。
工具(每个工具包含其正则表达式列表):
- https://github.com/zricethezav/gitleaks
- https://github.com/trufflesecurity/truffleHog
- https://github.com/eth0izzle/shhgit
- https://github.com/michenriksen/gitrob
- https://github.com/anshumanbh/git-all-secrets
- https://github.com/kootenpv/gittyleaks
- https://github.com/awslabs/git-secrets
Warning
当你在一个仓库中查找泄露并运行类似
git log -p的命令时,不要忘记可能还有其他分支和其他提交包含秘密!
外部分支
可以通过滥用拉取请求来妥协仓库。要知道一个仓库是否脆弱,你主要需要阅读 Github Actions yaml 配置。更多信息见下文。
删除/内部分支中的 Github 泄露
即使是删除或内部的,也可能从 github 仓库的分支中获取敏感数据。请在此处查看:
{{#ref}} accessible-deleted-data-in-github.md {{#endref}}
组织强化
成员权限
可以分配给组织成员的一些默认权限。这些可以从页面 https://github.com/organizations/<org_name>/settings/member_privileges 或从 Organizations API 控制。
- 基本权限:成员将对组织仓库拥有 None/Read/write/Admin 权限。推荐使用None或Read。
- 仓库分叉:如果不必要,最好不允许成员分叉组织仓库。
- 页面创建:如果不必要,最好不允许成员从组织仓库发布页面。如果必要,可以允许创建公共或私有页面。
- 集成访问请求:启用此选项后,外部协作者将能够请求访问此组织及其资源的 GitHub 或 OAuth 应用。通常是需要的,但如果不需要,最好禁用它。
- 我在 API 响应中找不到此信息,如果你找到了,请分享
- 仓库可见性更改:如果启用,具有管理员权限的成员将能够更改其可见性。如果禁用,只有组织所有者可以更改仓库的可见性。如果你不希望人们将内容公开,请确保此选项禁用。
- 我在 API 响应中找不到此信息,如果你找到了,请分享
- 仓库删除和转移:如果启用,具有管理员权限的成员将能够删除或转移公共和私有仓库。
- 我在 API 响应中找不到此信息,如果你找到了,请分享
- 允许成员创建团队:如果启用,任何成员都将能够创建新团队。如果禁用,只有组织所有者可以创建新团队。最好将此选项禁用。
- 我在 API 响应中找不到此信息,如果你找到了,请分享
- 此页面上可以配置更多内容,但前面的内容是与安全性相关的内容。
Actions 设置
可以从页面 https://github.com/organizations/<org_name>/settings/actions 配置多个与安全相关的设置。
Note
请注意,所有这些配置也可以在每个仓库中独立设置
- Github actions 策略:允许你指明哪些仓库可以运行工作流,哪些工作流应该被允许。建议指定哪些仓库应该被允许,而不是允许所有操作运行。
- API-1, API-2
- 来自外部协作者的拉取请求工作流:建议要求所有外部协作者的批准。
- 我找不到包含此信息的 API,如果你找到了,请分享
- 从拉取请求运行工作流:强烈不建议从拉取请求运行工作流,因为分支来源的维护者将获得使用具有读取权限的令牌访问源仓库的能力。
- 我找不到包含此信息的 API,如果你找到了,请分享
- 工作流权限:强烈建议仅授予读取仓库权限。不建议授予写入和创建/批准拉取请求的权限,以避免滥用授予运行工作流的 GITHUB_TOKEN。
- API
集成
如果你知道访问此信息的 API 端点,请告诉我!
- 第三方应用访问策略:建议限制对每个应用的访问,仅允许必要的应用(在审核后)。
- 已安装的 GitHub 应用:建议仅允许必要的应用(在审核后)。
侦查与利用凭证的攻击
在此场景中,我们假设你已经获得了对一个 github 账户的某些访问权限。
使用用户凭证
如果你以某种方式已经获得了组织内某个用户的凭证,你可以直接登录并检查你拥有的企业和组织角色,如果你是普通成员,检查普通成员拥有的权限、你所在的组、你对哪些仓库拥有权限,以及这些仓库是如何保护的。
请注意,可能会使用 2FA,因此你只能在能够通过该检查的情况下访问此信息。
Note
请注意,如果你设法窃取了
user_sessioncookie(当前配置为 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 Action
有几种技术可以破坏和滥用Github Action,请在此查看:
{{#ref}} abusing-github-actions/ {{#endref}}
分支保护绕过
- 需要一定数量的批准:如果您破坏了多个帐户,您可能只需从其他帐户接受您的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 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以进行命令注入
冒名顶替提交 - 通过repo提交的后门
在Github中,可以从一个fork创建一个PR到一个repo。即使PR未被接受,在原始repo中也会为代码的fork版本创建一个提交id。因此,攻击者可以固定使用一个来自看似合法的repo的特定提交,该提交并不是由repo的所有者创建的。
像这个:
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
{{#include ../../banners/hacktricks-training.md}}