# Az - App Services {{#include ../../../banners/hacktricks-training.md}} ## App Service Basic Information Azure App Services डेवलपर्स को **वेब एप्लिकेशन, मोबाइल ऐप बैकएंड और APIs को बिना किसी रुकावट के बनाने, तैनात करने और स्केल करने** की अनुमति देता है। यह कई प्रोग्रामिंग भाषाओं का समर्थन करता है और कार्यक्षमता और प्रबंधन के लिए विभिन्न Azure उपकरणों और सेवाओं के साथ एकीकृत होता है। प्रत्येक ऐप एक सैंडबॉक्स के अंदर चलता है लेकिन अलगाव App Service योजनाओं पर निर्भर करता है: - फ्री और शेयर किए गए स्तरों में ऐप्स **शेयर किए गए VMs** पर चलते हैं - स्टैंडर्ड और प्रीमियम स्तरों में ऐप्स **विशिष्ट VMs पर चलते हैं जो केवल उसी App Service योजना में ऐप्स द्वारा साझा किए जाते हैं।** - आइसोलेटेड स्तर **विशिष्ट VMs पर चलते हैं जो विशिष्ट वर्चुअल नेटवर्क पर होते हैं**, ऐप्स के अलगाव में सुधार करते हैं। > [!WARNING] > ध्यान दें कि **कोई भी** उन अलगावों में से **अन्य सामान्य** **वेब कमजोरियों** (जैसे फ़ाइल अपलोड या इंजेक्शन) को **रोकता नहीं है**। और यदि एक **प्रबंधन पहचान** का उपयोग किया जाता है, तो यह **उन पर विशेषाधिकार बढ़ा सकता है**। ऐप्स में कुछ दिलचस्प कॉन्फ़िगरेशन हैं: - **हमेशा चालू**: सुनिश्चित करता है कि ऐप हमेशा चल रहा है। यदि सक्षम नहीं किया गया है, तो ऐप 20 मिनट की निष्क्रियता के बाद चलना बंद कर देगा और एक अनुरोध प्राप्त होने पर फिर से शुरू होगा। - यदि आपके पास एक वेबजॉब है जिसे लगातार चलाने की आवश्यकता है तो यह आवश्यक है क्योंकि यदि ऐप रुकता है तो वेबजॉब भी रुक जाएगा। - **SSH**: यदि सक्षम है, तो पर्याप्त अनुमतियों वाला उपयोगकर्ता SSH का उपयोग करके ऐप से कनेक्ट कर सकता है। - **डीबगिंग**: यदि सक्षम है, तो पर्याप्त अनुमतियों वाला उपयोगकर्ता ऐप को डीबग कर सकता है। हालाँकि, यह हर 48 घंटे में स्वचालित रूप से अक्षम हो जाता है। - **वेब ऐप + डेटाबेस**: वेब कंसोल एक डेटाबेस के साथ एक ऐप बनाने की अनुमति देता है। इस मामले में, उपयोग करने के लिए डेटाबेस का चयन करना संभव है (SQLAzure, PostgreSQL, MySQL, MongoDB) और यह आपको Redis के लिए एक Azure Cache बनाने की भी अनुमति देता है। - डेटाबेस और Redis के लिए क्रेडेंशियल्स वाला URL **appsettings** में संग्रहीत किया जाएगा। - **कंटेनर**: कंटेनर के URL और इसे एक्सेस करने के लिए क्रेडेंशियल्स को इंगित करके App Service पर एक कंटेनर तैनात करना संभव है। - **माउंट्स**: स्टोरेज खातों से 5 माउंट बनाना संभव है, ये Azure Blob (पढ़ने के लिए केवल) या Azure Files हो सकते हैं। कॉन्फ़िगरेशन स्टोरेज खाते के माध्यम से एक्सेस कुंजी को संग्रहीत करेगा। ## Basic Authentication जब एक वेब ऐप (और एक Azure फ़ंक्शन आमतौर पर) बनाया जाता है, तो यह संकेत देना संभव है कि आप **बुनियादी प्रमाणीकरण सक्षम करना चाहते हैं** (डिफ़ॉल्ट रूप से अक्षम)। यह मूल रूप से **SCM (स्रोत नियंत्रण प्रबंधक) और FTP (फाइल ट्रांसफर प्रोटोकॉल)** को एप्लिकेशन के लिए सक्षम करता है ताकि उन तकनीकों का उपयोग करके एप्लिकेशन को तैनात करना संभव हो सके। SCM और FTP सर्वरों तक पहुँचने के लिए, एक **उपयोगकर्ता नाम और पासवर्ड** की आवश्यकता होती है। इसलिए, Azure कुछ **APIs प्रदान करता है जो इन प्लेटफार्मों के लिए URLs** और क्रेडेंशियल्स प्राप्त करने के लिए हैं। **FTP सर्वर में कोई विशेष जादू नहीं है**, बस मान्य URL, उपयोगकर्ता नाम और पासवर्ड के साथ कनेक्ट करना और ऐप वातावरण पर पढ़ने और लिखने की अनुमति प्राप्त करना संभव है। SCM आप एक वेब ब्राउज़र का उपयोग करके `https:///BasicAuth` पर SCM से कनेक्ट कर सकते हैं और वहां सभी फ़ाइलों और तैनातियों की जांच कर सकते हैं। ### Kudu Kudu वह प्लेटफ़ॉर्म है जो **SCM और एक वेब और API इंटरफ़ेस दोनों का प्रबंधन करता है** ताकि एक App Service का प्रबंधन किया जा सके, और Git-आधारित तैनातियों, दूरस्थ डीबगिंग और फ़ाइल प्रबंधन क्षमताओं को प्रदान करता है। यह वेब ऐप में परिभाषित SCM URL के माध्यम से सुलभ है। ध्यान दें कि App Services और Function Apps द्वारा उपयोग किए जाने वाले Kudu संस्करण भिन्न हैं, Function ऐप्स का संस्करण बहुत अधिक सीमित है। Kudu में आप कुछ दिलचस्प एंडपॉइंट पा सकते हैं: - `/BasicAuth`: आपको Kudu के अंदर **लॉगिन करने के लिए इस पथ तक पहुँचने** की आवश्यकता है। - `/DebugConsole`: एक कंसोल जो आपको Kudu चलाने वाले वातावरण में कमांड निष्पादित करने की अनुमति देता है। - ध्यान दें कि इस वातावरण में **मेटाडेटा सेवा तक पहुँच नहीं है** ताकि टोकन प्राप्त किए जा सकें। - `/webssh/host`: एक वेब-आधारित SSH क्लाइंट जो आपको उस कंटेनर के अंदर कनेक्ट करने की अनुमति देता है जहां ऐप चल रहा है। - इस वातावरण में **मेटाडेटा सेवा तक पहुँच है** ताकि असाइन किए गए प्रबंधित पहचानों से टोकन प्राप्त किए जा सकें। - `/Env`: सिस्टम, ऐप सेटिंग्स, env वेरिएबल, कनेक्शन स्ट्रिंग और HTTP हेडर के बारे में जानकारी प्राप्त करें। - `/wwwroot/`: वेब ऐप का रूट डायरेक्टरी। आप यहां से सभी फ़ाइलें डाउनलोड कर सकते हैं। इसके अलावा, Kudu पहले [https://github.com/projectkudu/kudu](https://github.com/projectkudu/kudu) पर ओपन-सोर्स था लेकिन प्रोजेक्ट को डिप्रिकेट कर दिया गया और Azure में वर्तमान Kudu के व्यवहार की तुलना करते समय यह देखना संभव है कि **कई चीजें पहले से ही बदल चुकी हैं**। ## Sources App Services डिफ़ॉल्ट रूप से कोड को ज़िप फ़ाइल के रूप में अपलोड करने की अनुमति देते हैं, लेकिन यह एक तृतीय पक्ष सेवा से कनेक्ट करने और वहां से कोड प्राप्त करने की भी अनुमति देता है। - वर्तमान में समर्थित तृतीय पक्ष स्रोत **Github** और **Bitbucket** हैं। - आप `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"` चलाकर प्रमाणीकरण टोकन प्राप्त कर सकते हैं। - Azure डिफ़ॉल्ट रूप से हर बार कोड अपडेट होने पर App Service पर कोड तैनात करने के लिए एक **Github Action** सेटअप करेगा। - यह वहां से कोड प्राप्त करने के लिए एक **दूरस्थ git रिपॉजिटरी** (उपयोगकर्ता नाम और पासवर्ड के साथ) को इंगित करना भी संभव है। - आप `az webapp deployment source show --name --resource-group ` या `az rest --method POST --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"` चलाकर दूरस्थ रिपॉजिटरी के लिए क्रेडेंशियल्स प्राप्त कर सकते हैं। - एक **Azure Repository** का उपयोग करना भी संभव है। - एक **स्थानीय git रिपॉजिटरी** को कॉन्फ़िगर करना भी संभव है। - आप `az webapp deployment source show --name --resource-group ` के साथ git रिपॉजिटरी का URL प्राप्त कर सकते हैं और यह ऐप का SCM URL होगा। - इसे क्लोन करने के लिए आपको SCM क्रेडेंशियल्स की आवश्यकता होगी जिसे आप `az webapp deployment list-publishing-profiles --resource-group -n ` के साथ प्राप्त कर सकते हैं। ## Webjobs Azure WebJobs **Azure App Service वातावरण में चलने वाले बैकग्राउंड कार्य** हैं। वे डेवलपर्स को अपने वेब एप्लिकेशनों के साथ स्क्रिप्ट या प्रोग्राम चलाने की अनुमति देते हैं, जिससे फ़ाइल प्रसंस्करण, डेटा हैंडलिंग या अनुसूचित कार्यों जैसे असिंक्रोनस या समय-गहन संचालन को संभालना आसान हो जाता है। वेब जॉब के 2 प्रकार हैं: - **निरंतर**: यह अनंत काल तक एक लूप में चलता है और इसे तुरंत बनाया जाने पर ट्रिगर किया जाता है। यह उन कार्यों के लिए आदर्श है जिन्हें निरंतर प्रसंस्करण की आवश्यकता होती है। हालाँकि, यदि ऐप चलना बंद कर देता है क्योंकि हमेशा चालू अक्षम है और इसे पिछले 20 मिनट में कोई अनुरोध नहीं मिला है, तो वेब जॉब भी रुक जाएगा। - **ट्रिगर किया गया**: यह मांग पर या एक शेड्यूल के आधार पर चलता है। यह आवधिक कार्यों, जैसे बैच डेटा अपडेट या रखरखाव दिनचर्याओं के लिए सबसे उपयुक्त है। Webjobs हमलावरों के दृष्टिकोण से बहुत दिलचस्प हैं क्योंकि उनका उपयोग **पर्यावरण में कोड निष्पादित करने** और **संलग्न प्रबंधित पहचानों** के लिए विशेषाधिकार बढ़ाने के लिए किया जा सकता है। इसके अलावा, Webjobs द्वारा उत्पन्न **लॉग** की जांच करना हमेशा दिलचस्प होता है क्योंकि वे **संवेदनशील जानकारी** रख सकते हैं। ## Slots Azure App Service Slots का उपयोग **एक ही App Service पर एप्लिकेशन के विभिन्न संस्करणों को तैनात करने** के लिए किया जाता है। यह डेवलपर्स को उत्पादन वातावरण में तैनात करने से पहले एक अलग वातावरण में नई सुविधाओं या परिवर्तनों का परीक्षण करने की अनुमति देता है। इसके अलावा, एक विशिष्ट स्लॉट के लिए **ट्रैफ़िक का एक प्रतिशत** रूट करना संभव है, जो A/B परीक्षण और **बैकडोर उद्देश्यों** के लिए उपयोगी है। ## Azure Function Apps बुनियादी रूप से **Azure Function ऐप्स Azure App Service का एक उपसमुच्चय हैं** वेब कंसोल में और यदि आप वेब कंसोल पर जाते हैं और सभी ऐप सेवाओं की सूची बनाते हैं या az cli में `az webapp list` निष्पादित करते हैं, तो आप **वहां सूचीबद्ध फ़ंक्शन ऐप्स को भी देख पाएंगे**। इसलिए, दोनों सेवाओं में वास्तव में ज्यादातर **एक समान कॉन्फ़िगरेशन, सुविधाएँ और विकल्प az cli में हैं**, हालाँकि वे उन्हें थोड़ा अलग तरीके से कॉन्फ़िगर कर सकते हैं (जैसे appsettings के डिफ़ॉल्ट मान या फ़ंक्शन ऐप्स में स्टोरेज खाते का उपयोग)। ## Enumeration {{#tabs }} {{#tab name="az" }} ```bash # List webapps az webapp list ## Less information az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}" -o table ## Get SCM URL of each webapp az webapp list | grep '"name"' | grep "\.scm\." | awk '{print $2}' | sed 's/"//g' # Get info about 1 app az webapp show --name --resource-group # Get instances of a webapp az webapp list-instances --name --resource-group ## If you have enough perm you can go to the "consoleUrl" and access a shell inside the instance form the web # Get access restrictions of an app az webapp config access-restriction show --name --resource-group # Remove access restrictions az webapp config access-restriction remove --resource-group -n --rule-name # Get connection strings of a webapp az webapp config connection-string list --name --resource-group # Get appsettings of an app az webapp config appsettings list --name --resource-group # Get SCM and FTP credentials az webapp deployment list-publishing-profiles --name --resource-group # Get configured Auth information az webapp auth show --name --resource-group # Get backups of a webapp az webapp config backup list --webapp-name --resource-group # Get backups scheduled for a webapp az webapp config backup show --webapp-name --resource-group # Get snapshots az webapp config snapshot list --resource-group -n # Restore snapshot az webapp config snapshot restore -g -n --time 2018-12-11T23:34:16.8388367 # Get slots az webapp deployment slot list --name --resource-group --output table az webapp show --slot --name --resource-group # Get traffic-routing az webapp traffic-routing show --name --resource-group # Get used container by the app az webapp config container show --name --resource-group # Get storage account configurations of a webapp (contains access key) az webapp config storage-account list --name --resource-group # Get configured container (if any) in the webapp, it could contain credentials az webapp config container show --name --resource-group # Get git URL to access the code az webapp deployment source config-local-git --resource-group -n # Get Webjobs az webapp webjob continuous list --resource-group --name az webapp webjob triggered list --resource-group --name # Read webjobs logs with Azure permissions az rest --method GET --url "/vfs/data/jobs//rev5/job_log.txt" --resource "https://management.azure.com/" az rest --method GET --url "https://lol-b5fyaeceh4e9dce0.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/rev5/job_log.txt" --resource "https://management.azure.com/" # Read webjobs logs with SCM credentials curl "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/vfs/data/jobs/continuous/lala/job_log.txt" \ --user ':' -v # Get connections of a webapp az webapp conection list --name --resource-group # Get hybrid-connections of a webapp az webapp hybrid-connections list --name --resource-group ``` {{#endtab }} {{#tab name="Az Powershell" }} ```bash Get-Command -Module Az.Websites # Get App Services and Function Apps Get-AzWebApp # Get only App Services Get-AzWebApp | ?{$_.Kind -notmatch "functionapp"} # Retrieves details of a specific App Service Environment in the specified resource group. Get-AzAppServiceEnvironment -ResourceGroupName -Name # Retrieves the access restriction configuration for a specified Web App. Get-AzWebAppAccessRestrictionConfig -ResourceGroupName -Name # Retrieves the SSL certificates for a specified resource group. Get-AzWebAppCertificate -ResourceGroupName # Retrieves the continuous deployment URL for a containerized Web App. Get-AzWebAppContainerContinuousDeploymentUrl -ResourceGroupName -Name # Retrieves the list of continuous WebJobs for a specified Web App. Get-AzWebAppWebJob -ResourceGroupName -AppName # Retrieves the list of triggered WebJobs for a specified Web App. Get-AzWebAppTriggeredWebJob -ResourceGroupName -AppName # Retrieves details of a deleted Web App in the specified resource group. Get-AzDeletedWebApp -ResourceGroupName -Name # Retrieves a list of snapshots for a specified Web App. Get-AzWebAppSnapshot -ResourceGroupName -Name # Retrieves the history of a specific triggered WebJob for a Web App. Get-AzWebAppTriggeredWebJobHistory -ResourceGroupName -AppName -Name # Retrieves information about deployment slots for a specified Web App. Get-AzWebAppSlot -ResourceGroupName -Name # Retrieves the continuous WebJobs for a specific deployment slot of a Web App. Get-AzWebAppSlotWebJob -ResourceGroupName -AppName -SlotName # Retrieves the triggered WebJobs for a specific deployment slot of a Web App. Get-AzWebAppSlotTriggeredWebJob -ResourceGroupName -AppName -SlotName # Retrieves the history of a specific triggered WebJob for a deployment slot of a Web App. Get-AzWebAppSlotTriggeredWebJobHistory -ResourceGroupName -AppName -SlotName -Name # Retrieves the continuous WebJobs for a Web App. Get-AzWebAppContinuousWebJob -ResourceGroupName -AppName # Retrieves the continuous WebJobs for a specific deployment slot of a Web App. Get-AzWebAppSlotContinuousWebJob -ResourceGroupName -AppName -SlotName # Retrieves the traffic routing rules for a Web App. Get-AzWebAppTrafficRouting -ResourceGroupName -WebAppName -RuleName # Retrieves details of a specific backup for a Web App. Get-AzWebAppBackup -ResourceGroupName -Name -BackupId # Retrieves the backup configuration for a Web App. Get-AzWebAppBackupConfiguration -ResourceGroupName -Name # Retrieves the list of all backups for a Web App. Get-AzWebAppBackupList -ResourceGroupName -Name ``` {{#endtab }} {{#tab name="az get all" }} ```bash #!/bin/bash # Get all App Service and Function Apps # Define Azure subscription ID azure_subscription="your_subscription_id" # Log in to Azure az login # Select Azure subscription az account set --subscription $azure_subscription # Get all App Services in the specified subscription list_app_services=$(az appservice list --query "[].{appServiceName: name, group: resourceGroup}" -o tsv) # Iterate over each App Service echo "$list_app_services" | while IFS=$'\t' read -r appServiceName group; do # Get the type of the App Service service_type=$(az appservice show --name $appServiceName --resource-group $group --query "kind" -o tsv) # Check if it is a Function App and print its name if [ "$service_type" == "functionapp" ]; then echo "Function App Name: $appServiceName" fi done ``` {{#endtab }} {{#endtabs }} {{#ref}} ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} ## वेब ऐप्स बनाने के उदाहरण ### स्थानीय से पायथन यह ट्यूटोरियल [https://learn.microsoft.com/en-us/azure/app-service/quickstart-python](https://learn.microsoft.com/en-us/azure/app-service/quickstart-python?tabs=flask%2Cwindows%2Cazure-cli%2Cazure-cli-deploy%2Cdeploy-instructions-azportal%2Cterminal-bash%2Cdeploy-instructions-zip-azcli) से आधारित है। ```bash # Clone repository git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart cd msdocs-python-flask-webapp-quickstart # Create webapp from this code az webapp up --runtime PYTHON:3.9 --sku B1 --logs ``` SCM पोर्टल में लॉगिन करने या FTP के माध्यम से लॉगिन करने पर `/wwwroot` में `output.tar.gz` नामक संकुचित फ़ाइल देखी जा सकती है, जिसमें वेब ऐप का कोड होता है। > [!TIP] > केवल FTP के माध्यम से कनेक्ट करना और फ़ाइल `output.tar.gz` को संशोधित करना वेब ऐप द्वारा निष्पादित कोड को बदलने के लिए पर्याप्त नहीं है। **एक हमलावर इस फ़ाइल को डाउनलोड कर सकता है, इसे संशोधित कर सकता है, और इसे फिर से अपलोड कर सकता है ताकि वेब ऐप में मनमाना कोड निष्पादित किया जा सके।** ### Github से Python यह ट्यूटोरियल पिछले वाले पर आधारित है लेकिन एक Github रिपॉजिटरी का उपयोग कर रहा है। 1. अपने Github खाते में msdocs-python-flask-webapp-quickstart रिपॉजिटरी को फोर्क करें। 2. Azure में एक नया Python वेब ऐप बनाएं। 3. `Deployment Center` में स्रोत बदलें, Github के साथ लॉगिन करें, फोर्क की गई रिपॉजिटरी का चयन करें और `Save` पर क्लिक करें। जैसे पिछले मामले में, SCM पोर्टल में लॉगिन करने या FTP के माध्यम से लॉगिन करने पर `/wwwroot` में `output.tar.gz` नामक संकुचित फ़ाइल देखी जा सकती है, जिसमें वेब ऐप का कोड होता है। > [!TIP] > केवल FTP के माध्यम से कनेक्ट करना और फ़ाइल `output.tar.gz` को संशोधित करना और एक डिप्लॉयमेंट को फिर से ट्रिगर करना वेब ऐप द्वारा निष्पादित कोड को बदलने के लिए पर्याप्त नहीं है। ## विशेषाधिकार वृद्धि {{#ref}} ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} ## संदर्भ - [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview) - [https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans](https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans) {{#include ../../../banners/hacktricks-training.md}}