1、NTLM是什么

  1. 基于ntlm的认证方式,主要用在**早期**的windows工作组环境中,认证的过程也相对比较简单**
  2. NTLM采用一种**质询/应答**(Challenge/Response)消息交换模式<br /> NTLM存在V1V2,版本,NTLMsession v2,流程相同,加密算法不同

2、认证流程
ntlm在域的认证流程:
1、Client输入Username,Password,Domain给Server,并且缓存一份Password哈希到本地,明文发送Username给Server
2、Server生成一个Challenge(16字节),发送给Client
3、Client收到Challenge后,先原地复制一份,再将之前缓存的Password对Challenge加密,成为Response,再将Response和Challenge,Username传回Server
4、Server收到这三个值转发给DC
5、DC收到值后,对查找域控的账号数据库(ntds.dit)里的Username字段和对应的Password_Hash
6、DC将Password_hash对Challenge字段加密,与传过来的Response进行对比看是否一致,一致则登录成功。

NTLM Password_Hash的产生
假设我的密码是admin,那么操作系统会将admin转换为十六进制,经过Unicode转换后,再调用MD4加密算法加密,这个加密结果的十六进制就是NTLM Hash
admin -> hex(16进制编码) = 61646d696e
61646d696e -> Unicode = 610064006d0069006e00
610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634

2、Kerberos

重要的名词概念:
principal(安全个体):被Kerberos成功认证的个体,有一个名字和口令
Ticket:门票,门票是有时间限制的,用来向服务器证明自己的身份,包括标识、会话密钥、时间戳,所有的票据都叫Ticket,
TGT:票据授权票据,票据中心授予的票据,
ST:服务票据,用户使用该票据请求对应的服务,通过验证后获得服务访问权限

krbtgt账户:每个域控制器都有一个“krbtgt”的用户账户,是KDC的服务账户,用来创建票据授予服务(TGS)加密的密钥

KDC(key distribution center ) : 秘钥分发中心,是一个网络服务,提供ticket和临时会话密钥,它提供了两个主要服务AS和TGS
TGS(ticket granting server):票据授予服务
AS(authentication server):身份验证服务

0x00
Kerberos的作用?
1、windows的域认证采用kerberos认证,就像锐捷网络认证,本地服务认证一样
2、Kerberos提供了一个集中式的认证方式,在整个认证过程中总共要涉及到三方:客户端,服务端和KDC [ 密钥分发中心], 在 Windows域环境中,KDC的角色由DC[域控]来担任。
3、Kerberos是一种基于票据的认证方式,票据(Ticket)是用来安全的在认证服务器和用户请求的服务之间传递用户的身份,同时也会传递一些附加信息,用来保证使用Ticket的用户必须是Ticket中指定的用户。
4、Ticket一旦生成,在生存时间内可以被Client多次使用来申请同一个Server的服务(票据窃取问题)
5、客户端,服务端扮演的角色是访问服务的客户,和提供服务供应商。大家可以理解为买者和卖者

0x01
Kerberos的认证流程
1、Client和Server在Kerberos进行认证之后,KDC会给他们发送一个TGT(Client连接KDC的密钥,经过KDC的Key加密过)
2、Client与Server通信时,先用TGT去找KDC拿到可以访问某服务的Ticket(Ticket有两个,一个给服务器,一个给客户端,但是都一起发给客户端)
image.png
3、Client把Ticket给了Server,Server收到票据后,对其解密,并验证时间
image.png
4、如果时间验证通过,那么Server也给Client发送一条消息,让Client进行验证密钥,并看时间是否正确。
image.png
5、最后,完成了一次双向认证,两者成功通信
image.png

整个过程分为三大块,六部分

    1. AS_REQ: Client向KDC发起AS_REQ,请求凭据是Client hash加密的时间戳
    1. AS_REP: KDC使用Client hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid,Client所在的组。
    1. TGS_REQ: Client凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求
    1. TGS_REP: KDC使用krbtgt hash进行解密,如果结果正确,就返回用服务hash 加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)
    1. AP_REQ: Client拿着TGS票据去请求服务
    1. AP_REP: 服务使用自己的hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。

1、AS_REQ

用户向KDC发起AS_REQ,请求凭据是使用用户hash加密的时间戳,AS服务器(KDC)接受后,那边有用户hash,使用用户hash进行解密,获得时间戳,解密成功后,时间戳在一定的范围内,则证明认证通过,进入下一大块阶段
相关字段:
1、pvno
kerberos版本号
2、msg-type
类型,AS_REQ对应的就是KRB_AS_REQ(0x0a)
3、PA_DATA
主要是一些认证信息。一个列表,包含若干个认证消息用于认证,里面有很多信息,主要有两个ENC_TIMESTAMP(使用用户hash加密的时间戳)和PA_PAC_REQUEST(PAC扩展支持开关)
4、REQ_BODY
里面字段比较多,
cname
请求的用户,可用来枚举用户名,用于域账户密码喷洒
till
到期时间,rubeus和kekeo都是20370913024805Z,这个可以作为特征来检测工具。
nonce
随机生成的一个数kekeo/mimikatz nonce是12381973,rubeus nonce是1818848256,这个也可以用来作为特征检测工具。

2、AS_REP

KDC的AS服务解密成功后,返回krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含用户的sid,用户所在的组。
相关字段
1、msg-type
AS_REQ的响应body对应的就是KRB_AS_REP(0x0b)
2、crealm
域名
3、cname
用户名
4、ticket(TGT)
返回krbtgt hash加密的TGT票据,这个ticket主要用于TGS_REQ的认证,如果用有krbtgt的hash就能进行黄金票据
5、enc_part
这部分的解密凭据是用户名hash,解密后得到Encryptionkey,Encryptionkey存在sessionkey作为下一阶段的秘钥

3、TGS_REQ

这个阶段就不需要账户密码了,需要是的AS_REP返回的TGT票据。用户拿着TGT去找KDC校验的过程。
相关字段
1、msg-type
类型,TGS_REQ对应的就是KRB_TGS_REQ(0x0c)
2、PA-DATA
里面存在AP_REQ字段,该字段携带AS_REP的TGT,KDC也是校验这个字段是否正确的来决定是否返回TGS票据(ST)
3、REQ_BODY
存在sname和AddtionTicket字段,sname指定要请求的服务,AddtionTicket在S4U2proxy里用到

4、TGS_REP

1、ticket
重要的部分就是会返回一个用于AP_REQ的认证的Ticket,该Ticket使用要请求的服务的hash来进行加密。如果拥有服务的hash,就能做一个白银票据;正因为使用服务的hash加密,因此能进行hash碰撞来爆破也就是Kerberoasting。

5、AP_REQ&AP_REP

客户端获取到了服务Ticket——ST后去请求服务
服务使用自己的NTLM-hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限

最后我举例一个描述,大家就应该明白了Kerberos的认证到底是什么意思和作用了。

  1. 上面我们巴拉巴拉一堆,有一堆流程,在这过程中最后产生的两个东西TGTST是我们需要注意的

这有点类似于以前我们的火车买票
我们需要上车坐火车需要买票(AS_REQ和AS_REP阶段认证你是中国公民,给了你一张身份证,所以你能买火车票),用的身份证(TGT)买票,而此时乘务员就会给你一张车票(ST),你在用这张车票去上车。
image.png

其他两个概念

0x01.1
委派是什么?
字面意思:派人担任职务或完成某项任务。
域委派:指定某个域用户帮助你管理域,进行创建账户,删除账户等活动。因为域管理员是很重要的。

0x01.2
LDAP是什么?
字面解释:轻型目录访问协议,目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样
简单来说,就是一个数据库服务器,它的目录是一个数据库,可读性好,写入性差,就像目录一样天生用来查询

参考资料:
https://www.anquanke.com/post/id/92484 域委派
https://www.orchome.com/315 细致描述
https://www.imooc.com/article/264959 形象表达
https://daiker.gitbook.io/windows-protocol/kerberos/1 完美参考