Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
kiterunner — 高速API和网站内容发现工具,使用编译好的Swagger数据集暴力破解路由,支持深度扫描、自定义字典和并发主机扫描。 | Kitploit
工具/GitHubGitHub/assetnote/kiterunner
侦察Web漏洞扫描器动态代码分析 (DAST)Web应用程序漏洞利用API安全测试信息收集Web安全API 安全API 安全 分类第 1 名API安全测试 分类第 1 名
3.2k34085年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
动态代码分析 (DAST) 分类第 14 名
Web应用程序漏洞利用 分类第 15 名
Web安全 分类第 14 名
Web漏洞扫描器 分类第 14 名
GitHubassetnote/kiterunner

kiterunner

高速API和网站内容发现工具,使用编译好的Swagger数据集暴力破解路由,支持深度扫描、自定义字典和并发主机扫描。

查看仓库

Kiterunner

GoDoc GitHub release Go Report Card

介绍

长期以来,内容发现一直专注于查找文件和文件夹。虽然这种方法对于托管静态文件或在部分路径下返回 3xx 响应的传统 Web 服务器有效,但对于现代 Web 应用程序,尤其是 API,它已不再高效。

随着时间的推移,我们看到了大量时间投入到提高内容发现工具的速度上,以便可以使用更大的字典,但内容发现的艺术本身却没有得到创新。

Kiterunner 不仅能够以极快的速度执行传统内容发现,还能对现代应用程序中的路由/端点进行暴力破解。

现代应用框架(如 Flask、Rails、Express、Django 等)遵循显式定义路由的范式,这些路由期望特定的 HTTP 方法、头部、参数和值。

当使用传统的内容发现工具时,这些路由往往被遗漏,难以被发现。

Kiterunner 通过收集 Swagger 规范数据集并将其压缩为自身的模式,可以利用该数据集通过为每个发送的请求提供正确的 HTTP 方法、头部、路径、参数和值来暴力破解 API 端点。

Swagger 文件来自多个数据源,包括针对 40 多个最常见 Swagger 路径的互联网范围扫描。其他数据源包括 GitHub via BigQuery 和 APIs.guru。

目录

  • Kiterunner
  • 介绍
  • 安装
    • 下载发行版
    • 从源码构建
    • 通过 AUR 安装
  • 用法
    • 快速开始
    • CLI 帮助
    • 输入/主机格式化
    • API 扫描
    • 普通暴力破解
    • Dirsearch 暴力破解
  • 技术特性
    • 深度扫描
    • 使用 Assetnote 字典
      • 头部语法
    • 并发设置/快速运行
    • 文件格式转换
    • 重放请求
  • 技术实现
    • 中间数据类型 (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:~
暴力破解标志(以上所有标志 +)```
  -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 在当前目录下也是一个 txt 文件,我们会加载 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词表

我们内置了从assetnote.io下载和缓存词表的功能。你可以使用-A标志来使用这些词表,该标志接收一个逗号分隔的别名或全名列表。

你可以通过kr wordlist list获取所有Assetnote词表的完整列表。

使用时,词表会缓存到~/.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 语法 来使用给定字典列表中的前 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 旨在针对大量主机实现高速运行。但是,仅仅因为你可以用 20000 个 goroutine 运行 kiterunner,并不意味着这是个好主意。由于调度等待网络 IO 和内核上下文切换的 goroutine 所花费的时间增加,高线程数下会出现瓶颈和性能下降。

Kiterunner 有两个主要的并发设置:
- `-x, --max-connection-per-host` - 单个主机上允许的最大开放连接数。每个连接由一个 goroutine 管理。为了避免对主机造成拒绝服务攻击,建议将此值保持在较低的 5-10 范围内。根据到目标的延迟,每个连接平均每秒可向主机发送 1-5 个请求(每个请求 200ms-1000ms)。
- `-j, --max-parallel-hosts` - 任意时刻可扫描的最大主机数。每个主机由一个 goroutine 管理器控制。

根据你进行扫描的硬件,可最佳运行的 goroutine “最大” 数量会有所不同。在 AWS t3.medium 实例上,我们发现超过 2500 个 goroutine 时性能会下降。也就是说,500 个主机 x 每个主机 5 个连接(2500)将达到峰值性能。

我们建议 **不要** 在 **MacBook** 上运行 kiterunner。由于 macOS 对高 IO 计数和 Epoll 系统调用的内核优化较差,与在类似配置的 Linux 实例上运行 kiterunner 相比,我们观察到性能明显较差(0.3-0.5 倍)。

为了在扫描单个目标或大型攻击面时最大化性能,我们建议以下技巧:
- 在与扫描目标相近的地理区域/数据中心中启动一个 EC2 实例
- 使用不同的 `-x` 和 `-j` 选项对目标集执行初步基准测试。我们建议从大约 `-x 5 -j 100` 的典型起点开始,然后根据 CPU 使用率/网络性能提升 `-j`

## 在文件格式之间转换

Kiterunner 还允许你在 schema JSON、kite 文件和标准 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:~
# Technical Implementation

## Intermediate Data Type (PRoutes)

We use an intermediate representation of wordlists and kitebuilder json schemas in kiterunner. This is to allow us to dynamically generate the fields in the wordlist and reconstruct request bodies/headers and query parameters from a given spec.

The PRoute type is composed of Headers, Body, Query and Cookie parameters that are encoded in `pkg/proute.Crumb`. The Crumb type is an interface that is implemented on types such as UUIDs, Floats, Ints, Random Strings, etc.

When performing conversions to and from txt, json and kite files, all the conversions are first done to the `proute.API` intermediate type. Then the corresponding encoding is written out

## Kite File Format

We use a super secret kite file format for storing the json schemas from kitebuilder. These are simply protobuf encoded `pkg/proute.APIS` written to a file. The compilation is used to allow us to quickly deserialize the already parsed wordlist. This file format is not stable, and should only be interacted with using the inbuilt conversion tools for kiterunner.

When a new version of the kite file format is released, you may need to recompile your kite files
下载工具