【picoCTF】Log Hunt - サーバーログをgrepして分割されたフラグを再構成

問題概要

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

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

問題文

picoCTF Log Hunt

解説

この問題では、与えられたファイル server.log を解析して、隠されたフラグを見つけることが求められます。

ステップ1: ログファイル形式の確認

まずはファイル形式の確認から始めます。fileコマンドを使って、server.log の形式を確認します。
$ file server.log
server.log: ASCII text
この出力から、server.log はプレーンなテキストファイルであることがわかります。
ASCIIファイルが良くわからない場合は以下を参考にしてください。 わかりやすく解説されています。

ステップ2: ログファイルの内容確認

次に、ログファイルの内容を確認します。headコマンドを使用して、最初の数行を表示します。
$ head server.log
[1990-08-09 10:00:10] INFO FLAGPART: picoCTF{us3_
[1990-08-09 10:00:16] WARN Disk space low
[1990-08-09 10:00:19] DEBUG Cache cleared
[1990-08-09 10:00:23] WARN Disk space low
[1990-08-09 10:00:25] INFO Service restarted
[1990-08-09 10:00:33] WARN Disk space low
[1990-08-09 10:00:38] ERROR Connection lost
[1990-08-09 10:00:46] ERROR Failed login attempt
[1990-08-09 10:00:48] INFO User logged in
[1990-08-09 10:00:50] INFO User logged in

出力結果からログファイルには、様々なログレベル(INFO、WARN、DEBUG、ERROR、FLAGPART)が含まれていることがわかります。

FLAGPARTというログレベルに注目します。
値が picoCTF{us3_ となっており、フラグの一部である可能性が高いです。

ステップ3: フラグの抽出

grepコマンドを使用して、FLAGPARTログレベルを含む行を抽出します。
$ grep "FLAGPART" server.log
[1990-08-09 10:00:10] INFO FLAGPART: picoCTF{us3_
[1990-08-09 10:02:55] INFO FLAGPART: y0urlinux_
[1990-08-09 10:05:54] INFO FLAGPART: sk1lls_
[1990-08-09 10:05:55] INFO FLAGPART: sk1lls_
[1990-08-09 10:10:54] INFO FLAGPART: cedfa5fb}
[1990-08-09 10:10:58] INFO FLAGPART: cedfa5fb}
[1990-08-09 10:11:06] INFO FLAGPART: cedfa5fb}
[1990-08-09 11:04:27] INFO FLAGPART: picoCTF{us3_
[1990-08-09 11:04:29] INFO FLAGPART: picoCTF{us3_
[1990-08-09 11:04:37] INFO FLAGPART: picoCTF{us3_
[1990-08-09 11:09:16] INFO FLAGPART: y0urlinux_
[1990-08-09 11:09:19] INFO FLAGPART: y0urlinux_
[1990-08-09 11:12:40] INFO FLAGPART: sk1lls_
[1990-08-09 11:12:45] INFO FLAGPART: sk1lls_
[1990-08-09 11:16:58] INFO FLAGPART: cedfa5fb}
[1990-08-09 11:16:59] INFO FLAGPART: cedfa5fb}
[1990-08-09 11:17:00] INFO FLAGPART: cedfa5fb}
[1990-08-09 12:19:23] INFO FLAGPART: picoCTF{us3_
[1990-08-09 12:19:29] INFO FLAGPART: picoCTF{us3_
[1990-08-09 12:19:32] INFO FLAGPART: picoCTF{us3_
[1990-08-09 12:23:43] INFO FLAGPART: y0urlinux_
[1990-08-09 12:23:45] INFO FLAGPART: y0urlinux_
[1990-08-09 12:23:53] INFO FLAGPART: y0urlinux_
[1990-08-09 12:25:32] INFO FLAGPART: sk1lls_
[1990-08-09 12:28:45] INFO FLAGPART: cedfa5fb}
[1990-08-09 12:28:49] INFO FLAGPART: cedfa5fb}
[1990-08-09 12:28:52] INFO FLAGPART: cedfa5fb}
出力結果から、フラグの各部分が重複して複数回ログに記録されていることがわかります。 これではフラグを正確に把握しづらいです。
そこでawkコマンドを使用して、各行の最後のフィールド(フラグの部分)を抽出しつつ、sortuniqコマンドを組み合わせて重複を排除します。

$ grep "FLAGPART" server.log | awk '{print $NF}' | sort | uniq
cedfa5fb}
picoCTF{us3_
sk1lls_
y0urlinux_
これにより、フラグの各部分が一意に抽出されます。
最後に、これらの部分を組み合わせてフラグを完成させることで、フラグが得られます。

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

file

file <ファイル名>
fileコマンドは指定したファイルの種類を判別します。拡張子ではなく、ファイルの中身(マジックナンバー)を基に判別します。
ctfでは拡張子が偽装されていることが多いため、ファイル形式の確認に役立ちます。

head

head <ファイル名>

headコマンドは指定したファイルの最初の数行(デフォルト10行)を表示します。 ログファイルの構造や内容を素早く把握するのに役立ちます。 いきなり全文を表示するのではなく、最初の部分を確認することで効率的に解析を進められます。


grep

grep '<検索文字列>' <ファイル名>
grepコマンドは指定した文字列を含む行を抽出します。 今回は FLAGPART を含む行のみを抽出することで、
大量のログの中からフラグに関係する情報だけを効率よく探し出しました。

awk

awk '{print $NF}' <ファイル名>

awkコマンドは、1行のテキストを空白区切りの「フィールド(列)」として扱い、 必要な部分だけを取り出すことができるテキスト処理ツールです。

今回のログでは、FLAGPART を含む行の一番最後にフラグの断片が記録されています。 $NF は「その行に存在する最後のフィールド」を意味するため、 これを指定することで、ログ行の末尾にあるフラグ部分だけを抽出できます。

sort

sort
sortコマンドは、入力された行をアルファベット順または数値順に並べ替えます。
今回は、抽出したフラグの部分をソートすることで、重複をまとめやすくしました。

uniq

uniq
uniqコマンドは、連続する重複行を削除します。
sortコマンドと組み合わせて使用することで、ファイル全体から一意な行だけを抽出できます。
今回は、フラグの各部分の重複を排除するために使用しました。

まとめ

picoCTFの「Log Hunt」問題では、サーバーログの中に断片的に記録された
フラグを集めて復元する必要がありました。
ログ解析の基本である「確認 → 抽出 → 整理」という流れを、
Linuxコマンドを使って実践する問題です。

▼ポイントは以下の通りです。

  • まずは file コマンドでファイル形式を確認する。
  • ログは headless で構造を把握してから解析する。
  • 怪しいキーワードは grep で絞り込む。
  • awksortuniq を組み合わせて情報を整理する。

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

NEXT
次におすすめ

【picoCTF】Rust fixme 2 - 所有権と参照のエラーを修正してXOR復号

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