知识补全计划第五篇:聊聊古老而又神秘的UDF提权

其实这玩意一直以来也没能引起我的重视,原因正如标题那般。它太老旧了,以至于让我们都忘记还有这种攻击手法了。直到最近的一次攻防演练中,队友用到了MDUT,根据我们获取到的MYSQL账号密码,成功获取对方主机的控制权限时,我才意识到这个古老的UDF提权,似乎在这个时代还能发挥他的作用!正值今年的主题是《知识补全计划》,那一定要补全一下自己这方面知识的不足。我很喜欢在主题开始前写一些文字,这些文字能够帮助我记录下来,我为什么学这个东西,又为什么写这篇文章。好了,废话就这么多,让我们回到那个年代,重温经典的提权漏洞。

引入

什么是UDF

UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像本机函数如ABS()或SOUNDEX()一样方便。

提权原理

udf是Mysql类提权的方式之一。前提是已知mysql中root的账号密码,我们在拿到webshell后,可以看网站根目录下的config.php里,一般都有mysql的账号密码。利用root权限,创建带有调用cmd函数的'udf.dll'(动态链接库)。当我们把'udf.dll'导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。这样我们自定义的函数才被当作本机函数执行。在使用CREAT FUNCITON调用dll中的函数后,mysql账号转化为system权限,从而来提权。

你可能看这么一大段也不知道为啥这个漏洞就UDF提权。很简单,你现在的Webshell是一个低权限。然而你可以通过翻找网站的配置文件拿到MYSQLroot账号。然后再通过MYSQL的特性来获取一个以system权限执行命令的"机会"。

然而你会发现,这个漏洞的根本就是借用MYSQL来完成任意命令执行。换句话说,如果对方的MYSQL符合要求,同时MYSQL开启外链那么我们就可以远程命令执行这台主机,拿到这台MYSQL主机的权限。

漏洞复现

环境配置

为了模拟上次内网的环境,需要开启MYSQL外链

利用条件

利用条件:

  1. MySQL 数据库没有开启安全模式。
  2. 已知的数据库账号具有对 MySQL 数据库 insert 和 delete 的权限,最好是 root 最高权限。
  3. shell 有写入到数据库安装目录的权限。
  4. windows2003、windowsXP、windows7(同时期的服务器应该也可以)

本次测试的服务器版本:Windows server 2008

MYSQL版本:5.1.73

image-20230123230223327

记得这个导出的限制为"空"

image-20230123230657012

看了看网上的教程,感觉这个玩意真的很水。

网上一直在告知我们,可以使用这种方式去创建文件夹:

但我始终没法创建成功,只好手动先创建个plugin文件夹了(真实环境下有可能对方因为网站功能所需还真导入过一些他们写好的东西,这样就很爽了,跟上次一样)

手工导入

说一点,SQLMAP问你32位还是64位可不要误以为是操作系统的版本。其英文原文为:

what is the back-end database management system architecture?

翻译过来就是:

后端数据库管理系统的体系结构是什么?

也就是说,实际上询问的是你的MYSQL是32位还是64位的。

可以使用show variables like '%version_%'来查看。

image-20230124001511538

将MSF中提供给我们用的UDF编码,路径为:

hex转换脚本:

注意,转换出来的内容太多了,一定要重定向到一个文本里去!

然后MYSQL执行:

image-20230123235017368

全部OK,接下来我们看怎么命令执行

image-20230123235048745

工具自动

MDUT或者SQLMP都可以做到这件事。工具不过是点点就完事了,不再赘述。

image-20230123235246140

MDUT点一点就行,真没有必要再说了

DLL编写

我想,底层篇至少是不能潦草结束的。肯定需要更为"底层"的东西。那么UDF提权我们能了解的,最底层的东西是什么呢?应该就是UDF.dll本身了。

主体代码

UDF独有代码结构

比如一个读取注册表的dll可以这么写: