チャレンジ一覧

絞り込みを解除

180 問 (7 / 8 ページ)

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

バイナリ修復 - ファームウェアヘッダーとCRC32

firmware.bin の先頭4バイトを KINO に修復し、byte 12以降の CRC32 をリトルエンディアンで byte 8-11 に書き戻してください。修正ファイルを challenge.py に渡すと起動時注入 FLAG が表示されます。

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

プログラミング - C2通信の解析

起動のたびに乱数で作られた合成ログ beacon.log を解析します(ネットワーク接続は不要です)。複数の端末(セッション)の通信が時刻順に混ざっています。各セッションは最初の hello で nonce を送り、そのセッションの鍵は SHA-256(b"beacon-v1" + bytes.fromhex(nonce)) の先頭8バイトです。pulse の payload を seq の順につなぐと Base64 になり、それを復号して鍵で繰り返し XOR すると `task=... code=...` のような `キー=値` の平文になります(通信が途切れると同じ seq が再送されます)。task がちょうど `exfil` のセッションの code の値(16文字)が答えです。似た名前のタスクと取り違えないでください。答えを `python3 challenge.py '<答え>'` に渡すと、正解のときだけフラグが表示されます。

プログラミング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★★★★☆

暗号化通信 - GPG公開鍵暗号

GnuPG の復号を練習します。`/challenge/keys/` にある秘密鍵をすべてインポートし、`/challenge/messages/` の各暗号文を復号してください。フラグを含む平文になるのは、本物の受信者鍵で暗号化された1通だけです。他は無害な業務連絡のおとりで、宛先鍵IDの突合でも一意に絞れます。本物の GnuPG が非特権環境で動作します。

暗号Level 4★★★★☆

暗号解析 - DSA nonce再利用による秘密鍵復元

起動のたびに新しい鍵で作られる /challenge/signatures.json には、DSA の公開パラメーター(p は1024ビット、q は160ビット、g、y)、4つの署名(message, h, r, s。h は SHA-256(message) を整数にして mod q)、暗号化されたフラグ encrypted_flag_hex が入っています。4つの署名のうち2つは同じ nonce k を使っています。同じ r を持つ2つの署名から nonce k と秘密鍵 x を復元し、SHA256(str(x)) を繰り返した XOR 鍵で encrypted_flag_hex を復号してフラグを得てください。

暗号Level 4★★★★☆

暗号解析 - RSAのWiener攻撃

組み込み機器の開発チームが、復号を速くするためRSAの秘密指数dをとても小さくして鍵を作りました。public_key.txtの公開指数eはnと同じくらい大きな数です。e/nの連分数展開からdを求めて ciphertext.txt を復号し、フラグを取り出してください。

暗号Level 4★★★★☆

暗号解析 - 線形合同法の内部状態の復元

あるサービスは、セッショントークンも暗号化の鍵ストリームも、パラメーターa, c, mが秘密の線形合同法 x_{k+1} = (a×x_k + c) mod m から作っていました。tokens.txtの連続した10個の出力からa, c, mを復元し、続きの出力を8バイトずつ並べた鍵ストリームで暗号化された secret.enc.hex を復号して、フラグを取り出してください。

基礎スキルLevel 4★★★★☆

脆弱性スキャン - 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) はおとりです。

基礎スキルLevel 4★★★★☆

静的解析 - コード脆弱性スキャン

社内メモアプリの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 で拾うだけでは決まりません。

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

APTシミュレーション - 完全侵入シナリオ

これは攻撃を実行する問題ではなく、発生済みインシデントのログを読むブルーチーム演習です。EDR・認証・ネットワーク機器から集約した統合タイムライン `/challenge/timeline.log` から、通常業務に紛れたAPTの各段階(初期侵入→権限昇格→横展開→データ持ち出し)を再構築してください。`tag=` は SIEM のルールに当たった印で、業務の操作にも付いています。大容量の外部送信(`event=OUTBOUND-TRANSFER`)にはすべて DLP の案件ID `dlp_case=KINOCO{...}` が付いており、フラグは次の2条件を両方満たす1件の案件IDです。(1) 送信先が、初期侵入で PowerShell が接続した外部アドレス(C2)である。(2) 送信元が、攻撃者が横展開で最後に到達したホストである。

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

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

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

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★★★★★

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 デコードするとフラグになります。途中のセッション、同じロールの別のセッション、無関係なロールの読み出しはおとりです。