Windows本地XPS打印后台程序沙盒转义漏洞利用

Windows:本地XPS打印后台处理程序沙盒转义
平台:Windows 10 1703和1709(未经测试的Windows 7或8.x)
类:特权提升
概要:
本地打印后台处理程序可能被滥用,从一个低权限应用程序创建一个任意文件,其中包括一个AC,以及一个典型的Edge LPAC CP通向EoP。
描述:
在创建XPS打印作业时,可以在传递给StartDocPrinter的DOC_INFO_1结构中指定目标文件。当您调用WritePrinter写入新的打印机作业时,特权打印机假脱机程序服务模拟调用者,并确保他们可以写入目标。这应该确保沙盒用户不能写入他们通常无法访问的位置。不幸的是后台打印程序然后删除它在模拟下创建的这个文件,然后调用NSecurityLibrary :: ElevateIntegrityLevelIfLow来将调用者的标记的IL增加到中等水平,如果标记是当前低IL。在一个天真的沙盒,如IE PM,这将导致实际的文件被写入在中IL,这将足以写入任何用户控制的位置,如启动文件夹。然而在一个AC沙箱中,你会认为这不会有帮助,因为即使令牌的IL被提高,AC仍然会被执行。似乎不是,如果代码将AC令牌的IL提升到中等(这需要SeTcbPrivilege),那么内核还会删除AC的所有跟踪,并将最终令牌再次保留为正常的中等IL用户令牌。因此,在天真和AC的情况下,都存在TOCTOU攻击,您可以将沙盒标记写入到您控制的文件夹,然后将标记IL引发后将写入重定向到另一个位置。将最终的令牌再次留给普通的中等IL用户令牌。因此,在天真和AC的情况下,都存在TOCTOU攻击,您可以将沙盒标记写入到您控制的文件夹,然后将标记IL引发后将写入重定向到另一个位置。将最终的令牌再次留给普通的中等IL用户令牌。因此,在天真和AC的情况下,都存在TOCTOU攻击,您可以将沙盒标记写入到您控制的文件夹,然后将标记IL引发后将写入重定向到另一个位置。
这样做的最简单的方法就是标准的符号链接攻击,幸运的是Windows减轻了所有这些攻击的简单方法。不幸的是,在AC中运行时,在处理NtImpersonateAnonymousToken方面存在一个错误,在这种情况下允许符号链接攻击。我已经提交NtImpersonateAnonymousToken中的错误作为一个单独的问题。当然,没有理由相信没有其他的方式来利用这个问题,如果没有NtImpersonateAnonymousToken中的错误,就足够的努力了。
利用做到以下几点:
1)在一个AC可写目录(如Temp)中创建一个假目标目录。例如,如果要写入 C:\users\user\desktop\hello.txt create %TEMP%\users\user\desktop
2)使用NtImpersonateAnonymousToken中的错误模拟非AC令牌,并在匿名用户的驱动器映射中指向临时目录中创建一个新的 C: drive symlink 请注意,因为这是在沙盒内创建的,所以非沙盒调用者不会遵循符号链接。
3)通过匿名令牌的设备映射目录,以Win32形式建立到目标路径的本地NT路径,并传递给DOC_INFO_1中的StartDocPrinter。例如 \\?\GLOBALROOT\Sessions\0\DosDevices\00000000-000003E6\C:\Users\user\desktop\hello.txt
4)在临时目录下创建“伪”目标文件,并在其上放置一个专用的锁定。
5)在另一个线程中调用WritePrinter,在原线程中等待oplock完成。在这种情况下,打印假脱机程序中的打开将遵循符号链接,因为它正在模拟沙盒标记。
6)删除符号链接并破坏oplock,这允许后台打印程序继续。
7)假脱机程序现在模拟中等用户令牌并试图打开路径。在2中创建的C:符号链接现在不再存在,但是由于我们使用的是设备映射目录,因此全局设备映射回退将启动,因此假脱机程序将看到全局C:驱动器。
8)假脱机程序将任意数据写入沙箱区域之外的新目标文件。
我真的不知道为什么写入文件之前令牌被提升。有一种模式,如果你不指定路径,那么假脱机程序会把文件写入本地文档目录。由于沙盒应用程序无法控制路径,因此至少应该提高文件的写入能力,但在编写明确的路径时,似乎没有必要。请注意,这也适用于LPAC,至少在边缘CP的实现方面。这是因为假脱机程序的ALPC端口具有“lpacPrinting”功能的ACE,该功能位于Edge的大多数(所有)CP的功能列表中。我还注意到,WDAG支持编写XPS文件,但是我没有时间详细说明WDAG如何工作,以确定它是否也是脆弱的。
概念验证:
我已经提供了一个C#项目的PoC。PoC会将文件hello.txt放到任意内容的当前用户桌面上。PoC将重生为Microsoft Edge AC,然后执行漏洞利用。您必须以UAC分割令牌管理员身份运行此项。请注意,这不是一个UAC旁路,只是分离令牌管理员通过请求链接的令牌获取非AC令牌的方法很简单。PoC将只使用一个普通的AC来执行,用LPAC来测试可执行的任何参数,LPAC能力是从Edge CP复制的,所以应该代表现实生活中可用的。在某些系统上似乎.NET框架目录有一个不正确的DACL,导致LPAC模式失败。一个新的安装1709应该工作。
1)编译C#项目。它需要从NuGet获取NtApiDotNet才能工作。确保主要的可执行文件和DLL位于用户可写的位置(这是调整AC的文件权限所需的)。
2)以普通用户级别的分离令牌管理员的身份执行PoC。
3)一旦完成,会出现一个对话框,指示操作已完成。
预期结果:
写入沙盒可访问目录之外的文件应该失败。
观察结果:
文件hello.txt是在当前用户的桌面目录中创建的任意内容。
微软已经决定,现在NtImpersonateAnonymousToken(https://bugs.chromium.org/p/project-zero/issues/detail?id=1414)的问题现在已经解决了,那么你就不能再利用这个问题了。我不同意这种评估,因为总是有新的方法来获得类似的功能性符号链接。打印机API允许传递一个任意的Win32路径,这个路径似乎没有被翻译,所以有很多的滥用范围。您仍然可以从低IL沙箱中继续使用它,因为您仍然可以访问匿名标记的dos设备目录,但是MS并不认为这是安全边界。
概念验证:
https://github.com/offensive-security/exploit-database-bin-sploits/raw/master/bin-sploits/43465.zip

 

Leave a Reply