Az - Container Registry
Reading time: 7 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 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
Azure Container Registry (ACR)는 Azure 클라우드에서 컨테이너 이미지를 저장, 관리 및 액세스할 수 있는 안전하고 개인적인 레지스트리입니다. 여러 Azure 서비스와 원활하게 통합되어 대규모 자동화된 빌드 및 배포 워크플로를 제공합니다. 지리적 복제 및 취약성 스캔과 같은 기능을 통해 ACR은 컨테이너화된 애플리케이션에 대한 기업 수준의 보안 및 규정 준수를 보장합니다.
권한
Container Registry에 부여할 수 있는 다양한 권한은 문서에 따라 다음과 같습니다:
- 리소스 관리자 액세스
- 레지스트리 생성/삭제
- 이미지 푸시
- 이미지 풀
- 이미지 데이터 삭제
- 정책 변경
- 이미지 서명
또한 할당할 수 있는 내장 역할이 있으며, 사용자 정의 역할을 생성하는 것도 가능합니다.
인증
warning
레지스트리 이름에 대문자가 포함되어 있더라도 소문자를 사용하여 로그인, 푸시 및 풀 이미지를 수행하는 것이 매우 중요합니다.
ACR에 인증하는 방법은 4가지가 있습니다:
- Entra ID로: ACR에 인증하는 기본 방법입니다.
az acr login
명령을 사용하여 ACR에 인증합니다. 이 명령은~/.docker/config.json
파일에 자격 증명을 저장합니다. 또한, 클라우드 셸과 같이 도커 소켓에 액세스할 수 없는 환경에서 이 명령을 실행하는 경우,--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를 생성하기 위한 문서의 예제 스크립트:
#!/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"
Encryption
오직 프리미엄 SKU만이 이미지 및 기타 아티팩트에 대한 정지 시 암호화를 지원합니다.
Networking
오직 프리미엄 SKU만이 프라이빗 엔드포인트를 지원합니다. 다른 SKU는 공개 액세스만 지원합니다. 공개 엔드포인트는 <registry-name>.azurecr.io
형식을 가지며, 프라이빗 엔드포인트는 <registry-name>.privatelink.azurecr.io
형식을 가집니다. 이러한 이유로 레지스트리의 이름은 모든 Azure에서 고유해야 합니다.
Microsoft Defender for Cloud
이 기능은 레지스트리에서 이미지를 스캔하여 취약점을 찾을 수 있게 해줍니다.
Soft-delete
소프트 삭제 기능은 지정된 일수 내에 삭제된 레지스트리를 복구할 수 있게 해줍니다. 이 기능은 기본적으로 비활성화되어 있습니다.
Webhooks
레지스트리 내에서 웹훅을 생성하는 것이 가능합니다. 이 웹훅에서는 푸시 또는 삭제 작업이 수행될 때 요청이 전송될 URL을 지정해야 합니다. 또한, 웹훅은 영향을 받을 리포지토리(이미지)를 나타내기 위해 범위를 지정할 수 있습니다. 예를 들어, 'foo:*'는 리포지토리 'foo' 아래의 이벤트를 의미합니다.
공격자의 관점에서 볼 때, 레지스트리에서 어떤 작업을 수행하기 전에 이를 확인하고 필요시 일시적으로 제거하여 탐지를 피하는 것이 흥미롭습니다.
Connected registries
이 기능은 기본적으로 한 레지스트리에서 다른 레지스트리로 이미지를 미러링할 수 있게 해주며, 일반적으로 온프레미스에 위치합니다.
두 가지 모드가 있습니다: 읽기 전용 및 읽기/쓰기. 첫 번째 모드에서는 이미지를 소스 레지스트리에서 가져오기만 하고, 두 번째 모드에서는 이미지를 소스 레지스트리에 푸시할 수 있습니다.
클라이언트가 Azure에서 레지스트리에 접근할 수 있도록, 연결된 레지스트리를 사용할 때 토큰이 생성됩니다.
Runs & Tasks
Runs & Tasks는 Azure에서 일반적으로 로컬 또는 CI/CD 파이프라인에서 수행해야 했던 컨테이너 관련 작업을 실행할 수 있게 해줍니다. 예를 들어, 레지스트리에서 이미지를 빌드, 푸시 및 실행할 수 있습니다.
컨테이너를 빌드하고 실행하는 가장 쉬운 방법은 일반 Run을 사용하는 것입니다:
# 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
그러나, 이는 공격자의 관점에서 그다지 흥미롭지 않은 실행을 유발할 것입니다. 왜냐하면 그들에게는 관리되는 ID가 연결되어 있지 않기 때문입니다.
그러나, tasks는 system and user managed identity를 연결할 수 있습니다. 이러한 작업은 컨테이너에서 privileges를 escalate하는 데 유용합니다. 권한 상승 섹션에서는 작업을 사용하여 권한을 상승시키는 방법을 볼 수 있습니다.
Cache
캐시 기능은 외부 리포지토리에서 이미지를 다운로드하고 새로운 버전을 레지스트리에 저장할 수 있게 해줍니다. 이를 위해 Azure Vault에서 자격 증명을 선택하여 credentials configured를 설정해야 합니다.
이는 공격자의 관점에서 매우 흥미롭습니다. 왜냐하면 공격자가 자격 증명에 접근할 수 있는 충분한 권한이 있다면 외부 플랫폼으로 피벗할 수 있게 해주기 때문입니다. 외부 리포지토리에서 이미지를 다운로드하고 캐시를 구성하는 것은 persistence mechanism으로도 사용될 수 있습니다.
Enumeration
warning
레지스트리 이름에 대문자가 포함되어 있더라도, URL에 소문자만 사용해야 한다는 점이 매우 중요합니다.
# 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
참고 문헌
- https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli
- https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager
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 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.