# AWS - Database relazionale (RDS) Enumerazione

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

## Informazioni di base

Il **Relational Database Service (RDS)** offerto da AWS è progettato per semplificare il deployment, l'operatività e lo scaling di un **database relazionale nel cloud**. Questo servizio offre vantaggi in termini di costi e scalabilità automatizzando attività laboriose come il provisioning dell'hardware, la configurazione del database, il patching e i backup.

AWS RDS supporta diversi motori di database relazionali molto diffusi inclusi MySQL, PostgreSQL, MariaDB, Oracle Database, Microsoft SQL Server e Amazon Aurora, con compatibilità per entrambe le versioni MySQL e PostgreSQL.

Le caratteristiche principali di RDS includono:

- **La gestione delle istanze di database** è semplificata.
- Creazione di **read replicas** per migliorare le prestazioni di lettura.
- Configurazione di deployment **multi-Availability Zone (AZ)** per garantire alta disponibilità e meccanismi di failover.
- **Integrazione** con altri servizi AWS, come:
- AWS Identity and Access Management (**IAM**) per un solido controllo degli accessi.
- AWS **CloudWatch** per monitoraggio e metriche complete.
- AWS Key Management Service (**KMS**) per garantire la crittografia a riposo.

## Credenziali

Quando si crea il DB cluster lo **username** master può essere configurato (**`admin`** di default). Per generare la password di questo utente puoi:

- **Indicare** una **password** manualmente
- Dire a RDS di **generarla automaticamente**
- Dire a RDS di gestirla in **AWS Secret Manager** crittografata con una chiave KMS

<figure><img src="../../../images/image (144).png" alt=""><figcaption></figcaption></figure>

### Autenticazione

Ci sono 3 tipi di opzioni di autenticazione, ma l'uso della **password principale è sempre consentito**:

<figure><img src="../../../images/image (227).png" alt=""><figcaption></figcaption></figure>

### Accesso pubblico & VPC

Per default **non viene concesso alcun accesso pubblico** ai database, tuttavia **potrebbe essere concesso**. Pertanto, di default solo le macchine nella stessa VPC saranno in grado di accedervi se il **security group** selezionato (sono memorizzati in EC2 SG) lo permette.

Invece di esporre un'istanza DB, è possibile creare una **RDS Proxy** che **migliora** la **scalabilità** e la **disponibilità** del DB cluster.

Inoltre, è possibile **modificare anche la porta del database**.

### Crittografia

**La crittografia è abilitata di default** utilizzando una chiave gestita da AWS (si può scegliere anche una CMK).

Abilitando la crittografia, si abilita la **crittografia a riposo per lo storage, gli snapshot, le read replicas e i backup**. Le chiavi per gestire questa crittografia possono essere emesse usando **KMS**.\
Non è possibile aggiungere questo livello di crittografia dopo che il database è stato creato. **Deve essere fatto durante la creazione**.

Tuttavia, esiste una **soluzione alternativa che permette di crittografare un database non crittografato come segue**. È possibile creare uno snapshot del database non crittografato, creare una copia crittografata di quello snapshot, usare quello snapshot crittografato per creare un nuovo database e, infine, il database sarà crittografato.

#### Transparent Data Encryption (TDE)

Oltre alle capacità di crittografia intrinseche a RDS a livello applicativo, RDS supporta anche **meccanismi di crittografia a livello di piattaforma aggiuntivi** per proteggere i dati a riposo. Questo include **Transparent Data Encryption (TDE)** per Oracle e SQL Server. Tuttavia, è importante notare che mentre TDE migliora la sicurezza cifrando i dati a riposo, può anche **influire sulle prestazioni del database**. Questo impatto sulle prestazioni è particolarmente evidente quando usato insieme alle funzioni crittografiche di MySQL o alle funzioni crittografiche Transact-SQL di Microsoft.

Per utilizzare TDE, sono richiesti alcuni passaggi preliminari:

1. **Associazione a un Option Group**:
- Il database deve essere associato a un option group. Gli option group servono come contenitori per impostazioni e funzionalità, facilitando la gestione del database, comprese le migliorie di sicurezza.
- Tuttavia, è importante notare che gli option group sono disponibili solo per specifici motori di database e versioni.
2. **Inclusione di TDE nell'Option Group**:
- Una volta associato a un option group, l'opzione Oracle Transparent Data Encryption deve essere inclusa in quel gruppo.
- È essenziale riconoscere che una volta aggiunta l'opzione TDE a un option group, diventa permanente e non può essere rimossa.
3. **Modalità di crittografia TDE**:
- TDE offre due diverse modalità di crittografia:
- **TDE Tablespace Encryption**: questa modalità cripta interi tablespace, offrendo una protezione dati più ampia.
- **TDE Column Encryption**: questa modalità si concentra sulla crittografia di elementi specifici e individuali all'interno del database, permettendo un controllo più granulare su quali dati vengono criptati.

Comprendere questi prerequisiti e le complessità operative di TDE è fondamentale per implementare e gestire efficacemente la crittografia all'interno di RDS, assicurando sia la sicurezza dei dati sia la conformità agli standard necessari.

### Enumerazione
```bash
# Clusters info
## Get Endpoints, username, port, iam auth enabled, attached roles, SG
aws rds describe-db-clusters
aws rds describe-db-cluster-endpoints #Cluster URLs
aws rds describe-db-cluster-backtracks --db-cluster-identifier <cluster-name>

## Cluster snapshots
aws rds describe-db-cluster-snapshots
aws rds describe-db-cluster-snapshots --include-public --snapshot-type public

## Restore cluster snapshot as new instance
aws rds restore-db-instance-from-db-snapshot --db-cluster-identifier <ID> --snapshot-identifier <ID>

# Get DB instances info
aws rds describe-db-instances #username, url, port, vpc, SG, is public?
aws rds describe-db-security-groups

## Find automated backups
aws rds describe-db-instance-automated-backups

## Find snapshots
aws rds describe-db-snapshots
aws rds describe-db-snapshots --include-public --snapshot-type public

## Restore snapshot as new instance
aws rds restore-db-instance-from-db-snapshot --db-instance-identifier <ID> --db-snapshot-identifier <ID> --availability-zone us-west-2a

# Any public snapshot in the account
aws rds describe-db-snapshots --snapshot-type public

# Proxies
aws rds describe-db-proxy-endpoints
aws rds describe-db-proxy-target-groups
aws rds describe-db-proxy-targets

## reset credentials of MasterUsername
aws rds modify-db-instance --db-instance-identifier <ID> --master-user-password <NewPassword> --apply-immediately
```
### Accesso non autenticato

{{#ref}}
../aws-unauthenticated-enum-access/aws-rds-unauthenticated-enum/README.md
{{#endref}}

### Privesc

{{#ref}}
../aws-privilege-escalation/aws-rds-privesc/README.md
{{#endref}}

### Post Exploitation

{{#ref}}
../aws-post-exploitation/aws-rds-post-exploitation/README.md
{{#endref}}

### Persistence

{{#ref}}
../aws-persistence/aws-rds-persistence/README.md
{{#endref}}

### SQL Injection

Esistono modi per accedere ai dati di DynamoDB con **SQL syntax**, pertanto le tipiche **SQL injections sono anche possibili**.

{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/sql-injection/index.html
{{#endref}}

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