mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-05 20:40:18 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -34,3 +34,4 @@ Temporary Items
|
||||
book
|
||||
book/*
|
||||
hacktricks-preprocessor.log
|
||||
hacktricks-preprocessor-error.log
|
||||
|
||||
@@ -7,7 +7,14 @@ from os import path
|
||||
from urllib.request import urlopen, Request
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logging.basicConfig(filename='hacktricks-preprocessor.log', filemode='w', encoding='utf-8', level=logging.DEBUG)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
handler = logging.FileHandler(filename='hacktricks-preprocessor.log', mode='w', encoding='utf-8')
|
||||
handler.setLevel(logging.DEBUG)
|
||||
logger.addHandler(handler)
|
||||
|
||||
handler2 = logging.FileHandler(filename='hacktricks-preprocessor-error.log', mode='w', encoding='utf-8')
|
||||
handler2.setLevel(logging.ERROR)
|
||||
logger.addHandler(handler2)
|
||||
|
||||
|
||||
def findtitle(search ,obj, key, path=(),):
|
||||
@@ -45,19 +52,29 @@ def ref(matchobj):
|
||||
try:
|
||||
if href.endswith("/"):
|
||||
href = href+"README.md" # Fix if ref points to a folder
|
||||
chapter, _path = findtitle(href, book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(href.split("#")[0], book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
else:
|
||||
chapter, _path = findtitle(href, book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
except Exception as e:
|
||||
try:
|
||||
dir = path.dirname(current_chapter['source_path'])
|
||||
logger.debug(f'Error getting chapter title: {href} trying with relative path {path.normpath(path.join(dir,href))}')
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
else:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = chapter["name"]
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
except Exception as e:
|
||||
logger.debug(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
|
||||
print(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
|
||||
logger.debug(e)
|
||||
logger.error(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
@@ -85,13 +102,11 @@ def files(matchobj):
|
||||
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
logger.debug(f'Error searching file: {href}')
|
||||
print(f'Error searching file: {href}')
|
||||
logger.error(f'Error searching file: {href}')
|
||||
sys.exit(1)
|
||||
|
||||
if title=="":
|
||||
logger.debug(f'Error searching file: {href}')
|
||||
print(f'Error searching file: {href}')
|
||||
logger.error(f'Error searching file: {href}')
|
||||
sys.exit(1)
|
||||
|
||||
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
|
||||
@@ -134,10 +149,11 @@ if __name__ == '__main__':
|
||||
for chapter in iterate_chapters(book['sections']):
|
||||
logger.debug(f"Chapter: {chapter['path']}")
|
||||
current_chapter = chapter
|
||||
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
|
||||
# regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
|
||||
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n#]*(?:#(.*))?)(?:\n)?{{[\s]*#endref[\s]*}}'
|
||||
new_content = re.sub(regex, ref, chapter['content'])
|
||||
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
|
||||
new_content = re.sub(regex, files, chapter['content'])
|
||||
new_content = re.sub(regex, files, new_content)
|
||||
new_content = add_read_time(new_content)
|
||||
chapter['content'] = new_content
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
]
|
||||
}
|
||||
```
|
||||
Και η κατάληψη είναι δυνατή επειδή υπάρχει ένα **μικρό χρονικό παράθυρο από τη στιγμή που το πρότυπο ανεβαίνει** στο bucket μέχρι τη στιγμή που το **πρότυπο αναπτύσσεται**. Ένας επιτιθέμενος μπορεί απλώς να δημιουργήσει μια **lambda function** στον λογαριασμό του που θα **ενεργοποιείται όταν σταλεί μια ειδοποίηση bucket**, και να **καταλάβει** το **περιεχόμενο** αυτού του **bucket**.
|
||||
Και η κατάληψη είναι δυνατή επειδή υπάρχει ένα **μικρό χρονικό παράθυρο από τη στιγμή που το πρότυπο ανεβαίνει** στο bucket μέχρι τη στιγμή που το **πρότυπο αναπτύσσεται**. Ένας επιτιθέμενος μπορεί απλώς να δημιουργήσει μια **lambda function** στον λογαριασμό του που θα **ενεργοποιείται όταν σταλεί μια ειδοποίηση bucket**, και **καταλαμβάνει** το **περιεχόμενο** αυτού του **bucket**.
|
||||
|
||||
.png>)
|
||||
|
||||
@@ -55,17 +55,17 @@
|
||||
Είναι πολύ συνηθισμένο τα [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) αρχεία κατάστασης να αποθηκεύονται σε blob storage παρόχων cloud, π.χ. AWS S3. Η κατάληξη αρχείου για ένα αρχείο κατάστασης είναι `.tfstate`, και τα ονόματα των buckets συχνά αποκαλύπτουν ότι περιέχουν αρχεία κατάστασης terraform. Συνήθως, κάθε λογαριασμός AWS έχει ένα τέτοιο bucket για να αποθηκεύει τα αρχεία κατάστασης που δείχνουν την κατάσταση του λογαριασμού.
|
||||
Επίσης, συνήθως, σε πραγματικούς λογαριασμούς σχεδόν πάντα όλοι οι προγραμματιστές έχουν `s3:*` και μερικές φορές ακόμη και οι επιχειρηματικοί χρήστες έχουν `s3:Put*`.
|
||||
|
||||
Έτσι, αν έχετε τις άδειες που αναφέρονται πάνω από αυτά τα αρχεία, υπάρχει ένα επιθετικός παράγοντας που σας επιτρέπει να αποκτήσετε RCE στην pipeline με τα δικαιώματα του `terraform` - τις περισσότερες φορές `AdministratorAccess`, κάνοντάς σας τον διαχειριστή του λογαριασμού cloud. Επίσης, μπορείτε να χρησιμοποιήσετε αυτόν τον παράγοντα για να κάνετε μια επίθεση άρνησης υπηρεσίας κάνοντάς τον `terraform` να διαγράψει νόμιμους πόρους.
|
||||
Έτσι, αν έχετε τις άδειες που αναφέρονται πάνω από αυτά τα αρχεία, υπάρχει ένα επιθετικός διαδρομή που σας επιτρέπει να αποκτήσετε RCE στην pipeline με τα δικαιώματα του `terraform` - τις περισσότερες φορές `AdministratorAccess`, κάνοντάς σας τον διαχειριστή του λογαριασμού cloud. Επίσης, μπορείτε να χρησιμοποιήσετε αυτή τη διαδρομή για να κάνετε μια επίθεση άρνησης υπηρεσίας κάνοντάς το `terraform` να διαγράψει νόμιμους πόρους.
|
||||
|
||||
Ακολουθήστε την περιγραφή στην ενότητα *Abusing Terraform State Files* της σελίδας *Terraform Security* για άμεσα χρησιμοποιήσιμο κώδικα εκμετάλλευσης:
|
||||
|
||||
{{#ref}}
|
||||
terraform-security.md#abusing-terraform-state-files
|
||||
pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files
|
||||
{{#endref}}
|
||||
|
||||
### `s3:PutBucketPolicy`
|
||||
|
||||
Ένας επιτιθέμενος, που πρέπει να είναι **από τον ίδιο λογαριασμό**, αν όχι, το σφάλμα `The specified method is not allowed will trigger`, με αυτή την άδεια θα είναι σε θέση να παραχωρήσει στον εαυτό του περισσότερες άδειες πάνω από τα bucket(s) επιτρέποντάς του να διαβάσει, να γράψει, να τροποποιήσει, να διαγράψει και να εκθέσει buckets.
|
||||
Ένας επιτιθέμενος, που πρέπει να είναι **από τον ίδιο λογαριασμό**, αν όχι το σφάλμα `The specified method is not allowed will trigger`, με αυτή την άδεια θα είναι σε θέση να παραχωρήσει στον εαυτό του περισσότερες άδειες πάνω από το bucket(s) επιτρέποντάς του να διαβάσει, να γράψει, να τροποποιήσει, να διαγράψει και να εκθέσει buckets.
|
||||
```bash
|
||||
# Update Bucket policy
|
||||
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
Για περισσότερες πληροφορίες σχετικά με τις υπηρεσίες Azure App, ελέγξτε:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-app-service.md
|
||||
../az-services/az-app-services.md
|
||||
{{#endref}}
|
||||
|
||||
### Microsoft.Web/sites/publish/Action, Microsoft.Web/sites/basicPublishingCredentialsPolicies/read, Microsoft.Web/sites/config/read, Microsoft.Web/sites/read
|
||||
|
||||
Αυτές οι άδειες επιτρέπουν την πρόσβαση σε ένα **SSH shell** μέσα σε μια εφαρμογή ιστού. Επίσης, επιτρέπουν την **αποσφαλμάτωση** της εφαρμογής.
|
||||
Αυτές οι άδειες επιτρέπουν την απόκτηση ενός **SSH shell** μέσα σε μια εφαρμογή ιστού. Επίσης επιτρέπουν την **αποσφαλμάτωση** της εφαρμογής.
|
||||
|
||||
- **SSH σε μία εντολή**:
|
||||
```bash
|
||||
@@ -251,12 +251,12 @@ https://graph.microsoft.com/v1.0/me/drive/root/children
|
||||
### Ενημέρωση Κώδικα Εφαρμογής από την πηγή
|
||||
|
||||
- Εάν η ρυθμισμένη πηγή είναι ένας τρίτος πάροχος όπως το Github, το BitBucket ή ένα Azure Repository, μπορείτε να **ενημερώσετε τον κώδικα** της υπηρεσίας εφαρμογής παραβιάζοντας τον πηγαίο κώδικα στο αποθετήριο.
|
||||
- Εάν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα **απομακρυσμένο git repository** (με όνομα χρήστη και κωδικό πρόσβασης), είναι δυνατόν να αποκτήσετε το **URL και τα βασικά διαπιστευτήρια αυθεντικοποίησης** για να κλωνοποιήσετε και να στείλετε αλλαγές με:
|
||||
- Εάν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα **απομακρυσμένο git repository** (με όνομα χρήστη και κωδικό πρόσβασης), είναι δυνατόν να αποκτήσετε το **URL και τα βασικά διαπιστευτήρια αυθεντικοποίησης** για να κλωνοποιήσετε και να σπρώξετε αλλαγές με:
|
||||
- Χρησιμοποιώντας την άδεια **`Microsoft.Web/sites/sourcecontrols/read`**: `az webapp deployment source show --name <app-name> --resource-group <res-group>`
|
||||
- Χρησιμοποιώντας την άδεια **`Microsoft.Web/sites/config/list/action`**:
|
||||
- `az webapp deployment list-publishing-credentials --name <app-name> --resource-group <res-group>`
|
||||
- `az rest --method POST --url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.Web/sites/<app-name>/config/metadata/list?api-version=2022-03-01" --resource "https://management.azure.com"`
|
||||
- Εάν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα **τοπικό git repository**, είναι δυνατόν να **κλωνοποιήσετε το αποθετήριο** και να **στείλετε αλλαγές** σε αυτό:
|
||||
- Εάν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα **τοπικό git repository**, είναι δυνατόν να **κλωνοποιήσετε το αποθετήριο** και να **σπρώξετε αλλαγές** σε αυτό:
|
||||
- Χρησιμοποιώντας την άδεια **`Microsoft.Web/sites/sourcecontrols/read`**: Μπορείτε να αποκτήσετε το URL του git repo με `az webapp deployment source show --name <app-name> --resource-group <res-group>`, αλλά θα είναι το ίδιο με το SCM URL της εφαρμογής με τη διαδρομή `/<app-name>.git` (π.χ. `https://pythonwebapp-audeh9f5fzeyhhed.scm.canadacentral-01.azurewebsites.net:443/pythonwebapp.git`).
|
||||
- Για να αποκτήσετε τα διαπιστευτήρια SCM χρειάζεστε την άδεια:
|
||||
- **`Microsoft.Web/sites/publishxml/action`**: Στη συνέχεια, εκτελέστε `az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>`.
|
||||
|
||||
@@ -4,111 +4,22 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
**Azure Function Apps** είναι μια **serverless compute service** που σας επιτρέπει να εκτελείτε μικρά κομμάτια κώδικα, που ονομάζονται **functions**, χωρίς να διαχειρίζεστε την υποκείμενη υποδομή. Είναι σχεδιασμένα να εκτελούν κώδικα σε απάντηση σε διάφορους ενεργοποιητές, όπως **HTTP requests, timers, ή events από άλλες υπηρεσίες Azure** όπως Blob Storage ή Event Hubs. Οι Function Apps υποστηρίζουν πολλές γλώσσες προγραμματισμού, συμπεριλαμβανομένων των C#, Python, JavaScript και Java, καθιστώντας τις ευέλικτες για την κατασκευή **event-driven applications**, αυτοματοποίηση ροών εργασίας ή ενσωμάτωση υπηρεσιών. Είναι οικονομικές, καθώς συνήθως πληρώνετε μόνο για τον χρόνο υπολογισμού που χρησιμοποιείται όταν εκτελείται ο κώδικάς σας.
|
||||
**Azure Function Apps** είναι μια **χωρίς διακομιστή υπηρεσία υπολογισμού** που σας επιτρέπει να εκτελείτε μικρά κομμάτια κώδικα, που ονομάζονται **functions**, χωρίς να διαχειρίζεστε την υποκείμενη υποδομή. Είναι σχεδιασμένα να εκτελούν κώδικα σε απάντηση σε διάφορους ενεργοποιητές, όπως **HTTP requests, timers, ή events από άλλες υπηρεσίες Azure** όπως Blob Storage ή Event Hubs. Οι Function Apps υποστηρίζουν πολλές γλώσσες προγραμματισμού, συμπεριλαμβανομένων των C#, Python, JavaScript και Java, καθιστώντας τις ευέλικτες για την κατασκευή **event-driven applications**, αυτοματοποίηση ροών εργασίας ή ενσωμάτωση υπηρεσιών. Είναι οικονομικές, καθώς συνήθως πληρώνετε μόνο για τον χρόνο υπολογισμού που χρησιμοποιείται όταν εκτελείται ο κώδικάς σας.
|
||||
|
||||
> [!NOTE]
|
||||
> Σημειώστε ότι **Functions είναι ένα υποσύνολο των App Services**, επομένως, πολλές από τις δυνατότητες που συζητούνται εδώ θα χρησιμοποιηθούν επίσης από εφαρμογές που δημιουργούνται ως Azure Apps (`webapp` στο cli).
|
||||
|
||||
### Different Plans
|
||||
|
||||
- **Flex Consumption Plan**: Προσφέρει **dynamic, event-driven scaling** με τιμολόγηση pay-as-you-go, προσθέτοντας ή αφαιρώντας λειτουργικές παρουσίες με βάση τη ζήτηση. Υποστηρίζει **virtual networking** και **pre-provisioned instances** για να μειώσει τις κρύες εκκινήσεις, καθιστώντας το κατάλληλο για **variable workloads** που δεν απαιτούν υποστήριξη κοντέινερ.
|
||||
- **Traditional Consumption Plan**: Η προεπιλεγμένη serverless επιλογή, όπου **πληρώνετε μόνο για τους υπολογιστικούς πόρους όταν εκτελούνται οι functions**. Αυξάνεται αυτόματα με βάση τα εισερχόμενα γεγονότα και περιλαμβάνει **cold start optimizations**, αλλά δεν υποστηρίζει αναπτύξεις κοντέινερ. Ιδανικό για **intermittent workloads** που απαιτούν αυτόματη κλιμάκωση.
|
||||
- **Premium Plan**: Σχεδιασμένο για **consistent performance**, με **prewarmed workers** για να εξαλείψει τις κρύες εκκινήσεις. Προσφέρει **extended execution times, virtual networking**, και υποστηρίζει **custom Linux images**, καθιστώντας το τέλειο για **mission-critical applications** που χρειάζονται υψηλή απόδοση και προηγμένες δυνατότητες.
|
||||
- **Dedicated Plan**: Λειτουργεί σε αφιερωμένες εικονικές μηχανές με **predictable billing** και υποστηρίζει χειροκίνητη ή αυτόματη κλιμάκωση. Επιτρέπει την εκτέλεση πολλών εφαρμογών στο ίδιο σχέδιο, παρέχει **compute isolation**, και εξασφαλίζει **secure network access** μέσω App Service Environments, καθιστώντας το ιδανικό για **long-running applications** που χρειάζονται συνεπή κατανομή πόρων.
|
||||
- **Flex Consumption Plan**: Προσφέρει **δυναμική, event-driven κλιμάκωση** με τιμολόγηση pay-as-you-go, προσθέτοντας ή αφαιρώντας παραδείγματα λειτουργιών με βάση τη ζήτηση. Υποστηρίζει **virtual networking** και **pre-provisioned instances** για να μειώσει τις κρύες εκκινήσεις, καθιστώντας το κατάλληλο για **μεταβλητά φορτία εργασίας** που δεν απαιτούν υποστήριξη κοντέινερ.
|
||||
- **Traditional Consumption Plan**: Η προεπιλεγμένη χωρίς διακομιστή επιλογή, όπου **πληρώνετε μόνο για τους υπολογιστικούς πόρους όταν εκτελούνται οι λειτουργίες**. Κλιμακώνεται αυτόματα με βάση τα εισερχόμενα γεγονότα και περιλαμβάνει **βελτιστοποιήσεις κρύας εκκίνησης**, αλλά δεν υποστηρίζει αναπτύξεις κοντέινερ. Ιδανικό για **διαλείποντα φορτία εργασίας** που απαιτούν αυτόματη κλιμάκωση.
|
||||
- **Premium Plan**: Σχεδιασμένο για **σταθερή απόδοση**, με **prewarmed workers** για την εξάλειψη των κρύων εκκινήσεων. Προσφέρει **εκτεταμένους χρόνους εκτέλεσης, virtual networking**, και υποστηρίζει **custom Linux images**, καθιστώντας το ιδανικό για **mission-critical applications** που χρειάζονται υψηλή απόδοση και προηγμένες δυνατότητες.
|
||||
- **Dedicated Plan**: Λειτουργεί σε αφιερωμένες εικονικές μηχανές με **προβλέψιμο τιμολόγιο** και υποστηρίζει χειροκίνητη ή αυτόματη κλιμάκωση. Επιτρέπει την εκτέλεση πολλών εφαρμογών στο ίδιο σχέδιο, παρέχει **υπολογιστική απομόνωση**, και εξασφαλίζει **ασφαλή πρόσβαση στο δίκτυο** μέσω App Service Environments, καθιστώντας το ιδανικό για **μακροχρόνιες εφαρμογές** που χρειάζονται συνεπή κατανομή πόρων.
|
||||
- **Container Apps**: Επιτρέπει την ανάπτυξη **containerized function apps** σε ένα διαχειριζόμενο περιβάλλον, παράλληλα με μικροϋπηρεσίες και APIs. Υποστηρίζει προσαρμοσμένες βιβλιοθήκες, μετανάστευση κληρονομημένων εφαρμογών, και **GPU processing**, εξαλείφοντας τη διαχείριση του Kubernetes cluster. Ιδανικό για **event-driven, scalable containerized applications**.
|
||||
|
||||
### **Storage Buckets**
|
||||
|
||||
Όταν δημιουργείτε μια νέα Function App που δεν είναι κοντεϊνερized (αλλά δίνετε τον κώδικα για εκτέλεση), ο **κώδικας και άλλα δεδομένα που σχετίζονται με τη Function θα αποθηκευτούν σε έναν λογαριασμό Storage**. Από προεπιλογή, η διαδικτυακή κονσόλα θα δημιουργήσει έναν νέο ανά function για να αποθηκεύσει τον κώδικα.
|
||||
|
||||
Επιπλέον, τροποποιώντας τον κώδικα μέσα στο bucket (στα διάφορα φορμά που μπορεί να αποθηκευτεί), ο **κώδικας της εφαρμογής θα τροποποιηθεί στον νέο και θα εκτελείται** την επόμενη φορά που θα κληθεί η Function.
|
||||
|
||||
> [!CAUTION]
|
||||
> Αυτό είναι πολύ ενδιαφέρον από την προοπτική ενός επιτιθέμενου καθώς η **write access πάνω σε αυτό το bucket** θα επιτρέψει σε έναν επιτιθέμενο να **συμβιβάσει τον κώδικα και να κλιμακώσει τα προνόμια** στις διαχειριζόμενες ταυτότητες μέσα στην Function App.
|
||||
>
|
||||
> Περισσότερα σχετικά με αυτό στην **ενότητα κλιμάκωσης προνομίων**.
|
||||
|
||||
Είναι επίσης δυνατό να βρείτε τα **master και functions keys** αποθηκευμένα στον λογαριασμό storage στο κοντέινερ **`azure-webjobs-secrets`** μέσα στον φάκελο **`<app-name>`** στα αρχεία JSON που μπορείτε να βρείτε μέσα.
|
||||
|
||||
Σημειώστε ότι οι Functions επιτρέπουν επίσης την αποθήκευση του κώδικα σε μια απομακρυσμένη τοποθεσία απλά υποδεικνύοντας το URL της.
|
||||
|
||||
### Networking
|
||||
|
||||
Χρησιμοποιώντας έναν HTTP trigger:
|
||||
|
||||
- Είναι δυνατό να δώσετε **πρόσβαση σε μια function από όλο το Διαδίκτυο** χωρίς να απαιτείται καμία αυθεντικοποίηση ή να δώσετε πρόσβαση με βάση το IAM. Αν και είναι επίσης δυνατό να περιορίσετε αυτή την πρόσβαση.
|
||||
- Είναι επίσης δυνατό να **δώσετε ή να περιορίσετε την πρόσβαση** σε μια Function App από **ένα εσωτερικό δίκτυο (VPC)**.
|
||||
|
||||
> [!CAUTION]
|
||||
> Αυτό είναι πολύ ενδιαφέρον από την προοπτική ενός επιτιθέμενου καθώς μπορεί να είναι δυνατό να **pivot σε εσωτερικά δίκτυα** από μια ευάλωτη Function που είναι εκτεθειμένη στο Διαδίκτυο.
|
||||
|
||||
### **Function App Settings & Environment Variables**
|
||||
|
||||
Είναι δυνατό να ρυθμίσετε μεταβλητές περιβάλλοντος μέσα σε μια εφαρμογή, οι οποίες θα μπορούσαν να περιέχουν ευαίσθητες πληροφορίες. Επιπλέον, από προεπιλογή οι env μεταβλητές **`AzureWebJobsStorage`** και **`WEBSITE_CONTENTAZUREFILECONNECTIONSTRING`** (μεταξύ άλλων) δημιουργούνται. Αυτές είναι ιδιαίτερα ενδιαφέρουσες γιατί **περιέχουν το κλειδί λογαριασμού για τον έλεγχο με ΠΛΗΡΗ δικαιώματα του λογαριασμού storage που περιέχει τα δεδομένα της εφαρμογής**. Αυτές οι ρυθμίσεις είναι επίσης απαραίτητες για την εκτέλεση του κώδικα από τον Λογαριασμό Storage.
|
||||
|
||||
Αυτές οι env μεταβλητές ή παράμετροι ρύθμισης ελέγχουν επίσης πώς η Function εκτελεί τον κώδικα, για παράδειγμα αν **`WEBSITE_RUN_FROM_PACKAGE`** υπάρχει, θα υποδεικνύει το URL όπου βρίσκεται ο κώδικας της εφαρμογής.
|
||||
|
||||
### **Function Sandbox**
|
||||
|
||||
Μέσα στο linux sandbox ο πηγαίος κώδικας βρίσκεται στο **`/home/site/wwwroot`** στο αρχείο **`function_app.py`** (αν χρησιμοποιείται python) ο χρήστης που εκτελεί τον κώδικα είναι **`app`** (χωρίς δικαιώματα sudo).
|
||||
|
||||
Σε μια **Windows** function που χρησιμοποιεί NodeJS ο κώδικας βρισκόταν στο **`C:\home\site\wwwroot\HttpTrigger1\index.js`**, το όνομα χρήστη ήταν **`mawsFnPlaceholder8_f_v4_node_20_x86`** και ήταν μέρος των **groups**: `Mandatory Label\High Mandatory Level Label`, `Everyone`, `BUILTIN\Users`, `NT AUTHORITY\INTERACTIVE`, `CONSOLE LOGON`, `NT AUTHORITY\Authenticated Users`, `NT AUTHORITY\This Organization`, `BUILTIN\IIS_IUSRS`, `LOCAL`, `10-30-4-99\Dwas Site Users`.
|
||||
|
||||
### **Managed Identities & Metadata**
|
||||
|
||||
Ακριβώς όπως [**VMs**](vms/), οι Functions μπορούν να έχουν **Managed Identities** 2 τύπων: System assigned και User assigned.
|
||||
|
||||
Η **system assigned** θα είναι μια διαχειριζόμενη ταυτότητα που **μόνο η function** που έχει ανατεθεί θα μπορεί να χρησιμοποιήσει, ενώ οι **user assigned** διαχειριζόμενες ταυτότητες είναι διαχειριζόμενες ταυτότητες που **οποιαδήποτε άλλη υπηρεσία Azure θα μπορεί να χρησιμοποιήσει**.
|
||||
|
||||
> [!NOTE]
|
||||
> Ακριβώς όπως στα [**VMs**](vms/), οι Functions μπορούν να έχουν **1 system assigned** διαχειριζόμενη ταυτότητα και **πολλές user assigned**, οπότε είναι πάντα σημαντικό να προσπαθείτε να βρείτε όλες αυτές αν συμβιβάσετε τη function γιατί μπορεί να μπορείτε να κλιμακώσετε προνόμια σε πολλές διαχειριζόμενες ταυτότητες από μόνο μία Function.
|
||||
>
|
||||
> Αν δεν χρησιμοποιείται καμία system managed identity αλλά μία ή περισσότερες user managed identities είναι συνδεδεμένες σε μια function, από προεπιλογή δεν θα μπορείτε να αποκτήσετε κανένα token.
|
||||
|
||||
Είναι δυνατό να χρησιμοποιήσετε τα [**PEASS scripts**](https://github.com/peass-ng/PEASS-ng) για να αποκτήσετε tokens από την προεπιλεγμένη διαχειριζόμενη ταυτότητα από το metadata endpoint. Ή μπορείτε να τα αποκτήσετε **χειροκίνητα** όπως εξηγείται σε:
|
||||
|
||||
{% embed url="https://book.hacktricks.xyz/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf#azure-vm" %}
|
||||
|
||||
Σημειώστε ότι πρέπει να βρείτε έναν τρόπο να **ελέγξετε όλες τις Managed Identities που έχει συνδεδεμένες μια function** καθώς αν δεν το υποδείξετε, το metadata endpoint θα **χρησιμοποιεί μόνο την προεπιλεγμένη** (ελέγξτε τον προηγούμενο σύνδεσμο για περισσότερες πληροφορίες).
|
||||
|
||||
## Access Keys
|
||||
|
||||
> [!NOTE]
|
||||
> Σημειώστε ότι δεν υπάρχουν δικαιώματα RBAC για να δώσουν πρόσβαση στους χρήστες να καλέσουν τις functions. Η **κλήση της function εξαρτάται από τον ενεργοποιητή** που επιλέχθηκε κατά τη δημιουργία της και αν επιλέχθηκε ένας HTTP Trigger, μπορεί να χρειαστεί να χρησιμοποιήσετε ένα **access key**.
|
||||
|
||||
Όταν δημιουργείτε ένα endpoint μέσα σε μια function χρησιμοποιώντας έναν **HTTP trigger** είναι δυνατό να υποδείξετε το **access key authorization level** που απαιτείται για να ενεργοποιήσετε τη function. Διατίθενται τρεις επιλογές:
|
||||
|
||||
- **ANONYMOUS**: **Όλοι** μπορούν να έχουν πρόσβαση στη function μέσω του URL.
|
||||
- **FUNCTION**: Το endpoint είναι προσβάσιμο μόνο σε χρήστες που χρησιμοποιούν ένα **function, host ή master key**.
|
||||
- **ADMIN**: Το endpoint είναι προσβάσιμο μόνο σε χρήστες με ένα **master key**.
|
||||
|
||||
**Τύποι κλειδιών:**
|
||||
|
||||
- **Function Keys:** Τα function keys μπορεί να είναι είτε προεπιλεγμένα είτε καθορισμένα από τον χρήστη και έχουν σχεδιαστεί για να παρέχουν πρόσβαση αποκλειστικά σε **συγκεκριμένα function endpoints** εντός μιας Function App επιτρέποντας μια πιο λεπτομερή πρόσβαση στα endpoints.
|
||||
- **Host Keys:** Τα host keys, τα οποία μπορεί επίσης να είναι προεπιλεγμένα ή καθορισμένα από τον χρήστη, παρέχουν πρόσβαση σε **όλα τα function endpoints εντός μιας Function App με επίπεδο πρόσβασης FUNCTION**.
|
||||
- **Master Key:** Το master key (`_master`) χρησιμεύει ως διοικητικό κλειδί που προσφέρει ανυψωμένα δικαιώματα, συμπεριλαμβανομένης της πρόσβασης σε όλα τα function endpoints (συμπεριλαμβανομένου του επιπέδου πρόσβασης ADMIN). Αυτό το **κλειδί δεν μπορεί να ανακληθεί.**
|
||||
- **System Keys:** Τα system keys είναι **διαχειριζόμενα από συγκεκριμένες επεκτάσεις** και απαιτούνται για την πρόσβαση σε webhook endpoints που χρησιμοποιούνται από εσωτερικά συστατικά. Παραδείγματα περιλαμβάνουν τον Event Grid trigger και τις Durable Functions, οι οποίες χρησιμοποιούν system keys για να αλληλεπιδρούν με τις αντίστοιχες APIs τους με ασφάλεια.
|
||||
|
||||
> [!TIP]
|
||||
> Παράδειγμα για πρόσβαση σε ένα endpoint API function χρησιμοποιώντας ένα κλειδί:
|
||||
>
|
||||
> `https://<function_uniq_name>.azurewebsites.net/api/<endpoint_name>?code=<access_key>`
|
||||
|
||||
### Basic Authentication
|
||||
|
||||
Ακριβώς όπως στις App Services, οι Functions υποστηρίζουν επίσης βασική αυθεντικοποίηση για σύνδεση σε **SCM** και **FTP** για την ανάπτυξη κώδικα χρησιμοποιώντας ένα **όνομα χρήστη και κωδικό πρόσβασης σε ένα URL** που παρέχεται από την Azure. Περισσότερες πληροφορίες σχετικά με αυτό σε:
|
||||
|
||||
{{#ref}}
|
||||
az-app-service.md
|
||||
{{#endref}}
|
||||
|
||||
### Github Based Deployments
|
||||
|
||||
Όταν μια function δημιουργείται από ένα Github repo, η διαδικτυακή κονσόλα Azure επιτρέπει να **δημιουργηθεί αυτόματα ένα Github Workflow σε ένα συγκεκριμένο αποθετήριο** έτσι ώστε κάθε φορά που αυτό το αποθετήριο ενημερώνεται, ο κώδικας της function να ενημερώνεται. Στην πραγματικότητα, το Github Action yaml για μια python function φαίνεται έτσι:
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Github Action Yaml</summary>
|
||||
Όταν δημιουργείτε μια νέα Function App που δεν είναι κοντεϊνερized (αλλά δίνετε τον κώδικα για εκτέλεση), τα **δε
|
||||
```yaml
|
||||
# Docs for the Azure Web Apps Deploy action: https://github.com/azure/functions-action
|
||||
# More GitHub Actions for Azure: https://github.com/Azure/actions
|
||||
@@ -195,7 +106,7 @@ package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
|
||||
Επιπλέον, μια **Διαχειριζόμενη Ταυτότητα** δημιουργείται ώστε η Github Action από το αποθετήριο να μπορεί να συνδεθεί στο Azure με αυτή. Αυτό γίνεται με τη δημιουργία ενός Ομοσπονδιακού διαπιστευτηρίου πάνω στη **Διαχειριζόμενη Ταυτότητα** επιτρέποντας στον **Εκδότη** `https://token.actions.githubusercontent.com` και τον **Αναγνωριστή Υποκειμένου** `repo:<org-name>/<repo-name>:ref:refs/heads/<branch-name>`.
|
||||
|
||||
> [!CAUTION]
|
||||
> Επομένως, οποιοσδήποτε παραβιάσει αυτό το αποθετήριο θα μπορεί να παραβιάσει τη λειτουργία και τις Διαχειριζόμενες Ταυτότητες που είναι συνδεδεμένες με αυτή.
|
||||
> Επομένως, οποιοσδήποτε συμβιβάσει αυτό το αποθετήριο θα μπορεί να συμβιβάσει τη λειτουργία και τις Διαχειριζόμενες Ταυτότητες που είναι συνδεδεμένες με αυτή.
|
||||
|
||||
### Αναπτύξεις Βασισμένες σε Κοντέινερ
|
||||
|
||||
|
||||
Reference in New Issue
Block a user