1-8. Day 1-5 CTF - 学んだコマンドを試す実戦演習

所要時間: 30-60分(詰まり方による) ゴール: Day 1-5 で習ったコマンドだけで5つのフラグを取得できる コミット内容: 解いた記録を ~/log/linux_day05_ctf.log に保存


大前提: CTF とは何か

CTF (Capture The Flag) はセキュリティ・サーバー系のスキル試験でよくある形式の演習。 出題者が用意した環境の中に「フラグ」と呼ばれる 特定の文字列 が隠されていて、 プレイヤーは制限された手段だけを使ってフラグを見つけ出す。

このレッスンは Level 1 総復習応用編 として、「Day 1-5 で習ったコマンドだけ」で解ける問題を5問用意した。

  • 知識を「読んで理解」から「手で使える」に引き上げるための演習
  • 「あ、ここでこのコマンド使うのか」を体感する
  • 詰まったところが、今のあなたの「弱点」

フラグ形式: flag{xxx_xxx_xxx} のような文字列。発見したら次の問題へ。


ルール

使えるコマンド(Day 1-5 範囲)

  • ファイル操作: cd, ls, pwd, mkdir, rm, mv, cp, touch
  • 閲覧: cat, less, head, tail
  • 検索: find, grep
  • 権限: chmod, chown
  • テキスト処理: awk, sed, sort, uniq, wc, cut
  • パイプ・リダイレクト: |, >, >>, <, 2>, &>, tee, xargs

禁止

  • base64 / openssl などの未習コマンド
  • シェルスクリプト(変数・ループ・関数)— Day 2-2 で扱う
  • Web 検索でフラグそのものを検索(解法のヒントは OK)

進め方

  1. セットアップを実行(後述)
  2. Lv1 から順に挑戦
  3. 詰まったら 5分で Claude Code にヒント依頼: 「Lv N のヒントください」
  4. フラグを取ったら自分のノートに記録(達成感を残すため)
  5. 全部終わったら掃除コマンド実行

5問の概要

Lvお題主に使うコマンド
Lv1隠しファイルを探せls -la, cat
Lv2100の日記から特別な1つを見つけよgrep
Lv3読めないファイルを読めるようにせよls -l, chmod, cat
Lv4ログ集計で「犯人」のIPを特定 → 対応するフラグを取得awk, sort | uniq -c | sort -rn, grep
Lv5大量ファイルから 1つだけの .secret を見つけよfind -name

セットアップ

Claude Code に「Day 1-5 CTF をセットアップして」と頼むのが一番楽。 手動でやりたい場合は以下のスクリプトをターミナルに貼り付ける:

クリックして手動セットアップスクリプトを開く
mkdir -p ~/ctf/day1-5/lv1 ~/ctf/day1-5/lv2 ~/ctf/day1-5/lv3 ~/ctf/day1-5/lv4 ~/ctf/day1-5/lv5
 
# Lv1: 隠しファイル
echo "ここは普通のディレクトリです。" > ~/ctf/day1-5/lv1/readme.txt
echo "TODO: 後で整理する" > ~/ctf/day1-5/lv1/memo.md
echo "flag{hidden_in_plain_sight}" > ~/ctf/day1-5/lv1/.secret
 
# Lv2: 100ダミー + 1フラグ
for i in $(seq 1 100); do
  echo "これはただの日記です。番号 $i。本日も特に変わったことはありませんでした。" > ~/ctf/day1-5/lv2/diary_$(printf "%03d" $i).txt
done
echo "今日はちょっと特別な日です。FLAG: flag{needle_in_the_haystack}" > ~/ctf/day1-5/lv2/diary_042.txt
 
# Lv3: 権限 000
echo "flag{chmod_unlocks_the_door}" > ~/ctf/day1-5/lv3/locked.txt
chmod 000 ~/ctf/day1-5/lv3/locked.txt
echo "このファイルの権限を見てみよう。読めるようにしてください。" > ~/ctf/day1-5/lv3/hint.txt
 
# Lv4: ログ集計
cat > ~/ctf/day1-5/lv4/access.log <<'LOGEOF'
2026-05-21 10:00:01 192.168.1.10 GET /api/users 200
2026-05-21 10:00:02 192.168.1.11 POST /api/login 200
2026-05-21 10:00:03 10.0.0.5 GET /api/products 404
2026-05-21 10:00:04 192.168.1.10 GET /api/orders 500
2026-05-21 10:00:05 10.0.0.5 GET /api/products 404
2026-05-21 10:00:06 192.168.1.10 GET /api/users 200
2026-05-21 10:00:07 192.168.1.12 POST /api/login 401
2026-05-21 10:00:08 10.0.0.5 GET /api/products 404
2026-05-21 10:00:09 192.168.1.10 GET /api/users 200
2026-05-21 10:00:10 10.0.0.5 GET /api/products 404
2026-05-21 10:00:11 192.168.1.13 DELETE /api/orders/1 500
2026-05-21 10:00:12 192.168.1.10 GET /api/users 200
2026-05-21 10:00:13 192.168.1.11 POST /api/login 200
2026-05-21 10:00:14 10.0.0.5 GET /api/products 404
2026-05-21 10:00:15 10.0.0.5 GET /api/products 404
2026-05-21 10:00:16 192.168.1.10 GET /api/users 200
2026-05-21 10:00:17 10.0.0.5 GET /api/products 404
2026-05-21 10:00:18 192.168.1.10 GET /api/orders 500
2026-05-21 10:00:19 10.0.0.5 GET /api/products 404
LOGEOF
cat > ~/ctf/day1-5/lv4/flags.txt <<'FLAGEOF'
# 各IPの「合言葉」リスト
192.168.1.10 -> flag{never_pick_the_loudest}
192.168.1.11 -> flag{login_attempt_failed}
192.168.1.12 -> flag{wrong_credentials}
192.168.1.13 -> flag{delete_is_dangerous}
10.0.0.5 -> flag{top_offender_caught}
FLAGEOF
 
# Lv5: 階層ディレクトリ + 1つだけの .secret
mkdir -p ~/ctf/day1-5/lv5/a/b/c/d/e ~/ctf/day1-5/lv5/a/b/c/f ~/ctf/day1-5/lv5/a/b/g/h ~/ctf/day1-5/lv5/a/i ~/ctf/day1-5/lv5/j/k/l ~/ctf/day1-5/lv5/m/n
for dir in $(find ~/ctf/day1-5/lv5 -type d); do
  for i in 1 2 3; do
    echo "これはダミーファイルです。" > "$dir/dummy_$i.txt"
  done
done
echo -n "flag{deep_find_with_secret_extension}" > ~/ctf/day1-5/lv5/a/b/c/d/e/treasure.secret

挑戦開始

セットアップが終わったら、まず Lv1 のディレクトリに移動:

cd ~/ctf/day1-5/lv1 && ls

何も特別なものは見えないはず。そこから「何が隠れているか」を考える。


各 Lv のヒント(自力で15分は粘ってから)

詰まったら段階的にヒントを開示。まずは自分で考える

Lv1 のヒント
  • ヒント1: ls だけでは見えない、. で始まるファイル(ドットファイル)が Unix にはある
  • ヒント2: ls には「全部見せる」オプションがある → 何だっけ?
  • ヒント3: ls -la で見える隠しファイルを cat する
Lv2 のヒント
  • ヒント1: 100ファイル全部 cat するのは時間の無駄。特定の文字列を含むファイルを一発で見つけたい
  • ヒント2: そのためのコマンドが Day 1-4 で出てきた
  • ヒント3: grep "FLAG:" * で全ファイル横断検索
Lv3 のヒント
  • ヒント1: ls -l で権限を確認、何が起きてるか観察
  • ヒント2: 権限が全部 - = 誰も読めない状態。自分は所有者なので変更できる
  • ヒント3: chmod u+r locked.txt で所有者の読み権限を付ける、その後 cat
Lv4 のヒント
  • ヒント1: アクセスログから「どのIPが一番アクセスしたか」を集計したい
  • ヒント2: Day 4 で習った 集計の黄金パイプライン: awk で列抽出 → sort | uniq -c | sort -rn
  • ヒント3: awk '{print $3}' access.log | sort | uniq -c | sort -rn | head -1 で最頻出IPがわかる
  • ヒント4: そのIPの行を flags.txt から grep で取り出す
Lv5 のヒント
  • ヒント1: 何階層も深いディレクトリの中を全部 ls するのは現実的じゃない
  • ヒント2: Day 3 で習った find を使う。ファイル名パターンで絞れる
  • ヒント3: find ~/ctf/day1-5/lv5 -name "*.secret" で 1つだけ出る、それを cat

解答パターン(最後の手段)

答えを見る前に、まず15分は格闘

以下に解答パターンを伏字なしで載せている。挑戦したい人はスクロールしないこと。

クリックして解答パターンを開く(ネタバレ)
  • Lv1: ls -la.secret が見える → cat .secret
  • Lv2: grep "FLAG:" * または grep -r "FLAG:" .
  • Lv3: chmod u+r locked.txt && cat locked.txt(または chmod 600
  • Lv4: awk '{print $3}' access.log | sort | uniq -c | sort -rn | head -1 で最頻出IP(10.0.0.5)特定 → grep "10.0.0.5" flags.txt
  • Lv5: find ~/ctf/day1-5/lv5 -name "*.secret" → 出てきたファイルを cat

終わったら掃除

rm -rf ~/ctf/day1-5/

振り返り(任意)

このノートに追記:

- 一番詰まった Lv:
- 「あ、これか」と気付いた瞬間:
- もっと早く知りたかったコマンド・オプション:
- 「Day N の知識が活きた」と感じた場面:

次のステップ

Level 1 を終えたら Level 2 へ

Level 2 完了後、Day 1-13 範囲の CTF も追加予定(このファイルの拡張 or 別ファイル)。