Fetch the Flag CTF 2022 解説:File Explorer
2022年11月9日
0 分で読めますFetchに参加してくれてありがとう! 参加してくれた何千人ものプレイヤーの皆さん、Fetch the Flag CTFへのご参加おめでとうございます。また、チャレンジを作成し、テストし、解説を書いてくれたSnykerの皆さんにも心から感謝します!
Snykの2022年Fetch the Flagに参加し、File Explorerチャレンジの答えを探している方は、ここがぴったりです。一緒に解決策を見ていきましょう!
まずは偵察フェーズから始めましょう
このチャレンジのフェーズでは、攻撃者が脆弱なターゲットを特定し、悪用方法を探ります。今回提示されるのは、WebサイトへのリンクとGitHub上の公開リポジトリへのリンクです。始めるために必要な侵入口は1つだけです。

何があるでしょうか?
まずリンクを確認し、http://file-explorer.c.ctf-snyk.io/にアクセスします。いくつかの行と、リンクをクリックしてファイルを確認するよう促すメッセージが表示されます。

リンクをクリックして/public/フォルダに移動すると、いくつかのアプリケーションファイルにアクセスできることがわかります。

チャレンジの名前と説明、そして/public/というリンクから、ディレクトリトラバーサルを実行する必要があると推測できます。
ディレクトリトラバーサルとは?
ディレクトリトラバーサル攻撃(パストラバーサルとも呼ばれます)は、意図されたフォルダの外に保存されたファイルやディレクトリへのアクセスを狙う攻撃です。ドット・ドット・スラッシュ(../)の連続やそのバリエーションを使ってファイルパスを操作したり、絶対パスを指定したりすることで、アプリケーションのソースコード、設定ファイル、その他の重要なシステムファイルなど、ファイルシステム上の任意のファイルやディレクトリにアクセスされる可能性があります。
ディレクトリトラバーサルの脆弱性は、攻撃者がフォルダ構造に関する情報を得たり、システム上の機密ファイルの内容を読み取ったりできる情報漏えいにつながる可能性があります。
Postmanでフラグを見つける
CTFでは手持ちのツールをすべて活用することが大切です。そこでPostmanを使ってパストラバーサル攻撃を実行しましょう。まず、簡単なGETリクエスト(http://file-explorer.c.ctf-snyk.io)でWebサイトにアクセスします。ブラウザで表示した場合と同じ結果になります。

このGETリクエスト(http://file-explorer.c.ctf-snyk.io/public/)でURLの末尾に/publicを追加した場合も、同じ結果が得られます。

ドット・ドット・スラッシュ(../)を指定すると、Webサイトのホームページにリダイレクトされます。URLエンコードを使った別の表記を試してみましょう。

URLエンコードとは?
URLエンコードは、安全でないASCII文字を「%」とそれに続く2桁の16進数に置き換えます。今回は%2eを.の代わりに、%2fを/の代わりに使用します。
このGETリクエスト(http://file-explorer.c.ctf-snyk.io/public/%2e)で何が表示されるか確認しましょう。

フラグファイルが見つかりました。このGETリクエスト(http://file-explorer.c.ctf-snyk.io/public/%2e%2e%2f/flag)でファイルにアクセスしてみましょう。

フラグを見つけました!
Curlでフラグを見つける

今度はcurlだけを使って、もう一度試してみましょう。同じ考え方で、次のコマンドを使ってWebサイトのフォルダにcurlでアクセスします。
curl http://file-explorer.c.ctf-snyk.io/public/
次に、パストラバーサルの脆弱性を利用して、次のコマンドでpublicフォルダの1つ上のフォルダにcurlでアクセスします。
curl http://file-explorer.c.ctf-snyk.io/public/%2e%2e%2f/
最後に、次のコマンドでフラグにcurlでアクセスします。
curl http://file-explorer.c.ctf-snyk.io/public/%2e%2e%2f/flag
ブラウザでフラグを見つける
ブラウザから直接同じ操作を行うこともできます。次のURLをブラウザに入力すると、フラグにアクセスできるページが表示されます。
http://file-explorer.c.ctf-snyk.io/public/%2e%2e%2f/

Snyk IDE拡張機能でフラグを見つける
まず公開リポジトリをクローンしてVisual Studio Codeで開きます。マーケットプレイスで「Snyk」と検索し、Snyk Security IDE extensionをインストールします。インストール後にIDEを再起動し、npm installを実行します。

左側のサイドバーにあるPatch(マスコット)のアイコンを初めてクリックしたときは、認証するまでプロジェクト内のオープンソースのセキュリティ脆弱性は表示されません。無料のSnykアカウントで認証できます。認証が済んだら、初回のスキャンを実行しましょう!
package.jsonファイルを確認すると、stパッケージにいくつかの脆弱性があることがわかります。

stはWebページで静的ファイルを配信するモジュールで、この種の脆弱性が含まれています。この例では、app.jsファイルでpublicルートからファイルを配信していることがわかります。

package.jsonファイルに戻り、stパッケージにカーソルを合わせて黄色い電球をクリックすると、最も深刻な脆弱性が表示されます。

ディレクトリトラバーサルの脆弱性のページに移動します。このページでは、脆弱性について詳しく知ることができます。脆弱性が含まれるバージョン、修正方法、概念実証などを確認できます。

この脆弱性について詳しく見るをクリックして、さらに詳しい情報を確認することもできます。

File Explorerのまとめ
自分たちで書くコードの行数と、コードベースに取り込むコンポーネントやパッケージの数を比べてみましょう。車輪の再発明をして、エコシステムにすでに存在するかもしれないものを書き直す時間を無駄にする必要はありません。
今回のチャレンジもまさにそうでした。静的ファイルの配信にstパッケージを使ったシンプルなWebサイトですが、古いバージョンのパッケージを使用したことで、プロジェクトに脆弱性を持ち込んでしまいました。これにより、攻撃者が機密ファイルや認証情報、パスワードを見つけられる可能性があります。攻撃対象領域を減らすため、プロジェクトで使用しているコンポーネントは常に最新の状態に保ちましょう!
File Explorerや、CTFのほかのチャレンジも楽しんでいただけたならうれしいです :)
ほかのフラグをどうやって見つけたか知りたいですか?Fetch the Flagの解答ページで、解き方をご覧ください。
