Skip to main content

Fetch the Flag CTF 2022 解説:git-refs

著者

Iulia Manda

feature ctf git refs

2022年11月9日

0 分で読めます

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

今年のFetch the Flag CTFに参加された方は、git-refsチャレンジに取り組んだかもしれません。最後まで解けなかった方も、詳しく知りたい方も、この記事で一緒に挑戦していきましょう。チャレンジの名前と説明からGitが手がかりになりそうです。調査の際にはこの点を念頭に置きます。Gitを使えばフラグを見つけられるでしょうか?git-refsアプリケーションに考えられる攻撃経路がないか、調べてみましょう。

チャレンジ

このWebチャレンジでは、Gitの公開リポジトリ情報を確認できるWebサイトへのリンクが提供されます。テキスト検索を使うと、指定したリポジトリのブランチとコミットハッシュを一覧表示できます。リクエストの成功に認証は必要ないため、このチャレンジは少し簡単です。

解説

まず、送信されているリクエストを確認してみましょう。

Git Refsツールに表示されたGitHubリポジトリのURL、リモートブランチ名、コミットハッシュと、ブラウザーのネットワークリクエストの詳細。
Git Refsツールに、GitHubリポジトリのURL、リモートブランチ名、コミットハッシュが、Chrome DevToolsのリクエストペイロードと並んで表示されている。

本文にリストを含む、http://git-refs.c.ctf-snyk.io/gitへのPOSTリクエストであることが分かりました。

["ls-remote", "https://github.com/snyk/nuget-semver"]

興味深いですね!ls-remoteはGitのコマンドのようです。本文にほかのGitコマンドも渡せるのでしょうか…

GitエンドポイントへのPOSTリクエストと、リポジトリがmasterブランチにあり、まだコミットがないことを示すレスポンスを表示したPostmanのウィンドウ

Gitコマンドを使って、リモートシェルにアクセスできたようです。git-refsリポジトリについて何か情報を得られるか、試してみましょう。

空のGitリポジトリのようです。本当にそうでしょうか?Gitの履歴から、何か元に戻されたものを見つけられるかもしれません。

Git reflogデータへのPOSTリクエストと、masterブランチにコミットがないことを示す500エラーが表示されたAPIクライアント。

reflogもあまり役に立たないようです。これは初期化されたばかりのローカルリポジトリで、上流には何もプッシュされていないようです。

ところで、この調査結果を利用してシステムファイルの情報を得られないでしょうか?flag.txtのようなファイルを探せるかもしれません。

Git URLへのPOSTリクエスト、JSONボディ、Gitのステータス出力を表示した200 OKレスポンスが映るPostmanウィンドウ。

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

work-treeとstatusを使ってGit refsを照会し、未追跡のシステムディレクトリを含むGitのステータス一覧を返すPostmanリクエスト。

いいですね!Gitを使って、リモートシステムの「/」を一覧表示できました。

ただし、この方法での調査はうまくいきませんでした。主な理由は、ファイルの内容を読み取る試みがすべて失敗したことです(git addしてからgit diffを試しましたが、.gitignoreの設定により追加やコミットができないのかもしれません。.gitignoreの内容も確認できなかったため、確かなことは分かりません)。

gitでほかにできることがないか、さらに調べてみましょう。

アプローチを変更

次に思いついたのは、リポジトリの設定を確認することでした。git configのオプションを調べると、気になるものが見つかりました。

-e, --edit           Opens an editor to modify the specified config file; either --system, --global, or repository (default).

なるほど、興味深いですね。試してみましょう。

git-refsエンドポイントへのPOSTリクエスト、JSON入力、フラグとGit設定を含むパッケージのレスポンスが表示されたPostmanの画面。

フラグが見つかりました。 :)

まとめ

このチャレンジの攻略に使った手順をまとめます。

  • Webアプリケーションのネットワークリクエストを分析する:URL、リクエスト本文、ステータスを確認

  • 既存の情報をもとにリモートシェルへアクセスする方法を見つけ、攻撃経路の可能性を特定する

  • Gitのマニュアル(または自分の記憶。場合によります :))を読み、フラグの発見に近づくために使えるものを探す

コマンドインジェクションは今も頻繁に見られるため、今日のアプリケーションでは入力のサニタイズが欠かせません。このチャレンジを楽しみながら、何か学んでいただけたなら幸いです。

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

続きを読む

illustration hero ai
Blog

PHPが重大な未認証RCEの脆弱性2件を修正(CVE-2026-109618、CVE-2026-109619):今すぐアップデート

PHPのリクエスト処理に重大な脆弱性が2件あり、未認証のリモートコード実行につながるおそれがあります。修正版にアップグレードするか、旧バージョンにはベンダー提供のバックポートを適用してください。

blog feature ai lilac
Blog

エージェント型修正で脆弱性バックログをプルリクエストに変える

Evo Remediation Agentがオープンプレビューで利用可能になり、Evo Agentic AppSecに依存関係の自動解決機能が加わりました。AppSecチームは継続的な修正キャンペーンを実施できるようになりました

AI Background min crop
Blog

AIが、あなたが受け入れてきたあらゆるリスクを一気に顕在化させる:AI Security Panel: Unfilteredから得た7つの洞察

AIによって攻撃はより安価かつ高速になり、組織がすでに抱えているリスクが露呈しています。4人のセキュリティリーダーが、機械の速度に対応する防御と迅速な修復が今不可欠である理由を語ります。