浅析Windows域环境身份认证与攻击思路

Posted Tr0e

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析Windows域环境身份认证与攻击思路相关的知识,希望对你有一定的参考价值。

前言

上一篇文章 内网渗透-Windows域环境的初识与搭建 介绍了 Windows 域环境的基础概念和域环境的搭建演示,通过前面的学习也了解到,Windows 系统在工作组上你一切的设置在本机上进行包括各种策略,用户登录也是登录在本机的,密码是放在本机的数据库来验证的。而如果你的计算机加入域的话,各种策略是域控制器统一设定,用户名和密码也是放到域控制器去验证,也就是说你的账号密码可以在同一域的任何一台计算机登录。

也就是说,Windows 用户登录到域中的时候,身份验证是采用 Kerberos 协议在域控制器上进行的,而登录到此计算机则是通过 SAM(本机安全账户数据库)来进行 NTLM 验证的。 Kerberos 协议在在内网域渗透领域中至关重要,白银票据、黄金票据、攻击域控等都离不开 Kerberos 协议。本文将学习记录下 Windows 域环境下的身份认证机制( Kerberos 协议认证NTLM 认证)和相关的攻击思路。

Kerberos 协议

kerberos 协议是一种由 MIT (麻省理工大学) 提出的一种网络身份验证协议,它旨在通过使用加密技术为客户端 / 服务端应用程序提供强大的认证服务。Kerberos 一词来源于西方神话中守卫地狱之门的三头犬的名字,之所以使用这个名字是因为 Kerberos 需要三方的共同参与,才能完成一次事务处理。
在这里插入图片描述

Kerberos 协议主要用于计算机网络的身份鉴别(Authentication),其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即 SSO(single sign on)单点登录。在 Kerberos 认证中,最主要的问题是如何证明「你是你」的问题,如当一个 Client 去访问 Server 服务器上的某服务时,Server 如何判断 Client 是否有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截或篡改也不影响通讯的安全性,这正是 Kerberos 解决的问题。

了解 Kerberos 真实的认证过程之前我们先给出两个重要的概念:

1、长期密钥:在安全领域中,有的密钥可能长期内保持不变,比如密码,可能几年都不曾改变。这样的密钥以及由此派生的其他密钥被称为长期密钥。长期密钥有这样的原则:被长期密钥加密的数据不应该在网络上传输。因为任何加密算法都不可能做到绝对保密,一旦这些被长期密钥加密的数据包被黑客截获,在理论上,只要有充足的时间,都是可以通过计算获得用户用于加密的密钥的。

对于一个账户来说,密码仅限于该账户的所有者知晓,甚至对于管理员都应该是保密的。但是密码却又是证明身份的凭据,所以必须通过基于密码的派生信息来证明用户的真实身份,在这种情况下,一般将账户密码进行 Hash 运算得到一个 Hash 值,也可以称之为主密钥。由于 Hash 算法是不可逆的,同时可以保证密码和主密钥派生的确定性,这样既保证了密码的保密性,同时又保证主密钥和密码本身在证明用户身份时具有相同的效力。

2、短期密钥:由于被长期密钥加密的数据包不能在网络上传送,所以需要使用另一种密钥来加密需要进行网络传输的数据。这种密钥只在一段时间内有效,即使加密过的数据包被黑客截获,等他把密钥计算出来的时候,这个密钥早就已经过期了。我们把这种密钥称为短期密钥。

Kerberos 协议认证过程实际上就是在网络身份认证中使用了短期密钥来替代长期密钥(用户的账户密码),从而规避传输用户密码导致存在敏感信息被窃取的风险。

kerberos 认证框架

Kerberos 协议的认证框架和流程大致可用下图表示:
在这里插入图片描述
相关概念术语如下:

概念释义
域控制器,Domain Controller简称 DC,一台计算机,实现用户、计算机的统一管理
密钥分发中心,Key Distribution center简称 KDC ,在域环境中,KDC 服务默认会安装在域控中,包括 AS 和 TGS
活动目录,Active Directory简称 AD,用于存储用户、用户组、域相关的信息
身份验证服务, Authentication Service简称 AS,用于 KDC 对 Client 认证
票据授权票据,Ticket Granting ticket简称 TGT,由 KDC 的 AS 发放,客户端获取到该票据后,以后申请其他应用的服务票据 (ST) 时,就不需要向 KDC 的 AS 提交身份认证信息 (credential),TGT 具有一定的有效期
票据授予服务,Ticket Grantng Service简称 TGS,用于 KDC 向 Client 和 Server 分发 Session Key(临时秘钥)
服务票据,Service Ticket简称 ST,由 KDC 的 TGS 发放,是客户端应用程序访问 Server 某个服务的凭证,Server 端验证通过则完成 Client 与 Server 端信任关系的建立
验证器,Authenticator不能重复使用,与票据(时效内能重复使用)结合用来证明 Client 声明的身份,防止票据被冒用

由简到繁地去梳理以上术语的关系:

  1. 首先 Client 想要访问 Server 的某个服务,就需要通过 KDC 的认证,获取到服务票据(ST),服务会验证服务票据(ST)来判断 Client 是否通过了 KDC 认证;
  2. 为了避免 Client 每次访问 Server 的服务都要向 KDC 认证 (输入密码),KDC 设计时分成了两个部分,一个是 AS,另一个是 TGS,AS 接收 Client 的认证信息,认证通过后给 Client 发放一个可重复使用的票据 TGT,后续 Client 使用这个 TGT 向 TGS 请求 ST 即可。

下面深入讨论下在 Windows 域环境中 Kerberos 协议的认证流程,理解下 Kerberos 协议如何使用短期密码替代长期密码进行身份认证。

第1步-AS认证获取TGT

客户端请求

Client 向 KDC 的 AS 发起认证请求,身份认证信息包含两部分:

  1. 第一部分:用户密码 hash (user_hash) 加密的 timestamp 预认证信息 pre-authentication data;
  2. 第二部分:用户名 (user)、客户端信息 (client info)、服务名 (krbtgt) 等未加密信息。

服务端响应

服务端将生成并返回两部分信息:

  1. 第一部分:生成 session key,域控中存储了域中所有用户密码 hash(user_hash),KDC 的 AS 依据用户名查找相应的 user_hash,成功解密预认证信息,验证客户端通过,然后会生成一个 sessionkey-TGS (由AS 会用 user_hash 加密 session key 形成,后续用于加密 Client 与 TGS 通信);
  2. 第二部分:生成票据授权票据 TGT,TGT 由 krbtgt hash 加密的 sessionkey-TGS、user、client info、lifetime、timestamp 等信息组成。

此处需要注意两点:

  1. krbtgt 账户是创建域时系统自动创建的,可以认为是为了 kerberos 认证服务而创建的账号;
  2. 票据授权票据 TGT 是 KDC 加密的,Client 无法解密,并且具有有效期,客户端用其向 TGS 请求 ST。

AS 用 user_hash 加密 sessionkey-TGS,与 TGT 一起生成 REP 响应发送给客户端。客户端解密响应成功说明数据包是 KDC 发送来的,并且获得 sessionkey-TGS 以及 TGT,sessionkey-TGS 用于后续加密通信。
在这里插入图片描述

第2步-TGS认证获取ST

通过第一步,客户端解密 AS 的响应后,可以得到一个 sessionkey-TGS 以及 TGT。

客户端请求

接下来用户想访问 Aservice 服务,于是向 TGS 请求访问 Aservice 的 ST。首先客户端会生成验证器 Authenticator,内容包含 user、client info、lifetime、timestamp 信息,并且用 sessionkey-TGS 加密。客户端将验证器、Aservice 信息、TGT 发送给 TGS 请求获取 ST。

服务端响应

TGS 收到客户端请求,会先利用 krbtgt hash 解密 TGT,获取到 sessionkey-TGS,user、client info 等信息,然后利用 sessionkey-TGS 解密验证器,校验验证器和 TGT 中的 user 信息,如果一致,则说明该请求符合 TGT 中声明的用户,该用户是通过 AS 认证的。接着 TGS 会生成 session key 以及 ST:

  1. TGS 会为用户 user 和服务 Aservice 之间生成新的会话密钥 sessionkey-Aservice,并用 sessionkey-TGS 加密 sessionkey-Aservice;
  2. TGS 会生成一个 ST,内容包含 user、client info、lifetime、timestamp、sessionkey-Aservice,ST 用 Aservice 的 service_hash 加密。

最后 TGS 将 sessionkey-TGS 加密后的 sessionkey-Aservice 以及 service_hash 加密的 ST 响应给客户端。
在这里插入图片描述

【注意】验证器 Authenticator 只能使用一次,是为了防止 TGT 被冒用。kerberos 设计之初,产生票据的概念就是为了避免重复的常规密码验证,因为票据在有效期内可以重复使用。为了避免冒用,设计出 session key 以及 Authenticator。session key 只有真正的客户端、服务知道,利用 session key 加密验证器,服务就可以解密对比验证器以及票据中声明的用户、客户端信息是否一致,一致说明票据来自可信客户端。

第3步-服务端服务认证

通过第二步,Client 获取到 sessionkey-Aservice 以及 ST,接下来 Client 利用 sessionkey-Aservice 加密 Authenticator,连同 ST 去请求 Server 的 Aservice。Aservice 利用自己的 service_hash 解密 ST,获得 sessionkey-Aservice,再解密 Authenticator 验证 Client 声明的 user 信息,通过认证后 Aservice 还需要用 sessionkey-Aservice 加密一段信息返回给 Client,Client 利用 sessionkey-Aservice 解密成功说明 Aservice 用自己 service_hash 成功解密出了 sessionkey-Aservice,是可信服务端。

在这里插入图片描述
至此,kerberos 认证流程完成,Client 可访问 Aservice 提供的服务。

NTLM 认证

NTLM 认证采用质询 / 应答 (Challenge/Response) 的消息交换模式。NTLM 既可用于域环境下的身份认证,也可以用于没有域的工作组环境。主要有本地认证和网络认证两种方式。

本地认证模式

用户登陆 Windows 时,Windows 首先会调用 winlogon.exe 进程接收用户输入的密码,之后密码会被传递给 lsass.exe 进程,进程会先在内存中存储一份明文密码,并将密码加密为 NTLM hash,与本地 SAM 数据库中用户的 NTLM hash 对比,一致则登陆成功。
在这里插入图片描述

网络认证模式

如下为 NTLM 域环境中网络认证流程。

第一步:首先用户输入正确用户密码登陆到客户端主机,用户想要访问某个服务器的服务,客户端先发送一个包含用户名明文的数据包给服务器,发起认证请求。
在这里插入图片描述
第二步:服务器生成一个随机数,称为 Challenge,返回给客户端。
在这里插入图片描述
第三步:客户端接收到 Challenge 后,用密码 hash 加密,生成 Response,发送给服务。
在这里插入图片描述
第四步:服务将 Response、用户名、Challenge 发送给域控验证。域控使用本地数据库 (NTDS.dit) 中保存的对应用户的 NTLM hash 对 Challenge 进行加密,得到的结果与 Response 进行对比,一致则认证成功。然后将认证结果返回给服务端。
在这里插入图片描述

相关安全问题

Kerberos 认证并不是天衣无缝的,这其中也会有各种漏洞能够被我们利用,比如我们常说的 MS14-068、黄金票据、白银票据等就是基于 Kerberos 协议进行攻击的。下面我们便来大致介绍一下 Kerberos 认证中的相关安全问题。

读域用户Hash

Windows 系统下的用户密码 hash 通常指的是 Security Account Manager 中保存的用户密码 Hash,也就是 SAM 文件中的 Hash,mimikatz 读取出已登录用户的 NTLM hash 都是同一个 hash,域控中 NTDS.dit 的 hash。如下密码均为 Aa123456,都是 NTLM hash 值(以下操作均需以管理员权限执行)。

1、SAM 中的 hash

先导出 sam,mimikatz 读取 (本地用户 ate/Aa123456):
在这里插入图片描述
mimikatz 读取:
在这里插入图片描述
2、mimikatz 从内存 dump 出的 hash

如下,cmd 运行 mimikatz.exe,在 mimikatz 会话中执行 privilege::debugsekurlsa::logonpasswords
在这里插入图片描述
testdomain\\test1 密码 Aa123456 的 hash 如下:
在这里插入图片描述
3、域控中 NTDS.dit 的 hash

如下,testdomain\\test1 密码 Aa123456 的 hash。域中先利用 ntdsutil 导出 NTDS.dit,SYSTEM 和 SECURITY 文件。
在这里插入图片描述
导出文件的位置:
在这里插入图片描述
利用 NTDSDumpEx 查看,如下:
在这里插入图片描述

哈希传递攻击

在 kerberos、NTLM 认证过程的关键,首先就是基于用户密码 Hash 的加密,所以在域渗透中,无法破解用户密码 Hash 的情况下,也可以直接利用 Hash 来完成认证,达到攻击的目的,这就是 hash 传递攻击(Pass The Hash,简称 PTH)。如果内网主机的本地管理员账户密码相同,那么可以通过 PTH 远程登录到任意一台主机,操作简单、威力无穷。

在域环境中,利用哈希传递攻击的渗透方式往往是这样的:

  1. 获得一台域主机的权限,Dump 内存获得该主机的用户密码 Hash 值;
  2. 通过哈希传递攻击尝试登录其他主机;
  3. 继续搜集 Hash并尝试远程登录,直到获得域管理员账户 Hash,登录域控,最终成功控制整个域。

如下一个场景案例:域控主机的地址为 192.168.39.100 ,而192.168.39.133 为登陆过域管理账号的终端,获取到了域管理的 Hash,在 192.168.39.133 可模拟 PTH 来接管域控。
在这里插入图片描述
攻击成功后获取到一个 shell,虽然是本机的,但可以操控域控,如下:
在这里插入图片描述

黄金票据

在 Windows 的 kerberos 认证过程中,Client 将自己的信息发送给 KDC,然后 KDC 使用 Krbtgt 用户的 NTLM-Hash 作为密钥进行加密,生成 TGT。那么如果获取到了 Krbtgt 的 NTLM-Hash 值,不就可以伪造任意的 TGT 了吗?因此使用 krbtgt 用户 Hash 生成的票据被称为黄金票据(Golden Ticket),此类攻击方法被称为票据传递攻击。

因为 Krbtgt 只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限。先假设这么一种情况,原先已拿到的域内所有的账户 Hash,包括 Krbtgt 这个账户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置 Krbtgt 密码,基于此条件,我们还能利用该票据重新获得域管理员权限。利用 Krbtgt 的 Hash 值可以伪造生成任意的 TGT,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于 Kerberos 认证的任何服务。

1、首先,我们来生成Golden Ticket,这里需要修改相应的域管理员账号、域名称、sid值,如下图:
在这里插入图片描述
2、接着我们使用如下指令导入票据:
在这里插入图片描述
3、导入成功后,我们在域成员主机上执行 klist,即可查看缓存的票据,如下图:
在这里插入图片描述
4、最后,我们就可以使用票据传递攻击,登陆域控了,如下图:
在这里插入图片描述

白银票据

白银票据 (Silver Tickets) 是指伪造的服务票据 (ST),只能用来访问特定的服务,通过 Kerberos 的认证原理得知 ST 是由 TGS 颁发的,使用了服务的密码 hash 加密,所以在伪造银票的时候需要知道服务的密码 Hash。因为在票据生成过程中不需要使用 KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由 KDC 颁发 TGT,并且在生成伪造的 TGT 得 20 分钟内,TGS 不会对该 TGT 的真伪进行效验。白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用 Krbtgt 账号的密码哈希值,因此更加隐蔽。

下面通过创建 LDAP 银票访问域控 LDAP 服务来演示银票的伪造和利用。域控的 LDAP 服务是由网络服务账户运行的,其对应 sid 是 S-1-5-20,域控上通过 mimikatz 获取 hash,执行 mimikatz.exe log privilege::debug sekurlsa::logonpasswords exit,如下所示:
在这里插入图片描述
普通用户伪造银票并导入内存获取权限,可取到域控 krbtgt hash,通过 /target 指定服务主机名,/rc4 指定服务密码的 hash,/service 指定服务,如下:
在这里插入图片描述

总结

概括下一个域渗透的思路:

一个具有一定规模的企业,每天都可能面临员工入职和离职,因此网络管理部门经常需要对域成员主机进行格式化消除磁盘的文件,然后重装系统及软件,以提供给新员工使用;因此,为了便于后期交接,大多网络管理员会做好一个系统镜像盘,统一安装所有的电脑,并且在安装的时候设置惯用、甚至统一的密码。

因此,域中的计算机本地管理员账号,极有可能能够登陆域中较多的计算机,本地管理员的密码在服务器上后期修改的概率,远低于在个人办公电脑上的概率,而域用户权限是较低的,是无法在域成员主机上安装软件的,这将会发生下面的一幕:

某个域用户需要使用 viso 软件进行绘图操作,于是联系网络管理员进行安装,网络管理员采用域管理员身份登录了域成员主机,并帮助其安装了 viso 软件,于是这个有计算机基础的员工,切换身份登录到了本地计算机的管理员,后执行 mimikatz,从内存当中抓取了域管理员的密码,便成功的控制了整个域。

因此,域渗透的思路就是:通过域成员主机,定位出域控制器 IP 及域管理员账号,利用域成员主机作为跳板,扩大渗透范围,利用域管理员可以登陆域中任何成员主机的特性,定位出域管理员登陆过的主机 IP,设法从域成员主机内存中 dump 出域管理员密码,进而拿下域控制器、渗透整个内网。

本文参考文章:

  1. Kerberos身份验证流程
  2. Windows 域环境下认证和攻击初识
  3. 域渗透基础(一)域渗透基础(二)
  4. 干货!内网渗透测试之域渗透详解!收藏!

以上是关于浅析Windows域环境身份认证与攻击思路的主要内容,如果未能解决你的问题,请参考以下文章

技术分享贴浅析CSRF攻击与防御

浅析 JS 中的作用域链

浅析CSRF攻击和防御

《CISP》计算环境安全

TFTP反射放大攻击浅析

密码控件安全技术浅析及攻击实例