Kiterunner
Introduction
Kiterunner는 Assetnote에서 만든 Content-Discovery 도구로 지정한 위치에 Fuzz/BruteForce 방식의 일반적인 도구가 아닌, 알려진 Swagger Spec 데이터와 자체 스키마로 압축된 데이터 세트를 사용하여 API 스펙을 추측합니다. 그리고 알려진 HTTP Method, Header, Path, Param 등을 전송하며 API Endpoint를 찾는 도구입니다.
참고로 Assetnote는 주기적으로 변하는 Wordlists를 가지고 운영하기 때문에 Kiterunner가 사용하는 Wordlist 자체가 이미 단순한 리스트가 아닌, 실제로 웹에서 많이 사용되는 데이터를 기반으로한 리스트입니다. 당연히 더 빠르고 좋은 결과를 만들 수 있겠죠.
Installation
git clone https://github.com/assetnote/kiterunner
cd kiterunner
make build
ln -s $(pwd)/dist/kr /usr/local/bin/kr
Usage
kr [scan|brute] <input> [flags]
Available Commands:
brute brute one or multiple hosts with a provided wordlist
help Help about any command
kb manipulate the kitebuilder schema
scan scan one or multiple hosts with a provided wordlist
version version of the binary you're running
wordlist look at your cached wordlists and remote wordlists
크게 scan과 brute 2가지의 Command를 지원하며, <input>
부분에는 file, domain, URI 등의 포맷을 지원하고 이를 자동으로 식별합니다.
kr scan hosts.txt
kr scan target.com
kr scan https://target.com/api/
kr scan https://target.com:8443
Offensive techniques
자주 사용하는 Flag
-A
: assetnote wordlist 지정-w
: 파일 기반 wordlist 지정-x
: max connection (한개의 host에 몇개의 커넥션을 가질지)-j
: 병렬처리 (동시에 몇개의 host를 스캔할지)-d
: depth-H
: 헤더 추가--fail-status-codes
: 지정한 status code 시 실패 처리--success-status-codes
: 지정한 status code 시 성공 처리
API Discovery
Single target
kr scan https://www.hahwul.com \
-w ~/Downloads/routes-large.kite \
-x 20
-d 4
Multiple target
kr scan hosts.txt \
-A=raft-large-words \
-x 20 \
-j 100
Directory Discovery
Single target
kr brute https://target.com \
-A=raft-large-words \
-x 200
Multiple target
kr brute hosts.txt \
-A=raft-large-words \
-x 20 \
-j 100
Check Assetnote wordlists
kr wordlist list
Interact with ZAP/Burpsuite
Kiterunner의 결과 중 탐지된 Method, URL등을 CLI상에서 정리해서 ZAP/Burpsuite의 Proxy 포트를 통해 웹 요청을 발생시키면 쉽게 ZAP이나 Burpsuite로 전달할 수 있습니다.
- Target: http://localhost:8070/api/v1
- Proxy: http://localhost:8090
kr scan http://localhost:8070/api/v1 \
-w ~/Downloads/routes-large.kite \
-x 100 -d 3 -o json | grep "\"sc\":200" | cut -d "\"" -f 4,8,12 \
| sed -e "s/\"http/ http/g" | sed -e "s/\"\//\//g" \
| tee apis.txt | sort -u \
| xargs -I % bash -c "curl -k -X % --proxy http://localhost:8090"
이후 apis.txt를 보면 Method와 URL이 기록되어 있습니다.
GET http://localhost:8070/api/v1/user
GET http://localhost:8070/api/v1/users
POST http://localhost:8070/api/v1/user
PUT http://localhost:8070/api/v1/user
Proxy로 받은 앱(저는 ZAP)에서는 이렇게 결과가 History로 들어오게 됩니다.
References
- https://github.com/assetnote/kiterunner