本稿はValenfindのWriteUpとなる。
概要
攻略の流れ
ポートスキャンやファジングを実施したが、有力な情報は得られなかったので、まずはサイトを巡回してみることにした。

サインアップからユーザー名とパスワードを登録すると、このような詳細情報を求められる画面へ遷移する。そこで、HTMLタグを挿入してみたが、エスケープされているようなので別の線を探すことにした。

Webサイトのメインページのようなところに来た。ここではほかのユーザーが一覧表示されており、Likeボタンを押してそのユーザーのLike数を増やすことができる。

ユーザーを見に行くとコメントが表示されている。複数アカウントを作成して検証した結果、内容は登録時に入力した「Bio / About Me」のことだった。

コメントの表示デザインは3種類設定されており、好きなものを選ぶことができるようである。この切り替え機能をいじったところ、サイトのURLが変化しなかった。そのため、LFI(Local File Inclusion) が成立しないか確かめることにした。


ブラウザの開発者モードから切り替え時の通信を確認すると、GETリクエストで/api/fetch_layout?layout=...へアクセスしていることがわかる。
ここで注目すべきは、パラメータとして .html というファイル名が直接渡されているところだ。通常のデザイン切り替えであれば、id=1 や name=modern といった抽象的な識別子を送るのが一般的だが、このアプリは「サーバー上のファイル」を直接指定して読み込ませる設計になっている。そこで、ディレクトリトラバーサル(../)によってテンプレートフォルダを脱出し、OSの重要ファイルまで覗き込めないか検証することにした。
-
http://<ターゲットマシンのIP>:5000/api/fetch_layout?layout=../../../../../../../../etc/passwdをアドレスバーに入力

通常のLinuxサーバーであれば存在するファイルであり、かつ標準で全ユーザーに読み取り権限があるファイルにアクセスできるため、ほかのファイルも自由にアクセスできる可能性がある。
-
・・・../../../../../../../../proc/self/environ

そこで、Linuxサーバー上で稼働しているサービスを調べるためにenvironへアクセスしたところ、こちらも閲覧できた。MEMORY_PRESSURE_WATCHにvalenfind.serviceとある通り、systemd配下にこのサービスの設定ファイルがある可能性が高いことがわかる。なお、USER=rootからサービスはroot権限で動いていることもわかる。
-
・・・../../../../../../../../etc/systemd/system/valenfind.service

アクセスするとExecStartから/opt/Valenfind/app.pyがソースコードとわかる。
-
../../../../../../../../opt/Valenfind/app.py

APIキーがハードコードされている。DBも動いていることがわかる。

下のほうを見るとDBをエクスポートできるAPIが確認できるので、手元にダウンロードすることにした。
curl -H "X-Valentine-Token: CUPID_MASTER_KEY_2024_XOXO" http://<ターゲットマシンのIP>:5000/api/admin/export_db -o leak.dbを実行してcupid.dbをダウンロードする。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 16384 100 16384 0 0 37467 0 0
┌──(kali㉿kali)-[~/Desktop/THM/working]
└─$ sqlite3 leak.db ".tables"
users
usersというテーブルにはダッシュボード画面に表示されていたほかのユーザーの情報が入っている。フラグはあるユーザーのパスワードとなっていた。
まとめ
今回のルームの脆弱性は
- LFIが可能になっていたことで、ディレクトリトラバーサルによりサーバー上のファイルに直接アクセスできた
- Webアプリが
root権限で実行されていたため、見えてはいけないファイルまで見えていた
ことの2つが大きい。加えて、APIキーをハードコードするのもあり得ない。ルームの説明欄にはWebアプリケーションがバイブコーディングで急造されたことが書かれており、フラグもそれにちなんだものになっている。

