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

Result

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

Result

Multiple target

kr brute hosts.txt \
-A=raft-large-words \
-x 20 \ 
-j 100 

Check Assetnote wordlists

kr wordlist list

Result

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