windows身份认证及票据伪造

windows身份认证及票据伪造

这一篇主要讲解windows的NTLM认证和kerberos认证,以及白银票据和黄金票据原理。
windows身份认证用于验证某个用户或主机是否具有访问某个服务的权限。

windows NTLM认证

NTLM认证是一种较为简单的认证方式,主要有三步:协商、质询、验证
通过这三步我们来验证主机是否有权限访问服务器。

第一步:协商
client与server协商使用NTLM的哪一个版本(有 v1 和 v2)

第二步:质询
首先,client向server发送本机信息,然后server生成一个16位的随机session key,并将其(challenge)发送给client,client接收到明文的session key之后,使用自己的NTLM hash(密码的hash值)加密session key,并将结果(response)再次发送给server,server接收到之后,会将client信息、加密的session key和明文的session key全部发送DC。

windows身份认证及票据伪造

第三步:验证
DC接收到server发送的信息之后,会根据client信息,查找它的NTLM hash,利用该hash加密session key,比对两个加密后的session key,如果一致,说明身份认证通过,允许访问该服务器。

哈希传递

哈希传递的条件:
1、client可以访问到server
2、知道client的用户名
3、知道client的密码hash(NTLM hash)

原理:
因为NTLM认证其实就是通过用户的密码hash来加密session key从而通过认证的,所以如果我们没有用户密码,但是只需要获得该密码的NTLM hash,就可以完成这个认证过程。从而获得访问权限。

windows Kerberos认证

kerberos认证(域认证体系)比较复杂,但是这种认证的安全性会比较高。

首先介绍一下,参与认证的三个角色:
1、client:客户端
2、server:被客户端访问的服务
3、KDC:**分发中心(DC),其中包含AS和TGS服务

接下来详细介绍一下kerberos认证流程:
第一步:
首先client向KDC的AS发送自己的信息(包含一个由client hash加密的时间戳,一个client info以及要访问的server info),AS接收到信息之后,返回给client两个信息:1、由请求client的NTLM hash加密的随机生成的16位session key,2、TGT(由KDC hash加密的session key、client info、end time,end time指TGT有效期)。

windows身份认证及票据伪造PS:这里由KDC hash加密之后的结果就是TGT!

第二步:
client收到了第一步AS所发送的两个信息之后,又将TGT和client info和server info和由client hash解密出来得到的session key来加密的client info与时间戳全部再次发送给KDC的TGS服务。
TGS接收到后,将使用KDC hash解密TGT,然后利用解密得到的session key再解密发送来的加密信息,得到client info和时间戳,通过时间戳来判断TGT是否过期。
之后通过之前得到的server info,来从KDC中获取到该服务器的server hash,然后利用session key加密随机生成的server session key,以及利用server hash加密ticket(ticket包含server session key、client info、end time),之后将加密的两个内容发给client。

windows身份认证及票据伪造PS:这里由server hash加密之后的结果就是Ticket!

第三步:
client接收到上一步的两个信息之后,会先解密得到server session key,然后使用server session key加密client info和时间戳,之后连同Ticket一并发送给要访问的服务器。
服务器得到之后,利用自己的hash来解密ticket,利用得到的server session key来解密由server session key加密的数据,得到client信息,验证它是否与ticket中的client相等,其次就是验证时间是否过期。

windows身份认证及票据伪造
至此kerberos认证结束。

白银票据

这里简单讲解一下白银票据的原理,实战伪造将在其他内网文章中记载。

白银票据是什么?
我们根据kerberos认证的过程可以发现,其中有两步是要利用KDC hash或server hash来加密的,设想一种情况,我们通过渗透,已经获得了某个server的hash,这样一来,我们就可以利用server hash来伪造一个Ticket。
server hash(server session key, client info, end time) 这个是Ticket的结构。虽然这里面存在server session key,但是由于我们服务器无法验证,所以完全可以伪造一个session key(server session key),由于没有进行正常认证,所以不会有TGT(跳过前一步,直接构造了Ticket),也就没有session key。
构造完Ticket之后,注入到内存中,再去访问相对应的服务就可以了。

但是白银票据的限制在于,你只能访问你所拥有server hash的那些server,也就是说,Ticket是针对于不同服务的。

白银票据的特点:
1、不需要与KDC进行交互
2、需要目标服务的NTLM hash

白银票据的防御:
1、尽量保证服务器凭证不被窃取
2、开启PAC(特权属性证书保护功能):主要是用于规定服务器要将票据发送给kerberos服务器进行一个验证。
开启方式:将注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters中的ValidateKdcPacSignture设置为1

黄金票据

这里简单讲解一下黄金票据的原理,实战伪造将在其他内网文章中记载。

黄金票据是什么?
黄金票据比白银票据更加有用,它可以让我们对域的控制隐蔽性更高。
白银票据伪造的Ticket,而黄金票据伪造的是TGT。
KDC hash(session key,client info,end time) 是TGT的结构,当我们得到了KDC hash,也就可以伪造TGT了,原理与白银票据类似,但是黄金票据是不受访问服务的限制的,也就是黄金票据可以访问任何服务。

黄金票据的特点:
1、需要与DC通信
2、需要Krbtgt用户的hash
ps:这里的krbtgt hash 就是之前讲的KDC hash当我们有了KDC的hash,我们就可以任意伪造的TGT完成对服务器的访问。