近日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`,路径取值如下:
文件位置为`AppDataLocalMicrosoftEvent ViewerRecentViews`。接着直接调用`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。
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
点关注,不迷路!
原文始发于微信公众号(且听安全):Windows Event Viewer事件查看器一个有趣的.NET反序列化问题