チャレンジ一覧

基礎スキルLevel 3★★★☆☆

Docker フォレンジック - コンテナ調査

Docker デーモンの無い環境で、イメージ `registry.internal/kinoco-billing-api:2.4.1` のメタデータを調べます。`/challenge/image_history.txt`(`docker history --no-trunc` 相当、新しいレイヤーが上)と `/challenge/image_config.json`(最終的な `Config.Env` と、古い順の `History[].created_by`)があります。この Dockerfile は `DB_ADMIN_PASSWORD` を `ENV` で何度も設定し直し、途中で一度だけ `python3 scripts/bootstrap_admin.py`(環境変数 `DB_ADMIN_PASSWORD` を読む)を実行し、最後に空で上書きしました。履歴にはフラグの形をした値がいくつもあります。フラグは、bootstrap_admin.py を実行した時点で有効だった `DB_ADMIN_PASSWORD` の値、つまりビルド順でそのRUNより前にある最後の `ENV DB_ADMIN_PASSWORD=...` の値です。それより前に上書きされた値、後に設定された値、別の変数の値、別のスクリプトにだけインラインで渡した値はおとりです。

基礎スキルLevel 3★★★☆☆

Git履歴から削除されたAPIキーを探せ

/app/repo はGitリポジトリです。開発者がAPI_KEYを誤ってコミットし、後続コミットで削除しました。 通常のGit履歴から削除前の config.py を確認し、APIキーに含まれるフラグを見つけてください。

基礎スキルLevel 3★★★☆☆

Python自動化 - REST API データ収集

コンテナ内で `http://127.0.0.1:8000/api/records?page=N` というページ送りのローカルAPIが動いています。`next` が `null` になるまで全ページを巡回し、`tag == "flag"` のレコードだけを集めてください。各レコードは `{"seq": <int>, "part": "<断片>"}` の形式で、`seq` の昇順に `part` を連結するとフラグになります。1ページ目だけではフラグは揃わず、`login`/`metric`/`order` などのレコードはおとりです。

基礎スキルLevel 3★★★☆☆

SQLクエリマスター - 複雑な結合

SQLite データベース `/challenge/company.db` には3つのテーブルがあります。 - employees (id, name, department_id, salary, email, note) - departments (id, name, manager_id) - projects (id, name, department_id, budget) 次の条件で従業員を1人選んでください。 1. budget が 100000 以上のプロジェクトを1つ以上持つ部署(小さいプロジェクトの合計が 100000 を超えても対象外) 2. それらの部署に所属する従業員の中で salary が最も高い人 その人の note 列がフラグです。各部署の最高給の従業員の note にはどれも KINOCO{...} の形の値が入っているので、条件を1つでも外すと別の人が選ばれます。

基礎スキルLevel 3★★★☆☆

システムコール追跡 - strace デバッグ

ソースコードのないプログラム `/app/mystery_program` を strace でトレースした記録 `/challenge/strace.log` を解析します。プログラムはトークンらしい中身(`KINOCO{...}` の形)のファイルをいくつも読み込みますが、(1) 隠しディレクトリ(名前が `.` で始まるディレクトリ)の中のファイルであり、かつ (2) `read` したその中身をあとで標準出力(fd 1)に `write` している、という2条件を両方満たすものはただ1つです。その中身がフラグです。普通のディレクトリにあるドットファイルは (1) を満たしません。fd 番号は `close` の後に使い回されます。

基礎スキルLevel 3★★★☆☆

システムログ解析 - journalctl マスター

systemd ジャーナルを `journalctl -o short` 風に書き出したログ `/challenge/system.log` を解析します。各行は「日時 ホスト ユニット[PID]: 優先度: メッセージ」の形です。ユニットの欄が `authd` で、優先度の欄が `ERR` の行はただ1行で、その行のメッセージにフラグが含まれます。`KINOCO{...}` の形の文字列はほかの行にもありますが、ユニットが `authd-proxy` など別物だったり、本文に authd や ERR という文字が出てくるだけだったりします。コンテナに journalctl は無いので、`grep`/`awk` で欄の位置を見て絞り込んでください。

基礎スキルLevel 3★★★☆☆

ネットワークマスター - Netcat リバースシェル

外部ホストへ接続せず、記録済みの artifacts/netcat/callback-transcript.log を解析してください。リスナーやシェルは起動されません。侵害されたホスト 10.0.5.23 から remote.target.com の 4444 番ポートへつながったコールバックを接続一覧から探し、その conn ID で「captured first bytes」の16進データを引き当て、文字列に戻すとフラグになります。送信元・宛先ホスト・宛先ポートのどれかが違う接続はおとりです。

基礎スキルLevel 3★★★☆☆

パフォーマンス解析 - リソースホッグを見つけろ

サーバーのスナップショット `/challenge/metrics.log` を解析します。前半は top 風のプロセス一覧(%CPU は9列目、%MEM は10列目)、後半は ps -ef 風のフルコマンドライン一覧です。%CPU が 50.0 以上かつ %MEM が 20.0 以上のプロセスはただ1つで、その PID の ps -ef 行の `--token=` 引数がフラグです。`--token=KINOCO{...}` を持つプロセスはほかにもあり、%CPU 最大・%MEM 最大のプロセスはどちらも条件を両方は満たしません。

基礎スキルLevel 3★★★☆☆

正規表現エキスパート - データバリデーション

/challenge/data.txt には受付記録が400行あり、各行にメールアドレス・電話番号・IPアドレス・日付が行ごとに違う順番・ラベルで並び、最後に memo="..." があります。書式が壊れた項目や、項目が無い行もあります。 次の条件をすべて正しい書式で1行に含む行はただ1行で、その行の memo がフラグです。 1. メールアドレス(xxx@yyy.zzz) 2. 電話番号(xxx-xxxx-xxxx または xxx.xxxx.xxxx。数字の桁数はこのとおり) 3. IPアドレス(xxx.xxx.xxx.xxx。数字1〜3桁を4つ) 4. 日付(YYYY-MM-DD) memo に KINOCO{...} の形の値を持つ行はほかにもありますが、どれも1つの条件が欠けています。正規表現を組み合わせて絞り込んでください。

基礎スキルLevel 3★★★☆☆

高度な自動化 - ディレクトリ監視スクリプト

`/challenge/logs/` に Web フロントエンド4台分のアクセスログ(combined log format、60ファイル・10万行超)があります。WAF は多数の送信元IPについて、それぞれ1行だけ `waf_rule=... note=...` を書き残しており、どの note もフラグの形をしています。フラグは、ステータスコード 404 のリクエスト数が最も多い送信元IPの行にある note です。404 が少し少ない別のスキャナー、総リクエスト数が最多のIP(ほとんど 200)、403 が最多のIP、通常の客のIPにも note があり、これらはおとりです。404 を IP ごとに集計して特定してください。