チャレンジ一覧

絞り込みを解除

129 問 (5 / 6 ページ)

プログラミングLevel 4★★★★☆

プログラミング - バッファオーバーフロー・クラッシュ解析

起動のたびに乱数で作られたクラッシュ報告 crash_01.txt から crash_06.txt を解析します(実行可能なコードは含まれません)。各報告には、送った入力そのもの(input:)とクラッシュ時の命令ポインタ(32ビットは eip、64ビットは rip)が書かれています。入力には同じ4文字が2度現れない巡回パターン(英小文字)が使われ、先頭にコマンド名などの前置きが付くことがあります。signal が SIGSEGV で、かつ命令ポインタの値が送った入力のバイト列で上書きされている報告だけを対象に、その値(メモリ上ではリトルエンディアン)をバイト列に直し、入力の先頭を 0 としたとき何バイト目から始まるかを求めます。対象の報告のオフセットを報告番号の順に `-` でつないだもの(例: `52-140-88-203`)が答えです。答えを `python3 challenge.py '<答え>'` に渡すと、正解のときだけフラグが表示されます。

プログラミングLevel 4★★★★☆

プログラミング - ファジング結果の解析

起動のたびに乱数で作られたファジング結果のログ fuzz-results.log を解析します(入力は保存されているだけで、何も実行されません)。1行が1ケースで、`case=<6桁16進> result=<OK|TIMEOUT|CRASH> signal=<SIGSEGV|SIGABRT|-> stack=<8桁16進|-> input=<16進>` の形です。`signal=SIGSEGV` のクラッシュだけを対象に、stack(同じ stack は同じバグ)ごとにまとめ、入力(input の16進をバイトに直した長さ)が最も短いケースを選びます(同じ長さなら case の値が小さい方)。選んだケースの case を stack の値の昇順に `-` でつないだもの(例: `1a2b3c-4d5e6f-...`)が答えです。答えを `python3 challenge.py '<答え>'` に渡すと、正解のときだけフラグが表示されます。

プログラミングLevel 4★★★★☆

プログラミング - ブロックチェーンイベントの再構築

/challenge/blocks.json は、コンテナの起動のたびに乱数で作り直される、オフラインの開発用チェーンのブロック一覧です(順不同。フォークでできた、正規チェーンに入らない孤立ブロックを含みます)。height が最も大きいブロックから parent_hash をたどった正規チェーンのブロックにある、status が 1 の取引の Fragment イベントを (height, log_index) の順に並べ、data(0x の後ろ)をつないで16進デコードしたトークン(英小文字と数字)を求め、python3 challenge.py '<トークン>' に渡してください。正しいときだけフラグが表示されます。

プログラミングLevel 4★★★★☆

プログラミング - ルートキットのビュー差分

proc_ps.txt(ユーザー空間の ps の結果)と proc_kernel.txt(カーネルのタスクリストを直接たどった結果)は、起動のたびに乱数で作られます(/challenge にあります)。どちらも先頭行に取得時刻 snapshot_time(UNIX 秒)があり、2つは同時には取られていません。ps から隠されていたプロセスは、カーネル側にだけあり、かつ start_time が ps の取得時刻以前のものです(ps の後に起動したプロセスや、終了したプロセスは隠しプロセスではありません)。隠しプロセスの cookie(6桁の16進)を pid の小さい順(数値として)に - でつないだ文字列を求め、python3 challenge.py '<答え>' に渡すとフラグが表示されます。

プログラミングLevel 4★★★★☆

プログラミング - 異常リクエストの検出

/challenge/requests.csv は、コンテナの起動のたびに乱数で作り直される Web API のアクセス記録です(request_id, timestamp, path, status, latency_ms, bytes。行は時刻順ではありません)。API ごとに普段の応答時間は違うため、path ごとに latency_ms の平均と母標準偏差(statistics.pstdev)を求め、z = (latency_ms - その path の平均) / その path の母標準偏差 が 4 以上の行を異常とします(bytes は判定に使いません)。異常な行の request_id を timestamp の古い順に - でつないだもの(例: 1a2b3c-4d5e6f)を、python3 challenge.py '<答え>' に渡してください。正しいときだけフラグが表示されます。

プログラミングLevel 4★★★★☆

プログラミング - 診断結果の解析

findings.json は起動のたびに乱数で作られる診断結果です(/challenge にあります)。entry(edge-gw)、objective(vault)、ホストの一覧 hosts があり、各ホストの findings には id(6桁の16進)、cvss、exploitable、grants(その finding で移れるホスト)が入っています。ホストを掌握していると、そのホストの finding のうち exploitable が true かつ cvss が 7.0 以上のものだけを使って、grants のホストへ移れます。entry から objective までの最短の攻撃経路(一つに決まります)を求め、使った finding の id を経路の順に - でつないだ文字列を python3 challenge.py '<答え>' に渡すとフラグが表示されます。

プログラミングLevel 4★★★★☆

プログラミング - 非同期スキャン結果の解析

/challenge/scan-events.jsonl は、コンテナの起動のたびに乱数で作り直される、非同期ポートスキャナーのイベント記録です(行は順不同で、同じイベントが重複していることもあります)。state イベントは (host, port) ごとに t が最も大きいものが最終状態で、banner イベントは stream の中を seq の順につなぎ16進デコードすると1行のテキストになります。最終状態が open の 443/tcp を持つホストについて、443 のバナーから cert-fp=(8桁の16進)を取り出し、ホストの IP アドレスの数値順に - でつないだもの(例: 0a1b2c3d-4e5f6a7b)を、python3 challenge.py '<答え>' に渡してください。正しいときだけフラグが表示されます。

フォレンジックLevel 4★★★★☆

メモリからマルウェアのペイロードを抽出せよ

`/challenge/memstrings.txt` は、不審なプロセスのアドレス空間から取り出した文字列です。ローダーが展開した第2段ペイロード(Base64)が、おとりの文字列や Base64 に紛れています。`/challenge/malfind_region.txt` には、ファイルの裏付けが無い RWX 領域にある、ローダーのデコード処理の逆アセンブルと、同じ領域のデータ部の16進ダンプがあります。逆アセンブルからローダーが何をしているかを読み取り、第2段ペイロード(無害なドロッパーの記録で、何も実行しません)を復元して、campaign tag からフラグを取得してください。

フォレンジックLevel 4★★★★☆

メモリから隠されたカーネルモジュールを検出せよ

LKM ルートキットに感染した疑いのある Linux ホストのメモリから、モジュールの情報を3つ復元しました。`/challenge/modules_list.txt` はカーネルの modules 連結リスト(lsmod 相当)、`/challenge/sysfs_modules.txt` は `/sys/module/<name>/` の kobject とモジュールのアドレス情報、`/challenge/module_area.lime` は各モジュールのコア領域の先頭 8 KiB を LiME 形式(ヘッダー32バイト: magic, version, 開始アドレス, 終了アドレス, 予約)で並べたものです。連結リストから自身を外した隠しモジュールを特定し、その設定を取り出してフラグを取得してください。設定は、そのモジュールのコア領域の先頭から 0x200 バイト目に「長さ(2バイト、リトルエンディアン)+暗号化された本文」の形で置かれています。本文は、sysfs_modules.txt のそのモジュールの SrcVersion を材料に、SHA-256(`<SrcVersion>:<カウンタ>`)(カウンタは 0,1,2... の10進数)を連ねた鍵ストリームと XOR したものです。sysfs にしか無い名前には、組み込みコンポーネントやアンロード中のモジュールも混ざり、隠しモジュール以外にもおとりの設定を持つモジュールがあります。

フォレンジックLevel 4★★★★☆

多段階ステガノグラフィを解読せよ

`/challenge/cover.png` と `/challenge/notes.txt` に、3段階のステガノグラフィが仕掛けられています。各段階に、次の段階を読むための鍵(パスフレーズや符号の対応表)が入っていて、鍵は起動のたびに変わるため、途中を飛ばすことはできません。`cover.png` のピクセルの最下位ビット(先頭32ビットがバイト数)、PNG の `IEND` の後ろに付け足されたデータ、`notes.txt` に紛れたゼロ幅文字、の順にたどってフラグを取得してください。各段階におとりも混ざっています。

フォレンジックLevel 4★★★★☆

断片化された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進にしたものです。メモを復号してフラグを取得してください。

フォレンジックLevel 4★★★★☆

破損した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 は使いません(ファイルとして扱います)。

フォレンジックLevel 4★★★★☆

複数のログを統合して攻撃シナリオを再構築せよ

`/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 のセッションも機密テーブルを読むため、攻撃者のセッションを見分ける必要があります。

フォレンジックLevel 5★★★★★

APT攻撃の全ステージを再構築せよ

4つのログ `/challenge/edr_process.log`、`proxy_http.log`、`dns_queries.log`、`dlp_transfer.log` に、APT 攻撃が多数の正規の記録に紛れて残っています。攻撃者のイベントにラベルはありません。端末・ドメイン・ファイル・時刻を手がかりに、侵入から持ち出しまでを再構築し、持ち出されたデータの中にあるフラグを答えてください。 許可済みのペネトレーションテスト(端末 10.20.9.15)も同じ手口で記録されています。実際のインシデントのデータを復元してください。

フォレンジックLevel 5★★★★★

BitLocker暗号化ドライブをクラックせよ

BitLocker復旧キーの検証を安全なメタデータfixtureで学びます。bitlocker.img は実ボリュームではありません。候補キーのSHA-256を記録済みダイジェストと照合して復旧キーを特定し、そのキーで保護ペイロードを復号してください。

フォレンジックLevel 5★★★★★

Bitcoinトランザクションに隠されたメッセージを抽出せよ

被害者は身代金をビットコインアドレス `bc1qr4nsmw4r3pay7hzfx0d9cq3vkt8e6m5ljgs2ua` に支払いました。`/home/ctfuser/evidence/transactions.json` は調査期間のトランザクションをオフラインで書き出したものです(ブロックチェーンには接続しません。記録の並びはブロック順ではありません)。 攻撃グループは、資金を動かすたびに、トランザクションの OP_RETURN にメッセージの断片を残します。断片は、そのトランザクションが使った入力のトランザクションID(txid)から SHA-256 で作った鍵で XOR されています。OP_RETURN は取引所・タイムスタンプサービスなどほかの利用者も使っています。身代金の資金の流れを追い、断片をつなげてメッセージ(フラグ)を復元してください。

フォレンジックLevel 5★★★★★

IoTデバイスファームウェアから秘密鍵を抽出せよ

ネットワークカメラ KNC-CAM-2000 の更新ファイル `/home/ctfuser/evidence/firmware.bin` を解析します(実機には接続しません)。メーカーは rootfs を暗号化して配布し、復号はブートローダーが起動時に行います。ヘッダーとパーティション表の形式は `/home/ctfuser/README.md` にあります。 ファームウェアに入っている root ユーザーの SSH 秘密鍵のコメント欄にフラグがあります。ホスト鍵などほかの鍵や、ブートローダーにあるほかの鍵は、答えではありません。

LinuxLevel 5★★★★★

Linux-eBPF Rootkit. 隠されたプロセスの正体を暴け

このチャレンジは、eBPFルートキット調査を安全なオフライン証拠解析として再現します。eBPFをロードせずに、提供されたbpftoolのスナップショットから実装(インプラント)のプログラムとマップを見分け、隠しファイルのパスを復元し、そこに保存された暗号化ペイロードをインプラント自身の鍵で復号してください。

LinuxLevel 5★★★★★

Linux-カーネルエクスプロイト. Dirty COWで読み取り専用ファイルを書き換えろ

このチャレンジは、Dirty COW(CVE-2016-5195)で使われたmmap、MAP_PRIVATE、madviseという要素を、安全で決定的なユーザー空間シミュレーションとして扱います。提供されたプログラムをコンパイル・実行し、読み取り専用の元ファイルを変更せずに生成される結果を確認してください。

プログラミングLevel 5★★★★★

Python上級 - 並行イベントDAGの因果関係復元

events.jsonlには複数サービスとtraceのイベントがランダム順で混在しています。指定されたauth.failedイベントを根としてparent参照の因果DAGを辿り、到達可能なworker.decryptの断片を論理時刻順に連結してください。

フォレンジックLevel 5★★★★★

ハイパーバイザーメモリから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)を答えてください。

プログラミングLevel 5★★★★★

プログラミング - APTタイムラインの解析

/challenge/events.jsonl は、コンテナの起動のたびに乱数で作り直される、複数のホストから集めたセキュリティログを1つにまとめたものです(行は順不同)。ts は ISO 8601 ですが、収集元によってタイムゾーン(+09:00・-05:00・Z・+00:00)が違うので、UTC にそろえて比べます。rule が phishing-macro のアラートが出たホストが最初の侵害(侵害時刻はそのアラートの時刻)で、remote-logon の src がすでに侵害済みで、かつログオン時刻が src の侵害時刻より後なら、dst もそのログオン時刻に侵害されたとします(ログオンは時刻の順に処理します)。侵害されたホストで、そのホストの侵害時刻より後に起きた upload の chunk(8桁の16進)を、UTC の時刻順に区切りなしでつないだ16進文字列を、python3 challenge.py '<答え>' に渡してください。侵害前の upload や、侵害されていないホストの upload は含めません。正しいときだけフラグが表示されます。

プログラミングLevel 5★★★★★

プログラミング - AST静的解析による脆弱性検出

/challenge/corpus/*.py は、コンテナの起動のたびに乱数で作り直されるコードレビュー用の Python ソースです(実行しないでください)。各関数には @audit_id(6桁の16進)が付いています。subprocess.run または subprocess.Popen(import subprocess as sp、from subprocess import run、from subprocess import run as execute のような別名・名前での import を含む)を shell=True で呼び、かつ第1引数が文字列の定数ではない関数が「要修正」です。その audit_id を (ファイル名, 関数の行番号) の順に - でつないだもの(例: 1a2b3c-4d5e6f)を、python3 challenge.py '<答え>' に渡してください。正しいときだけフラグが表示されます。

プログラミングLevel 5★★★★★

プログラミング - AWS権限の解析

/challenge/iam.json にはユーザー・グループ・ポリシーが、/challenge/s3_objects.json には S3 オブジェクトの一覧(bucket・key・etag)があり、どちらもコンテナの起動のたびに乱数で作り直されます。ir-analyst に効くポリシー(AttachedTo が user/ir-analyst のものと、ir-analyst が属するグループのもの)を、README.md の規則(* は / を含む任意の文字列、? は任意の1文字、Action は大文字と小文字を区別せず Resource は区別する、適用される Statement に Deny が1つでもあれば拒否、Deny が無く Allow があれば許可、どれも無ければ拒否)で評価してください。ir-analyst が s3:GetObject できるオブジェクトの etag(8桁の16進)を、ARN(arn:aws:s3:::bucket/key)の文字列の昇順に - でつないだものを、python3 challenge.py '<答え>' に渡します。正しいときだけフラグが表示されます。