本月微软补丁日修复了微软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/