我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!
(1)在mysql可以使用udf自定义函数进行提权,udf = user defined function 用户自定义函数。
(2)对于自定义的函数,在mysql5.1版本以后就需要放在插件插件目录 /lib/plugin ,文件后缀微
dll,c语言编写。
(3)udf提权的位数,取决于操作系统位数,与mysql位数无关。
我们通过文件上传+文件包含获得了一个webshell,但是此时的权限很低,与此同时还获得了靶机MySQL的连接数据。因此我们尝试udf提权,其实质就是以MySQL的身份执行系统命令
。
可以使用语句查询plugin插件目录:show variables like "%plugin%"
(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)
【在下面的实验过程中会提到解决方法】
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网络
URL:http://www.include.qwsn/exp/include/include1/include2.php
第一步: 访问靶机链接,上传图片马,然后文件包含,得到蚁剑的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,远程登录靶机。
(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 statement | mysql默认设置是不允许导入导出 | 事先在靶机的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目录 |
经测试,发现如下错误,有待解决。。。。。。。。。。。