mcpField
C
ctf-similar-search

ctf-similar-search

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

ctf-similar-search について

ctf-similar-searchは、Tavilyで類似するCTFチャレンジの解説を探すスキルです。キーワード検索とURLからのコンテンツ抽出に対応し、特定の課題に絞り込む検索方法を案内します。

主な機能

  1. 01関連するCTF解説の検索
  2. 02検索結果URLからの抽出
  3. 03簡潔なキーワード検索の指針
  4. 04抽出前の検索結果確認

活用シーン

  1. 01名前が分かるCTFチャレンジの解説を探す
  2. 02特徴的なコード片やエラーで検索
  3. 03分析用に有望な結果を抽出

インストール

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

$npx skills add https://github.com/ljagiello/ctf-skills --skill ctf-similar-search

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

同梱ファイルsearch.pysearch.sh

詳細

CTF 類似チャレンジの検索

Tavily API を使用して、類似する CTF チャレンジの解説を検索します。

前提条件

pip install requests tavily

実行する前に、Tavily API キー(https://tavily.com から取得)を設定してください。

export TAVILY_API_KEY='tvly-...'

API の概要

このスキルには 2 つのインターフェースがあります。

インターフェース目的コマンド
Tavily Search解説や記事を検索します./search.sh search <keyword>
Tavily ExtractURL からコンテンツを抽出します./search.sh extract <url1> [url2] ...

検索ワークフロー

ステップ 1:キーワードで検索する

利用可能な情報に基づいてキーワードを選びます。

シナリオ 1:大会名とチャレンジ名がわかっている場合
# Format: [Competition Name] [Challenge Name] — max 3 words
./search.sh search "DASCTF URL Storage"
./search.sh search "HGAME baby web"
./search.sh search "BUUCTF pwn1"
シナリオ 2:チャレンジ名のみがわかっている場合(大会情報なし)
# Use challenge name directly — max 3 words
./search.sh search "URL Storage"
./search.sh search "baby overflow"
./search.sh search "crypto-rsa"
シナリオ 3:固有の識別情報(コードスニペット、文字列)
# Use unique, non-trivial strings from the challenge — NO word limit
./search.sh search "def encrypt_flag(key): return base64"
./search.sh search "CUSTOM_MAGIC_BYTES"
./search.sh search "ERROR: invalid padding in AES block"
⚠️ 重要:コード以外のクエリは 3 語まで

コードスニペットや固有の識別子文字列ではないキーワード検索は、3 語を超えてはいけません。 この制約により、クエリの精度と焦点が保たれ、広範で曖昧な検索ではなく、関連性の高い CTF 解説を検索できます。

検索タイプ語数制限例
大会名+チャレンジ名≤ 3 語"DASCTF URL Storage"、"HGAME baby web"
チャレンジ名のみ≤ 3 語"URL Storage"、"baby overflow"
コードスニペット/文字列制限なし"def encrypt_flag(key): return base64"
エラーメッセージ/識別子制限なし"CUSTOM_MAGIC_BYTES"、"ERROR: invalid padding in AES block"

大会名+チャレンジ名で検索する場合は、不要な語(年、"CTF"、"competition"、"writeup"、"solution")を除き、最も特徴的な 3 語だけを残します。

  • ❌ "HGAME 2024 baby web challenge"(5 語)
  • ✅ "HGAME baby web"(3 語)
  • ❌ "DASCTF 2023 URL Storage writeup"(5 語)
  • ✅ "DASCTF URL Storage"(3 語)
  • ❌ "PlaidCTF 2025 zero day exploit solution"(6 語)
  • ✅ "PlaidCTF zero day"(3 語)

コード/文字列で検索する場合は、固有のスニペット全体を使用します。これらは語数制限の対象外です。

  • ✅ "def xor_encrypt(data, key):"(コード — 制限対象外)
  • ✅ "ERROR: invalid padding in AES block"(エラー文字列 — 制限対象外)
  • ✅ "CUSTOM_MAGIC_BYTES"(識別子 — 制限対象外)
キーワードのルール
✅ 適切なキーワード❌ 不適切なキーワード
大会名+チャレンジ名(≤3 語)単一の脆弱性タイプ(SSRF、XSS)
チャレンジ名(≤3 語)一般的な用語(web、pwn、crypto)
固有のコードスニペット(語数制限なし)完全な文章
具体的なエラーメッセージ(語数制限なし)冠詞(a、the、in)
ライブラリ/フレームワーク名一般的な文字列(flag{} など)
カスタム関数名ツール名のみ

これらを避ける理由

  • 「SSRF」→ CTF 解説ではなく、一般的な脆弱性の説明が返されます
  • 「flag{」→ 関連性のない結果が数百万件返されます
  • 「URL Storage DASCTF」→ 特定の CTF チャレンジが返されます

3 語までに制限する理由

  • 精度を高めます。最も特徴的なキーワードだけが残ります
  • ノイズを除去します。"challenge"、"writeup"、"solution" などの不要な語は結果を曖昧にします
  • API の効率が向上します。短く焦点を絞ったクエリは、消費するクレジットが少なくなります

重要な原則: 一般的な手法やよくあるパターンではなく、このチャレンジを特定できるキーワードを使用してください。コード以外のクエリは 3 語以内にしてください。

ステップ 2:検索結果を確認する

検索結果には次の内容が含まれます。

  • Answer:利用可能な場合は AI が生成した要約
  • Results:タイトルとコンテンツのプレビューを含む URL の一覧
  • Credits:API の使用状況
ステップ 3:コンテンツを抽出する(任意)

検索結果が有望に見える場合は、全文を抽出します。

# Single URL
./search.sh extract "https://example.com/writeup"

# Multiple URLs
./search.sh extract "https://url1.com" "https://url2.com"
ステップ 4:分析して方向を変える

抽出したコンテンツに基づいて、次のことを行います。

  • 類似チャレンジで使われている共通の手法を特定します
  • そのアプローチが適用できるかを判断します
  • 必要に応じて、カテゴリに特化したスキルに切り替えます

切り替えのタイミング

  • チャレンジがすでに適切に分類されている場合は、該当する ctf-* スキルを使用してください
  • OSINT の手法が必要な場合は、ctf-osint を使用してください
  • 解決後に writeup を作成する必要がある場合は、ctf-writeup を使用してください

クイックスタート

# Scenario 1: Competition + Challenge name (≤3 words)
./search.sh search "DASCTF URL Storage"

# Scenario 2: Challenge name only (≤3 words)
./search.sh search "URL Storage"

# Scenario 3: Unique identifier from challenge (no word limit)
./search.sh search "def xor_encrypt(data, key):"
./search.sh search "ERROR: invalid padding"

# Extract content from promising results
./search.sh extract "https://ctftime.org/writeup/12345"

ヒント

  1. 具体的に指定する:競技名とチャレンジ名がわかる場合は、併せて使用してください
  2. 固有の文字列を使用する:コードスニペット、エラーメッセージ、固有の識別子
  3. 一般的な語句は避ける:「SSRF CTF writeup」のような幅広すぎる検索は避けてください
  4. 最初に確認する:抽出する前に検索結果を確認してください
  5. 必要な情報だけを抽出する:関連がありそうな URL のみを抽出してください
  6. 3語制限を守る:コード以外のクエリでは、不要な語句を削り、最も特徴的なキーワードを3つだけ残してください

$ARGUMENTS

コメント