Az - App Services
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
App Service Basic Information
Azure App Services επιτρέπει στους προγραμματιστές να δημιουργούν, αναπτύσσουν και κλιμακώνουν διαδικτυακές εφαρμογές, backend κινητών εφαρμογών και APIs χωρίς προβλήματα. Υποστηρίζει πολλές γλώσσες προγραμματισμού και ενσωματώνεται με διάφορα εργαλεία και υπηρεσίες Azure για βελτιωμένη λειτουργικότητα και διαχείριση.
Κάθε εφαρμογή εκτελείται μέσα σε ένα sandbox, αλλά η απομόνωση εξαρτάται από τα σχέδια App Service:
- Οι εφαρμογές σε δωρεάν και κοινά επίπεδα εκτελούνται σε κοινές VM
- Οι εφαρμογές σε τυπικά και premium επίπεδα εκτελούνται σε αφιερωμένες VM που μοιράζονται μόνο από εφαρμογές στο ίδιο σχέδιο App Service.
- Τα απομονωμένα επίπεδα εκτελούνται σε αφιερωμένες VM σε αφιερωμένα εικονικά δίκτυα, βελτιώνοντας την απομόνωση των εφαρμογών.
Warning
Σημειώστε ότι κανένα από αυτά τα επίπεδα απομόνωσης δεν αποτρέπει άλλες κοινές ευπάθειες ιστού (όπως η μεταφόρτωση αρχείων ή οι εγχύσεις). Και αν χρησιμοποιηθεί μια ταυτότητα διαχείρισης, θα μπορούσε να είναι σε θέση να κλιμακώσει τα δικαιώματα σε αυτές.
Οι εφαρμογές έχουν κάποιες ενδιαφέρουσες ρυθμίσεις:
- Always On: Διασφαλίζει ότι η εφαρμογή είναι πάντα σε λειτουργία. Αν δεν είναι ενεργοποιημένο, η εφαρμογή θα σταματήσει να λειτουργεί μετά από 20 λεπτά αδράνειας και θα ξεκινήσει ξανά όταν ληφθεί ένα αίτημα.
- Αυτό είναι απαραίτητο αν έχετε μια webjob που χρειάζεται να εκτελείται συνεχώς, καθώς η webjob θα σταματήσει αν σταματήσει η εφαρμογή.
- SSH: Αν είναι ενεργοποιημένο, ένας χρήστης με αρκετά δικαιώματα μπορεί να συνδεθεί στην εφαρμογή χρησιμοποιώντας SSH.
- Debugging: Αν είναι ενεργοποιημένο, ένας χρήστης με αρκετά δικαιώματα μπορεί να αποσφαλματώσει την εφαρμογή. Ωστόσο, αυτό απενεργοποιείται αυτόματα κάθε 48 ώρες.
- Web App + Database: Η διαδικτυακή κονσόλα επιτρέπει τη δημιουργία μιας εφαρμογής με μια βάση δεδομένων. Σε αυτή την περίπτωση, είναι δυνατή η επιλογή της βάσης δεδομένων που θα χρησιμοποιηθεί (SQLAzure, PostgreSQL, MySQL, MongoDB) και επιτρέπει επίσης τη δημιουργία ενός Azure Cache for Redis.
- Η διεύθυνση URL που περιέχει τα διαπιστευτήρια για τη βάση δεδομένων και το Redis θα αποθηκευτεί στα appsettings.
- Container: Είναι δυνατή η ανάπτυξη ενός container στην υπηρεσία App Service υποδεικνύοντας τη διεύθυνση URL του container και τα διαπιστευτήρια για την πρόσβαση σε αυτό.
- Mounts: Είναι δυνατή η δημιουργία 5 mounts από λογαριασμούς αποθήκευσης, είτε αυτοί είναι Azure Blob (Μόνο για Ανάγνωση) είτε Azure Files. Η ρύθμιση θα αποθηκεύσει το κλειδί πρόσβασης πάνω από τον λογαριασμό αποθήκευσης.
- Networking: Μπορεί να είναι δημόσια διαθέσιμη ή προσβάσιμη μόνο μέσω ιδιωτικών endpoints από ένα VNet.
Basic Authentication
Κατά τη δημιουργία μιας διαδικτυακής εφαρμογής (και μιας Azure function συνήθως), είναι δυνατή η ένδειξη αν θέλετε να ενεργοποιηθεί η Βασική Αυθεντικοποίηση (απενεργοποιημένη από προεπιλογή). Αυτό βασικά ενεργοποιεί το SCM (Source Control Manager) και το FTP (File Transfer Protocol) για την εφαρμογή, έτσι ώστε να είναι δυνατή η ανάπτυξη της εφαρμογής χρησιμοποιώντας αυτές τις τεχνολογίες.
Για να αποκτήσετε πρόσβαση στους διακομιστές SCM και FTP, απαιτείται ένα όνομα χρήστη και κωδικός πρόσβασης. Επομένως, η Azure παρέχει κάποιες APIs για να αποκτήσετε τις διευθύνσεις URL σε αυτές τις πλατφόρμες και τα διαπιστευτήρια.
Ο διακομιστής FTP δεν έχει καμία ειδική μαγεία, απλά με την έγκυρη διεύθυνση URL, το όνομα χρήστη και τον κωδικό πρόσβασης είναι δυνατή η σύνδεση και η απόκτηση δικαιωμάτων ανάγνωσης και εγγραφής στο περιβάλλον της εφαρμογής.
Το SCM
Είναι δυνατή η σύνδεση στο SCM χρησιμοποιώντας έναν διαδικτυακό περιηγητή στη διεύθυνση https://<SMC-URL>/BasicAuth και έλεγχος όλων των αρχείων και των αναπτύξεων εκεί.
Kudu
Το Kudu είναι η πλατφόρμα που διαχειρίζεται τόσο το SCM όσο και μια διαδικτυακή και API διεπαφή για τη διαχείριση μιας υπηρεσίας App Service, και παρέχει δυνατότητες ανάπτυξης βασισμένες σε Git, απομακρυσμένη αποσφαλμάτωση και διαχείριση αρχείων. Είναι προσβάσιμο μέσω της διεύθυνσης URL SCM που ορίζεται στην διαδικτυακή εφαρμογή.
Σημειώστε ότι οι εκδόσεις Kudu που χρησιμοποιούνται από τις υπηρεσίες App Services και από τις Function Apps είναι διαφορετικές, με την έκδοση των Function apps να είναι πολύ πιο περιορισμένη.
Ορισμένα ενδιαφέροντα endpoints που μπορείτε να βρείτε στο Kudu είναι:
/BasicAuth: Πρέπει να αποκτήσετε πρόσβαση σε αυτή τη διαδρομή για να συνδεθείτε στο Kudu./DebugConsole: Μια κονσόλα που σας επιτρέπει να εκτελείτε εντολές στο περιβάλλον όπου εκτελείται το Kudu.- Σημειώστε ότι αυτό το περιβάλλον δεν έχει πρόσβαση στην υπηρεσία μεταδεδομένων για να αποκτήσει tokens.
/webssh/host: Ένας διαδικτυακός πελάτης SSH που σας επιτρέπει να συνδεθείτε μέσα στο container όπου εκτελείται η εφαρμογή.- Αυτό το περιβάλλον έχει πρόσβαση στην υπηρεσία μεταδεδομένων προκειμένου να αποκτήσει tokens από τις ανατεθειμένες διαχειριζόμενες ταυτότητες.
/Env: Λάβετε πληροφορίες σχετικά με το σύστημα, τις ρυθμίσεις εφαρμογής, τις μεταβλητές περιβάλλοντος, τις συμβολοσειρές σύνδεσης και τις κεφαλίδες HTTP./wwwroot/: Ο ριζικός κατάλογος της διαδικτυακής εφαρμογής. Μπορείτε να κατεβάσετε όλα τα αρχεία από εδώ.
Επιπλέον, το Kudu ήταν ανοιχτού κώδικα στο https://github.com/projectkudu/kudu, αλλά το έργο έχει αποσυρθεί και συγκρίνοντας τη συμπεριφορά του τρέχοντος Kudu στην Azure με το παλιό, είναι δυνατό να παρατηρήσετε ότι πολλά πράγματα έχουν ήδη αλλάξει.
Sources
Οι υπηρεσίες App Services επιτρέπουν την αποστολή του κώδικα ως αρχείο zip από προεπιλογή, αλλά επιτρέπουν επίσης τη σύνδεση σε μια τρίτη υπηρεσία και την απόκτηση του κώδικα από εκεί.
- Οι τρέχουσες υποστηριζόμενες τρίτες πηγές είναι Github και Bitbucket.
- Μπορείτε να αποκτήσετε τα διαπιστευτήρια αυθεντικοποίησης εκτελώντας
az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" - Η Azure από προεπιλογή θα ρυθμίσει μια Github Action για να αναπτύξει τον κώδικα στην υπηρεσία App Service κάθε φορά που ενημερώνεται ο κώδικας.
- Είναι επίσης δυνατή η ένδειξη ενός απομακρυσμένου git repository (με όνομα χρήστη και κωδικό πρόσβασης) για να αποκτήσετε τον κώδικα από εκεί.
- Μπορείτε να αποκτήσετε τα διαπιστευτήρια για το απομακρυσμένο repo εκτελώντας
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 repository.
- Μπορείτε να αποκτήσετε τη διεύθυνση URL του git repo με
az webapp deployment source show --name <app-name> --resource-group <res-group>και θα είναι η διεύθυνση URL SCM της εφαρμογής. - Για να το κλωνοποιήσετε, θα χρειαστείτε τα διαπιστευτήρια SCM που μπορείτε να αποκτήσετε με
az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>
Webjobs
Οι Azure WebJobs είναι εργασίες φόντου που εκτελούνται στο περιβάλλον Azure App Service. Επιτρέπουν στους προγραμματιστές να εκτελούν σενάρια ή προγράμματα παράλληλα με τις διαδικτυακές τους εφαρμογές, διευκολύνοντας τη διαχείριση ασύγχρονων ή χρονοβόρων εργασιών όπως η επεξεργασία αρχείων, η διαχείριση δεδομένων ή οι προγραμματισμένες εργασίες. Υπάρχουν 2 τύποι web jobs:
- Continuous: Εκτελείται αδιάκοπα σε βρόχο και ενεργοποιείται μόλις δημιουργηθεί. Είναι ιδανικό για εργασίες που απαιτούν συνεχή επεξεργασία. Ωστόσο, αν η εφαρμογή σταματήσει να λειτουργεί επειδή το Always On είναι απενεργοποιημένο και δεν έχει λάβει αίτημα τα τελευταία 20 λεπτά, η web job θα σταματήσει επίσης.
- Triggered: Εκτελείται κατόπιν αιτήματος ή με βάση ένα πρόγραμμα. Είναι καλύτερα προσαρμοσμένο για περιοδικές εργασίες, όπως ενημερώσεις δεδομένων batch ή ρουτίνες συντήρησης.
Οι webjobs είναι πολύ ενδιαφέρουσες από την προοπτική των επιτιθέμενων, καθώς θα μπορούσαν να χρησιμοποιηθούν για εκτέλεση κώδικα στο περιβάλλον και κλιμάκωση δικαιωμάτων στις συνδεδεμένες διαχειριζόμενες ταυτότητες.
Επιπλέον, είναι πάντα ενδιαφέρον να ελέγχετε τα αρχεία καταγραφής που παράγονται από τις Webjobs, καθώς θα μπορούσαν να περιέχουν ευαίσθητες πληροφορίες.
Slots
Οι Azure App Service Slots χρησιμοποιούνται για να αναπτύξουν διαφορετικές εκδόσεις της εφαρμογής στην ίδια υπηρεσία App Service. Αυτό επιτρέπει στους προγραμματιστές να δοκιμάζουν νέες δυνατότητες ή αλλαγές σε ένα ξεχωριστό περιβάλλον πριν τις αναπτύξουν στο περιβάλλον παραγωγής.
Επιπλέον, είναι δυνατή η δρομολόγηση ενός ποσοστού της κίνησης σε μια συγκεκριμένη υποδοχή, κάτι που είναι χρήσιμο για A/B testing και για σκοπούς backdoor.
Azure Function Apps
Βασικά, οι Azure Function apps είναι ένα υποσύνολο της Azure App Service στην διαδικτυακή κονσόλα και αν πάτε στην διαδικτυακή κονσόλα και καταγράψετε όλες τις υπηρεσίες εφαρμογών ή εκτελέσετε az webapp list στο az cli, θα μπορείτε να δείτε τις Function apps επίσης καταγεγραμμένες εκεί.
Επομένως, και οι δύο υπηρεσίες έχουν κυρίως τις ίδιες ρυθμίσεις, δυνατότητες και επιλογές στο az cli, αν και μπορεί να τις ρυθμίζουν λίγο διαφορετικά (όπως οι προεπιλεγμένες τιμές των appsettings ή η χρήση ενός Storage Account στις Function apps).
Enumeration
# 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 git URL to access the code
az webapp deployment source config-local-git --resource-group <res-group> -n <name>
# 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>
# Get configured SMC users by your account
az webapp deployment user show
## If any user is created, the username should appear in the "publishingUserName" field
Παραδείγματα για τη δημιουργία Web Apps
Python από το τοπικό
Αυτό το σεμινάριο βασίζεται σε αυτό από https://learn.microsoft.com/en-us/azure/app-service/quickstart-python.
# 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 portal ή συνδεόμενοι μέσω FTP, είναι δυνατόν να δούμε στο /wwwroot το συμπιεσμένο αρχείο output.tar.gz που περιέχει τον κώδικα της webapp.
Tip
Απλώς η σύνδεση μέσω FTP και η τροποποίηση του αρχείου
output.tar.gzδεν είναι αρκετή για να αλλάξει τον κώδικα που εκτελείται από την webapp.
Ένας επιτιθέμενος θα μπορούσε να κατεβάσει αυτό το αρχείο, να το τροποποιήσει και να το ανεβάσει ξανά για να εκτελέσει αυθαίρετο κώδικα στην webapp.
Python από το Github
Αυτό το tutorial βασίζεται στο προηγούμενο αλλά χρησιμοποιεί ένα αποθετήριο Github.
- Fork το repo msdocs-python-flask-webapp-quickstart στον λογαριασμό σας στο Github.
- Δημιουργήστε μια νέα python Web App στο Azure.
- Στο
Deployment Centerαλλάξτε την πηγή, συνδεθείτε με το Github, επιλέξτε το forked repo και κάντε κλικ στοSave.
Όπως και στην προηγούμενη περίπτωση, συνδεόμενοι στο SCM portal ή συνδεόμενοι μέσω FTP, είναι δυνατόν να δούμε στο /wwwroot το συμπιεσμένο αρχείο output.tar.gz που περιέχει τον κώδικα της webapp.
Tip
Απλώς η σύνδεση μέσω FTP και η τροποποίηση του αρχείου
output.tar.gzκαι η επανενεργοποίηση μιας ανάπτυξης δεν είναι αρκετή για να αλλάξει τον κώδικα που εκτελείται από την webapp.
Privilege Escalation
References
- https://learn.microsoft.com/en-in/azure/app-service/overview
- https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

