Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
kiterunner — 高速なAPIおよびWebコンテンツ発見ツール。コンパイル済みSwaggerデータセットを使用してルートをブルートフォースし、深度スキャン、カスタムワードリスト、同時ホストスキャンをサポートします。 | Kitploit
ツール/GitHubGitHub/assetnote/kiterunner
偵察APIセキュリティテスト情報収集ウェブセキュリティ
GitHubassetnote/kiterunner

kiterunner

高速なAPIおよびWebコンテンツ発見ツール。コンパイル済みSwaggerデータセットを使用してルートをブルートフォースし、深度スキャン、カスタムワードリスト、同時ホストスキャンをサポートします。

リポジトリを見る
3.2k3405年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Kiterunner

GoDoc GitHub release Go Report Card

はじめに

長い間、コンテンツディスカバリーはファイルやフォルダを見つけることに焦点が当てられてきました。このアプローチは、静的ファイルをホストしたり、部分的なパスに対して3xxで応答する従来のWebサーバーには効果的ですが、現代のWebアプリケーション、特にAPIではもはや有効ではありません。

時間の経過とともに、より大きなワードリストを使用できるようにコンテンツディスカバリーツールを高速化するために多くの時間が投資されてきましたが、コンテンツディスカバリーの技術そのものは革新されてきませんでした。

Kiterunnerは、従来のコンテンツディスカバリーを電光石火の速さで実行できるだけでなく、現代のアプリケーションにおけるルート/エンドポイントのブルートフォースも実行できるツールです。

Flask、Rails、Express、Djangoなどの現代的なアプリケーションフレームワークは、特定のHTTPメソッド、ヘッダー、パラメーター、値を期待するルートを明示的に定義するパラダイムに従っています。

従来のコンテンツディスカバリーツールを使用する場合、そのようなルートは見逃されることが多く、簡単に発見できません。

Swagger仕様のデータセットを収集し、独自のスキーマに凝縮することで、Kiterunnerはこのデータセットを使用して、送信する各リクエストに正しいHTTPメソッド、ヘッダー、パス、パラメーター、値を送信することでAPIエンドポイントをブルートフォースできます。

Swaggerファイルは、インターネット規模のスキャンで40以上の最も一般的なswaggerパスを対象とするなど、複数のデータソースから収集されました。その他のデータソースには、GitHub via BigQueryやAPIs.guruが含まれます。

目次

  • Kiterunner
  • はじめに
  • インストール
    • リリースのダウンロード
    • ソースからのビルド
    • AUR経由のインストール
  • 使い方
    • クイックスタート
    • CLIヘルプ
    • 入力/ホストのフォーマット
    • APIスキャン
    • バニラブルートフォース
    • Dirsearchブルートフォース
  • 技術的特徴
    • 深さスキャン
    • Assetnoteワードリストの使用
      • Head構文
    • 並行性設定/高速化
    • ファイル形式間の変換
    • リクエストの再生
  • 技術的実装
    • 中間データ型(PRoutes)
    • Kiteファイル形式

インストール

リリースのダウンロード

プリビルドされたコピーは https://github.com/assetnote/kiterunner/releases からダウンロードできます。

ソースからのビルド```bash

build the binary

make build

symlink your binary

ln -s $(pwd)/dist/kr /usr/local/bin/kr

compile the wordlist

kr kb compile <input.json> <output.kite>

kr kb compile routes.json routes.kite

scan away

kr scan hosts.txt -w routes.kite -x 20 -j 100 --ignore-length=1053

root@kitploit:~
JSONデータセットは以下にあります:

- [routes-large.json](https://wordlists-cdn.assetnote.io/rawdata/kiterunner/routes-large.json.tar.gz) (圧縮時118MB、展開時2.6GB)
- [routes-small.json](https://wordlists-cdn.assetnote.io/rawdata/kiterunner/routes-small.json.tar.gz) (圧縮時14MB、展開時228MB)

あるいは、以下のリンクからコンパイル済みの`.kite`ファイルをダウンロードすることもできます:

- [routes-large.kite](https://wordlists-cdn.assetnote.io/data/kiterunner/routes-large.kite.tar.gz) (圧縮時40MB、展開時183MB)
- [routes-small.kite](https://wordlists-cdn.assetnote.io/data/kiterunner/routes-small.kite.tar.gz) (圧縮時2MB、展開時35MB)

## AUR
Archベースのディストリビューションを使用しているユーザーは、[AUR](https://aur.archlinux.org/packages/kiterunner-bin/)からビルド済みバイナリをダウンロードできます。
`yay` などの「AURヘルパー」を使用してkiterunnerをインストールできます。```
yay -S kiterunner-bin

使い方

クイックスタート```

kr [scan|brute] [flags]

root@kitploit:~
- `<input>` はファイル、ドメイン、またはURIにすることができます。こちらで判断します。詳細は [Input/Host Formatting](#inputhost-formatting) を参照してください。```
# Just have a list of hosts and no wordlist
kr scan hosts.txt -A=apiroutes-210328:20000 -x 5 -j 100 --fail-status-codes 400,401,404,403,501,502,426,411

# You have your own wordlist but you want assetnote wordlists too
kr scan target.com -w routes.kite -A=apiroutes-210328:20000 -x 20 -j 1 --fail-status-codes 400,401,404,403,501,502,426,411

# Bruteforce like normal but with the first 20000 words
kr brute https://target.com/subapp/ -A=aspx-210328:20000 -x 20 -j 1

# Use a dirsearch style wordlist with %EXT%
kr brute https://target.com/subapp/ -w dirsearch.txt -x 20 -j 1 -exml,asp,aspx,ashx -D

CLI ヘルプ```

Usage: kite scan [flags]

Flags: -A, --assetnote-wordlist strings use the wordlists from wordlist.assetnote.io. specify the type/name to use, e.g. apiroutes-210228. You can specify an additional maxlength to use only the first N values in the wordlist, e.g. apiroutes-210228;20000 will only use the first 20000 lines in that wordlist --blacklist-domain strings domains that are blacklisted for redirects. We will not follow redirects to these domains --delay duration delay to place inbetween requests to a single host --disable-precheck whether to skip host discovery --fail-status-codes ints which status codes blacklist as fail. if this is set, this will override success-status-codes --filter-api strings only scan apis matching this ksuid --force-method string whether to ignore the methods specified in the ogl file and force this method -H, --header strings headers to add to requests (default [x-forwarded-for: 127.0.0.1]) -h, --help help for scan --ignore-length strings a range of content length bytes to ignore. you can have multiple. e.g. 100-105 or 1234 or 123,34-53. This is inclusive on both ends --kitebuilder-full-scan perform a full scan without first performing a phase scan. -w, --kitebuilder-list strings ogl wordlist to use for scanning -x, --max-connection-per-host int max connections to a single host (default 3) -j, --max-parallel-hosts int max number of concurrent hosts to scan at once (default 50) --max-redirects int maximum number of redirects to follow (default 3) -d, --preflight-depth int when performing preflight checks, what directory depth do we attempt to check. 0 means that only the docroot is checked (default 1) --profile-name string name for profile output file --progress a progress bar while scanning. by default enabled only on Stderr (default true) --quarantine-threshold int if the host return N consecutive hits, we quarantine the host as wildcard. Set to 0 to disable (default 10) --success-status-codes ints which status codes whitelist as success. this is the default mode -t, --timeout duration timeout to use on all requests (default 3s) --user-agent string user agent to use for requests (default "Chrome. Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36") --wildcard-detection can be set to false to disable wildcard redirect detection (default true)

Global Flags: --config string config file (default is $HOME/.kiterunner.yaml) -o, --output string output format. can be json,text,pretty (default "pretty") -q, --quiet quiet mode. will mute unecessarry pretty text -v, --verbose string level of logging verbosity. can be error,info,debug,trace (default "info")

root@kitploit:~
bruteforce フラグ (上記のすべてのフラグ +)```
  -D, --dirsearch-compat              this will replace %EXT% with the extensions provided. backwards compat with dirsearch because shubs loves him some dirsearch
  -e, --extensions strings            extensions to append while scanning
  -w, --wordlist strings              normal wordlist to use for scanning

入力/ホストのフォーマット

入力が提供されると、kiterunnerは以下の順序で入力を解決しようとします:

  1. 入力がファイルかどうか。もしファイルなら、そのファイル内のすべての行を別々のドメインとして読み込みます
  2. 入力は「ドメイン」として扱われます

たとえば「ドメイン」として google.com を指定した場合、それが現在のディレクトリにテキストファイルとしても存在するときは、 先に見つかったテキストファイル google.com を読み込みます。

ドメインの解析

完全なURIを入力として提供することが推奨されますが、不完全なURIを提供しても、その意味を推測しようとします。 提供できるドメインの例は以下の通りです:``` one.com two.com:80 three.com:443 four.com:9447 https://five.com:9090 http://six.com:80/api

root@kitploit:~
上記のドメインのリストは、後続のターゲットリストに展開されます。```
(two targets are created for one.com, since neither port nor protocol was specified)
http://one.com (port 80 implied)
https://one.com (port 443 implied)

http://two.com (port 80 implied)
https://three.com (port 443 implied)
http://four.com:9447 (non-tls port guessed)
https://five.com:9090
http://six.com/api (port 80 implied; basepath API appended)

適用するルールは以下の通りです:

  • スキームを指定した場合は、そのスキームを使用します。
    • http と https のみサポートします
    • スキームを指定しない場合は、ポートから推測します
  • ポートを指定した場合は、そのポートを使用します
    • ポートが 443 または 8443 の場合は、tls とみなします
    • ポートを指定しない場合は、80 と 443 の両方を推測します
  • パスを指定した場合は、そのホストへのすべてのリクエストの先頭にそのパスを付加します

API スキャン

単一のターゲットがある場合```bash

single target

kr scan https://target.com:8443/ -w routes.kite -A=apiroutes-210228:20000 -x 10 --ignore-length=34

single target, but you want to try http and https

kr scan target.com -w routes.kite -A=apiroutes-210228:20000 -x 10 --ignore-length=34

a list of targets

kr scan targets.txt -w routes.kite -A=apiroutes-210228:20000 -x 10 --ignore-length=34

root@kitploit:~
## バニラブルートフォース```bash
kr brute https://target.com -A=raft-large-words -A=apiroutes-210228:20000 -x 10 -d=0 --ignore-length=34 -ejson,txt

Dirsearch のブルートフォーシング

旧式のワードリストにまだ %EXT% が含まれている場合、-D を使用できます。これにより、パスに %EXT% が存在する場所でのみ拡張子が置き換えられます。```bash kr brute https://target.com -w dirsearch.txt -x 10 -d=0 --ignore-length=34 -ejson,txt -D

root@kitploit:~
# 技術的特徴

## 深さスキャン

kiterunnerの主要な機能は深さベースのスキャンです。これは、仮想アプリケーションパスベースのルーティングを前提に、ワイルドカードの検出を扱おうとします。深さは、ベースラインチェックが実行されるディレクトリの深さ(階層数)を定義します。例:```bash
~/kiterunner $ cat wordlist.txt

/api/v1/user/create
/api/v1/user/delete
/api/v2/user/
/api/v2/admin/
/secrets/v1/
/secrets/v2/
  • 深さ0では、/のみがワイルドカード検出のベースラインチェックを実行します。
  • 深さ1では、/apiと/secretsがベースラインチェックを実行し、これらのチェックが/apiと/secretsにそれぞれ適用されます。
  • 深さ2では、/api/v1、/api/v2、/secrets/v1、/secrets/v2のすべてにベースラインチェックが実行されます。

デフォルトでは、kr scanの深さは1です。これは、内部利用から、仮想ルーティングが最も頻繁に発生する深さとしてよく見られるためです。kr bruteのデフォルト深さは0であり、通常、静的ワードリストでこのチェックを実行したくない場合に使用します。

当然ながら、深さを増やすとスキャンの精度は向上しますが、ターゲットへのリクエスト数も増加します(# ベースラインチェック数 * # 深さのベースラインディレクトリ数)。したがって、1を超えることは推奨せず、稀なケースでのみ深さ2を使用することを推奨します。

Assetnote Wordlistsの使用

assetnote.ioのワードリストの内蔵ダウンロードとキャッシュ機能を提供しています。これらは-Aフラグを使用して、カンマ区切りのエイリアスまたは完全名で指定できます。

すべてのAssetnoteワードリストの一覧は、kr wordlist listで表示できます。

使用されるワードリストは~/.cache/kiterunner/wordlistsにキャッシュされます。使用時には、.txtから.kiteにコンパイルされます。``` +-----------------------------------+-------------------------------------------------------+----------------+---------+----------+--------+ | ALIAS | FILENAME | SOURCE | COUNT | FILESIZE | CACHED | +-----------------------------------+-------------------------------------------------------+----------------+---------+----------+--------+ | 2m-subdomains | 2m-subdomains.txt | manual.json | 2167059 | 28.0mb | false | | asp_lowercase | asp_lowercase.txt | manual.json | 24074 | 1.1mb | false | | aspx_lowercase | aspx_lowercase.txt | manual.json | 80293 | 4.4mb | false | | bak | bak.txt | manual.json | 31725 | 634.8kb | false | | best-dns-wordlist | best-dns-wordlist.txt | manual.json | 9996122 | 139.0mb | false | | cfm | cfm.txt | manual.json | 12100 | 260.3kb | true | | do | do.txt | manual.json | 173152 | 4.8mb | false | | dot_filenames | dot_filenames.txt | manual.json | 3191712 | 71.3mb | false | | html | html.txt | manual.json | 4227526 | 107.7mb | false | | apiroutes-201120 | httparchive_apiroutes_2020_11_20.txt | automated.json | 953011 | 45.3mb | false | | apiroutes-210128 | httparchive_apiroutes_2021_01_28.txt | automated.json | 225456 | 6.6mb | false | | apiroutes-210228 | httparchive_apiroutes_2021_02_28.txt | automated.json | 223544 | 6.5mb | true | | apiroutes-210328 | httparchive_apiroutes_2021_03_28.txt | automated.json | 215114 | 6.3mb | false | | aspx-201118 | httparchive_aspx_asp_cfm_svc_ashx_asmx_2020_11_18.txt | automated.json | 63200 | 1.7mb | false | | aspx-210128 | httparchive_aspx_asp_cfm_svc_ashx_asmx_2021_01_28.txt | automated.json | 46286 | 928.7kb | false | | aspx-210228 | httparchive_aspx_asp_cfm_svc_ashx_asmx_2021_02_28.txt | automated.json | 43958 | 883.3kb | false | | aspx-210328 | httparchive_aspx_asp_cfm_svc_ashx_asmx_2021_03_28.txt | automated.json | 45928 | 926.8kb | false | | cgi-201118 | httparchive_cgi_pl_2020_11_18.txt | automated.json | 2637 | 44.0kb | false |

``` **使用方法**``` kr scan targets.txt -A=apiroutes-210228 -x 10 --ignore-length=34 kr brute targets.txt -A=aspx-210228 -x 10 --ignore-length=34 -easp,aspx ``` ### Head構文

assetnote提供のワードリストを使用する際、ワードリスト全体を使いたくない場合があります。その場合、head syntaxを使用して、指定したワードリストの最初のN行のみを使用できます。形式は、ワードリストを指定する際に <wordlist_name>:<N lines> とします。

使用方法```

this will use the first 20000 lines in the api routes wordlist

kr scan targets.txt -A=apiroutes-210228:20000 -x 10 --ignore-length=34

this will use the first 10 lines in the aspx wordlist

kr brute targets.txt -A=aspx-210228:10 -x 10 --ignore-length=34 -easp,aspx

root@kitploit:~
## 並列設定 / 高速化

Kiterunner は、多くのホストに対して高速に動作するように作られています。しかし、kiterunner を20000 goroutineで実行できるからといって、それが良いアイデアだとは限りません。スレッド数が多いと、ネットワークI/O待ちのgoroutineのスケジューリングやカーネルのコンテキストスイッチに時間がかかるため、ボトルネックやパフォーマンス低下が発生します。

kiterunner には主に2つの並列設定があります:
- `-x, --max-connection-per-host` - 1つのホストに対して持つことができる最大オープン接続数。それぞれ1 goroutine で管理されます。ホストへのDOS攻撃を避けるため、この値は5~10の低めに抑えることを推奨します。対象へのレイテンシにもよりますが、通常、1接続あたり1~5リクエスト/秒(200ms~1000ms/リクエスト)のスループットが得られます。
- `-j, --max-parallel-hosts` - 同時にスキャンするホストの最大数。それぞれ1 goroutine のスーパーバイザーで管理されます。

スキャン元のハードウェアによって、最適に実行できるgoroutineの「最大」数は異なります。AWS t3.mediumでは、2500 goroutineを超えるとパフォーマンス低下が見られました。つまり、500ホスト×5接続/ホスト(2500)がピークパフォーマンスとなります。

**macbook** から kiterunner を実行することは **推奨しません**。macOSでは、高I/OカウントやEpollシステムコールに対するカーネルの最適化が不十分なため、同様に構成されたLinuxインスタンスで実行した場合と比較して、パフォーマンスが著しく低下(0.3~0.5倍)することを確認しています。

単一のターゲットまたは大規模な攻撃対象領域をスキャンする際にパフォーマンスを最大化するには、以下のヒントを推奨します:
- スキャン対象と同じような地理的リージョン/データセンターにあるEC2インスタンスを立ち上げる
- さまざまな `-x` および `-j` オプションを使用して、ターゲットセットに対して初期ベンチマークを実行する。一般的な出発点としては、`-x 5 -j 100` 程度から始め、CPU使用率やネットワークパフォーマンスが許す限り `-j` を増やすことを推奨します。

## ファイル形式間の変換

kiterunner では、スキーマJSON、キートファイル、標準のtxtワードリスト間の変換も可能です。

**使用方法**

形式は、`<input>` および `<output>` フィールドで指定されたファイル拡張子によって決定されます。`txt`、`json`、`kite` をサポートしています。```bash
kr kb convert wordlist.txt wordlist.kite
kr kb convert wordlist.kite wordlist.json
kr kb convert wordlist.kite wordlist.txt
root@kitploit:~
❯ go run ./cmd/kiterunner kb convert -qh
convert an input file format into the specified output file format

this will determine the conversion based on the extensions of the input and the output
we support the following filetypes: txt, json, kite
You can convert any of the following into the corresponding types

-d Debug mode will attempt to convert the schema with error handling
-v=debug Debug verbosity will print out the errors for the schema

Usage:
kite kb convert <input> <output> [flags]

Flags:
-d, --debug   debug the parsing
-h, --help    help for convert

Global Flags:
--config string    config file (default is $HOME/.kiterunner.yaml)
-o, --output string    output format. can be json,text,pretty (default "pretty")
-q, --quiet            quiet mode. will mute unecessarry pretty text
-v, --verbose string   level of logging verbosity. can be error,info,debug,trace (default "info")``bigquery

リクエストの再実行

kiterunner から大量の出力を受け取った場合、なぜリクエストが特定のレスポンスコード/長さを引き起こしているのかをすぐに理解するのは難しいかもしれません。kiterunner は、使用したワードリストから、すべてのヘッダーとボディパラメータを含むリクエストを再構築する方法を提供しています。

  • 完全な応答出力を kb replay コマンドにコピー&ペーストすることで、リクエストを再実行できます。
  • --proxy を指定してリクエストを転送することができ、必要に応じてサードパーティ製ツールを使ってリクエストを変更/再送/インターセプトできます。
  • golang の net/http クライアントは、デフォルトの golang 仕様実装の仕組みにより、リクエストにいくつかの追加変更を加えます(残念ながら)。```bash ❯ go run ./cmd/kiterunner kb replay -q --proxy=http://localhost:8080 -w routes.kite "POST 403 [ 287, 10, 1] https://target.com/dedalo/lib/dedalo/publication/server_api/v1/json/thesaurus_parents 0cc39f76702ea287ec3e93f4b4710db9c8a86251" 11:25AM INF Raw reconstructed request POST /dedalo/lib/dedalo/publication/server_api/v1/json/thesaurus_parents?ar_fields=48637466&code=66132381&db_name=08791392&lang=lg-eng&recursive=false&term_id=72336471 HTTP/1.1 Content-Type: any

11:25AM INF Outbound request POST /dedalo/lib/dedalo/publication/server_api/v1/json/thesaurus_parents?ar_fields=48637466&code=66132381&db_name=08791392&lang=lg-eng&recursive=false&term_id=72336471 HTTP/1.1 Host: target.com User-Agent: Go-http-client/1.1 Content-Length: 0 Content-Type: any Accept-Encoding: gzip

11:25AM INF Response After Redirects HTTP/1.1 403 Forbidden Connection: close Content-Length: 45 Content-Type: application/json Date: Wed, 07 Apr 2021 01:25:28 GMT X-Amzn-Requestid: 7e6b2ea1-c662-4671-9eaa-e8cd31b463f2

User is not authorized to perform this action

root@kitploit:~
# 技術実装

## 中間データ型 (PRoutes)

kiterunnerでは、ワードリストとkitebuilderのJSONスキーマの中間表現を使用しています。これにより、ワードリストのフィールドを動的に生成し、指定された仕様からリクエストボディ/ヘッダーやクエリパラメータを再構築することができます。

PRoute型は、`pkg/proute.Crumb` でエンコードされたHeaders、Body、Query、Cookieパラメータで構成されています。Crumb型はインターフェースであり、UUID、Float、Int、ランダム文字列などの型に実装されています。

txt、json、kiteファイルとの間の変換を行う際、すべての変換はまず `proute.API` 中間型に変換されます。その後、対応するエンコーディングが書き出されます。

## Kiteファイル形式

kitebuilderからのJSONスキーマを保存するために、極秘のkiteファイル形式を使用しています。これは単に、protobufでエンコードされた `pkg/proute.APIS` をファイルに書き込んだものです。コンパイルは、解析済みのワードリストを迅速にデシリアライズできるようにするために使用されます。このファイル形式は安定しておらず、kiterunnerに組み込まれている変換ツールを使用してのみ操作する必要があります。

新しいバージョンのkiteファイル形式がリリースされた場合、kiteファイルを再コンパイルする必要があるかもしれません
ツールをダウンロード