Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/

This commit is contained in:
Translator
2025-05-01 11:39:55 +00:00
parent 320e116228
commit f97acef818
5 changed files with 30 additions and 30 deletions
@@ -12,7 +12,7 @@
### `codebuild:StartBuild` | `codebuild:StartBuildBatch`
이 권한 중 하나만 있으면 새로운 buildspec으로 빌드를 트리거하고 프로젝트에 할당된 iam 역할의 토큰을 탈취할 수 있습니다:
이 권한 중 하나만 있으면 새로운 buildspec으로 빌드를 트리거하고 프로젝트에 할당된 iam 역할의 토큰을 훔칠 수 있습니다:
{{#tabs }}
{{#tab name="StartBuild" }}
@@ -67,7 +67,7 @@ aws codebuild start-build-batch --project <project-name> --buildspec-override fi
### `iam:PassRole`, `codebuild:CreateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`)
**`iam:PassRole`, `codebuild:CreateProject`, 및 `codebuild:StartBuild` 또는 `codebuild:StartBuildBatch`** 권한을 가진 공격자는 실행 중인 코드를 생성하여 **모든 codebuild IAM 역할로 권한을 상승시킬 수 있습니다.**
**`iam:PassRole`, `codebuild:CreateProject`, 및 `codebuild:StartBuild` 또는 `codebuild:StartBuildBatch`** 권한을 가진 공격자는 실행 중인 코드를 생성하여 **모든 codebuild IAM 역할로 권한을 상승시킬 수 있습니다**.
{{#tabs }}
{{#tab name="Example1" }}
@@ -176,15 +176,15 @@ Wait a few seconds to maybe a couple minutes and view the POST request with data
> [!WARNING]
> **Codebuild 컨테이너**에서 파일 `/codebuild/output/tmp/env.sh`는 **메타데이터 자격 증명**에 접근하는 데 필요한 모든 환경 변수를 포함합니다.
> 이 파일에는 **환경 변수 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`**가 포함되어 있으며, 이는 자격 증명에 접근하기 위한 **URL 경로**를 포함합니다. 이 경로는 `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420`와 같은 형식일 것입니다.
> 이 파일에는 **자격 증명에 접근하기 위한 URL 경로**를 포함하는 **환경 변수 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`**가 포함되어 있니다. 이는 `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420`와 같은 형식일 것입니다.
> 이를 URL **`http://169.254.170.2/`**에 추가하면 역할 자격 증명을 덤프할 수 있습니다.
> 또한, **환경 변수 `ECS_CONTAINER_METADATA_URI`**도 포함되어 있으며, 이는 **컨테이너에 대한 메타데이터 정보**를 얻기 위한 전체 URL을 포함합니다.
> 또한, **컨테이너에 대한 메타데이터 정보를 얻기 위한 전체 URL**을 포함하는 **환경 변수 `ECS_CONTAINER_METADATA_URI`**도 포함되어 있니다.
### `iam:PassRole`, `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`)
이전 섹션과 마찬가지로, 빌드 프로젝트를 생성하는 대신 수정할 수 있다면, IAM 역할을 지정하고 토큰을 탈취할 수 있습니다.
이전 섹션과 마찬가지로, 빌드 프로젝트를 생성하는 대신 수정할 수 있다면 IAM 역할을 지정하고 토큰을 훔칠 수 있습니다.
```bash
REV_PATH="/tmp/codebuild_pwn.json"
@@ -302,7 +302,7 @@ aws codebuild start-build-batch --project-name codebuild-demo-project
### SSM
**SSM 세션을 시작할 수 있는 충분한 권한이 있는 경우** 빌드 중인 **Codebuild 프로젝트 내부에 들어갈 수 있습니다.**
**SSM 세션을 시작할 수 있는 충분한 권한**이 있으면 **구축 중인 Codebuild 프로젝트**에 접근할 수 있습니다.
Codebuild 프로젝트는 중단점이 필요합니다:
@@ -325,7 +325,7 @@ aws ssm start-session --target <sessionTarget> --region <region>
특정 CodeBuild 프로젝트의 빌드를 시작/재시작할 수 있는 공격자는 공격자가 쓰기 권한이 있는 S3 버킷에 `buildspec.yml` 파일을 저장하는 경우, CodeBuild 프로세스에서 명령 실행을 얻을 수 있습니다.
참고: 권한 상승은 CodeBuild 작업자가 공격자의 역할과 다른 역할(더 높은 권한이 있기를 바람)을 가질 때만 관련이 있습니다.
참고: 권한 상승은 CodeBuild 작업자가 공격자의 역할과 다르고, 더 높은 권한을 가진 경우에만 관련이 있습니다.
```bash
aws s3 cp s3://<build-configuration-files-bucket>/buildspec.yml ./
@@ -354,7 +354,7 @@ commands:
**Impact:** AWS CodeBuild 작업자가 사용하는 역할로의 직접적인 권한 상승, 일반적으로 높은 권한을 가집니다.
> [!WARNING]
> buildspec이 zip 형식으로 예상될 수 있으므로, 공격자는 다운로드, 압축 해제, 루트 디렉토리에서 `buildspec.yml` 수정, 다시 압축 업로드해야 합니다.
> buildspec이 zip 형식으로 예상될 수 있으므로, 공격자는 루트 디렉토리에서 `buildspec.yml`을 다운로드, 압축 해제, 수정한 후 다시 압축하고 업로드해야 합니다.
자세한 내용은 [여기](https://www.shielder.com/blog/2023/07/aws-codebuild--s3-privilege-escalation/)에서 확인할 수 있습니다.
@@ -12,7 +12,7 @@ ECS에 대한 **더 많은 정보**는 다음에서 확인할 수 있습니다:
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask`
`iam:PassRole`, `ecs:RegisterTaskDefinition``ecs:RunTask` 권한을 악용하는 공격자는 **메타데이터 자격 증명을 훔치는** **악성 컨테이너** **새로운 작업 정의**를 **생성**하고 **실행**할 수 있습니다.
ECS에서 `iam:PassRole`, `ecs:RegisterTaskDefinition``ecs:RunTask` 권한을 악용하는 공격자는 **악성 컨테이너**가 포함된 **새로운 작업 정의**를 **생성**하고 이를 **실행**할 수 있습니다.
{{#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.site와 같은 사이트에서 웹훅을 생성합니다.
```bash
# Create file container-definition.json
@@ -100,7 +100,7 @@ aws ecs deregister-task-definition --task-definition iam_exfiltration:1
### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)`
이전 예제와 마찬가지로, 공격자가 ECS에서 **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** 또는 **`ecs:CreateService`** 권한을 악용하면 **악성 컨테이너**가 포함된 **새로운 작업 정의**를 **생성하고, 최소 1개의 작업이 실행되는 새로운 서비스를 생성하여 이를 실행할 수 있습니다.**
이전 예제와 마찬가지로 공격자가 ECS에서 **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** 또는 **`ecs:CreateService`** 권한을 악용하면 **악성 컨테이너**가 포함된 **새로운 작업 정의**를 **생성하고, 최소 1개의 작업이 실행되는 새로운 서비스를 생성하여 실행할 수 있습니다.**
```bash
# Generate task definition with rev shell
aws ecs register-task-definition --family iam_exfiltration \
@@ -127,7 +127,7 @@ aws ecs update-service --cluster <CLUSTER NAME> \
### `iam:PassRole`, (`ecs:UpdateService|ecs:CreateService)`
제로, 이러한 권한만으로도 임의의 역할을 가진 컨테이너에서 임의의 명령을 실행하기 위해 오버라이드를 사용할 수 있습니다.
실, 이러한 권한만으로도 임의의 역할을 가진 컨테이너에서 임의의 명령을 실행하기 위해 오버라이드를 사용할 수 있습니다.
```bash
aws ecs run-task \
--task-definition "<task-name>" \
@@ -244,7 +244,7 @@ TODO: 공격자가 제어하는 머신에서 작업이 실행되도록 다른 AW
> [!NOTE]
> TODO: 테스트하기
`ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, 및 `ecs:DescribeTaskSets` 권한을 가진 공격자는 **기존 ECS 서비스에 대해 악성 작업 세트를 생성하고 기본 작업 세트를 업데이트**할 수 있습니다. 이를 통해 공격자 **서비스 내에서 임의의 코드를 실행**할 수 있니다.
`ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, 및 `ecs:DescribeTaskSets` 권한을 가진 공격자는 **기존 ECS 서비스에 대해 악성 작업 세트를 생성하고 기본 작업 세트를 업데이트**할 수 있습니다. 이 공격자 **서비스 내에서 임의의 코드를 실행**할 수 있게 합니다.
```bash
bashCopy code# Register a task definition with a reverse shell
echo '{
@@ -270,7 +270,7 @@ 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
```
**잠재적 영향**: 영향을 받는 서비스에서 임의의 코드를 실행하여 기능에 영향을 거나 민감한 데이터를 유출할 수 있습니다.
**잠재적 영향**: 영향을 받는 서비스에서 임의의 코드를 실행하여 기능에 영향을 미치거나 민감한 데이터를 유출할 수 있습니다.
## 참조
@@ -20,7 +20,7 @@ aws sns publish --topic-arn <value> --message <value>
### `sns:Subscribe`
공격자는 SNS 주제에 구독할 수 있으며, 이로 인해 메시지에 대한 무단 접근을 얻거나 해당 주제에 의존하는 애플리케이션의 정상적인 기능을 방해할 수 있습니다.
공격자는 SNS 주제에 구독할 수 있으며, 이로 인해 메시지에 대한 무단 접근을 얻거나 주제에 의존하는 애플리케이션의 정상적인 기능을 방해할 수 있습니다.
```bash
aws sns subscribe --topic-arn <value> --protocol <value> --endpoint <value>
```
@@ -28,10 +28,10 @@ aws sns subscribe --topic-arn <value> --protocol <value> --endpoint <value>
### `sns:AddPermission`
공격자는 무단 사용자 또는 서비스에 SNS 주제에 대한 접근 권한을 부여할 수 있으며, 잠재적으로 추가 권한을 얻을 수 있습니다.
공격자는 무단 사용자 또는 서비스에 SNS 주제에 대한 접근 권한을 부여하여 추가 권한을 얻을 수 있습니다.
```css
aws sns add-permission --topic-arn <value> --label <value> --aws-account-id <value> --action-name <value>
```
**잠재적 영향**: 무단 사용자 또는 서비스에 의한 주제에 대한 무단 접근, 메시지 노출 또는 주제 조작, 주제에 의존하는 애플리케이션의 정상적인 기능 중단.
**잠재적 영향**: 승인되지 않은 사용자 또는 서비스에 의한 주제에 대한 무단 접근, 메시지 노출 또는 주제 조작, 주제에 의존하는 애플리케이션의 정상적인 기능 중단.
{{#include ../../../banners/hacktricks-training.md}}
@@ -59,11 +59,11 @@ aws stepfunctions test-state --definition file://stateDefinition.json --role-arn
"status": "SUCCEEDED"
}
```
**잠재적 영향**: 승인되지 않은 워크플로우 실행 조작 민감한 리소스 접근, 이는 심각한 보안 위반으로 이어질 수 있습니다.
**Potential Impact**: 무단으로 워크플로우 실행하고 조작하며 민감한 리소스 접근할 수 있어, 심각한 보안 위반으로 이어질 수 있습니다.
### `states:CreateStateMachine` & `iam:PassRole` & (`states:StartExecution` | `states:StartSyncExecution`)
**`states:CreateStateMachine`** 및 **`iam:PassRole`** 권한을 가진 공격자는 상태 기계를 생성하고 이 IAM 역할 제공할 수 있어, 역할의 권한으로 다른 AWS 서비스에 대한 승인되지 않은 접근을 가능하게 합니다. 이전의 권한 상승 기법(**`states:TestState`** & **`iam:PassRole`**)과는 달리, 이 기법은 스스로 실행되지 않으며, 상태 기계에서 실행을 시작하기 위해 **`states:StartExecution`** 또는 **`states:StartSyncExecution`** 권한이 필요합니다 (**`states:StartSyncExecution`**은 **표준 워크플로우에 대해 사용할 수 없으며, **표현 상태 기계**에만 해당됩니다).
**`states:CreateStateMachine`** 및 **`iam:PassRole`** 권한을 가진 공격자는 상태 기계를 생성하고 이를 위해 어떤 IAM 역할이든 제공할 수 있어, 역할의 권한으로 다른 AWS 서비스에 무단으로 접근할 수 있습니다. 이전의 권한 상승 기법(**`states:TestState`** & **`iam:PassRole`**)과는 달리, 이 기법은 스스로 실행되지 않으며, 상태 기계에서 실행을 시작하기 위해 **`states:StartExecution`** 또는 **`states:StartSyncExecution`** 권한이 필요합니다 (**`states:StartSyncExecution`**은 **표준 워크플로우에 대해 사용할 수 없으며, **표현 상태 기계**에만 해당됩니다).
```bash
# Create a state machine
aws states create-state-machine --name <value> --definition <value> --role-arn <value> [--type <STANDARD | EXPRESS>] [--logging-configuration <value>]\
@@ -140,7 +140,7 @@ aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:1
**`states:UpdateStateMachine`** 권한을 가진 공격자는 상태 기계의 정의를 수정할 수 있으며, 권한 상승으로 이어질 수 있는 추가적인 은밀한 상태를 추가할 수 있습니다. 이렇게 하면, 정당한 사용자가 상태 기계의 실행을 시작할 때 이 새로운 악의적인 은밀한 상태가 실행되고 권한 상승이 성공하게 됩니다.
상태 기계와 연결된 IAM 역할이 얼마나 관대하게 설정되어 있는지에 따라 공격자는 가지 상황에 직면할 수 있습니다:
상태 기계와 연결된 IAM 역할이 얼마나 관대하에 따라 공격자는 2가지 상황에 직면할 수 있습니다:
1. **관대한 IAM 역할**: 상태 기계와 연결된 IAM 역할이 이미 관대하다면(예: **`arn:aws:iam::aws:policy/AdministratorAccess`** 정책이 첨부되어 있는 경우), 권한 상승을 위해 **`iam:PassRole`** 권한이 필요하지 않습니다. 상태 기계 정의만으로도 충분하기 때문입니다.
2. **비관대한 IAM 역할**: 이전 경우와는 달리, 여기서 공격자는 상태 기계 정의를 수정하는 것 외에도 상태 기계에 관대한 IAM 역할을 연결하기 위해 **`iam:PassRole`** 권한이 필요합니다.
@@ -148,10 +148,10 @@ aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:1
aws states update-state-machine --state-machine-arn <value> [--definition <value>] [--role-arn <value>] [--logging-configuration <value>] \
[--tracing-configuration <enabled=true|false>] [--publish | --no-publish] [--version-description <value>]
```
다음 예제는 HelloWorld Lambda 함수를 호출하는 합법적인 상태 기계를 업데이트하여 사용자 **`unprivilegedUser`**를 **`administrator`** IAM 그룹에 추가하는 추가 상태를 추가하는 방법을 보여줍니다. 이렇게 하면 합법적인 사용자가 업데이트된 상태 기계의 실행을 시작할 때 이 새로운 악의적인 스텔스 상태가 실행되고 권한 상승이 성공하게 됩니다.
다음 예제는 HelloWorld Lambda 함수를 호출하는 정당한 상태 머신을 업데이트하여 사용자 **`unprivilegedUser`**를 **`administrator`** IAM 그룹에 추가하는 추가 상태를 추가하는 방법을 보여줍니다. 이렇게 하면 정당한 사용자가 업데이트된 상태 머신의 실행을 시작할 때 이 새로운 악의적인 스텔스 상태가 실행되고 권한 상승이 성공적으로 이루어집니다.
> [!WARNING]
> 상태 기계에 관대한 IAM 역할이 연결되어 있지 않은 경우, 관대한 IAM 역할을 연결하기 위해 IAM 역할을 업데이트하는 **`iam:PassRole`** 권한도 필요합니다 (예: **`arn:aws:iam::aws:policy/AdministratorAccess`** 정책이 연결된 역할).
> 상태 머신에 관대한 IAM 역할이 연결되어 있지 않은 경우, 관대한 IAM 역할을 연결하기 위해 IAM 역할을 업데이트하는 **`iam:PassRole`** 권한도 필요합니다 (예: **`arn:aws:iam::aws:policy/AdministratorAccess`** 정책이 연결된 역할).
{{#tabs }}
{{#tab name="Legit State Machine" }}
@@ -218,7 +218,7 @@ aws states update-state-machine --state-machine-arn <value> [--definition <value
{{#endtab }}
{{#endtabs }}
- **명령어** **정상 상태 머신**을 **업데이트**하기 위해 실행되었습니다:
- **명령어** 실행하여 **정상 상태 머신**을 **업데이트**:
```bash
aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLambda --definition file://StateMachineUpdate.json
{
@@ -18,14 +18,14 @@
- **wappalyzer** 브라우저 플러그인 사용
- burp 사용(**웹 스파이더링**) 또는 페이지를 수동으로 탐색하여 모든 **리소스** **로드**된 내용이 기록에 저장됩니다.
- 다음 도메인에서 **리소스 확인**:
- 다음과 같은 도메인에서 **리소스 확인**:
```
http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
```
- **CNAMES** 확인, `resources.domain.com` `bucket.s3.amazonaws.com`의 CNAME을 가질 수 있습니다.
- **CNAMES** 확인: `resources.domain.com` `bucket.s3.amazonaws.com`의 CNAME을 가질 수 있습니다.
- **[s3dns](https://github.com/olizimmermann/s3dns)** – DNS 트래픽을 분석하여 클라우드 스토리지 버킷(S3, GCP, Azure)을 수동으로 식별하는 경량 DNS 서버입니다. CNAME을 감지하고, 해상도 체인을 따르며, 버킷 패턴을 일치시켜 브루트 포스 또는 API 기반 발견의 조용한 대안을 제공합니다. 정찰 및 OSINT 워크플로에 적합합니다.
- [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/), 이미 **발견된 공개 버킷**이 있는 웹사이트입니다.
- **버킷 이름**과 **버킷 도메인 이름**은 **같아야 합니다.**
@@ -59,7 +59,7 @@ cat subdomains.txt | tr "." "\n" | sort -u >> /tmp/words-hosts-s3.txt
# 공격할 도메인 및 서브도메인 목록을 기반으로 변형 생성
goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
## 이전 도구는 서브도메인에 대한 변형 생성을 전문으로 하며, 해당 목록을 필터링합니다.
## 이전 도구는 서브도메인에 대한 변형 생성을 전문으로 하므로 해당 목록을 필터링합니다.
<strong>### "."로 끝나는 줄 제거
</strong>cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
### TLD 없는 목록 생성
@@ -112,7 +112,7 @@ Non-authoritative answer:
버킷의 개방성을 테스트하기 위해 사용자는 웹 브라우저에 URL을 입력하기만 하면 됩니다. 개인 버킷은 "Access Denied"로 응답합니다. 공개 버킷은 저장된 첫 1,000개의 객체를 나열합니다.
모두에게 열려있음:
모두에게 열려 있습니다:
![](<../../../images/image (201).png>)
@@ -128,7 +128,7 @@ CLI로도 확인할 수 있습니다:
#Opcionally you can select the region if you now it
aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]
```
버킷에 도메인 이름이 없는 경우, 열거하려고 할 때 **버킷 이름만 입력**하고 전체 AWS S3 도메인은 입력하지 마십시오. 예: `s3://<BUCKETNAME>`
버킷에 도메인 이름이 없는 경우, 열거하려고 할 때 **버킷 이름만 입력**하고 전체 AWSs3 도메인은 입력하지 마십시오. 예: `s3://<BUCKETNAME>`
### 공개 URL 템플릿
```
@@ -137,7 +137,7 @@ https://{user_provided}.s3.amazonaws.com
### 공개 버킷에서 계정 ID 가져오기
새로운 **`S3:ResourceAccount`** **정책 조건 키**를 활용하여 AWS 계정을 확인할 수 있습니다. 이 조건은 **계정이 있는 S3 버킷**에 따라 접근을 **제한**합니다 (다른 계정 기반 정책은 요청하는 주체가 있는 계정에 따라 제한합니다).\
정책에 **와일드카드** 포함 수 있기 때문에 **한 번에 하나의 숫자**로 계정 번호를 찾는 것이 가능합니다.
정책에 **와일드카드** 포함 수 있기 때문에 **한 번에 하나의 숫자**로 계정 번호를 찾는 것이 가능합니다.
이 도구는 이 과정을 자동화합니다:
```bash
@@ -165,7 +165,7 @@ curl -X GET "[bucketname].amazonaws.com/" \
### 루트 계정 열거를 위한 사용된 이메일
[**이 블로그 게시물**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)에서 설명한 바와 같이, S3 버킷에 대한 ACL을 통해 이메일 주소에 권한을 부여하려고 시도함으로써 해당 이메일 주소가 AWS 계정과 관련이 있는지 확인할 수 있습니다. 오류가 발생하지 않으면, 해당 이메일이 일부 AWS 계정의 루트 사용자라는 의미니다.
[**이 블로그 게시물**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)에서 설명한 바와 같이, S3 버킷에 대한 ACL을 통해 이메일 주소에 권한을 부여하려고 시도함으로써 해당 이메일 주소가 AWS 계정과 관련이 있는지 확인할 수 있습니다. 오류가 발생하지 않으면, 해당 이메일이 일부 AWS 계정의 루트 사용자임을 의미니다.
```python
s3_client.put_bucket_acl(
Bucket=bucket_name,