Windows域安全-Kerberos认证与攻击
Windows域安全-Kerberos认证与攻击
Kerberos认证
一、关键名词
域控制器(Domain Controller,DC):在域中至少有一台服务器负责每一台联入网络的电脑和用户的验证工作,相当于一个单位的门卫一样。
密钥分发中心(Key Distribution Center,KDC):KDC维护着域中所有安全主体(SecurityPrincipal)账户信息数据库,负责管理票据、认证票据、分发票据。
帐户数据库(Account Database,AD):一个类似于 Windows本机SAM的数据库,存储了域内所有网络对象的凭证,也存储所有Client的白名单,在白名单中的 Client才可以申请到TGT。
身份验证服务(Authentication Service,AS):用于生成TGT的服务。
票据发放服务(Ticket Granting Service,TGS):用于生成某个服务的ticket
认证票据(Ticket Granting Ticket,TGT):可以理解为入场券,通过入场券能够获得票据,是一种临时凭证的存在。
票据(Ticket):网络对象互相访问的凭证。
Master Key :长期密钥(被 Hash加密的用户密钥),这里指 NTLM Hash,简单理解就是Windows加密过的密码口令。
Session Key :短期会话密钥。
krbtgt 账户:每个域控制器都有一个 krbtgt的用户账户,是 KDC的服务账户,用来创建票据授予服务(TGS)加密的密钥。
二、Kerberos认证中的三个角色
Client
Server
KDC (DC) :在Windows域环境中,KDC的角色由DC承担。
三、认证过程
认证的大致过程:
Client向KDC的AS服务发送请求,希望获取访问Server的权限。KDC收到请求后,通过在帐户数据库AD中存储黑名单和白名单来区分Client是否可信。确认成功后,AS返回TGT给Client。
Client得到了TGT后,继续向KDC的TGS服务发送请求,希望获取访问 Server的权限。KDC通过客户端请求信息中的TGT判断客户端是否拥有权限,确认成功返回访问Server的权限ticket。
Client得到ticket后,Client与Server二者进行相互验证,成功后,Client就可以访问Server的资源。
详细认证过程如下:
(1)Client 发送 AS Request 给 AS 。
AS Request 大致内容:
Pre-authentication data :一个使用 Client 的 Master key加密过的 Timestamp(时间戳),用于证明自己是所发送用户名对应的那个用户。
Client name & realm:Domain name\Client name ,Client标识,用于 KDC 从 AD 中查找Client 的 Master key 。
Server Name :KDC TGS 的 Server Name 。
(2)AS 接收到 Client 的请求信息,需要验证发送方是否为本人,而AS 只需从 AD 中获取 Client 对应的 Master Key 对 Pre-authentication data 进行解密验证其是否为合法的 Timestamp,若验证合格,则说明发送方在 AD 中且其密钥正确。但是当 Timestamp 比当前的时间偏差过多或者 Timestamp 早于上次认证时间点,AS 会直接拒绝。
验证通过后,AS 将 AS Response 发送给 Client。主要包括请求 Client 的 Master Key加密过的Session Key 和被 KDC用户(krbtgt 帐户)使用其自己的 NTLM Hash 加密的 TGT 。TGT 的大致内容如下:
Session Key :KDC 生成的一个随机字符串,用于后续 Client与TGS 服务之间的通信。
Client name & realm :Domain name\Client 。
Server name & realm: 简单地说就是 Domain name\Server , Client 访问的 Server 。
End Time :TGT 到期时间。
(3)Client 使用自己的Master Key 可以将 AS返回的加密过后的 Session Key 解密,得到SessionKey。而后发送TGS Request 给 TGS ,请求Ticket。
TGS Request 大致内容如下:
Authenticator :使用 Session Key加密的Clien info(Client标识等信息)和 Timestamp(时间戳)。
TGT
Client info :Domain name/ Client 。
Server info :Client 要访问的 Server 的信息。
Timestamp :时间戳 。
(4)TGS 收到TGS Request ,通过自己的 Master Key(NTLM Hash) 对 TGS Request 中的 TGT 进行解密,得到Session Key ,而后使用Session Key 解密 Authenticator 进行相关验证,验证成功后 TGS向 Client 发送 TGS Response 。TGS Response 主要包括两个部分,使用Session Key(KDC-Client)加密过的用于 Client 和 Server 通信的Session Key (Server-Client )与使用 Server 的 Master Key 进行加密的Ticket 。
Ticket大致内容如下:
Session Key :用于 Client 和 Server 通信的Session Key 。
Client name & realm : Domain name\Client 。
End time : Ticket的到期时间。
(5)Client 通过Session Key(KDC-Client)进行解密将 TGS Response 中用于与Server通信的SessionKey (Server-Client )获取到。而后 Client 向 Server请求服务,发送Request其中包含Ticket,ServerSession Key加密的Client info与Timestamp,还包含一个 Flag 用于表示 Client 是否需要进行双向验证。
(6)Server通过使用自己的 Master Key 解密用户请求中的 Ticket 得到 Session Key(Server-Client),使用 Session Key(Server-Client )解密Client加密后的信息(Client info与Timestamp)进行验证,验证成功后,让 Client 访问需要访问的资源。若Client 需要进行双向验证,验证成功后,返回给 Client 使用 Session Key(Server-Client )得到新时间戳并验证其是否正确。验证通过的话则Client可以信任该Server,可以发送服务请求。
校验通过后,该票据会一直存在Client的内存中。
白银票据
一、原理概述
在请求票据发放过程中,Client 与 TGS 通信获取 Ticket,拥有 Ticket 就可以访问对应 服务器资源。而当攻击者拥有Server NTLM Hash时,就可以伪造一个 Ticket,直接与 Server 通信,让其验证。
二、伪造白银票据
2.1 实验环境
域 :woniu.com
域控制器(DC) :Windows Server 2008 R2 (IP:192.168.219.167)
域中服务器:Windows Server 2008 R2 (IP:192.168.219.170)
域内计算机 :Windows 7 (IP:192.168.219.168)
普通域用户 :zhangsan
Windows 密码获取工具 :mimikatz.exe
2.2 利用过程
1、域信息获取。
首先我们需要获取服务器的 NTLM Hash(此处直接使用域管理员账号登录域中的服务器后使用mimikatz 导出):
privilege::debug //提升权限
sekurlsa::logonpasswords //抓取密码
查看服务器主机名:
查看域SID:
2、清空缓存票据。
3、伪造白银票据并导入,然后完成测试。 伪造票据前访问服务器C盘:
伪造票据并直接导入内存:(此处使用cifs服务来验证)
1.kerberos::golden /domain:域 /sid:域SID /target:目标服务器主机名(全名,要带域名) 2./service:服务类型 /rc4:Server的NTLM_Hash /user:用户名 /ptt
访问服务器C盘:
三、防御方法 (1)开启PAC的特权属性证书保护功能,开启PAC后,Server会将Client发送过来的票据Ticket发给 KDC,由KDC来进行验证Ticket是否有效。 黄金票据 一、原理概述 在与认证过程中,经过 Client 与 AS 的通信会得到 TGT,有了 TGT 就可以向 TGS 请求访问对应 Server 资源的票据。当攻击者获取 krbtgt 的NTLM Hash值就伪造自己的 TGT ,而这个 TGT 就是常说 的黄金票据。而我们拥有了黄金票据,就可以直接向 TGS 服务请求 Ticket ,而不用经过 AS 认证。
二、伪造黄金票据 2.1 实验环境 域 :woniu.com 域控制器(DC) :Windows 2008 R2 (IP:192.168.219.167) 域内计算机 :Windows 7 (IP:192.168.219.168) 普通域用户 :zhangsan Windows 密码获取工具 :mimikatz.exe 2.2 利用过程 1、首先我们需要获取域控的krbtgt的 NTLM Hash,此处直接登录域管理员账号后使用 mimikatz 导 出。 打开mimikatz,输入命令查看krbtgt 的 Hash:
lsadump::dcsync /domain:域 /user:krbtgt
2、登录普通用户账号,删除缓存票据,查看域SID。
域SID为用户SID的前面部分:
3、制作黄金票据。
1 kerberos::golden /user:普通域用户 /domain:域 /sid:域的SID /krbtgt:krbtgt的NTLM_Hash 2 /ticket:woniu.kirbi
成功导出票据文件:
4、导入票据并测试。 没导入票据前查看域服务器C盘文件:
使用命令导入票据获取权限:
kerberos::ptt woniu.kirbi
而后使用普通账户查看域服务器C盘文件 :
创建域管账号hacker:
在域控主机上查看用户,已成功创建hacker
三、防御方法 (1) 限制域管理员登录到除域控制器和少数管理服务器以外的任何其他计算机,将所有其他权限委派 给自定义管理员组。降低攻击者访问域控制器的Active Directory的ntds.dit文件的可能。 (2) 定期更改krbtgt账户的密码。 MS14-068 一、漏洞简介 2014年11月18 日,微软发布 MS14-068 补丁,修复了一个影响全部版本 Windows 服务器的严重 漏洞。用于解决 Microsoft Windows Kerberos KDC 漏洞,该漏洞允许黑客提升任意普通用户权限成为 域管理员身份。攻击者可以利用这些提升的权限控制域中所有的计算机,包括域服务器。受影响版本:Windows Server 2003、Windows Vista、Windows Server 2008、Windows 7、 Windows 8 and Windows 8.1、Windows Server 2012(以上系列的部分版本) 微软官方公告: https://docs.microsoft.com/en-us/security-updates/securitybulletins/2014/ms14-0 68 漏洞利用前提: 域控制器系统为受影响的版本,且没有打MS14-068的补丁(KB3011780)。 能操作一台域内的普通计算机,并获得普通域用户以及密码/hash值,以及用户的suid 二、PAC 微软在Windows平台上对Kerberos协议进行了一些扩充,其中最重要的扩充就是增加了认证过程中 的权限认证,也就是在协议中增加了PAC(Privilege Attribute Certificate),特权属性证书。 在一个域中,通过 User 的 SID 和所在组 Group 的 SID 来确定该用户所拥有的权限。所以 PAC 包 含 Client 的 User 的 SID、Group 的 SID。PAC 为了保证自身的合法性,还包含 2 个签名。 (1)Client 向 AS 请求认证,验证完Client的身份后,AS 在返回 TGT 时,生成 PAC,以及用于确保 PAC 不被篡改的两个签名,一个签名的密钥为 KDC用户(krbtgt) 的 NTLM Hash,另一个签名的密钥 为 Server 的 NTLM Hash,而签名的内容主要为 User SID、Group SID 。
(2)Client向 TGS 发送请求,来获取访问 Server的Ticket 。TGS 对TGS Request 中的 TGT 解密,并 通过两个签名来验证 PAC 的合法性。若验证通过,TGS 会重新生成两个新的签名保证 PAC 不被篡改。第一个签名的密钥为 Server 的 NTLM Hash,第二个密钥为 Server 与 Client 的临时会话密钥 Session Key(Server-Client)。新的 PAC 会被放置在签发的访问票据 Ticket 中,使用 Server 的 NTLM Hash进 行加密。
(3)Client 使用 Ticket 向 Server 请求相应的资源, Sever收到请求,将 Ticket 解密并验证,校验 PAC 中的两个签名,验证 PAC 的合法性,之后根据 PAC 得知Client的权限,让其访问对应资源。 三、漏洞产生原理 Client 在向 AS 发送请求时,可以设置一个名为 include-pac 的字段为 False,而后 AS 生成的 TGT 并不会含有PAC,该字段默认为 True。在 Client 收到不含 PAC 的 TGT 后,可以添加一个 PAC 放于TGS Request 的数据包中,而 TGS 收到这个请求的数据包时,仍能正确解析出放在 TGS Request 中其他位 置的 PAC 信息,因为 KDC 允许用户使用这样的构造。 在 KDC 对 PAC 进行验证时,对于PAC中的签名算法,虽然原则上规定使用密钥加密的签名算法, 但微软在实际场景中却允许 Client 指定任意签名算法。所以Client 构造一个PAC,其中添加高权限的 User SID 与 Group SID信息,并指定使用MD5进行签名,只要TGS Requset 数据不丢失,那么该伪造 的 PAC 就能被验证通过。 PAC 验证通过后,KDC 会将 PAC 中的 User SID、Group SID 取出来,重新使用KDC用户 (krbtgt) 的 NTLM Hash 和 Server 的 NTLM Hash 分别生成两个新的签名。之后生成一个新的 TGT ,并把 PAC放入其中,加密后发送给 Client,而不是发送 Ticket 给Client。
四、漏洞复现 4.1 实验环境: 域 :woniu.com 域控制器(DC) :Windows 2008 R2 (IP:192.168.219.167) 域内计算机 :Windows 7 (IP:192.168.219.168) 普通域用户 :zhangsan MS14-068漏洞利用工具 :MS14-068.exe https://github.com/abatchy17/WindowsExploits/tree/m aster/MS14-068 Windows 密码获取工具 :mimikatz.exe 4.2 复现过程: 1、域信息获取 使用 net time /domain 命令查看所在域的时间与域服务器的名字 :
使用 ipconfig /all ,查看DNS服务器地址,单域中DNS与DC一般在同一服务器上
可以使用ping 命令进行校验
域: woniu.com 域服务器名称 : \\WIN-0834M9IH1N6.woniu.com DC 的IP : 192.168.219.167
2、获取用户 SID ,使用命令:whoami /user
用户SID : S-1-5-21-1090512759-1854960440-2825539314-1104
3、使用MS14-068生成伪造的 kerberos 协议票据: 使用命令为:
MS14-068.exe -u 用户名@域 -p 用户密码 -s 用户SID -d DC的IP
会生成一个“ccache”格式的文件(伪造的票据文件),存放于MS14-068.exe的工作目录下。
4、尝试访问域服务器的C盘,此时访问失败,因为我们还需要将票据导入。 5、使用mimikatz工具删除缓存的票据,并将伪造的票据导入内存。 mimikatz :一款 Windows 密码获取工具,可以帮助用户提取出电脑中的登录凭证。可以从内存中 提取明文密码、哈希、PIN 码和 kerberos 票证等,还有哈希传递、票证传递或构建黄金票证等功能。 (1)查看内存中已有的Kerberos票据:kerberos::list
(2)删除缓存票据:kerberos::purge
(3)导入伪造的票据:kerberos::ptc 票据存放路径
6、再次访问域服务器的C盘,此时可以访问,说明普通域用户提权成功。
五、修复方法 下载微软官方的MS14-068漏洞的补丁,补丁为KB3011780。安装后,使用 systeminfo 命令查看系 统信息总共已安装的修补程序,即可查看是否成功安装补丁。
登录
前往注册账号注册
注册成功,默认密码已通过短信发送给您
欢迎来到蜗牛学苑~
我们仍旧想要当初想要的不一样,世间浮沉,到最后还是想要和当初想要的和别人不一样。
3小时前 2人点赞