Translated ['src/pentesting-cloud/azure-security/az-enumeration-tools.md

This commit is contained in:
Translator
2025-01-03 19:26:20 +00:00
parent 0d5e677876
commit b653a57643
3 changed files with 407 additions and 94 deletions

View File

@@ -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).

View File

@@ -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 <name> --resource-group <res-group>
```
- Crea un tunnel e poi connettiti a SSH:
- **Crea un tunnel e poi connettiti a SSH**:
```bash
az webapp create-remote-connection --name <name> --resource-group <res-group>
@@ -32,4 +32,249 @@ az webapp create-remote-connection --name <name> --resource-group <res-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 <app-name> --resource-group <res-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 è `<app-name>.scm.azurewebsites.net`**.
- Il permesso **`Microsoft.Web/sites/config/list/action`** consente di chiamare:
```bash
az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-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 `<SCM-URL>/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/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/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/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/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 "<SMC-URL>/api/publish?type=zip" --data-binary "@./app.zip" -u '<username>:<password>' -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 "<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/"
# Using SCM username and password:
curl "<SCM-URL>/vfs/data/jobs/continuous/job_name/job_log.txt" \
--user '<username>:<password>>' -v
```
- Leggi il codice sorgente di **Webjobs**:
```bash
# Using SCM username and password:
# Find all the webjobs inside:
curl "<SCM-URL>/wwwroot/App_Data/jobs/" \
--user '<username>:<password>'
# e.g.
curl "https://nodewebapp-agamcvhgg3gkd3hs.scm.canadacentral-01.azurewebsites.net/wwwroot/App_Data/jobs/continuous/job_name/rev.js" \
--user '<username>:<password>'
```
- 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 \
"<SCM-URL>/api/Continuouswebjobs/reverse_shell2" \
-H 'Content-Disposition: attachment; filename=rev.js' \
--data-binary "@/Users/carlospolop/Downloads/rev.js" \
--user '<username>:<password>'
```
### 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 <name> --resource-group <res-group>
az webapp config appsettings list --name <name> --resource-group <res-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 <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name>
```
### 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 <token>" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/user/repos
# Bitbucket List Repositories
curl -H "Authorization: Bearer <token>" \
-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 <token>" \
-H "Content-Type: application/json" \
--data '{"path": ""}'
# OneDrive List Files in Root Folder
curl -H "Authorization: Bearer <token>" \
-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 <app-name> --resource-group <res-group>`
- Utilizzando il permesso **`Microsoft.Web/sites/config/list/action`**:
- `az webapp deployment list-publishing-credentials --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"`
- 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 <app-name> --resource-group <res-group>`, ma sarà lo stesso dell'URL SCM dell'app con il percorso `/<app-name>.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 <res-group> -n <name>`.
- **`Microsoft.Web/sites/config/list/action`**: Quindi esegui `az webapp deployment list-publishing-credentials --name <name> --resource-group <res-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 <app-name> \
--resource-group <res-group> \
--docker-custom-image-name mcr.microsoft.com/appsvc/staticsite:latest
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -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://<SMC-URL>/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 <app-name> --resource-group <res-group>` o `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"`
- È 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 <app-name> --resource-group <res-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 <res-group> -n <name>`
## 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 <name> --resource-group <res-group>
@@ -51,18 +103,24 @@ az webapp show --name <name> --resource-group <res-group>
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 configured Auth information
az webapp auth show --name <app-name> --resource-group <res-group>
# 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>
@@ -75,61 +133,39 @@ 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 connection strings of a webapp
az webapp config connection-string list --name <name> --resource-group <res-group>
# 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
az webapp config storage-account list --name <name> --resource-gl_group
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/"
# 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 '<username>:<password>' -v
# Get info of 1 funciton (although in the list you already get this info)
az functionapp show --name <app-name> --resource-group <res-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 <name> --resource-group <res-group>
# Get details about the source of the function code
az functionapp deployment source show \
--name <app-name> \
--resource-group <res-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 <name> \
--resource-group <res-group>
# Get settings (and privesc to the sorage account)
az functionapp config appsettings list --name <app-name> --resource-group <res-group>
# Check if a domain was assigned to a function app
az functionapp config hostname list --webapp-name <app-name> --resource-group <res-group>
# Get SSL certificates
az functionapp config ssl list --resource-group <res-group>
# Get network restrictions
az functionapp config access-restriction show --name <app-name> --resource-group <res-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/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions?api-version=2024-04-01"
# Get source code with Master Key of the function
curl "<script_href>?code=<master-key>"
## Python example
curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=<master-key>" -v
# Get source code
az rest --url "https://management.azure.com/<subscription>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/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 <name> --resource-group <res-group>
```
{{#endtab }}
@@ -196,6 +232,40 @@ git clone 'https://<username>:<password>@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)