【picoCTF】Commitment Issues - Gitコミット履歴からフラグを復元する

問題概要

picoCTFの「Commitment Issues」という問題の解説記事です。

  • カテゴリ: General Skills
  • 難易度: Easy

問題文

picoCTF Commitment Issues

解説

ステップ1: ZIPファイルの確認

問題文からZIPファイルchallenge.zipをダウンロードし、内容を確認します。
$ unzip challenge.zip
Archive:  challenge.zip
   creating: drop-in/
   creating: drop-in/.git/
   creating: drop-in/.git/branches/
  inflating: drop-in/.git/description  
   creating: drop-in/.git/hooks/
   (中略)
  inflating: drop-in/.git/logs/refs/heads/master  
 extracting: drop-in/message.txt 

ステップ2: 配布物がGitリポジトリか確認

今回のzipには.gitディレクトリが含まれているので、drop-in/はそのままGitリポジトリとして扱えます。 まずは隠しファイル込みで中身を確認します。
$ cd drop-in
$ ls -a
.  ..  .git  message.txt

message.txtの中身を確認します。

$ cat message.txt 
TOP SECRET

「TOP SECRET」と書かれています。特に手がかりにはならなそうですが、重大な秘密が隠されていることは間違いなさそうです。


ステップ3: Gitのコミット履歴を確認

Gitリポジトリとして認識されているので、コミット履歴を確認します。

$ git log
commit 8dc51806c760dfdbb34b33a2008926d3d8e8ad49 (HEAD -> master)
Author: picoCTF <ops@picoctf.com>
Date:   Tue Mar 12 00:06:17 2024 +0000

    remove sensitive info

commit 87b85d7dfb839b077678611280fa023d76e017b8
Author: picoCTF <ops@picoctf.com>
Date:   Tue Mar 12 00:06:17 2024 +0000

    create flag

2つのコミットが存在しており、最新のコミットメッセージは「remove sensitive info」、その1つ前のコミットメッセージは「create flag」となっています。

つまり一度フラグ情報を含むコミットがあり、その後に削除されたのではないかと推測できます。


ステップ4: 過去のコミット内容を確認

過去のコミット内容を確認するために、git showコマンドを使用します。 「create flag」コミットのハッシュ値は 87b85d7dfb839b077678611280fa023d76e017b8 です。
$ git show 87b85d7dfb839b077678611280fa023d76e017b8
commit 87b85d7dfb839b077678611280fa023d76e017b8
Author: picoCTF <ops@picoctf.com>
Date:   Tue Mar 12 00:06:17 2024 +0000

    create flag

diff --git a/message.txt b/message.txt
new file mode 100644
index 0000000..bae247d
--- /dev/null
+++ b/message.txt
@@ -0,0 +1 @@
+picoCTF{xxxxx}

※フラグはマスクしています。

過去のコミットでmessage.txtが新規作成され、その内容としてフラグが書き込まれていたことが確認できました。

使用したコマンドの軽い解説

unzip

unzip challenge.zip
ZIP形式のアーカイブを展開するコマンドです。配布物に.gitディレクトリが含まれていないかどうかを確認するためにも、まずは中身をすべて展開しておくと便利です。

ls -a

ls -a
隠しファイル(ドットで始まるファイル・ディレクトリ)も含めて一覧表示します。 今回は.gitディレクトリの存在を確認するために使用しました。

git log

git log

コミット履歴を表示するコマンドです。 コミットメッセージから、どのコミットでフラグが作成され、どのコミットで削除されたのかを推測できます。

git show <コミットハッシュ>

git show 87b85d7dfb839b077678611280fa023d76e017b8
指定したコミットで「どのファイルがどのように変更されたか」を表示します。 message.txtが新規作成され、その内容としてフラグが書き込まれていたことが確認できました。

まとめ

この問題では、Gitのコミット履歴から「一度コミットされた秘密情報は、後から消しても過去の履歴から復元できてしまう」という点を体験的に学べました。

▼ポイントを整理すると、次の通りです。

  • 配布物に.gitディレクトリが含まれていたら、Gitリポジトリとして扱える
  • git logでコミットメッセージを確認し、「怪しいコミット(create flag / remove sensitive info など)」を探す
  • git show <コミットハッシュ>で過去のコミット内容を確認し、削除されたフラグを復元できる
現実の開発現場でも、パスワードやシークレットキーを誤ってコミットしてしまう事故は少なくありません。 「コミットに載せてはいけない情報」はそもそもコミットしない、もししてしまった場合は履歴ごと除去する(git filter-repo など)必要があります。

閲覧ありがとうございました!

NEXT
次におすすめ

【picoCTF】Collaborative Development - ブランチを追ってフラグを復元する

カテゴリ: General Skills難易度: Easy#picoCTF
次の記事へ →
同じカテゴリ/難易度/picoCTFでの表示順が近い記事を優先しておすすめしています。