diff --git a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc/README.md b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc/README.md index c3d90ccfd..5648bc3dd 100644 --- a/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc/README.md +++ b/src/pentesting-cloud/aws-security/aws-privilege-escalation/aws-rds-privesc/README.md @@ -4,7 +4,7 @@ ## RDS - 관계형 데이터베이스 서비스 -For more information about RDS check: +RDS에 대한 자세한 정보는 다음을 확인하세요: {{#ref}} ../../aws-services/aws-relational-database-rds-enum.md @@ -12,7 +12,7 @@ For more information about RDS check: ### `rds:ModifyDBInstance` -해당 권한이 있으면 공격자는 **마스터 사용자 비밀번호를 수정**하고, 데이터베이스 내 로그인 정보를 변경할 수 있습니다: +해당 권한으로 공격자는 **마스터 사용자의 비밀번호를 변경**하고, 데이터베이스 내 로그인 정보를 변경할 수 있습니다: ```bash # Get the DB username, db name and address aws rds describe-db-instances @@ -27,30 +27,30 @@ aws rds modify-db-instance \ psql postgresql://:@:5432/ ``` > [!WARNING] -> 데이터베이스에 **접속할 수 있어야 합니다** (보통 내부 네트워크에서만 접근 가능합니다). +> 데이터베이스에 **접속할 수 있어야 합니다** (일반적으로 내부 네트워크에서만 접근 가능합니다). -**Potential Impact:** 데이터베이스 내부에서 민감한 정보를 찾을 수 있습니다. +**잠재적 영향:** 데이터베이스 내부에서 민감한 정보를 찾을 수 있습니다. ### rds-db:connect 해당 [**docs**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html)에 따르면 이 권한을 가진 사용자는 DB 인스턴스에 연결할 수 있습니다. -### RDS Role IAM 권한 악용 +### Abuse RDS Role IAM permissions #### Postgresql (Aurora) > [!TIP] -> 만약 **`SELECT datname FROM pg_database;`**를 실행해 **`rdsadmin`**이라는 데이터베이스가 나오면, 당신은 **AWS postgresql database** 내부에 있다는 것을 알 수 있습니다. +> **`SELECT datname FROM pg_database;`**를 실행했을 때 **`rdsadmin`**이라는 데이터베이스가 보이면, **AWS postgresql 데이터베이스** 내부에 있다는 것을 알 수 있습니다. -먼저 이 데이터베이스가 다른 AWS 서비스에 접근하는 데 사용되었는지 확인할 수 있습니다. 설치된 extensions를 확인해 보세요: +먼저 이 데이터베이스가 다른 AWS 서비스에 접근하는 데 사용되었는지 확인할 수 있습니다. 설치된 확장을 확인해 보면 됩니다: ```sql SELECT * FROM pg_extension; ``` -만약 **`aws_s3`** 같은 항목을 찾으면, 이 데이터베이스가 **S3에 대한 어떤 형태의 접근 권한**을 가지고 있다고 가정할 수 있습니다 (다른 확장으로는 **`aws_ml`** 및 **`aws_lambda`** 등이 있습니다). +If you find something like **`aws_s3`** you can assume this database has **some kind of access over S3** (there are other extensions such as **`aws_ml`** and **`aws_lambda`**). -또한 **`aws rds describe-db-clusters`** 를 실행할 권한이 있다면, 해당 명령에서 **`AssociatedRoles`** 필드에 **cluster에 어떤 IAM Role이 연결되어 있는지** 확인할 수 있습니다. 만약 연결되어 있다면 데이터베이스가 **다른 AWS 서비스에 접근하도록 준비되어 있었다**고 가정할 수 있습니다. 역할의 **name**(또는 역할의 **permissions**를 확인할 수 있다면)을 바탕으로 데이터베이스가 어떤 추가 접근 권한을 갖는지 **guess**할 수 있습니다. +또한, **`aws rds describe-db-clusters`** 를 실행할 권한이 있다면 출력에서 **`AssociatedRoles`** 필드에 **클러스터에 IAM Role이 연결되어 있는지** 확인할 수 있습니다. 만약 연결된 Role이 있다면, 해당 데이터베이스가 **다른 AWS services에 접근하도록 준비되어 있었다**고 볼 수 있습니다. Role의 **name**(또는 Role의 **permissions**을 확인할 수 있다면)을 기반으로 데이터베이스가 어떤 추가 접근 권한을 가졌는지 **guess**할 수 있습니다. -이제 **bucket 내부의 파일을 읽으려면** 전체 경로를 알아야 합니다. 다음과 같이 읽을 수 있습니다: +이제, **버킷 내부의 파일을 읽기 위해서는** 전체 경로를 알아야 합니다. 다음으로 읽을 수 있습니다: ```sql // Create table CREATE TABLE ttemp (col TEXT); @@ -71,7 +71,7 @@ SELECT * from ttemp; // Delete table DROP TABLE ttemp; ``` -만약 **raw AWS credentials**가 있다면, 이를 사용해 S3 데이터에 다음과 같이 접근할 수도 있습니다: +만약 **raw AWS credentials**가 있다면 이를 사용해 S3 데이터에 접근할 수도 있습니다: ```sql SELECT aws_s3.table_import_from_s3( 't', '', '(format csv)', @@ -80,18 +80,18 @@ aws_commons.create_aws_credentials('sample_access_key', 'sample_secret_key', '') ); ``` > [!NOTE] -> Postgresql은 S3에 접근하기 위해 **parameter group 변수를 변경할 필요가 없다**. +> Postgresql **S3에 접근하기 위해 어떤 parameter group 변수도 변경할 필요가 없다**. #### Mysql (Aurora) > [!TIP] -> Mysql 내부에서 쿼리 **`SELECT User, Host FROM mysql.user;`** 를 실행했을 때 **`rdsadmin`**이라는 사용자가 있으면 **AWS RDS mysql db** 안에 있다고 간주할 수 있다. +> 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 데이터에 접근할 준비가 되어 있다고 볼 수 있다. +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 서비스에 대한 접근을 의미한다). +또한, **`aws rds describe-db-clusters`** 를 실행할 권한이 있으면 클러스터에 **연결된 역할(associated role)** 이 있는지 확인할 수 있다(이는 일반적으로 AWS 서비스에 대한 접근을 의미한다). -이제 **버킷 안의 파일을 읽으려면** 전체 경로를 알아야 한다. 다음 명령으로 읽을 수 있다: +이제 **버킷 내 파일을 읽기(read a file inside a bucket)** 위해서는 전체 경로를 알아야 한다. 다음 명령으로 읽을 수 있다: ```sql CREATE TABLE ttemp (col TEXT); LOAD DATA FROM S3 's3://mybucket/data.txt' INTO TABLE ttemp(col); @@ -100,16 +100,16 @@ DROP TABLE ttemp; ``` ### `rds:AddRoleToDBCluster`, `iam:PassRole` -권한 `rds:AddRoleToDBCluster` 및 `iam:PassRole`를 가진 공격자는 **기존 RDS 인스턴스에 지정된 역할을 추가할 수 있습니다**. 이는 공격자가 **민감한 데이터에 접근**하거나 인스턴스 내의 데이터를 수정할 수 있게 합니다. +권한 `rds:AddRoleToDBCluster` 및 `iam:PassRole`을 가진 attacker는 **기존 RDS 인스턴스에 지정된 역할을 추가할 수 있습니다**. 이로 인해 attacker는 **민감한 데이터에 접근**하거나 인스턴스 내의 데이터를 수정할 수 있습니다. ```bash aws add-role-to-db-cluster --db-cluster-identifier --role-arn ``` -**잠재적 영향**: RDS 인스턴스의 민감한 데이터 접근 또는 데이터에 대한 무단 수정.\ -일부 DB는 추가 구성이 필요합니다. 예를 들어 Mysql의 경우 role ARN을 parameter groups에도 지정해야 합니다. +**Potential Impact**: RDS 인스턴스의 민감한 데이터에 접근하거나 데이터에 무단으로 변경을 가할 수 있습니다.\ +Note that some DBs require additional configs such as Mysql, which needs to specify the role ARN in the aprameter groups also. ### `rds:CreateDBInstance` -이 권한만으로 공격자는 이미 존재하고 **IAM role**이 연결되어 있는 클러스터 내에 **새 인스턴스**를 생성할 수 있습니다. 공격자는 마스터 사용자 비밀번호를 변경할 수는 없지만, 새 데이터베이스 인스턴스를 인터넷에 노출시킬 수 있습니다: +이 권한만으로 공격자는 이미 존재하고 **IAM role**이 연결된 클러스터 내에 **새 인스턴스**를 생성할 수 있습니다. 마스터 사용자 암호는 변경할 수 없지만, 새 데이터베이스 인스턴스를 인터넷에 노출시킬 수 있습니다: ```bash aws --region eu-west-1 --profile none-priv rds create-db-instance \ --db-instance-identifier mydbinstance2 \ @@ -124,28 +124,48 @@ aws --region eu-west-1 --profile none-priv rds create-db-instance \ > [!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. +`rds:CreateDBInstance` 및 `iam:PassRole` 권한을 가진 공격자는 **지정된 역할이 연결된 새로운 RDS 인스턴스를 생성할 수 있습니다**. 공격자는 이후 **민감한 데이터에 접근**하거나 인스턴스 내의 데이터를 수정할 수 있습니다. > [!WARNING] -> 연결할 role/instance-profile의 일부 요구사항 (자세한 내용은 [**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)): +> Some requirements of the role/instance-profile to attach (from [**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)): -> - 인스턴스 프로파일은 귀하의 계정에 존재해야 합니다. -> - 프로파일에는 Amazon EC2가 맡을 수 있는 권한을 가진 IAM 역할이 있어야 합니다. -> - 인스턴스 프로파일 이름과 연결된 IAM 역할 이름은 접두사 `AWSRDSCustom`으로 시작해야 합니다. +> - profile은 귀하의 계정에 존재해야 합니다. +> - profile은 Amazon EC2가 assume할 수 있는 권한을 가진 IAM role을 포함해야 합니다. +> - instance profile name과 연관된 IAM role name은 접두사 `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 인스턴스의 민감한 데이터에 대한 접근 또는 데이터의 무단 수정. +**Potential Impact**: RDS 인스턴스의 민감한 데이터에 대한 액세스 또는 데이터에 대한 무단 수정. ### `rds:AddRoleToDBInstance`, `iam:PassRole` -`rds:AddRoleToDBInstance` 및 `iam:PassRole` 권한을 가진 공격자는 **기존 RDS 인스턴스에 지정된 역할을 추가할 수 있습니다**. 이는 공격자가 **민감한 데이터에 접근**하거나 인스턴스 내의 데이터를 수정할 수 있게 합니다. +권한 `rds:AddRoleToDBInstance` 및 `iam: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 ``` -**잠재적 영향**: RDS 인스턴스 내 민감한 데이터에 대한 접근 또는 데이터에 대한 무단 수정. +**Potential Impact**: 민감한 데이터에 접근하거나 RDS 인스턴스의 데이터를 무단으로 수정할 수 있습니다. + +### `rds:CreateBlueGreenDeployment`, `rds:AddRoleToDBCluster`, `iam:PassRole`, `rds:SwitchoverBlueGreenDeployment` + +해당 권한을 가진 공격자는 production 데이터베이스(Blue)를 복제하고, 복제본(Green)에 고권한 IAM 역할을 연결한 다음 switchover를 사용해 운영 환경을 교체할 수 있습니다. 이를 통해 공격자는 데이터베이스의 권한을 상승시켜 다른 AWS 리소스에 무단으로 접근할 수 있습니다. +```bash +# Create a Green deployment (clone) of the production cluster +aws rds create-blue-green-deployment \ +--blue-green-deployment-name \ +--source + +# Attach a high-privilege IAM role to the Green cluster +aws rds add-role-to-db-cluster \ +--db-cluster-identifier \ +--role-arn + +# Switch the Green environment to Production +aws rds switchover-blue-green-deployment \ +--blue-green-deployment-identifier +``` +**잠재적 영향**: 프로덕션 데이터베이스 환경의 완전한 장악. 전환 후 데이터베이스는 권한이 상승된 상태로 동작하여 데이터베이스 내부에서 다른 AWS 서비스(예: S3, Lambda, Secrets Manager)에 대한 무단 접근을 허용합니다. {{#include ../../../../banners/hacktricks-training.md}}