Skip to main content

Fetch the Flag CTF 2022 攻略記事:Containers are ACE

feature ctf containers are ace

2022年11月9日

0 分で読めます

Fetchに参加してくださり、ありがとうございました!参加してくださった数千人の皆さん、 Fetch the Flag CTFへのご参加、ありがとうございました。また、チャレンジを作成、テストし、解説記事を執筆してくれたSnykのメンバーにも心から感謝します!

今年のFetch the Flag CTFのチャレンジContainers are ACEの難易度は、比較的低めです。Burpの基本的な操作と、いくつかのOSコマンドの知識があれば解けます。また、攻撃経路を特定するための分析・調査も必要です。

攻略

初期調査

本格的な調査を始める前に、探偵ならまず手掛かりを集め、整理する必要があります。このチャレンジでは、以下のような貴重なヒントがいくつか提示されています。

ヒント #1:Snyk CLIをインストールする https://docs.snyk.io/snyk-cli/install-the-snyk-cli

特に難しいことはありません。Snyk CLIはいくつかの方法でインストールできますが、ここではNPMを使ってインストールします(NPMがインストールされていることを確認してください。まだの場合はこちらからインストールできます)。

sudo npm install snyk -gを実行すれば、次のステップに進めます。

ヒント #2:次のコマンドを実行する:snyk container test pasapples/apjctf-todo-java-app:latest --app-vulns --exclude-base-image-vulns

ここで役立つのがSnyk CLIです。上記のコマンドを実行すると、次の一連の処理が行われます(詳しくはSnyk CLIのドキュメントをご覧ください)。

  1. イメージがローカルのDockerデーモンにない場合はダウンロードする

  2. イメージにインストールされているソフトウェアを特定する

  3. そのソフトウェア部品表をSnykサービスに送信する

  4. イメージに含まれる脆弱性の一覧を返す

Snykはイメージをスキャンして脆弱性を検出し、その結果と推奨される修正方法を提示します。

ターミナルの出力にApache Strutsのセキュリティ脆弱性が表示され、バージョン2.3.20から2.5.30へのアップグレードが推奨されています。

ヒント #3:詳しくはこちら https://docs.snyk.io/products/snyk-container/getting-around-the-snyk-container-ui/detecting-application-vulnerabilities-in-container-images#ap[…]lag

このヒントには、Snyk Containerの仕組みをもう少し詳しく知りたい場合に役立つ情報があります。

ヒント #4:Containers are ACE

タイトルにも、このチャレンジを解くうえで重要なヒントがあります。ACEは、Arbitrary Code/Command Execution(任意のコード/コマンド実行)の略語としてよく使われます。

一歩引いて考える

情報収集が終わったので、アプリケーションへの侵入を可能にする攻撃経路を探します。前のステップでは、Snyk Containerが多数の脆弱性を特定しました。次は、それらを絞り込む方法を見つける必要があります。

Criticalかつ脆弱性の種類がArbitrary Command/Code Executionであるなど、深刻度の高い脆弱性を特定してみましょう。条件を適用すると、次の脆弱性に絞り込めます。

Apache Struts 2.3.20における重大度「クリティカル」のセキュリティ脆弱性を一覧表示したターミナル出力。リモートコード実行や任意コード実行などが含まれています。

それぞれを簡単に分析すると、CVE-2017-5638のCVSSスコアは10で、公開されているエクスプロイトも複数あることがわかります。このことから、この脆弱性が悪用される可能性はかなり高いと考えられます。では、実際に試してみましょう!

実践

公開されているペイロードをもとにエクスプロイトスクリプトを作成する方法と、Burp経由で悪用する方法があります。今回は後者を選びます。ライブラリのインストールやファイルの作成が不要で、全体的に手軽だからです。

Burpを起動したら、Proxyタブに移動してOpen Browserボタンをクリックし、脆弱なWebアプリにアクセスします。これ以降、すべてのリクエストはまずBurpに転送されます。

次にWebアプリのログイン画面に移動し、リクエストのインターセプトを開始します。適当なメールアドレスとパスワードでログインしようとしても当然うまくいきませんが、このリクエストをRepeaterに送信しましょう。

キャプチャしたPOSTログインリクエストと、「Send to Repeater」がハイライト表示されたActionメニューを示すBurp Suiteのインターセプトウィンドウ。
無効なメールアドレスまたはパスワードのエラーを含むHTMLが返され、サインインに失敗したHTTPリクエストとレスポンスのペイン

次に、GitHubで公開されているペイロードを追加して、POSTリクエストを変更してみましょう。

WebデバッグツールにHTTPリクエストとレスポンスが並べて表示され、POSTリクエストと200 OKレスポンスが示されています。

成功です!異なるレスポンスが返ってきました。レスポンスを詳しく確認すると、次のコマンドの出力であることがわかります。

OGNLコマンド実行ペイロードとChromeのUser-Agent文字列を含む、multipart/form-dataリクエストのコードスニペット

コマンドを変更してファイルやディレクトリを検索し、何か見つかるか試すこともできますが、行き詰まってしまいます。

開発者ツールに表示された、HTTPログインリクエストとApache Tomcat 8.5サーバーのレスポンスの並列表示

フラグの形式はSNYK{...}だとわかっているので、#cmd='grep -r -e SNYK'を実行して、すべてのファイルを検索してみましょう。フラグを見つけました!

SNYKトークン文字列を含むwebapps/todolistのフラグを示すコードスニペット。

または、flagというキーワードを含むファイルを、​​#cmd='find . -name *flag*'で検索し、#cmd='cat ./webapps/todolist/flag'でファイルを読み取ることもできます。

ヘッダーとフォームデータを含むPOSTログインリクエストと、todolistのフラグページにリダイレクトする200レスポンスを並べて表示した、Webセキュリティテスト用インターフェース。

こうしてチャレンジを攻略しました

  • 次のステップに備え、ターゲットに対して簡単な偵察を行いました。

  • 脆弱性をトリアージし、攻撃経路を特定しました。

    Critical

    の深刻度

  • 有効なリクエストをインターセプトし、悪意のあるペイロードを追加して変更しました。

  • 一般的な列挙手法を使ってフラグを検索しました。

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

開発者ファーストのコンテナセキュリティ

Snykは、コンテナイメージとKubernetesワークロードの脆弱性を検出し、自動的に修正します。