初识kerberos协议
初识kerberos协议
kerberos协议的学习
基本知识
kerberos协议是一种身份验证协议,作为一种可信任的第三方认证服务,通过使用对称加密技术为客户端/服务端应用程序提供强身份证明。在域环境下,AD域使用kerberos协议进行验证。
AD的全称是Active Directory
:活动目录
域(Domain)
- 1.域是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后
- 2.两个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理,以及相互通信和数据传输
域控制器(DC)
域控制器就是一台服务器,负责每一台联入网络的电脑和用户的验证工作。
组织单元(OU)
用户名服务器名(CN)
kerberos中的重要角色
- 访问服务的client--
- 提供服务的server
- KDC:秘钥分发中心,默认安装在域控上
其中这三个是最主要的三个角色
- AS-Authentication Server:身份验证服务
- TGS-Ticket Granting Server:票证授予服务
而AS和TGS则是属于KDC的krbtgt账户:每个域控DC都有一个krbtgt账户,此账户是KDC的服务账户用来创建票据授予服务(TGS)加密的秘钥

其中KDC服务会默认安装在一个域的域控中,而client和server为域内的用户或者是服务,如HTTP服务,SQL服务。kerberos中client是否有权限访问server端的服务由KDC发放的票据来决定
如果把kerberos中的票据类比为一张火车票的话,那么client端就是乘客,server端就是火车,KDC就是车站的认证系统。只有client端的票据是合法的同时又有访问server端服务的权限的话,才能上车。
kerberos协议的认证过程
kerberos的认证过程有三步
- 获取票据许可票据
- 获取服务许可票据
- 获得服务
获取票据许可票据
KRB_AS_REQ
:用于向KDC请求TGT
当用户在客户端输入域用户和密码时,客户端将用户密码转换为hash作为加密秘钥,对时间戳进行加密作为请求凭据KRB_AS_REQ
的数据包

cipher
:加密的时间戳,即客户端的当前时间与用户的hash加密后的结果
KRB_AS_REP
:用于通过KDC传递TGT
收到请求后,KDC从AD域数据库中找到对用户的hash解密时间戳来验证用户身份。如果时间戳在允许的时间范围内,那么他就会生成一个会话秘钥(session key),以AS_REP
数据包进行响应。KRB_AS_REP
数据包

ticket
:使用krbtgt hash
加密,包含用户名/会话密钥和到期时间等信息.enc-part
:使用用户hash加密,包含会话密钥/TGT到期时间和随机数(防重放)
获取服务许可票据
KRB_TGS_REQ
:使用TGT向KDC请求TGS
客户端获得TGT和用户秘钥加密的enc-part
,使用用户hash解密enc-part
获得会话秘钥,然后使用会话秘钥将用户名/时间戳进行加密,生成authenticator
和TGT发送给TGS
数据包内容

其中
ticket:实质上就是一张TGT,客户端没有 krbtgt hash,故无法解密TGT.
KRB_TGS_REP
:通过KDC传递TGS
TGS收到KRB_TGS_REQ
请求后,使用krbtgt hash
解密ticket获取会话秘钥,然后使用会话秘钥解密authenticator获取用户名和时间戳进行身份验证。确认信息后,创建一个服务会话秘钥。
数据包内容

ticket:使用对应的服务密钥进行加密,包含服务会话密钥/用户名/到期时间等信息,本质上就是一张ST(Service Ticket)。enc-part:包含使用会话密钥加密的服务会话密钥(Service Session key)
获得服务
KRB_AP_REQ
:使用TGS,服务对用户身份验证
客户端已经拥有了有效的TGS可以与服务进行交互,使用会话密钥解密 enc-part
,得到 服务会话密钥(Service Session key),将用户名/时间戳等信息使用服务会话密钥(Service Session key)进行加密,得到新的Authentication
。
KRB_AP_REP
:由服务用来针对用户标识自身
服务端接收到请求,使用自己的hash解密TGS获得服务会话密钥(Service Session key)和授权用户信息,然后使用服务会话密钥解密Authentication,比对用户名和时间戳等信息,如果有相互验证标记,服务端使用服务会话密钥加密时间戳发给客户端,客户端解密时间戳验证服务端,然后开始请求服务。
黄金票据
简介
黄金票据(Golden Ticket)是通过伪造的TGT(Ticket Granting Ticket),因为只要有了高权限的TGT,那么就可以发送给TGS换取任意服务的ST,也就是说,有了黄金票据就有了域内的最高权限,因为它是由域Kerberos帐户(KRBTGT)加密和签名的
制作黄金票据条件
1、域名称
2、域的SID值
3、域的KRBTGT账户密码HASH
4、伪造用户名,可以是任意的
NTLM hash和Net-NTLM hash
NTLM hash
NTLM hash
是指windows系统下Security Account Manager
中保存的用户密码hash
该hash的生成方法是:
- 将明文口令转换成十六进制的格式
- 转换成Unicode格式,即在每个字节之后添加0x00
- 对Unicode字符串再MD4加密,生成32位的十六进制数字串
在渗透测试中,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得所有用户的hash,通过Mimikatz读取lsass.exe进程能获得已登录用户的NTLM hash
Net-NTLM hash
Net-NTLM hash
是指网络环境下NTLM认证中的hashNet-NTLM hash
认证采用质询/应答(Challenge/Response)
的消息交换模式,流程如下:
- 客户端向服务器发送一个请求,请求中包含明文的登录用户名。服务器会提前存储登录用户名和对应的密码hash
- 服务器接收到请求后,生成一个16位的随机数(这个随机数被称为Challenge),明文发送回客户端,使用存储的登录用户密码hash加密Challenge,获得Challenge1
- 哭护短接收到Challenge后,使用登录用户的密码hash对Challenge加密,获得Challenge2(这个结果被称为response),将response发送给服务器
- 服务器接收客户端加密后的response,比较challenge1和response,如果相同,验证成功
在以上流程中,登录用户的密码hash即NTLM hash
,response中包含Net-NTLM hash
在NTLM认证中,NTLM响应分为NTLM v1
,NTLMv2
,NTLM session v2
三种协议,不同协议使用不同格式的Challenge和加密算法
所以也就存在不同协议的Net-NTLM hash
,即Net-NTLM v1 hash
,Net-NTLM v2 hash
从攻击角度来看:
- 可以利用NTLM哈希值进行“哈希传递”攻击
- 但是无法利用Net-NTLM哈希值来进行“哈希传递”攻击
NTML和SMB的关系
SMB的认证可以基于NTLM协议或者kerberos协议,前者使用hash,后者使用ticket,是构成SMB的PtH和PtT攻击的基础。NTLM并没有定义它所以来的传输层协议。NTLM消息的传输完全依赖于使用NTLM的上层协议来决定,可以使SMB,也可以是TCP,亦或HTTP
跨协议的NTLM-Relay
上一个标题说过,NTLM的上层协议基本可以是任何协议,(当然这是基于TCP的情况,如果上层是UDP的协议的话,可能又不一样),所以这就引出了跨协议的NTLM-Relay
技巧,无论NTLM上层协议是什么,其携带NTLM的三条消息都是由NTLM SSP
生成的,所以上层协议在relay的过程中可以被替换掉
比如从http relay
至smb
,从smb relay
至ldap/mssql
等等。我们只需要将一个协议中的NTLM消息中提取出来,然后原封不动的放入另一个协议,这样就完成了上层协议转换的过程
SMB RELAY
这个其实就是可以利用msf里面的smb_relay
模块进行攻击