チャレンジ一覧

絞り込みを解除

86 問 (4 / 4 ページ)

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

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

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