Fetch the Flag CTF 2022 解説:git-refs
Iulia Manda
2022年11月9日
0 分で読めますFetchに参加してくださり、ありがとうございました! 数千人ものプレイヤーにご参加いただいたFetch the Flag CTF、おめでとうございます。また、チャレンジを作成、テストし、解説記事を執筆してくれたSnykerの皆さんにも心から感謝します!
今年のFetch the Flag CTFに参加された方は、git-refsチャレンジに取り組んだかもしれません。最後まで解けなかった方も、詳しく知りたい方も、この記事で一緒に挑戦していきましょう。チャレンジの名前と説明からGitが手がかりになりそうです。調査の際にはこの点を念頭に置きます。Gitを使えばフラグを見つけられるでしょうか?git-refsアプリケーションに考えられる攻撃経路がないか、調べてみましょう。
チャレンジ
このWebチャレンジでは、Gitの公開リポジトリ情報を確認できるWebサイトへのリンクが提供されます。テキスト検索を使うと、指定したリポジトリのブランチとコミットハッシュを一覧表示できます。リクエストの成功に認証は必要ないため、このチャレンジは少し簡単です。
解説
まず、送信されているリクエストを確認してみましょう。


本文にリストを含む、http://git-refs.c.ctf-snyk.io/gitへのPOSTリクエストであることが分かりました。
興味深いですね!ls-remoteはGitのコマンドのようです。本文にほかのGitコマンドも渡せるのでしょうか…

Gitコマンドを使って、リモートシェルにアクセスできたようです。git-refsリポジトリについて何か情報を得られるか、試してみましょう。
空のGitリポジトリのようです。本当にそうでしょうか?Gitの履歴から、何か元に戻されたものを見つけられるかもしれません。

reflogもあまり役に立たないようです。これは初期化されたばかりのローカルリポジトリで、上流には何もプッシュされていないようです。
ところで、この調査結果を利用してシステムファイルの情報を得られないでしょうか?flag.txtのようなファイルを探せるかもしれません。

Gitのマニュアルを読むと、ファイルシステムを調べるのに--work-treeコマンドが使えそうです。

いいですね!Gitを使って、リモートシステムの「/」を一覧表示できました。
ただし、この方法での調査はうまくいきませんでした。主な理由は、ファイルの内容を読み取る試みがすべて失敗したことです(git addしてからgit diffを試しましたが、.gitignoreの設定により追加やコミットができないのかもしれません。.gitignoreの内容も確認できなかったため、確かなことは分かりません)。
gitでほかにできることがないか、さらに調べてみましょう。
アプローチを変更
次に思いついたのは、リポジトリの設定を確認することでした。git configのオプションを調べると、気になるものが見つかりました。
なるほど、興味深いですね。試してみましょう。

フラグが見つかりました。 :)
まとめ
このチャレンジの攻略に使った手順をまとめます。
Webアプリケーションのネットワークリクエストを分析する:URL、リクエスト本文、ステータスを確認
既存の情報をもとにリモートシェルへアクセスする方法を見つけ、攻撃経路の可能性を特定する
Gitのマニュアル(または自分の記憶。場合によります :))を読み、フラグの発見に近づくために使えるものを探す
コマンドインジェクションは今も頻繁に見られるため、今日のアプリケーションでは入力のサニタイズが欠かせません。このチャレンジを楽しみながら、何か学んでいただけたなら幸いです。
ほかのフラグをどう見つけたか知りたいですか?Fetch the Flagの解答ページで、攻略方法をご覧ください。



