Translated ['src/pentesting-cloud/azure-security/az-services/az-app-serv

This commit is contained in:
Translator
2025-01-04 00:40:31 +00:00
parent bccec43ec9
commit ca6f7fd9cf
2 changed files with 287 additions and 1 deletions

View File

@@ -0,0 +1,286 @@
# 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 और इसे एक्सेस करने के लिए क्रेडेंशियल्स को इंगित करके ऐप सेवा में एक कंटेनर तैनात करना संभव है।
- **माउंट्स**: स्टोरेज खातों से 5 माउंट बनाना संभव है, ये Azure Blob (पढ़ने के लिए केवल) या Azure Files हो सकते हैं। कॉन्फ़िगरेशन स्टोरेज अकाउंट पर एक्सेस कुंजी को संग्रहीत करेगा।
## Basic Authentication
जब एक वेब ऐप (और एक Azure फ़ंक्शन आमतौर पर) बनाया जाता है, तो यह संकेत देना संभव है कि आप **बुनियादी प्रमाणीकरण सक्षम करना चाहते हैं** (डिफ़ॉल्ट रूप से बंद)। यह मूल रूप से **SCM (स्रोत नियंत्रण प्रबंधक) और FTP (फाइल ट्रांसफर प्रोटोकॉल)** को एप्लिकेशन के लिए सक्षम करता है ताकि उन तकनीकों का उपयोग करके एप्लिकेशन को तैनात करना संभव हो सके।
SCM और FTP सर्वरों तक पहुँचने के लिए, एक **उपयोगकर्ता नाम और पासवर्ड** की आवश्यकता होती है। इसलिए, Azure कुछ **APIs प्रदान करता है जो इन प्लेटफार्मों के लिए URLs** और क्रेडेंशियल्स प्राप्त करने के लिए हैं।
**FTP सर्वर में कोई विशेष जादू नहीं है**, बस मान्य URL, उपयोगकर्ता नाम और पासवर्ड के साथ कनेक्ट करना और ऐप वातावरण पर पढ़ने और लिखने की अनुमति प्राप्त करना संभव है।
SCM
आप एक वेब ब्राउज़र का उपयोग करके `https://<SMC-URL>/BasicAuth` पर SCM से कनेक्ट कर सकते हैं और वहां सभी फ़ाइलों और तैनातियों की जांच कर सकते हैं।
### Kudu
Kudu वह प्लेटफ़ॉर्म है जो **SCM और एक वेब और API इंटरफ़ेस दोनों का प्रबंधन करता है** ताकि एक ऐप सेवा का प्रबंधन किया जा सके, और Git-आधारित तैनातियों, दूरस्थ डीबगिंग, और फ़ाइल प्रबंधन क्षमताएँ प्रदान करता है। यह वेब ऐप में परिभाषित SCM URL के माध्यम से सुलभ है।
ध्यान दें कि ऐप सेवाओं और फ़ंक्शन ऐप्स द्वारा उपयोग किए जाने वाले Kudu संस्करण भिन्न हैं, फ़ंक्शन ऐप्स का संस्करण बहुत अधिक सीमित है।
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
ऐप सेवाएँ डिफ़ॉल्ट रूप से कोड को ज़िप फ़ाइल के रूप में अपलोड करने की अनुमति देती हैं, लेकिन यह एक तृतीय पक्ष सेवा से कनेक्ट करने और वहां से कोड प्राप्त करने की भी अनुमति देती है।
- वर्तमान में समर्थित तृतीय पक्ष स्रोत **Github** और **Bitbucket** हैं।
- आप `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"` चलाकर प्रमाणीकरण टोकन प्राप्त कर सकते हैं।
- Azure डिफ़ॉल्ट रूप से हर बार कोड अपडेट होने पर ऐप सेवा में कोड तैनात करने के लिए एक **Github Action** सेटअप करेगा।
- यह वहाँ से कोड प्राप्त करने के लिए एक **दूरस्थ git रिपॉजिटरी** (उपयोगकर्ता नाम और पासवर्ड के साथ) को इंगित करना भी संभव है।
- आप `az webapp deployment source show --name <app-name> --resource-group <res-group>` या `az rest --method POST --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"` चलाकर दूरस्थ रिपॉजिटरी के लिए क्रेडेंशियल्स प्राप्त कर सकते हैं।
- एक **Azure Repository** का उपयोग करना भी संभव है।
- एक **स्थानीय git रिपॉजिटरी** को कॉन्फ़िगर करना भी संभव है।
- आप `az webapp deployment source show --name <app-name> --resource-group <res-group>` के साथ git रिपॉजिटरी का URL प्राप्त कर सकते हैं और यह ऐप का SCM URL होगा।
- इसे क्लोन करने के लिए आपको SCM क्रेडेंशियल्स की आवश्यकता होगी जिसे आप `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>` के साथ प्राप्त कर सकते हैं।
## Webjobs
Azure WebJobs **Azure App Service वातावरण में चलने वाले बैकग्राउंड कार्य** हैं। वे डेवलपर्स को अपने वेब एप्लिकेशनों के साथ स्क्रिप्ट या प्रोग्राम चलाने की अनुमति देते हैं, जिससे फ़ाइल प्रसंस्करण, डेटा हैंडलिंग, या अनुसूचित कार्यों जैसे असिंक्रोनस या समय-गहन संचालन को संभालना आसान हो जाता है।
वेब जॉब के 2 प्रकार हैं:
- **निरंतर**: यह अनंत काल तक एक लूप में चलता है और इसे तुरंत बनाया जाने पर ट्रिगर किया जाता है। यह उन कार्यों के लिए आदर्श है जिन्हें निरंतर प्रसंस्करण की आवश्यकता होती है। हालाँकि, यदि ऐप चलना बंद कर देता है क्योंकि हमेशा चालू बंद है और इसे पिछले 20 मिनट में कोई अनुरोध नहीं मिला है, तो वेब जॉब भी रुक जाएगा।
- **ट्रिगर किया गया**: यह मांग पर या एक शेड्यूल के आधार पर चलता है। यह आवधिक कार्यों, जैसे बैच डेटा अपडेट या रखरखाव दिनचर्या के लिए सबसे उपयुक्त है।
वेबजॉब्स हमलावरों के दृष्टिकोण से बहुत दिलचस्प हैं क्योंकि उनका उपयोग **पर्यावरण में कोड निष्पादित करने** और **संलग्न प्रबंधित पहचानों** के लिए विशेषाधिकार बढ़ाने के लिए किया जा सकता है।
इसके अलावा, यह हमेशा दिलचस्प होता है कि वेबजॉब्स द्वारा उत्पन्न **लॉग्स** की जांच करें क्योंकि वे **संवेदनशील जानकारी** हो सकती हैं।
## Slots
Azure App Service Slots का उपयोग **एक ही ऐप सेवा में एप्लिकेशन के विभिन्न संस्करणों को तैनात करने** के लिए किया जाता है। यह डेवलपर्स को उत्पादन वातावरण में तैनात करने से पहले एक अलग वातावरण में नई सुविधाओं या परिवर्तनों का परीक्षण करने की अनुमति देता है।
इसके अलावा, एक विशेष स्लॉट के लिए **ट्रैफ़िक का एक प्रतिशत** रूट करना संभव है, जो A/B परीक्षण के लिए उपयोगी है, और **बैकडोर उद्देश्यों** के लिए।
## Azure Function Apps
बुनियादी रूप से **Azure Function ऐप्स Azure App Service का एक उपसमुच्चय हैं** वेब कंसोल में और यदि आप वेब कंसोल पर जाते हैं और सभी ऐप सेवाओं की सूची बनाते हैं या `az webapp list` को az cli में निष्पादित करते हैं, तो आप **वहाँ सूचीबद्ध फ़ंक्शन ऐप्स को भी देख पाएंगे**
इसलिए, दोनों सेवाओं में वास्तव में ज्यादातर **एक समान कॉन्फ़िगरेशन, सुविधाएँ और विकल्प होते हैं 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 <name> --resource-group <res-group>
# Get instances of a webapp
az webapp list-instances --name <name> --resource-group <res-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 <name> --resource-group <res-group>
# Remove access restrictions
az webapp config access-restriction remove --resource-group <res-group> -n <name> --rule-name <rule-name>
# Get connection strings of a webapp
az webapp config connection-string list --name <name> --resource-group <res-group>
# Get appsettings of an app
az webapp config appsettings list --name <name> --resource-group <res-group>
# Get SCM and FTP credentials
az webapp deployment list-publishing-profiles --name <name> --resource-group <res-group>
# Get configured Auth information
az webapp auth show --name <app-name> --resource-group <res-group>
# Get backups of a webapp
az webapp config backup list --webapp-name <name> --resource-group <res-group>
# Get backups scheduled for a webapp
az webapp config backup show --webapp-name <name> --resource-group <res-group>
# Get snapshots
az webapp config snapshot list --resource-group <res-group> -n <name>
# Restore snapshot
az webapp config snapshot restore -g <res-group> -n <name> --time 2018-12-11T23:34:16.8388367
# Get slots
az webapp deployment slot list --name <AppName> --resource-group <ResourceGroupName> --output table
az webapp show --slot <SlotName> --name <AppName> --resource-group <ResourceGroupName>
# Get traffic-routing
az webapp traffic-routing show --name <AppName> --resource-group <ResourceGroupName>
# Get used container by the app
az webapp config container show --name <name> --resource-group <res-group>
# Get storage account configurations of a webapp (contains access key)
az webapp config storage-account list --name <name> --resource-group <res-group>
# Get configured container (if any) in the webapp, it could contain credentials
az webapp config container show --name <name> --resource-group <res-group>
# Get Webjobs
az webapp webjob continuous list --resource-group <res-group> --name <app-name>
az webapp webjob triggered list --resource-group <res-group> --name <app-name>
# Read webjobs logs with Azure permissions
az rest --method GET --url "<SCM-URL>/vfs/data/jobs/<continuous | triggered>/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 '<username>:<password>' -v
# Get connections of a webapp
az webapp conection list --name <name> --resource-group <res-group>
# Get hybrid-connections of a webapp
az webapp hybrid-connections list --name <name> --resource-group <res-group>
```
{{#endtab }}
{{#tab name="Az Powershell" }}
```powershell
# Get App Services and Function Apps
Get-AzWebApp
# Get only App Services
Get-AzWebApp | ?{$_.Kind -notmatch "functionapp"}
```
{{#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 }}
#### क्रेडेंशियल प्राप्त करें और वेब ऐप कोड तक पहुंच प्राप्त करें
```bash
# Get connection strings that could contain credentials (with DBs for example)
az webapp config connection-string list --name <name> --resource-group <res-group>
## Check how to use the DBs connection strings in the SQL page
# Get credentials to access the code and DB credentials if configured.
az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>
# Get git URL to access the code
az webapp deployment source config-local-git --resource-group <res-group> -n <name>
# Access/Modify the code via git
git clone 'https://<username>:<password>@name.scm.azurewebsites.net/repo-name.git'
## In my case the username was: $nameofthewebapp and the password some random chars
## If you change the code and do a push, the app is automatically redeployed
```
{{#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` को संशोधित करना और एक डिप्लॉयमेंट को फिर से ट्रिगर करना वेब ऐप द्वारा निष्पादित कोड को बदलने के लिए पर्याप्त नहीं है।
## Privilege Escalation
{{#ref}}
../az-privilege-escalation/az-app-services-privesc.md
{{#endref}}
## References
- [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}}