チャレンジ一覧
プロセスハンター - 隠されたプロセス
バックグラウンドで "secret_service" という名前のプロセスが動作しています。 このプロセスを見つけて以下の情報を取得してください: 1. プロセスID (PID) 2. 実行ユーザー 3. コマンドライン引数 コマンドライン引数にフラグが含まれています。 ヒント: ps, pgrep, top などのコマンドを使用
メモリダンプからプロセスを探せ
memory.dump は、メモリダンプの解析結果(pslist / psscan / cmdline)を並べた簡略化テキストです。リストから隠されている不審なプロセスを見つけ、そのプロセスが持つ設定の値からフラグを読み取りましょう。メモリフォレンジックの基本を学びます。 提供ファイル: memory.dump
レインボーテーブル攻撃
ソルトなしの高速ハッシュは、事前計算された逆引きDBで簡単に破られる場合があります。与えられたMD5ハッシュを逆引きしてください。 MD5ハッシュ: 5f4dcc3b5aa765d61d8327deb882cf99 このハッシュを逆引きし、元の文字列を KINOCO{...} の形式で提出してください。
ログ解析 - 侵入者を見つけろ
/app/auth.log には認証ログが記録されています。 不審なアクティビティを検出してください: - 1時間以内に10回以上ログイン失敗しているIPアドレスを特定 - そのIPアドレスからの最初の失敗ログインのタイムスタンプを取得 ログフォーマット: [YYYY-MM-DD HH:MM:SS] Failed login from IP_ADDRESS フラグの形式: そのタイムスタンプの日付と時刻を _ でつなぎ、KINOCO{} で囲みます(例: [2025-01-02 03:04:05] → KINOCO{2025-01-02_03:04:05})。
ワンタイムパッド鍵再利用攻撃
ワンタイムパッドは鍵を一度だけ使う場合に安全です。同じ鍵を再利用すると、既知平文から別の平文を復元できます。 同じ鍵で暗号化された2つの暗号文: ciphertext1_hex = 1c0a070901 known_plaintext1 = HELLO ciphertext2_hex = 060a1e160b known_plaintext1 と ciphertext1 から鍵を復元し、ciphertext2 をXORで復号してください。復号した文字列を KINOCO{...} で包んだものがフラグです。
予測可能な乱数
固定seedの疑似乱数は再現できます。暗号用途で一般用途の乱数を使ってはいけません。 フラグ生成コード: import random random.seed(12345) flag_chars = [chr(random.randint(65, 90)) for i in range(10)] print("KINOCO{" + "".join(flag_chars) + "}") 同じPythonコードを実行し、生成されるフラグを提出してください。
削除されたファイルを復元せよ
ディスクイメージから削除された圧縮ファイル(ZIP)を復元し、中のメモからフラグを見つけましょう。 ファイルカービングツールを使用して、削除されたファイルを復元する方法を学びます。 提供ファイル: disk_image.dd
圧縮の迷宮 - 多重圧縮ファイル
/app/flag.tar.gz は多重に圧縮されたファイルです。 解凍していくと、次の圧縮ファイルが出てきます: flag.tar.gz → flag.tar → flag.zip.bz2.gz → flag.zip.bz2 → flag.zip → flag.txt すべて解凍してflag.txtの内容を取得してください。 ヒント: file コマンドで圧縮形式を確認できます
小さいRSA鍵の破壊
RSAは十分大きな素数を使うことで安全性を保ちます。この問題では小さすぎるnを素因数分解し、秘密指数を求めて暗号文列を復号します。 公開鍵と暗号文: n = 323 e = 5 ciphertexts = [115, 181, 241, 109, 109, 57, 190, 115, 241, 57, 65, 271, 49, 115, 57, 241, 190, 271, 57, 85, 271, 241, 65] nを素因数分解して秘密指数dを求め、各暗号文を復号してください。復号した文字列を KINOCO{...} で包んだものがフラグです。
暗号解析 - アフィン暗号の解読
ciphertext.txtは、英文の報告書をアフィン暗号 E(x) = (a×x + b) mod 26 で暗号化したものです。大文字・小文字は保たれ、英字以外はそのままです。平文が KINOCO という単語で始まることを手がかりに鍵a, bを求めて復号し、最後の行のフラグを提出してください。
正規表現マスター - ログファイル解析
/app/access.log には数千件のアクセスログが記録されています。 この中から、IPアドレスが「192.168.1.」で始まり、かつステータスコードが404のエントリをすべて抽出してください。 条件: - IPアドレス: 192.168.1.xxx - ステータスコード: 404 - 該当する行数がフラグになります ヒント: grep と正規表現を使用してください
環境変数マスター - PATH Hijacking
/app/secret_bin ディレクトリに隠されたコマンド "getflag" があります。 しかし、このディレクトリはPATHに含まれていないため、直接実行できません。 2つの方法でこのコマンドを実行してください: 1. 絶対パスで実行 2. PATHに追加して実行 コマンドを実行するとフラグが表示されます。
画像のLSBに隠されたメッセージ
PNGファイルのLSB(最下位ビット)に隠されたメッセージを抽出しましょう。 ステガノグラフィ解析の基本を学びます。 提供ファイル: image.png
Chromeブラウザからセッションクッキーを抽出せよ
Linux 版 Chrome のプロファイルから取り出した `/challenge/Cookies` と `/challenge/History`(どちらも SQLite)を渡します。 被害者は、社内メールのリンクから偽の SSO ページを経由して、ある社内管理画面にログインしました。その管理画面の `admin_session_id` クッキーの値(フラグ)を取り出してください。管理画面はいくつもあり、どの管理画面のクッキーも同じ形をしています。Cookies の値は暗号化されています。 使えるツール: sqlite3, openssl, python3, xxd
DNSトンネリングを検出せよ
DNS クエリの記録 `dns_queries.log` を解析し、DNS トンネリングによるデータ流出を検出してください。単一ドメインへ長いラベルの問い合わせを大量に出しているホストを見つけ、ラベルを seq 順に並べて hex デコードするとフラグになります。
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=...` の値です。それより前に上書きされた値、後に設定された値、別の変数の値、別のスクリプトにだけインラインで渡した値はおとりです。
Git履歴から削除されたAPIキーを探せ
/app/repo はGitリポジトリです。開発者がAPI_KEYを誤ってコミットし、後続コミットで削除しました。 通常のGit履歴から削除前の config.py を確認し、APIキーに含まれるフラグを見つけてください。
NTFS $MFTから削除ファイルの痕跡を探せ
Windows 端末 `KINOCO-WS07` の `$MFT` をレコード単位のテキストに書き出した `/challenge/mft_records.txt`(先頭にクラスタサイズとダンプの開始 LCN があります)と、ボリューム C: のクラスタの生データ `/challenge/cluster_dump.bin` を渡します。 ユーザー yuki が削除した `secret_note.txt.gz` は非常駐(non-resident)で、断片に分かれてディスクに残っています。MFT の `$DATA` に残るデータラン(RunList)の生バイトを読み解いて断片を集め、元のファイルを復元して、フラグを取り出してください。常駐データに見える文字列は、答えとは限りません。 使えるツール: python3, xxd, dd, gzip, grep, awk
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` などのレコードはおとりです。
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つでも外すと別の人が選ばれます。
Web-21. Secure User Searchのブラインドインジェクション
このユーザー検索アプリはユーザー名の存在有無だけを返しますが、直接的な検索結果は表示しません。エラーの発生有無やレスポンスの違いを手がかりに、隠された情報を推測できないか確認してみましょう。
Web-22. Secure Comment BoardのCSPバイパス
このコメント掲示板はContent Security Policy(CSP)で保護されており、スクリプトの実行元を自サイトと信頼済みCDNのみに制限しています。信頼されたCDNの中身まで安全とは限らない点に注目してみましょう。
Web-23. Secure Authentication Systemの型変換の罠
このログインポータルはフォームログイン・JSON API ログイン・検証コードチェックを備えています。管理者アカウントの本当のパスワードは分かりませんが、比較処理の実装次第では回避できるかもしれません。
Web-24. Secure Bankの競合状態を突く
Secure Bankではコイン残高を使ってショップで景品を購入できます。残高チェックと引き落とし処理が別々のステップで行われている場合、その間隙をどう突けるか考えてみましょう。