2021-08-31

域渗透基础—NTLM协议与Kerberos协议

一、NTLM协议

1、NTLM简介

NTLM使用在Windows NT和Windows 2000 Server(or later)工作组环境中(Kerberos用在域模式下)。在AD域环境中,如果需要认证Windows NT系统,也必须采用NTLM。较之Kerberos,基于NTLM的认证过程要简单很多。NTLM采用一种质询/应答(Challenge/Response)消息交换模式。

在本地登录Windows的情况下,操作系统会使用用户输入的密码作为凭证去与系统中的密码进行验证,操作系统中的密码存储在
%SystemRoot%\system32\config\sam


图片.png

2、LM Hash & NTLM Hash

windows内部是不保存明文密码的,只保存密码的hash。

其中本机用户的密码hash是放在本地的SAM文件 里面,域内用户的密码hash是存在域控的NTDS.DIT文件 里面。

在Windows系统导出密码的时候,经常看到这样的密码格式

Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::

其中的AAD3B435B51404EEAAD3B435B51404EE是LM Hash

31D6CFE0D16AE931B73C59D7E0C089C0是NTLM Hash

LM Hash的计算:

①用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。

②密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度。

③再分7bit为一组,每组末尾加0,再组成一组。

④上步骤得到的二组,分别作为key 为 “KGS!@#$%”进行DES加密。

⑤将加密后的两组拼接在一起,得到最终LM HASH值。

注:如果密码强度是小于7位,那么第二个分组加密后的结果肯定是aad3b435b51404ee

NTLM Hash的计算

①.先将用户密码转换为十六进制格式。

②.将十六进制格式的密码进行Unicode编码。

③.使用MD4摘要算法对Unicode编码数据进行Hash计算。

从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。(因此后面我们介绍身份认证的时候只介绍Net-ntlm,不再介绍net-lm)如果空密码或者不储蓄LM Hash的话,我们抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE。

所以在win7 中我们看到抓到LM Hash都是AAD3B435B51404EEAAD3B435B51404EE,这里的LM Hash并没有价值。

3、NTLM验证

图片.png

NTLM验证是一种Challenge/Response 验证机制,由三种消息组成:通常称为type 1(协商),类型type 2(质询)和type 3(身份验证)。

①用户登录客户端电脑。

②(type 1)客户端向服务器发送type 1(协商)消息,它主要包含客户端支持和服务器请求的功能列表。

③(type 2)服务器用type 2消息(质询)进行响应,这包含服务器支持和同意的功能列表。但是,最重要的是,它包含服务器产生的Challenge。

④(type 3)客户端用type 3消息(身份验证)回复质询。用户接收到步骤3中的challenge之后,使用用户hash与challenge进行加密运算得到response,将response,username,challeng发给服务器。消息中的response是最关键的部分,因为它们向服务器证明客户端用户已经知道帐户密码。

⑤服务器拿到type 3之后,使用challenge和用户hash进行加密得到response2与type 3发来的response进行比较。如果用户hash是存储在域控里面的话,那么没有用户hash,也就没办法计算response2。也就没法验证。这个时候用户服务器就会通过netlogon协议联系域控,建立一个安全通道,然后将type 1,type 2,type3 全部发给域控(这个过程也叫作Pass Through Authentication认证流程)

⑥域控使用challenge和用户hash进行加密得到response2,与type 3的response进行比较。

4、哈希传递攻击(PTH)

哈希传递(Pass The Hash)攻击简称 PTH,该方法通过找到与账户相关的密码散列值(NTLM Hash)来进行攻击。由于在 Windows 系统 NTLM 认证的 TYPE 3 消息计算 Response 的时候,客户端是使用用户的 NTLM Hash 进行计算的,而不是用户密码进行计算的。因此在模拟用户登录或对访问资源的用户进行身份认证的时候,是不需要用户明文密码的,只需要用户 Hash。攻击者可以利用 NTLM HASH 直接远程登录目标主机或反弹 Shell。

在域环境中,用户登录计算机时一般使用域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也相同,攻击者就能使用哈希传递攻击的方法来登录内网中的其他主机。使用该方法,攻击者不需要花费时间来对 Hash 进行爆破,在内网渗透里非常经典。常常适用于域环境或工作组环境。

5、总结

NTLM是windows早期安全协议,因向后兼容性而保留下来,而后还有V2版本,与其最大的不同是challenge加密算法不一样,验证方式基本相同;

二、Kerberos 协议

1、简介

Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。Kerberos 主要是用在域环境下的身份认证协议。

2、kerberos 认证流程

① client向kerberos服务请求,希望获取访问server的权限。 kerberos得到了这个消息,首先得判断client是否是可信赖的, 也就是白名单黑名单的说法。这就是AS服务完成的工作,通过 在AD中存储黑名单和白名单来区分client。成功后,返回AS返 回TGT给client。

②client得到了TGT后,继续向kerberos请求,希望获取访问 server的权限。kerberos又得到了这个消息,这时候通过client 消息中的TGT,判断出了client拥有了这个权限,给了client访 问server的权限ticket。

[图片上传失败...(image-81ff46-1630390495796)]

③client得到ticket后,终于可以成功访问server。这个ticket只是 针对这个server,其他server需要向TGS申请。

3、SPN定义

服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称。Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联。如果在整个林中的计算机上安装多个服务实例,则每个实例都必须具有自己的SPN。如果客户端可能使用多个名称进行身份验证,则给定的服务实例可以具有多个SPN。例如,SPN总是包含运行服务实例的主机名称,所以服务实例可以为其主机的每个名称或别名注册一个SPN。

4、SPN扫描

spn扫描也可以叫扫描Kerberos服务实例名称,在Active Directory环境中发现服务的最佳方法是通过“SPN扫描”。通过请求特定SPN类型的服务主体名称来查找服务,SPN扫描攻击者通过网络端口扫描的主要好处是SPN扫描不需要连接到网络上的每个IP来检查服务端口。SPN扫描通过LDAP查询向域控制器执行服务发现。由于SPN查询是普通Kerberos票据的一部分,因此如果不能被查询,但可以用网络端口扫描来确认。

5、Kerberoast攻击简述

利用SPN的Kerberoast攻击,即破解Kerberos服务票据并重写,从而获得目标服务的访问权限(过程中是合法访问、离线破解服务票据,而完全不需要与服务目标有任何交互行为)

选择域用户下注册的SPN,为这个服务请求票据,导出票据后进行破解,然后重写票据,可以造成身份伪造或提权。

你可能感兴趣的:(2021-08-31)