出于某种业务需要,需要连接一个没有密码的数据库。检查了整个网络环境并使用wireshark进行简单的抓包分析,我们发现在局域网内有两个网段10开头的、和192开头的。
经过分析判断后数据库主机存在于 10.0.0.22的主机上。
由于22主机上的服务正在运行,我们抓包后发现是 3308端口正在运行,还有一些半加密的sql语句。
22主机运行的竟然是Windows7的环境,这是个天大的好事,我们使用了PE镜像干掉了Windows系统的登录密码。
进入到主机后,检查磁盘发现一个mysqlbar的目录,里面的结构和mysql5.7安装版本非常一致。
我猜测这就是我们要找的数据库,找到了命令行之后,通过myql.exe尝试连接后提示密码错误,可以基本确定这就是我们要找的数据库。
连接不上数据库之后, 我们终止了数据库了数据库服务,企图通过免验证模式进入。
修改根目录下的 my-default.ini 再 [mysqld] 节点下 添加一行
skip-grant-tables = 1
修改根目录下的 my.ini 在 [mysqld] 节点下添加一行
skip-grant-tables
重启mysqld.exe发现,root用户下的 root密码登录成功,但是查看数据库看不到我们所需要的库。
再项目正在大功告成的时候,新的问题出现了,原来的数据库连接提示数据库连接异常。
接着尝试插入mysql库的user表进行新增用户的提权操作,尝试一条sql解决问题。
INSERT INTO `user` (`Host`, `User`, `Select_priv`, `Insert_priv`, `Update_priv`, `Delete_priv`, `Create_priv`, `Drop_priv`, `Reload_priv`, `Shutdown_priv`, `Process_priv`, `File_priv`, `Grant_priv`, `References_priv`, `Index_priv`, `Alter_priv`, `Show_db_priv`, `Super_priv`, `Create_tmp_table_priv`, `Lock_tables_priv`, `Execute_priv`, `Repl_slave_priv`, `Repl_client_priv`, `Create_view_priv`, `Show_view_priv`, `Create_routine_priv`, `Alter_routine_priv`, `Create_user_priv`, `Event_priv`, `Trigger_priv`, `Create_tablespace_priv`, `ssl_type`, `max_questions`, `max_updates`, `max_connections`, `max_user_connections`, `plugin`, `authentication_string`, `password_expired`, `password_last_changed`, `password_lifetime`, `account_locked`,`ssl_cipher`,`x509_issuer`,`x509_subject`) VALUES ('%', 'test', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '0', '0', '0', '0', 'mysql_native_password', 'password(\'123\')', 'N', '2018-07-04 00:00:00', NULL, 'N','N','N','N');
后来发现我们insert的用户存在着权限问题,没有读取一些数据库的权限,由于对mysql库的不熟悉我们放弃了这个方案。
我们尝试再安全模式通过password函数修改root密码,然后新增一个用户,并提升他的数据库权限。
update user set authentication_string=password('123') where user='root';
修改了mysql的root密码,我们就可以合法登录,我们关闭了mysql安全模式,重启了myqsld
尝试通过合法登录
合法登录这块在实际执行得时候遇到了mysql默认端口3306被修改为3308的问题,我们还是修改了配置文件得mysql端口才得以正常登录。
登录成功,
通过命令行 CREATE USER'admin'@'%' IDENTIFIED BY '123';
创建新的用户admin,密码为123
grant all privileges on 数据库名.* to 'admin'@'%' identified by '123';
授权admin用户对数据库名的所有操作.
flush privileges;
刷新授权。
附上一个 python尝试读取数据库的代码。顺便可以检查下我们授权的权限是否正确。
#-*- coding:utf-8 -*-
import mysql.connector
mysql_config = {'user':'admin',
'password':'123',
'host':'localhost',
'port':'3306',
'database' :'数据库',
'charset' :'utf8'}
conn = mysql.connector.connect(**mysql_config)
cursor=conn.cursor()
sql = "SHOW DATABASES;"
cursor=conn.cursor()
cursor.execute(sql)
result_set = cursor.fetchall()
print result_set
最后我们把root密码重置回来。
update user set authentication_string='*FF1887726154F9E870A6596D469B8C271B8E5BAA' where user='root';
完事