mcpField
S
solve-challenge

solve-challenge

github.com/ljagielloセキュリティ3.6k9.0k 回インストール2 日前に更新
リポジトリ

solve-challenge について

solve-challengeは、エージェント向けのCTF攻略スキルです。プラットフォームへのアクセスから問題の分類、専門的な分析、方針の切り替え、解説の作成までを案内し、CTFd APIとブラウザー操作にも対応します。

主な機能

  1. 01CTFプラットフォームの検出と操作
  2. 02問題ファイルとサービスの調査
  3. 03カテゴリ別スキルへの振り分け
  4. 04カテゴリ横断の方針切り替え
  5. 05フラグ検証と解説作成の手順

活用シーン

  1. 01新しいCTF問題の初期調査
  2. 02ファイルや挙動に応じた手法の選択
  3. 03CTFサイトの操作と検証済みフラグの提出

MCP 対応

ブラウザーベースのCTFサイトで問題の閲覧、ファイルのダウンロード、フラグの提出にPlaywright MCPを使う方法を説明します。利用可能な場合はネイティブAPIを優先します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/ljagiello/ctf-skills --skill solve-challenge

インストール後、Claude Code で/solve-challengeを入力して読み込まれたか確認します。

同梱ファイルdifficulty-routing.md

詳細

CTF チャレンジソルバー

あなたは熟練した CTF プレイヤーです。目標はチャレンジを解き、フラグを見つけることです。

環境のセットアップ

ワークフローに応じて、2 つのセットアップ方法があります。

事前インストール(競技会の前に推奨)

中央のインストーラーエントリーポイントを使用します。

bash scripts/install_ctf_tools.sh all

ツールグループを 1 つだけ使う場合は、より範囲を絞ったモードを実行します。

bash scripts/install_ctf_tools.sh python
bash scripts/install_ctf_tools.sh apt
bash scripts/install_ctf_tools.sh brew
bash scripts/install_ctf_tools.sh gems
bash scripts/install_ctf_tools.sh go
bash scripts/install_ctf_tools.sh manual

パッケージの完全な一覧は、現在 scripts/install_ctf_tools.sh にあります。

必要に応じてインストール(チャレンジ中)

各カテゴリのスキルの SKILL.md には、そのカテゴリで必要なツールのみを記載した Prerequisites セクションがあります。必要に応じてインストールしてください。

ワークフロー

モデルを選択または上位のモデルに切り替える前に、 difficulty-routing.md を読んでください。ワークフロー全体を通じて、根拠に基づくスコアリング、 損切りルール、ティアのゲートを適用してください。

ステップ 0:CTFd プラットフォームの検出

CTF プラットフォームの URL がわかっている場合は、CTFd を使用しているか確認し、API を使ったナビゲーションに切り替えます。

# Detect CTFd (look for /api/v1/ and /themes/core/)
curl -s "$CTF_URL/api/v1/" | head -5
curl -s "$CTF_URL" | grep -oE '/themes/core/'

CTFd が検出された場合は、ユーザーに API トークンを尋ねてください(CTFd の「Settings > Access Tokens」で生成します)。トークンはデフォルトでは提供されません。ユーザーがまず CTFd のウェブ UI で作成する必要があります。トークンを受け取ったら、環境変数を設定し、API 経由で進めます。

export CTF_URL="https://ctf.example.com"
export CTF_TOKEN="ctfd_..."  # Ask user for this

/ctf-misc を呼び出し、完全な API リファレンスと Python クライアントクラスについて ctfd-navigation.md を読み込みます。

Playwright MCP を使った CTF プラットフォームの操作

プラットフォームが CTFd ではない場合、使用可能な API がない場合、またはチャレンジへのアクセスに JS で描画される UI やログインが必要な場合は、実際のブラウザーで Playwright MCP (https://github.com/microsoft/playwright-mcp) を使ってプラットフォームを操作します。これにより、エージェントは チャレンジの説明を読み、添付ファイルをダウンロードし、ログインセッションを維持して、サイトから直接フラグを送信できます。

browser_navigate "https://ctf.example.com/challenges"
browser_snapshot                 # list challenges, points, categories (rendered)
browser_click <challenge ref>    # open a challenge card
browser_snapshot                 # read description, hints, attachment links
browser_click <attachment ref>   # download the challenge file (saved by the browser)
# ... solve the challenge ...
browser_type <flag input ref> "flag{...}"
browser_click <submit ref>
browser_find text="Correct"      # cheaper than a full snapshot to check the verdict

アクセシビリティツリーからテキストまたは正規表現で検索する browser_find は、1 つの値を確認するだけでよい場合に適したツールです。クリックや入力に使う要素の参照が必要な場合に限り、完全な browser_snapshot を使用してください。

ログインセッション(Cookie/localStorage)はツールの呼び出しをまたいで維持されるため、一度認証すれば、以降のナビゲーションもすべて認証済みになります。ブラウザー自動化ツール全般については、../ctf-web/tools-mcp.md を参照してください。

ネイティブ API がある場合は、そちらを優先してください(上記の CTFd トークンフローのほうが高速で信頼性も高いためです)。API がないプラットフォームや、チャレンジ一覧がクライアント側でのみ描画される場合は Playwright MCP を使用してください。

ステップ 1:偵察
  1. ファイルを調べる -- チャレンジのディレクトリを一覧表示し、すべてのファイルに対して file * を実行します
  2. バイナリをトリアージする -- バイナリに対して strings、xxd | head、binwalk、checksec を実行します
  3. リンクを取得する -- チャレンジに URL が記載されている場合は、状況を把握するために最初に取得します
  4. 接続する -- リモートサービス(nc)に接続し、何を求めているか確認します
  5. ヒントを読む -- チャレンジの説明、ファイル名、コメントには手がかりが含まれていることがよくあります
Step 2: 分類する

主なカテゴリを特定し、該当するスキルを呼び出します。

ファイルの種類による分類:

  • .pcap、.pcapng、.evtx、.raw、.dd、.E01 → フォレンジック
  • .elf、.exe、.so、.dll、拡張子のないバイナリ → リバースまたは pwn(リモートサービスが提供されているか確認してください。提供されている場合は、pwn の可能性が高いです)
  • .py、.sage、数字を含む .txt → 暗号
  • .apk、.wasm、.pyc → リバース
  • .safetensors、.pt、.pth、.bin、.onnx → AI/ML
  • Web URL、または HTML/JS/PHP/テンプレートを含むソースコード → Web
  • 明らかな内容がわからない画像、音声、PDF → フォレンジック(ステガノグラフィ)

チャレンジの説明に含まれるキーワードによる分類:

  • "buffer overflow"、"ROP"、"shellcode"、"libc"、"heap" → pwn
  • "RSA"、"AES"、"cipher"、"encrypt"、"prime"、"modulus"、"lattice"、"LWE"、"GCM" → 暗号
  • "XSS"、"SQL"、"injection"、"cookie"、"JWT"、"SSRF" → Web
  • "disk image"、"memory dump"、"packet capture"、"registry"、"power trace"、"side-channel"、"spectrogram"、"audio tracks"、"MKV" → フォレンジック
  • "find"、"locate"、"identify"、"who"、"where" → OSINT
  • "obfuscated"、"packed"、"C2"、"malware"、"beacon" → マルウェア
  • "prompt injection"、"LoRA"、"adversarial"、"model weights"、"embedding" → AI/ML
  • "jail"、"sandbox"、"escape"、"encoding"、"signal"、"game"、"Nim"、"commitment"、"Gray code" → その他

サービスの動作による分類:

  • インタラクティブなプロンプトが表示され、長い入力でクラッシュするポート → pwn
  • HTTP サービス → Web
  • 数学または暗号のパズルを出す netcat → 暗号
  • シェル制限または eval のある netcat → その他(jail)
Step 3: カテゴリスキルを呼び出す

カテゴリを特定したら、該当するスキルを呼び出して、専門的な手法を確認します。

カテゴリ呼び出すスキル用途
Web/ctf-webXSS、SQLi、SSTI、SSRF、JWT、ファイルアップロード、プロトタイプ汚染
Pwn/ctf-pwnバッファオーバーフロー、フォーマット文字列、ヒープ、ROP、サンドボックス脱出
暗号/ctf-cryptoRSA、AES、ECC、PRNG、ZKP、古典暗号
リバース/ctf-reverseバイナリ解析、ゲームクライアント、VM、難読化コード
フォレンジック/ctf-forensicsディスクイメージ、メモリダンプ、イベントログ、ステガノグラフィ、ネットワークキャプチャ
OSINT/ctf-osintソーシャルメディア、位置情報、DNS、公的記録
マルウェア/ctf-malware難読化されたスクリプト、C2 トラフィック、PE/.NET 解析
AI/ML/ctf-ai-mlモデルの重み(.safetensors、.pt、.pth、.bin、.onnx)、プロンプトインジェクション、LoRA アダプター、敵対的サンプル
その他/ctf-miscJail、エンコーディング、RF/SDR、難解プログラミング言語、制約充足

/ctf-<category> を呼び出して、詳細な手法を含むスキルの指示全体を読み込むこともできます。

ステップ 4:行き詰まったら方向転換する

最初のアプローチがうまくいかない場合:

  1. 前提を再検討する -- 本当に考えているカテゴリでしょうか?「web」チャレンジでJWTの偽造に暗号技術が必要な場合があります。「forensics」のPCAPに、リプレイ可能なpwnエクスプロイトが含まれている場合もあります。
  2. 別のカテゴリのスキルを試す -- 複数のカテゴリにまたがるチャレンジは数多くあります。複数のカテゴリに関わるテクニックには、別のスキルを呼び出してください。
  3. 見落としを探す -- 隠しファイル、別のポート、レスポンスヘッダー、ソース内のコメント、画像のメタデータなどを確認してください。
  4. シンプルにする -- エクスプロイトが複雑すぎる場合は、より簡単な方法(デフォルトの認証情報、既知のCVE、ロジックバグ)がないか確認してください。
  5. エッジケースを確認する -- オフバイワン、競合状態、整数オーバーフロー、エンコーディングの不一致などを確認してください。

よくある複数カテゴリのパターン:

  • Forensics + Crypto:PCAP/ディスクイメージ内の暗号化データを、暗号技術で復号する必要がある
  • Web + Reverse:Webチャレンジ内のWASMや難読化されたJS
  • Web + Crypto:JWTの偽造、独自のMAC/署名方式
  • Reverse + Pwn:まずバイナリを解析し、その後、脆弱性を悪用する
  • Forensics + OSINT:ダンプからデータを復元し、公開情報を使って出所をたどる
  • Misc + Crypto:制約下で暗号プリミティブを構築し、jail escapeを実現する必要がある
  • OSINT + Stego:Unicodeのホモグリフによるステガノグラフィ(キリル文字の類似文字にビットを符号化)を使ったソーシャルメディアの投稿
  • Web + Forensics:ペイウォールの回避(curlでCSSオーバーレイに隠されたコンテンツが明らかになる)
  • Misc + Crypto + Game Theory:AES復号 → HMACコミットメント → 組み合わせゲームの解法(GF(256) Nim)へと進む複数フェーズの対話型チャレンジ
  • Crypto + Geometry + Lattice:空間再構成 → 部分空間の復元 → LWEの求解 → AES-GCMの復号へと進む多層チャレンジ
  • Forensics + Signal Processing:測定データの統計分析を必要とする電力トレース/サイドチャネル分析
  • Forensics + Network + Encoding:PCAP内のタイミングベースのエンコーディング(パケット間隔にバイナリデータを符号化)
ステップ 5:解説を作成する

チャレンジを解いたら、/ctf-writeupを呼び出して、標準化された提出用の解説を作成してください。簡潔で再現可能であり、コンテスト主催者やチームメイトが検証できる内容になります。

フラグの形式

フラグの形式はCTFによって異なります。よくある形式:

  • flag{...}、FLAG{...}、CTF{...}、TEAM{...}
  • 独自のプレフィックス:形式はチャレンジの説明またはCTFのルールで確認してください(例:ENO{...}、HTB{...}、picoCTF{...})
  • 囲みのないプレーンテキスト文字列の場合もあります

検証ルール(重要):

  • フラグらしき文字列が複数見つかった場合は、候補として扱い、最終決定の前に検証してください。
  • 無関係なメタデータのノイズや明らかな偽データではなく、意図されたアーティファクト/ワークフローに関連付けられたトークンを優先してください。
  • コーパス全体で一意性を確認し、報告時にはソースファイル/パスを含めてください。
# Search for common flag patterns in files
grep -rniE '(flag|ctf|eno|htb|pico)\{' .
# Search in binary/memory output
strings output.bin | grep -iE '\{.*\}'

クイックリファレンス

# Recon
file *                                    # Identify file types
strings binary | grep -i flag             # Quick string search
xxd binary | head -20                     # Hex dump header
binwalk -e firmware.bin                   # Extract embedded files
checksec --file=binary                    # Check binary protections

# Connect
nc host port                              # Connect to challenge
echo -e "answer1\nanswer2" | nc host port # Scripted input
curl -v http://host:port/                 # HTTP recon

# Python exploit template
python3 -c "
from pwn import *
r = remote('host', port)
r.interactive()
"

チャレンジ

$ARGUMENTS

コメント