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:
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 3.5 MiB |
+29
-29
@@ -4,13 +4,13 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
아이덴티티 풀은 사용자가 **임시 자격 증명**을 획득할 수 있도록 하여 중요한 역할을 합니다. 이러한 자격 증명은 Amazon S3 및 DynamoDB를 포함한 다양한 AWS 서비스에 접근하는 데 필수적입니다. 아이덴티티 풀의 주목할 만한 기능은 익명 게스트 사용자와 사용자 인증을 위한 다양한 아이덴티티 제공자를 지원한다는 점입니다. 지원되는 아이덴티티 제공자는 다음과 같습니다:
|
||||
Identity pools는 사용자가 **임시 자격 증명**을 획득할 수 있도록 하여 중요한 역할을 합니다. 이러한 자격 증명은 Amazon S3 및 DynamoDB를 포함한 다양한 AWS 서비스에 접근하는 데 필수적입니다. Identity pools의 주목할 만한 기능은 익명 게스트 사용자와 사용자 인증을 위한 다양한 신원 제공자를 지원한다는 점입니다. 지원되는 신원 제공자는 다음과 같습니다:
|
||||
|
||||
- Amazon Cognito 사용자 풀
|
||||
- Facebook, Google, Amazon으로 로그인, Apple로 로그인과 같은 소셜 로그인 옵션
|
||||
- Amazon Cognito user pools
|
||||
- Facebook, Google, Login with Amazon, Sign in with Apple과 같은 소셜 로그인 옵션
|
||||
- OpenID Connect (OIDC) 호환 제공자
|
||||
- SAML (Security Assertion Markup Language) 아이덴티티 제공자
|
||||
- 개발자 인증 아이덴티티
|
||||
- SAML (Security Assertion Markup Language) 신원 제공자
|
||||
- 개발자 인증 신원
|
||||
```python
|
||||
# Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows:
|
||||
import boto3
|
||||
@@ -39,17 +39,17 @@ Identity Pool 세션을 생성하려면 먼저 **Identity ID를 생성해야**
|
||||
|
||||
이는 **사용자의 정보를 유지하는 데 유용합니다** (항상 동일한 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) 페이지를 참조하십시오.
|
||||
|
||||
#### Usage
|
||||
|
||||
주어진 Identity Pool 및 사용자 풀 클라이언트에 대해 사용자 생성을 시도하고 모든 권한 상승 벡터를 시도하는 샘플 cognito\_\_attack 사용법:
|
||||
샘플 cognito\_\_attack 사용법으로 주어진 Identity Pool 및 사용자 풀 클라이언트에 대해 사용자 생성 및 모든 권한 상승 벡터를 시도합니다:
|
||||
```bash
|
||||
Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools
|
||||
us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
|
||||
@@ -59,9 +59,9 @@ us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
|
||||
```bash
|
||||
Pacu (new:test) > run cognito__enum
|
||||
```
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner)는 원치 않는 계정 생성 및 아이덴티티 풀 상승을 포함하여 Cognito에 대한 다양한 공격을 구현하는 파이썬 기반 CLI 도구입니다.
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner)는 원치 않는 계정 생성 및 아이덴티티 풀 상승을 포함하여 Cognito에 대한 다양한 공격을 구현하는 파이썬 CLI 도구입니다.
|
||||
|
||||
#### 설치
|
||||
#### Installation
|
||||
```bash
|
||||
$ pip install cognito-scanner
|
||||
```
|
||||
@@ -69,13 +69,13 @@ $ pip install cognito-scanner
|
||||
```bash
|
||||
$ cognito-scanner --help
|
||||
```
|
||||
자세한 정보는 https://github.com/padok-team/cognito-scanner 를 확인하세요.
|
||||
더 많은 정보는 https://github.com/padok-team/cognito-scanner 를 확인하세요.
|
||||
|
||||
## IAM 역할 접근
|
||||
|
||||
### 인증되지 않은 사용자
|
||||
### 인증되지 않음
|
||||
|
||||
인증되지 않은 사용자로서 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`로 호출됩니다.
|
||||
@@ -114,11 +114,11 @@ aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --
|
||||
> [!WARNING]
|
||||
> 기본적으로 인증되지 않은 cognito **사용자는 정책을 통해 할당되었더라도 권한을 가질 수 없습니다**. 다음 섹션을 확인하세요.
|
||||
|
||||
### 향상된 인증 흐름 vs 기본 인증 흐름
|
||||
### Enhanced vs Basic Authentication flow
|
||||
|
||||
이전 섹션은 **기본 향상된 인증 흐름**을 따랐습니다. 이 흐름은 생성된 IAM 역할 세션에 **제한적인** [**세션 정책**](../../aws-basic-information/#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에 "기본 (클래식) 흐름"이 활성화되어 있다면**, 사용자는 해당 흐름을 사용하여 **제한적인 세션 정책이 없는** 세션을 얻을 수 있습니다.
|
||||
그러나 **Identity pool에 "Basic (Classic) Flow"가 활성화되어 있으면**, 사용자는 해당 흐름을 사용하여 **제한적인 세션 정책이 없는** 세션을 얻을 수 있습니다.
|
||||
```bash
|
||||
# Get auth ID
|
||||
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
|
||||
@@ -135,7 +135,7 @@ aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<ro
|
||||
|
||||
> `An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.`
|
||||
|
||||
IAM 자격 증명이 설정되어 있는 경우, [어떤 접근 권한이 있는지 확인하고](../../#whoami) [권한 상승을 시도하세요](../../aws-privilege-escalation/).
|
||||
IAM 자격 증명이 있는 경우 [어떤 접근 권한이 있는지 확인하고](../../index.html#whoami) [권한 상승을 시도하세요](../../aws-privilege-escalation/index.html).
|
||||
|
||||
### 인증된 사용자
|
||||
|
||||
@@ -144,32 +144,32 @@ IAM 자격 증명이 설정되어 있는 경우, [어떤 접근 권한이 있는
|
||||
|
||||
**Identity Pool**에 접근하는 **인증된 사용자**를 위한 **역할**도 있을 수 있습니다.
|
||||
|
||||
이를 위해 **아이덴티티 제공자**에 접근해야 할 수도 있습니다. 만약 그것이 **Cognito User Pool**이라면, 기본 동작을 악용하여 **직접 새로운 사용자를 생성할 수 있을지도 모릅니다**.
|
||||
이를 위해 **아이덴티티 제공자**에 접근해야 할 수 있습니다. 만약 그것이 **Cognito User Pool**이라면, 기본 동작을 악용하여 **직접 새로운 사용자를 생성할 수 있을지도 모릅니다**.
|
||||
|
||||
> [!TIP]
|
||||
> **IAM Cognito 인증 역할은 기본적으로** `Cognito_<Identity Pool name>Auth_Role`로 호출됩니다.
|
||||
> **IAM Cognito 인증 역할은 기본적으로** `Cognito_<Identity Pool name>Auth_Role`로 생성됩니다.
|
||||
|
||||
어쨌든, **다음 예제**는 **Identity Pool**에 접근하기 위해 사용되는 **Cognito User Pool**에 이미 로그인했다고 가정합니다 (다른 유형의 아이덴티티 제공자도 구성될 수 있다는 점을 잊지 마세요).
|
||||
|
||||
<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>
|
||||
--identity-pool-id <identity_pool_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<YOUR_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>
|
||||
--identity-id <identity_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
|
||||
|
||||
# IdToken에서 사용자가 User Pool 그룹으로 인해 접근할 수 있는 역할을 찾을 수 있습니다
|
||||
# 특정 역할에 대한 자격 증명을 얻으려면 --custom-role-arn을 사용하세요
|
||||
# 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>
|
||||
--identity-id <identity_id> \
|
||||
<strong> --custom-role-arn <role_arn> \
|
||||
</strong> --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
</code></pre>
|
||||
|
||||
> [!WARNING]
|
||||
> 사용자가 로그인하는 아이덴티티 제공자에 따라 **다른 IAM 역할을 구성할 수 있으며**, 심지어 **사용자**에 따라 (클레임을 사용하여) 다를 수 있습니다. 따라서 동일한 또는 다른 제공자를 통해 여러 사용자에 접근할 수 있는 경우, **모든 사용자의 IAM 역할에 로그인하고 접근하는 것이 가치가 있을 수 있습니다**.
|
||||
> 사용자가 로그인하는 아이덴티티 제공자에 따라 **다른 IAM 역할을 구성할 수 있으며**, 심지어 **사용자**에 따라 (클레임을 사용하여) 다를 수 있습니다. 따라서 동일한 또는 다른 제공자를 통해 다양한 사용자에 접근할 수 있다면, **모든 사용자의 IAM 역할에 로그인하고 접근하는 것이 가치가 있을 수 있습니다**.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -28,7 +28,7 @@ Azure 가상 머신(VMs)은 유연하고, 필요에 따라 사용할 수 있는
|
||||
- **없음**: 기본적으로 모든 포트를 엽니다.
|
||||
- **기본**: HTTP(80), HTTPS(443), SSH(22), RDP(3389)와 같은 수신 포트를 쉽게 열 수 있습니다.
|
||||
- **고급**: 보안 그룹을 선택합니다.
|
||||
- **백업**: **표준** 백업(하루에 한 번) 및 **향상된**(하루에 여러 번) 백업을 활성화할 수 있습니다.
|
||||
- **백업**: **표준** 백업(하루에 한 번) 및 **향상된** 백업(하루에 여러 번)을 활성화할 수 있습니다.
|
||||
- **패치 조정 옵션**: 선택한 정책에 따라 VM에 자동으로 패치를 적용할 수 있도록 합니다. [**문서**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching)에서 설명합니다.
|
||||
- **알림**: VM에서 무언가 발생할 때 이메일이나 모바일 앱으로 자동 알림을 받을 수 있습니다. 기본 규칙:
|
||||
- CPU 사용률이 80%를 초과
|
||||
@@ -38,15 +38,15 @@ Azure 가상 머신(VMs)은 유연하고, 필요에 따라 사용할 수 있는
|
||||
- 총 네트워크가 500GB를 초과
|
||||
- 총 네트워크 아웃이 200GB를 초과
|
||||
- VmAvailabilityMetric이 1 미만
|
||||
- **헬스 모니터**: 기본적으로 포트 80에서 HTTP 프로토콜을 확인합니다.
|
||||
- **상태 모니터**: 기본적으로 포트 80에서 HTTP 프로토콜을 확인합니다.
|
||||
- **잠금**: VM을 잠가 읽기 전용(**ReadOnly** 잠금)으로 설정하거나 읽고 업데이트할 수 있지만 삭제할 수 없는(**CanNotDelete** 잠금) 상태로 설정할 수 있습니다.
|
||||
- 대부분의 VM 관련 리소스는 **디스크, 스냅샷** 등과 같은 잠금을 **지원합니다.**
|
||||
- 대부분의 VM 관련 리소스는 **잠금을 지원**하며, 디스크, 스냅샷 등도 포함됩니다.
|
||||
- 잠금은 **리소스 그룹 및 구독 수준**에서도 적용할 수 있습니다.
|
||||
|
||||
## 디스크 및 스냅샷
|
||||
|
||||
- **2개 이상의 VM에 디스크를 연결할 수 있도록 활성화할 수 있습니다.**
|
||||
- 기본적으로 모든 디스크는 **플랫폼 키로 암호화**됩니다.
|
||||
- 기본적으로 모든 디스크는 **암호화**되어 있습니다.
|
||||
- 스냅샷에서도 동일합니다.
|
||||
- 기본적으로 모든 네트워크에서 **디스크를 공유할 수 있지만**, 특정 **개인 접근**으로 **제한**하거나 **공개 및 개인 접근을 완전히 비활성화**할 수 있습니다.
|
||||
- 스냅샷에서도 동일합니다.
|
||||
@@ -76,7 +76,7 @@ Get-AzDisk -Name <DiskName> -ResourceGroupName <ResourceGroupName>
|
||||
|
||||
## 이미지, 갤러리 이미지 및 복원 지점
|
||||
|
||||
**VM 이미지**는 새로운 가상 머신(VM)을 **생성하는 데 필요한 운영 체제, 애플리케이션 설정 및 파일 시스템**을 포함하는 템플릿입니다. 이미지와 디스크 스냅샷의 차이점은 디스크 스냅샷이 주로 백업 또는 문제 해결을 위해 사용되는 단일 관리 디스크의 읽기 전용 시점 복사본인 반면, 이미지는 **여러 디스크를 포함할 수 있으며 새로운 VM을 생성하기 위한 템플릿으로 사용되도록 설계되었습니다**.\
|
||||
**VM 이미지**는 운영 체제, 애플리케이션 설정 및 **새 가상 머신(VM)**을 생성하는 데 필요한 파일 시스템을 포함하는 템플릿입니다. 이미지와 디스크 스냅샷의 차이점은 디스크 스냅샷이 주로 백업 또는 문제 해결을 위해 사용되는 단일 관리 디스크의 읽기 전용 시점 복사본인 반면, 이미지는 **여러 디스크를 포함할 수 있으며 새로운 VM을 생성하기 위한 템플릿으로 사용되도록 설계되었습니다**.\
|
||||
이미지는 Azure의 **이미지 섹션** 또는 **Azure 컴퓨트 갤러리** 내에서 관리할 수 있으며, 이를 통해 **버전**을 생성하고 이미지를 크로스 테넌트로 공유하거나 공개할 수 있습니다.
|
||||
|
||||
**복원 지점**은 VM 구성과 **시점** 애플리케이션 일관성 **스냅샷**을 저장합니다. 이는 VM과 관련이 있으며, 특정 시점에서 VM을 복원할 수 있도록 하는 것이 목적입니다.
|
||||
@@ -144,13 +144,13 @@ Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <Resource
|
||||
|
||||
## Azure Site Recovery
|
||||
|
||||
[**문서**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview)에서: Site Recovery는 중단 동안 비즈니스 앱과 워크로드가 계속 실행되도록 하여 비즈니스 연속성을 보장하는 데 도움을 줍니다. Site Recovery는 기본 사이트에서 보조 위치로 물리적 및 가상 머신(VM)에서 실행되는 **워크로드를 복제**합니다. 기본 사이트에서 중단이 발생하면 보조 위치로 전환하고 그곳에서 앱에 접근합니다. 기본 위치가 다시 실행되면 다시 전환할 수 있습니다.
|
||||
[**문서**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview)에서: Site Recovery는 중단 동안 비즈니스 앱과 워크로드가 계속 실행되도록 하여 비즈니스 연속성을 보장하는 데 도움을 줍니다. Site Recovery는 **워크로드를 복제**하여 기본 사이트에서 보조 위치로 물리적 및 가상 머신(VM)에서 실행됩니다. 기본 사이트에서 중단이 발생하면 보조 위치로 전환하고 그곳에서 앱에 접근합니다. 기본 위치가 다시 실행되면 다시 전환할 수 있습니다.
|
||||
|
||||
## Azure Bastion
|
||||
|
||||
Azure Bastion은 Azure Portal 또는 점프 박스를 통해 가상 머신(VM)에 대한 안전하고 원활한 **원격 데스크톱 프로토콜(RDP)** 및 **보안 셸(SSH)** 액세스를 가능하게 합니다. VM에서 **공용 IP 주소의 필요성을 제거**합니다.
|
||||
Azure Bastion은 Azure Portal 또는 점프 박스를 통해 가상 머신(VM)에 대한 안전하고 원활한 **원격 데스크톱 프로토콜(RDP)** 및 **보안 셸(SSH)** 접근을 가능하게 합니다. VM에서 **공용 IP 주소의 필요성을 제거**합니다.
|
||||
|
||||
Bastion은 작동해야 하는 VNet에 `/26` 넷마스크를 가진 **`AzureBastionSubnet`**이라는 서브넷을 배포합니다. 그런 다음, **브라우저를 통해 내부 VM에 연결**할 수 있도록 하여 VM의 포트를 인터넷에 노출하지 않도록 합니다. 또한 **점프 호스트**로도 작동할 수 있습니다.
|
||||
Bastion은 작동해야 하는 VNet에 `/26` 넷마스크를 가진 **`AzureBastionSubnet`**이라는 서브넷을 배포합니다. 그런 다음, **브라우저를 통해 내부 VM에 연결**할 수 있도록 `RDP` 및 `SSH`를 사용하여 VM의 포트를 인터넷에 노출하지 않도록 합니다. 또한 **점프 호스트**로도 작동할 수 있습니다.
|
||||
|
||||
구독 내 모든 Azure Bastion 호스트를 나열하고 이를 통해 VM에 연결하려면 다음 명령을 사용할 수 있습니다:
|
||||
|
||||
@@ -189,11 +189,11 @@ Get-AzBastion
|
||||
|
||||
## 메타데이터
|
||||
|
||||
Azure 인스턴스 메타데이터 서비스(IMDS)는 **실행 중인 가상 머신 인스턴스에 대한 정보를 제공**하여 관리 및 구성에 도움을 줍니다. SKU, 스토리지, 네트워크 구성 및 예정된 유지 관리 이벤트에 대한 정보와 같은 세부 정보를 제공하며, **비라우터 IP 주소 169.254.169.254**에서 사용할 수 있는 REST API를 통해 접근할 수 있으며, 이는 VM 내에서만 접근 가능합니다. VM과 IMDS 간의 통신은 호스트 내에서 이루어져 안전한 접근을 보장합니다. IMDS를 쿼리할 때, VM 내의 HTTP 클라이언트는 적절한 통신을 보장하기 위해 웹 프록시를 우회해야 합니다.
|
||||
Azure 인스턴스 메타데이터 서비스(IMDS)는 **실행 중인 가상 머신 인스턴스에 대한 정보를 제공**하여 관리 및 구성에 도움을 줍니다. SKU, 스토리지, 네트워크 구성 및 예정된 유지 관리 이벤트에 대한 정보와 같은 세부 정보를 제공하며, **비라우터 IP 주소 169.254.169.254에서 사용할 수 있는 REST API**를 통해 접근할 수 있으며, 이는 VM 내에서만 접근 가능합니다. VM과 IMDS 간의 통신은 호스트 내에서 이루어져 안전한 접근을 보장합니다. IMDS를 쿼리할 때, VM 내의 HTTP 클라이언트는 적절한 통신을 보장하기 위해 웹 프록시를 우회해야 합니다.
|
||||
|
||||
또한, 메타데이터 엔드포인트에 연락하기 위해 HTTP 요청에는 **`Metadata: true`** 헤더가 있어야 하며 **`X-Forwarded-For`** 헤더는 없어야 합니다.
|
||||
또한, 메타데이터 엔드포인트에 연락하기 위해서는 HTTP 요청에 **`Metadata: true`** 헤더가 포함되어야 하며, **`X-Forwarded-For`** 헤더는 포함되어서는 안 됩니다.
|
||||
|
||||
다음에서 이를 열거하는 방법을 확인하세요:
|
||||
어떻게 열거하는지 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm
|
||||
@@ -427,13 +427,13 @@ Get-AzStorageAccount
|
||||
Get-AzVMExtension -VMName <VmName> -ResourceGroupName <ResourceGroupName>
|
||||
|
||||
```
|
||||
## 코드 실행 in VMs
|
||||
## VM에서 코드 실행
|
||||
|
||||
### VM 확장
|
||||
|
||||
Azure VM 확장은 Azure 가상 머신(VMs)에서 **배포 후 구성** 및 자동화 작업을 제공하는 작은 애플리케이션입니다.
|
||||
Azure VM 확장은 Azure 가상 머신(VM)에서 **배포 후 구성** 및 자동화 작업을 제공하는 작은 애플리케이션입니다.
|
||||
|
||||
이것은 **VM 내에서 임의의 코드를 실행**할 수 있게 합니다.
|
||||
이것은 **VM 내부에서 임의의 코드를 실행**할 수 있게 합니다.
|
||||
|
||||
필요한 권한은 **`Microsoft.Compute/virtualMachines/extensions/write`**입니다.
|
||||
|
||||
@@ -539,7 +539,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
|
||||
|
||||
<summary>VMAccess 확장</summary>
|
||||
|
||||
이 확장은 Windows VM 내의 사용자 비밀번호를 수정하거나(존재하지 않는 경우 생성) 할 수 있게 해줍니다.
|
||||
이 확장은 Windows VM 내의 사용자 비밀번호를 수정(또는 존재하지 않을 경우 생성)할 수 있게 해줍니다.
|
||||
```bash
|
||||
# Run VMAccess extension to reset the password
|
||||
$cred=Get-Credential # Username and password to reset (if it doesn't exist it'll be created). "Administrator" username is allowed to change the password
|
||||
@@ -622,7 +622,7 @@ az sig gallery-application list --gallery-name <gallery-name> --resource-group <
|
||||
- Linux: `/var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<appname>/<app version>`
|
||||
- Windows: `C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<appname>\<app version>`
|
||||
|
||||
새로운 애플리케이션을 설치하는 방법은 [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)에서 확인하세요.
|
||||
새로운 애플리케이션 설치 방법은 [https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli](https://learn.microsoft.com/en-us/azure/virtual-machines/vm-applications-how-to?tabs=cli)에서 확인하세요.
|
||||
|
||||
> [!CAUTION]
|
||||
> **개별 앱과 갤러리를 다른 구독이나 테넌트와 공유하는 것이 가능합니다**. 이는 공격자가 애플리케이션에 백도어를 설치하고 다른 구독 및 테넌트로 이동할 수 있게 할 수 있기 때문에 매우 흥미롭습니다.
|
||||
@@ -721,17 +721,17 @@ az vm application set \
|
||||
|
||||
### 사용자 데이터
|
||||
|
||||
이것은 **지속적인 데이터**로, 메타데이터 엔드포인트에서 언제든지 검색할 수 있습니다. Azure에서 사용자 데이터는 AWS 및 GCP와 다르다는 점에 유의하세요. **여기에 스크립트를 배치하면 기본적으로 실행되지 않습니다**.
|
||||
이것은 **지속적인 데이터**로, 언제든지 메타데이터 엔드포인트에서 검색할 수 있습니다. Azure에서 사용자 데이터는 AWS 및 GCP와 다르다는 점에 유의하세요. **여기에 스크립트를 배치하면 기본적으로 실행되지 않습니다**.
|
||||
|
||||
### 사용자 정의 데이터
|
||||
|
||||
예상 경로에 저장될 데이터를 VM에 전달하는 것이 가능합니다:
|
||||
|
||||
- **Windows**에서는 사용자 정의 데이터가 `%SYSTEMDRIVE%\AzureData\CustomData.bin`에 이진 파일로 저장되며 처리되지 않습니다.
|
||||
- **Linux**에서는 `/var/lib/waagent/ovf-env.xml`에 저장되었고 현재는 `/var/lib/waagent/CustomData/ovf-env.xml`에 저장됩니다.
|
||||
- **Windows**에서는 사용자 정의 데이터가 `%SYSTEMDRIVE%\AzureData\CustomData.bin`에 이진 파일로 저장되며, 처리되지 않습니다.
|
||||
- **Linux**에서는 `/var/lib/waagent/ovf-env.xml`에 저장되었고, 현재는 `/var/lib/waagent/CustomData/ovf-env.xml`에 저장됩니다.
|
||||
- **Linux 에이전트**: 기본적으로 사용자 정의 데이터를 처리하지 않으며, 데이터가 활성화된 사용자 정의 이미지가 필요합니다.
|
||||
- **cloud-init:** 기본적으로 사용자 정의 데이터를 처리하며 이 데이터는 [**여러 형식**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html)일 수 있습니다. 사용자 정의 데이터에 스크립트만 보내면 쉽게 스크립트를 실행할 수 있습니다.
|
||||
- Ubuntu와 Debian이 여기에 넣은 스크립트를 실행하는 것을 확인했습니다.
|
||||
- **cloud-init:** 기본적으로 사용자 정의 데이터를 처리하며, 이 데이터는 [**여러 형식**](https://cloudinit.readthedocs.io/en/latest/explanation/format.html)일 수 있습니다. 사용자 정의 데이터에 스크립트만 보내면 쉽게 스크립트를 실행할 수 있습니다.
|
||||
- Ubuntu와 Debian이 여기에 넣은 스크립트를 실행하는 것을 시도해 보았습니다.
|
||||
- 이 스크립트가 실행되기 위해 사용자 데이터를 활성화할 필요도 없습니다.
|
||||
```bash
|
||||
#!/bin/sh
|
||||
@@ -739,7 +739,7 @@ echo "Hello World" > /var/tmp/output.txt
|
||||
```
|
||||
### **명령 실행**
|
||||
|
||||
Azure가 **VM에서 임의의 명령을 실행**하기 위해 제공하는 가장 기본적인 메커니즘입니다. 필요한 권한은 `Microsoft.Compute/virtualMachines/runCommand/action`입니다.
|
||||
이것은 Azure가 **VM에서 임의의 명령을 실행**하기 위해 제공하는 가장 기본적인 메커니즘입니다. 필요한 권한은 `Microsoft.Compute/virtualMachines/runCommand/action`입니다.
|
||||
|
||||
{{#tabs }}
|
||||
{{#tab name="Linux" }}
|
||||
@@ -793,7 +793,7 @@ Invoke-AzureRmVMBulkCMD -Script Mimikatz.ps1 -Verbose -output Output.txt
|
||||
## 인증되지 않은 접근
|
||||
|
||||
{{#ref}}
|
||||
../../az-unauthenticated-enum-and-initial-entry/az-vms-unath.md
|
||||
../../az-unauthenticated-enum-and-initial-entry/az-vms-unauth.md
|
||||
{{#endref}}
|
||||
|
||||
## 포스트 익스플로잇
|
||||
|
||||
Reference in New Issue
Block a user