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

This commit is contained in:
Translator
2026-01-18 11:54:17 +00:00
parent d2cddcab83
commit a2488c3a2d

View File

@@ -12,9 +12,9 @@
### Microsoft.Web/staticSites/snippets/write
정적 웹 페이지가 임의의 HTML 코드를 로드하도록 스니펫을 생성할 수 있습니다. 이를 통해 공격자는 웹 앱 내부에 JS 코드를 주입하 자격 증명이나 암호화 키(웹3 지갑에서)와 같은 민감한 정보를 탈취할 수 있니다.
snippet을 생성하면 정적 웹 페이지가 임의의 HTML 코드를 로드하도록 만들 수 있습니다. 이는 공격자가 web app 내부에 JS 코드를 주입하 자격증명 또는 mnemonic keys (in web3 wallets)와 같은 민감한 정보를 탈취할 수 있게 합니다.
다음 명령은 웹 앱에 항상 로드될 스니펫을 생성합니다::
다음 명령어는 web app에 의해 항상 로드되는 snippet을 생성합니다::
```bash
az rest \
--method PUT \
@@ -31,22 +31,22 @@ az rest \
}
}'
```
### 구성된 제3자 자격 증명 읽기
### 구성된 타사 자격 증명 읽기
App Service 섹션에서 설명한 바와 같이:
As explained in the App Service section:
{{#ref}}
../az-privilege-escalation/az-app-services-privesc.md
{{#endref}}
다음 명령 실행하면 현재 계정에 구성된 **제3자 자격 증명**을 읽을 수 있습니다. 예를 들어, 다른 사용자에 구성된 Github 자격 증명이 있는 경우, 다른 사용자로부터 토큰에 접근할 수 없습니다.
다음 명령어를 실행하면 현재 계정에 구성된 **타사 자격 증명**을 읽을 수 있습니다. 예를 들어 일부 Github 자격 증명이 다른 사용자에 대해 구성되어 있다면, 다른 사용자로부터 해당 토큰에 접근할 수 없습니다.
```bash
az rest --method GET \
--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"
```
이 명령은 Github, Bitbucket, Dropbox 및 OneDrive에 대한 토큰을 반환합니다.
이 명령은 Github, Bitbucket, Dropbox 및 OneDrive에 대한 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 덮어쓰기...
### 파일 덮어쓰기 - 경로, HTML, JS...
Azure를 통해 **Github repo** 내의 파일을 덮어쓸 수 있으며, 이는 **Github token**을 사용하여 다음과 같은 요청을 보내 파일의 경로, 파일 내용 및 커밋 메시지를 지정할 수 있습니다.
Azure **Github token**을 사용해 다음과 같은 요청을 전송하면, 앱을 포함한 **Github repo 내부의 파일을 덮어쓸 수 있습니다**. 해당 요청은 덮어쓸 파일의 경로, 파일 내용 및 커밋 메시지를 지정니다.
공격자는 이를 악용하여 기본적으로 **웹 앱의 내용을 변경**하여 악성 콘텐츠를 제공하거나(자격 증명, 니모닉 키 도용 등) `staticwebapp.config.json` 파일을 덮어써 특정 경로를 자신의 서버로 **재배치**할 수 있습니다.
이것은 공격자가 기본적으로 **웹 앱의 내용을 변경**하여 악성 콘텐츠(자격증명 탈취, 니모닉 키 등)를 제공하게 하거나, `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을 보호하는 **비밀번호를 수정**하거나 모든 환경의 보호를 해제할 수 있습니다:
```bash
# Change password
az rest --method put \
@@ -133,32 +133,38 @@ az rest --method put \
```
### Microsoft.Web/staticSites/listSecrets/action
이 권한은 정적 앱에 대한 **API 키 배포 토큰**을 가져올 수 있게 해줍니다:
이 권한을 통해 static app의 **API key deployment token**을 얻을 수 있니다.
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"
```
그런 다음 **토큰을 사용하여 앱을 업데이트**하려면 다음 명령을 실행할 수 있습니다. 이 명령은 **Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy) 작동 방식**을 확인하여 추출된 것으로, Azure에서 기본적으로 사용하도록 설정한 것입니다. 따라서 이미지와 매개변수는 미래에 변경될 수 있습니다.
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)가 어떻게 동작하는지 확인하여 추출한 것입니다. 따라서 이미지와 파라미터는 향후 변경될 수 있습니다.
> [!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`** 도구를 사용하거나 다음의 원시 단계를 따르세요:
> 앱을 배포하려면 [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`** 도구를 사용하거나 다음의 원시 단계를 따르세요:
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 토큰을 사용하도록 변경할 수 있는 권한 `Microsoft.Web/staticSites/write` 필요합니다.
> 토큰을 가지고 있더라도 **Deployment Authorization Policy**가 **Github**로 설정되어 있으면 앱을 배포할 수 없습니다. 토큰을 사용하려면 배포 방을 APi token을 사용하도록 변경하기 위해 `Microsoft.Web/staticSites/write` 권한이 필요합니다.
### Microsoft.Web/staticSites/write
이 권한을 사용하면 **정적 웹 앱의 소스를 다른 Github 리포지토리로 변경**할 수 있지만, 이는 Github Action에서 수행야 하므로 자동으로 프로비저닝되지 않습니다.
이 권한으로 **static web app의 소스를 다른 Github 리포지토리로 변경**할 수 있지만, 이는 Github Action에서 수행되어야 하므로 자동으로 프로비저닝되지 않습니다.
그러나 **Deployment Authorization Policy**가 **Github**로 설정되어 있으면 **새 소스 리포지토리에서 앱을 업데이트할 수 있습니다!**.
하지만 **Deployment Authotization Policy**가 **Github**로 설정되어 있다면, **새 소스 리포지토리에서 앱을 업데이트하는 것이 가능합니다!**.
**Deployment Authorization Policy**가 Github로 설정되어 있지 않은 경우, 동일한 권한 `Microsoft.Web/staticSites/write`로 변경할 수 있습니다.
만약 **Deployment Authorization Policy**가 Github로 설정되어 있지 않다면, 동일한 권한 `Microsoft.Web/staticSites/write` 이를 변경할 수 있습니다.
```bash
# Change the source to a different Github repository
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
@@ -181,7 +187,7 @@ az rest --method PATCH \
}
}'
```
앱을 배포하기 위한 예 Github Action:
앱을 배포하기 위한 예 Github Action:
```yaml
name: Azure Static Web Apps CI/CD
@@ -244,16 +250,16 @@ action: "close"
```
### Microsoft.Web/staticSites/resetapikey/action
이 권한을 사용하면 **정적 웹 앱의 API 키를 재설정**하여 앱을 자동으로 배포하는 워크플로우를 잠재적으로 DoS할 수 있습니다.
이 권한으로 **reset the API key of the static web app** 할 수 있으며, 자동으로 앱을 배포하는 워크플로우를 잠재적으로 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의 보호된 경로에 접근할 수 있도록 사용자에게 **초대를 생성할 수 있도록 허용합니다**.
로그인은 `/.auth/login/github` (github의 경우) 또는 `/.auth/login/aad` (Entra ID의 경우)와 같은 경로에 위치하며, 사용자는 다음 명령로 초대 수 있습니다:
로그인은 `/.auth/login/github` (github) 또는 `/.auth/login/aad` (Entra ID) 같은 경로에 위치하며, 다음 명령 사용자를 초대 수 있습니다:
```bash
az staticwebapp users invite \
--authentication-provider Github # AAD, Facebook, GitHub, Google, Twitter \
@@ -266,12 +272,11 @@ az staticwebapp users invite \
```
### Pull Requests
기본적으로 동일한 리포지토리의 브랜치에서 Pull Requests는 자동으로 컴파일되 스테이징 환경에 빌드됩니다. 이는 리포지토리에 대한 쓰기 권한이 있는 공격자가 생산 브랜치(보통 `main`)의 브랜치 보호를 우회할 수 없지만 **악성 버전의 앱을 배포**하기 위해 악용될 수 있습니다.
기본적으로 같은 repo의 브랜치에서 생성된 Pull Requests는 자동으로 컴파일되 스테이징 환경에 빌드됩니다. 이는 repo에 대한 write access는 있지만 프로덕션 브랜치(보통 `main`)의 branch protections을 우회할 수 없는 공격자가 스테이징 URL에 **deploy a malicious version of the app** 하는 데 악용될 수 있습니다.
스테이징 URL의 형식은 다음과 같습니다: `https://<app-subdomain>-<PR-num>.<region>.<res-of-app-domain>` : `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net`
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`
> [!TIP]
> 기본적으로 외부 PR은 리포지토리에 최소 1개의 PR이 병합되지 않는 한 워크플로우를 실행하지 않습니다. 공격자는 리포지토리에 유효한 PR을 보내고 **그런 다음 악성 PR** 리포지토리에 보내 스테이징 환경에 악성 앱을 배포할 수 있습니다. 그러나못한 보호가 있습니다. 정적 웹 앱에 배포하기 위한 기본 Github Action은 배포 토큰을 포함하는 비밀에 대한 액세스가 필요합니다(예: `secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F`), 배포가 IDToken으로 수행되더라도 말입니다. 이는 외부 PR비밀에 접근할 수 없고 외부 PR이 PR이 수락되지 않고 임의의 토큰을 여기에 배치하기 위해 워크플로우를 변경할 수 없기 때문에 **이 공격은 실제로 작동하지 않을 것입니다**.
> 기본적으로 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**.
{{#include ../../../banners/hacktricks-training.md}}