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)
進め方
- セットアップを実行(後述)
- Lv1 から順に挑戦
- 詰まったら 5分で Claude Code にヒント依頼: 「Lv N のヒントください」
- フラグを取ったら自分のノートに記録(達成感を残すため)
- 全部終わったら掃除コマンド実行
5問の概要
| Lv | お題 | 主に使うコマンド |
|---|---|---|
| Lv1 | 隠しファイルを探せ | ls -la, cat |
| Lv2 | 100の日記から特別な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 別ファイル)。