背景
反序列化通俗地讲就是将一个字节流转换成一个对象的过程,由于反序列化过程中对恶意对象的检查不足,有可能造成反序列化漏洞。Java反序列化通过反射机制实现命令执行,给Java安全开发造成了极大的威胁,而近年来反序列化在.NET领域受到安全研究人员越来越多的关注。近期,安全研究员Orange Tsai 发布了一项针对系统组件Windows事件查看器的反序列化研究,通过构造包含反序列化利用的日志文件,在其启动加载时达到命令执行的效果。天元实验室对于Windows事件查看器中存在的.NET反序列化问题进行了分析复现,并对其在终端对抗领域的利用面进行了分析。
图 Windows事件查看器反序列化利用demo公布
01 反序列化过程分析
在公布的攻击效果演示视频中,Orange构造反序列化payload,将其写入用户目录中的RecentViews文件,随后打开事件查看器触发命令执行,证明了事件查看器反序列化的可利用性。
视频中包含了利用.NET反序列化利用工具ysoserial构造payload的完整命令行,公开的利用代码中使用了DataSet攻击链,实际上当然不止这一个攻击链可用,在ysoserial.exe中已集成了多条适用于BinaryFormatter反序列化的攻击链,它们大部分都可以成功触发命令执行。
ysoserial.exe -o raw -f BinaryFormatter -g DataSet -c calc > %LOCALAPPDATA%MicrosoftEventV~1RecentViews
其中EventV~1(EventV~1为短文件名,指向Event Viewer)文件夹中RecentViews文件包含了反序列化利用的payload,对该文件进行读取与反序列化是利用的必经之路。使用procmon工具对利用过程中RecentViews文件的读取操作进行追踪,定位到读取文件并执行反序列化的主程序mmc.exe,及栈回溯所在的.NET assembly文件。
图 在RecentViews文件读取栈回溯
事件查看器的启动过程较为特殊,eventvwr.exe将唤起Microsoft管理控制台主程序mmc.exe。该程序在启动过程中初始化.NET环境,并加载包含事件查看器主体功能代码的EventViewer.dll文件。该文件为.NET assembly文件,能够在.NET分析工具DnspyEx中打开。
图 在DnspyEx中分析EventViewer.dll
从payload可以看出这是一个BinaryFormatter的反序列化命令执行,BinaryFormatter最常用的反序列化方法是Deserialize,事实上本漏洞也确实是使用的Deserialize。我们直接在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize()下断点,它位于mscorlib.dll。
图 BinaryFormatter.Deserialize反序列化方法处下断点
启动调试后,会多次断在断点处,在第四次跳过后会触发命令执行,我们在第四次断点时使用跳出操作,可以定位到最终的反序列化过程位于MIGUIControls.dll的LoadMostRecentViewsDataFromFile()方法中,日志文件在未加校验的情况下直接调用BinaryFormatter.Deserialize方法进行反序列化。
图 反序列化问题代码定位
BinaryFormatter反序列化早已被证明是不安全的,在微软官方文档中也进行了安全提示。BinaryFormatter实现时反序列化漏洞还没有被大众所知,并且没有遵循安全开发准则,这是历史原因造成的。
图 微软文档中的安全提示
跟踪LoadMostRecentViewsDataFromFile()方法调用,确认EventHomeControl即为入口点。该函数负责完成事件查看器界面的初始化加载,完整调用链如下:
图 RecentViews文件被读取并反序列化的调用链
综上可知事件查看器反序列化利用的完整流程:
图 事件查看器反序列化命令执行流程
02 反序列化利用复现
利用.NET反序列化利用工具ysoserial构造具备命令执行功能的payload,将其写入临时日志文件目录,并启动事件查看器触发命令行执行:
ysoserial.exe -o raw -f BinaryFormatter -g DataSet -c “cmd.exe /k whoami /priv” > %LOCALAPPDATA%MicrosoftEventV~1RecentViews
执行效果如下:
图 利用事件查看器反序列化执行管理员权限cmd
03 利用面分析思考
从蓝军视角分析,我们发现事件查看器的反序列化利用过程能够应用于若干攻击阶段,达到命令执行、权限提升和防御规避等效果。
UAC Bypass
事件查看器是具有auto-Elevated属性的系统组件,程序启动时会绕过UAC弹窗,自动提升为管理员权限。本次的反序列化利用所需修改的RecentViews文件,普通权限下也可写入。当事件查看器绕过UAC以管理员启动时并触发反序列化过程,植入的恶意代码将以管理员的权限被执行,整个过程不会有UAC弹窗,达到UAC Bypass的效果。
图 以高权限运行的mmc.exe及其子程序
在事件查看器反序列化问题被曝光后不久,便出现了围绕其的武器化项目,目前最常见的便是利用其进行UAC绕过,例如EventViewer-UACBypass项目。该项目将反序列化payload生成过程封装于一个powershell脚本中,实现了命令执行的武器化。
由于命令执行发生于事件查看器主窗口渲染之后,所以事件查看器主体的弹窗不可避免,这给实战带来OPSEC风险。为了解决这个问题,公开的武器化项目中采用了一种灵活的处理方式,在命令执行后主动结束mmc.exe进程:
ysoserial.exe -o raw -f BinaryFormatter -g DataSet -c "taskkill /IM mmc.exe /F && powershell" > %LOCALAPPDATA%MicrosoftEventV~1RecentViews
如此处理之后虽然仍会有短暂的弹窗,但为摆脱图形界面的限制,在命令行完成整个利用过程创造了可能。
代理执行
“T1218系统二进制代理执行”是指利用可信的系统程序执行命令的攻击方法,利用系统程序执行恶意操作可绕过基于进程可信与文件签名的防御机制。事件查看器的主程序mmc.exe是具备微软数字签名的二进制文件,存在多种代理执行利用方法,例如利用恶意msc文件以及CLSID劫持。利用反序列化利用过程,攻击者指定的命令与程序可通过事件查看器被代理执行,这可以绕过针对可执行文件路径的安全策略。在一些特定场景,例如以管理员权限执行并开启了 disable_func的php环境,可通过日志文件写入执行自定义命令。
图 具备微软数字签名的mmc.exe
持久化后门
只要RecentViews文件不被更改,每一次启动事件查看器都会触发命令执行,因而可作为一种管理员权限下的权限维持方法。相较于可执行文件、DLL和脚本等落地形式,序列化数据的恶意特征更不明显,检测识别难度更大。
事件查看器在正常退出时会覆写原有的RecentViews文件,导致持久化失效,该局限性可通过之前介绍过的在反序列化payload中主动终止事件查看器进程的方法解决。目前的被动触发方式决定其在实战应用受到一些限制,配合计划任务与服务等方式使事件查看器定期执行是一种相对可行的持久化方案。
04 总结
事件查看器的.NET反序列化这一发现开拓了新的攻击面:操作系统组件/桌面软件中的.NET反序列化问题。Windows系统拥有众多基于.NET开发的系统组件,这些组件的开发远早于相关攻击面的发现,具备天然的安全脆弱性。本次发现为这些历史组件的安全问题揭开了冰山一角,类似于BinaryFormatter这样存在安全隐患的方法仍在重要系统组件中占据一席之地,针对这些脆弱API的.NET反序列化挖掘与利用是一个值得研究的新方向。
参考
1.https://twitter.com/orange_8361/status/1518970259868626944
2.https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/binaryformatter-security-guide
3.https://attack.mitre.org/techniques/T1218/014/
4.https://github.com/CsEnox/EventViewer-UACBypass
绿盟科技天元实验室专注于新型实战化攻防对抗技术研究。
研究目标包括:漏洞利用技术、防御绕过技术、攻击隐匿技术、攻击持久化技术等蓝军技术,以及攻击技战术、攻击框架的研究。涵盖Web安全、终端安全、AD安全、云安全等多个技术领域的攻击技术研究,以及工业互联网、车联网等业务场景的攻击技术研究。通过研究攻击对抗技术,从攻击视角提供识别风险的方法和手段,为威胁对抗提供决策支撑。
M01N Team
聚焦高级攻防对抗热点技术
绿盟科技蓝军技术研究战队
原文始发于微信公众号(M01N Team):Windows事件查看器.NET 反序列化利用