Fetch the Flag CTF 2022 攻略記事: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のドキュメントをご覧ください)。
イメージがローカルのDockerデーモンにない場合はダウンロードする
イメージにインストールされているソフトウェアを特定する
そのソフトウェア部品表をSnykサービスに送信する
イメージに含まれる脆弱性の一覧を返す
Snykはイメージをスキャンして脆弱性を検出し、その結果と推奨される修正方法を提示します。

このヒントには、Snyk Containerの仕組みをもう少し詳しく知りたい場合に役立つ情報があります。
ヒント #4:Containers are ACE
タイトルにも、このチャレンジを解くうえで重要なヒントがあります。ACEは、Arbitrary Code/Command Execution(任意のコード/コマンド実行)の略語としてよく使われます。
一歩引いて考える
情報収集が終わったので、アプリケーションへの侵入を可能にする攻撃経路を探します。前のステップでは、Snyk Containerが多数の脆弱性を特定しました。次は、それらを絞り込む方法を見つける必要があります。
Criticalかつ脆弱性の種類がArbitrary Command/Code Executionであるなど、深刻度の高い脆弱性を特定してみましょう。条件を適用すると、次の脆弱性に絞り込めます。

https://security.snyk.io/vuln/SNYK-JAVA-ORGAPACHESTRUTS-31503
https://security.snyk.io/vuln/SNYK-JAVA-ORGAPACHESTRUTS-30207
https://security.snyk.io/vuln/SNYK-JAVA-ORGAPACHESTRUTS-30771
https://security.snyk.io/vuln/SNYK-JAVA-ORGAPACHESTRUTS-30772
それぞれを簡単に分析すると、CVE-2017-5638のCVSSスコアは10で、公開されているエクスプロイトも複数あることがわかります。このことから、この脆弱性が悪用される可能性はかなり高いと考えられます。では、実際に試してみましょう!
実践
公開されているペイロードをもとにエクスプロイトスクリプトを作成する方法と、Burp経由で悪用する方法があります。今回は後者を選びます。ライブラリのインストールやファイルの作成が不要で、全体的に手軽だからです。
Burpを起動したら、Proxyタブに移動してOpen Browserボタンをクリックし、脆弱なWebアプリにアクセスします。これ以降、すべてのリクエストはまずBurpに転送されます。
次にWebアプリのログイン画面に移動し、リクエストのインターセプトを開始します。適当なメールアドレスとパスワードでログインしようとしても当然うまくいきませんが、このリクエストをRepeaterに送信しましょう。


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

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

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

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

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

こうしてチャレンジを攻略しました
次のステップに備え、ターゲットに対して簡単な偵察を行いました。
脆弱性をトリアージし、攻撃経路を特定しました。
Criticalの深刻度
有効なリクエストをインターセプトし、悪意のあるペイロードを追加して変更しました。
一般的な列挙手法を使ってフラグを検索しました。
ほかのフラグをどう見つけたか知りたいですか?Fetch the Flagの解答ページで、解き方をご覧ください。
開発者ファーストのコンテナセキュリティ
Snykは、コンテナイメージとKubernetesワークロードの脆弱性を検出し、自動的に修正します。
