Kerberos协议是由麻省理工学院(MIT)开发的一种网络身份验证协议,用于在非安全网络中实现安全的身份验证。其设计目标是通过密钥系统为客户与服务器应用程序提供强大的认证服务。
Kerberos协议要解决的实际上就是一个身份认证的问题,顾名思义,当一个客户机去访问一个服务器的某服务时,服务器如何判断该客户机是否有权限来访问本服务器上的服务,同时保证在该过程中的数据包即便被拦截或者被篡改也不影响整个通讯的安全性。
Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。Kerberos 协议在在内网域渗透领域中至关重要,白银票据、黄金票据、攻击域控等都离不开 Kerberos 协议。
域(Domain)通常指的是Windows网络中的域,也称为Windows域。在Windows域中,至少有一台服务器负责每一台联入网络的电脑和用户的验证工作,相当于一个单位的门卫一样,称为域控制器(Domain Controller,简写为DC)。它存储了域中的用户帐户、计算机帐户和安全策略等信息。域控制器负责验证用户的身份,并控制用户对域资源的访问权限。
活动目录(Active Directory,AD)是微软开发的一种用于在Windows域环境中存储和管理网络资源(如用户帐户、计算机帐户、组策略等)的目录服务。换句话说,活动目录是Windows域的基础设施,它提供了一种组织、管理和安全访问域资源的机制。域的边界由域控制器(Domain Controller)定义,而域控制器使用“活动目录”来存储和管理域中的对象和策略。
在一台机器上安装上活动目录以后,这个机器就被成为域控。 在一个域中,可能存在多个域控,这些域控不分主域控制器与备份域控制器,每个域控制器充当的是一样的角色,比如你有三个域控制器,你可以在任何一个域控制器上对用户的权限进行修改,你的修改将被复制到其他两个域控制器中,这样,如果一个域控制器发生了故障,只要其他的域控还能正常工作,整个域还是可以正常运行
域控服务器分为 “只读域控制器” 和 “可写域控制器”,只读域控制器(Read-Only Domain Controller简称RODC)。RODC与其他域控制器一样包含AD数据库,但RODC默认不保存域用户账户密码,并且RODC中包含的数据库也是只读的;只能单向从其他可读写域控制器请求信息,无法将更改信息同步到其他可写域控。
一般情况下 ,域控制器集成了DNS服务,可以解析域内的计算机名称(基于TCP/IP),解决了工作组环境不同网段计算机不能使用计算机名互访的问题。
域用户
在域环境下使用的用户,其用户名和密码需要到域控制器上进行验证,验证通过后域用户可以在域内的任何一台机器上进行登录。但是域用户只是一个普通用户,只能登录到域内机器上进行查看,不能做任何的修改。
域管
存在用户就存在管理员,域管理员可以登录到域控制器上,对一切权限进行控制,比如对域内任何一台机
器的权限进行修改,域管理员有权对域内所有机器下发任何任务或者策略,它对域具有绝对的控制权。
组
将不同的用户放入不同的分组里,然后对组进行了权限设置,这样就避免了管理员需要对每个用户单独进
行权限分配的麻烦。
信任域
在现实中一个大公司下面会有一些子公司,这样就造成了母公司一个域,子公司单独又有一个域的情况,那么怎么将母公司的域与子公司的域联系起来呢?我们可以在它们之间建立起一种信任(trust)的关系,如果母公司的域账户想要登录子公司的域中,那么子公司的域就要对母公司的域建立信任关系。当母公司的域账户想要登录到子公司的域中时,子公司的域由于信任母公司的域,所以子公司的域会听从母公司的域的域控制器的返回的access key。由于母公司的域对子司的域没有建立信任关系,所以子公司的域账户是不能登录到母公司的域中的。
使用命令/domain_trusts
查看受信任的域列表,我们通常会利用域的信任关系进行域内横向渗透来扩大战果。
域和Kerberos协议是密切相关的,域是在计算机网络中用于组织和管理计算机资源的逻辑结构,它包括一组计算机、用户和安全策略。而Kerberos是一种网络身份验证协议,用于在计算机网络中验证用户身份并授权其访问资源。
Kerberos协议使用密钥加密技术来验证用户身份,并生成用于后续通信的安全票据。在Windows域环境中,Kerberos协议用于用户与域控制器之间的身份验证。当用户尝试登录到域时,他们的凭据将通过Kerberos协议进行验证。域控制器充当Kerberos身份验证服务,并与客户端和其他域控制器之间进行安全通信。
总而言之,域提供了集中的身份验证和访问控制机制,而Kerberos协议为域环境中的用户提供了安全的身份验证和票据授权机制。它们共同工作,确保用户可以安全地访问域资源。
Kerberos协议的命名灵感来源于希腊神话中的“克比洛斯”(Kerberos),也被称为“地狱三头犬”。克比洛斯是守护地狱门户的三头犬,它的任务是保护地狱的入口,阻止任何未经授权的人进入。而真正的kerberos协议中也存在三个角色,分别是:
客户端、服务器和密钥分发中心(KDC)。
KDC由两个服务组成:一个身份验证服务(Authentication Service,简称AS)和一个票据授权服务(Ticket Granting Server,简称TGS)。
角色 | 功能 |
---|---|
密钥分发中心(KDC) | 默认安装在域控里,包括AS和TGS。 |
身份验证服务(AS) | 用于KDC对Client认证。 |
票据授予服务(TGS) | 用于KDC向Client和Server分发Session Key(临时秘钥)。 |
第⼀步,客户端 -> AS
客户端将 (客户端ID、用户名、目标服务ID、网站地址等身份信息)和用 NTLM-Hash 加密的时间戳发送给AS。
第⼆步, AS -> 客户端
AS检查 客户端ID 是否在 KDC 数据库中。如果在,就会取出它的 NTLM-Hash,并对加密的时间戳进行解密,如果解密成功,则证明客户端提供的密码正确,如果时间戳在五分钟之内,则预认证成功。那么AS会随机生成⼀个key,用于客户端和 TGS之间的通信。这个Key⼀般称为 TGS session Key 。随后AS会发两条信息给客户端:
此时,客户端已经有了 TGT (由于本地没有 TGS密钥,所以基本无法解出其数据) 与 TGS session key(
有的文章直接称之为 session key)
第三步,客户端 -> TGS
第四步, TGS -> 客户端
TGS 将利用自身的密钥,从TGT中解密出 TGS session KEY,然后 利⽤ TGS session Key 从 Authenticator(身份验证器)中解出客户端的信息。TGS 解密出所有数据后,进⾏身份检查并认证:将客户端ID 与 TGT的客户端ID进行比较。(判断⽤户是不是被替换了)⽐较来⾃ Authenticator 的时间戳和TGT的时间戳 (典型的Kerberos系统的容忍度是2分钟,但也可以另⾏配置)检查 TGT 是否过期检查Authenticator是否已经在TGS的缓存中(为了避免重放攻击)当所有检查都通过后, TGS 随机⽣成⼀个 Key (相当与有权限访问了)⽤于后续客户端与 HTTP 服务交互时进⾏通信加密使⽤,即 HTTP Session Key。
同样地,TGS 将发送两条信息给客户端:(存在争论,多个文章结果不⼀致)
这时候,客户端有了HTTP Ticket(由于本地没有HTTP服务的密钥,导致⽆法解密出其数据)与 HTTP SessionKey(TGS session 解密得到)。
第五步,客户端 -> HTTP Service
第六步,HTTP -> 客户端
首先 HTTP服务 利用自身的密钥解出 HTTP Ticket 的信息,得到 HTTP Session Key后,利⽤HTTP session KEY
解密出用户的 Authenticator 信息。解密完成后,HTTP服务做以下信息的检查:对比 Authenticator 的时间戳和HTTP Ticket 的时间戳 (典型的 Kerberos 系统对差异的容忍度是 2 分钟,但也可以另⾏配置)检查Ticket是否过期,检查 Authenticator 是否已经在HTTP服务器的缓存中(为了避免重播攻击)⾄此,所有的认证过程通过,客户端即可与远程HTTP服务完成了身份认证,可以进⾏后续的信息通信。
Kerberos认证解决的是:“如何证明我就是我的问题”。形象地比喻如下:
A现在想要去访问B完成一个任务。但是AB两人之间是从来没有见过面的,他们只知道对方的名字叫A,B。
此时如果A直接去找B告诉B我就是A,那么B是有理由不相信A的,因为即使A是一个冒充的他也分辨不清,B同理也得不到A的认可,他们陷入了一个无法证明我就是我的困境。
于是他们就想到了一个办法,AB找到了一个他俩共同信任的人C,且这个C既认识A又认识B,所以只要C告诉B,这个A确实就是真正的A那么B就会信任这个A,同理B经过C的认可后,A也会相信B的身份。
此后,A在访问B之前会先去找C,C会交给A一个凭证,代表此时的A已经得到了C的认证,这时A拿着凭证再去找C,便可以得到C的确认了。
在上面的例子中,A,B分别是客户端和服务端,C担任的角色便是KDC。
客户端在访问每个想要访问的网络服务时,他需要携带一个专门用于访问该服务并且能够证明自己身份的票据,当服务端收到了该票据他才能认定客户端身份正确,向客户端提供服务。所以整个认证流程可简化为两大步:
客户端向KDC请求获取想要访问的目标服务的服务授予票据(Ticket);
客户端拿着从KDC获取的服务授予票据(Ticket)访问相应的网络服务;
简化认证流程图:
即伪造TGT。在 kerberos 认证过程中,Client 将自己的信息发送给 KDC,然后 KDC 使用 Krbtgt 用户(预设账户)的 NTLM-Hash 作为密钥进行加密,生成 TGT。那么如果获取到了 Krbtgt 的 NTLM-Hash 值,不就可以伪造任意的 TGT 了吗。因为 Krbtgt 只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门。
假设有这么一种情况:原先已拿到的域内所有的账户 Hash,包括 Krbtgt 这个账户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置 Krbtgt 密码,基于此条件,我们还能利用该票据重新获得域管理员权限。利用 Krbtgt 的 Hash 值可以伪造生成任意的 TGT,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于 Kerberos 认证的任何服务。
在使用黄金票据(Golden Ticket)攻击时,需要以下信息:
对于攻击者来说,实际上只要拿到了域控权限,就可以直接导出krbtgt的Hash值,再通过mimikatz即可生成任意用户任何权限的Ticket,也就是Golden Ticket。
1.获取域名称
net view /domain
2.Mimikatz 获取 krbtgt 的HTLM-Hash及域SID
mimikatz "lsadump::dcsync /domain:test666.com /user:krbtgt"
3.Mimikatz生成黄金票据
mimikatz "kerberos::golden /domain:test666.com /sid:S-1-5-21-1497092113-2272191533-193330055 /krbtgt:cac9c793eb3ba2c6abbcc9c14f18a41f /user:test666 /ticket:golden.kirbi"
即伪造的TGS。当获取需要访问的目标服务器NTLM HASH后,就可以利用 Mimikatz 伪造TGS,直接去访问目标服务器。此过程不需要KDC的参与,所以可以绕过域控制器,很少留下日志。但缺点是只能访问一个服务。
白银票据依赖于 Server 账号的密码散列值,这不同于黄金票据利用需要使用 Krbtgt 账号的密码哈希值,因此更加隐蔽。
在实际渗透中,攻击者通常都会使用一种被称为 “密码喷洒”(Password Spraying)的技术来进行测试和攻击。这个叫法很形象,因为它属于自动化密码猜测的一种。这种针对所有用户的自动密码猜测通常是为了避免帐户被锁定,因为针对同一个用户的连续密码猜测会导致帐户被锁定。所以只有对所有用户同时执行特定的密码登录尝试,才能增加破解的概率,消除帐户被锁定的概率。普通的爆破就是用户名固定,爆破密码,但是密码喷洒,是用固定的密码去跑用户名。