Az - Container Registry

Reading time: 12 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をサポートする

基本情報

Azure Container Registry (ACR) は、Azure クラウド内でコンテナイメージを保存、管理、アクセスするための安全でプライベートなレジストリです。いくつかの Azure サービスとシームレスに統合され、大規模な自動ビルドおよびデプロイワークフローを提供します。地理的レプリケーションや脆弱性スキャンなどの機能を備えた ACR は、コンテナ化されたアプリケーションのエンタープライズグレードのセキュリティとコンプライアンスを確保するのに役立ちます。

権限

これらは、Container Registry に対して付与できる異なる権限です according to the docs:

  • アクセス リソース マネージャー
  • レジストリの作成/削除
  • イメージのプッシュ
  • イメージのプル
  • イメージデータの削除
  • ポリシーの変更
  • イメージの署名

また、割り当て可能な組み込みロールもあり、カスタムロールを作成することも可能です。

認証

warning

レジストリ名に大文字が含まれていても、小文字を使用してログイン、プッシュ、プルすることが非常に重要です。

ACR に認証する方法は 4 つあります:

  • Entra ID を使用: これは ACR に認証するためのデフォルトの方法です。az acr login コマンドを使用して ACR に認証します。このコマンドは、~/.docker/config.json ファイルに資格情報を保存します。さらに、クラウドシェルのように Docker ソケットにアクセスできない環境からこのコマンドを実行している場合、--expose-token フラグを使用して ACR に認証するためのトークンを取得できます。次に、ユーザー名として 00000000-0000-0000-0000-000000000000 を使用して認証する必要があります。例: docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN
  • 管理者アカウントを使用: 管理者ユーザーはデフォルトで無効になっていますが、有効にすることができ、その後、管理者アカウントのユーザー名パスワードを使用してレジストリにアクセスできます。この方法は、いくつかの Azure サービスが使用しているため、まだサポートされています。このユーザーには2 つのパスワードが作成され、どちらも有効です。az acr update -n <acrName> --admin-enabled true で有効にできます。ユーザー名は通常、レジストリ名です(admin ではありません)。
  • トークンを使用: レジストリにアクセスするための特定の scope map(権限)を持つトークンを作成することができます。その後、このトークン名をユーザー名として使用し、生成されたパスワードのいずれかを使用してレジストリに認証できます。例: docker login -u <registry-name> -p <password> aregistry-url
  • サービスプリンシパルを使用: サービスプリンシパルを作成し、イメージをプルするために AcrPull のようなロールを割り当てることができます。その後、SP appId をユーザー名として、生成されたシークレットをパスワードとして使用してレジストリにログインできます。

レジストリへのアクセスを持つ SP を生成するための docs からの例のスクリプト:

bash
#!/bin/bash
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal

# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)

PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)

echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"

暗号化

Premium SKU のみが、画像やその他のアーティファクトの 静止状態での暗号化 をサポートしています。

ネットワーキング

Premium SKU のみが プライベートエンドポイント をサポートしています。他のSKUは パブリックアクセス のみをサポートしています。パブリックエンドポイントは <registry-name>.azurecr.io の形式で、プライベートエンドポイントは <registry-name>.privatelink.azurecr.io の形式です。このため、レジストリの名前はすべてのAzureで一意である必要があります。

Microsoft Defender for Cloud

これにより、レジストリ内の 画像をスキャン して 脆弱性 を検出できます。

ソフトデリート

ソフトデリート 機能により、指定された日数内に 削除されたレジストリを復元 できます。この機能は デフォルトで無効 になっています。

ウェブフック

レジストリ内で ウェブフックを作成 することが可能です。このウェブフックでは、プッシュまたは削除アクションが実行されるたびにリクエストが送信されるURL を指定する必要があります。さらに、ウェブフックは影響を受けるリポジトリ(画像)を示すスコープを指定できます。例えば、'foo:*' はリポジトリ 'foo' の下のイベントを意味します。

攻撃者の視点からは、レジストリで アクションを実行する前にこれを確認 し、必要に応じて一時的に削除して検出を避けることが興味深いです。

接続されたレジストリ

これは基本的に、通常はオンプレミスにある別のレジストリから 画像をミラーリング することを可能にします。

2つのモードがあります: ReadOnlyReadWrite。最初のモードでは、画像はソースレジストリからのみ プル され、2番目のモードでは、画像をソースレジストリに プッシュ することもできます。

クライアントがAzureからレジストリにアクセスするためには、接続されたレジストリが使用されるときに トークン が生成されます。

実行とタスク

実行とタスクは、通常ローカルまたはCI/CDパイプラインで行う必要があるAzureコンテナ関連のアクションを実行することを可能にします。例えば、レジストリ内で 画像をビルド、プッシュ、実行 できます。

コンテナをビルドして実行する最も簡単な方法は、通常の実行を使用することです:

bash
# Build
echo "FROM mcr.microsoft.com/hello-world" > Dockerfile
az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --file Dockerfile .

# Run
az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null

しかし、それは攻撃者の視点からはあまり興味深くない実行をトリガーします。なぜなら、それらには管理されたアイデンティティが付いていないからです。

しかし、タスクにはシステムおよびユーザー管理アイデンティティを付けることができます。これらのタスクは、コンテナ内で権限を昇格させるのに役立ちます。権限昇格のセクションでは、タスクを使用して権限を昇格させる方法を見ることができます。

キャッシュ

キャッシュ機能は、外部リポジトリから画像をダウンロードし、新しいバージョンをレジストリに保存することを可能にします。これは、Azure Vaultから資格情報を選択することで、いくつかの資格情報を設定する必要があります。

これは攻撃者の視点から非常に興味深いです。なぜなら、攻撃者が資格情報にアクセスするのに十分な権限を持っている場合、外部プラットフォームにピボットすることを可能にし、外部リポジトリから画像をダウンロードし、キャッシュを設定することは持続メカニズムとしても使用できるからです。

列挙

warning

レジストリ名に大文字が含まれていても、アクセスするためのURLには小文字のみを使用することが非常に重要です。

bash
# List of all the registries
# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url...
az acr list

# Get the details of a registry
az acr show --name <registry-name>

# List tokens of a registry
az acr token list --registry <registry-name> --resource-group <res-group>

# List repositories in a registry
az acr repository list --name <registry-name> --resource-group <res-group>

# List the tags of a repository
az acr repository show-tags --repository <repository-name> --name <registry-name> --resource-group <res-group>

# List deleted repository tags
## At the time of this writing there isn't yet any command to restore it
az acr repository list-deleted --name <registry-name>

# List tasks
## Check the git URL or the command
az acr task list --registry <registry-name>

# List tasks runs
az acr task list-runs --registry <registry-name>

# List connected registries
az acr connected-registry list --registry <registry-name>

# List cache
az acr cache list --registry <registry-name>

# Get cache details
az acr cache show --name <cache-name> --registry <registry-name>

権限昇格とポストエクスプロイト

Az - Automation Accounts Privesc

参考文献

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