记一次UDF提权实验

简介UDF提权

UDF提权是数据库漏洞提权中mysql提权的一种。UDF是Mysql的一个拓展接口,也可称为用户自定义函数,它是用来拓展Mysql的技术手段,可以说是数据库功能的一种拓展,用户通过自定义函数在Mysql中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用
UDF提权是利用Mysql的自定义函数功能,将Mysql账号转化为系统sysytem权限。

提权条件

1)Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。
(2)Mysql版本小于5.1版本udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32
(3)掌握的mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,一般以root账号为佳,具备root账号的权限的其他账号也可以
(4)可以将udf.dll写入到相应目录的权限。

另外还需注意:
在mysql4.1以前的版本中,可以将所有的DLL文件里面的任何函数都注册到MYSQL里面以供MYSQL调用。
在4.1—5.1 的版本中,对注册的DLL的位置有了限制,创建函数的时候,所对应的DLL不能包含/或者\,简单的理解就是不能是绝对路径。所以我们将DLL释放到system32目录,来跳过限制,或者放到盘符的根目录下通过c:udf.dll这种形式的写法来跳过限制。其实知道把dll放到path这个环境变量所表示的任何一个目录下面,效果跟放到系统的system32目录下面一样,以下几个创建函数的语句都是正确的:
create function cmdshell returns string soname ‘udf.dll’;
//假设此时udf.dll被上传到了c:\windows\system32目录

create function cmdshell returns string soname ‘c:udf.dll’;
//假设此时udf.dll被上传到了c盘根目录目录

mysql5.1及以后的几个版本又多了一个限制:创建函数时所用的的DLL只能放在mysql的plugin目录里面,而且plugin目录默认是不存在的,可能就是为了通过导出文件的方式将DLL写到这个文件夹,所以UDF提权前,先确定一下mysql版本是很有必要的。

提取操作流程

(1)在通过菜刀连接获得webshell后,使用数据库管理功能来尝试UDF提权,在数据库配置栏目填以下信息并进入数据库管理功能:
记一次UDF提权实验
(2)接着我们在菜刀的数据库管理功能页面输入以下语句并执行,查看数据库版本信息:
记一次UDF提权实验
这里我们得知,Mysql版本为5.5.40

(3)导出DLL文件
查询Mysql安装的根目录:
记一次UDF提权实验
如上图我们得知目标服务器的Mysql安装根目录为:
C:/Program Files/phpStudy/Mysql/
根据我们前面讲述的Mysql5.1及其之后版本,我们自定义函数要用到shell导出的目录应该是:
C:/Program Files/phpStudy/Mysql/lib/plugin
其实也可以通过以下语句获取插件目录(并不一定真实存在)
show variables like ‘%plugin%’;
记一次UDF提权实验
然后我们找个任意的可上传目录把我们准备的udf.dll文件上传;
udf.dll上传后在服务器的绝对路径为:
C:/www/udf.dll
然后我们通过以下方式把上传的udf.dll文件以继承Mysql的权限导出到plugin目录,执行以下语句:
select load_file(‘C:/www/udf.dll’) into dumpfile ‘C:/ProgramFiles/phpStudy/Mysql/lib/plugin/udf.dll’;
记一次UDF提权实验
执行该语句后,发现返回为空,可能导出文件不成功,或者是plugin目录不存在,我们通过文件管理查看后得知,plugin目录不存在;
我们可以尝试通过NTS ADS流来创建文件夹,但是成功率不高。可参考文章NTFS中的ADS的一些问题(Mysql建目录,隐藏webshell等)

运气好,直接在终端下cd到C:\Program Files\phpStudy\Mysql\lib\目录md plugin 创建成功,一般情况下严格限制了目录权限的。
记一次UDF提权实验
接下来,执行sql语句导出udf.dll到plugin目录;
(4)然后我们执行以下sql语句来通过udf.dll创建shell函数(此函数是我们上传的udf.dll文件中内定的函数名,不同的dll文件有不同的函数名):
create function shell returns string soname ‘udf.dll’;
记一次UDF提权实验
shell函数用于执行系统命令,用法如下,其中的set是将要执行的cmd命令:
select shell(‘cmd’,‘set’);
//set命令用于查询系统环境变量
如下图,成功执行了cmd命令并获得返回结果,右键选择文本格式显示可以看到更全面的返回信息:
记一次UDF提权实验
(5)最后我们新建了一个test用户,并将其添加到了admistrators组中
记一次UDF提权实验
如此,提权完毕。

提权完毕之后我们可以通过以下语句删除相关函数以防被他人利用:
drop function shell;
//删除函数
delete from mysql.func where name=‘shell’;
//删除函数

上一篇:关于在hive中使用python做UDF的总结


下一篇:udf提权