
Hochgeschwindigkeits-Tool zur Entdeckung von API- und Webinhalten, das Routen mit kompilierten Swagger-Datensätzen bruteforct und Tiefenscanning, benutzerdefinierte Wortlisten sowie gleichzeitiges Host-Scanning unterstützt.

Lange Zeit konzentrierte sich die Inhaltserkennung auf das Auffinden von Dateien und Ordnern. Obwohl dieser Ansatz für ältere Webserver effektiv ist, die statische Dateien hosten oder bei einem Teilpfad mit 3xx-Antworten reagieren, ist er für moderne Webanwendungen, insbesondere APIs, nicht mehr geeignet.
Im Laufe der Zeit wurde viel Zeit investiert, um Tools zur Inhaltserkennung schneller zu machen, damit größere Wortlisten verwendet werden können. Die Kunst der Inhaltserkennung wurde jedoch nicht weiterentwickelt.
Kiterunner ist ein Tool, das nicht nur traditionelle Inhaltserkennung mit blitzartiger Geschwindigkeit durchführen kann, sondern auch Routes/Endpunkte in modernen Anwendungen bruteforcen kann.
Moderne Anwendungsframeworks wie Flask, Rails, Express, Django und andere folgen dem Paradigma, Routen explizit zu definieren, die bestimmte HTTP-Methoden, Header, Parameter und Werte erwarten.
Bei Verwendung traditioneller Tools zur Inhaltserkennung werden solche Routen oft übersehen und können nicht leicht entdeckt werden.
Durch das Sammeln eines Datensatzes von Swagger-Spezifikationen und dessen Verdichtung in ein eigenes Schema kann Kiterunner diesen Datensatz verwenden, um API-Endpunkte zu bruteforcen, indem es für jede gesendete Anfrage die korrekte HTTP-Methode, Header, Pfad, Parameter und Werte sendet.
Swagger-Dateien wurden aus einer Reihe von Datenquellen gesammelt, darunter ein internetweiter Scan nach den 40+ häufigsten Swagger-Pfaden. Weitere Datenquellen waren GitHub via BigQuery und APIs.guru.
Sie können eine vorgefertigte Kopie von https://github.com/assetnote/kiterunner/releases herunterladen.
make build
ln -s $(pwd)/dist/kr /usr/local/bin/kr
kr kb compile routes.json routes.kite
kr scan hosts.txt -w routes.kite -x 20 -j 100 --ignore-length=1053
Die JSON-Datensätze finden Sie unten:
- [routes-large.json](https://wordlists-cdn.assetnote.io/rawdata/kiterunner/routes-large.json.tar.gz) (118 MB komprimiert, 2,6 GB dekomprimiert)
- [routes-small.json](https://wordlists-cdn.assetnote.io/rawdata/kiterunner/routes-small.json.tar.gz) (14 MB komprimiert, 228 MB dekomprimiert)
Alternativ ist es möglich, die kompilierten `.kite`-Dateien über die folgenden Links herunterzuladen:
- [routes-large.kite](https://wordlists-cdn.assetnote.io/data/kiterunner/routes-large.kite.tar.gz) (40 MB komprimiert, 183 M dekomprimiert)
- [routes-small.kite](https://wordlists-cdn.assetnote.io/data/kiterunner/routes-small.kite.tar.gz) (2 MB komprimiert, 35 MB dekomprimiert)
## AUR
Benutzer einer Arch-basierten Distribution können das vorgefertigte Binärpaket von [AUR](https://aur.archlinux.org/packages/kiterunner-bin/) herunterladen.
Sie können einen "Aur-Helfer" wie `yay` verwenden, um kiterunner zu installieren.```
yay -S kiterunner-bin
kr [scan|brute] [flags]
- `<input>` kann eine Datei, eine Domain oder eine URI sein. Wir werden das für Sie herausfinden. Siehe [Input/Host Formatting](#inputhost-formatting) für weitere Details```
# 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
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")
Brute-Force-Flags (alle oben genannten Flags +)```
-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
Wenn eine Eingabe bereitgestellt wird, versucht kiterunner, die Eingabe in der folgenden Reihenfolge aufzulösen:
Wenn Sie eine 'Domain' angeben, diese aber als Datei existiert, z.B. google.com, aber google.com ist auch eine txt-Datei im aktuellen Verzeichnis, dann laden wir google.com die Textdatei, weil wir sie zuerst gefunden haben.
Domain-Parsing
Es wird bevorzugt, dass Sie eine vollständige URI als Eingabe angeben, jedoch können Sie unvollständige URIs angeben und wir werden versuchen zu erraten, was Sie meinen. Eine Beispiel-Liste von Domains, die Sie angeben können, ist:``` one.com two.com:80 three.com:443 four.com:9447 https://five.com:9090 http://six.com:80/api
Die obige Liste von Domains wird sich in die nachfolgende Liste von Zielen erweitern```
(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)
die Regeln, die wir anwenden, sind:
Wenn Sie ein einzelnes Ziel haben```bash
kr scan https://target.com:8443/ -w routes.kite -A=apiroutes-210228:20000 -x 10 --ignore-length=34
kr scan target.com -w routes.kite -A=apiroutes-210228:20000 -x 10 --ignore-length=34
kr scan targets.txt -w routes.kite -A=apiroutes-210228:20000 -x 10 --ignore-length=34
## Einfaches Brute-Forcing```bash
kr brute https://target.com -A=raft-large-words -A=apiroutes-210228:20000 -x 10 -d=0 --ignore-length=34 -ejson,txt
Für den Fall, dass Sie eine altmodische Wortliste haben, die noch %EXT% in der Wortliste enthält, können Sie -D verwenden. Dies ersetzt die Erweiterung nur dort, wo %EXT% im Pfad vorhanden ist.```bash
kr brute https://target.com -w dirsearch.txt -x 10 -d=0 --ignore-length=34 -ejson,txt -D
# Technical Features
## Depth Scanning
A key feature of kiterunner is depth based scanning. This attempts to handle detecting wildcards given virtual application path based routing. The depth defines how many directories deep the baseline checks are performed 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/
/ die Basisprüfungen für die Wildcard-Erkennung durchgeführt werden./api und /secrets Basisprüfungen durchgeführt; und diese Prüfungen würden entsprechend gegen /api und /secrets verwendet./api/v1, /api/v2, /secrets/v1 und /secrets/v2 alle Basisprüfungen durchgeführt.Standardmäßig hat kr scan eine Tiefe von 1, da wir aus interner Nutzung oft gesehen haben, dass dies die häufigste Tiefe ist, bei der virtuelles Routing aufgetreten ist. kr brute hat eine Standardtiefe von 0, da Sie diese Prüfung normalerweise nicht mit einer statischen Wortliste durchführen möchten.
Natürlich erhöht eine größere Tiefe die Genauigkeit Ihrer Scans, jedoch erhöht dies auch die Anzahl der Anfragen an das Ziel. (# der Basisprüfungen * # der Tiefen-Basisverzeichnisse). Daher empfehlen wir, nicht über 1 hinauszugehen und nur in seltenen Fällen auf Tiefe 2 zu gehen.
Wir bieten integriertes Herunterladen und Caching von Wortlisten von assetnote.io. Sie können diese mit dem -A-Flag verwenden, das eine kommagetrennte Liste von Aliasen oder vollständigen Namen akzeptiert.
Sie erhalten eine vollständige Liste aller Assetnote-Wortlisten mit kr wordlist list.
Die Wortlisten werden bei Verwendung in ~/.cache/kiterunner/wordlists zwischengespeichert. Bei Verwendung werden sie von .txt -> .kite kompiliert.```
+-----------------------------------+-------------------------------------------------------+----------------+---------+----------+--------+
| 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 |
Wenn Sie die von assetnote bereitgestellten Wortlisten verwenden, möchten Sie möglicherweise nicht die gesamte Wortliste verwenden. Sie können daher die ersten N Zeilen einer bestimmten Wortliste mit der head syntax verwenden. Das Format ist <wordlist_name>:<N lines> bei der Angabe einer Wortliste.
Verwendung```
kr scan targets.txt -A=apiroutes-210228:20000 -x 10 --ignore-length=34
kr brute targets.txt -A=aspx-210228:10 -x 10 --ignore-length=34 -easp,aspx
## Parallelitätseinstellungen/Schnelles Vorgehen
Kiterunner ist darauf ausgelegt, schnell bei vielen Hosts zu sein. Aber nur weil man Kiterunner mit 20000 Goroutinen ausführen kann, heißt das nicht, dass es eine gute Idee ist. Engpässe und Leistungseinbußen treten bei hohen Thread-Zahlen auf, da mehr Zeit für die Planung von Goroutinen aufgewendet wird, die auf Netzwerk-I/O und Kernel-Kontextwechsel warten.
Es gibt zwei Haupteinstellungen für die Parallelität bei Kiterunner:
- `-x, --max-connection-per-host` – maximale Anzahl offener Verbindungen, die wir auf einem Host haben können. Gesteuert durch jeweils 1 Goroutine. Um einen Host nicht zu überlasten, empfehlen wir, diesen Wert niedrig im Bereich von 5-10 zu halten. Abhängig von der Latenz zum Ziel ergibt sich daraus im Durchschnitt 1-5 Anfragen pro Sekunde pro Verbindung (200ms - 1000ms/Anfrage) zu einem Host.
- `-j, --max-parallel-hosts` – maximale Anzahl gleichzeitig zu scannender Hosts. Gesteuert durch jeweils 1 Goroutine-Supervisor.
Abhängig von der Hardware, von der aus Sie scannen, variiert die „maximale“ Anzahl optimal ausführbarer Goroutinen. Auf einem AWS t3.medium haben wir Leistungseinbußen ab etwa 2500 Goroutinen festgestellt. Das bedeutet, dass 500 Hosts × 5 Verbindungen pro Host (2500) die Spitzenleistung erbringen würden.
Wir empfehlen **davon ab**, Kiterunner von Ihrem **MacBook** aus auszuführen. Aufgrund schlechter Kernel-Optimierungen für hohe I/O-Zahlen und Epoll-Systemaufrufe unter macOS haben wir eine deutlich schlechtere (0,3-0,5x) Leistung im Vergleich zum Ausführen von Kiterunner auf einer ähnlich konfigurierten Linux-Instanz festgestellt.
Um die Leistung beim Scannen eines einzelnen Ziels oder einer großen Angriffsfläche zu maximieren, empfehlen wir die folgenden Tipps:
- Starten Sie eine EC2-Instanz in einer ähnlichen geografischen Region/Rechenzentrum wie die Ziele, die Sie scannen.
- Führen Sie erste Benchmarks gegen Ihre Zielgruppe mit verschiedenen `-x`- und `-j`-Optionen durch. Wir empfehlen einen typischen Ausgangspunkt von etwa `-x 5 -j 100` und erhöhen Sie `-j`, sofern es Ihre CPU-Auslastung/Netzwerkleistung zulässt.
## Konvertieren zwischen Dateiformaten
Kiterunner ermöglicht es Ihnen auch, zwischen dem Schema-JSON, einer Kite-Datei und einer standardmäßigen Text-Wortliste zu konvertieren.
**Verwendung**
Das Format wird durch die Dateierweiterung bestimmt, die in den `<input>`- und `<output>`-Feldern angegeben wird. Wir unterstützen `txt`, `json` und `kite`.```bash
kr kb convert wordlist.txt wordlist.kite
kr kb convert wordlist.kite wordlist.json
kr kb convert wordlist.kite wordlist.txt
❯ 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
Wenn Sie eine Reihe von Ausgaben von kiterunner erhalten, kann es schwierig sein, sofort zu verstehen, warum eine Anfrage einen bestimmten Antwortcode/eine bestimmte Länge verursacht. Kiterunner bietet eine Methode, um die Anfrage aus den verwendeten Wortlisten einschließlich aller Header- und Body-Parameter wiederherzustellen.
kb replay kopieren und einfügen.--proxy angeben, um Ihre Anfragen weiterzuleiten, damit Sie die Anfrage bei Bedarf mit Tools von Drittanbietern ändern/wiederholen/abfangen können.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
# Technische Implementierung
## Zwischendatentyp (PRoutes)
Wir verwenden eine Zwischendarstellung von Wortlisten und kitebuilder-JSON-Schemata in kiterunner. Dies ermöglicht es uns, die Felder in der Wortliste dynamisch zu generieren und Anfragekörper/-Header und Abfrageparameter aus einer gegebenen Spezifikation zu rekonstruieren.
Der PRoute-Typ besteht aus Header-, Body-, Query- und Cookie-Parametern, die in `pkg/proute.Crumb` codiert sind. Der Crumb-Typ ist ein Interface, das für Typen wie UUIDs, Floats, Ints, Zufallsstrings usw. implementiert wird.
Bei der Konvertierung von und zu TXT-, JSON- und Kite-Dateien werden alle Konvertierungen zunächst in den Zwischentyp `proute.API` durchgeführt. Anschließend wird die entsprechende Kodierung ausgegeben.
## Kite-Dateiformat
Wir verwenden ein streng geheimes Kite-Dateiformat zum Speichern der JSON-Schemata von kitebuilder. Dabei handelt es sich einfach um protobuf-kodierte `pkg/proute.APIS`, die in eine Datei geschrieben werden. Die Kompilierung dient dazu, die bereits geparste Wortliste schnell deserialisieren zu können. Dieses Dateiformat ist nicht stabil und sollte nur mit den integrierten Konvertierungswerkzeugen von kiterunner interagiert werden.
Wenn eine neue Version des Kite-Dateiformats veröffentlicht wird, müssen Sie möglicherweise Ihre Kite-Dateien neu kompilieren.