Skip to main content

Fetch the Flag CTF 2022 解説:File Explorer

feature ctf file explorer

2022年11月9日

0 分で読めます

Fetchに参加してくれてありがとう! 参加してくれた何千人ものプレイヤーの皆さん、Fetch the Flag CTFへのご参加おめでとうございます。また、チャレンジを作成し、テストし、解説を書いてくれたSnykerの皆さんにも心から感謝します!

Snykの2022年Fetch the Flagに参加し、File Explorerチャレンジの答えを探している方は、ここがぴったりです。一緒に解決策を見ていきましょう!

まずは偵察フェーズから始めましょう

このチャレンジのフェーズでは、攻撃者が脆弱なターゲットを特定し、悪用方法を探ります。今回提示されるのは、WebサイトへのリンクとGitHub上の公開リポジトリへのリンクです。始めるために必要な侵入口は1つだけです。

node.jsとSnyk Open Sourceと表示されたFile Explorer 304チャレンジの画面。Webアプリケーション内の隠しファイルについて説明しています

何があるでしょうか?

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

「さあ、m3をハックしろ」「フラグを見つけろ」「こちらのファイルを見てみよう」と表示されたブラウザページ。

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

CSS、画像、JavaScriptのフォルダと、about.html、favicon.ico、robots.txtなどのファイルが表示されたディレクトリ一覧のブラウザー画面。

チャレンジの名前と説明、そして/public/というリンクから、ディレクトリトラバーサルを実行する必要があると推測できます。

ディレクトリトラバーサルとは?

ディレクトリトラバーサル攻撃(パストラバーサルとも呼ばれます)は、意図されたフォルダの外に保存されたファイルやディレクトリへのアクセスを狙う攻撃です。ドット・ドット・スラッシュ(../)の連続やそのバリエーションを使ってファイルパスを操作したり、絶対パスを指定したりすることで、アプリケーションのソースコード、設定ファイル、その他の重要なシステムファイルなど、ファイルシステム上の任意のファイルやディレクトリにアクセスされる可能性があります。

ディレクトリトラバーサルの脆弱性は、攻撃者がフォルダ構造に関する情報を得たり、システム上の機密ファイルの内容を読み取ったりできる情報漏えいにつながる可能性があります。

Postmanでフラグを見つける

CTFでは手持ちのツールをすべて活用することが大切です。そこでPostmanを使ってパストラバーサル攻撃を実行しましょう。まず、簡単なGETリクエスト(http://file-explorer.c.ctf-snyk.io)でWebサイトにアクセスします。ブラウザで表示した場合と同じ結果になります。

Postmanに、ファイルエクスプローラーサイトへのGETリクエストが成功した結果が表示されています。レスポンスには「Go ahead hack m3」「find the flag」とあり、ファイルへのリンクが含まれています。

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

Postmanに、公開ファイルエクスプローラーへのGETリクエストが成功し、CSS、画像、JavaScript、HTML、favicon、robots.txtの各ファイルが一覧表示されている。

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

CSS、画像、JavaScript、HTML、favicon、robots.txtファイルの一覧が表示された、公開ファイルエクスプローラーへのGETリクエストを表示するPostman

URLエンコードとは?

URLエンコードは、安全でないASCII文字を「%」とそれに続く2桁の16進数に置き換えます。今回は%2eを.の代わりに、%2fを/の代わりに使用します。

このGETリクエスト(http://file-explorer.c.ctf-snyk.io/public/%2e)で何が表示されるか確認しましょう。

エンコードされたURLを使用したPostmanのGETリクエストが成功し、ファイルディレクトリ一覧と200 OKレスポンスが表示されています。

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

Postmanに、SNYKフラグ文字列を返すファイルエクスプローラーのURLへのGETリクエストが成功したことが表示されています。

フラグを見つけました!

Curlでフラグを見つける

ファイルエクスプローラーのチャレンジで、curlによるディレクトリ一覧の表示と、Snyk CTFのフラグを表示するコマンドが示されたターミナル。

今度は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/

ファイルエクスプローラーのURLと、表示されたSNYKのフラグ文字列が見えるブラウザーのアドレスバー。

Snyk IDE拡張機能でフラグを見つける

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

インストール操作と脆弱性スキャンの詳細が表示された、Snyk Security拡張機能のページを掲載するVisual Studio Code Extensionsマーケットプレイス。

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

package.jsonファイルを確認すると、stパッケージにいくつかの脆弱性があることがわかります。

Visual Studio Codeでpackage.jsonが表示され、依存関係st@0.2.4に脆弱性の警告と中程度の脆弱性が2件示されています。

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

Visual Studio Codeに、2件の脆弱性を示す依存関係の警告が表示されたJavaScriptのExpressサーバーファイル。

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

2件の脆弱性を含むnpm依存関係と、最も深刻な脆弱性を表示するSnykのアクションが示されたコードエディター

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

ダークテーマのVS Codeウィンドウに、npmパッケージ「st」のディレクトリトラバーサルの脆弱性に関するSnyk OSSのレポートが表示されています。

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

「ディレクトリトラバーサル」と題されたSnyk Learnのレッスンページ。意図しない機密ファイルの漏えいについて解説し、レッスンの進捗を示すサイドバーが表示されています。

File Explorerのまとめ

自分たちで書くコードの行数と、コードベースに取り込むコンポーネントやパッケージの数を比べてみましょう。車輪の再発明をして、エコシステムにすでに存在するかもしれないものを書き直す時間を無駄にする必要はありません。

今回のチャレンジもまさにそうでした。静的ファイルの配信にstパッケージを使ったシンプルなWebサイトですが、古いバージョンのパッケージを使用したことで、プロジェクトに脆弱性を持ち込んでしまいました。これにより、攻撃者が機密ファイルや認証情報、パスワードを見つけられる可能性があります。攻撃対象領域を減らすため、プロジェクトで使用しているコンポーネントは常に最新の状態に保ちましょう!

File Explorerや、CTFのほかのチャレンジも楽しんでいただけたならうれしいです :)

ほかのフラグをどうやって見つけたか知りたいですか?Fetch the Flagの解答ページで、解き方をご覧ください。