Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
kiterunner — 컴파일된 Swagger 데이터셋을 사용하여 경로를 무차별 대입하는 고속 API 및 웹 콘텐츠 발견 도구로, 깊이 스캔, 사용자 정의 워드리스트, 동시 호스트 스캔을 지원합니다. | Kitploit
도구/GitHubGitHub/assetnote/kiterunner
ReconnaissanceAPI Security TestingInformation GatheringWeb Security
GitHubassetnote/kiterunner

kiterunner

컴파일된 Swagger 데이터셋을 사용하여 경로를 무차별 대입하는 고속 API 및 웹 콘텐츠 발견 도구로, 깊이 스캔, 사용자 정의 워드리스트, 동시 호스트 스캔을 지원합니다.

저장소 보기
3.2k3405년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Kiterunner

GoDoc GitHub release Go Report Card

소개

오랫동안 콘텐츠 디스커버리는 파일과 폴더를 찾는 데 집중되어 왔습니다. 이 접근 방식은 정적 파일을 호스팅하거나 부분 경로에 대해 3xx 응답을 반환하는 레거시 웹 서버에는 효과적이지만, 최신 웹 애플리케이션, 특히 API에는 더 이상 효과적이지 않습니다.

시간이 지남에 따라 더 큰 단어 목록을 사용할 수 있도록 콘텐츠 디스커버리 도구를 더 빠르게 만드는 데 많은 시간이 투자되었지만, 콘텐츠 디스커버리의 기술 자체는 혁신되지 않았습니다.

Kiterunner는 기존의 콘텐츠 디스커버리를 매우 빠른 속도로 수행할 수 있을 뿐만 아니라, 최신 애플리케이션에서 라우트/엔드포인트를 브루트포싱할 수 있는 도구입니다.

Flask, Rails, Express, Django 등과 같은 최신 애플리케이션 프레임워크는 특정 HTTP 메서드, 헤더, 파라미터 및 값을 기대하는 라우트를 명시적으로 정의하는 패러다임을 따릅니다.

기존의 콘텐츠 디스커버리 도구를 사용할 때 이러한 라우트는 종종 놓치기 쉬우며 쉽게 발견할 수 없습니다.

Swagger 사양 데이터셋을 수집하여 자체 스키마로 압축함으로써, Kiterunner는 이 데이터셋을 사용하여 각 요청에 대해 올바른 HTTP 메서드, 헤더, 경로, 파라미터 및 값을 전송하여 API 엔드포인트를 브루트포싱할 수 있습니다.

Swagger 파일은 인터넷 전체에서 가장 일반적인 swagger 경로 40개 이상을 스캔하는 등 여러 데이터 소스에서 수집되었습니다. 다른 데이터 소스로는 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 압축, 183M 압축 해제)
- [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이라는 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 Bruteforcing

구식 워드리스트에 %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의 주요 기능 중 하나는 깊이 기반 스캔입니다. 이는 가상 애플리케이션 경로 기반 라우팅이 주어졌을 때 와일드카드 감지를 처리하려고 시도합니다. 깊이는 기준 검사가 수행되는 디렉토리 깊이를 정의합니다. E.g.```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을 사용합니다. 내부 사용 경험상 가상 라우팅이 가장 자주 발생하는 깊이가 1이기 때문입니다. kr brute는 기본 깊이가 0인데, 일반적으로 정적 워드리스트로 이 검사를 수행하고 싶지 않기 때문입니다.

당연히 깊이를 증가시키면 스캔의 정확도가 높아지지만, 대상에 대한 요청 수도 증가합니다. (기준 검사 수 * 깊이 기준 디렉터리 수). 따라서 깊이 1 이상으로 설정하는 것을 권장하지 않으며, 드문 경우에만 깊이 2까지 사용하는 것을 권장합니다.

Assetnote 워드리스트 사용

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 문법을 사용하여 주어진 단어 목록에서 처음 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개의 고루틴으로 kiterunner를 실행할 수 있다고 해서 그것이 좋은 생각인 것은 아닙니다. 높은 스레드 수에서는 네트워크 I/O와 커널 컨텍스트 스위칭을 기다리는 고루틴을 스케줄링하는 데 더 많은 시간이 소요되어 병목 현상과 성능 저하가 발생합니다.

Kiterunner에는 두 가지 주요 동시성 설정이 있습니다:
- `-x, --max-connection-per-host` - 호스트에서 가질 수 있는 최대 열린 연결 수입니다. 각 연결은 1개의 고루틴으로 관리됩니다. 호스트에 DOS 공격을 방지하기 위해 이 값을 5-10의 낮은 범위로 유지하는 것을 권장합니다. 대상에 대한 지연 시간에 따라 이 설정은 연결당 평균 초당 1~5개의 요청(요청당 200ms~1000ms)을 호스트에 생성합니다.
- `-j, --max-parallel-hosts` - 동시에 스캔할 호스트의 최대 수입니다. 각 호스트는 1개의 고루틴 감독자에 의해 관리됩니다.

스캔을 실행하는 하드웨어에 따라 최적으로 실행할 수 있는 "최대" 고루틴 수는 달라집니다. AWS t3.medium에서 2500개 이상의 고루틴을 사용할 때 성능 저하가 관찰되었습니다. 즉, 500개 호스트 x 호스트당 5개 연결 (2500)이 최고 성능을 제공합니다.

**macbook**에서 kiterunner를 실행하는 것은 **권장하지 않습니다**. macOS의 높은 I/O 수와 Epoll 시스템 호출에 대한 낮은 커널 최적화로 인해, 유사하게 구성된 리눅스 인스턴스에서 kiterunner를 실행할 때보다 성능이 상당히 낮은(0.3-0.5배) 것을 확인했습니다.

개별 대상을 스캔하거나 넓은 공격 표면을 스캔할 때 성능을 최대화하려면 다음 팁을 권장합니다:
- 스캔 중인 대상과 유사한 지리적 지역/데이터센터에 EC2 인스턴스를 생성하세요.
- 다양한 `-x` 및 `-j` 옵션으로 대상 세트에 대해 초기 벤치마크를 수행하세요. 일반적인 시작점으로 `-x 5 -j 100` 정도를 권장하며, CPU 사용량/네트워크 성능이 허용하는 대로 `-j`를 높이세요.

## 파일 형식 간 변환

Kiterunner는 스키마 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:~
# 기술 구현

## 중간 데이터 유형 (PRoutes)

kiterunner에서는 워드리스트와 kitebuilder JSON 스키마의 중간 표현을 사용합니다. 이를 통해 워드리스트의 필드를 동적으로 생성하고, 주어진 스펙에서 요청 본문/헤더 및 쿼리 파라미터를 재구성할 수 있습니다.

PRoute 유형은 `pkg/proute.Crumb`에 인코딩된 헤더, 본문, 쿼리 및 쿠키 파라미터로 구성됩니다. Crumb 유형은 UUID, Floats, Ints, Random Strings 등과 같은 유형에 구현된 인터페이스입니다.

txt, json 및 kite 파일 간 변환을 수행할 때 먼저 모든 변환이 `proute.API` 중간 유형으로 이루어집니다. 그런 다음 해당 인코딩이 출력됩니다.

## Kite 파일 형식

kitebuilder의 JSON 스키마를 저장하기 위해 초비밀 kite 파일 형식을 사용합니다. 이는 단순히 `pkg/proute.APIS`를 protobuf로 인코딩하여 파일에 기록한 것입니다. 컴파일은 이미 파싱된 워드리스트를 빠르게 역직렬화할 수 있도록 하는 데 사용됩니다. 이 파일 형식은 안정적이지 않으며, kiterunner에 내장된 변환 도구를 통해서만 상호작용해야 합니다.

새로운 버전의 kite 파일 형식이 출시되면 kite 파일을 다시 컴파일해야 할 수 있습니다.
도구 다운로드