チャレンジ一覧
断片化されたJPEGファイルを復元せよ
`/challenge/fragments/` に、メモリーカードの未割り当て領域から回収した 256 バイトのクラスタ(`clus_NNNN.bin`)があります。番号は元の並びと無関係で、別のカメラの写真やゴミも混ざっています。`index.txt` が指す持ち主(owner=kinoco-cam-07)の JPEG を、JPEG の構造(マーカーの長さ、DRI と RSTn、EOI)から組み直してください。COM コメントの `note_enc=` は、組み直したスキャンデータ(SOS ヘッダーの直後から EOI の直前まで。RSTn マーカーとバイトスタッフィングはそのまま含む)の SHA-256 を小文字16進にした文字列を材料に、SHA-256(`<その文字列>:<カウンタ>`)(カウンタは 0,1,2... の10進数)を連ねた鍵ストリームで、メモを XOR して16進にしたものです。メモを復号してフラグを取得してください。
暗号化通信 - GPG公開鍵暗号
GnuPG の復号を練習します。`/challenge/keys/` にある秘密鍵をすべてインポートし、`/challenge/messages/` の各暗号文を復号してください。フラグを含む平文になるのは、本物の受信者鍵で暗号化された1通だけです。他は無害な業務連絡のおとりで、宛先鍵IDの突合でも一意に絞れます。本物の GnuPG が非特権環境で動作します。
破損したRAID5アレイを復元せよ
ファイルサーバー fs01 の RAID5 アレイ `/dev/md0`(4台構成)が、メンバー sdd の故障で組み上がらなくなりました。`~/evidence/` に、各メンバーのイメージ(`sdb.img`・`sdc.img`・`sde.img`、空の `sdd.img`、予備ベイにあった `sdf.img`)と、初動担当者のメモ `mdadm-examine.txt` があります。各イメージの先頭には key=value のヘッダー(NUL 詰め)があり、データ領域は `data_offset` から始まります。同じ世代のメンバーだけを使って、失われたメンバーのチャンクをパリティから復元し、チャンクを正しい順に並べて、財務共有にあった金庫のリカバリーメモを取り出してください。ブロックデバイスや mdadm は使いません(ファイルとして扱います)。
脆弱性スキャン - Nmap NSE 高度活用
社内サブネット `10.66.13.0/24` に `nmap -sV -sC --script vuln` を実行した結果が `/challenge/scan_results/nmap_scan.nmap`(通常形式)と `nmap_scan.gnmap`(grep 形式)にあります。ライブのターゲットは無く、レポートを読み解く問題です。NSE の vuln スクリプトの判定ブロックにはどれも `Finding ID: KINOCO{...}` が付いています。フラグは、`IDs:` が CVE-2020-1938(AJP の Ghostcat)で、かつ `State: VULNERABLE (Exploitable)` の判定ブロックの Finding ID です(1件だけ)。Ghostcat の LIKELY VULNERABLE / NOT VULNERABLE や、ほかの CVE の VULNERABLE (Exploitable) はおとりです。
複数のログを統合して攻撃シナリオを再構築せよ
`/challenge/web.log`、`/challenge/auth.log`、`/challenge/db.log` に、同じ侵入が多数の正規の通信に紛れて記録されています。Web への攻撃から認証の成功、データベースの機密テーブルの読み出しまでをたどり、持ち出された値からフラグを取得してください。db.log は機密テーブルの値を平文では記録せず、`value_enc`(16進)としてマスクしています。マスクは、`<セッションID>:<クライアントIP>:<端末ID>:<カウンタ>`(カウンタは 0,1,2... の10進数)の SHA-256 を連ねた鍵ストリームと値を XOR したものです。クライアント IP と端末 ID は db.log には出てきません(端末 ID は auth.log の login success の行にだけ出ます)。正規の DBA のセッションも機密テーブルを読むため、攻撃者のセッションを見分ける必要があります。
静的解析 - コード脆弱性スキャン
社内メモアプリのPythonソースコードが `/challenge/src/` にあります。前回の静的解析で指摘された9行には、行末に `# finding: KINOCO{...}` という指摘IDが付いていますが、ほとんどは偽陽性です。次の3条件をすべて満たす1行だけが本物のOSコマンドインジェクションで、その行の指摘IDがフラグです。(1) シェル経由で実行している(`subprocess.run(..., shell=True)` か `os.system(...)`)。(2) コマンド文字列に、HTTPリクエストから取った値(`request.args` / `form` / `json` / `values`)が入っている。(3) その値が途中で無害化・検証されていない(`shlex.quote`、許可リストでの確認、`int()` 変換などが無い)。指摘IDはどれも同じ形なので、grep で拾うだけでは決まりません。
APTシミュレーション - 完全侵入シナリオ
これは攻撃を実行する問題ではなく、発生済みインシデントのログを読むブルーチーム演習です。EDR・認証・ネットワーク機器から集約した統合タイムライン `/challenge/timeline.log` から、通常業務に紛れたAPTの各段階(初期侵入→権限昇格→横展開→データ持ち出し)を再構築してください。`tag=` は SIEM のルールに当たった印で、業務の操作にも付いています。大容量の外部送信(`event=OUTBOUND-TRANSFER`)にはすべて DLP の案件ID `dlp_case=KINOCO{...}` が付いており、フラグは次の2条件を両方満たす1件の案件IDです。(1) 送信先が、初期侵入で PowerShell が接続した外部アドレス(C2)である。(2) 送信元が、攻撃者が横展開で最後に到達したホストである。
APT攻撃の全ステージを再構築せよ
4つのログ `/challenge/edr_process.log`、`proxy_http.log`、`dns_queries.log`、`dlp_transfer.log` に、APT 攻撃が多数の正規の記録に紛れて残っています。攻撃者のイベントにラベルはありません。端末・ドメイン・ファイル・時刻を手がかりに、侵入から持ち出しまでを再構築し、持ち出されたデータの中にあるフラグを答えてください。 許可済みのペネトレーションテスト(端末 10.20.9.15)も同じ手口で記録されています。実際のインシデントのデータを復元してください。
BitLocker暗号化ドライブをクラックせよ
BitLocker復旧キーの検証を安全なメタデータfixtureで学びます。bitlocker.img は実ボリュームではありません。候補キーのSHA-256を記録済みダイジェストと照合して復旧キーを特定し、そのキーで保護ペイロードを復号してください。
Bitcoinトランザクションに隠されたメッセージを抽出せよ
被害者は身代金をビットコインアドレス `bc1qr4nsmw4r3pay7hzfx0d9cq3vkt8e6m5ljgs2ua` に支払いました。`/home/ctfuser/evidence/transactions.json` は調査期間のトランザクションをオフラインで書き出したものです(ブロックチェーンには接続しません。記録の並びはブロック順ではありません)。 攻撃グループは、資金を動かすたびに、トランザクションの OP_RETURN にメッセージの断片を残します。断片は、そのトランザクションが使った入力のトランザクションID(txid)から SHA-256 で作った鍵で XOR されています。OP_RETURN は取引所・タイムスタンプサービスなどほかの利用者も使っています。身代金の資金の流れを追い、断片をつなげてメッセージ(フラグ)を復元してください。
Bug Bounty実践 - 脆弱性発見マスター
ライブアプリケーションを診断せず、固定の artifacts/bug-bounty/triage-report.json を解析してください。連鎖した脆弱性の報告は status が validated-chain で、chain に構成する finding の id が順番に並んでいます。構成する finding がすべて validated の連鎖だけが、認められた本物です。その chain の順に各 finding の proof_fragment をつなぎ、Base64 デコードするとフラグになります。
IoTデバイスファームウェアから秘密鍵を抽出せよ
ネットワークカメラ KNC-CAM-2000 の更新ファイル `/home/ctfuser/evidence/firmware.bin` を解析します(実機には接続しません)。メーカーは rootfs を暗号化して配布し、復号はブートローダーが起動時に行います。ヘッダーとパーティション表の形式は `/home/ctfuser/README.md` にあります。 ファームウェアに入っている root ユーザーの SSH 秘密鍵のコメント欄にフラグがあります。ホスト鍵などほかの鍵や、ブートローダーにあるほかの鍵は、答えではありません。
Linux-eBPF Rootkit. 隠されたプロセスの正体を暴け
このチャレンジは、eBPFルートキット調査を安全なオフライン証拠解析として再現します。eBPFをロードせずに、提供されたbpftoolのスナップショットから実装(インプラント)のプログラムとマップを見分け、隠しファイルのパスを復元し、そこに保存された暗号化ペイロードをインプラント自身の鍵で復号してください。
Linux-カーネルエクスプロイト. Dirty COWで読み取り専用ファイルを書き換えろ
このチャレンジは、Dirty COW(CVE-2016-5195)で使われたmmap、MAP_PRIVATE、madviseという要素を、安全で決定的なユーザー空間シミュレーションとして扱います。提供されたプログラムをコンパイル・実行し、読み取り専用の元ファイルを変更せずに生成される結果を確認してください。
Red Teaming - カスタムC2フレームワーク
C2サーバー、agent、socket通信、コマンド実行は起動しません。ローカルの artifacts/c2/beacon-transcript.log を解析してください。beacon は1つのメッセージを複数の断片(frag=i/n)に分け、順不同で送っています。beacon=alpha かつ type=analysis-result のメッセージの断片を集め、frag の番号順に data をつないで Base64 デコードするとフラグになります。名前が似た beacon や type のメッセージはおとりです。
アンチフォレンジック - 痕跡消去
攻撃者は侵入後に証拠隠滅を試み、`/challenge/auth_syslog.log`(`kinoco-bastion01` の 2026-07-04 夜の一次ログ)のある時間帯を切り取り、シェル履歴を消しました。`rsyslogd` の行に、切り取られた gap の開始・終了時刻が残っています。未割当領域から復元した `/challenge/journal_recovered.txt` には、複数のホスト・複数の夜の記録が順不同で混ざり、audit の EXECVE 記録ごとにフラグの形をした `evidence-tag` が付いています。フラグは、一次ログと同じホスト・同じ日付で、gap の時間帯(開始以上・終了未満)に収まるただ1つの audit 記録の `evidence-tag` です。gap の直前・直後、別の夜の同じ時刻、別ホストの記録はおとりです。`/challenge/shell_history.txt` には証拠隠滅のコマンドが残っています。
カスタムマルウェア - ステルス技術
実行可能なマルウェア、注入、回避機能は含みません。不活性な設定サンプル artifacts/malware/sample-config.txt を解析してください。[loader] の active_campaign と campaign が一致し、build が release の [config] ブロックが、実際に使われる設定です。その blob_b64 を Base64 デコードし、各バイトを同じブロックの xor_key(1バイト)と XOR すると難読化が外れ、フラグになります。
クラウドペンテスト - AWS 多段攻撃
AWS資格情報、metadata endpoint、Lambdaは使いません。ローカルの artifacts/aws/cloudtrail-chain.jsonl(模擬 CloudTrail、1行1イベント)を解析してください。攻撃者は SSRF で web-ec2-role のセッションを得て、そこから AssumeRole でロールを乗り継ぎました。成功した(errorCode の無い)AssumeRole をたどって最後に到達したセッションが成功させた GetSecretValue の、responseElements.secretBinary を Base64 デコードするとフラグになります。途中のセッション、同じロールの別のセッション、無関係なロールの読み出しはおとりです。
コンテナエスケープ - Kubernetes特権昇格
Kubernetes API、host mount、特権コンテナ、escapeは利用しません。静的な artifacts/k8s/privileged-mount-audit.txt を読んでください。mounts の部分で、privileged=true、hostPath=/(ホストのルートそのもの)、readOnly=false の3つがそろった Pod が、ホストへ抜け出せる唯一の経路です。その Pod の evidence 行にある payload_b32 を Base32 デコードするとフラグになります。
サプライチェーン攻撃 - 依存関係の悪用
Node.js アプリ `kinoco-webapp` の依存関係の記録を監査します。`/challenge/dependencies.txt`(package.json の dependencies 部分)と `/challenge/install.log`(npm install の出力)があります。install.log では postinstall を実行したパッケージごとにブロックがあり、末尾の `ci-lifecycle-tracer: ... trace=KINOCO{...}` 行に CI のトレーサーが付けた trace があります。次の2条件を両方満たすパッケージは1つだけで、その trace がフラグです。(1) 名前が dependencies.txt にある別のパッケージ名と1文字だけ違う(1文字の追加・削除・置き換え、または隣り合う2文字の入れ替え)タイポスクワッティング。(2) postinstall が `registry.npmjs.org` 以外のホストと通信する、または base64 で隠したコードを実行する。片方だけを満たすパッケージはおとりです。ファイルはすべて静的なテキストで、実際のインストールや攻撃は不要です。
ハイパーバイザーメモリからVM情報を抽出せよ
KVM ホストのメモリダンプ `/home/ctfuser/evidence/kvm_host.dump` を解析します。ゲストは AMD SEV を模した設定でメモリが VM ごとの鍵で暗号化されていますが、このホストは KVM のデバッグビルドで動いており、ゲストの鍵がホスト側の構造体(kvm_sev_info)に残っていました。ダンプの形式とページの暗号化の方式は `/home/ctfuser/README.md` にあります。 対象は DB サーバーの VM `db-prod-02` です。QEMU のプロセスの記録から VM を特定し、VMCS・EPT・kvm_sev_info をたどってゲストのメモリを復号してください。ゲストのメモリ上に残っているシェルの履歴から、復元トークン(restore token)を答えてください。
ピボッティング - 多段ネットワーク侵入
route、tunnel、proxy、remote serviceを作成せず、記録済みの artifacts/pivot/topology.json を解析してください。あなたは start のホスト(dmz-audit)にいます。links のうち action が allow で port が 22 のものだけを使って、ホストからホストへ SSH で乗り移れます(何段でも可)。乗り移れるホストのどれかから、そのサービスのホストとポートの両方に一致する allow の link があるサービスだけが届きます。届く唯一のサービスの response_b64 を Base64 デコードした HTTP 応答の本文がフラグです。
ファジング入門 - 0-day 脆弱性発見
fuzzerやtarget binaryを実行せず、記録済みのクラッシュ一覧を解析してください。artifacts/fuzzing/triage.csv には各クラッシュの signature と判定(verdict)があり、artifacts/fuzzing/crashes/ には id ごとに最小化済みの入力(.min)と元の入力(.raw)があります。signature が SAFE_PARSER_ASSERT で verdict が confirmed のクラッシュについて、最小化済み入力(.min)の minimized_payload_hex を文字列に戻すとフラグになります。
プロセスホロウイング攻撃を検出せよ
Windows ホストのメモリから、プロセス一覧 `process_list.txt`(PEB の見え方)、VAD の一覧 `vad_regions.txt`、プライベートな実行可能領域のダンプ `malfind/` を復元しました。プロセスホロウイングされたプロセスを特定し、そのイメージベースにあるインプラントの設定ブロックからフラグを復元してください。 RWX の領域は、JIT・Defender のスキャン領域・別のプロセスへの DLL 注入など、正規やおとりの領域にも多数あります。設定ブロックは、先頭が `KCFG`、続いて鍵の長さ(1バイト)、鍵、暗号文の長さ(2バイト、リトルエンディアン)、暗号文で、暗号文は鍵を繰り返した XOR です。ほかの領域にも同じ形式のブロックがあります。