チャレンジ一覧
APIリクエスト - 最大利益取引の特定
コンテナの起動時に、株価API が http://localhost:9102 で動き始めます(server.py を起動する必要はありません)。5銘柄・約2000件の取引を GET /api/stocks と GET /api/stocks/<symbol> で取得し、sell_price - buy_price が最大の取引を1件だけ見つけて、その id を POST /api/check に {"id": "..."} の形で送ってください。正しい id のときだけ応答にフラグが含まれます。取引データは起動のたびに作り直されます。誤答は3回までで、超えるとそのコンテナでは正解でも受け付けられなくなります。
Bashスクリプト - 自動化の力
/app/numbers.txt には1から1000までの数字が1行に1つずつ書かれています。 この中から、以下の条件を満たす数字をすべて抽出し、その合計値を求めてください: 条件: - 3の倍数 かつ 5の倍数 - 7で割り切れない Bashスクリプトを作成して解いてください。 合計値がフラグになります。
Git探偵 - 失われたコミット
/app/repo はGitリポジトリです。 開発者が誤って重要な情報を含むコミットを削除してしまいました。 git reflog を使って削除されたコミットを見つけ、そのコミットメッセージに含まれるフラグを取得してください。 ヒント: git reflog で過去の操作履歴を確認できます
JSONマスター - データ抽出
/app/users.json には100人のユーザー情報がJSON形式で保存されています。 この中から以下の条件を満たすユーザーを抽出してください: - age が 25以上30以下 - country が "Japan" - is_active が true 該当するユーザーのメールアドレスをすべて抽出し、アルファベット順にソートした最初のメールアドレスを KINOCO{...} で包んだものがフラグです。 ヒント: jq コマンドを使用してください
OSINT基礎 - メタデータ解析
退職した社員の共有ドライブから回収したファイル群(写真 `IMG_*.jpg` と Office 文書)が `/challenge/evidence/` にあります。何人かの社員が個人用エクスポートツール `PhotoVault-ExportTool` を使っており、このツールで書き出した写真の Exif `Software` タグには `build-tag=KINOCO{...}` が残っています。フラグは、このツールで書き出され、かつ Exif の撮影者(`Artist`)が退職者本人である、ただ1枚の写真のビルドタグです。退職者は、引き継ぎ資料 `Handover_Notes.docx` を最後に保存した人物(docProps の `cp:lastModifiedBy`)です。`exiftool` はありませんが、`unzip` と同梱の `/challenge/exif_dump.py` で読めます。
Python演習 - Base64ストリームの一括デコード
起動のたびに作られる data.txt(約150行)の各行は Base64 です。1行ずつデコードし、結果が "b64:" で始まるときは、残りをさらに Base64 デコードします(何段か続く行があります)。デコードできない行(壊れた Base64、文字として読めないバイト列)は飛ばしてください。最後に "frag[i/8]=xxxx" の形になった行が本物の断片で、"old-frag[...]" や "test-frag[...]" などはおとりです。本物の断片の xxxx(4文字)を i の昇順につないだ32文字が答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python演習 - CSV売上データの条件抽出
起動のたびに作られる data.txt は売上 CSV(transaction_id,date,product_id,amount,status,ref,notes)です。amount が 10000 以上、status が completed(大文字・小文字も含めて完全一致)、product_id が SEC- で始まる、の3条件をすべて満たす取引は複数あります(条件を1つだけ満たさない紛らわしい行がたくさん混ざっています)。それらの ref 列を transaction_id の昇順に並べて '-' でつないだものが答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python演習 - JSONユーザーデータの複合検索
起動のたびに作られる JSON の data.txt({"users": [...]})を調べます。各ユーザーは id, name, email, role, active, token を持ちます。role が "admin"(完全一致)、active が true、email に "@secret.com" を含む、の3条件をすべて満たすユーザーは複数います(条件を1つだけ満たさない紛らわしいユーザーがたくさん混ざっています)。それらの token を id の昇順に並べて '-' でつないだものが答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python演習 - アクセスログから対象IPを追跡
起動のたびに作られる data.txt(約1300行)は Web サーバーのアクセスログです。192.168.1.100 のアクセスだけを取り出してください(192.168.1.10 や 192.168.1.101 など、似た IP のおとりが混ざっています)。この IP は "GET /notes?part=N&data=XXXX" で12個の断片を送っていますが、ステータスが 200 の行だけが有効で、404 や 500 は失敗した送信なので数えません。有効な data(4桁の16進)を part の昇順(時刻順ではありません)につないだ48文字が答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python自動化 - Base64の一括デコード
起動のたびに作られる data.txt(約150行)の各行は Base64 です。1行ずつデコードし、結果が "b64:" で始まるときは、残りをさらに Base64 デコードします(何段か続く行があります)。デコードできない行(壊れた Base64、文字として読めないバイト列)は飛ばしてください。最後に "frag[i/8]=xxxx" の形になった行が本物の断片で、"old-frag[...]" や "test-frag[...]" などはおとりです。本物の断片の xxxx(4文字)を i の昇順につないだ32文字が答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python自動化 - CSV売上データの抽出
起動のたびに作られる data.txt は売上 CSV(transaction_id,date,product_id,amount,status,ref,notes)です。amount が 10000 以上、status が completed(大文字・小文字も含めて完全一致)、product_id が SEC- で始まる、の3条件をすべて満たす取引は複数あります(条件を1つだけ満たさない紛らわしい行がたくさん混ざっています)。それらの ref 列を transaction_id の昇順に並べて '-' でつないだものが答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python自動化 - JSONユーザーデータの検索
起動のたびに作られる JSON の data.txt({"users": [...]})を調べます。各ユーザーは id, name, email, role, active, token を持ちます。role が "admin"(完全一致)、active が true、email に "@secret.com" を含む、の3条件をすべて満たすユーザーは複数います(条件を1つだけ満たさない紛らわしいユーザーがたくさん混ざっています)。それらの token を id の昇順に並べて '-' でつないだものが答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python自動化 - アクセスログの解析
起動のたびに作られる data.txt(約1300行)は Web サーバーのアクセスログです。192.168.1.100 のアクセスだけを取り出してください(192.168.1.10 や 192.168.1.101 など、似た IP のおとりが混ざっています)。この IP は "GET /notes?part=N&data=XXXX" で12個の断片を送っていますが、ステータスが 200 の行だけが有効で、404 や 500 は失敗した送信なので数えません。有効な data(4桁の16進)を part の昇順(時刻順ではありません)につないだ48文字が答えです。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
Python自動化 - パスワードハッシュのクラック
起動のたびに乱数で作られる data.txt(SHA-256 ハッシュ値の一覧)と wordlist.txt(小文字英数字4文字のトークン800語)を調べます。data.txt の各行は、おとり sha256(word)(word は wordlist.txt の1語)か、本物の断片 sha256("{i}:{chunk}")(i は 0 始まりの断片番号、chunk は wordlist.txt の1語)です。本物の行だけを見つけて i の昇順に chunk をつなぐと、24文字の答えになります。python3 challenge.py '<答え>' に渡すと、フラグが表示されます。
テキスト処理の達人 - sed & awk
/app/data.csv にはCSVデータが保存されています。 以下の処理を行ってください: 1. 2列目(価格)が1000以上の行のみを抽出 2. 3列目(商品名)に含まれる "_" をスペースに置換 3. 1列目(ID)の先頭に "PROD-" を追加 処理後のデータの最初の行に含まれる商品名がフラグです。 フォーマット: ID,価格,商品名
プログラミング - Bashジョブログの解析
/challenge/jobs.log は、コンテナの起動のたびに乱数で作り直される夜間バッチの実行ログです。1行が1回のジョブ実行で、key=value の欄が空白で区切られています。job が archive で status が ok の行だけを選び、part の番号順に value(16進文字列を逆順にしたもの)を元に戻してつなぎ、16進デコードしてアーカイブトークン(英小文字と数字)を求めてください。そのトークンを python3 challenge.py '<トークン>' に渡すと、正しいときだけフラグが表示されます。
プログラミング - PINの総当たり
/challenge/vault.json は、コンテナの起動のたびに乱数で作り直される金庫の記録です。salt(16進文字列)と、pin_hash = sha256(salt + pin)(salt と6桁の pin を文字列のまま連結して UTF-8 にしたもののハッシュ)が入っています。000000 から 999999 までを総当たりして pin_hash に一致する6桁の PIN(先頭の 0 も含む)を見つけ、python3 challenge.py '<PIN>' に渡してください。正しいときだけフラグが表示されます。
プログラミング - ハッシュ検証と復号
起動のたびに乱数で作られた証拠ファイル artifact-manifest.json を解析します。artifact(artifact_00 から artifact_09)ごとに複数のレコード(name・sha256・data)があり、正しいのは data を Base64 デコードした SHA-256 が sha256 欄と一致する1件だけです。正しいレコードの中身を SHA-256(name) のダイジェストで XOR 復号し、artifact 番号の順につないだ40文字(小文字英数字)が答えです。答えを `python3 challenge.py '<答え>'` に渡すと、正解のときだけフラグが表示されます。
プログラミング - バイナリTLVの解析
/challenge/capture.bin は、コンテナの起動のたびに乱数で作り直される独自形式のバイナリです。先頭4バイトは KBIN、続いて TLV レコード(type 1バイト、length 2バイト(ビッグエンディアン)、value)が並び、type 0x7F(長さ 0)が終端です。type 0x10 と 0x20 の value はそのまま、それ以外の value は各バイトを 0x5A で XOR して格納されています。type が 0x42 のレコードの value を、ファイルの中の順番どおりに取り出して 0x5A で XOR し、つないだトークン(英小文字と数字)を python3 challenge.py '<トークン>' に渡してください。正しいときだけフラグが表示されます。
プロセスハンター - 隠されたプロセス
バックグラウンドで "secret_service" という名前のプロセスが動作しています。 このプロセスを見つけて以下の情報を取得してください: 1. プロセスID (PID) 2. 実行ユーザー 3. コマンドライン引数 コマンドライン引数にフラグが含まれています。 ヒント: ps, pgrep, top などのコマンドを使用
ログ解析 - 侵入者を見つけろ
/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})。
圧縮の迷宮 - 多重圧縮ファイル
/app/flag.tar.gz は多重に圧縮されたファイルです。 解凍していくと、次の圧縮ファイルが出てきます: flag.tar.gz → flag.tar → flag.zip.bz2.gz → flag.zip.bz2 → flag.zip → flag.txt すべて解凍してflag.txtの内容を取得してください。 ヒント: file コマンドで圧縮形式を確認できます
正規表現 - 一度だけ出現する黄金の記号
data.txt から KINO-数字4桁-英大文字4文字の記号をすべて抽出し、一度だけ出現する値を challenge.py に入力してください。正解時に起動時注入 FLAG が表示されます。
正規表現マスター - ログファイル解析
/app/access.log には数千件のアクセスログが記録されています。 この中から、IPアドレスが「192.168.1.」で始まり、かつステータスコードが404のエントリをすべて抽出してください。 条件: - IPアドレス: 192.168.1.xxx - ステータスコード: 404 - 該当する行数がフラグになります ヒント: grep と正規表現を使用してください