チャレンジ一覧

絞り込みを解除

148 問 (6 / 7 ページ)

フォレンジック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★★★★★

Bug Bounty実践 - 脆弱性発見マスター

ライブアプリケーションを診断せず、固定の artifacts/bug-bounty/triage-report.json を解析してください。連鎖した脆弱性の報告は status が validated-chain で、chain に構成する finding の id が順番に並んでいます。構成する finding がすべて validated の連鎖だけが、認められた本物です。その chain の順に各 finding の proof_fragment をつなぎ、Base64 デコードするとフラグになります。

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

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

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

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

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

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

基礎スキルLevel 5★★★★★

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 のメッセージはおとりです。

基礎スキルLevel 5★★★★★

アンチフォレンジック - 痕跡消去

攻撃者は侵入後に証拠隠滅を試み、`/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` には証拠隠滅のコマンドが残っています。

基礎スキルLevel 5★★★★★

カスタムマルウェア - ステルス技術

実行可能なマルウェア、注入、回避機能は含みません。不活性な設定サンプル artifacts/malware/sample-config.txt を解析してください。[loader] の active_campaign と campaign が一致し、build が release の [config] ブロックが、実際に使われる設定です。その blob_b64 を Base64 デコードし、各バイトを同じブロックの xor_key(1バイト)と XOR すると難読化が外れ、フラグになります。

基礎スキルLevel 5★★★★★

クラウドペンテスト - AWS 多段攻撃

AWS資格情報、metadata endpoint、Lambdaは使いません。ローカルの artifacts/aws/cloudtrail-chain.jsonl(模擬 CloudTrail、1行1イベント)を解析してください。攻撃者は SSRF で web-ec2-role のセッションを得て、そこから AssumeRole でロールを乗り継ぎました。成功した(errorCode の無い)AssumeRole をたどって最後に到達したセッションが成功させた GetSecretValue の、responseElements.secretBinary を Base64 デコードするとフラグになります。途中のセッション、同じロールの別のセッション、無関係なロールの読み出しはおとりです。

基礎スキルLevel 5★★★★★

コンテナエスケープ - 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 デコードするとフラグになります。

基礎スキルLevel 5★★★★★

サプライチェーン攻撃 - 依存関係の悪用

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 で隠したコードを実行する。片方だけを満たすパッケージはおとりです。ファイルはすべて静的なテキストで、実際のインストールや攻撃は不要です。

ネットワークLevel 5★★★★★

ネットワーク解析 - IPv4重複フラグメントの再構築

fragments.pcapのIPv4 ID 0xbeefのUDPデータグラムは、重複するフラグメントで一部のデータが上書きされています。到着順で後着断片を優先して再構築し、UDPペイロードのBase64データからフラグを復元してください。

フォレンジック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★★★★★

ピボッティング - 多段ネットワーク侵入

route、tunnel、proxy、remote serviceを作成せず、記録済みの artifacts/pivot/topology.json を解析してください。あなたは start のホスト(dmz-audit)にいます。links のうち action が allow で port が 22 のものだけを使って、ホストからホストへ SSH で乗り移れます(何段でも可)。乗り移れるホストのどれかから、そのサービスのホストとポートの両方に一致する allow の link があるサービスだけが届きます。届く唯一のサービスの response_b64 を Base64 デコードした HTTP 応答の本文がフラグです。

基礎スキルLevel 5★★★★★

ファジング入門 - 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 を文字列に戻すとフラグになります。

プログラミング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 '<答え>' に渡します。正しいときだけフラグが表示されます。

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

プログラミング - IoTファームウェアの解析

起動のたびに乱数で作られたネットワークカメラのファームウェアイメージ firmware.bin を解析します(実行コードは含まれません)。形式は、先頭に `KFW2`(4バイト)、パーティション数(uint16)、パーティション表(name: 16バイト(NUL 埋め)、offset・size・crc32: 各 uint32。数値はすべてビッグエンディアン)、本体の順です。CRC32 が一致しないパーティションは壊れているか古いものです。`bootinfo` にはシリアル番号(`serial=...`)が平文で入っており、`config` は設定テキストを zlib で圧縮し、SHA-256(シリアル番号の文字列 + b"config") のダイジェストを繰り返し XOR したものです。名前がちょうど `config` で CRC32 が一致するパーティションに書かれた `admin_token` の値(16進32桁)が答えです。工場出荷時の既定値やバックアップの古い値は、いま有効な値ではありません。答えを `python3 challenge.py '<答え>'` に渡すと、正解のときだけフラグが表示されます。

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

プログラミング - カバレッジ誘導ファジング

起動のたびに乱数で作られたカバレッジ誘導ファザーの実行記録 coverage-queue.jsonl を解析します(対象プログラムは実行しません)。各行は `{"id": ..., "t": ..., "edges": [{"edge": ..., "hits": ...}, ...]}` の形で、行の順番は処理した順ではありません。エントリを t の昇順に1件ずつ処理し、各 edge のヒット数をバケット(1 / 2 / 3 / 4–7 / 8–15 / 16–31 / 32–127 / 128以上)に分けます。そのエントリの (edge, バケット) の組のうち、それまでに見たことのない組が1つでもあれば、そのエントリをコーパスに保存します(保存したかどうかにかかわらず、組はすべて「見た」ことにして次へ進みます)。保存されたエントリの id を処理した順に `-` でつないだもの(例: `1a2b3c-4d5e6f-...`)が答えです。答えを `python3 challenge.py '<答え>'` に渡すと、正解のときだけフラグが表示されます。

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

プログラミング - ゼロクリック通信の解析

messages.ndjson は起動のたびに乱数で作られる、メッセージアプリの通信記録です(/challenge にあります)。1行が1つの断片(message_id、frag_index、frag_count、payload_hex)で、断片は複数のメッセージが混ざっています。同じ message_id の断片を frag_index の順につなぎ、SHA256(message_id) の先頭4バイトを鍵に繰り返し XOR で復号すると、TLV(type 1バイト、長さ 2バイト big-endian、値)の並びになります。宣言された長さが残りのバイト数を超える TLV を含むメッセージが、パーサーを狙った攻撃です。攻撃メッセージのその TLV の中にある stage2=<16桁の16進> の値を、message_id の昇順に - でつないだ文字列を python3 challenge.py '<答え>' に渡すとフラグが表示されます(正しい長さの TLV にある stage2= は攻撃ではありません)。

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

プログラミング - タイミング攻撃データの解析

timings.csv は起動のたびに乱数で作られる、タイミング攻撃の生の測定値です(/challenge にあります)。秘密の16進文字列を1文字ずつ比較するサーバーに対して、各位置(position)で候補の文字(candidate、0〜f)を送ったときの応答時間(sample_us、マイクロ秒)が、各位置・各候補に複数回ずつ記録されています。正しい文字のときだけ応答がわずかに遅くなりますが、測定には雑音があり、ときどき大きな外れ値も混ざります。各位置で本当に遅い候補を選び、position 0 から順につないだ秘密の16進文字列を python3 challenge.py '<答え>' に渡すとフラグが表示されます。

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

プロセスホロウイング攻撃を検出せよ

Windows ホストのメモリから、プロセス一覧 `process_list.txt`(PEB の見え方)、VAD の一覧 `vad_regions.txt`、プライベートな実行可能領域のダンプ `malfind/` を復元しました。プロセスホロウイングされたプロセスを特定し、そのイメージベースにあるインプラントの設定ブロックからフラグを復元してください。 RWX の領域は、JIT・Defender のスキャン領域・別のプロセスへの DLL 注入など、正規やおとりの領域にも多数あります。設定ブロックは、先頭が `KCFG`、続いて鍵の長さ(1バイト)、鍵、暗号文の長さ(2バイト、リトルエンディアン)、暗号文で、暗号文は鍵を繰り返した XOR です。ほかの領域にも同じ形式のブロックがあります。