competition-zip-archive について
`$ctf-sandbox-orchestrator` が分析環境を整えた後に使う、暗号化 ZIP/PKZIP の CTF 分析スキルです。盲目的なパスワード総当たりではなく、既知平文から従来型 ZipCrypto の内部キーを復元し、解除したコピーの検証と証拠保存を行います。
主な機能
- 01アーカイブ形式と暗号方式の確認
- 02正確な既知平文の特定
- 03bkcrack による内部キーの復元
- 04暗号化解除コピーの作成と検証
- 05コマンド、ハッシュ、証拠の記録
活用シーン
- 01予測可能なファイル内容を使った ZIP エントリーの解除
- 02圧縮方式が平文一致に与える影響の確認
- 03解除したアーカイブの検証と対象ファイルの抽出
- 04適切な既知平文がない場合の別経路への引き継ぎ
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ zhaoxuya520/ reverse-skill --skill competition-zip-archiveインストール後、Claude Code で/competition-zip-archiveを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlreferences/zip-archive.md
詳細
競技用 ZIP アーカイブ
このスキルは、$ctf-sandbox-orchestrator が有効になっており、サンドボックスの前提、証拠の優先順位、分析プロジェクトのルートが確立された後にのみ、下流の専門化として使用してください。まだそれが行われていない場合は、まず $ctf-sandbox-orchestrator に戻ってください。
このスキルは、決定的な経路がアップロードパーサーや汎用の暗号ブロブではなく、暗号化された ZIP/PKZIP アーカイブである場合に使用します。チャレンジが予測可能なファイル、フォーマットヘッダー、テンプレート、その他復元可能な平文を提供している場合は、レガシーな ZipCrypto の既知平文経路を優先してください。盲目的なパスワードブルートフォースから始めないでください。
ユーザーが明示的に英語を要求しない限り、簡体字中国語で返信してください。コマンドとツールの出力は元の形式のままにしてください。
クイックスタート
- 元のアーカイブを保全し、ハッシュを計算し、分析プロジェクトの
work/<case>/ディレクトリ配下のコピーで作業します。 - パスワード攻撃を試みる前に、実際のアーカイブ形式を確認し、エントリを一覧表示します。
- そのエントリがレガシーな ZipCrypto を使用しているかどうかを判断します。
bkcrackは WinZip AES やその他の現代的な暗号化を復元しません。 - 正確な既知平文候補を構築します。この攻撃には少なくとも 12 バイトの既知平文が必要で、そのうち少なくとも 8 バイトが連続している必要があります。
bkcrackで内部キーを復元し、その後、暗号化されていないコピーを作成して展開します。- コマンド、エントリ名、既知平文の出典、復元されたキー、出力ハッシュ、最終的なフラグを証拠として保全します。
ツールのセットアップ
実行ファイルの場所を推測する前に、通常のツールインデックスとブートストラップ経路を使用してください:
powershell -NoProfile -ExecutionPolicy Bypass -File skills/scripts/refresh-tool-index.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File skills/scripts/bootstrap-reverse.ps1 -Capability bkcrack
Kali では、同等のケイパビリティコマンドを使用してください:
bash kali/scripts/bootstrap-reverse.sh bkcrack
Windows のケイパビリティは v1.8.1 リリースに固定されており、GitHub アセットのダイジェストを検証します。ツールを手動でインストールした場合は、その後 skills/tool-index.md を更新してください。
ワークフロー
1. アーカイブの真実を確立する
元のファイルを不変のまま保ち、以下を記録します:
sha256sum challenge.zip
file challenge.zip
bkcrack -L challenge.zip
Windows では、sha256sum の代わりに Get-FileHash を使用します。bkcrack -L はエントリ名、圧縮方式、暗号化状態を表示します。.zip 拡張子だけから暗号化の種類を推測しないでください。
既知平文を提供するエントリを確認します。有用な候補は、PNG、PDF、テキストテンプレート、チャレンジ生成の設定など、ストアされているか、その他の方法で予測可能なファイルです。ローカルの ZIP ヘッダー (PK\x03\x04) はアーカイブエントリのメタデータであり、暗号化されたメンバー内の平文ではないため、それ自体は有用な既知平文サンプルではありません。
2. 既知平文でキーを復元する
暗号文エントリが flag.txt で、一致する平文エントリが known.zip 内にある場合:
bkcrack -C challenge.zip -c flag.txt -P known.zip -p flag.txt
生の暗号文ファイルと平文ファイルの場合:
bkcrack -c cipherfile -p plainfile
平文は、暗号化されたエントリ内に表現されているバイトと一致している必要があります。エントリが deflate されていた場合、そのファイルの非圧縮コピーが自動的に正しい入力になるわけではありません。一致する ZIP フィクスチャまたは正確な圧縮済みバイトを使用してください。
既知のバイトがオフセットから始まる場合は、-o <offset> を追加します。連続しているのが 8~11 バイトだけの場合は、スパースヒントを使って他の既知のバイトと組み合わせます:
bkcrack -c cipherfile -p plainfile -x 25 4b4f -x 30 21
成功した実行では、3 つの内部 ZipCrypto キーが得られます。表示されたとおりに正確に記録してください。それらは元のパスワードではありません。
3. ロックを解除して検証する
復元されたキーを使用して新しいアーカイブを作成し、元のファイルには手を付けないでください:
bkcrack -C challenge.zip -k K0 K1 K2 -D unlocked.zip
7z t unlocked.zip
7z x unlocked.zip -ounpacked
K0 K1 K2 は、bkcrack が出力した 16 進数の値に置き換えてください。出力をアーカイブテストコマンドと、ハッシュまたは正確なフラグ比較で検証します。生のメンバーが 1 つだけ必要な場合は、-d でその復号されたバイトを書き出せます。deflate された生データには、bkcrack に同梱されている inflate.py ヘルパーが必要になる場合があります。
4. 前提条件が満たされない場合の再ルーティング
- WinZip AES またはその他の最新の暗号化モード: このパスを中止し、チャレンジ固有のプリミティブを特定します。
- 信頼できる既知平文がない: パスワード復元を検討する前に、ファイル名、メタデータ、圧縮の選択、チャレンジの出所、その他のエントリを調査します。
- 既知平文が必要長より短い: より長い連続バイトを見つけるか、証拠に基づくスパースオフセットを使用します。
- 問題がアプリケーションのアップロード/パーサーチェーンである:
$competition-file-parser-chainに引き継ぎます。 - 問題がアーカイブ抽出後の汎用暗号文またはカスタム暗号である:
$competition-crypto-mobileに引き継ぎます。
保存すべき証拠
- 元のパスと作業コピーのパス、および SHA-256 ハッシュ
bkcrack -Lの出力と、選択した暗号化メンバー- 正確な平文フィクスチャ、圧縮方式、オフセット、およびスパースバイトのヒント
- 鍵復元コマンドと、復元された 3 つの内部鍵
unlocked.zipの検証出力、抽出パス、および最終成果物のハッシュ
判断表と証拠チェックリストについては references/zip-archive.md をお読みください。