Translated ['network-services-pentesting/pentesting-postgresql.md'] to f

This commit is contained in:
Translator 2023-08-29 18:53:40 +00:00
parent 004805f6a2
commit f763eef4d6

View file

@ -4,7 +4,7 @@
\
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire facilement et **automatiser des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
Obtenez un accès aujourd'hui :
Accédez dès aujourd'hui :
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
@ -38,53 +38,23 @@ Pour effectuer une énumération de base sur un serveur PostgreSQL, vous devez d
Pour vous connecter à un serveur PostgreSQL à l'aide de `psql`, utilisez la commande suivante :
```bash
psql -h <adresse_IP_serveur> -p <port> -U <utilisateur> -d <base_de_données>
psql -h <adresse_IP_serveur> -p <port> -U <nom_utilisateur> -d <nom_base_de_données>
```
Remplacez `<adresse_IP_serveur>` par l'adresse IP du serveur PostgreSQL, `<port>` par le port sur lequel le serveur écoute (par défaut : 5432), `<utilisateur>` par le nom d'utilisateur et `<base_de_données>` par le nom de la base de données à laquelle vous souhaitez vous connecter.
Remplacez `<adresse_IP_serveur>` par l'adresse IP du serveur PostgreSQL, `<port>` par le numéro de port sur lequel le serveur écoute (par défaut : 5432), `<nom_utilisateur>` par le nom d'utilisateur et `<nom_base_de_données>` par le nom de la base de données à laquelle vous souhaitez vous connecter.
### Connexion à l'aide de `pgAdmin`
Pour vous connecter à un serveur PostgreSQL à l'aide de `pgAdmin`, suivez les étapes suivantes :
1. Lancez `pgAdmin` et cliquez avec le bouton droit sur "Serveurs" dans le volet de gauche.
2. Sélectionnez "Créer" > "Serveur".
2. Sélectionnez "Créer" -> "Serveur".
3. Dans l'onglet "Général", donnez un nom au serveur.
4. Dans l'onglet "Connexion", saisissez les informations de connexion, y compris l'adresse IP du serveur, le port, le nom d'utilisateur et le mot de passe.
4. Dans l'onglet "Connexion", saisissez les informations de connexion, telles que l'adresse IP du serveur, le numéro de port, le nom d'utilisateur et le mot de passe.
5. Cliquez sur "Enregistrer" pour ajouter le serveur.
6. Double-cliquez sur le serveur pour vous connecter.
Une fois connecté au serveur PostgreSQL, vous pouvez commencer à effectuer une énumération de base en utilisant des requêtes SQL pour récupérer des informations sur les bases de données, les tables, les colonnes, etc.
### Énumération de base
Voici quelques requêtes SQL courantes que vous pouvez utiliser pour effectuer une énumération de base :
- Pour afficher les bases de données disponibles :
```sql
SELECT datname FROM pg_database;
```
- Pour afficher les tables dans une base de données spécifique :
```sql
SELECT tablename FROM pg_tables WHERE schemaname = 'public';
```
- Pour afficher les colonnes d'une table spécifique :
```sql
SELECT column_name FROM information_schema.columns WHERE table_name = '<nom_table>';
```
- Pour afficher les données d'une table spécifique :
```sql
SELECT * FROM <nom_table>;
```
Ces requêtes vous aideront à obtenir une vue d'ensemble des bases de données, des tables et des colonnes disponibles sur le serveur PostgreSQL, ce qui peut être utile pour la phase de reconnaissance lors d'un test de pénétration.
```bash
psql -U <myuser> # Open psql console with user
psql -h <host> -U <username> -d <database> # Remote connection
@ -99,7 +69,10 @@ psql -h localhost -d <database_name> -U <User> #Password will be prompted
\du+ # Get users roles
# Get current user
Select user;
SELECT user;
# Get current database
SELECT current_catalog;
# List schemas
SELECT schema_name,schema_owner FROM information_schema.schemata;
@ -309,71 +282,47 @@ CREATE ROLE u LOGIN PASSWORD 'lriohfugwebfdwrr' IN GROUP pg_read_server_files;
```
### Tables
Les tables sont des objets fondamentaux dans PostgreSQL. Elles sont utilisées pour stocker et organiser les données de manière structurée. Chaque table est composée de colonnes et de lignes.
Les tables sont des objets de base de données qui stockent les données de manière organisée. Elles sont composées de colonnes et de lignes, où chaque colonne représente un attribut et chaque ligne représente un enregistrement.
#### Création de tables
Lors de la pentest d'une base de données PostgreSQL, il est important d'analyser les tables pour identifier les informations sensibles et les vulnérabilités potentielles. Voici quelques techniques couramment utilisées :
Pour créer une table, vous pouvez utiliser la commande `CREATE TABLE`. Voici un exemple de syntaxe :
#### 1. Enumération des tables
L'objectif de cette technique est d'obtenir la liste complète des tables présentes dans la base de données. Cela peut être réalisé en utilisant des requêtes SQL spécifiques, telles que :
```sql
CREATE TABLE nom_table (
nom_colonne1 type_colonne1,
nom_colonne2 type_colonne2,
...
);
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
```
Remplacez `nom_table` par le nom de votre table, `nom_colonne` par le nom de chaque colonne et `type_colonne` par le type de données de chaque colonne.
#### 2. Extraction des données
#### Suppression de tables
Pour supprimer une table, vous pouvez utiliser la commande `DROP TABLE`. Voici un exemple de syntaxe :
Une fois que les tables ont été identifiées, il est possible d'extraire les données qu'elles contiennent. Cela peut être fait en utilisant des requêtes SQL pour sélectionner les colonnes et les enregistrements souhaités. Par exemple :
```sql
DROP TABLE nom_table;
SELECT * FROM users;
```
Remplacez `nom_table` par le nom de la table que vous souhaitez supprimer.
#### 3. Injection SQL
#### Modification de tables
Pour modifier une table existante, vous pouvez utiliser la commande `ALTER TABLE`. Voici quelques exemples de modifications courantes :
- Ajouter une colonne :
Si une application web est connectée à la base de données PostgreSQL, il est possible d'exploiter des vulnérabilités d'injection SQL pour extraire des données non autorisées. Cela peut être réalisé en manipulant les requêtes SQL de l'application pour exécuter du code malveillant. Par exemple :
```sql
ALTER TABLE nom_table ADD COLUMN nom_colonne type_colonne;
SELECT * FROM users WHERE username = 'admin' OR '1'='1';
```
- Supprimer une colonne :
#### 4. Injection de commandes
Dans certains cas, il est possible d'injecter des commandes système directement dans les requêtes SQL pour exécuter des commandes arbitraires sur le serveur PostgreSQL. Cela peut être utilisé pour obtenir un accès plus profond au système d'exploitation. Par exemple :
```sql
ALTER TABLE nom_table DROP COLUMN nom_colonne;
SELECT * FROM users; SELECT * FROM pg_shadow;
```
- Modifier le type de données d'une colonne :
#### 5. Attaques par force brute
```sql
ALTER TABLE nom_table ALTER COLUMN nom_colonne TYPE nouveau_type_colonne;
```
Si les mots de passe des utilisateurs sont stockés dans la base de données PostgreSQL, il est possible de les attaquer par force brute en essayant différentes combinaisons de mots de passe jusqu'à ce que le bon soit trouvé. Cela peut être réalisé en utilisant des outils spécialisés tels que Hydra ou Medusa.
Remplacez `nom_table` par le nom de la table que vous souhaitez modifier, `nom_colonne` par le nom de la colonne concernée et `nouveau_type_colonne` par le nouveau type de données.
#### Consultation des tables
Pour consulter les tables existantes dans une base de données, vous pouvez utiliser la commande `SELECT` avec la clause `FROM`. Voici un exemple de syntaxe :
```sql
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public';
```
Cette requête renverra le nom de toutes les tables présentes dans le schéma public de la base de données.
#### Conclusion
Les tables sont des éléments essentiels dans PostgreSQL pour stocker et organiser les données. Vous pouvez les créer, les modifier et les supprimer à l'aide des commandes appropriées. Utilisez la commande `SELECT` pour consulter les tables existantes dans une base de données.
Il est important de noter que toutes ces techniques doivent être utilisées de manière éthique et légale, avec l'autorisation appropriée du propriétaire du système.
```sql
# Get owners of tables
select schemaname,tablename,tableowner from pg_tables;
@ -572,7 +521,7 @@ Le **fichier de configuration** de PostgreSQL est **modifiable** par l'utilisate
Le fichier de configuration possède certains attributs intéressants qui peuvent conduire à une RCE :
* `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` Chemin de la clé privée de la base de données
* `ssl_passphrase_command = ''` Si le fichier privé est protégé par un mot de passe (crypté), PostgreSQL **exécutera la commande indiquée dans cet attribut**.
* `ssl_passphrase_command = ''` Si le fichier privé est protégé par un mot de passe (crypté), PostgreSQL exécutera la commande indiquée dans cet attribut.
* `ssl_passphrase_command_supports_reload = off` **Si** cet attribut est **activé**, la **commande** exécutée si la clé est protégée par un mot de passe **sera exécutée** lorsque `pg_reload_conf()` est **exécuté**.
Ensuite, un attaquant devra :
@ -587,7 +536,7 @@ Ensuite, un attaquant devra :
2. `ssl_passphrase_command_supports_reload = on`
6. Exécuter `pg_reload_conf()`
Lors des tests, j'ai remarqué que cela ne fonctionnera que si le **fichier de clé privée a les privilèges 640**, il est **possédé par root** et par le **groupe ssl-cert ou postgres** (afin que l'utilisateur postgres puisse le lire), et est placé dans _/var/lib/postgresql/12/main_.
Lors des tests, j'ai remarqué que cela ne fonctionnera que si le **fichier de clé privée a des privilèges 640**, qu'il est **possédé par root** et par le **groupe ssl-cert ou postgres** (afin que l'utilisateur postgres puisse le lire), et qu'il est placé dans _/var/lib/postgresql/12/main_.
**Plus** [**d'informations sur cette technique ici**](https://pulsesecurity.co.nz/articles/postgres-sqli)**.**
@ -706,7 +655,7 @@ port=5432
user=someuser
password=supersecret
dbname=somedb',
'Select usename,passwd from pg_shadow')
'SELECT usename,passwd from pg_shadow')
RETURNS (result TEXT);
```
{% hint style="warning" %}
@ -721,7 +670,7 @@ Si vous avez le mot de passe d'un utilisateur disposant de privilèges supérieu
SELECT * FROM dblink('host=127.0.0.1
user=someuser
dbname=somedb',
'Select usename,passwd from pg_shadow')
'SELECT usename,passwd from pg_shadow')
RETURNS (result TEXT);
```
Il est possible de vérifier si cette fonction existe avec :
@ -828,7 +777,7 @@ Les méthodes d'authentification basées sur le mot de passe sont **md5**, **cry
![](<../.gitbook/assets/image (9) (1) (2).png>)
\
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et **automatiser facilement des flux de travail** alimentés par les outils communautaires les plus avancés au monde.\
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour créer et **automatiser facilement des workflows** alimentés par les outils communautaires les plus avancés au monde.\
Accédez dès aujourd'hui :
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}