Windows Event Viewer事件查看器一个有趣的.NET反序列化问题

  • 作者:
  • 时间:2022-04-28 09:00:18
简介 Windows Event Viewer事件查看器一个有趣的.NET反序列化问题

问题概述

近日Orange发布Windows Event Viewer事件查看器存在一个不安全的反序列化隐患:

虽然不会带来直接的安全问题,但是可以尝试用来实现Defender bypass或者UAC bypass。

问题分析

Windows Event Viewer通过`mmc.exe`进行启动:

运行启动相关的.NET组件如下:

`mmc.exe`是系统管理程序的一个框架程序,全称是Microsoft Management Console,它提供给扩展名为msc的管理程序一个运行的平台。查看`eventvwr.msc`:

当`mmc.exe`启动时,将会加载`Microsoft.EventViewer.SnapIn.FormView`等.NET控件并调用`OnShow`函数:


进入`OnFormShow`,将提取`MMCEventsNode`,并尝试更新`views`:


进入`UpdateRecentViews`函数:


当`isRecentViewsDataLoaded`为`False`时,将调用`LoadDataForRecentViews`函数进行数据加载:


进入`LoadMostRecentViewsDataFromFile`函数:


反序列化内容来自于文件`EventsNode.recentViewsFile`,路径取值如下:


文件位置为`\AppData\Local\Microsoft\Event Viewer\RecentViews`。接着直接调用`BinaryFormatter`进行反序列化操作,当`RecentViews`内容可控时,存在RCE的风险。

复现过程

利用`ysoserial.exe`生成反序列化载荷并替换`RecentViews`文件,然后重启Windows Event Viewer触发RCE:

小结

通过替换`RecentViews`文件,当启动Windows Event Viewer时,将会触发RCE。虽然对Windows Event Viewer不会直接造成影响,但是为Defender或UAC bypass提供了一个新的选择。另外因为调用`LoadMostRecentViewsDataFromFile`函数来触发`BinaryFormatter`反序列化操作的前提是`isRecentViewsDataLoaded`为`False`,而在Windows Event Viewer完成第一次加载后,`isRecentViewsDataLoaded`会自动赋值为`True`:


所以通过刷新操作无法第二次触发RCE。

由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。

关闭