zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

109.网络安全渗透测试—[权限提升篇7]—[Windows Mysql UDF提权]

2023-09-27 14:28:02 时间

我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!

一、Windows Mysql Udf提权

1、udf提权简介:

(1)在mysql可以使用udf自定义函数进行提权,udf = user defined function 用户自定义函数。

(2)对于自定义的函数,在mysql5.1版本以后就需要放在插件插件目录 /lib/plugin ,文件后缀微

dll,c语言编写。

(3)udf提权的位数,取决于操作系统位数,与mysql位数无关。

2、udf提权的背景:

​ 我们通过文件上传+文件包含获得了一个webshell,但是此时的权限很低,与此同时还获得了靶机MySQL的连接数据。因此我们尝试udf提权,其实质就是以MySQL的身份执行系统命令

3、udf插件目录的查询:

​ 可以使用语句查询plugin插件目录:show variables like "%plugin%"

在这里插入图片描述

4、udf提权报错的解决:

(1)导出的时候报错:The MySQL server is running with the --secure-file-priv option so it cannot execute this statement,这种是mysql默认设置是不允许导入导出。【在下面的实验过程中会提到解决方法】

(2)导出的时候报错Can't create/write to file 'C:\phpStudy\PHPTutorial\MySQL\lib\plugin\moonudf.dll这种是没有权限导出,或者plugin目录没有创建。【在下面的实验过程中会提到解决方法】

(3)导出无错,但是创建函数的时候报错:1126 - Can't open shared library 'udf.dll'(errno: 14001)【在下面的实验过程中会提到解决方法】

5、漏洞利用过程:

(1)实验环境:

1.靶机环境:
(1)虚拟机Windows2003【www.include.qwsn】【192.168.97.200】
(2)脚本语言环境:php语言环境存在

2.攻击机:
(1)虚拟机Win7【192.168.97.130】
(2)Firefox+Burpsuite+蚁剑+大马

3.网络环境:
(1)VMware搭建的NAT网络

(2)靶机连接:

URL:http://www.include.qwsn/exp/include/include1/include2.php

(3)实验过程:

第一步: 访问靶机链接,上传图片马,然后文件包含,得到蚁剑的webshell
在这里插入图片描述
【以上过程略】,以下就是提权过程!!!

第二步: 上传udf提权大马moon2.php到靶机

在这里插入图片描述

第三步: 浏览器访问该moon2.php大马

在这里插入图片描述

第四步: 导出udf,发现导出动态链接库失败,我们到靶机设置my.ini的secure-file-priv为空即可

在这里插入图片描述

解决方法:

在这里插入图片描述

第五步: 仍旧发现导出动态链接库失败,我们再到靶机创建一个plugin目录

在这里插入图片描述

注意: udf利用的其中一步,是要将我们的xxx.dll文件上传到mysql检索目录中,mysql各版本的检索目录有所不同,如下表所示:

版本路径
MySQL < 5.0导出路径随意
5.0 <= MySQL< 5.1需要导出至目标服务器的系统目录(如:c:/windows/system32/或c:/winnt/system32)
5.1 < MySQL必须导出到MySQL安装目录下的lib\plugin文件夹下

解决方法:

在这里插入图片描述

在这里插入图片描述

第六步: 再去导出udf动态链接库,发现成功导出。

在这里插入图片描述

第七步: 创建sys_eval函数,发现创建失败。

在这里插入图片描述

注意1: 在执行 create function sys_eval returns string soname ‘moonudf.dll’; 命令时出现 1126 - Can’t open shared library ‘udf.dll’(errno: 14001)的错误。我看网上有的解释是说是因为在MySQL安装目录下默认没有 …\lib\plugin 目录导致的。但是这里很明显不是这个错误,因为如果上一步将dll文件写到 lib\plugin 目录没报错的话,说明dll文件已经写到 lib\plugin 目录了,因此也就不存在这个错误。但是目前还没有找到解决版本。

注意2: 网上还有的说:在执行 create function sys_eval returns string soname ‘udf.dll’; 命令时出现 1126 - Can’t open shared library 'udf.dll’的错误。这个错误是因为udf.dll是看mysql是32位还是64位,而不是看操作系统。mysql是64位用了32位的udf.dll就会报这个错。

 注意3: 我的MySQL与OS位数信息,如下图所示:
在这里插入图片描述

注意4: 但是真正的问题是,可能是这个脚本的问题,我们换一个旧的脚本,并且还是用32位提权,发现竟然成功了!!!
【因此这里就印证了udf提权与MySQL位数无关,而是与操作系统位数有关;同时也发现可能是因为udf提权大马的原因,导致虽然动态链接库导出成功但是出现创建函数失败的现象!!!】

第七步: 换一个udf提权大马,这次上传moon1.php文件,然后去导出udf,再去创建cmdshell函数,发现成功创建。

上传moon1.php大马:

在这里插入图片描述

中间过程省略…

创建函数cmdshell:

在这里插入图片描述

第八步: 利用创建的cmd函数执行系统命令whoami,成功回显结果。

在这里插入图片描述

第九步: 创建反弹shell函数backshell,发现成功创建。

在这里插入图片描述

第十步: 攻击机先开启侦听12345端口,然后再执行反弹Shell函数,发现成功反弹靶机的shell到攻击机的cmd中。

执行反弹函数:

在这里插入图片描述

最开始的侦听,以及反弹成功后的执行系统命令:

在这里插入图片描述

第十一步: 利用反弹的shell,开启3389端口。

在这里插入图片描述

第十二步: 创建用户$darkmoon,并且加入到管理员组。

在这里插入图片描述

第十三步: 利用开启的3389端口,以及创建的用户$darkmoon/123456,远程登录靶机。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

6、实验总结

(1)udf提权的背景:需要Webshell+MySQL连接信息。

(2)udf提权的实质:以MySQL的身份执行系统命令。

(3)udf提权,需要将我们的xxx.dll动态链接库文件上传到mysql检索目录中,mysql各版本的检索目录有所不同,如下表所示:

版本路径
MySQL < 5.0导出路径随意
5.0 <= MySQL< 5.1需要导出至目标服务器的系统目录(如:c:/windows/system32/或c:/winnt/system32)
5.1 < MySQL必须导出到MySQL安装目录下的lib\plugin文件夹下

(4)udf提权过程中常常遇到的三个报错,如下表所示:

报错时间报错内容报错原因解决方法
导出的时候报错The MySQL server is running with the --secure-file-priv option so it cannot execute this statementmysql默认设置是不允许导入导出事先在靶机的my.ini中设置字段secure-file_priv置空
导出的时候报错Can't create/write to file 'C:\phpStudy\PHPTutorial\MySQL\lib\plugin\moonudf.dll没有权限导出,或者plugin目录没有创建(主要原因)事先在靶机的/lib目录下创建plugin目录
导出时无错,但是创建函数的时候报错Can't open shared library 'udf.dll'导出的位数不匹配,或者udf提权的大马有问题导出其他位数的动态链接库,或者换一个udf提权大马。

(5)不事先在靶机创建plugin目录,攻击者如何创建plugin目录的呢?

利用NTFS ADS流来创建文件夹的方法:
1、select @@basedir; //查找到mysql的目录
2、select “It is dll” into dumpfile “C:\\phpStudy\\PHPTutorial\\MySQL\\lib::$INDEX_ALLOCATION”; //利用NTFS ADS创建lib目录
3、select “It is dll” into dumpfile “C:\\phpStudy\\PHPTutorial\\MySQL\\lib\\plugin::$INDEX_ALLOCATION”; //利用NTFS ADS创建lib\plugin目录

经测试,发现如下错误,有待解决。。。。。。。。。。。

在这里插入图片描述