微软在本月的微软补丁日修复了一个Windows NT LAN Manager (NTLM)安全特征绕过漏洞。该漏洞CVE编号为CVE-2021-1678,CVSS评分为4.3分。攻击者利用该漏洞可以中继NTLM 认证会话到攻击者的机器,使用printer spooler MSRPC 接口来在被攻击的机器上远程执行代码。
NTLM中继攻击是中间人攻击的一种,攻击者利用该攻击可以访问网络来拦截客户端和服务器之间合法的认证流量,并对经过验证的认证请求进行中继以访问相关的网络服务。
Print Spooler 权限提升
漏洞利用中,攻击者使用了来自特权用户账户的NTLM 会话来执行一系列的RPC 操作。整个漏洞利用的步骤如下所示:
(1) 建立于攻击者控制的中继机器的NTLM 会话;
(2) 攻击者绑定目标的IRemoteWinspool 接口,选择RPC_C_AUTHN_LEVEL_CONNECT的认证级别;
(3) 攻击者通过建立的RPC 信道来中继NTLM 认证;
(4) 执行一系列的RPC命令:
- RpcAsyncInstallPrinterDriverFromPackage (Opnum 62) — 安装“Generic/Text”打印机驱动;
- RpcAsyncOpenPrinter (Opnum 0)
- RpcAsyncXcvData (Opnum 33) — 添加端口
- RpcAsyncAddPrinter (Opnum 1) — 用前面提到的驱动添加打印机;
- RpcAsyncStartDocPrinter(Opnum 10) — 打开新文档;
- RpcAsyncWritePrinter (Opnum 12) — 在新文档中写入内容。
图 CVE-2021-1678漏洞利用流图
补丁分析
微软在补丁中对定时任务服务使用的IfCallback 加入了检查,同时对RPC运行时间没有太大的影响。研究人员逆行了Spoolsv.exe中IRemoteWinspool的实现,发现了一个名为RpcManager::VerifyRpcValidProtocolSequence 的共享函数,该函数被多个不同的RPC 接口所使用,其中就包括IRemoteWinSpool。
本来该函数会验证ncacn_ip_tcp协议序列是否用于IRemoteWinspool,以确保只有远程的TCP/IP 客户端才会被接受。但是,在认证安全级中没有相关的检查。
在补丁中,二进制文件中加入了一个新的IfCallback 函数,伪代码如下所示:
图 安装补丁后IRemoteWinspool使用的新的RPC 验证流
从中可以看出,验证协议序列的调用被扩展了,如下所示:
图 安装补丁后安全级别验证
如上图所示,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print key中的REG_DWORD value RpcAuthnLevelPrivacyEnabled 必须设置为1,否则其他的检查就不会执行,系统仍然会受到攻击。
更多技术细节参见:https://www.crowdstrike.com/blog/cve-2021-1678-printer-spooler-relay-security-advisory/