CVE-2020-1048漏洞(Print Spooler)

原创
07/21 14:42
阅读数 1.3K

    题外话:读此文前,你要有思想准备,不是那么简单,你有可能懵圈。    


    这是一个Windows打印机后台程序的本地提权漏洞,但这个漏洞与以往介绍的本地提权漏洞完全不同,有一定的限制条件,但从理解windows的角度确实有意思。


    一般情况下,我研究东西的速度很快,可能是学的比较杂的缘故,每个相关的方向都懂一点。但这个漏洞的复现我花了不少时间,走了一些弯路。


    这个漏洞微软修补时间为今年的5月份,据说和“震网”是同一个级别的漏洞(震网中也使用了打印机漏洞),当然兴趣更浓了,一定要一睹风采。


一、POC

源码:https://github.com/ionescu007/PrintDemon


我用vs2019编译成exe,将整个源码和exe打包放在:

链接:https://pan.baidu.com/s/17CclA4J3TwT9mY-XcfpGoA

提取码:hpen


二、漏洞影响范围:

Windows的许多最新版本,包括Windows Server 2008、2012、2016和2019以及Windows 7、8.1和10,危害挺大的。


三、复现过程

1、环境:win10 x64;

声明,我当时测试时使用的是win7 x64;下面的说明先以win7为例,后面的以win10为例,我会在文中说明;


2、建立个普通权限的用户,test


3、将打包中的exe放入此win测试机中;当运行时出现这样的提示,说明test权限不够,要用管理员权限才能复制程序;


4、将两个主程序printserver.exe和printclient.exe复机到桌面,运行printserver.exe,


这时,看下打印机,多出一个PrintDemon;


看下打印机队列;

多出一个任务“本地下层文档”,隶属于用户test,“已暂停”状态;


运行printclient.exe,出现错误提示;

出现不能识别的错误提示。。。提示打开00002.shd文件,在c:\windows\system32\spool\PRINTERS目录下;



先记住这两个文件和那个目录;


找原因,为什么报错,看源代码:


再找下 这个 only support Version 4:

哎,写得清清楚楚,这个POC是用win10来做验证的,这么大说明都看不见啊,用win7当然报错了。换成win10,好了,这下面都是win10的操作了。


5、同样的步骤;


6、成功发送到打印机。

7、怎么提权?这还是test啊,没有变成“管理员 test”啊。


8、我们知道当使用普通权限登录windows时,如果往windows里复制文件都是提示要管理员权限才行,还记得我们复制的运行printserver的两个系统dll文件吗,往上看图,有个vcruntion140d.dll。说明在整个windows目录下都是要管理员权限才能动的。


9、看源码,发现在“c:\windows\tracing\”写入了demoport.txt;

说明:发现在“c:\windows\tracing\”这里是可写入的权限;而且这个位置是程序设定的,那就意味着我可以设定任何位置,如windows\system32下;


10、我来拖几个文件进去,看看是否可以写入,

确实可以,而且是在windows下。


这意味着:打印操作以SYSTEM特权运行,从而允许它覆盖OS上任何位置的任何文件。低权限的 test用户突破了无法修改系统资源的安全限制。


四、成因

1、打印机工作机制

Windows系统的打印机有两个核心组件:打印机驱动和打印机端口。


  • 打印机驱动

在添加一个打印机时,需要安装打印机驱动。在MSDN文档描述中,早期系统要求只有具备SeLoadDriverPrivilege权限的用户才能安装打印驱动,但为了便于标准用户安装驱动,从Windows Vista开始,只要打印机驱动是已经存在的可立即使用的驱动,就不需要任何特权即可安装。例如,通过一条PowerShell命令即可安装“Generic / Text-Only”驱动。这里查看一下驱动;


  • 打印机端口

在添加一个打印机时,需要设置打印机的端口。Windows支持多种类型的打印机端口:LPT1端口、USB端口、网络端口和文件等。如果设置端口为文件,则意味着打印机将数据打印到指定文件。例如,通过一条PowerShell命令即可添加一个输出到指定文件的打印端口:

Add-PrinterPort -Name "C:\windows\Temp\myport.txt";
这时查看一下端口:


准备好驱动和端口后,通过一条PowerShell命令即可创建一个打印机。就用这个图代替下,意思一样,不用懵吧。

一个完整的打印机命令结果图。


2、脱机打印的机制

    在Windows系统上,如果系统配置启用了假脱机服务,则所有的打印任务都不是立即执行。相反,系统使用Print Spooler来管理脱机打印任务。具体来说,当用户调用打印操作后,系统将打印作业存储在特定的假脱机文件夹中。

默认情况下,Windows生成的脱机打印任务文件为.SPL文件,此外Windows还会创建后缀名为.SHD的shadow文件并同SPL文件做关联。创建shadow文件的用途是:在打印程序出现问题或者打印任务被挂起后,PrintSpooler依然可以通过SHD文件恢复打印任务。


    在Windows系统重启或Print Spooler服务重启之后,.SHD和.SPL文件会被重新读取以恢复打印任务。


3、印提权的原理

   脱机打印机制使得Windows系统在重启后会恢复可能存在的未执行打印任务。但是,重启后的Printer Spooler服务程序直接使用了System权限来恢复未执行的打印作业。对于打印机端口为文件的打印任务,打印文件的写入也就在System权限下被执行。因此,系统重启使得脱机打印任务具备了System权限的任意文件写入能力。


    4、Windows系统提供了两种添加打印机端口的API,分别是AddPort函数和XcvData函数。其中MSDN对AddPort的描述:

“AddPort函数浏览网络以查找现有端口,并弹出对话框供用户选择。AddPort函数应该通过调用EnumPorts来验证用户输入的端口名称,以确保不存在重复的名称。AddPort函数的调用方必须具有访问端口所连接的服务器的SERVER_ACCESS_ADMINISTER权限。要添加端口而不显示对话框,可调用XcvData函数而不是AddPort”。


    通过控制面板添加打印机在底层是调用了AddPort函数,该函数会触发spooler程序对端口的合法性校验。通过PowerShell命令添加打印机在底层则是直接调用XcvData函数,该函数不会触发spooler程序对用户添加的端口进行安全校验。


五、修复补丁

    由于该漏洞能影响众多的Windows系统版本,而且可以在标准用户下发起漏洞攻击,建议受影响的用户及时进行系统更新或安装漏洞补丁。


    此外,微软的安全更新只是对打印端口API进行了更严格的校验。但是,如果恶意文件端口在漏洞修复前已经创建,则漏洞攻击实际已经生效,此时进行系统更新仍然是不安全的。建议用户先使用PowerShell命令Get-PrinterPort来检查系统中是否存在可疑的打印机端口,在删除可疑端口后再实施系统更新。


    研究这个漏洞,花了数个晚上的时间,光写此文,就整整花了我一中午的时间,约2个半小时。你细细地看完,收获会很大。





本文分享自微信公众号 - MicroPest(gh_696c36c5382b)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部