[toc]
11月份的时候shenaniganslabs发了博文,讲了关于CVE-2019-1384的漏洞详情
https://shenaniganslabs.io/2019/11/12/Ghost-Potato.html
这同样是一个Potato系列的漏洞,简单来说就是绕过了MS08-068的修补方案,实现本机的NTLM反射,达到提权的目的。
要搞清楚NTLM反射,首先来回顾一下NTLM的认证过程。
NTLM认证基于C/S验证机制,由三种消息组成: 协商,质询,验证
type1:协商
主要是客户端向服务器客户端支持和服务器请求的功能列表
type2: 质询
服务器向客户端发送服务器支持的功能列表,并且同时发送一个16位的Challenge, 并且同时发送服务器的各类信息于Target Info
字段
type3: 验证
客户端收到Challenge后,使用自身的NTLM Hash加密Challenge得到Response,将Response发送给服务端.然后服务端在本地调用用户NTLM hash加密Challenge后,与Response进行对比。
这里需要看一个函数InitializeSecurityContextA
这个函数属于sspi.h
, 关于SSP的作用就不再赘述了
函数主体:
SECURITY_STATUS SEC_ENTRY InitializeSecurityContextA( PCredHandle phCredential, PCtxtHandle phContext, SEC_CHAR *pszTargetName, unsigned long fContextReq, unsigned long Reserved1, unsigned long TargetDataRep, PSecBufferDesc pInput, unsigned long Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput, unsigned long *pfContextAttr, PTimeStamp ptsExpiry );
可以看到存在一个pszTargetName参数, ms08-068的修复方案也就是利用这个参数进行的
当我们存在两个主机进行SMB通信时,A向B发送了type1请求,同时他将自己的pszTargetName设置为cifs/B
, 当拿到type2的challenge时,向lsass进程中写入缓存 -> (Challenge,cifs/B
)。 而后A向B发送type3,B收到response后,会到lsass中去寻找是否存在缓存(Challenge,cifs/B
), 因为只有A主机写入了缓存,所以如果A和B不是同一个主机,那么肯定B主机不存在缓存,认证成功。
这个漏洞主要是绕过了缓存的限制,因为lsass中的缓存(Challenge,cifs/B
),在300s后会自动消失
利用流程:
经过315s后,再发送type3, 那么到时候lsass中的缓存已经消除,可以成功认证本机器
作者原文中提供的Poc: impacket-ghostpotato
由于他给的Poc只支持HTTP协议,所以我们使用IE浏览器进行访问即可
配合responder的LLMNR投毒
responder -I eth0 --lm
上传rat文件到WIndows启动目录,用户下次登录时自启动
当然,如果直接执行命令是system权限的
Poc提供两个上传路径
在复现WebDav的攻击形式时,我发现了一些以前不知道的东西,因为原作者是通过WebDav进行攻击的,所以给俺也来一个。
参考这篇文章 -> https://www.n00py.io/2019/06/understanding-unc-paths-smb-and-webdav/
我们知道了Windows在使用UNC路径的时候,会先通过SMB协议进行访问,如果没有成功,会切换到WebDav进行访问
没什么问题,但是之前通过Windows Server 2008进行测试时,我发现只会通过SMB协议,而不会通过WebDav
这个问题困扰了我蛮久的,最后查阅了一些资料后,我觉得是因为一个注册表项WebClient
位于\HKEY_LOCAL_MACHINE\SYSTEM\CureentControlSet\services\WebClient
WebClient提供了WebDav的Service,也就是说进行Webdav的连接离不开WebClient组件,而WindowsServer2008默认是没有这个东西的,所以也就不行了
利用WebDav进行SMB反射