mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 13:13:41 +00:00
Translated ['network-services-pentesting/pentesting-postgresql.md'] to f
This commit is contained in:
parent
99d6946fdf
commit
05c192ae56
1 changed files with 61 additions and 55 deletions
|
@ -31,60 +31,50 @@ PORT STATE SERVICE
|
|||
```
|
||||
## Connexion et Enumération de base
|
||||
|
||||
Pour effectuer une énumération de base sur un serveur PostgreSQL, vous devez d'abord vous connecter au serveur à l'aide d'un client PostgreSQL. Vous pouvez utiliser des outils tels que `psql` ou `pgAdmin` pour vous connecter.
|
||||
|
||||
### Connexion à l'aide de `psql`
|
||||
|
||||
Pour vous connecter à un serveur PostgreSQL à l'aide de `psql`, utilisez la commande suivante :
|
||||
To connect to a PostgreSQL database, you can use the `psql` command-line tool. The syntax is as follows:
|
||||
|
||||
```bash
|
||||
psql -h <adresse_IP_serveur> -p <port> -U <utilisateur> -d <base_de_données>
|
||||
psql -h <host> -p <port> -U <username> -d <database>
|
||||
```
|
||||
|
||||
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.
|
||||
- `<host>`: The IP address or hostname of the target server.
|
||||
- `<port>`: The port number on which PostgreSQL is running (default is 5432).
|
||||
- `<username>`: The username to authenticate with.
|
||||
- `<database>`: The name of the database to connect to.
|
||||
|
||||
### 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".
|
||||
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.
|
||||
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 couramment utilisées pour effectuer une énumération de base :
|
||||
|
||||
- Pour afficher les bases de données disponibles :
|
||||
Once connected, you can start enumerating the database by running SQL queries. Here are some useful queries to gather information:
|
||||
|
||||
- List all databases:
|
||||
```sql
|
||||
SELECT datname FROM pg_database;
|
||||
\l
|
||||
```
|
||||
|
||||
- Pour afficher les tables dans une base de données spécifique :
|
||||
|
||||
- Connect to a specific database:
|
||||
```sql
|
||||
SELECT tablename FROM pg_tables WHERE schemaname = 'public';
|
||||
\c <database>
|
||||
```
|
||||
|
||||
- Pour afficher les colonnes d'une table spécifique :
|
||||
|
||||
- List all tables in the current database:
|
||||
```sql
|
||||
SELECT column_name FROM information_schema.columns WHERE table_name = '<nom_table>';
|
||||
\dt
|
||||
```
|
||||
|
||||
- Pour afficher les données d'une table spécifique :
|
||||
|
||||
- Show the structure of a table:
|
||||
```sql
|
||||
SELECT * FROM <nom_table>;
|
||||
\d <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.
|
||||
- Retrieve the first few rows from a table:
|
||||
```sql
|
||||
SELECT * FROM <table> LIMIT <limit>;
|
||||
```
|
||||
|
||||
- Show the columns of a table:
|
||||
```sql
|
||||
SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '<table>';
|
||||
```
|
||||
|
||||
Remember to replace `<database>` and `<table>` with the actual names of the database and table you want to interact with. These queries will help you gather valuable information about the database structure and contents, which can be useful for further exploitation.
|
||||
```bash
|
||||
psql -U <myuser> # Open psql console with user
|
||||
psql -h <host> -U <username> -d <database> # Remote connection
|
||||
|
@ -219,13 +209,9 @@ To dump the contents of a PostgreSQL database, you can use the following command
|
|||
pg_dump -U <username> -d <database> -f <output_file>
|
||||
```
|
||||
|
||||
### Creating a Backdoor
|
||||
### Creating Backdoors
|
||||
|
||||
To create a backdoor in a PostgreSQL database, you can use the following SQL query to create a new user with administrative privileges:
|
||||
|
||||
```sql
|
||||
CREATE USER <username> WITH SUPERUSER PASSWORD '<password>';
|
||||
```
|
||||
After gaining unauthorized access to a PostgreSQL database, an attacker may want to create a backdoor to maintain access in the future. This can be done by creating a new user with administrative privileges or by modifying existing user privileges.
|
||||
|
||||
## Conclusion
|
||||
|
||||
|
@ -238,7 +224,7 @@ DETAIL: FATAL: password authentication failed for user "name"
|
|||
DETAIL: could not connect to server: Connection timed out Is the server
|
||||
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
||||
```
|
||||
Malheureusement, il ne semble pas y avoir de moyen d'obtenir les détails de l'exception dans une fonction PL/pgSQL. Mais vous pouvez obtenir les détails si vous pouvez vous connecter directement au serveur PostgreSQL. S'il n'est pas possible d'obtenir les noms d'utilisateur et les mots de passe directement à partir des tables système, l'attaque par liste de mots décrite dans la section précédente pourrait être couronnée de succès.
|
||||
Malheureusement, il ne semble pas y avoir de moyen d'obtenir les détails de l'exception dans une fonction PL/pgSQL. Mais vous pouvez obtenir les détails si vous pouvez vous connecter directement au serveur PostgreSQL. S'il n'est pas possible d'obtenir les noms d'utilisateur et les mots de passe directement à partir des tables système, l'attaque par liste de mots décrite dans la section précédente pourrait être fructueuse.
|
||||
|
||||
## Énumération des privilèges
|
||||
|
||||
|
@ -315,21 +301,37 @@ CREATE ROLE u LOGIN PASSWORD 'lriohfugwebfdwrr' IN GROUP pg_read_server_files;
|
|||
|
||||
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.
|
||||
|
||||
Lors de la pentest d'une base de données PostgreSQL, il est important d'identifier les tables présentes et d'analyser leur structure. Cela permet de comprendre comment les données sont organisées et de repérer d'éventuelles vulnérabilités.
|
||||
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 :
|
||||
|
||||
Voici quelques techniques courantes pour pentester les tables PostgreSQL :
|
||||
#### 1. Enumération des tables
|
||||
|
||||
- **Recherche des tables** : Utilisez des requêtes SQL pour lister toutes les tables présentes dans la base de données. Vous pouvez utiliser la commande `SELECT` avec la clause `FROM information_schema.tables` pour obtenir cette information.
|
||||
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 :
|
||||
|
||||
- **Analyse de la structure** : Utilisez des requêtes SQL pour obtenir des informations sur la structure des tables, telles que les noms des colonnes, les types de données et les contraintes. Vous pouvez utiliser la commande `SELECT` avec la clause `FROM information_schema.columns` pour cela.
|
||||
```sql
|
||||
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';
|
||||
```
|
||||
|
||||
- **Extraction de données sensibles** : Utilisez des requêtes SQL pour extraire des données sensibles des tables. Par exemple, vous pouvez utiliser la commande `SELECT` pour récupérer des informations d'identification, des numéros de carte de crédit ou d'autres données confidentielles.
|
||||
#### 2. Extraction des données
|
||||
|
||||
- **Injection SQL** : Recherchez les vulnérabilités d'injection SQL dans les requêtes qui interagissent avec les tables PostgreSQL. L'injection SQL peut permettre à un attaquant d'exécuter du code malveillant ou de récupérer des données sensibles.
|
||||
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 :
|
||||
|
||||
- **Vérification des autorisations** : Vérifiez les autorisations accordées aux utilisateurs et aux rôles pour accéder aux tables. Assurez-vous que seuls les utilisateurs autorisés peuvent accéder et modifier les données.
|
||||
```sql
|
||||
SELECT * FROM users;
|
||||
```
|
||||
|
||||
En analysant les tables PostgreSQL lors d'une pentest, vous pouvez identifier les failles de sécurité potentielles et aider à renforcer la sécurité de la base de données.
|
||||
#### 3. Injection SQL
|
||||
|
||||
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 ou effectuer des actions non autorisées. Cela peut être réalisé en manipulant les requêtes SQL envoyées à la base de données.
|
||||
|
||||
#### 4. Vérification des autorisations
|
||||
|
||||
Il est important de vérifier les autorisations accordées aux utilisateurs et aux rôles de la base de données. Cela permet d'identifier les éventuelles vulnérabilités liées à des autorisations excessives ou à des erreurs de configuration.
|
||||
|
||||
#### 5. Recherche de fuites d'informations
|
||||
|
||||
Il est également essentiel de rechercher des fuites d'informations sensibles dans les tables de la base de données. Cela peut inclure des mots de passe stockés en clair, des informations d'identification, des données personnelles, etc.
|
||||
|
||||
En résumé, l'analyse des tables lors d'une pentest PostgreSQL est une étape cruciale pour identifier les vulnérabilités et les informations sensibles. Il est important de comprendre les techniques d'enumération, d'extraction de données, d'injection SQL, de vérification des autorisations et de recherche de fuites d'informations.
|
||||
```sql
|
||||
# Get owners of tables
|
||||
select schemaname,tablename,tableowner from pg_tables;
|
||||
|
@ -460,10 +462,14 @@ Vous pouvez trouver **plus de fonctions** dans [https://www.postgresql.org/docs/
|
|||
|
||||
### Écriture de fichiers simple
|
||||
|
||||
Seuls les **super utilisateurs** et les membres de **`pg_read_server_files`** peuvent utiliser la commande copy pour écrire des fichiers.
|
||||
Seuls les **super utilisateurs** et les membres de **`pg_write_server_files`** peuvent utiliser la commande copy pour écrire des fichiers.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```sql
|
||||
copy (select convert_from(decode('<ENCODED_PAYLOAD>','base64'),'utf-8')) to '/just/a/path.exec';
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
{% hint style="warning" %}
|
||||
N'oubliez pas que si vous n'êtes pas un super utilisateur mais que vous avez les permissions **`CREATEROLE`**, vous pouvez **vous ajouter en tant que membre de ce groupe :**
|
||||
```sql
|
||||
|
@ -561,7 +567,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**, 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_.
|
||||
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_.
|
||||
|
||||
**Plus** [**d'informations sur cette technique ici**](https://pulsesecurity.co.nz/articles/postgres-sqli)**.**
|
||||
|
||||
|
@ -580,7 +586,7 @@ Les étapes générales sont les suivantes :
|
|||
|
||||
**Plus** [**d'informations sur cette configuration et sur WAL ici**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.**
|
||||
|
||||
## **Élévation de privilèges PostgreSQL**
|
||||
## **Élévation de privilèges Postgres**
|
||||
|
||||
### Élévation de privilèges CREATEROLE
|
||||
|
||||
|
@ -704,7 +710,7 @@ SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
|
|||
```
|
||||
### **Fonction définie par l'utilisateur avec** SECURITY DEFINER
|
||||
|
||||
Dans [**cet article**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), des testeurs d'intrusion ont réussi à obtenir des privilèges élevés à l'intérieur d'une instance PostgreSQL fournie par IBM, car ils ont **trouvé cette fonction avec le drapeau SECURITY DEFINER** :
|
||||
Dans [**cet article**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), des pentesteurs ont réussi à obtenir des privilèges élevés à l'intérieur d'une instance PostgreSQL fournie par IBM, car ils ont **trouvé cette fonction avec le drapeau SECURITY DEFINER** :
|
||||
|
||||
<pre class="language-sql"><code class="lang-sql">CREATE OR REPLACE FUNCTION public.create_subscription(IN subscription_name text,IN host_ip text,IN portnum text,IN password text,IN username text,IN db_name text,IN publisher_name text)
|
||||
RETURNS text
|
||||
|
|
Loading…
Reference in a new issue