ctf-similar-search について
ctf-similar-searchは、Tavilyで類似するCTFチャレンジの解説を探すスキルです。キーワード検索とURLからのコンテンツ抽出に対応し、特定の課題に絞り込む検索方法を案内します。
主な機能
- 01関連するCTF解説の検索
- 02検索結果URLからの抽出
- 03簡潔なキーワード検索の指針
- 04抽出前の検索結果確認
活用シーン
- 01名前が分かるCTFチャレンジの解説を探す
- 02特徴的なコード片やエラーで検索
- 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 Extract | URL からコンテンツを抽出します | ./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"
ヒント
- 具体的に指定する:競技名とチャレンジ名がわかる場合は、併せて使用してください
- 固有の文字列を使用する:コードスニペット、エラーメッセージ、固有の識別子
- 一般的な語句は避ける:「SSRF CTF writeup」のような幅広すぎる検索は避けてください
- 最初に確認する:抽出する前に検索結果を確認してください
- 必要な情報だけを抽出する:関連がありそうな URL のみを抽出してください
- 3語制限を守る:コード以外のクエリでは、不要な語句を削り、最も特徴的なキーワードを3つだけ残してください
$ARGUMENTS