チャレンジ一覧
暗号解析 - RSAのWiener攻撃
組み込み機器の開発チームが、復号を速くするためRSAの秘密指数dをとても小さくして鍵を作りました。public_key.txtの公開指数eはnと同じくらい大きな数です。e/nの連分数展開からdを求めて ciphertext.txt を復号し、フラグを取り出してください。
暗号解析 - 線形合同法の内部状態の復元
あるサービスは、セッショントークンも暗号化の鍵ストリームも、パラメーターa, c, mが秘密の線形合同法 x_{k+1} = (a×x_k + c) mod m から作っていました。tokens.txtの連続した10個の出力からa, c, mを復元し、続きの出力を8バイトずつ並べた鍵ストリームで暗号化された secret.enc.hex を復号して、フラグを取り出してください。
破損した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 は使いません(ファイルとして扱います)。
複数のログを統合して攻撃シナリオを再構築せよ
`/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 のセッションも機密テーブルを読むため、攻撃者のセッションを見分ける必要があります。
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 は取引所・タイムスタンプサービスなどほかの利用者も使っています。身代金の資金の流れを追い、断片をつなげてメッセージ(フラグ)を復元してください。
IoTデバイスファームウェアから秘密鍵を抽出せよ
ネットワークカメラ KNC-CAM-2000 の更新ファイル `/home/ctfuser/evidence/firmware.bin` を解析します(実機には接続しません)。メーカーは rootfs を暗号化して配布し、復号はブートローダーが起動時に行います。ヘッダーとパーティション表の形式は `/home/ctfuser/README.md` にあります。 ファームウェアに入っている root ユーザーの SSH 秘密鍵のコメント欄にフラグがあります。ホスト鍵などほかの鍵や、ブートローダーにあるほかの鍵は、答えではありません。
ハイパーバイザーメモリから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)を答えてください。
プロセスホロウイング攻撃を検出せよ
Windows ホストのメモリから、プロセス一覧 `process_list.txt`(PEB の見え方)、VAD の一覧 `vad_regions.txt`、プライベートな実行可能領域のダンプ `malfind/` を復元しました。プロセスホロウイングされたプロセスを特定し、そのイメージベースにあるインプラントの設定ブロックからフラグを復元してください。 RWX の領域は、JIT・Defender のスキャン領域・別のプロセスへの DLL 注入など、正規やおとりの領域にも多数あります。設定ブロックは、先頭が `KCFG`、続いて鍵の長さ(1バイト)、鍵、暗号文の長さ(2バイト、リトルエンディアン)、暗号文で、暗号文は鍵を繰り返した XOR です。ほかの領域にも同じ形式のブロックがあります。
改ざんされたタイムスタンプを検出せよ
`/challenge/mft_timeline.csv` は NTFS の `$MFT` から書き出したタイムラインです。各ファイルの `$STANDARD_INFORMATION`(SI)と `$FILE_NAME`(FN)のタイムスタンプと、小さいファイルの常駐データ `resident_data`(16進)を含みます。攻撃者はマルウェア本体のタイムスタンプを SI だけ過去へ書き換えて(timestomping)隠しましたが、FN には本当の作成時刻が残っています。 マルウェアは、自分が置くファイルの常駐データを、そのファイルの本当の作成時刻(`FN_Born`)から作った鍵で暗号化します。鍵ストリームは SHA-256("<FN_Born の文字列そのまま>:<カウンタ>")(カウンタは0から始まる10進の文字列)を順に連結したもので、データと XOR します。同じマルウェアの、timestomp されていない他の検体も残っています。timestomp されたファイルの常駐データを復号してください。
暗号化されたiOSバックアップを復号せよ
暗号化iOSバックアップのパスワード検証を安全なiTunesメタデータfixtureで行います。実iPhoneや実バックアップは使用しません。Manifest.plistのダイジェストと候補パスワードを照合してパスワードを特定し、暗号化されたメッセージデータベースを復号してフラグを探してください。
暗号解析 - RSA e=3ブロードキャスト攻撃
broadcast.jsonには同じ平文をパディングなしRSA・e=3で3つの互いに素なmodulusへ暗号化した結果があります。中国剰余定理と整数立方根で平文を復元してください。
未知のLinuxカーネルバージョンのメモリプロファイルを作成せよ
社内で `CONFIG_RANDSTRUCT` を有効にしてビルドしたカーネルで動くサーバーの、物理メモリの一部 `/home/ctfuser/evidence/custom_kernel.dump` を解析します。構造体のメンバーの並びがビルドごとに変わるため、既製のプロファイルは使えません。`evidence/vmlinux`(System.map と pahole 形式の構造体定義)から `task_struct` と `mm_struct` の配置を読み取り、`init_task` からプロセスのリストをたどってください。アドレスの変換式は `/home/ctfuser/README.md` にあります。 端末から起動された攻撃者のツールが、カーネルスレッド(kworker)を装って常駐しています。ツールは自分の設定(コマンドライン引数)を、そのプロセスの `start_time`(8バイト、リトルエンディアン)の SHA-256(32バイト)を繰り返した鍵で XOR して持っています。引数の中の設定からフラグを復元してください。`evidence/profiles/` の既製プロファイルは、このカーネルのものではありません。
独自プロトコルのC&C通信を解読せよ
侵害された端末 10.20.4.88 の通信を、出口のプロキシが記録していました。`/challenge/beacon.log` は1行が1回の送受信で、`data=` は送受信したバイト列の Base64 です。大半は正規のテレメトリですが、1つのホストとの通信はマルウェア独自のバイナリプロトコルです。`/challenge/implant_decompiled.c` は、検体から復元したフレームの組み立てと暗号化の処理(逆コンパイル結果)です。 プロトコルを読み解き、攻撃者がコマンド `cat` で読み出して持ち出したトークンを復元してください。回線上で壊れて再送されたフレームがあります。これは攻撃の実行ではなく、記録済みの通信を解析する防御側の演習です。