mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-services/aws-cognito-
This commit is contained in:
+41
-27
@@ -4,13 +4,13 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Identity pools는 사용자가 **임시 자격 증명**을 획득할 수 있도록 하여 중요한 역할을 합니다. 이러한 자격 증명은 Amazon S3 및 DynamoDB를 포함한 다양한 AWS 서비스에 접근하는 데 필수적입니다. Identity pools의 주목할 만한 기능은 익명 게스트 사용자와 사용자 인증을 위한 다양한 신원 제공자를 지원한다는 점입니다. 지원되는 신원 제공자는 다음과 같습니다:
|
||||
Identity pools는 사용자가 **임시 자격 증명**을 획득할 수 있도록 하여 중요한 역할을 합니다. 이러한 자격 증명은 Amazon S3 및 DynamoDB를 포함한 다양한 AWS 서비스에 접근하는 데 필수적입니다. Identity pools의 주목할 만한 기능은 익명 게스트 사용자와 사용자 인증을 위한 다양한 ID 공급자를 모두 지원한다는 점입니다. 지원되는 ID 공급자는 다음과 같습니다:
|
||||
|
||||
- Amazon Cognito user pools
|
||||
- Facebook, Google, Login with Amazon, Sign in with Apple과 같은 소셜 로그인 옵션
|
||||
- OpenID Connect (OIDC) 호환 제공자
|
||||
- SAML (Security Assertion Markup Language) 신원 제공자
|
||||
- 개발자 인증 신원
|
||||
- OpenID Connect (OIDC) 호환 공급자
|
||||
- SAML (Security Assertion Markup Language) ID 공급자
|
||||
- 개발자 인증 ID
|
||||
```python
|
||||
# Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows:
|
||||
import boto3
|
||||
@@ -35,15 +35,15 @@ print(response)
|
||||
```
|
||||
### Cognito Sync
|
||||
|
||||
Identity Pool 세션을 생성하려면 먼저 **Identity ID를 생성해야** 합니다. 이 Identity ID는 **해당 사용자의 세션 식별자**입니다. 이러한 식별자는 최대 20개의 데이터 세트를 가질 수 있으며, 각 데이터 세트는 최대 1MB의 키-값 쌍을 저장할 수 있습니다.
|
||||
Identity Pool 세션을 생성하려면 먼저 **Identity ID를 생성해야** 합니다. 이 Identity ID는 **해당 사용자의 세션 식별자**입니다. 이러한 식별자는 최대 20개의 데이터 세트를 가질 수 있으며, 최대 1MB의 키-값 쌍을 저장할 수 있습니다.
|
||||
|
||||
이는 **사용자의 정보를 유지하는 데 유용합니다** (항상 동일한 Identity ID를 사용하는 사용자).
|
||||
|
||||
또한, 서비스 **cognito-sync**는 **이 정보를 관리하고 동기화하는** 서비스를 제공합니다 (데이터 세트에서, 스트림 및 SNS 메시지로 정보를 전송하는 등).
|
||||
게다가, 서비스 **cognito-sync**는 **이 정보를 관리하고 동기화하는** 서비스를 제공합니다 (데이터 세트에서, 스트림 및 SNS 메시지로 정보를 전송하는 등).
|
||||
|
||||
### Tools for pentesting
|
||||
|
||||
- [Pacu](https://github.com/RhinoSecurityLabs/pacu), AWS 취약점 탐지 프레임워크로, 이제 "cognito\_\_enum" 및 "cognito\_\_attack" 모듈이 포함되어 있어 계정의 모든 Cognito 자산을 자동으로 열거하고 약한 구성, 접근 제어에 사용되는 사용자 속성 등을 플래그하며, 사용자 생성(여기에는 MFA 지원 포함) 및 수정 가능한 사용자 정의 속성, 사용 가능한 Identity Pool 자격 증명, ID 토큰에서 가정 가능한 역할 등을 기반으로 한 권한 상승을 자동화합니다.
|
||||
- [Pacu](https://github.com/RhinoSecurityLabs/pacu), AWS 취약점 탐지 프레임워크로, 이제 "cognito\_\_enum" 및 "cognito\_\_attack" 모듈이 포함되어 있어 계정의 모든 Cognito 자산을 자동으로 열거하고 약한 구성, 접근 제어에 사용되는 사용자 속성 등을 플래그하며, 사용자 생성(여기에는 MFA 지원 포함) 및 수정 가능한 사용자 정의 속성, 사용 가능한 Identity Pool 자격 증명, ID 토큰에서 가정 가능한 역할에 기반한 권한 상승을 자동화합니다.
|
||||
|
||||
모듈 기능에 대한 설명은 [블로그 게시물](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2) 2부를 참조하십시오. 설치 지침은 주요 [Pacu](https://github.com/RhinoSecurityLabs/pacu) 페이지를 참조하십시오.
|
||||
|
||||
@@ -61,7 +61,7 @@ Pacu (new:test) > run cognito__enum
|
||||
```
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner)는 원치 않는 계정 생성 및 아이덴티티 풀 상승을 포함하여 Cognito에 대한 다양한 공격을 구현하는 파이썬 CLI 도구입니다.
|
||||
|
||||
#### Installation
|
||||
#### 설치
|
||||
```bash
|
||||
$ pip install cognito-scanner
|
||||
```
|
||||
@@ -75,7 +75,7 @@ $ cognito-scanner --help
|
||||
|
||||
### 인증되지 않음
|
||||
|
||||
공격자가 인증되지 않은 사용자로서 Cognito 앱에서 **AWS 자격 증명**을 얻기 위해 알아야 할 유일한 것은 **Identity Pool ID**이며, 이 **ID는 웹/모바일** **애플리케이션**에 하드코딩되어 있어야 사용될 수 있습니다. ID는 다음과 같이 보입니다: `eu-west-1:098e5341-8364-038d-16de-1865e435da3b` (무작위 대입 공격이 불가능합니다).
|
||||
인증되지 않은 사용자로서 Cognito 앱에서 **AWS 자격 증명**을 **얻기 위해** 공격자가 알아야 할 유일한 것은 **Identity Pool ID**이며, 이 **ID는 웹/모바일** **애플리케이션**에 하드코딩되어 있어야 사용될 수 있습니다. ID는 다음과 같이 보입니다: `eu-west-1:098e5341-8364-038d-16de-1865e435da3b` (무작위 대입 공격이 불가능합니다).
|
||||
|
||||
> [!TIP]
|
||||
> 기본적으로 **IAM Cognito 인증되지 않은 역할은** `Cognito_<Identity Pool name>Unauth_Role`로 호출됩니다.
|
||||
@@ -106,7 +106,7 @@ r = requests.post(url, json=params, headers=headers)
|
||||
|
||||
print(r.json())
|
||||
```
|
||||
다음 **aws cli 명령어**를 사용할 수도 있습니다:
|
||||
다음 **aws cli 명령어**를 사용할 수 있습니다:
|
||||
```bash
|
||||
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
|
||||
aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --no-sign
|
||||
@@ -116,7 +116,7 @@ aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --
|
||||
|
||||
### Enhanced vs Basic Authentication flow
|
||||
|
||||
이전 섹션은 **기본 향상된 인증 흐름**을 따랐습니다. 이 흐름은 생성된 IAM 역할 세션에 **제한적인** [**세션 정책**](../../aws-basic-information/index.html#session-policies)을 설정합니다. 이 정책은 세션이 [**이 목록의 서비스만 사용할 수 있도록**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services) 허용합니다 (역할이 다른 서비스에 접근할 수 있었더라도).
|
||||
이전 섹션은 **기본 향상된 인증 흐름**을 따랐습니다. 이 흐름은 생성된 IAM 역할 세션에 **제한적인** [**세션 정책**](../../aws-basic-information/index.html#session-policies)을 설정합니다. 이 정책은 세션이 [**이 목록의 서비스만 사용하도록 허용**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services)합니다 (역할이 다른 서비스에 접근할 수 있더라도).
|
||||
|
||||
그러나 **Identity pool에 "Basic (Classic) Flow"가 활성화되어 있으면**, 사용자는 해당 흐름을 사용하여 **제한적인 세션 정책이 없는** 세션을 얻을 수 있습니다.
|
||||
```bash
|
||||
@@ -131,45 +131,59 @@ aws cognito-identity get-open-id-token --identity-id <identity_id> --no-sign
|
||||
aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<role_name>" --role-session-name sessionname --web-identity-token <token> --no-sign
|
||||
```
|
||||
> [!WARNING]
|
||||
> 이 **오류**가 발생하는 경우, **기본 흐름이 활성화되지 않았기 때문입니다 (기본값)**
|
||||
> 이 **오류**가 발생하는 이유는 **기본 흐름이 활성화되지 않았기 때문입니다 (기본값)**
|
||||
|
||||
> `An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.`
|
||||
|
||||
IAM 자격 증명이 있는 경우 [어떤 접근 권한이 있는지 확인하고](../../index.html#whoami) [권한 상승을 시도하세요](../../aws-privilege-escalation/index.html).
|
||||
IAM 자격 증명이 설정되어 있다면 [어떤 접근 권한이 있는지 확인하고](../../index.html#whoami) [권한 상승을 시도하세요](../../aws-privilege-escalation/index.html).
|
||||
|
||||
### 인증된 사용자
|
||||
|
||||
> [!NOTE]
|
||||
> **인증된 사용자**는 아마도 **다른 권한**이 부여될 것이므로, **앱 내에서 가입할 수 있다면**, 그렇게 시도하여 새로운 자격 증명을 얻으세요.
|
||||
> **인증된 사용자**는 아마도 **다른 권한**이 부여될 것이므로, **앱 내에서 가입할 수 있다면** 그렇게 시도하여 새로운 자격 증명을 얻으세요.
|
||||
|
||||
**Identity Pool**에 접근하는 **인증된 사용자**를 위한 **역할**도 있을 수 있습니다.
|
||||
**인증된 사용자**가 **Identity Pool**에 접근할 수 있는 **역할**이 있을 수도 있습니다.
|
||||
|
||||
이를 위해 **아이덴티티 제공자**에 접근해야 할 수 있습니다. 만약 그것이 **Cognito User Pool**이라면, 기본 동작을 악용하여 **직접 새로운 사용자를 생성할 수 있을지도 모릅니다**.
|
||||
이를 위해서는 **아이덴티티 제공자**에 접근할 수 있어야 합니다. 만약 그것이 **Cognito User Pool**이라면, 기본 동작을 악용하여 **직접 새로운 사용자를 생성할 수 있을지도 모릅니다**.
|
||||
|
||||
> [!TIP]
|
||||
> **IAM Cognito 인증 역할은 기본적으로** `Cognito_<Identity Pool name>Auth_Role`로 생성됩니다.
|
||||
|
||||
어쨌든, **다음 예제**는 **Identity Pool**에 접근하기 위해 사용되는 **Cognito User Pool**에 이미 로그인했다고 가정합니다 (다른 유형의 아이덴티티 제공자도 구성될 수 있다는 점을 잊지 마세요).
|
||||
어쨌든, **다음 예제**는 이미 **Identity Pool**에 접근하기 위해 사용된 **Cognito User Pool**에 로그인한 상태를 가정합니다 (다른 유형의 아이덴티티 제공자도 구성될 수 있다는 점을 잊지 마세요).
|
||||
|
||||
<pre class="language-bash"><code class="lang-bash">aws cognito-identity get-id \
|
||||
<pre class="language-bash"><code class="lang-bash">
|
||||
# 업데이트된 형식
|
||||
aws cognito-identity get-id \
|
||||
--identity-pool-id <identity_pool_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
--logins '{"cognito-idp.<region>.amazonaws.com/<user_pool_id>": "<ID_TOKEN>"}'
|
||||
|
||||
# 이전 명령 응답에서 identity_id를 가져옵니다
|
||||
aws cognito-identity get-credentials-for-identity \
|
||||
--identity-id <identity_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
--logins '{"cognito-idp.<region>.amazonaws.com/<user_pool_id>": "<ID_TOKEN>"}'
|
||||
|
||||
|
||||
# IdToken에서 사용자가 User Pool 그룹으로 접근할 수 있는 역할을 찾을 수 있습니다
|
||||
# --custom-role-arn을 사용하여 특정 역할에 대한 자격 증명을 가져옵니다
|
||||
aws cognito-identity get-credentials-for-identity \
|
||||
--identity-id <identity_id> \
|
||||
<strong> --custom-role-arn <role_arn> \
|
||||
</strong> --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
--custom-role-arn <role_arn> \
|
||||
--logins '{"cognito-idp.<region>.amazonaws.com/<user_pool_id>": "<ID_TOKEN>"}'
|
||||
</code></pre>
|
||||
|
||||
> **더 이상 사용되지 않는 형식** — 현재 AWS CLI와 함께 작동하지 않을 수 있습니다:
|
||||
<pre class="language-bash"><code class="lang-bash">
|
||||
aws cognito-identity get-id \
|
||||
--identity-pool-id <identity_pool_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<user_pool_id>=<ID_TOKEN>
|
||||
|
||||
aws cognito-identity get-credentials-for-identity \
|
||||
--identity-id <identity_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<user_pool_id>=<ID_TOKEN>
|
||||
|
||||
aws cognito-identity get-credentials-for-identity \
|
||||
--identity-id <identity_id> \
|
||||
--custom-role-arn <role_arn> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<user_pool_id>=<ID_TOKEN>
|
||||
</code></pre>
|
||||
|
||||
> [!WARNING]
|
||||
> 사용자가 로그인하는 아이덴티티 제공자에 따라 **다른 IAM 역할을 구성할 수 있으며**, 심지어 **사용자**에 따라 (클레임을 사용하여) 다를 수 있습니다. 따라서 동일한 또는 다른 제공자를 통해 다양한 사용자에 접근할 수 있다면, **모든 사용자의 IAM 역할에 로그인하고 접근하는 것이 가치가 있을 수 있습니다**.
|
||||
> 사용자가 로그인하는 아이덴티티 제공자에 따라 **다른 IAM 역할을 구성할 수 있습니다** 또는 **사용자**에 따라 (클레임을 사용하여). 따라서 동일한 또는 다른 제공자를 통해 다양한 사용자에 접근할 수 있다면, **모든 사용자의 IAM 역할에 로그인하고 접근하는 것이 가치가 있을 수 있습니다**.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user