初识kerberos协议

warning: 这篇文章距离上次修改已过313天,其中的内容可能已经有所变动。

初识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认证中的hash
Net-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 v1NTLMv2NTLM session v2三种协议,不同协议使用不同格式的Challenge和加密算法

所以也就存在不同协议的Net-NTLM hash,即Net-NTLM v1 hashNet-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 relaysmb,从smb relayldap/mssql等等。我们只需要将一个协议中的NTLM消息中提取出来,然后原封不动的放入另一个协议,这样就完成了上层协议转换的过程

SMB RELAY

这个其实就是可以利用msf里面的smb_relay模块进行攻击

添加新评论