弄了两三天的UDF提权复现,遇到各种坑,也尝试了在实际渗透场景中的应用,所以总结了部分经验。此篇文章主要涉及mysql数据库中udf提权的讲解、以及UDF提权可能涉及的问题。
--目录结构--
原理讲解
0x00何谓UDF提权
0x02 UDF提权步骤
UDF(user defined function,即’用户自定义函数’),是mysql数据库的一个特性,允许用户写入自定义函数,对mysql功能进行扩充。存在形式是dll文件,把自定义的函数存于dll文件中。
那么问题来了,如果定义可执行系统命令的函数,我们的权限是不是就可以直接从执行SQL语句到执行系统命令了??答案是肯定的,这就是UDF提权。
使用UDF分为三步:
1.把含义自定义函数(如执行系统命令函数“sys_eval”)的dll文件放入特定文件夹下。
2.声明引入这个dll文件中的自定义函数。
3.使用自定义的函数。
其实,从我们介绍“UDF提权的定义”以及“如何使用UDF”。我们就能大概知道怎么去使用UDF提权的思路,跟“如何使用UDF”的步骤一致。只是我们需要注意到mysql版本的不同,其中的利用方式也不同。
1.把含义自定义函数(如执行系统命令函数“sys_eval”)的dll文件放入“特定文件夹”下。
由于mysql版本不同,dll文件需要放入特定的文件夹下才能生效:
a. mysql<5.1,则需要导出至目标服务器的系统目录(如:system32)b.mysql>5.1,需要使用放在Mysql根目录的lib\plugin文件夹下。否则在后面的操作中你会看到“No paths allowed for shared library”错误
把dll文件放入到特定的“文件夹”下方式有很多种:
方式a.如何你有webshell或有能操作文件的任何方式(比如远程登录),直接把dll文件放入特定文件夹下。文件名可以自定义,比如我喜欢命名为“udf.dll”。比如用“菜刀”操作文件
udf.dll文件下载链接:
方式b.也可以使用sql语句导入(写)一个dll文件。(只有sql语句执行权限最适合用此方法)
//新建一个表,名为udftest,表中含有类型blob的字段,用于存放本地传来的udf文件的内容。
CREATE TABLE udftest (data blob);
//在udftmp中写入udf文件内容
INSERT INTO udftest values(unhex('udf文件的16进制格式'));
(udf16进制文件下载链接: 密码:q98c)
//找到mysql安装路径
select @@basedir;
//将刚刚导入到udftest表中存储的UDF文件内容传入新建的udf文件中,路径根据自己的@@basedir修改,对于mysql<5.1的,导出目录为C:\Windows\或C:\Windows\System32\,对于mysql>=5.1的,放入其目录下的\lib\plugin目录中。
SELECT data FROM udftest INTO DUMPFILE 'C:\\Program Files\\MySQL\\MySQL Server 5.5\\lib\\plugin\\udf.dll';(注意:需要在my.ini中的”[mysqld]”下设置“secure-file-priv=“””,否则会出现如下图错误。高版本中secure-file-priv的作用限制了MySQL文件的导出,了解secure-file-priv请参考:)
其中,最后一步,导出udf.dll文件在mysql>5.1版本中可能会出现问题,mysql>5.有些默认没有plugin目录,需要我们自己创建,网上有说可以使用ntfs数据流创建,我尝试没有成功,就不在这写了。但自我尝试,安装了mysql插件的都会有这个plugin目录。
执行完之后就会在服务器上发现新建的udf.dll文件。
2.声明引入这个dll文件中的自定义函数。
Dll文件导入成功后(无论哪种导入方式均可以,只要secure-file-priv开启就行),相当于引入了一个函数库或包,我们需要去声明,才能引用里面的函数。格式是:
CREATE FUNCTION 函数名 RETURNS STRING SONAME '导出的dll';
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
其中,‘sys_eval’代表我们要引入的函数,也可以使用别的函数。
常用函数名:
cmdshell 执行cmd;
downloader 下载者,到网上下载指定文件并保存到指定目录;
open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
backshell 反弹Shell;
ProcessView 枚举系统进程;
KillProcess 终止指定进程;
regread 读注册表;
regwrite 写注册表;
shut 关机,注销,重启;
about 说明与帮助函数;
’udf.dll'代表我们上一步创建的文件;
dll文件名称是自定义的,由上一步创建的文件名决定。例如上一步创建的是udf111.dll,那这时命令应该变成:
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
3.使用自定义的函数。
我们可以使用如下命令来执行系统命令
select sys_eval('系统命令');
例如我们执行如下命令:
select sys_eval('net user admin admin /add');
就会发现新建了一个用户-admin
有些人对于UDF提权有一些错误的认知。认为UDF提权只是影响windows和mysql。但UDF(用户自定义函数)不仅仅是影响着Windows系统,也影响Linux系统。不仅仅影响Mysql,也影响Postgrepsql。这篇文章也只是以windows系统和mysql数据库来做了一个演示而已,重点在于理解这个过程。
蘑菇安全欢迎大家的分享与关注!