在大多数情况下,MySQL密码指令提供变化的MySQL用户密码信息生产系统(例如,没有重启复位根密码)。甚至建议定期更改密码,是为了安全起见。但是,有时DBA关税遗留系统提供惊喜,你需要为一些老用户恢复原始密码。
没有魔法:只要只散列存储,而不是原来的密码,恢复丢失密码的唯一途径是蛮力从已知的散列。
注意安全与mysql-unsha1攻击
有趣的是,如果一个黑客可以访问密码散列,可以嗅mysql交通,他不需要恢复一个纯文本密码。不管如何强大的密码和强大的身份验证插件内的散列算法,由于MySQL协议设计、嗅散列是足够的连接到一个MySQL数据库打补丁的版本的客户机。这意味着,如果一个黑客可以访问一个数据库备份和交通,他自动接收所有需要的信息(沙斯党)连接到一个运行数据库。看到对这次袭击的细节。
由于MySQL 8.0,caching_sha2_password默认情况下使用的身份验证插件,这个插件带来更强sha256函数来代替sha1中使用的mysql_native_password插件。为验证caching_sha2_password插件,也足以只有一个散列,并能够嗅流量,看到的实现细节。
不过,如果你想要一个密码,使用未经修改的客户,然而,你需要做一些黑客,见下面的说明。
将哈希
让我们回到复苏的密码。首先,我们需要转储散列。
MySQL 5.7使用mysql_native_password身份验证插件在默认情况下,我们可以转储sha1散列下面的命令。
|
1
|
%
mysql
- - - - - -
Ns
- - - - - -
uroot
- - - - - -
e
“选择SUBSTR (authentication_string, 2)从mysql作为散列。user WHERE plugin = 'mysql_native_password' AND authentication_string NOT LIKE '%THISISNOTAVALIDPASSWORD%' AND authentication_string !='';"
&
gt
;
sha1_hashes
|
MySQL 8.0使用caching_sha2_password身份验证插件在默认情况下,我们可以转储sha256散列如下。
|
1
|
%
mysql
- - - - - -
Ns
- - - - - -
uroot
- - - - - -
e
“选择CONCAT (\ $ mysql,左(authentication_string 6),‘*’,插入(十六进制(SUBSTR (authentication_string 8)), 41岁,0,' * '))从mysql作为散列。user WHERE plugin = 'caching_sha2_password' AND authentication_string NOT LIKE '%INVALIDSALTANDPASSWORD%' AND authentication_string !='';"
&
gt
;
sha256_hashes
|
如果你需要root密码散列,没有用户读访问权mysql.user表,你应该开始mysqld——skip-grant-tables选项,有关详细信息,请参阅官方文档。
运行Linode GPU实例
密码恢复,需要一些强大的GPU上运行计算,没有太多的云提供商和GPU实例在市场上。Linode是卓越的云提供商之一,如果你需要一个简单、可靠的供应商和一个非常有用的支持部门。Linode有强大的CLI工具自动化,简化了“抨击”。同时,对于更严重的自动化,官方起程拓殖提供者的存在。
128 gb GPU Linode实例密码恢复速度是30000 MH / s(每秒百万散列),这是非常好的。它只需要2小时蛮力一个MySQL 5.7 8个字符的密码(大写字母、小写字母、数字)。实例价格只有6美元/小时。
例如,最大的其他云提供商(4 x NVIDIA Tesla V100实例)相同的复苏速度成本贵两倍- 12.24美元/小时。
准备字典
密码蛮力是基于字典来完成的。我们将使用一个小契机词典为例,来展示。
|
1
2
3
|
%
wget
“https://gitlab.com/kalilinux/packages/wordlists/-/raw/kali/master/rockyou.txt.gz”
%
gunzip
契机
。
三种
。
广州
|
你可以找到很好的字典的weakpass。com的网站。
但这是可能的,即使是最大的经济复苏字典是不够的。在这种情况下你应该检查是否启用了validate_password插件和准备一本字典。检查如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
%
mysql
- - - - - -
uroot
- - - - - -
e
“显示变量如“validate_password %”;“
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
|
Variable_name
|
价值
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
|
validate_password_check_user_name
|
在
|
|
validate_password_dictionary_file
|
/
var
/
自由
/
mysql
/
禁止
。
三种
|
|
validate_password_length
|
8
|
|
validate_password_mixed_case_count
|
1
|
|
validate_password_number_count
|
1
|
|
validate_password_policy
|
强大的
|
|
validate_password_special_char_count
|
1
|
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
|
如果该命令的输出是空的,这意味着插件被禁用。你可以找到一些关于这个插件的更多细节在我们的一个以前的博客文章,改善与验证MySQL密码安全插件。
的validate_password_policy这里最重要的一个领域。它可以有以下值:
| 政策 | 测试执行 |
| 0或低 | 长度 |
| 1或媒介 | 长度;数字、小写字母、大写字母和特殊字符 |
| 2、强大的 | 长度;数字、小写字母、大写字母和特殊字符;字典文件 |
如果validate_password_policy =强烈和validate_password_dictionary_file,我们需要排除密码validate_password_dictionary_file:
|
1
2
3
4
5
|
猫
巨大的
- - - - - -
dictonary
。
三种
\
|
pw
- - - - - -
检查员
- - - - - -
米
8
- - - - - -
米
32
- - - - - -
l
- - - - - -
u
- - - - - -
n
- - - - - -
p
\
|
排序
- - - - - -
u
\
|
grep
- - - - - -
F
- - - - - -
v
- - - - - -
x
- - - - - -
f
禁止
。
三种
\
&
gt
;
减少
- - - - - -
dictonary
。
三种
|
在上面的示例:- m 8密码的最小长度,值吗validate_password_length变量;- m 32是复制的最大长度的密码,密码的最大长度是32个字符,看到MySQL版本节点;- n密码应该包含数字,看看validate_password_number_count变量;- l - u密码应该包含小写或大写字符,明白了validate_password_mixed_case_count变量;- p密码应该包含特殊字符,明白了validate_password_special_char_count变量;prohibited.txt是一个文件从validate_password_dictionary_file变量;huge-dictonary.txt是初始字典;reduced-dictonary.txt新字典没有单词吗prohibited.txt。
如果字典攻击失败,你必须创建自己的蛮力的字典。在这种情况下,我们推荐使用以下工具之一:危机,maskprocessor或通过Hashcat选项。
编译Hashcat
对于MySQL 8.0,最新版本的hashcat从主分支应该是因为代码编译https://github.com/hashcat/hashcat/issues/2305现在不是在任何版本发布。
|
1
2
3
4
5
6
7
8
9
|
%
sudo
恰当的
- - - - - -
y
安装
使
海湾合作委员会
%
git
克隆
https
:
/
/
github
。
com
/
hashcat
/
hashcat
。
git
%
cd
hashcat
%
使
%
sudo
使
安装
|
使OpenCL的英伟达
更新到最新的软件,禁用新司机和重启:
|
1
2
3
4
5
6
7
|
%
sudo
恰当的
更新
和
;
和
;
sudo
恰当的
完整的
- - - - - -
升级
- - - - - -
y
%
回声
- - - - - -
e
“新黑名单\ noptions新modeset = 0 \ nalias新”
|
sudo
三通
/
等
/
modprobe
。
d
/
黑名单
- - - - - -
新
。
相依
%
sudo
更新
- - - - - -
initramfs
- - - - - -
u
%
重新启动
|
安装专用的驱动程序,然后重新引导
|
1
2
3
4
5
6
7
|
%
sudo
恰当的
安装
- - - - - -
y
英伟达
- - - - - -
cuda
- - - - - -
工具包
ocl
- - - - - -
icd
- - - - - -
libopencl1
%
sudo
恰当的
安装
- - - - - -
y
英伟达
- - - - - -
司机
- - - - - -
440年
英伟达
- - - - - -
跑龙套
- - - - - -
440年
%
sudo
恰当的
删除
台面
- - - - - -
opencl
- - - - - -
icd
%
重新启动
|
检查驱动程序
|
1
2
3
|
%
sudo
英伟达
- - - - - -
重度
%
hashcat
- - - - - -
我
|
密码恢复运行
为mysql_native_password(MySQL 5.7)使用300代码:
|
1
|
%
hashcat
- - - - - -
米
300年
- - - - - -
一个
0
- - - - - -
D
2
- - - - - -
O
- - - - - -
w
3
。
/
sha1
_散列
。
/
契机
。
三种
|
为caching_sha2_password(MySQL 8.0)使用7401代码:
|
1
|
%
hashcat
- - - - - -
米
7401年
- - - - - -
一个
0
- - - - - -
D
2
- - - - - -
O
- - - - - -
w
3
。
/
sha256
_散列
。
/
契机
。
三种
|
如果你的密码是正确恢复,你可以运行相同的命令——显示选择显示密码。
|
1
2
3
|
%
hashcat
- - - - - -
米
300年
- - - - - -
一个
0
- - - - - -
D
2
。
/
sha1
_散列
。
/
契机
。
三种
- - -
显示
0913年bf2e2ce20ce21bfb1961af124d4920458e5f
:
new_password
|
在这里new_password是正确的答案。
结论
8-chars密码大小写字母和数字的MySQL 5.7只能恢复2小时的Linode GPU实例。相同的密码可以恢复MySQL 8.0 2.8年。但总的来说,黑客们根本不需要恢复纯文本密码(请参见上面的“mysql-unsha1攻击”一节)。为了减少风险,需要保护的内容mysql.user表,有几件事可以做:
- 不散列存储在MySQL本身,例如,使用LDAP插件Percona服务器雷竞技下载官网
- 或使用加密静止HashiCorp库插件
- 或者至少使用加密备份的安宁了。
解简单的“与Percona服务器启动并运行MySQL”概述了建立一个MySQL®数据库本雷竞技下载官网地使用Percona MySQL服务器。它包括故障转移和基本业务连续性组件。






好文章!
根据https://github.com/cyrus-and/mysql-unsha1/blob/master/README.md,访问mysql。user table alone is not enough.
虽然这篇文章声称,“如果一个黑客可以访问一个数据库备份,他自动接收所有需要信息(沙斯党)”。
我错过什么了吗?
嗨Rene !
如果你有一个备份:
1)至少从备份恢复数据库(mysql。用户表)
2)运行mysqld -skip-grant-tables选项
3)根据命令转储散列在“转储哈希”一节。
你好,尼古拉,
好的,所以你还需要暴力破解密码,因此散列是不够的”连接到运行数据库”。
正确吗?
不,你需要建立修补mysql客户端https://github.com/cyrus-and/mysql-unsha1/blob/master/README.md the-patched-mysql-client能与散列连接,没有纯文本密码。
打补丁的mysql客户端能够连接使用sha1(密码),而在mysql。用户有sha1 (sha1(密码))
是的,你完全正确,还需要嗅交通、中描述https://github.com/cyrus-and/mysql-unsha1/blob/master/README.md嗅探器
抱歉我的混乱,固定措辞“mysql-unsha1攻击”一节。
如何访问数据库备份,和交通? ? ?
相当于Mariadb的处境是什么?
你好,
MariaDB使用普通
mysql_native_passwordMySQL 5.7插件,所以情况是一样的这就是为什么MySQL 8.0默认使用caching_sha2_password身份验证。正如你所说,密码可以恢复在2.8年。MySQL 8.0可以添加密码过期和帐户锁定
如果你仍然使用mysql_native_password身份验证插件,是时候改变它!
我还想添加caching_sha2_password身份验证插件中使用不同的散列来存储密码和身份验证。
这意味着,即使存储散列值是可用的,不能直接使用他们一起通过网络数据包嗅。
这个技巧在mysql_native_password因为相同的哈希方案用于存储密码和对用户进行身份验证。
此外,总是有可能加密mysql系统表如果你的版本支持:https://dev.mysql.com/doc/refman/8.0/en/innodb-data-encryption.html innodb-mysql-tablespace-encryption-enabling-disabling
欢呼,
米e一个gain For more information about the new default authentication plugin which is much more secure, please readhttps://mysqlserverteam.com/a-tale-of-two-password-authentication-plugins/
我认为sql服务器通常是放在后面一些安全层,然后bruteforce并不容易